From f1b987a3b978d0e9a1990d02a4a418f800a726fb Mon Sep 17 00:00:00 2001 From: Peter Killick Date: Tue, 9 Aug 2016 17:16:20 +0100 Subject: [PATCH 001/583] Add save plumbing for pdt10 (#51) Add plumbing for pdt10, update time statistic checking --- iris_grib/_save_rules.py | 56 +++++++++++++++++++++++----------------- 1 file changed, 32 insertions(+), 24 deletions(-) diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index 22653f3f..57fc7a3f 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -797,33 +797,38 @@ def _cube_is_time_statistic(cube): """ Test whether we can identify this cube as a statistic over time. - At present, accept anything whose latest cell method operates over a single - coordinate that "looks like" a time factor (i.e. some specific names). - In particular, we recognise the coordinate names defined in - :py:mod:`iris.coord_categorisation`. + We need to know whether our cube represents a time statistic. This is + almost always captured in the cell methods. The exception is when a + percentage statistic has been calculated (i.e. for PDT10). This is + captured in a `percentage_over_time` scalar coord, which must be handled + here too. """ - # The *only* relevant information is in cell_methods, as coordinates or - # dimensions of aggregation may no longer exist. So it's not possible to - # be definitive, but we handle *some* useful cases. - # In other cases just say "no", which is safe even when not ideal. - - # Identify a single coordinate from the latest cell_method. - if not cube.cell_methods: - return False - latest_coordnames = cube.cell_methods[-1].coord_names - if len(latest_coordnames) != 1: - return False - coord_name = latest_coordnames[0] - - # Define accepted time names, including those from coord_categorisations. - recognised_time_names = ['time', 'year', 'month', 'day', 'weekday', - 'season'] + result = False + stat_coord_name = 'percentile_over_time' + cube_coord_names = [coord.name() for coord in cube.coords()] + + # Check our cube for time statistic indicators. + has_percentile_statistic = stat_coord_name in cube_coord_names + has_cell_methods = cube.cell_methods + + # Determine whether we have a time statistic. + if has_percentile_statistic: + result = True + elif has_cell_methods: + # Define accepted time names, including from coord_categorisations. + recognised_time_names = ['time', 'year', 'month', 'day', 'weekday', + 'season'] + latest_coordnames = cube.cell_methods[-1].coord_names + if len(latest_coordnames) != 1: + result = False + else: + coord_name = latest_coordnames[0] + result = coord_name in recognised_time_names + else: + result = False - # Accept it if the name is recognised. - # Currently does *not* recognise related names like 'month_number' or - # 'years', as that seems potentially unsafe. - return coord_name in recognised_time_names + return result def product_definition_template_common(cube, grib): @@ -1017,6 +1022,9 @@ def product_definition_section(cube, grib): if cube.coords('realization'): # time processed (template 4.11) pdt = product_definition_template_11 + elif cube.coords('percentile_over_time'): + # time processed as percentile (template 4.10) + pdt = product_definition_template_10 else: # time processed (template 4.8) pdt = product_definition_template_8 From d81db4de9977a39de9f2d8996f3638ee27600792 Mon Sep 17 00:00:00 2001 From: Peter Killick Date: Tue, 9 Aug 2016 17:17:23 +0100 Subject: [PATCH 002/583] User documentation (#52) * Added documentation, added Iris intersphinx mapping --- docs/conf.py | 13 ++++---- docs/index.rst | 76 ++++++++++++++++++++++++++++++++++++++++--- iris_grib/__init__.py | 60 ++++++++++++++++++++-------------- 3 files changed, 114 insertions(+), 35 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 799300d3..744e2bd7 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -18,7 +18,7 @@ # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. -#sys.path.insert(0, os.path.abspath('.')) +sys.path.append(os.path.abspath('..')) # -- General configuration ------------------------------------------------ @@ -57,10 +57,8 @@ # |version| and |release|, also used in various other places throughout the # built documents. # -# The short X.Y version. -version = u'0.9' -# The full version, including alpha/beta/rc tags. -release = u'0.9.0' +import iris_grib +release = iris_grib.__version__ # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. @@ -291,4 +289,7 @@ # Example configuration for intersphinx: refer to the Python standard library. -intersphinx_mapping = {'https://docs.python.org/': None} +intersphinx_mapping = { + 'python': ('https://docs.python.org/', None), + 'iris': ('http://scitools.org.uk/iris/docs/latest/', None), +} diff --git a/docs/index.rst b/docs/index.rst index 2ef2f65f..bf3b88a8 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -3,8 +3,77 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -Welcome to iris-grib's documentation! -===================================== +The documentation for iris-grib +=============================== + +The library ``iris-grib`` provides functionality for converting between weather and +climate datasets that are stored as GRIB files and :class:`Iris cubes `. +GRIB files can be loaded as Iris cubes using ``iris-grib`` so that you can use Iris +for analysing and visualising the contents of the GRIB files. Iris cubes can be saved to +GRIB files using ``iris-grib``. + +The contents of ``iris-grib`` represent the former grib loading and saving capabilities +of :mod:`Iris ` itself. These capabilities have been separated into a discrete library +so that Iris becomes less monolithic as a library. + + +Loading +------- + +To use ``iris-grib`` to load existing GRIB files we can make use of the +:func:`~iris_grib.load_cubes` function:: + + >>> import os + >>> import iris_sample_data + >>> import iris_grib + >>> cubes = iris_grib.load_cubes(os.path.join(iris_sample_data.path, + 'polar_stereo.grib2')) + >>> print cubes + + +As we can see, this returns a generator object. The generator object may be iterated +over to access all the Iris cubes loaded from the GRIB file, or converted directly +to a list:: + + >>> cubes = list(cubes) + >>> print cubes + [] + +.. note:: + There is no functionality in iris-grib that directly replicates + ``iris.load_cube`` (that is, load a single cube directly rather than returning + a length-one `CubeList`. Instead you could use the following, assuming that the + GRIB file you have loaded contains data that can be loaded to a single cube:: + + >>> cube, = list(cubes) + >>> print cube + air_temperature / (K) (projection_y_coordinate: 200; projection_x_coordinate: 247) + Dimension coordinates: + projection_y_coordinate x - + projection_x_coordinate - x + Scalar coordinates: + forecast_period: 6 hours + forecast_reference_time: 2013-05-20 00:00:00 + pressure: 101500.0 Pa + time: 2013-05-20 06:00:00 + + This makes use of an idiom known as variable unpacking. + + +Saving +------ + +To use ``iris-grib`` to save Iris cubes to a GRIB file we can make use of the +:func:`~iris_grib.save_grib2` function:: + + >>> iris_grib.save_grib2(my_cube, 'my_file.grib2') + +.. note:: + As the function name suggests, only saving to GRIB2 is supported. + + +Indices and tables +================== Contents: @@ -13,8 +82,7 @@ Contents: ref/index -Indices and tables -================== +See also: * :ref:`genindex` * :ref:`modindex` diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index 6ea46bc5..2a6f8ad9 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -711,14 +711,17 @@ def load_cubes(filenames, callback=None): Args: - * filenames (string/list): + * filenames: One or more GRIB filenames to load from. Kwargs: - * callback (callable function): + * callback: Function which can be passed on to :func:`iris.io.run_callback`. + Returns: + A generator containing Iris cubes loaded from the GRIB files. + """ import iris.fileformats.rules as iris_rules grib_loader = iris_rules.Loader(_load_generate, @@ -732,15 +735,6 @@ def load_pairs_from_fields(grib_messages): Convert an iterable of GRIB messages into an iterable of (Cube, Grib message) tuples. - Args: - - * grib_messages: - An iterable of :class:`iris_grib.message.GribMessage`. - - Returns: - An iterable of tuples of (:class:`iris.cube.Cube`, - :class:`iris_grib.message.GribMessage`). - This capability can be used to filter out fields before they are passed to the load pipeline, and amend the cubes once they are created, using GRIB metadata conditions. Where the filtering @@ -773,6 +767,15 @@ def load_pairs_from_fields(grib_messages): ... message.sections[1]['productionStatusOfProcessedData'] = 4 >>> cubes = load_pairs_from_fields(cleaned_messages) + Args: + + * grib_messages: + An iterable of :class:`iris_grib.message.GribMessage`. + + Returns: + An iterable of tuples of (:class:`iris.cube.Cube`, + :class:`iris_grib.message.GribMessage`). + """ import iris.fileformats.rules as iris_rules return iris_rules.load_pairs_from_fields(grib_messages, load_convert) @@ -784,16 +787,19 @@ def save_grib2(cube, target, append=False): Args: - * cube - A :class:`iris.cube.Cube`, :class:`iris.cube.CubeList` or - list of cubes. - * target - A filename or open file handle. + * cube: + The :class:`iris.cube.Cube`, :class:`iris.cube.CubeList` or list of + cubes to save to a GRIB2 file. + * target: + A filename or open file handle specifying the GRIB2 file to save + to. Kwargs: - * append - Whether to start a new file afresh or add the cube(s) to - the end of the file. - Only applicable when target is a filename, not a file - handle. Default is False. + * append: + Whether to start a new file afresh or add the cube(s) to the end of + the file. Only applicable when target is a filename, not a file + handle. Default is False. """ messages = (message for _, message in save_pairs_from_cube(cube)) @@ -808,7 +814,9 @@ def save_pairs_from_cube(cube): save rules. Args: - * cube - A :class:`iris.cube.Cube`, :class:`iris.cube.CubeList` or + + * cube: + A :class:`iris.cube.Cube`, :class:`iris.cube.CubeList` or list of cubes. """ @@ -831,15 +839,17 @@ def save_messages(messages, target, append=False): Args: - * messages - An iterable of grib_api message IDs. - * target - A filename or open file handle. + * messages: + An iterable of grib_api message IDs. + * target: + A filename or open file handle. Kwargs: - * append - Whether to start a new file afresh or add the cube(s) to - the end of the file. - Only applicable when target is a filename, not a file - handle. Default is False. + * append: + Whether to start a new file afresh or add the cube(s) to the end of + the file. Only applicable when target is a filename, not a file + handle. Default is False. """ # grib file (this bit is common to the pp and grib savers...) From 4466cd52b142b715ed79be1878d1f96ae9d9852c Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Wed, 10 Aug 2016 16:41:57 +0100 Subject: [PATCH 003/583] Tweak conda dependencies for readthedocs build. --- environment.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/environment.yml b/environment.yml index 70ae43a3..d99fbafa 100644 --- a/environment.yml +++ b/environment.yml @@ -1,4 +1,5 @@ channels: - - conda-forge + - scitools dependencies: - iris=1.* + - grib_api=1.14.7 From 579295870b53d9df2c6778f8875bebb60fd738ab Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Fri, 12 Aug 2016 14:21:59 +0100 Subject: [PATCH 004/583] Api privacy (#53) * Make LookupTable private in grib_phenom_translation. * Rename 'load_rules' module as (private) '_grib1_load_rules'. * Don't export (or generate docs for) GribWrapper. * Review changes: slight tidy. --- iris_grib/__init__.py | 2 +- iris_grib/{load_rules.py => _grib1_load_rules.py} | 4 ---- iris_grib/_load_convert.py | 2 +- iris_grib/grib_phenom_translation.py | 10 +++++----- iris_grib/tests/test_pep8.py | 2 +- iris_grib/tests/unit/__init__.py | 2 +- .../unit/{load_rules => grib1_load_rules}/__init__.py | 2 +- .../test_grib1_convert.py | 4 ++-- .../test_grib_phenom_translation.py | 2 +- 9 files changed, 13 insertions(+), 17 deletions(-) rename iris_grib/{load_rules.py => _grib1_load_rules.py} (99%) rename iris_grib/tests/unit/{load_rules => grib1_load_rules}/__init__.py (92%) rename iris_grib/tests/unit/{load_rules => grib1_load_rules}/test_grib1_convert.py (97%) diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index 2a6f8ad9..ce1dbf0f 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -50,7 +50,7 @@ __version__ = '0.9.0' __all__ = ['load_cubes', 'save_grib2', 'load_pairs_from_fields', - 'save_pairs_from_cube', 'save_messages', 'GribWrapper'] + 'save_pairs_from_cube', 'save_messages'] CENTRE_TITLES = {'egrr': 'U.K. Met Office - Exeter', diff --git a/iris_grib/load_rules.py b/iris_grib/_grib1_load_rules.py similarity index 99% rename from iris_grib/load_rules.py rename to iris_grib/_grib1_load_rules.py index 9805c554..2b7748b0 100644 --- a/iris_grib/load_rules.py +++ b/iris_grib/_grib1_load_rules.py @@ -33,10 +33,6 @@ ReferenceTarget) -# Restrict the names imported from this namespace. -__all__ = ['grib1_convert'] - - def grib1_convert(grib): """ Converts a GRIB1 message into the corresponding items of Cube metadata. diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index 82f10fe2..7b7377bc 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -42,7 +42,7 @@ from iris.fileformats.rules import ConversionMetadata, Factory, Reference from iris.util import _is_circular -from .load_rules import grib1_convert +from ._grib1_load_rules import grib1_convert from .message import GribMessage diff --git a/iris_grib/grib_phenom_translation.py b/iris_grib/grib_phenom_translation.py index 48c31565..743ece8c 100644 --- a/iris_grib/grib_phenom_translation.py +++ b/iris_grib/grib_phenom_translation.py @@ -41,7 +41,7 @@ import iris.std_names -class LookupTable(dict): +class _LookupTable(dict): """ Specialised dictionary object for making lookup tables. @@ -51,7 +51,7 @@ class LookupTable(dict): """ def __init__(self, *args, **kwargs): - self._super = super(LookupTable, self) + self._super = super(_LookupTable, self) self._super.__init__(*args, **kwargs) def __getitem__(self, key): @@ -83,7 +83,7 @@ def __setitem__(self, key, value): def _make_grib1_cf_table(): """ Build the Grib1 to CF phenomenon translation table. """ - table = LookupTable() + table = _LookupTable() def _make_grib1_cf_entry(table2_version, centre_number, param_number, standard_name, long_name, units, set_height=None): @@ -170,7 +170,7 @@ def _make_grib1_cf_entry(table2_version, centre_number, param_number, def _make_grib2_to_cf_table(): """ Build the Grib2 to CF phenomenon translation table. """ - table = LookupTable() + table = _LookupTable() def _make_grib2_cf_entry(param_discipline, param_category, param_number, standard_name, long_name, units): @@ -233,7 +233,7 @@ def _make_grib2_cf_entry(param_discipline, param_category, param_number, def _make_cf_to_grib2_table(): """ Build the Grib1 to CF phenomenon translation table. """ - table = LookupTable() + table = _LookupTable() def _make_cf_grib2_entry(standard_name, long_name, param_discipline, param_category, param_number, diff --git a/iris_grib/tests/test_pep8.py b/iris_grib/tests/test_pep8.py index 0ce479a8..e6180bb5 100644 --- a/iris_grib/tests/test_pep8.py +++ b/iris_grib/tests/test_pep8.py @@ -33,7 +33,7 @@ class Test(unittest.TestCase): def test_pep8_conformance(self): pep8style = pep8.StyleGuide(quiet=False) - excluded = ['_grib_cf_map.py', 'load_rules.py'] + excluded = ['_grib_cf_map.py', '_grib1_load_rules.py'] for fname in excluded: path = '*{}{}'.format(os.path.sep, fname) pep8style.options.exclude.append(path) diff --git a/iris_grib/tests/unit/__init__.py b/iris_grib/tests/unit/__init__.py index 524295a3..3fe0103d 100644 --- a/iris_grib/tests/unit/__init__.py +++ b/iris_grib/tests/unit/__init__.py @@ -230,5 +230,5 @@ def cube_from_message(self, grib): grib_message = FakeGribMessage(**grib.__dict__) wrapped_msg = iris_grib.GribWrapper(grib_message) cube, _, _ = iris.fileformats.rules._make_cube( - wrapped_msg, iris_grib.load_rules.grib1_convert) + wrapped_msg, iris_grib._grib1_load_rules.grib1_convert) return cube diff --git a/iris_grib/tests/unit/load_rules/__init__.py b/iris_grib/tests/unit/grib1_load_rules/__init__.py similarity index 92% rename from iris_grib/tests/unit/load_rules/__init__.py rename to iris_grib/tests/unit/grib1_load_rules/__init__.py index 9fb52835..3e5a47cd 100644 --- a/iris_grib/tests/unit/load_rules/__init__.py +++ b/iris_grib/tests/unit/grib1_load_rules/__init__.py @@ -14,7 +14,7 @@ # # You should have received a copy of the GNU Lesser General Public License # along with iris-grib. If not, see . -"""Unit tests for the :mod:`iris_grib.load_rules` module.""" +"""Unit tests for the :mod:`iris_grib._grib1_load_rules` module.""" from __future__ import (absolute_import, division, print_function) from six.moves import (filter, input, map, range, zip) # noqa diff --git a/iris_grib/tests/unit/load_rules/test_grib1_convert.py b/iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py similarity index 97% rename from iris_grib/tests/unit/load_rules/test_grib1_convert.py rename to iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py index 0e458a3a..0dde03ed 100644 --- a/iris_grib/tests/unit/load_rules/test_grib1_convert.py +++ b/iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py @@ -14,7 +14,7 @@ # # You should have received a copy of the GNU Lesser General Public License # along with iris-grib. If not, see . -"""Unit tests for :func:`iris_grib.load_rules.grib1_convert`.""" +"""Unit tests for :func:`iris_grib._grib1_load_rules.grib1_convert`.""" from __future__ import (absolute_import, division, print_function) from six.moves import (filter, input, map, range, zip) # noqa @@ -32,7 +32,7 @@ from iris.fileformats.rules import Reference from iris_grib import GribWrapper -from iris_grib.load_rules import grib1_convert +from iris_grib._grib1_load_rules import grib1_convert from iris_grib.tests.unit import TestField diff --git a/iris_grib/tests/unit/grib_phenom_translation/test_grib_phenom_translation.py b/iris_grib/tests/unit/grib_phenom_translation/test_grib_phenom_translation.py index 8e68590b..0b897469 100644 --- a/iris_grib/tests/unit/grib_phenom_translation/test_grib_phenom_translation.py +++ b/iris_grib/tests/unit/grib_phenom_translation/test_grib_phenom_translation.py @@ -35,7 +35,7 @@ class TestGribLookupTableType(tests.IrisTest): def test_lookuptable_type(self): - ll = gptx.LookupTable([('a', 1), ('b', 2)]) + ll = gptx._LookupTable([('a', 1), ('b', 2)]) assert ll['a'] == 1 assert ll['q'] is None ll['q'] = 15 From 6149cc44a54b140a20a1a8d42caf07627ac51c51 Mon Sep 17 00:00:00 2001 From: Peter Killick Date: Fri, 12 Aug 2016 16:48:46 +0100 Subject: [PATCH 005/583] Add section on connectivity within Iris --- docs/index.rst | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/docs/index.rst b/docs/index.rst index bf3b88a8..2fcf3300 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -72,6 +72,25 @@ To use ``iris-grib`` to save Iris cubes to a GRIB file we can make use of the As the function name suggests, only saving to GRIB2 is supported. +Interconnectivity with Iris +--------------------------- + +You can use the functionality provided by ``iris-grib`` directly within Iris +without having to explicitly import ``iris-grib``, as long as you have both Iris +and ``iris-grib`` available to your Python interpreter. + +For example:: + + >>> import iris + >>> import iris_sample_data + >>> cube = iris.load_cube(iris.sample_data_path('polar_stereo.grib2')) + +Similarly, you can save your cubes to a GRIB file directly from Iris +using ``iris-grib``:: + + >>> iris.save(my_cube, 'my_file.grib2') + + Indices and tables ================== From 025bad45d9f237346660f602e5b2c19142547def Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Mon, 15 Aug 2016 09:57:45 +0100 Subject: [PATCH 006/583] Sphinx docs for the whole api. (#55) --- docs/conf.py | 6 +++++ docs/index.rst | 7 ++++-- .../grib_phenom_translation.rst | 20 +++++++++++++++ docs/ref/index.rst | 5 ---- docs/ref/iris_grib.rst | 25 +++++++++++++++++++ docs/ref/message/message.rst | 18 +++++++++++++ environment.yml | 2 +- 7 files changed, 75 insertions(+), 8 deletions(-) create mode 100644 docs/ref/grib_phenom_translation/grib_phenom_translation.rst delete mode 100644 docs/ref/index.rst create mode 100644 docs/ref/iris_grib.rst create mode 100644 docs/ref/message/message.rst diff --git a/docs/conf.py b/docs/conf.py index 744e2bd7..02c79205 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -106,6 +106,12 @@ todo_include_todos = False +# -- Autodoc ------------------------------------------------------------------ + +autodoc_member_order = 'groupwise' +autodoc_default_flags = ['show-inheritance'] + + # -- Options for HTML output ---------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for diff --git a/docs/index.rst b/docs/index.rst index bf3b88a8..e52a603a 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -78,9 +78,12 @@ Indices and tables Contents: .. toctree:: - :maxdepth: 2 + :maxdepth: 3 + + ref/iris_grib + ref/message/message + ref/grib_phenom_translation/grib_phenom_translation - ref/index See also: diff --git a/docs/ref/grib_phenom_translation/grib_phenom_translation.rst b/docs/ref/grib_phenom_translation/grib_phenom_translation.rst new file mode 100644 index 00000000..19dde447 --- /dev/null +++ b/docs/ref/grib_phenom_translation/grib_phenom_translation.rst @@ -0,0 +1,20 @@ +iris_grib.grib_phenom_translation +================================= + +In this module: + + * :py:obj:`grib1_phenom_to_cf_info` + * :py:obj:`grib2_phenom_to_cf_info` + * :py:obj:`cf_phenom_to_grib2_info` + + +.. currentmodule:: iris_grib.grib_phenom_translation + +.. automodule:: iris_grib.grib_phenom_translation + +.. autofunction:: iris_grib.grib_phenom_translation.grib1_phenom_to_cf_info + +.. autofunction:: iris_grib.grib_phenom_translation.grib2_phenom_to_cf_info + +.. autofunction:: iris_grib.grib_phenom_translation.cf_phenom_to_grib2_info + diff --git a/docs/ref/index.rst b/docs/ref/index.rst deleted file mode 100644 index 7e39e274..00000000 --- a/docs/ref/index.rst +++ /dev/null @@ -1,5 +0,0 @@ -Reference documentation -======================= - -.. automodule:: iris_grib - :members: diff --git a/docs/ref/iris_grib.rst b/docs/ref/iris_grib.rst new file mode 100644 index 00000000..30836f85 --- /dev/null +++ b/docs/ref/iris_grib.rst @@ -0,0 +1,25 @@ +iris_grib +========= + +In this module: + + * :py:obj:`load_cubes` + * :py:obj:`save_grib2` + * :py:obj:`load_pairs_from_fields` + * :py:obj:`save_pairs_from_cube` + * :py:obj:`save_messages` + +.. currentmodule:: iris_grib + +.. automodule:: iris_grib + +.. autofunction:: iris_grib.load_cubes + +.. autofunction:: iris_grib.save_grib2 + +.. autofunction:: iris_grib.load_pairs_from_fields + +.. autofunction:: iris_grib.save_pairs_from_cube + +.. autofunction:: iris_grib.save_messages + diff --git a/docs/ref/message/message.rst b/docs/ref/message/message.rst new file mode 100644 index 00000000..f025ce09 --- /dev/null +++ b/docs/ref/message/message.rst @@ -0,0 +1,18 @@ +iris_grib.message +================= + +In this module: + + * :py:obj:`GribMessage` + * :py:obj:`Section` + +.. currentmodule:: iris_grib.message + +.. automodule:: iris_grib.message + +.. autoclass:: iris_grib.message.GribMessage + :members: + +.. autoclass:: iris_grib.message.Section + :members: + diff --git a/environment.yml b/environment.yml index d99fbafa..5d540bc9 100644 --- a/environment.yml +++ b/environment.yml @@ -2,4 +2,4 @@ channels: - scitools dependencies: - iris=1.* - - grib_api=1.14.7 + - ecmwf_grib=1.14 From fef83e0f4fc8e77be4794bb8ef1cbffa0646484a Mon Sep 17 00:00:00 2001 From: marqh Date: Fri, 14 Oct 2016 11:33:38 +0000 Subject: [PATCH 007/583] updated translations --- iris_grib/_grib_cf_map.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/iris_grib/_grib_cf_map.py b/iris_grib/_grib_cf_map.py index dc1299d3..90c537ca 100644 --- a/iris_grib/_grib_cf_map.py +++ b/iris_grib/_grib_cf_map.py @@ -16,11 +16,11 @@ # along with iris-grib. If not, see . # # DO NOT EDIT: AUTO-GENERATED -# Created on 12 February 2016 17:02 from +# Created on 14 October 2016 15:10 from # http://www.metarelate.net/metOcean -# at commit cf419fba84a70fba5f394f1481cfcdbba28877ff +# at commit 3cde018acc4303203ff006a26f7b96a64e6ed3fb -# https://github.com/metarelate/metOcean/commit/cf419fba84a70fba5f394f1481cfcdbba28877ff +# https://github.com/metarelate/metOcean/commit/3cde018acc4303203ff006a26f7b96a64e6ed3fb """ Provides GRIB/CF phenomenon translations. @@ -88,6 +88,7 @@ G2Param(2, 0, 1, 49): CFName('precipitation_amount', None, 'kg m-2'), G2Param(2, 0, 1, 51): CFName('atmosphere_mass_content_of_water', None, 'kg m-2'), G2Param(2, 0, 1, 53): CFName('snowfall_flux', None, 'kg m-2 s-1'), + G2Param(2, 0, 1, 60): CFName('snowfall_amount', None, 'kg m-2'), G2Param(2, 0, 1, 64): CFName('atmosphere_mass_content_of_water_vapor', None, 'kg m-2'), G2Param(2, 0, 2, 0): CFName('wind_from_direction', None, 'degrees'), G2Param(2, 0, 2, 1): CFName('wind_speed', None, 'm s-1'), @@ -107,8 +108,8 @@ G2Param(2, 0, 4, 7): CFName('surface_downwelling_shortwave_flux_in_air', None, 'W m-2'), G2Param(2, 0, 4, 9): CFName('surface_net_downward_shortwave_flux', None, 'W m-2'), G2Param(2, 0, 5, 3): CFName('surface_downwelling_longwave_flux_in_air', None, 'W m-2'), - G2Param(2, 0, 5, 5): CFName('toa_outgoing_longwave_flux', None, 'W m-2'), - G2Param(2, 0, 6, 1): CFName('cloud_area_fraction', None, '%'), + G2Param(2, 0, 5, 5): CFName('surface_net_downward_longwave_flux', None, 'W m-2'), + G2Param(2, 0, 6, 1): CFName(None, 'cloud_area_fraction_assuming_maximum_random_overlap', '1'), G2Param(2, 0, 6, 3): CFName('low_type_cloud_area_fraction', None, '%'), G2Param(2, 0, 6, 4): CFName('medium_type_cloud_area_fraction', None, '%'), G2Param(2, 0, 6, 5): CFName('high_type_cloud_area_fraction', None, '%'), @@ -119,6 +120,7 @@ G2Param(2, 0, 7, 8): CFName(None, 'storm_relative_helicity', 'J kg-1'), G2Param(2, 0, 14, 0): CFName('atmosphere_mole_content_of_ozone', None, 'Dobson'), G2Param(2, 0, 19, 1): CFName(None, 'grib_physical_atmosphere_albedo', '%'), + G2Param(2, 2, 0, 0): CFName('land_binary_mask', None, '1'), G2Param(2, 2, 0, 0): CFName('land_area_fraction', None, '1'), G2Param(2, 2, 0, 1): CFName('surface_roughness_length', None, 'm'), G2Param(2, 2, 0, 2): CFName('soil_temperature', None, 'K'), @@ -170,6 +172,7 @@ CFName(None, 'storm_relative_helicity', 'J kg-1'): G2Param(2, 0, 7, 8), CFName('air_potential_temperature', None, 'K'): G2Param(2, 0, 0, 2), CFName('air_pressure', None, 'Pa'): G2Param(2, 0, 3, 0), + CFName('air_pressure_at_sea_level', None, 'Pa'): G2Param(2, 0, 3, 0), CFName('air_pressure_at_sea_level', None, 'Pa'): G2Param(2, 0, 3, 1), CFName('air_temperature', None, 'K'): G2Param(2, 0, 0, 0), CFName('altitude', None, 'm'): G2Param(2, 0, 3, 6), @@ -179,7 +182,6 @@ CFName('atmosphere_mass_content_of_water_vapor', None, 'kg m-2'): G2Param(2, 0, 1, 64), CFName('atmosphere_mole_content_of_ozone', None, 'Dobson'): G2Param(2, 0, 14, 0), CFName('atmosphere_specific_convective_available_potential_energy', None, 'J kg-1'): G2Param(2, 0, 7, 6), - CFName('cloud_area_fraction', None, '%'): G2Param(2, 0, 6, 1), CFName('cloud_area_fraction_in_atmosphere_layer', None, '%'): G2Param(2, 0, 6, 7), CFName('dew_point_temperature', None, 'K'): G2Param(2, 0, 0, 6), CFName('geopotential', None, 'm2 s-2'): G2Param(2, 0, 3, 4), @@ -201,6 +203,7 @@ CFName('sea_surface_temperature', None, 'K'): G2Param(2, 10, 3, 0), CFName('sea_water_x_velocity', None, 'm s-1'): G2Param(2, 10, 1, 2), CFName('sea_water_y_velocity', None, 'm s-1'): G2Param(2, 10, 1, 3), + CFName('snowfall_amount', None, 'kg m-2'): G2Param(2, 0, 1, 60), CFName('snowfall_flux', None, 'kg m-2 s-1'): G2Param(2, 0, 1, 53), CFName('soil_temperature', None, 'K'): G2Param(2, 2, 0, 2), CFName('specific_humidity', None, 'kg kg-1'): G2Param(2, 0, 1, 0), @@ -209,6 +212,7 @@ CFName('surface_downwelling_longwave_flux_in_air', None, 'W m-2'): G2Param(2, 0, 5, 3), CFName('surface_downwelling_shortwave_flux_in_air', None, 'W m-2'): G2Param(2, 0, 4, 7), CFName('surface_net_downward_longwave_flux', None, 'W m-2'): G2Param(2, 0, 5, 5), + CFName('surface_net_downward_longwave_flux', None, 'W m-2'): G2Param(2, 0, 5, 5), CFName('surface_net_downward_shortwave_flux', None, 'W m-2'): G2Param(2, 0, 4, 9), CFName('surface_roughness_length', None, 'm'): G2Param(2, 2, 0, 1), CFName('surface_runoff_flux', None, 'kg m-2 s-1'): G2Param(2, 2, 0, 34), @@ -216,7 +220,6 @@ CFName('surface_upward_latent_heat_flux', None, 'W m-2'): G2Param(2, 0, 0, 10), CFName('surface_upward_sensible_heat_flux', None, 'W m-2'): G2Param(2, 0, 0, 11), CFName('thickness_of_snowfall_amount', None, 'm'): G2Param(2, 0, 1, 11), - CFName('toa_outgoing_longwave_flux', None, 'W m-2'): G2Param(2, 0, 5, 5), CFName('wind_from_direction', None, 'degrees'): G2Param(2, 0, 2, 0), CFName('wind_speed', None, 'm s-1'): G2Param(2, 0, 2, 1), CFName('wind_speed_of_gust', None, 'm s-1'): G2Param(2, 0, 2, 22), From ea91f523b7794bf341e8771f024dd617b4e12fe5 Mon Sep 17 00:00:00 2001 From: marqh Date: Mon, 24 Oct 2016 10:27:32 +0000 Subject: [PATCH 008/583] travis updates --- .travis.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index c4d68ad9..a1693182 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,11 +2,10 @@ language: python sudo: false env: - python=2.7 - iris=1.9 + iris=1.10 - python=2.7 iris_from_source=master - grib_api=1.14.7 # - python=3.4 # iris=master @@ -25,14 +24,16 @@ install: - bash miniconda.sh -b -p $HOME/miniconda - export PATH="$HOME/miniconda/bin:$PATH" - conda config --set show_channel_urls True - - conda config --add channels conda-forge + - conda config --add channels scitools + - conda config --add channels defaults # Install iris-grib's dependencies # -------------------------------- - | conda install --quiet --yes python=${python} pep8 pip nomkl \ iris=${iris}* \ - python-ecmwf_grib=${grib_api}* + ecmwf_grib \ + nc_time_axis # Fetch and install Iris from source # ---------------------------------- From d96e5633ff362fb3a74e4b7f499eecdb12f507ba Mon Sep 17 00:00:00 2001 From: marqh Date: Thu, 10 Nov 2016 12:02:54 +0000 Subject: [PATCH 009/583] travis build instructions --- .travis.yml | 39 ++++++++++++--------------------------- 1 file changed, 12 insertions(+), 27 deletions(-) diff --git a/.travis.yml b/.travis.yml index a1693182..357c6e33 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,19 +2,10 @@ language: python sudo: false env: - python=2.7 - iris=1.10 + iris=v1.10.0 - python=2.7 - iris_from_source=master - -# - python=3.4 -# iris=master -# grib_api=1.14.7 - -# - python=3.5 -# iris=master -# grib_api=1.14.7 - + iris=master install: # Fetch and install conda @@ -29,22 +20,16 @@ install: # Install iris-grib's dependencies # -------------------------------- - - | - conda install --quiet --yes python=${python} pep8 pip nomkl \ - iris=${iris}* \ - ecmwf_grib \ - nc_time_axis - - # Fetch and install Iris from source - # ---------------------------------- - - | - if [ -n "$iris_from_source" ]; then - conda remove --yes iris; - wget https://github.com/scitools/iris/archive/${iris_from_source}.tar.gz -O iris.tar.gz; - tar xzf iris.tar.gz && rm -rf iris.tar.gz && mv iris-${iris_from_source} iris_source; - pip install ./iris_source --no-deps; - rm -rf iris_source; - fi + - wget https://github.com/scitools/iris/archive/${iris}.tar.gz -O iris.tar.gz; + - if [ ${iris:0:1} == "v" ]; then + iris="${iris:1:${#iris}-1}"; + fi + - tar xzf iris.tar.gz && rm -rf iris.tar.gz && mv iris-${iris} iris_source; + - conda install --quiet --yes python=${python} --file=./iris_source/minimal-conda-requirements.txt; + - conda install --quiet --yes ecmwf_grib; + - pip install ./iris_source --no-deps; + - rm -rf iris_source; + - conda list # Download iris-test-data # -------------------------------- From 9370f7c3faa04f26b99c9c96acfd4785c38fe6cc Mon Sep 17 00:00:00 2001 From: lbdreyer Date: Thu, 17 Nov 2016 14:26:26 +0000 Subject: [PATCH 010/583] Add pdt 1. (#63) --- iris_grib/_save_rules.py | 47 +++++++++--- .../test_product_definition_template_1.py | 76 +++++++++++++++++++ 2 files changed, 113 insertions(+), 10 deletions(-) create mode 100644 iris_grib/tests/unit/save_rules/test_product_definition_template_1.py diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index 57fc7a3f..29839907 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -831,6 +831,23 @@ def _cube_is_time_statistic(cube): return result +def set_ensemble(cube, grib): + """ + Set keys in the provided grib based message relating to ensemble + information. + + """ + if not (cube.coords('realization') and + len(cube.coord('realization').points) == 1): + raise ValueError("A cube 'realization' coordinate with one " + "point is required, but not present") + gribapi.grib_set(grib, "perturbationNumber", + int(cube.coord('realization').points[0])) + # no encoding at present in iris-grib, set to missing + gribapi.grib_set(grib, "numberOfForecastsInEnsemble", 255) + gribapi.grib_set(grib, "typeOfEnsembleForecast", 255) + + def product_definition_template_common(cube, grib): """ Set keys within the provided grib message that are common across @@ -864,6 +881,21 @@ def product_definition_template_0(cube, grib): product_definition_template_common(cube, grib) +def product_definition_template_1(cube, grib): + """ + Set keys within the provided grib message based on Product + Definition Template 4.1. + + Template 4.1 is used to represent an individual ensemble forecast, control + and perturbed, at a horizontal level or in a horizontal layer at a point + in time. + + """ + gribapi.grib_set(grib, "productDefinitionTemplateNumber", 1) + product_definition_template_common(cube, grib) + set_ensemble(cube, grib) + + def product_definition_template_8(cube, grib): """ Set keys within the provided grib message based on Product @@ -906,15 +938,7 @@ def product_definition_template_11(cube, grib): """ gribapi.grib_set(grib, "productDefinitionTemplateNumber", 11) - if not (cube.coords('realization') and - len(cube.coord('realization').points) == 1): - raise ValueError("A cube 'realization' coordinate with one" - "point is required, but not present") - gribapi.grib_set(grib, "perturbationNumber", - int(cube.coord('realization').points[0])) - # no encoding at present in iris-grib, set to missing - gribapi.grib_set(grib, "numberOfForecastsInEnsemble", 255) - gribapi.grib_set(grib, "typeOfEnsembleForecast", 255) + set_ensemble(cube, grib) _product_definition_template_8_10_and_11(cube, grib) @@ -1012,7 +1036,10 @@ def product_definition_section(cube, grib): """ if not cube.coord("time").has_bounds(): - if 'WMO_constituent_type' in cube.attributes: + if cube.coords('realization'): + # ensemble forecast (template 4.1) + pdt = product_definition_template_1(cube, grib) + elif 'WMO_constituent_type' in cube.attributes: # forecast for atmospheric chemical constiuent (template 4.40) product_definition_template_40(cube, grib) else: diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_1.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_1.py new file mode 100644 index 00000000..d951e9fe --- /dev/null +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_1.py @@ -0,0 +1,76 @@ +# (C) British Crown Copyright 2016, Met Office +# +# This file is part of iris-grib. +# +# iris-grib is free software: you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the +# Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# iris-grib is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with iris-grib. If not, see . +""" +Unit tests for :func:`iris_grib._save_rules.product_definition_template_1` + +""" + +from __future__ import (absolute_import, division, print_function) +from six.moves import (filter, input, map, range, zip) # noqa + +# Import iris_grib.tests first so that some things can be initialised before +# importing anything else. +import iris_grib.tests as tests + +from cf_units import Unit +import gribapi +import mock + +from iris.coords import CellMethod, DimCoord +import iris.tests.stock as stock + +from iris_grib._save_rules import product_definition_template_1 + + +class TestRealizationIdentifier(tests.IrisGribTest): + def setUp(self): + self.cube = stock.lat_lon_cube() + # Rename cube to avoid warning about unknown discipline/parameter. + self.cube.rename('air_temperature') + coord = DimCoord([45], 'time', + units=Unit('days since epoch', calendar='standard')) + self.cube.add_aux_coord(coord) + + @mock.patch.object(gribapi, 'grib_set') + def test_realization(self, mock_set): + cube = self.cube + coord = DimCoord(10, 'realization', units='1') + cube.add_aux_coord(coord) + + product_definition_template_1(cube, mock.sentinel.grib) + mock_set.assert_any_call(mock.sentinel.grib, + "productDefinitionTemplateNumber", 1) + mock_set.assert_any_call(mock.sentinel.grib, + "perturbationNumber", 10) + mock_set.assert_any_call(mock.sentinel.grib, + "numberOfForecastsInEnsemble", 255) + mock_set.assert_any_call(mock.sentinel.grib, + "typeOfEnsembleForecast", 255) + + @mock.patch.object(gribapi, 'grib_set') + def test_multiple_realization_values(self, mock_set): + cube = self.cube + coord = DimCoord([8, 9, 10], 'realization', units='1') + cube.add_aux_coord(coord, 0) + + msg = "'realization' coordinate with one point is required" + with self.assertRaisesRegexp(ValueError, msg): + product_definition_template_1(cube, mock.sentinel.grib) + + +if __name__ == "__main__": + tests.main() From 2ee86938bca6786909487dbe33f4582e0308bd1a Mon Sep 17 00:00:00 2001 From: Bill Little Date: Thu, 1 Dec 2016 14:05:37 +0000 Subject: [PATCH 011/583] Correctly populate setup.py package_data. (#66) --- setup.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/setup.py b/setup.py index b2f37129..1b7afa55 100644 --- a/setup.py +++ b/setup.py @@ -30,10 +30,6 @@ if os.path.exists(os.path.join(d, '__init__.py')): packages.append(d[len(here)+1:].replace(os.path.sep, '.')) -package_data = { - 'iris_grib': ['iris_grib/tests/results/*'], -} - def extract_version(): version = None @@ -48,11 +44,25 @@ def extract_version(): return version +def file_walk_relative(top, remove=''): + """ + Returns a generator of files from the top of the tree, removing + the given prefix from the root/file result. + + """ + top = top.replace('/', os.path.sep) + remove = remove.replace('/', os.path.sep) + for root, dirs, files in os.walk(top): + for file in files: + yield os.path.join(root, file).replace(remove, '') + + setup_args = dict( name = name, version = extract_version(), packages = packages, - package_data = package_data, + package_data = {'iris_grib': list(file_walk_relative('iris_grib/tests/results', + remove='iris_grib/'))}, description = "GRIB loading for Iris", long_description = LONG_DESCRIPTION, url = 'https://github.com/SciTools/iris-grib', From 99b9273895555fdff1b9f743f492eda4b3bedb3a Mon Sep 17 00:00:00 2001 From: Phil Elson Date: Sat, 3 Dec 2016 03:22:07 +1100 Subject: [PATCH 012/583] Fix interpretation of significanceOfReferenceTime=0. (#68) --- iris_grib/_load_convert.py | 2 +- .../tests/unit/load_convert/test_reference_time_coord.py | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index 7b7377bc..87ffa602 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -277,7 +277,7 @@ def reference_time_coord(section): """ # Look-up standard name by significanceOfReferenceTime. - _lookup = {0: 'time', + _lookup = {0: 'forecast_reference_time', 1: 'forecast_reference_time', 2: 'time', 3: 'time'} diff --git a/iris_grib/tests/unit/load_convert/test_reference_time_coord.py b/iris_grib/tests/unit/load_convert/test_reference_time_coord.py index 91bce6ae..f0907c1e 100644 --- a/iris_grib/tests/unit/load_convert/test_reference_time_coord.py +++ b/iris_grib/tests/unit/load_convert/test_reference_time_coord.py @@ -60,6 +60,11 @@ def _check(self, section, standard_name=None): coord = reference_time_coord(section) self.assertEqual(coord, expected) + def test_start_of_forecast(self): + section = deepcopy(self.section) + section['significanceOfReferenceTime'] = 0 + self._check(section, 'forecast_reference_time') + def test_start_of_forecast(self): section = deepcopy(self.section) section['significanceOfReferenceTime'] = 1 From 7f455a6e713ff617d726792d525bf419fe515dfb Mon Sep 17 00:00:00 2001 From: Bill Little Date: Sat, 3 Dec 2016 23:47:30 +0000 Subject: [PATCH 013/583] bump to v0.10.0-dev --- iris_grib/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index ce1dbf0f..b69271e8 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -47,7 +47,7 @@ from .message import GribMessage -__version__ = '0.9.0' +__version__ = '0.10.0-dev' __all__ = ['load_cubes', 'save_grib2', 'load_pairs_from_fields', 'save_pairs_from_cube', 'save_messages'] From 1636fb254502c84d6d1b66d4f91ee0ac2f1c121e Mon Sep 17 00:00:00 2001 From: Daniel Kirkham Date: Wed, 15 Mar 2017 16:38:29 +0000 Subject: [PATCH 014/583] Add support for Lambert Conformal saving (#73) * Add support for Lambert Conformal saving --- iris_grib/_save_rules.py | 129 +++++++++++++--- iris_grib/tests/__init__.py | 9 +- .../test_grid_definition_section.py | 6 +- .../test_grid_definition_template_30.py | 138 ++++++++++++++++++ 4 files changed, 253 insertions(+), 29 deletions(-) create mode 100644 iris_grib/tests/unit/save_rules/test_grid_definition_template_30.py diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index 29839907..87274d7a 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2010 - 2016, Met Office +# (C) British Crown Copyright 2010 - 2017, Met Office # # This file is part of iris-grib. # @@ -31,10 +31,12 @@ import gribapi import numpy as np import numpy.ma as ma +import cartopy.crs as ccrs import iris import iris.exceptions -from iris.coord_systems import GeogCS, RotatedGeogCS, TransverseMercator +from iris.coord_systems import (GeogCS, RotatedGeogCS, TransverseMercator, + LambertConformal) from . import grib_phenom_translation as gptx from ._load_convert import (_STATISTIC_TYPE_NAMES, _TIME_RANGE_UNITS) from iris.util import is_regular, regular_step @@ -221,9 +223,9 @@ def shape_of_the_earth(cube, grib): ellipsoid.semi_minor_axis) -def grid_dims(x_coord, y_coord, grib): - gribapi.grib_set_long(grib, "Ni", x_coord.shape[0]) - gribapi.grib_set_long(grib, "Nj", y_coord.shape[0]) +def grid_dims(x_coord, y_coord, grib, x_str, y_str): + gribapi.grib_set_long(grib, x_str, x_coord.shape[0]) + gribapi.grib_set_long(grib, y_str, y_coord.shape[0]) def latlon_first_last(x_coord, y_coord, grib): @@ -264,12 +266,13 @@ def scanning_mode_flags(x_coord, y_coord, grib): int(y_coord.points[1] - y_coord.points[0] > 0)) -def horizontal_grid_common(cube, grib): +def horizontal_grid_common(cube, grib, xy=False): + nx_str, ny_str = ("Nx", "Ny") if xy else ("Ni", "Nj") # Grib encoding of the sequences of X and Y points. y_coord = cube.coord(dimensions=[0]) x_coord = cube.coord(dimensions=[1]) shape_of_the_earth(cube, grib) - grid_dims(x_coord, y_coord, grib) + grid_dims(x_coord, y_coord, grib, nx_str, ny_str) scanning_mode_flags(x_coord, y_coord, grib) @@ -329,6 +332,20 @@ def rotated_pole(cube, grib): gribapi.grib_set(grib, "angleOfRotation", 0) +def points_in_unit(coord, unit): + points = coord.units.convert(coord.points, unit) + points = np.around(points).astype(int) + return points + + +def step(points, atol): + diffs = points[1:] - points[:-1] + mean_diff = np.mean(diffs).astype(points.dtype) + if not np.allclose(diffs, mean_diff, atol=atol): + raise ValueError() + return int(mean_diff) + + def grid_definition_template_0(cube, grib): """ Set keys within the provided grib message based on @@ -411,29 +428,23 @@ def grid_definition_template_12(cube, grib): # Normalise the coordinate values to centimetres - the resolution # used in the GRIB message. - def points_in_cm(coord): - points = coord.units.convert(coord.points, 'cm') - points = np.around(points).astype(int) - return points - y_cm = points_in_cm(y_coord) - x_cm = points_in_cm(x_coord) + y_cm = points_in_unit(y_coord, 'cm') + x_cm = points_in_unit(x_coord, 'cm') # Set some keys specific to GDT12. # Encode the horizontal points. # NB. Since we're already in centimetres, our tolerance for # discrepancy in the differences is 1. - def step(points): - diffs = points[1:] - points[:-1] - mean_diff = np.mean(diffs).astype(points.dtype) - if not np.allclose(diffs, mean_diff, atol=1): - msg = ('Irregular coordinates not supported for transverse ' - 'Mercator.') - raise iris.exceptions.TranslationError(msg) - return int(mean_diff) - - gribapi.grib_set(grib, 'Di', abs(step(x_cm))) - gribapi.grib_set(grib, 'Dj', abs(step(y_cm))) + try: + x_step = step(x_cm, atol=1) + y_step = step(y_cm, atol=1) + except ValueError: + msg = ('Irregular coordinates not supported for transverse ' + 'Mercator.') + raise iris.exceptions.TranslationError(msg) + gribapi.grib_set(grib, 'Di', abs(x_step)) + gribapi.grib_set(grib, 'Dj', abs(y_step)) horizontal_grid_common(cube, grib) # GRIBAPI expects unsigned ints in X1, X2, Y1, Y2 but it should accept @@ -470,6 +481,73 @@ def m_to_cm(value): gribapi.grib_set(grib, "scaleFactorAtReferencePoint", value) +def grid_definition_template_30(cube, grib): + """ + Set keys within the provided grib message based on + Grid Definition Template 3.30. + + Template 3.30 is used to represent a Lambert Conformal grid. + + """ + + gribapi.grib_set(grib, "gridDefinitionTemplateNumber", 30) + + # Retrieve some information from the cube. + y_coord = cube.coord(dimensions=[0]) + x_coord = cube.coord(dimensions=[1]) + cs = y_coord.coord_system + + # Normalise the coordinate values to millimetres - the resolution + # used in the GRIB message. + y_mm = points_in_unit(y_coord, 'mm') + x_mm = points_in_unit(x_coord, 'mm') + + # Encode the horizontal points. + + # NB. Since we're already in millimetres, our tolerance for + # discrepancy in the differences is 1. + try: + x_step = step(x_mm, atol=1) + y_step = step(y_mm, atol=1) + except ValueError: + msg = ('Irregular coordinates not supported for Lambert ' + 'Conformal.') + raise iris.exceptions.TranslationError(msg) + gribapi.grib_set(grib, 'Dx', abs(x_step)) + gribapi.grib_set(grib, 'Dy', abs(y_step)) + + horizontal_grid_common(cube, grib, xy=True) + + # Transform first point into geographic CS + geog = cs.ellipsoid if cs.ellipsoid is not None else GeogCS(1) + first_x, first_y = geog.as_cartopy_crs().transform_point( + x_coord.points[0], + y_coord.points[0], + cs.as_cartopy_crs()) + first_x = first_x % 360 + central_lon = cs.central_lon % 360 + + gribapi.grib_set(grib, "latitudeOfFirstGridPoint", + int(np.round(first_y * 1e6))) + gribapi.grib_set(grib, "longitudeOfFirstGridPoint", + int(np.round(first_x * 1e6))) + gribapi.grib_set(grib, "LaD", cs.central_lat * 1e6) + gribapi.grib_set(grib, "LoV", central_lon * 1e6) + latin1, latin2 = cs.secant_latitudes + gribapi.grib_set(grib, "Latin1", latin1 * 1e6) + gribapi.grib_set(grib, "Latin2", latin2 * 1e6) + gribapi.grib_set(grib, 'resolutionAndComponentFlags', + 0x1 << _RESOLUTION_AND_COMPONENTS_GRID_WINDS_BIT) + + # Which pole are the parallels closest to? That is the direction + # that the cone converges. + poliest_sec = latin1 if abs(latin1) > abs(latin2) else latin2 + centre_flag = 0x0 if poliest_sec > 0 else 0x1 + gribapi.grib_set(grib, 'projectionCentreFlag', centre_flag) + gribapi.grib_set(grib, "latitudeOfSouthernPole", 0) + gribapi.grib_set(grib, "longitudeOfSouthernPole", 0) + + def grid_definition_section(cube, grib): """ Set keys within the grid definition section of the provided grib message, @@ -501,6 +579,9 @@ def grid_definition_section(cube, grib): # Transverse Mercator coordinate system (template 3.12). grid_definition_template_12(cube, grib) + elif isinstance(cs, LambertConformal): + # Lambert Conformal coordinate system (template 3.30). + grid_definition_template_30(cube, grib) else: raise ValueError('Grib saving is not supported for coordinate system: ' '{}'.format(cs)) diff --git a/iris_grib/tests/__init__.py b/iris_grib/tests/__init__.py index 48a5543b..fc715b79 100644 --- a/iris_grib/tests/__init__.py +++ b/iris_grib/tests/__init__.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2010 - 2016, Met Office +# (C) British Crown Copyright 2010 - 2017, Met Office # # This file is part of iris-grib. # @@ -31,7 +31,12 @@ import os import os.path -from iris.tests import IrisTest, main, skip_data, get_data_path +try: + from iris.tests import IrisTest_nometa as IrisTest +except ImportError: + from iris.tests import IrisTest + +from iris.tests import main, skip_data, get_data_path #: Basepath for iris-grib test results. diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_section.py b/iris_grib/tests/unit/save_rules/test_grid_definition_section.py index a525f6b6..959e7ae4 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_section.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_section.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# (C) British Crown Copyright 2014 - 2017, Met Office # # This file is part of iris-grib. # @@ -26,7 +26,7 @@ # importing anything else. import iris_grib.tests as tests -from iris.coord_systems import LambertConformal +from iris.coord_systems import Orthographic from iris.exceptions import TranslationError from iris_grib._save_rules import grid_definition_section @@ -46,7 +46,7 @@ def test__fail_irregular_latlon(self): grid_definition_section(test_cube, self.mock_grib) def test__fail_unsupported_coord_system(self): - cs = LambertConformal() + cs = Orthographic(0, 0) test_cube = self._make_test_cube(cs=cs) with self.assertRaisesRegexp( ValueError, diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_30.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_30.py new file mode 100644 index 00000000..9cd6aaa7 --- /dev/null +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_30.py @@ -0,0 +1,138 @@ +# (C) British Crown Copyright 2017, Met Office +# +# This file is part of iris-grib. +# +# iris-grib is free software: you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the +# Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# iris-grib is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with iris-grib. If not, see . +""" +Unit tests for :meth:`iris_grib._save_rules.grid_definition_template_30`. + +""" + +from __future__ import (absolute_import, division, print_function) +from six.moves import (filter, input, map, range, zip) # noqa + +# Import iris_grib.tests first so that some things can be initialised before +# importing anything else. +import iris_grib.tests as tests + +import numpy as np + +import iris.coords +from iris.coord_systems import GeogCS, LambertConformal +from iris.exceptions import TranslationError + +from iris_grib._save_rules import grid_definition_template_30 +from iris_grib.tests.unit.save_rules import GdtTestMixin + + +class FakeGribError(Exception): + pass + + +class Test(tests.IrisGribTest, GdtTestMixin): + def setUp(self): + self.default_ellipsoid = GeogCS(semi_major_axis=6377563.396, + semi_minor_axis=6356256.909) + self.test_cube = self._make_test_cube() + + GdtTestMixin.setUp(self) + + def _make_test_cube(self, cs=None, x_points=None, y_points=None): + # Create a cube with given properties, or minimal defaults. + if cs is None: + cs = self._default_coord_system() + if x_points is None: + x_points = self._default_x_points() + if y_points is None: + y_points = self._default_y_points() + + x_coord = iris.coords.DimCoord(x_points, 'projection_x_coordinate', + units='m', coord_system=cs) + y_coord = iris.coords.DimCoord(y_points, 'projection_y_coordinate', + units='m', coord_system=cs) + test_cube = iris.cube.Cube(np.zeros((len(y_points), len(x_points)))) + test_cube.add_dim_coord(y_coord, 0) + test_cube.add_dim_coord(x_coord, 1) + return test_cube + + def _default_coord_system(self): + return LambertConformal(central_lat=39.0, central_lon=-96.0, + false_easting=0.0, false_northing=0.0, + secant_latitudes=(33, 45), + ellipsoid=self.default_ellipsoid) + + def test__template_number(self): + grid_definition_template_30(self.test_cube, self.mock_grib) + self._check_key('gridDefinitionTemplateNumber', 30) + + def test__shape_of_earth(self): + grid_definition_template_30(self.test_cube, self.mock_grib) + self._check_key('shapeOfTheEarth', 7) + self._check_key('scaleFactorOfEarthMajorAxis', 0) + self._check_key('scaledValueOfEarthMajorAxis', 6377563.396) + self._check_key('scaleFactorOfEarthMinorAxis', 0) + self._check_key('scaledValueOfEarthMinorAxis', 6356256.909) + + def test__grid_shape(self): + test_cube = self._make_test_cube(x_points=np.arange(13), + y_points=np.arange(6)) + grid_definition_template_30(test_cube, self.mock_grib) + self._check_key('Nx', 13) + self._check_key('Ny', 6) + + def test__grid_points(self): + test_cube = self._make_test_cube(x_points=[1e6, 3e6, 5e6, 7e6], + y_points=[4e6, 9e6]) + grid_definition_template_30(test_cube, self.mock_grib) + self._check_key("latitudeOfFirstGridPoint", 71676530) + self._check_key("longitudeOfFirstGridPoint", 287218188) + self._check_key("Dx", 2e9) + self._check_key("Dy", 5e9) + + def test__template_specifics(self): + grid_definition_template_30(self.test_cube, self.mock_grib) + self._check_key("LaD", 39e6) + self._check_key("LoV", 264e6) + self._check_key("Latin1", 33e6) + self._check_key("Latin2", 45e6) + self._check_key("latitudeOfSouthernPole", 0) + self._check_key("longitudeOfSouthernPole", 0) + + def test__scanmode(self): + grid_definition_template_30(self.test_cube, self.mock_grib) + self._check_key('iScansPositively', 1) + self._check_key('jScansPositively', 1) + + def test__scanmode_reverse(self): + test_cube = self._make_test_cube(x_points=np.arange(7e6, 0, -1e6)) + grid_definition_template_30(test_cube, self.mock_grib) + self._check_key('iScansPositively', 0) + self._check_key('jScansPositively', 1) + + def test_projection_centre(self): + grid_definition_template_30(self.test_cube, self.mock_grib) + self._check_key("projectionCentreFlag", 0) + + def test_projection_centre_south_pole(self): + cs = LambertConformal(central_lat=39.0, central_lon=-96.0, + false_easting=0.0, false_northing=0.0, + secant_latitudes=(-33, -45), + ellipsoid=self.default_ellipsoid) + test_cube = self._make_test_cube(cs=cs) + grid_definition_template_30(test_cube, self.mock_grib) + self._check_key("projectionCentreFlag", 1) + + +if __name__ == "__main__": + tests.main() From d1fabb35409565da4f06f24560ca08836da42590 Mon Sep 17 00:00:00 2001 From: Phil Elson Date: Fri, 17 Mar 2017 00:33:22 +1100 Subject: [PATCH 015/583] Remove use of threads.local as a means of storing options. (#72) --- iris_grib/_load_convert.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index 87ffa602..3cfe4aae 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -23,10 +23,10 @@ from __future__ import (absolute_import, division, print_function) from six.moves import (filter, input, map, range, zip) # noqa +from argparse import Namespace from collections import namedtuple, Iterable, OrderedDict from datetime import datetime, timedelta import math -import threading import warnings import cartopy.crs as ccrs @@ -49,9 +49,9 @@ # Restrict the names imported from this namespace. __all__ = ['convert'] -options = threading.local() -options.warn_on_unsupported = False -options.support_hindcast_values = True + +options = Namespace(warn_on_unsupported=False, + support_hindcast_values=True) ScanningMode = namedtuple('ScanningMode', ['i_negative', 'j_positive', From 00cf192baf3ed2d475301e6044c88e6d024bf382 Mon Sep 17 00:00:00 2001 From: Daniel Kirkham Date: Mon, 27 Mar 2017 14:28:13 +0100 Subject: [PATCH 016/583] Prevent usage of floats as indices to numpy arrays due to deprecation (#75) * Prevent usage of floats as indices to numpy arrays due to deprecation --- iris_grib/__init__.py | 4 ++-- iris_grib/_load_convert.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index b69271e8..dec7c68f 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2010 - 2016, Met Office +# (C) British Crown Copyright 2010 - 2017, Met Office # # This file is part of iris-grib. # @@ -184,7 +184,7 @@ def __init__(self, grib_message, grib_fh=None): # The byte offset requires to be reset back to the first byte # of this message. The file pointer offset is always at the end # of the current message due to the grib-api reading the message. - proxy = GribDataProxy(shape, np.zeros(.0).dtype, np.nan, + proxy = GribDataProxy(shape, np.zeros(0).dtype, np.nan, grib_fh.name, offset - message_length) self._data = biggus.NumpyArrayAdapter(proxy) diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index 3cfe4aae..513b9cdc 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# (C) British Crown Copyright 2014 - 2017, Met Office # # This file is part of iris-grib. # @@ -1351,7 +1351,7 @@ def hybrid_factories(section, metadata): units='Pa') metadata['aux_coords_and_dims'].append((coord, None)) # Create the sigma scalar coordinate. - offset += NV / 2 + offset += NV // 2 coord = AuxCoord(pv[offset], long_name='sigma') metadata['aux_coords_and_dims'].append((coord, None)) # Create the associated factory reference. From f82e491678d7aee7ac6953874e281b553348ff89 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Thu, 30 Mar 2017 15:46:27 +0100 Subject: [PATCH 017/583] Support for pdt 4.15. (#76) * support for pdt 4.15. --- iris_grib/_load_convert.py | 77 ++++++++++++- .../test_product_definition_template_10.py | 5 +- .../test_product_definition_template_11.py | 5 +- .../test_product_definition_template_15.py | 109 ++++++++++++++++++ .../test_statistical_cell_method.py | 62 ++++++++-- 5 files changed, 240 insertions(+), 18 deletions(-) create mode 100644 iris_grib/tests/unit/load_convert/test_product_definition_template_15.py diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index 513b9cdc..b499759d 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -1660,6 +1660,30 @@ def data_cutoff(hoursAfterDataCutoff, minutesAfterDataCutoff): 'after data cutoff".') +def statistical_method_name(section): + # Decode the type of statistic as a cell_method 'method' string. + # Templates 8, 9, 10, 11 and 15 all use this type code, which is defined + # in table 4.10. + # However, the actual keyname is different for template 15. + section_number = section['productDefinitionTemplateNumber'] + if section_number in (8, 9, 10, 11): + stat_keyname = 'typeOfStatisticalProcessing' + elif section_number == 15: + stat_keyname = 'statisticalProcess' + else: + # This should *never* happen, as only called by pdt 8 and 15. + msg = ("Internal error: can't get statistical method for unsupported " + "pdt : 4.{:d}.") + raise ValueError(msg.format(section_number)) + statistic_code = section[stat_keyname] + statistic_name = _STATISTIC_TYPE_NAMES.get(statistic_code) + if statistic_name is None: + msg = ('Product definition section 4 contains an unsupported ' + 'statistical process type [{}] ') + raise TranslationError(msg.format(statistic_code)) + return statistic_name + + def statistical_cell_method(section): """ Create a cell method representing a time statistic. @@ -1689,12 +1713,7 @@ def statistical_cell_method(section): raise TranslationError(msg) # Decode the type of statistic (aggregation method). - statistic_code = section['typeOfStatisticalProcessing'] - statistic_name = _STATISTIC_TYPE_NAMES.get(statistic_code) - if statistic_name is None: - msg = ('grib statistical process type [{}] ' - 'is not supported'.format(statistic_code)) - raise TranslationError(msg) + statistic_name = statistical_method_name(section) # Decode the type of time increment. increment_typecode = section['typeOfTimeIncrement'] @@ -1987,6 +2006,50 @@ def product_definition_template_11(section, metadata, frt_coord): metadata['aux_coords_and_dims'].append((realization, None)) +def product_definition_template_15(section, metadata, frt_coord): + """ + Translate template representing : "average, accumulation, extreme values, + or other statistically processed values over a spatial area at a + horizontal level or in a horizontal layer at a point in time". + + Updates the metadata in-place with the translations. + + Args: + + * section: + Dictionary of coded key/value pairs from section 4 of the message. + + * metadata: + :class:`collections.OrderedDict` of metadata. + + * frt_coord: + The scalar forecast reference time :class:`iris.coords.DimCoord`. + + """ + # Check unique keys for this template. + spatial_processing_code = section['spatialProcessing'] + + if spatial_processing_code != 0: + # For now, we only support the simplest case, representing a statistic + # over the whole notional area of a cell. + msg = ('Product definition section 4 contains an unsupported ' + 'spatial processing type [{}]'.format(spatial_processing_code)) + raise TranslationError(msg) + + # NOTE: PDT 4.15 alse defines a 'numberOfPointsUsed' key, but we think this + # is irrelevant to the currently supported spatial-processing types. + + # Process parts in common with pdt 4.0. + product_definition_template_0(section, metadata, frt_coord) + + # Decode the statistic method name. + cell_method_name = statistical_method_name(section) + + # Record an 'area' cell-method using this statistic. + metadata['cell_methods'] = [CellMethod(coords=('area',), + method=cell_method_name)] + + def product_definition_template_31(section, metadata, rt_coord): """ Translate template representing a satellite product. @@ -2125,6 +2188,8 @@ def product_definition_section(section, metadata, discipline, tablesVersion, product_definition_template_10(section, metadata, rt_coord) elif template == 11: product_definition_template_11(section, metadata, rt_coord) + elif template == 15: + product_definition_template_15(section, metadata, rt_coord) elif template == 31: # Process satellite product. product_definition_template_31(section, metadata, rt_coord) diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_10.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_10.py index 7b056ef4..c749476b 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_10.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_10.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2016, Met Office +# (C) British Crown Copyright 2016 - 2017, Met Office # # This file is part of iris-grib. # @@ -49,7 +49,8 @@ def setUp(self): def test_percentile_coord(self): metadata = empty_metadata() percentileValue = 75 - section = {'percentileValue': percentileValue, + section = {'productDefinitionTemplateNumber': 10, + 'percentileValue': percentileValue, 'hoursAfterDataCutoff': 1, 'minutesAfterDataCutoff': 1, 'numberOfTimeRange': 1, diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_11.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_11.py index 1abcb8d5..a97b7ad9 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_11.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_11.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2016, Met Office +# (C) British Crown Copyright 2016 - 2017, Met Office # # This file is part of iris-grib. # @@ -63,7 +63,8 @@ def _check(self, request_warning): with mock.patch(grib_lconv_opt, warn_on_unsupported=request_warning): metadata = deepcopy(self.metadata) perturbationNumber = 666 - section = {'perturbationNumber': perturbationNumber, + section = {'productDefinitionTemplateNumber': 11, + 'perturbationNumber': perturbationNumber, 'hoursAfterDataCutoff': 1, 'minutesAfterDataCutoff': 1, 'numberOfTimeRange': 1, diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py new file mode 100644 index 00000000..3390dca8 --- /dev/null +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py @@ -0,0 +1,109 @@ +# (C) British Crown Copyright 2014 - 2017, Met Office +# +# This file is part of iris-grib. +# +# iris-grib is free software: you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the +# Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# iris-grib is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with iris-grib. If not, see . +""" +Test function +:func:`iris_grib._load_convert.product_definition_template_15`. + +This basically copies code from 'test_product_definition_template_0', and adds +testing for the statistical method and spatial-processing type. + +""" + +from __future__ import (absolute_import, division, print_function) +from six.moves import (filter, input, map, range, zip) # noqa + +# import iris_grib.tests first so that some things can be initialised +# before importing anything else. +import iris_grib.tests as tests + +import mock + +import iris.coords +from iris.exceptions import TranslationError +from iris.coords import CellMethod + +import iris_grib +from iris_grib.tests.unit.load_convert import LoadConvertTest, empty_metadata +from iris_grib._load_convert import product_definition_template_15 + + +MDI = 0xffffffff + + +def section_4(): + return {'productDefinitionTemplateNumber': 15, + 'hoursAfterDataCutoff': MDI, + 'minutesAfterDataCutoff': MDI, + 'indicatorOfUnitOfTimeRange': 0, # minutes + 'forecastTime': 360, + 'NV': 0, + 'typeOfFirstFixedSurface': 103, + 'scaleFactorOfFirstFixedSurface': 0, + 'scaledValueOfFirstFixedSurface': 9999, + 'typeOfSecondFixedSurface': 255, + 'statisticalProcess': 2, # method = maximum + 'spatialProcessing': 0, # from source grid, no interpolation + 'numberOfPointsUsed': 0 # unused? + } + + +class Test(LoadConvertTest): + def setUp(self): + self.ref_time_coord = iris.coords.DimCoord(24, 'time', + units='hours since epoch') + + def _check_translate(self, section): + metadata = empty_metadata() + product_definition_template_15(section, metadata, + self.ref_time_coord) + return metadata + + def test_t(self): + metadata = self._check_translate(section_4()) + + expected = empty_metadata() + aux = expected['aux_coords_and_dims'] + aux.append((iris.coords.DimCoord(6, 'forecast_period', units='hours'), + None)) + aux.append(( + iris.coords.DimCoord(18, 'forecast_reference_time', + units='hours since epoch'), None)) + aux.append((self.ref_time_coord, None)) + aux.append((iris.coords.DimCoord(9999, long_name='height', units='m'), + None)) + expected['cell_methods'] = [CellMethod(coords=('area',), + method='maximum')] + + self.assertMetadataEqual(metadata, expected) + + def test_bad_statistic_method(self): + section = section_4() + section['statisticalProcess'] = 999 + msg = ('unsupported statistical process type \[999\]') + with self.assertRaisesRegexp(TranslationError, msg): + self._check_translate(section) + + def test_bad_spatial_processing_code(self): + section = section_4() + section['spatialProcessing'] = 999 + msg = ('unsupported spatial processing type \[999\]') + with self.assertRaisesRegexp(TranslationError, msg): + self._check_translate(section) + + +if __name__ == '__main__': + tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_statistical_cell_method.py b/iris_grib/tests/unit/load_convert/test_statistical_cell_method.py index e125d5cb..69d7f1f7 100644 --- a/iris_grib/tests/unit/load_convert/test_statistical_cell_method.py +++ b/iris_grib/tests/unit/load_convert/test_statistical_cell_method.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# (C) British Crown Copyright 2014 - 2017, Met Office # # This file is part of iris-grib. # @@ -27,6 +27,7 @@ # before importing anything else. import iris_grib.tests as tests +from iris.coords import CellMethod from iris.exceptions import TranslationError from iris_grib._load_convert import statistical_cell_method @@ -35,24 +36,35 @@ class Test(tests.IrisGribTest): def setUp(self): self.section = {} + self.section['productDefinitionTemplateNumber'] = 8 self.section['numberOfTimeRange'] = 1 self.section['typeOfStatisticalProcessing'] = 0 self.section['typeOfTimeIncrement'] = 2 self.section['timeIncrement'] = 0 + def expected_cell_method(self, + coords=('time',), method='mean', intervals=None): + keys = dict(coords=coords, method=method, intervals=intervals) + cell_method = CellMethod(**keys) + return cell_method + def test_basic(self): cell_method = statistical_cell_method(self.section) - self.assertEqual(cell_method.method, 'mean') - self.assertEqual(cell_method.coord_names, ('time',)) - self.assertEqual(cell_method.intervals, ()) + self.assertEqual(cell_method, self.expected_cell_method()) def test_intervals(self): self.section['timeIncrement'] = 3 self.section['indicatorOfUnitForTimeIncrement'] = 1 cell_method = statistical_cell_method(self.section) - self.assertEqual(cell_method.method, 'mean') - self.assertEqual(cell_method.coord_names, ('time',)) - self.assertEqual(cell_method.intervals, ('3 hours',)) + self.assertEqual(cell_method, + self.expected_cell_method(intervals=('3 hours',))) + + def test_different_statistic(self): + self.section['typeOfStatisticalProcessing'] = 6 + cell_method = statistical_cell_method(self.section) + self.assertEqual( + cell_method, + self.expected_cell_method(method='standard_deviation')) def test_fail_bad_ranges(self): self.section['numberOfTimeRange'] = 0 @@ -70,7 +82,7 @@ def test_fail_unknown_statistic(self): self.section['typeOfStatisticalProcessing'] = 17 with self.assertRaisesRegexp( TranslationError, - 'statistical process type \[17\] is not supported'): + 'contains an unsupported statistical process type \[17\]'): statistical_cell_method(self.section) def test_fail_bad_increment_type(self): @@ -80,6 +92,40 @@ def test_fail_bad_increment_type(self): 'time-increment type \[7\] is not supported'): statistical_cell_method(self.section) + def test_pdt_9(self): + # Should behave the same as PDT 4.8. + self.section['productDefinitionTemplateNumber'] = 9 + cell_method = statistical_cell_method(self.section) + self.assertEqual(cell_method, self.expected_cell_method()) + + def test_pdt_10(self): + # Should behave the same as PDT 4.8. + self.section['productDefinitionTemplateNumber'] = 10 + cell_method = statistical_cell_method(self.section) + self.assertEqual(cell_method, self.expected_cell_method()) + + def test_pdt_11(self): + # Should behave the same as PDT 4.8. + self.section['productDefinitionTemplateNumber'] = 11 + cell_method = statistical_cell_method(self.section) + self.assertEqual(cell_method, self.expected_cell_method()) + + def test_pdt_15(self): + # Encoded slightly differently to PDT 4.8. + self.section['productDefinitionTemplateNumber'] = 15 + test_code = self.section['typeOfStatisticalProcessing'] + del self.section['typeOfStatisticalProcessing'] + self.section['statisticalProcess'] = test_code + cell_method = statistical_cell_method(self.section) + self.assertEqual(cell_method, self.expected_cell_method()) + + def test_fail_unsupported_pdt(self): + # Rejects PDTs other than the ones tested above. + self.section['productDefinitionTemplateNumber'] = 101 + msg = "can't get statistical method for unsupported pdt : 4.101" + with self.assertRaisesRegexp(ValueError, msg): + statistical_cell_method(self.section) + if __name__ == '__main__': tests.main() From 0981f320c00593985da0c7f3d463b239f8b85e6a Mon Sep 17 00:00:00 2001 From: Daniel Kirkham Date: Thu, 30 Mar 2017 16:15:14 +0100 Subject: [PATCH 018/583] Product Definition Template 32 (synthetic satellite data) (#77) * Product definition template 32 --- iris_grib/_load_convert.py | 137 +++++++++++------- .../load_convert/test_generating_process.py | 32 ++-- .../test_product_definition_template_10.py | 2 +- .../test_product_definition_template_31.py | 70 +++------ .../test_product_definition_template_32.py | 85 +++++++++++ .../load_convert/test_satellite_common.py | 84 +++++++++++ 6 files changed, 297 insertions(+), 113 deletions(-) create mode 100644 iris_grib/tests/unit/load_convert/test_product_definition_template_32.py create mode 100644 iris_grib/tests/unit/load_convert/test_satellite_common.py diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index b499759d..b85dbd36 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -1630,14 +1630,38 @@ def coord_timedelta(coord, value): return coord -def generating_process(section): +def time_coords(section, metadata, rt_coord): + if 'forecastTime' in section.keys(): + forecast_time = section['forecastTime'] + # The gribapi encodes the forecast time as 'startStep' for pdt 4.4x; + # product_definition_template_40 makes use of this function. The + # following will be removed once the suspected bug is fixed. + elif 'startStep' in section.keys(): + forecast_time = section['startStep'] + + # Calculate the forecast period coordinate. + fp_coord = forecast_period_coord(section['indicatorOfUnitOfTimeRange'], + forecast_time) + # Add the forecast period coordinate to the metadata aux coords. + metadata['aux_coords_and_dims'].append((fp_coord, None)) + # Calculate the "other" time coordinate - i.e. whichever of 'time' + # or 'forecast_reference_time' we don't already have. + other_coord = other_time_coord(rt_coord, fp_coord) + # Add the time coordinate to the metadata aux coords. + metadata['aux_coords_and_dims'].append((other_coord, None)) + # Add the reference time coordinate to the metadata aux coords. + metadata['aux_coords_and_dims'].append((rt_coord, None)) + + +def generating_process(section, include_forecast_process=True): if options.warn_on_unsupported: # Reference Code Table 4.3. warnings.warn('Unable to translate type of generating process.') warnings.warn('Unable to translate background generating ' 'process identifier.') - warnings.warn('Unable to translate forecast generating ' - 'process identifier.') + if include_forecast_process: + warnings.warn('Unable to translate forecast generating ' + 'process identifier.') def data_cutoff(hoursAfterDataCutoff, minutesAfterDataCutoff): @@ -1781,28 +1805,7 @@ def product_definition_template_0(section, metadata, rt_coord): data_cutoff(section['hoursAfterDataCutoff'], section['minutesAfterDataCutoff']) - if 'forecastTime' in section.keys(): - forecast_time = section['forecastTime'] - # The gribapi encodes the forecast time as 'startStep' for pdt 4.4x; - # product_definition_template_40 makes use of this function. The - # following will be removed once the suspected bug is fixed. - elif 'startStep' in section.keys(): - forecast_time = section['startStep'] - - # Calculate the forecast period coordinate. - fp_coord = forecast_period_coord(section['indicatorOfUnitOfTimeRange'], - forecast_time) - # Add the forecast period coordinate to the metadata aux coords. - metadata['aux_coords_and_dims'].append((fp_coord, None)) - - # Calculate the "other" time coordinate - i.e. whichever of 'time' - # or 'forecast_reference_time' we don't already have. - other_coord = other_time_coord(rt_coord, fp_coord) - # Add the time coordinate to the metadata aux coords. - metadata['aux_coords_and_dims'].append((other_coord, None)) - - # Add the reference time coordinate to the metadata aux coords. - metadata['aux_coords_and_dims'].append((rt_coord, None)) + time_coords(section, metadata, rt_coord) # Check for vertical coordinates. vertical_coords(section, metadata) @@ -2050,29 +2053,7 @@ def product_definition_template_15(section, metadata, frt_coord): method=cell_method_name)] -def product_definition_template_31(section, metadata, rt_coord): - """ - Translate template representing a satellite product. - - Updates the metadata in-place with the translations. - - Args: - - * section: - Dictionary of coded key/value pairs from section 4 of the message. - - * metadata: - :class:`collections.OrderedDict` of metadata. - - * rt_coord: - The scalar observation time :class:`iris.coords.DimCoord'. - - """ - if options.warn_on_unsupported: - warnings.warn('Unable to translate type of generating process.') - warnings.warn('Unable to translate observation generating ' - 'process identifier.') - +def satellite_common(section, metadata): # Number of contributing spectral bands. NB = section['NB'] @@ -2106,8 +2087,62 @@ def product_definition_template_31(section, metadata, rt_coord): # Add the central wave number coordinate to the metadata aux coords. metadata['aux_coords_and_dims'].append((coord, None)) - # Add the observation time coordinate. - metadata['aux_coords_and_dims'].append((rt_coord, None)) + +def product_definition_template_31(section, metadata, rt_coord): + """ + Translate template representing a satellite product. + + Updates the metadata in-place with the translations. + + Args: + + * section: + Dictionary of coded key/value pairs from section 4 of the message. + + * metadata: + :class:`collections.OrderedDict` of metadata. + + * rt_coord: + The scalar observation time :class:`iris.coords.DimCoord'. + + """ + generating_process(section, include_forecast_process=False) + + satellite_common(section, metadata) + + # Add the observation time coordinate. + metadata['aux_coords_and_dims'].append((rt_coord, None)) + + +def product_definition_template_32(section, metadata, rt_coord): + """ + Translate template representing an analysis or forecast at a horizontal + level or in a horizontal layer at a point in time for simulated (synthetic) + satellite data. + + Updates the metadata in-place with the translations. + + Args: + + * section: + Dictionary of coded key/value pairs from section 4 of the message. + + * metadata: + :class:`collections.OrderedDict` of metadata. + + * rt_coord: + The scalar observation time :class:`iris.coords.DimCoord'. + + """ + generating_process(section, include_forecast_process=False) + + # Handle the data cutoff. + data_cutoff(section['hoursAfterDataCutoff'], + section['minutesAfterDataCutoff']) + + time_coords(section, metadata, rt_coord) + + satellite_common(section, metadata) def product_definition_template_40(section, metadata, frt_coord): @@ -2193,6 +2228,8 @@ def product_definition_section(section, metadata, discipline, tablesVersion, elif template == 31: # Process satellite product. product_definition_template_31(section, metadata, rt_coord) + elif template == 32: + product_definition_template_32(section, metadata, rt_coord) elif template == 40: product_definition_template_40(section, metadata, rt_coord) else: diff --git a/iris_grib/tests/unit/load_convert/test_generating_process.py b/iris_grib/tests/unit/load_convert/test_generating_process.py index b6fa9d3c..97fac5ac 100644 --- a/iris_grib/tests/unit/load_convert/test_generating_process.py +++ b/iris_grib/tests/unit/load_convert/test_generating_process.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# (C) British Crown Copyright 2014 - 2017, Met Office # # This file is part of iris-grib. # @@ -38,18 +38,30 @@ def test_nowarn(self): generating_process(None) self.assertEqual(self.warn_patch.call_count, 0) - def test_warn(self): + def _check_warnings(self, with_forecast=True): module = 'iris_grib._load_convert' self.patch(module + '.options.warn_on_unsupported', True) - generating_process(None) + call_args = [None] + call_kwargs = {} + expected_fragments = [ + 'Unable to translate type of generating process', + 'Unable to translate background generating process'] + if with_forecast: + expected_fragments.append( + 'Unable to translate forecast generating process') + else: + call_kwargs['include_forecast_process'] = False + generating_process(*call_args, **call_kwargs) got_msgs = [call[0][0] for call in self.warn_patch.call_args_list] - expected_msgs = ['Unable to translate type of generating process', - 'Unable to translate background generating process', - 'Unable to translate forecast generating process'] - for expect_msg in expected_msgs: - matches = [msg for msg in got_msgs if expect_msg in msg] - self.assertEqual(len(matches), 1) - got_msgs.remove(matches[0]) + for got_msg, expected_fragment in zip(sorted(got_msgs), + sorted(expected_fragments)): + self.assertIn(expected_fragment, got_msg) + + def test_warn_full(self): + self._check_warnings() + + def test_warn_no_forecast(self): + self._check_warnings(with_forecast=False) if __name__ == '__main__': diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_10.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_10.py index c749476b..0e4de1af 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_10.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_10.py @@ -31,7 +31,7 @@ from iris.coords import DimCoord from iris_grib._load_convert import product_definition_template_10 -from iris.tests.unit.fileformats.grib.load_convert import empty_metadata +from iris_grib.tests.unit.load_convert import empty_metadata class Test(tests.IrisGribTest): diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_31.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_31.py index f6611de6..10af448d 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_31.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_31.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# (C) British Crown Copyright 2014 - 2017, Met Office # # This file is part of iris-grib. # @@ -32,6 +32,7 @@ import warnings from iris.coords import AuxCoord +from iris_grib.tests.unit.load_convert import empty_metadata from iris_grib._load_convert import product_definition_template_31 @@ -39,17 +40,13 @@ class Test(tests.IrisGribTest): def setUp(self): self.patch('warnings.warn') - self.metadata = {'factories': [], 'references': [], - 'standard_name': None, - 'long_name': None, 'units': None, 'attributes': None, - 'cell_methods': [], 'dim_coords_and_dims': [], - 'aux_coords_and_dims': []} + self.satellite_common_patch = self.patch( + 'iris_grib._load_convert.satellite_common') + self.generating_process_patch = self.patch( + 'iris_grib._load_convert.generating_process') - def _check(self, request_warning=False, value=10, factor=1): + def test(self): # Prepare the arguments. - def unscale(v, f): - return v / 10.0 ** f - series = mock.sentinel.satelliteSeries number = mock.sentinel.satelliteNumber instrument = mock.sentinel.instrumentType @@ -58,50 +55,19 @@ def unscale(v, f): 'satelliteSeries': series, 'satelliteNumber': number, 'instrumentType': instrument, - 'scaleFactorOfCentralWaveNumber': factor, - 'scaledValueOfCentralWaveNumber': value} - metadata = deepcopy(self.metadata) - this = 'iris_grib._load_convert.options' - with mock.patch(this, warn_on_unsupported=request_warning): - # The call being tested. - product_definition_template_31(section, metadata, rt_coord) - # Check the result. - expected = deepcopy(self.metadata) - coord = AuxCoord(series, long_name='satellite_series') - expected['aux_coords_and_dims'].append((coord, None)) - coord = AuxCoord(number, long_name='satellite_number') - expected['aux_coords_and_dims'].append((coord, None)) - coord = AuxCoord(instrument, long_name='instrument_type') - expected['aux_coords_and_dims'].append((coord, None)) - standard_name = 'sensor_band_central_radiation_wavenumber' - coord = AuxCoord(unscale(value, factor), - standard_name=standard_name, - units='m-1') - expected['aux_coords_and_dims'].append((coord, None)) - expected['aux_coords_and_dims'].append((rt_coord, None)) - self.assertEqual(metadata, expected) - if request_warning: - warn_msgs = [arg[1][0] for arg in warnings.warn.mock_calls] - expected_msgs = ['type of generating process', - 'observation generating process identifier'] - for emsg in expected_msgs: - matches = [wmsg for wmsg in warn_msgs if emsg in wmsg] - self.assertEqual(len(matches), 1) - warn_msgs.remove(matches[0]) - else: - self.assertEqual(len(warnings.warn.mock_calls), 0) - - def test_pdt_no_warn(self): - self._check(request_warning=False) + 'scaleFactorOfCentralWaveNumber': 1, + 'scaledValueOfCentralWaveNumber': 12} - def test_pdt_warn(self): - self._check(request_warning=True) + # Call the function. + metadata = empty_metadata() + product_definition_template_31(section, metadata, rt_coord) - def test_wavelength_array(self): - value = np.array([1, 10, 100, 1000]) - for i in range(value.size): - factor = np.ones(value.shape) * i - self._check(value=value, factor=factor) + # Check that 'satellite_common' was called. + self.assertEqual(self.satellite_common_patch.call_count, 1) + # Check that 'generating_process' was called. + self.assertEqual(self.generating_process_patch.call_count, 1) + # Check that the scalar time coord was added in. + self.assertIn((rt_coord, None), metadata['aux_coords_and_dims']) if __name__ == '__main__': diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_32.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_32.py new file mode 100644 index 00000000..e54760a1 --- /dev/null +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_32.py @@ -0,0 +1,85 @@ +# (C) British Crown Copyright 2017, Met Office +# +# This file is part of iris-grib. +# +# iris-grib is free software: you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the +# Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# iris-grib is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with iris-grib. If not, see . +""" +Tests for `iris_grib._load_convert.product_definition_template_32`. + +""" + +from __future__ import (absolute_import, division, print_function) +from six.moves import (filter, input, map, range, zip) # noqa + +# import iris_grib.tests first so that some things can be initialised +# before importing anything else. +import iris_grib.tests as tests + +from copy import deepcopy +import mock +import numpy as np +import warnings + +from iris.coords import AuxCoord, DimCoord +from iris_grib.tests.unit.load_convert import empty_metadata + +from iris_grib._load_convert import product_definition_template_32 + +MDI = 0xffffffff + + +class Test(tests.IrisGribTest): + def setUp(self): + self.patch('warnings.warn') + self.generating_process_patch = self.patch( + 'iris_grib._load_convert.generating_process') + self.satellite_common_patch = self.patch( + 'iris_grib._load_convert.satellite_common') + self.time_coords_patch = self.patch( + 'iris_grib._load_convert.time_coords') + self.data_cutoff_patch = self.patch( + 'iris_grib._load_convert.data_cutoff') + + def test(self, value=10, factor=1): + # Prepare the arguments. + series = mock.sentinel.satelliteSeries + number = mock.sentinel.satelliteNumber + instrument = mock.sentinel.instrumentType + rt_coord = mock.sentinel.observation_time + section = {'NB': 1, + 'hoursAfterDataCutoff': None, + 'minutesAfterDataCutoff': None, + 'satelliteSeries': series, + 'satelliteNumber': number, + 'instrumentType': instrument, + 'scaleFactorOfCentralWaveNumber': 1, + 'scaledValueOfCentralWaveNumber': 12, + } + + # Call the function. + metadata = empty_metadata() + product_definition_template_32(section, metadata, rt_coord) + + # Check that 'satellite_common' was called. + self.assertEqual(self.satellite_common_patch.call_count, 1) + # Check that 'generating_process' was called. + self.assertEqual(self.generating_process_patch.call_count, 1) + # Check that 'data_cutoff' was called. + self.assertEqual(self.data_cutoff_patch.call_count, 1) + # Check that 'time_coords' was called. + self.assertEqual(self.time_coords_patch.call_count, 1) + + +if __name__ == '__main__': + tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_satellite_common.py b/iris_grib/tests/unit/load_convert/test_satellite_common.py new file mode 100644 index 00000000..bb82c94a --- /dev/null +++ b/iris_grib/tests/unit/load_convert/test_satellite_common.py @@ -0,0 +1,84 @@ +# (C) British Crown Copyright 2014 - 2017, Met Office +# +# This file is part of iris-grib. +# +# iris-grib is free software: you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the +# Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# iris-grib is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with iris-grib. If not, see . +""" +Tests for `iris_grib._load_convert.satellite_common`. + +""" + +from __future__ import (absolute_import, division, print_function) +from six.moves import (filter, input, map, range, zip) # noqa + +# import iris_grib.tests first so that some things can be initialised +# before importing anything else. +import iris_grib.tests as tests + +from copy import deepcopy +import mock +import numpy as np +import warnings + +from iris.coords import AuxCoord +from iris_grib.tests.unit.load_convert import empty_metadata + +from iris_grib._load_convert import satellite_common + + +class Test(tests.IrisGribTest): + def _check(self, factors=1, values=111): + # Prepare the arguments. + series = mock.sentinel.satelliteSeries + number = mock.sentinel.satelliteNumber + instrument = mock.sentinel.instrumentType + section = {'NB': 1, + 'satelliteSeries': series, + 'satelliteNumber': number, + 'instrumentType': instrument, + 'scaleFactorOfCentralWaveNumber': factors, + 'scaledValueOfCentralWaveNumber': values} + + # Call the function. + metadata = empty_metadata() + satellite_common(section, metadata) + + # Check the result. + expected = empty_metadata() + coord = AuxCoord(series, long_name='satellite_series') + expected['aux_coords_and_dims'].append((coord, None)) + coord = AuxCoord(number, long_name='satellite_number') + expected['aux_coords_and_dims'].append((coord, None)) + coord = AuxCoord(instrument, long_name='instrument_type') + expected['aux_coords_and_dims'].append((coord, None)) + standard_name = 'sensor_band_central_radiation_wavenumber' + coord = AuxCoord(values / (10.0 ** factors), + standard_name=standard_name, + units='m-1') + expected['aux_coords_and_dims'].append((coord, None)) + self.assertEqual(metadata, expected) + + def test_basic(self): + self._check() + + def test_multiple_wavelengths(self): + # Check with multiple values, and several different scaling factors. + values = np.array([1, 11, 123, 1975]) + for i_factor in (-3, -1, 0, 1, 3): + factors = np.ones(values.shape) * i_factor + self._check(values=values, factors=factors) + + +if __name__ == '__main__': + tests.main() From ea27e36a9174105f164df06a17731e1a94cfdd75 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Wed, 5 Apr 2017 14:56:37 +0100 Subject: [PATCH 019/583] Version to 1.10.1 for release. (#79) --- iris_grib/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index dec7c68f..b9dda224 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -47,7 +47,7 @@ from .message import GribMessage -__version__ = '0.10.0-dev' +__version__ = '0.10.1' __all__ = ['load_cubes', 'save_grib2', 'load_pairs_from_fields', 'save_pairs_from_cube', 'save_messages'] From c153e9c99f46a20633e51e6fb9e0495f987e0bde Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Wed, 5 Apr 2017 15:12:51 +0100 Subject: [PATCH 020/583] Bump version string from release (0.10.1) to dev (0.11.x). --- iris_grib/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index b9dda224..e77ac286 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -47,7 +47,7 @@ from .message import GribMessage -__version__ = '0.10.1' +__version__ = '0.11.x' __all__ = ['load_cubes', 'save_grib2', 'load_pairs_from_fields', 'save_pairs_from_cube', 'save_messages'] From 611355c0a6387b976745fbc71a9c07b615869ee9 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Wed, 5 Apr 2017 15:46:22 +0100 Subject: [PATCH 021/583] Amended version string to form 'major.minor+1.0-DEV'. --- iris_grib/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index e77ac286..e9dc1654 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -47,7 +47,7 @@ from .message import GribMessage -__version__ = '0.11.x' +__version__ = '0.11.0-DEV' __all__ = ['load_cubes', 'save_grib2', 'load_pairs_from_fields', 'save_pairs_from_cube', 'save_messages'] From 3c0c286aa4414fa3d3e7d6dccb604ea1cc777d31 Mon Sep 17 00:00:00 2001 From: Phil Elson Date: Tue, 17 Oct 2017 15:16:06 +0100 Subject: [PATCH 022/583] Port the changes from iris.fileformats.grib back into iris_grib. (#82) --- .travis.yml | 3 - environment.yml | 2 +- iris_grib/__init__.py | 37 +++-- iris_grib/_load_convert.py | 19 ++- iris_grib/_save_rules.py | 16 +-- iris_grib/message.py | 42 ++++-- .../load_cubes/load_cubes/reduced_raw.cml | 2 +- .../grib1_load_rules/test_grib1_convert.py | 6 +- .../tests/unit/load_convert/test_ellipsoid.py | 4 +- .../tests/unit/message/test_GribMessage.py | 51 +++++-- .../unit/save_rules/test_data_section.py | 18 +-- iris_grib/tests/unit/test_GribWrapper.py | 128 +++++++----------- setup.py | 2 +- 13 files changed, 175 insertions(+), 155 deletions(-) diff --git a/.travis.yml b/.travis.yml index 357c6e33..91cae33b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,9 +1,6 @@ language: python sudo: false env: - - python=2.7 - iris=v1.10.0 - - python=2.7 iris=master diff --git a/environment.yml b/environment.yml index 5d540bc9..2ca4cf11 100644 --- a/environment.yml +++ b/environment.yml @@ -1,5 +1,5 @@ channels: - scitools dependencies: - - iris=1.* + - iris=2.* - ecmwf_grib=1.14 diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index e9dc1654..91213255 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -29,7 +29,6 @@ import math # for fmod import warnings -import biggus import cartopy.crs as ccrs import cf_units import gribapi @@ -37,6 +36,7 @@ import numpy.ma as ma import iris +from iris._lazy_data import as_lazy_data, convert_nans_array import iris.coord_systems as coord_systems from iris.exceptions import TranslationError, NotYetImplementedError @@ -99,12 +99,11 @@ class GribDataProxy(object): """A reference to the data payload of a single Grib message.""" - __slots__ = ('shape', 'dtype', 'fill_value', 'path', 'offset') + __slots__ = ('shape', 'dtype', 'path', 'offset') - def __init__(self, shape, dtype, fill_value, path, offset): + def __init__(self, shape, dtype, path, offset): self.shape = shape self.dtype = dtype - self.fill_value = fill_value self.path = path self.offset = offset @@ -123,7 +122,7 @@ def __getitem__(self, keys): def __repr__(self): msg = '<{self.__class__.__name__} shape={self.shape} ' \ - 'dtype={self.dtype!r} fill_value={self.fill_value!r} ' \ + 'dtype={self.dtype!r} ' \ 'path={self.path!r} offset={self.offset}>' return msg.format(self=self) @@ -146,6 +145,7 @@ class GribWrapper(object): def __init__(self, grib_message, grib_fh=None): """Store the grib message and compute our extra keys.""" self.grib_message = grib_message + self.realised_dtype = np.array([0.]).dtype if self.edition != 1: emsg = 'GRIB edition {} is not supported by {!r}.' @@ -184,12 +184,14 @@ def __init__(self, grib_message, grib_fh=None): # The byte offset requires to be reset back to the first byte # of this message. The file pointer offset is always at the end # of the current message due to the grib-api reading the message. - proxy = GribDataProxy(shape, np.zeros(0).dtype, np.nan, - grib_fh.name, + proxy = GribDataProxy(shape, self.realised_dtype, grib_fh.name, offset - message_length) - self._data = biggus.NumpyArrayAdapter(proxy) + self._data = as_lazy_data(proxy) else: - self.data = _message_values(grib_message, shape) + values_array = _message_values(grib_message, shape) + # mask where the values are nan + self.data = convert_nans_array(values_array, + nans_replacement=ma.masked) def _confirm_in_scope(self): """Ensure we have a grib flavour that we choose to support.""" @@ -640,6 +642,19 @@ def _get_verification_date(self): # Return validity_time = (reference_time + start_offset*time_unit). return reference_date_time + interval_delta + @property + def bmdi(self): + # Not sure of any cases where GRIB provides a fill value. + # Default for fill value is None. + return None + + def core_data(self): + try: + data = self._data + except AttributeError: + data = self.data + return data + def phenomenon_points(self, time_unit): """ Return the phenomenon time point offset from the epoch time reference @@ -683,10 +698,6 @@ def _message_values(grib_message, shape): data = gribapi.grib_get_double_array(grib_message, 'values') data = data.reshape(shape) - # Handle missing values in a sensible way. - mask = np.isnan(data) - if mask.any(): - data = ma.array(data, mask=mask, fill_value=np.nan) return data diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index b85dbd36..9ae9abd5 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -414,7 +414,7 @@ def ellipsoid(shapeOfTheEarth, major, minor, radius): """ # Supported shapeOfTheEarth values. - if shapeOfTheEarth not in (0, 1, 3, 6, 7): + if shapeOfTheEarth not in (0, 1, 2, 3, 4, 5, 6, 7): msg = 'Grid definition section 3 contains an unsupported ' \ 'shape of the earth [{}]'.format(shapeOfTheEarth) raise TranslationError(msg) @@ -425,25 +425,36 @@ def ellipsoid(shapeOfTheEarth, major, minor, radius): elif shapeOfTheEarth == 1: # Earth assumed spherical with radius specified (in m) by # data producer. - if radius is ma.masked: + if ma.is_masked(radius): msg = 'Ellipsoid for shape of the earth {} requires a' \ 'radius to be specified.'.format(shapeOfTheEarth) raise ValueError(msg) result = icoord_systems.GeogCS(radius) + elif shapeOfTheEarth == 2: + # Earth assumed oblate spheroid with size as determined by IAU in 1965. + result = icoord_systems.GeogCS(6378160, inverse_flattening=297.0) elif shapeOfTheEarth in [3, 7]: # Earth assumed oblate spheroid with major and minor axes # specified (in km)/(in m) by data producer. emsg_oblate = 'Ellipsoid for shape of the earth [{}] requires a' \ 'semi-{} axis to be specified.' - if major is ma.masked: + if ma.is_masked(major): raise ValueError(emsg_oblate.format(shapeOfTheEarth, 'major')) - if minor is ma.masked: + if ma.is_masked(minor): raise ValueError(emsg_oblate.format(shapeOfTheEarth, 'minor')) # Check whether to convert from km to m. if shapeOfTheEarth == 3: major *= 1000 minor *= 1000 result = icoord_systems.GeogCS(major, minor) + elif shapeOfTheEarth == 4: + # Earth assumed oblate spheroid as defined in IAG-GRS80 model. + result = icoord_systems.GeogCS(6378137, + inverse_flattening=298.257222101) + elif shapeOfTheEarth == 5: + # Earth assumed represented by WGS84 (as used by ICAO since 1998). + result = icoord_systems.GeogCS(6378137, + inverse_flattening=298.257223563) elif shapeOfTheEarth == 6: # Earth assumed spherical with radius of 6 371 229.0m result = icoord_systems.GeogCS(6371229) diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index 87274d7a..cd29b764 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -1156,22 +1156,18 @@ def product_definition_section(cube, grib): def data_section(cube, grib): # Masked data? - if isinstance(cube.data, ma.core.MaskedArray): - # What missing value shall we use? - if not np.isnan(cube.data.fill_value): - # Use the data's fill value. - fill_value = float(cube.data.fill_value) - else: - # We can't use the data's fill value if it's NaN, + if ma.isMaskedArray(cube.data): + fill_value = cube.fill_value + if fill_value is None or np.isnan(cube.fill_value): + # We can't use the cube's fill value if it's NaN, # the GRIB API doesn't like it. # Calculate an MDI outside the data range. min, max = cube.data.min(), cube.data.max() fill_value = min - (max - min) * 0.1 - # Prepare the unmaksed data array, using fill_value as the MDI. - data = cube.data.filled(fill_value) else: fill_value = None - data = cube.data + + data = cube.data # units scaling grib2_info = gptx.cf_phenom_to_grib2_info(cube.standard_name, diff --git a/iris_grib/message.py b/iris_grib/message.py index f2863fb1..a84a0d40 100644 --- a/iris_grib/message.py +++ b/iris_grib/message.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# (C) British Crown Copyright 2014 - 2017, Met Office # # This file is part of iris-grib. # @@ -26,10 +26,11 @@ from collections import namedtuple import re -import biggus import gribapi import numpy as np +import numpy.ma as ma +from iris._lazy_data import array_masked_to_nans, as_lazy_data from iris.exceptions import TranslationError @@ -88,7 +89,7 @@ def __init__(self, raw_message, recreate_raw, file_ref=None): """ # A RawGribMessage giving gribapi access to the original grib message. self._raw_message = raw_message - # A _MessageLocation which biggus uses to read the message data array, + # A _MessageLocation which dask uses to read the message data array, # by which time this message may be dead and the original grib file # closed. self._recreate_raw = recreate_raw @@ -113,10 +114,23 @@ def sections(self): """ return self._raw_message.sections + @property + def bmdi(self): + # Not sure of any cases where GRIB provides a fill value. + # Default for fill value is None. + return None + + @property + def realised_dtype(self): + return np.dtype('f8') + + def core_data(self): + return self.data + @property def data(self): """ - The data array from the GRIB message as a biggus Array. + The data array from the GRIB message as a dask Array. The shape of the array will match the logical shape of the message's grid. For example, a simple global grid would be @@ -150,9 +164,9 @@ def data(self): shape = (grid_section['numberOfDataPoints'],) else: shape = (grid_section['Nj'], grid_section['Ni']) - proxy = _DataProxy(shape, np.dtype('f8'), np.nan, + proxy = _DataProxy(shape, self.realised_dtype, np.nan, self._recreate_raw) - data = biggus.NumpyArrayAdapter(proxy) + data = as_lazy_data(proxy) else: fmt = 'Grid definition template {} is not supported' raise TranslationError(fmt.format(template)) @@ -180,12 +194,13 @@ def __call__(self): class _DataProxy(object): """A reference to the data payload of a single GRIB message.""" - __slots__ = ('shape', 'dtype', 'fill_value', 'recreate_raw') + __slots__ = ('shape', 'dtype', 'recreate_raw') def __init__(self, shape, dtype, fill_value, recreate_raw): + # TODO: I (@pelson) have no idea why fill_value remains an argument as + # it isn't used. It was copied verbatim from iris' dask branch. self.shape = shape self.dtype = dtype - self.fill_value = fill_value self.recreate_raw = recreate_raw @property @@ -245,20 +260,21 @@ def __getitem__(self, keys): # Only the non-masked values are included in codedValues. _data = np.empty(shape=bitmap.shape) _data[bitmap.astype(bool)] = data - # `np.ma.masked_array` masks where input = 1, the opposite of - # the behaviour specified by the GRIB spec. - data = np.ma.masked_array(_data, mask=np.logical_not(bitmap)) + # Use nan where input = 1, the opposite of the behaviour + # specified by the GRIB spec. + _data[np.logical_not(bitmap.astype(bool))] = np.nan + data = _data else: msg = 'Shapes of data and bitmap do not match.' raise TranslationError(msg) data = data.reshape(self.shape) + return data.__getitem__(keys) def __repr__(self): msg = '<{self.__class__.__name__} shape={self.shape} ' \ - 'dtype={self.dtype!r} fill_value={self.fill_value!r} ' \ - 'recreate_raw={self.recreate_raw!r} ' + 'dtype={self.dtype!r} recreate_raw={self.recreate_raw!r} ' return msg.format(self=self) def __getstate__(self): diff --git a/iris_grib/tests/results/unit/load_cubes/load_cubes/reduced_raw.cml b/iris_grib/tests/results/unit/load_cubes/load_cubes/reduced_raw.cml index 1c3ea906..0252a129 100644 --- a/iris_grib/tests/results/unit/load_cubes/load_cubes/reduced_raw.cml +++ b/iris_grib/tests/results/unit/load_cubes/load_cubes/reduced_raw.cml @@ -1,6 +1,6 @@ - + diff --git a/iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py b/iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py index 0dde03ed..9224b176 100644 --- a/iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py +++ b/iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2013 - 2016, Met Office +# (C) British Crown Copyright 2013 - 2017, Met Office # # This file is part of iris-grib. # @@ -61,7 +61,9 @@ def assert_bounded_message(self, **kwargs): '_forecastTimeUnit': 'hours', 'phenomenon_bounds': lambda u: (80, 120), '_phenomenonDateTime': -1, - 'table2Version': 9999} + 'table2Version': 9999, + '_originatingCentre': 'xxx', + } attributes.update(kwargs) message = mock.Mock(**attributes) self._test_for_coord(message, grib1_convert, self.is_forecast_period, diff --git a/iris_grib/tests/unit/load_convert/test_ellipsoid.py b/iris_grib/tests/unit/load_convert/test_ellipsoid.py index c0401bbd..ed1d0eba 100644 --- a/iris_grib/tests/unit/load_convert/test_ellipsoid.py +++ b/iris_grib/tests/unit/load_convert/test_ellipsoid.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# (C) British Crown Copyright 2014 - 2017, Met Office # # This file is part of iris-grib. # @@ -42,7 +42,7 @@ class Test(tests.IrisGribTest): def test_shape_unsupported(self): - unsupported = [2, 4, 5, 8, 9, 10, MDI] + unsupported = [8, 9, 10, MDI] emsg = 'unsupported shape of the earth' for shape in unsupported: with self.assertRaisesRegexp(TranslationError, emsg): diff --git a/iris_grib/tests/unit/message/test_GribMessage.py b/iris_grib/tests/unit/message/test_GribMessage.py index ec6959dd..a98a06ad 100644 --- a/iris_grib/tests/unit/message/test_GribMessage.py +++ b/iris_grib/tests/unit/message/test_GribMessage.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# (C) British Crown Copyright 2014 - 2017, Met Office # # This file is part of iris-grib. # @@ -29,10 +29,11 @@ from abc import ABCMeta, abstractmethod -import biggus import mock import numpy as np +import numpy.ma as ma +from iris._lazy_data import as_concrete_data, is_lazy_data from iris.exceptions import TranslationError from iris_grib.message import GribMessage @@ -86,23 +87,45 @@ def test_no_bitmap(self): message = _make_test_message({3: self._section_3, 6: SECTION_6_NO_BITMAP, 7: {'codedValues': values}}) - result = message.data.ndarray() + result = as_concrete_data(message.data) expected = values.reshape(self.shape) self.assertEqual(result.shape, self.shape) self.assertArrayEqual(result, expected) - def test_bitmap_present(self): + def test_bitmap_present_int_data(self): # Test the behaviour where bitmap and codedValues shapes - # are not equal. + # are not equal, and codedValues is integer data. + data_type = np.int64 input_values = np.arange(5) - output_values = np.array([-1, -1, 0, 1, -1, -1, -1, 2, -1, 3, -1, 4]) + output_values = np.array([-1, -1, 0, 1, -1, -1, -1, 2, -1, 3, -1, 4], + dtype=data_type) message = _make_test_message({3: self._section_3, 6: {'bitMapIndicator': 0, 'bitmap': self.bitmap}, 7: {'codedValues': input_values}}) - result = message.data.masked_array() - expected = np.ma.masked_array(output_values, - np.logical_not(self.bitmap)) + result = as_concrete_data(message.data, nans_replacement=ma.masked, + result_dtype=data_type) + expected = ma.masked_array(output_values, + np.logical_not(self.bitmap)) + expected = expected.reshape(self.shape) + self.assertMaskedArrayEqual(result, expected) + self.assertEqual(result.dtype, data_type) + + def test_bitmap_present_float_data(self): + # Test the behaviour where bitmap and codedValues shapes + # are not equal, and codedValues is float data. + data_type = np.float32 + input_values = np.arange(5, dtype=np.float32) + 5 + output_values = np.array([-1, -1, 5, 6, -1, -1, -1, 7, -1, 8, -1, 9], + dtype=data_type) + message = _make_test_message({3: self._section_3, + 6: {'bitMapIndicator': 0, + 'bitmap': self.bitmap}, + 7: {'codedValues': input_values}}) + result = as_concrete_data(message.data, nans_replacement=ma.masked, + result_dtype=data_type) + expected = ma.masked_array(output_values, + np.logical_not(self.bitmap)) expected = expected.reshape(self.shape) self.assertMaskedArrayEqual(result, expected) @@ -115,7 +138,7 @@ def test_bitmap__shapes_mismatch(self): 'bitmap': self.bitmap}, 7: {'codedValues': values}}) with self.assertRaisesRegexp(TranslationError, 'do not match'): - message.data.masked_array() + as_concrete_data(message.data) def test_bitmap__invalid_indicator(self): values = np.arange(12) @@ -124,7 +147,7 @@ def test_bitmap__invalid_indicator(self): 'bitmap': None}, 7: {'codedValues': values}}) with self.assertRaisesRegexp(TranslationError, 'unsupported bitmap'): - message.data.ndarray() + as_concrete_data(message.data) class Test_data__unsupported(tests.IrisGribTest): @@ -183,11 +206,11 @@ def _test(self, scanning_mode): 6: SECTION_6_NO_BITMAP, 7: {'codedValues': np.arange(12)}}) data = message.data - self.assertIsInstance(data, biggus.Array) + self.assertTrue(is_lazy_data(data)) self.assertEqual(data.shape, (3, 4)) self.assertEqual(data.dtype, np.floating) - self.assertIs(data.fill_value, np.nan) - self.assertArrayEqual(data.ndarray(), np.arange(12).reshape(3, 4)) + self.assertArrayEqual(as_concrete_data(data), + np.arange(12).reshape(3, 4)) def test_regular_mode_0(self): self._test(0) diff --git a/iris_grib/tests/unit/save_rules/test_data_section.py b/iris_grib/tests/unit/save_rules/test_data_section.py index d038c39c..57ddbbe1 100644 --- a/iris_grib/tests/unit/save_rules/test_data_section.py +++ b/iris_grib/tests/unit/save_rules/test_data_section.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# (C) British Crown Copyright 2014 - 2017, Met Office # # This file is part of iris-grib. # @@ -94,8 +94,8 @@ def test_simple(self): def test_masked_with_finite_fill_value(self): cube = iris.cube.Cube(np.ma.MaskedArray([1.0, 2.0, 3.0, 1.0, 2.0, 3.0], - mask=[0, 0, 0, 1, 1, 1], - fill_value=2000)) + mask=[0, 0, 0, 1, 1, 1]), + fill_value=2000) grib_message = mock.sentinel.GRIB_MESSAGE with mock.patch(GRIB_API) as grib_api: data_section(cube, grib_message) @@ -107,8 +107,8 @@ def test_masked_with_finite_fill_value(self): def test_masked_with_nan_fill_value(self): cube = iris.cube.Cube(np.ma.MaskedArray([1.0, 2.0, 3.0, 1.0, 2.0, 3.0], - mask=[0, 0, 0, 1, 1, 1], - fill_value=np.nan)) + mask=[0, 0, 0, 1, 1, 1]), + fill_value=np.nan) grib_message = mock.sentinel.GRIB_MESSAGE with mock.patch(GRIB_API) as grib_api: data_section(cube, grib_message) @@ -135,8 +135,8 @@ def test_scaled_with_finite_fill_value(self): # When re-scaling masked data with a finite fill value, ensure # the fill value and any filled values are also re-scaled. cube = iris.cube.Cube(np.ma.MaskedArray([1.0, 2.0, 3.0, 1.0, 2.0, 3.0], - mask=[0, 0, 0, 1, 1, 1], - fill_value=2000), + mask=[0, 0, 0, 1, 1, 1]), + fill_value=2000, standard_name='geopotential_height', units='km') grib_message = mock.sentinel.GRIB_MESSAGE with mock.patch(GRIB_API) as grib_api: @@ -152,8 +152,8 @@ def test_scaled_with_nan_fill_value(self): # a fill value is chosen which allows for the scaling, and any # filled values match the chosen fill value. cube = iris.cube.Cube(np.ma.MaskedArray([-1.0, 2.0, -1.0, 2.0], - mask=[0, 0, 1, 1], - fill_value=np.nan), + mask=[0, 0, 1, 1]), + fill_value=np.nan, standard_name='geopotential_height', units='km') grib_message = mock.sentinel.GRIB_MESSAGE with mock.patch(GRIB_API) as grib_api: diff --git a/iris_grib/tests/unit/test_GribWrapper.py b/iris_grib/tests/unit/test_GribWrapper.py index d8963327..7c0546a3 100644 --- a/iris_grib/tests/unit/test_GribWrapper.py +++ b/iris_grib/tests/unit/test_GribWrapper.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# (C) British Crown Copyright 2014 - 2017, Met Office # # This file is part of iris-grib. # @@ -26,13 +26,13 @@ # importing anything else. import iris_grib.tests as tests -from biggus import NumpyArrayAdapter import mock import numpy as np +from iris._lazy_data import as_concrete_data, is_lazy_data from iris.exceptions import TranslationError -from iris_grib import GribWrapper, GribDataProxy +from iris_grib import GribWrapper, GribDataProxy, _load_generate _message_length = 1000 @@ -89,89 +89,53 @@ def test_edition_1(self): self.assertEqual(wrapper.grib_message, grib_message) -class Test_deferred(tests.IrisGribTest): +@tests.skip_data +class Test_deferred_data(tests.IrisTest): + def test_regular_data(self): + filename = tests.get_data_path(('GRIB', 'gaussian', + 'regular_gg.grib1')) + messages = list(_load_generate(filename)) + self.assertTrue(is_lazy_data(messages[0]._data)) + + def test_reduced_data(self): + filename = tests.get_data_path(('GRIB', 'reduced', + 'reduced_ll.grib1')) + messages = list(_load_generate(filename)) + self.assertTrue(is_lazy_data(messages[0]._data)) + + +class Test_deferred_proxy_args(tests.IrisTest): def setUp(self): - confirm_patch = mock.patch( - 'iris_grib.GribWrapper._confirm_in_scope') - compute_patch = mock.patch( - 'iris_grib.GribWrapper._compute_extra_keys') - long_patch = mock.patch('gribapi.grib_get_long', _mock_grib_get_long) - string_patch = mock.patch('gribapi.grib_get_string', - _mock_grib_get_string) - native_patch = mock.patch('gribapi.grib_get_native_type', - _mock_grib_get_native_type) - confirm_patch.start() - compute_patch.start() - long_patch.start() - string_patch.start() - native_patch.start() - self.addCleanup(confirm_patch.stop) - self.addCleanup(compute_patch.stop) - self.addCleanup(long_patch.stop) - self.addCleanup(string_patch.stop) - self.addCleanup(native_patch.stop) - - def test_regular_sequential(self): - tell_tale = np.arange(1, 5) * _message_length - grib_fh = mock.Mock(tell=mock.Mock(side_effect=tell_tale)) - grib_message = 'regular_ll' - for i, _ in enumerate(tell_tale): - gw = GribWrapper(grib_message, grib_fh) - self.assertIsInstance(gw._data, NumpyArrayAdapter) - proxy = gw._data.concrete - self.assertIsInstance(proxy, GribDataProxy) - self.assertEqual(proxy.shape, (10, 20)) - self.assertEqual(proxy.dtype, np.float) - self.assertIs(proxy.fill_value, np.nan) - self.assertEqual(proxy.path, grib_fh.name) - self.assertEqual(proxy.offset, _message_length * i) - - def test_regular_mixed(self): + self.patch('iris_grib.GribWrapper._confirm_in_scope') + self.patch('iris_grib.GribWrapper._compute_extra_keys') + self.patch('gribapi.grib_get_long', _mock_grib_get_long) + self.patch('gribapi.grib_get_string', _mock_grib_get_string) + self.patch('gribapi.grib_get_native_type', _mock_grib_get_native_type) tell_tale = np.arange(1, 5) * _message_length - expected = tell_tale - _message_length - grib_fh = mock.Mock(tell=mock.Mock(side_effect=tell_tale)) + self.expected = tell_tale - _message_length + self.grib_fh = mock.Mock(tell=mock.Mock(side_effect=tell_tale)) + self.dtype = np.float64 + self.path = self.grib_fh.name + self.lookup = _mock_grib_get_long + + def test_regular_proxy_args(self): grib_message = 'regular_ll' - for offset in expected: - gw = GribWrapper(grib_message, grib_fh) - self.assertIsInstance(gw._data, NumpyArrayAdapter) - proxy = gw._data.concrete - self.assertIsInstance(proxy, GribDataProxy) - self.assertEqual(proxy.shape, (10, 20)) - self.assertEqual(proxy.dtype, np.float) - self.assertIs(proxy.fill_value, np.nan) - self.assertEqual(proxy.path, grib_fh.name) - self.assertEqual(proxy.offset, offset) - - def test_reduced_sequential(self): - tell_tale = np.arange(1, 5) * _message_length - grib_fh = mock.Mock(tell=mock.Mock(side_effect=tell_tale)) - grib_message = 'reduced_gg' - for i, _ in enumerate(tell_tale): - gw = GribWrapper(grib_message, grib_fh) - self.assertIsInstance(gw._data, NumpyArrayAdapter) - proxy = gw._data.concrete - self.assertIsInstance(proxy, GribDataProxy) - self.assertEqual(proxy.shape, (200,)) - self.assertEqual(proxy.dtype, np.float) - self.assertIs(proxy.fill_value, np.nan) - self.assertEqual(proxy.path, grib_fh.name) - self.assertEqual(proxy.offset, _message_length * i) - - def test_reduced_mixed(self): - tell_tale = np.arange(1, 5) * _message_length - expected = tell_tale - _message_length - grib_fh = mock.Mock(tell=mock.Mock(side_effect=tell_tale)) + shape = (self.lookup(grib_message, 'Nj'), + self.lookup(grib_message, 'Ni')) + for offset in self.expected: + with mock.patch('iris_grib.GribDataProxy') as mock_gdp: + gw = GribWrapper(grib_message, self.grib_fh) + mock_gdp.assert_called_once_with(shape, self.dtype, + self.path, offset) + + def test_reduced_proxy_args(self): grib_message = 'reduced_gg' - for offset in expected: - gw = GribWrapper(grib_message, grib_fh) - self.assertIsInstance(gw._data, NumpyArrayAdapter) - proxy = gw._data.concrete - self.assertIsInstance(proxy, GribDataProxy) - self.assertEqual(proxy.shape, (200,)) - self.assertEqual(proxy.dtype, np.float) - self.assertIs(proxy.fill_value, np.nan) - self.assertEqual(proxy.path, grib_fh.name) - self.assertEqual(proxy.offset, offset) + shape = (self.lookup(grib_message, 'numberOfValues')) + for offset in self.expected: + with mock.patch('iris_grib.GribDataProxy') as mock_gdp: + gw = GribWrapper(grib_message, self.grib_fh) + mock_gdp.assert_called_once_with((shape,), self.dtype, + self.path, offset) if __name__ == '__main__': diff --git a/setup.py b/setup.py index 1b7afa55..2b77be7d 100644 --- a/setup.py +++ b/setup.py @@ -80,7 +80,7 @@ def file_walk_relative(top, remove=''): 'Programming Language :: Python :: 3.5', ], install_requires = [ - 'iris>=1.9,<2', + # 'iris>=1.9,<2', # Also: the ECMWF GRIB API ], extras_require = { From e94b852a13657c56dc071d9f52fe422c91a2be0d Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Tue, 17 Oct 2017 16:11:36 +0100 Subject: [PATCH 023/583] Fix for backwards-incompatible change in iris.fileformats.rules.Loader --- iris_grib/tests/unit/test_load_cubes.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iris_grib/tests/unit/test_load_cubes.py b/iris_grib/tests/unit/test_load_cubes.py index d2e426d6..36c8599c 100644 --- a/iris_grib/tests/unit/test_load_cubes.py +++ b/iris_grib/tests/unit/test_load_cubes.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# (C) British Crown Copyright 2014 - 2017, Met Office # # This file is part of iris-grib. # @@ -41,7 +41,7 @@ def test(self): rules_load.return_value = expected_result result = load_cubes(files, callback) kwargs = {} - loader = Loader(generator, kwargs, converter, None) + loader = Loader(generator, kwargs, converter) rules_load.assert_called_once_with(files, callback, loader) self.assertIs(result, expected_result) From 49cd0bdefff95bcf1758657f31515c8d3e49ae3f Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Tue, 24 Oct 2017 15:36:36 +0100 Subject: [PATCH 024/583] Changes for dask masked-array support, mirroring Iris #2824. --- iris_grib/__init__.py | 14 ++++----- iris_grib/_save_rules.py | 11 ++++--- iris_grib/message.py | 21 +++++-------- .../load_cubes/load_cubes/reduced_raw.cml | 2 +- .../tests/unit/message/test_GribMessage.py | 30 +++---------------- .../tests/unit/message/test__DataProxy.py | 8 ++--- .../unit/save_rules/test_data_section.py | 16 +++++----- 7 files changed, 38 insertions(+), 64 deletions(-) diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index 91213255..2ba56ca7 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -36,7 +36,7 @@ import numpy.ma as ma import iris -from iris._lazy_data import as_lazy_data, convert_nans_array +from iris._lazy_data import as_lazy_data import iris.coord_systems as coord_systems from iris.exceptions import TranslationError, NotYetImplementedError @@ -145,7 +145,6 @@ class GribWrapper(object): def __init__(self, grib_message, grib_fh=None): """Store the grib message and compute our extra keys.""" self.grib_message = grib_message - self.realised_dtype = np.array([0.]).dtype if self.edition != 1: emsg = 'GRIB edition {} is not supported by {!r}.' @@ -184,14 +183,11 @@ def __init__(self, grib_message, grib_fh=None): # The byte offset requires to be reset back to the first byte # of this message. The file pointer offset is always at the end # of the current message due to the grib-api reading the message. - proxy = GribDataProxy(shape, self.realised_dtype, grib_fh.name, + proxy = GribDataProxy(shape, np.array([0.]).dtype, grib_fh.name, offset - message_length) self._data = as_lazy_data(proxy) else: - values_array = _message_values(grib_message, shape) - # mask where the values are nan - self.data = convert_nans_array(values_array, - nans_replacement=ma.masked) + self.data = _message_values(grib_message, shape) def _confirm_in_scope(self): """Ensure we have a grib flavour that we choose to support.""" @@ -698,6 +694,10 @@ def _message_values(grib_message, shape): data = gribapi.grib_get_double_array(grib_message, 'values') data = data.reshape(shape) + # Handle missing values in a sensible way. + mask = np.isnan(data) + if mask.any(): + data = ma.array(data, mask=mask, fill_value=np.nan) return data diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index cd29b764..4392c8ce 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -1157,17 +1157,20 @@ def product_definition_section(cube, grib): def data_section(cube, grib): # Masked data? if ma.isMaskedArray(cube.data): - fill_value = cube.fill_value - if fill_value is None or np.isnan(cube.fill_value): + if not np.isnan(cube.data.fill_value): + # Use the data's fill value. + fill_value = float(cube.data.fill_value) + else: # We can't use the cube's fill value if it's NaN, # the GRIB API doesn't like it. # Calculate an MDI outside the data range. min, max = cube.data.min(), cube.data.max() fill_value = min - (max - min) * 0.1 + # Prepare the unmasked data array, using fill_value as the MDI. + data = cube.data.filled(fill_value) else: fill_value = None - - data = cube.data + data = cube.data # units scaling grib2_info = gptx.cf_phenom_to_grib2_info(cube.standard_name, diff --git a/iris_grib/message.py b/iris_grib/message.py index a84a0d40..e0b15993 100644 --- a/iris_grib/message.py +++ b/iris_grib/message.py @@ -30,7 +30,7 @@ import numpy as np import numpy.ma as ma -from iris._lazy_data import array_masked_to_nans, as_lazy_data +from iris._lazy_data import as_lazy_data from iris.exceptions import TranslationError @@ -120,10 +120,6 @@ def bmdi(self): # Default for fill value is None. return None - @property - def realised_dtype(self): - return np.dtype('f8') - def core_data(self): return self.data @@ -164,8 +160,7 @@ def data(self): shape = (grid_section['numberOfDataPoints'],) else: shape = (grid_section['Nj'], grid_section['Ni']) - proxy = _DataProxy(shape, self.realised_dtype, np.nan, - self._recreate_raw) + proxy = _DataProxy(shape, np.dtype('f8'), self._recreate_raw) data = as_lazy_data(proxy) else: fmt = 'Grid definition template {} is not supported' @@ -196,9 +191,7 @@ class _DataProxy(object): __slots__ = ('shape', 'dtype', 'recreate_raw') - def __init__(self, shape, dtype, fill_value, recreate_raw): - # TODO: I (@pelson) have no idea why fill_value remains an argument as - # it isn't used. It was copied verbatim from iris' dask branch. + def __init__(self, shape, dtype, recreate_raw): self.shape = shape self.dtype = dtype self.recreate_raw = recreate_raw @@ -260,10 +253,10 @@ def __getitem__(self, keys): # Only the non-masked values are included in codedValues. _data = np.empty(shape=bitmap.shape) _data[bitmap.astype(bool)] = data - # Use nan where input = 1, the opposite of the behaviour - # specified by the GRIB spec. - _data[np.logical_not(bitmap.astype(bool))] = np.nan - data = _data + # `ma.masked_array` masks where input = 1, the opposite of + # the behaviour specified by the GRIB spec. + data = ma.masked_array(_data, mask=np.logical_not(bitmap), + fill_value=np.nan) else: msg = 'Shapes of data and bitmap do not match.' raise TranslationError(msg) diff --git a/iris_grib/tests/results/unit/load_cubes/load_cubes/reduced_raw.cml b/iris_grib/tests/results/unit/load_cubes/load_cubes/reduced_raw.cml index 0252a129..b4f27991 100644 --- a/iris_grib/tests/results/unit/load_cubes/load_cubes/reduced_raw.cml +++ b/iris_grib/tests/results/unit/load_cubes/load_cubes/reduced_raw.cml @@ -1,6 +1,6 @@ - + diff --git a/iris_grib/tests/unit/message/test_GribMessage.py b/iris_grib/tests/unit/message/test_GribMessage.py index a98a06ad..bf9669fa 100644 --- a/iris_grib/tests/unit/message/test_GribMessage.py +++ b/iris_grib/tests/unit/message/test_GribMessage.py @@ -92,38 +92,16 @@ def test_no_bitmap(self): self.assertEqual(result.shape, self.shape) self.assertArrayEqual(result, expected) - def test_bitmap_present_int_data(self): + def test_bitmap_present(self): # Test the behaviour where bitmap and codedValues shapes - # are not equal, and codedValues is integer data. - data_type = np.int64 + # are not equal. input_values = np.arange(5) - output_values = np.array([-1, -1, 0, 1, -1, -1, -1, 2, -1, 3, -1, 4], - dtype=data_type) + output_values = np.array([-1, -1, 0, 1, -1, -1, -1, 2, -1, 3, -1, 4]) message = _make_test_message({3: self._section_3, 6: {'bitMapIndicator': 0, 'bitmap': self.bitmap}, 7: {'codedValues': input_values}}) - result = as_concrete_data(message.data, nans_replacement=ma.masked, - result_dtype=data_type) - expected = ma.masked_array(output_values, - np.logical_not(self.bitmap)) - expected = expected.reshape(self.shape) - self.assertMaskedArrayEqual(result, expected) - self.assertEqual(result.dtype, data_type) - - def test_bitmap_present_float_data(self): - # Test the behaviour where bitmap and codedValues shapes - # are not equal, and codedValues is float data. - data_type = np.float32 - input_values = np.arange(5, dtype=np.float32) + 5 - output_values = np.array([-1, -1, 5, 6, -1, -1, -1, 7, -1, 8, -1, 9], - dtype=data_type) - message = _make_test_message({3: self._section_3, - 6: {'bitMapIndicator': 0, - 'bitmap': self.bitmap}, - 7: {'codedValues': input_values}}) - result = as_concrete_data(message.data, nans_replacement=ma.masked, - result_dtype=data_type) + result = as_concrete_data(message.data) expected = ma.masked_array(output_values, np.logical_not(self.bitmap)) expected = expected.reshape(self.shape) diff --git a/iris_grib/tests/unit/message/test__DataProxy.py b/iris_grib/tests/unit/message/test__DataProxy.py index 95b61504..313c326b 100644 --- a/iris_grib/tests/unit/message/test__DataProxy.py +++ b/iris_grib/tests/unit/message/test__DataProxy.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# (C) British Crown Copyright 2014 - 2017, Met Office # # This file is part of iris-grib. # @@ -37,20 +37,20 @@ class Test__bitmap(tests.IrisGribTest): def test_no_bitmap(self): section_6 = {'bitMapIndicator': 255, 'bitmap': None} - data_proxy = _DataProxy(0, 0, 0, 0) + data_proxy = _DataProxy(0, 0, 0) result = data_proxy._bitmap(section_6) self.assertIsNone(result) def test_bitmap_present(self): bitmap = randint(2, size=(12)) section_6 = {'bitMapIndicator': 0, 'bitmap': bitmap} - data_proxy = _DataProxy(0, 0, 0, 0) + data_proxy = _DataProxy(0, 0, 0) result = data_proxy._bitmap(section_6) self.assertArrayEqual(bitmap, result) def test_bitmap__invalid_indicator(self): section_6 = {'bitMapIndicator': 100, 'bitmap': None} - data_proxy = _DataProxy(0, 0, 0, 0) + data_proxy = _DataProxy(0, 0, 0) with self.assertRaisesRegexp(TranslationError, 'unsupported bitmap'): data_proxy._bitmap(section_6) diff --git a/iris_grib/tests/unit/save_rules/test_data_section.py b/iris_grib/tests/unit/save_rules/test_data_section.py index 57ddbbe1..d37e727a 100644 --- a/iris_grib/tests/unit/save_rules/test_data_section.py +++ b/iris_grib/tests/unit/save_rules/test_data_section.py @@ -94,8 +94,8 @@ def test_simple(self): def test_masked_with_finite_fill_value(self): cube = iris.cube.Cube(np.ma.MaskedArray([1.0, 2.0, 3.0, 1.0, 2.0, 3.0], - mask=[0, 0, 0, 1, 1, 1]), - fill_value=2000) + mask=[0, 0, 0, 1, 1, 1], + fill_value=2000)) grib_message = mock.sentinel.GRIB_MESSAGE with mock.patch(GRIB_API) as grib_api: data_section(cube, grib_message) @@ -107,8 +107,8 @@ def test_masked_with_finite_fill_value(self): def test_masked_with_nan_fill_value(self): cube = iris.cube.Cube(np.ma.MaskedArray([1.0, 2.0, 3.0, 1.0, 2.0, 3.0], - mask=[0, 0, 0, 1, 1, 1]), - fill_value=np.nan) + mask=[0, 0, 0, 1, 1, 1], + fill_value=np.nan)) grib_message = mock.sentinel.GRIB_MESSAGE with mock.patch(GRIB_API) as grib_api: data_section(cube, grib_message) @@ -135,8 +135,8 @@ def test_scaled_with_finite_fill_value(self): # When re-scaling masked data with a finite fill value, ensure # the fill value and any filled values are also re-scaled. cube = iris.cube.Cube(np.ma.MaskedArray([1.0, 2.0, 3.0, 1.0, 2.0, 3.0], - mask=[0, 0, 0, 1, 1, 1]), - fill_value=2000, + mask=[0, 0, 0, 1, 1, 1], + fill_value=2000), standard_name='geopotential_height', units='km') grib_message = mock.sentinel.GRIB_MESSAGE with mock.patch(GRIB_API) as grib_api: @@ -152,8 +152,8 @@ def test_scaled_with_nan_fill_value(self): # a fill value is chosen which allows for the scaling, and any # filled values match the chosen fill value. cube = iris.cube.Cube(np.ma.MaskedArray([-1.0, 2.0, -1.0, 2.0], - mask=[0, 0, 1, 1]), - fill_value=np.nan, + mask=[0, 0, 1, 1], + fill_value=np.nan), standard_name='geopotential_height', units='km') grib_message = mock.sentinel.GRIB_MESSAGE with mock.patch(GRIB_API) as grib_api: From c8d36364252bad0a077f898c65c3588d15822ad5 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Tue, 24 Oct 2017 15:57:16 +0100 Subject: [PATCH 025/583] Extra test fix. --- .../tests/unit/load_convert/test_reference_time_coord.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iris_grib/tests/unit/load_convert/test_reference_time_coord.py b/iris_grib/tests/unit/load_convert/test_reference_time_coord.py index f0907c1e..af5d17d6 100644 --- a/iris_grib/tests/unit/load_convert/test_reference_time_coord.py +++ b/iris_grib/tests/unit/load_convert/test_reference_time_coord.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# (C) British Crown Copyright 2014 - 2017, Met Office # # This file is part of iris-grib. # @@ -60,12 +60,12 @@ def _check(self, section, standard_name=None): coord = reference_time_coord(section) self.assertEqual(coord, expected) - def test_start_of_forecast(self): + def test_start_of_forecast__0(self): section = deepcopy(self.section) section['significanceOfReferenceTime'] = 0 self._check(section, 'forecast_reference_time') - def test_start_of_forecast(self): + def test_start_of_forecast__1(self): section = deepcopy(self.section) section['significanceOfReferenceTime'] = 1 self._check(section, 'forecast_reference_time') From 48790ebef6a34bd68b7734174685b0b15c886ffb Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Wed, 25 Oct 2017 12:40:58 +0100 Subject: [PATCH 026/583] Set version string to "0.11.0" for release. --- iris_grib/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index 2ba56ca7..fac325c8 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -47,7 +47,7 @@ from .message import GribMessage -__version__ = '0.11.0-DEV' +__version__ = '0.11.0' __all__ = ['load_cubes', 'save_grib2', 'load_pairs_from_fields', 'save_pairs_from_cube', 'save_messages'] From 0ce02a45521a6156ec05c79baf608271bb415fda Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Wed, 25 Oct 2017 13:37:11 +0100 Subject: [PATCH 027/583] Version string to next-version DEV. --- iris_grib/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index fac325c8..c6244929 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -47,7 +47,7 @@ from .message import GribMessage -__version__ = '0.11.0' +__version__ = '0.12.0-DEV' __all__ = ['load_cubes', 'save_grib2', 'load_pairs_from_fields', 'save_pairs_from_cube', 'save_messages'] From 2680176e5e79628a72b287f78a55b65c07936b4e Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Sat, 28 Oct 2017 05:38:46 +0100 Subject: [PATCH 028/583] iris-grib using eccodes for py3 support * Changes ported from Iris#2607 * Replaced gribapi with eccodes in testing dependencies --- environment.yml | 4 +- iris_grib/_load_convert.py | 40 +++++++------------ iris_grib/_save_rules.py | 17 +++++++- iris_grib/message.py | 21 ++++++++-- .../test_grid_definition_template_12.py | 7 ++-- .../test_grid_definition_template_20.py | 7 ++-- .../test_grid_definition_template_30.py | 7 ++-- .../test_grid_definition_template_40.py | 7 ++-- .../test_grid_definition_template_90.py | 7 ++-- .../test_product_definition_template_0.py | 10 ++--- .../test_product_definition_template_15.py | 8 ++-- .../test_product_definition_template_32.py | 3 +- .../tests/unit/load_convert/test_unscale.py | 4 +- .../tests/unit/message/test_GribMessage.py | 7 +++- .../test_grid_definition_template_0.py | 6 +-- .../test_grid_definition_template_1.py | 6 +-- 16 files changed, 88 insertions(+), 73 deletions(-) diff --git a/environment.yml b/environment.yml index 2ca4cf11..9556d35b 100644 --- a/environment.yml +++ b/environment.yml @@ -1,5 +1,5 @@ channels: - - scitools + - conda-forge dependencies: - iris=2.* - - ecmwf_grib=1.14 + - python-eccodes diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index 9ae9abd5..b68eb989 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -160,11 +160,21 @@ def _unscale(v, f): if isinstance(value, Iterable) or isinstance(factor, Iterable): def _masker(item): - result = ma.masked_equal(item, _MDI) + # This is a small work around for an edge case, which is not + # evident in any of our sample GRIB2 messages, where an array + # of header elements contains missing values. + # iris.fileformats.grib.message returns these as None, but they + # are wanted as a numerical masked array, so a temporary mdi + # value is used, selected from a legacy implementation of iris, + # to construct the masked array. The valure is transient, only in + # scope for this function. + numerical_mdi = 2 ** 32 - 1 + item = [numerical_mdi if i is None else i for i in item] + result = ma.masked_equal(item, numerical_mdi) if ma.count_masked(result): # Circumvent downstream NumPy "RuntimeWarning" # of "overflow encountered in power" in _unscale - # for data containing _MDI. + # for data containing _MDI. Remove transient _MDI value. result.data[result.mask] = 0 return result value = _masker(value) @@ -179,30 +189,8 @@ def _masker(item): return result -# Regulations 92.1.4 and 92.1.5. -_MDI = 2 ** 32 - 1 -# Note: -# 1. Integer "on-disk" values (aka. coded keys) in GRIB messages: -# - Are 8-, 16-, or 32-bit. -# - Are either signed or unsigned, with signed values stored as -# sign-and-magnitude (*not* twos-complement). -# - Use all bits set to indicate a missing value (MDI). -# 2. Irrespective of the on-disk form, the ECMWF GRIB API *always*: -# - Returns values as 64-bit signed integers, either as native -# Python 'int' or numpy 'int64'. -# - Returns missing values as 2**32 - 1, but not all keys are -# defined as supporting missing values. -# NB. For keys which support missing values, the MDI value is reliably -# distinct from the valid range of either signed or unsigned 8-, 16-, -# or 32-bit values. For example: -# unsigned 32-bit: -# min = 0b000...000 = 0 -# max = 0b111...110 = 2**32 - 2 -# MDI = 0b111...111 = 2**32 - 1 -# signed 32-bit: -# MDI = 0b111...111 = 2**32 - 1 -# min = 0b111...110 = -(2**31 - 2) -# max = 0b011...111 = 2**31 - 1 +# Use ECCodes gribapi to recognise missing value +_MDI = None # Non-standardised usage for negative forecast times. diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index 4392c8ce..63f46f09 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -255,8 +255,21 @@ def latlon_first_last(x_coord, y_coord, grib): def dx_dy(x_coord, y_coord, grib): x_step = regular_step(x_coord) y_step = regular_step(y_coord) - gribapi.grib_set(grib, "DxInDegrees", float(abs(x_step))) - gribapi.grib_set(grib, "DyInDegrees", float(abs(y_step))) + # Set x and y step. For degrees, this is encoded as an integer: + # 1 * 10^6 * floating point value. + # WMO Manual on Codes regulation 92.1.6 + if x_coord.units == 'degrees': + gribapi.grib_set(grib, "iDirectionIncrement", + round(1e6 * float(abs(x_step)))) + else: + raise ValueError('X coordinate must be in degrees, not {}' + '.'.format(x_coord.units)) + if y_coord.units == 'degrees': + gribapi.grib_set(grib, "jDirectionIncrement", + round(1e6 * float(abs(y_step)))) + else: + raise ValueError('Y coordinate must be in degrees, not {}' + '.'.format(y_coord.units)) def scanning_mode_flags(x_coord, y_coord, grib): diff --git a/iris_grib/message.py b/iris_grib/message.py index e0b15993..85230259 100644 --- a/iris_grib/message.py +++ b/iris_grib/message.py @@ -453,9 +453,9 @@ def _get_key_value(self, key): elif key in ('typeOfFirstFixedSurface', 'typeOfSecondFixedSurface'): # By default these values are returned as unhelpful strings but # we can use int representation to compare against instead. - res = gribapi.grib_get(self._message_id, key, int) + res = self._get_value_or_missing(key, use_int=True) else: - res = gribapi.grib_get(self._message_id, key) + res = self._get_value_or_missing(key) return res def get_computed_key(self, key): @@ -476,9 +476,24 @@ def get_computed_key(self, key): if key in vector_keys: res = gribapi.grib_get_array(self._message_id, key) else: - res = gribapi.grib_get(self._message_id, key) + res = self._get_value_or_missing(key) return res def keys(self): """Return coded keys available in this Section.""" return self._keys + + def _get_value_or_missing(self, key, use_int=False): + """ + Return value of header element, or None if value is encoded as missing. + Implementation of Regulations 92.1.4 and 92.1.5 via ECCodes. + + """ + if gribapi.grib_is_missing(self._message_id, key): + result = None + else: + if use_int: + result = gribapi.grib_get(self._message_id, key, int) + else: + result = gribapi.grib_get(self._message_id, key) + return result diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_12.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_12.py index 767e280c..c77b54f4 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_12.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_12.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# (C) British Crown Copyright 2014 - 2017, Met Office # # This file is part of iris-grib. # @@ -34,10 +34,9 @@ import iris.exceptions from iris_grib.tests.unit.load_convert import empty_metadata -from iris_grib._load_convert import grid_definition_template_12 - +from iris_grib._load_convert import _MDI as MDI -MDI = 2 ** 32 - 1 +from iris_grib._load_convert import grid_definition_template_12 class Test(tests.IrisGribTest): diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_20.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_20.py index 3f02e7e6..cf112e0d 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_20.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_20.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2016, Met Office +# (C) British Crown Copyright 2016 - 2017, Met Office # # This file is part of iris-grib. # @@ -33,10 +33,9 @@ import iris.coords from iris_grib.tests.unit.load_convert import empty_metadata -from iris_grib._load_convert import grid_definition_template_20 - +from iris_grib._load_convert import _MDI as MDI -MDI = 2 ** 32 - 1 +from iris_grib._load_convert import grid_definition_template_20 class Test(tests.IrisGribTest): diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_30.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_30.py index 04169894..b18fff9a 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_30.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_30.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2016, Met Office +# (C) British Crown Copyright 2016 - 2017, Met Office # # This file is part of iris-grib. # @@ -33,10 +33,9 @@ import iris.coords from iris_grib.tests.unit.load_convert import empty_metadata -from iris_grib._load_convert import grid_definition_template_30 - +from iris_grib._load_convert import _MDI as MDI -MDI = 2 ** 32 - 1 +from iris_grib._load_convert import grid_definition_template_30 class Test(tests.IrisGribTest): diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_40.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_40.py index 665c1eb2..4f8106c5 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_40.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_40.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2015 - 2016, Met Office +# (C) British Crown Copyright 2015 - 2017, Met Office # # This file is part of iris-grib. # @@ -33,10 +33,9 @@ import iris.coords from iris_grib.tests.unit.load_convert import empty_metadata -from iris_grib._load_convert import grid_definition_template_40 - +from iris_grib._load_convert import _MDI as MDI -MDI = 2 ** 32 - 1 +from iris_grib._load_convert import grid_definition_template_40 class _Section(dict): diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_90.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_90.py index dcffa4bf..5dc992b9 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_90.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_90.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# (C) British Crown Copyright 2014 - 2017, Met Office # # This file is part of iris-grib. # @@ -35,10 +35,9 @@ import iris.exceptions from iris_grib.tests.unit.load_convert import empty_metadata -from iris_grib._load_convert import grid_definition_template_90 - +from iris_grib._load_convert import _MDI as MDI -MDI = 2 ** 32 - 1 +from iris_grib._load_convert import grid_definition_template_90 class Test(tests.IrisGribTest): diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_0.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_0.py index 6cce4311..2c8d2d36 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_0.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_0.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# (C) British Crown Copyright 2014 - 2017, Met Office # # This file is part of iris-grib. # @@ -32,11 +32,11 @@ import iris.coords import iris_grib -from iris_grib.tests.unit.load_convert import LoadConvertTest, empty_metadata -from iris_grib._load_convert import product_definition_template_0 - +from iris_grib.tests.unit.load_convert import empty_metadata +from iris_grib.tests.unit.load_convert import LoadConvertTest +from iris_grib._load_convert import _MDI as MDI -MDI = 0xffffffff +from iris_grib._load_convert import product_definition_template_0 def section_4(): diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py index 3390dca8..11878c23 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py @@ -37,11 +37,11 @@ from iris.coords import CellMethod import iris_grib -from iris_grib.tests.unit.load_convert import LoadConvertTest, empty_metadata -from iris_grib._load_convert import product_definition_template_15 - +from iris_grib.tests.unit.load_convert import empty_metadata +from iris_grib.tests.unit.load_convert import LoadConvertTest +from iris_grib._load_convert import _MDI as MDI -MDI = 0xffffffff +from iris_grib._load_convert import product_definition_template_15 def section_4(): diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_32.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_32.py index e54760a1..b8b3193c 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_32.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_32.py @@ -33,11 +33,10 @@ from iris.coords import AuxCoord, DimCoord from iris_grib.tests.unit.load_convert import empty_metadata +from iris_grib._load_convert import _MDI as MDI from iris_grib._load_convert import product_definition_template_32 -MDI = 0xffffffff - class Test(tests.IrisGribTest): def setUp(self): diff --git a/iris_grib/tests/unit/load_convert/test_unscale.py b/iris_grib/tests/unit/load_convert/test_unscale.py index 39e95527..bce5d8f5 100644 --- a/iris_grib/tests/unit/load_convert/test_unscale.py +++ b/iris_grib/tests/unit/load_convert/test_unscale.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# (C) British Crown Copyright 2014 - 2017, Met Office # # This file is part of iris-grib. # @@ -59,7 +59,7 @@ def test_array(self): def test_array_mdi(self): result = unscale([1, MDI, 100, 1000], [1, 1, 1, MDI]) self.assertTrue(ma.isMaskedArray(result)) - expected = ma.masked_values([0.1, MDI, 10.0, MDI], MDI) + expected = ma.masked_values([0.1, 0, 10.0, 0], 0) np.testing.assert_array_almost_equal(result, expected) diff --git a/iris_grib/tests/unit/message/test_GribMessage.py b/iris_grib/tests/unit/message/test_GribMessage.py index bf9669fa..9b49932a 100644 --- a/iris_grib/tests/unit/message/test_GribMessage.py +++ b/iris_grib/tests/unit/message/test_GribMessage.py @@ -55,7 +55,12 @@ def test_release_file(self): filename = tests.get_data_path(('GRIB', '3_layer_viz', '3_layer.grib2')) my_file = open(filename) - self.patch('__builtin__.open', mock.Mock(return_value=my_file)) + if six.PY2: + self.patch('__builtin__.open', mock.Mock(return_value=my_file)) + else: + import builtins + self.patch('builtins.open', mock.Mock(return_value=my_file)) + messages = list(GribMessage.messages_from_filename(filename)) self.assertFalse(my_file.closed) del messages diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_0.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_0.py index c1b74530..d2cf4b75 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_template_0.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_0.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# (C) British Crown Copyright 2014 - 2017, Met Office # # This file is part of iris-grib. # @@ -76,8 +76,8 @@ def test__grid_points(self): self._check_key("longitudeOfLastGridPoint", 7000000) self._check_key("latitudeOfFirstGridPoint", 4000000) self._check_key("latitudeOfLastGridPoint", 9000000) - self._check_key("DxInDegrees", 2.0) - self._check_key("DyInDegrees", 5.0) + self._check_key("iDirectionIncrement", 2000000) + self._check_key("jDirectionIncrement", 5000000) def test__scanmode(self): grid_definition_template_0(self.test_cube, self.mock_grib) diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_1.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_1.py index 1e824652..b8281d92 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_template_1.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_1.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# (C) British Crown Copyright 2014 - 2017, Met Office # # This file is part of iris-grib. # @@ -91,8 +91,8 @@ def test__grid_points(self): self._check_key("longitudeOfLastGridPoint", 7000000) self._check_key("latitudeOfFirstGridPoint", 4000000) self._check_key("latitudeOfLastGridPoint", 9000000) - self._check_key("DxInDegrees", 2.0) - self._check_key("DyInDegrees", 5.0) + self._check_key("iDirectionIncrement", 2000000) + self._check_key("jDirectionIncrement", 5000000) def test__scanmode(self): grid_definition_template_1(self.test_cube, self.mock_grib) From 69f4fa34516b7351366e0c47a61b6e290c7f9978 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Sat, 4 Nov 2017 08:21:43 +0000 Subject: [PATCH 029/583] Version string for v.0.12.0 (#93) --- iris_grib/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index c6244929..59ce26f2 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -47,7 +47,7 @@ from .message import GribMessage -__version__ = '0.12.0-DEV' +__version__ = '0.12.0' __all__ = ['load_cubes', 'save_grib2', 'load_pairs_from_fields', 'save_pairs_from_cube', 'save_messages'] From ebd5ad6f0e4798dd1696e5e73569b10570e83924 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Wed, 30 May 2018 10:27:21 +0100 Subject: [PATCH 030/583] Test against latest conda-forge iris. (#100) * Test against latest conda-forge iris. * Temporarily pin numpy and cartopy; add in testing deps. --- .travis.yml | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/.travis.yml b/.travis.yml index 91cae33b..c86fdbdf 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,20 +12,12 @@ install: - bash miniconda.sh -b -p $HOME/miniconda - export PATH="$HOME/miniconda/bin:$PATH" - conda config --set show_channel_urls True - - conda config --add channels scitools + - conda config --add channels conda-forge - conda config --add channels defaults # Install iris-grib's dependencies # -------------------------------- - - wget https://github.com/scitools/iris/archive/${iris}.tar.gz -O iris.tar.gz; - - if [ ${iris:0:1} == "v" ]; then - iris="${iris:1:${#iris}-1}"; - fi - - tar xzf iris.tar.gz && rm -rf iris.tar.gz && mv iris-${iris} iris_source; - - conda install --quiet --yes python=${python} --file=./iris_source/minimal-conda-requirements.txt; - - conda install --quiet --yes ecmwf_grib; - - pip install ./iris_source --no-deps; - - rm -rf iris_source; + - conda install --quiet --yes python=${python} iris ecmwf_grib numpy=1.13 cartopy=0.15 mock filelock pep8; - conda list # Download iris-test-data From 99990e0b8a773331654b5db3989f9cd400dd2437 Mon Sep 17 00:00:00 2001 From: Corinne Bosley Date: Mon, 4 Jun 2018 17:13:50 +0100 Subject: [PATCH 031/583] WIP: Hybrid height support (#103) * loading of hybrid height with draft test --- iris_grib/_load_convert.py | 56 ++++++++++++++---- .../test_data/faked_sample_hh_grib_data.grib2 | Bin 0 -> 2472848 bytes .../load_convert/test_translate_phenomenon.py | 10 ++-- .../unit/load_convert/test_vertical_coords.py | 18 +++++- 4 files changed, 66 insertions(+), 18 deletions(-) create mode 100644 iris_grib/test_data/faked_sample_hh_grib_data.grib2 diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index b68eb989..0a253f5d 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2014 - 2017, Met Office +# (C) British Crown Copyright 2014 - 2018, Met Office # # This file is part of iris-grib. # @@ -34,12 +34,13 @@ import numpy as np import numpy.ma as ma -from iris.aux_factory import HybridPressureFactory +from iris.aux_factory import HybridPressureFactory, HybridHeightFactory import iris.coord_systems as icoord_systems from iris.coords import AuxCoord, DimCoord, CellMethod from iris.exceptions import TranslationError from . import grib_phenom_translation as itranslation -from iris.fileformats.rules import ConversionMetadata, Factory, Reference +from iris.fileformats.rules import ConversionMetadata, Factory, Reference, \ + ReferenceTarget from iris.util import _is_circular from ._grib1_load_rules import grib1_convert @@ -1221,7 +1222,9 @@ def grid_definition_section(section, metadata): ############################################################################### def translate_phenomenon(metadata, discipline, parameterCategory, - parameterNumber, probability=None): + parameterNumber, typeOfFirstFixedSurface, + scaledValueOfFirstFixedSurface, + typeOfSecondFixedSurface, probability=None): """ Translate GRIB2 phenomenon to CF phenomenon. @@ -1272,6 +1275,14 @@ def translate_phenomenon(metadata, discipline, parameterCategory, metadata['long_name'] = long_name metadata['units'] = Unit(1) + if (discipline == 2 and + parameterCategory == 0 and + parameterNumber == 7 and + typeOfFirstFixedSurface == 1 and + scaledValueOfFirstFixedSurface == 0 and + typeOfSecondFixedSurface == _TYPE_OF_FIXED_SURFACE_MISSING): + metadata['references'].append(ReferenceTarget('orography', None)) + def time_range_unit(indicatorOfUnitOfTimeRange): """ @@ -1330,8 +1341,9 @@ def hybrid_factories(section, metadata): 'of second fixed surface [{}]'.format(typeOfSecondFixedSurface) raise TranslationError(msg) - if typeOfFirstFixedSurface in [105, 119]: - # Hybrid level (105) and Hybrid pressure level (119). + if typeOfFirstFixedSurface in [105, 118, 119]: + # Hybrid level (105), Hybrid height level (118) and Hybrid + # pressure level (119). scaleFactor = section['scaleFactorOfFirstFixedSurface'] if scaleFactor != 0: msg = 'Product definition section 4 contains invalid scale ' \ @@ -1343,21 +1355,38 @@ def hybrid_factories(section, metadata): coord = DimCoord(scaledValue, standard_name='model_level_number', attributes=dict(positive='up')) metadata['aux_coords_and_dims'].append((coord, None)) + + if typeOfFirstFixedSurface == 118: + # height + level_value_name = 'level_height' + level_value_units = 'm' + factory_class = HybridHeightFactory + factory_args = [{'long_name': level_value_name}, + {'long_name': 'sigma'}, + Reference('orography')] + else: + # pressure + level_value_name = 'level_pressure' + level_value_units = 'Pa' + factory_class = HybridPressureFactory + factory_args = [{'long_name': level_value_name}, + {'long_name': 'sigma'}, + Reference('surface_air_pressure')] + # Create the level pressure scalar coordinate. pv = section['pv'] offset = scaledValue - coord = DimCoord(pv[offset], long_name='level_pressure', - units='Pa') + coord = DimCoord(pv[offset], long_name=level_value_name, + units=level_value_units) metadata['aux_coords_and_dims'].append((coord, None)) # Create the sigma scalar coordinate. - offset += NV // 2 + offset = scaledValue + NV // 2 coord = AuxCoord(pv[offset], long_name='sigma') metadata['aux_coords_and_dims'].append((coord, None)) # Create the associated factory reference. - args = [{'long_name': 'level_pressure'}, {'long_name': 'sigma'}, - Reference('surface_air_pressure')] - factory = Factory(HybridPressureFactory, args) + factory = Factory(factory_class, factory_args) metadata['factories'].append(factory) + else: msg = 'Product definition section 4 contains unsupported ' \ 'first fixed surface [{}]'.format(typeOfFirstFixedSurface) @@ -2241,6 +2270,9 @@ def product_definition_section(section, metadata, discipline, tablesVersion, translate_phenomenon(metadata, discipline, section['parameterCategory'], section['parameterNumber'], + section['typeOfFirstFixedSurface'], + section['scaledValueOfFirstFixedSurface'], + section['typeOfSecondFixedSurface'], probability=probability) diff --git a/iris_grib/test_data/faked_sample_hh_grib_data.grib2 b/iris_grib/test_data/faked_sample_hh_grib_data.grib2 new file mode 100644 index 0000000000000000000000000000000000000000..4ad27f6189a13439c28ff3e8c0a723550487043a GIT binary patch literal 2472848 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

S@mRCCf#;l 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�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

FXX??x@FqQo9!D0HaZ8wlFE(OUY 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%0D%_Hzw@c9g^mt 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

h96YeOT!Z1$MgORT@Rg^}R(&Zx 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�QZIyY>Tk$@LL3IsqLl!&4r`3@M0nseU4uACadF3!^6v@jn~Tghi%c z6icv<4?iIuKxdl+3E2&?YlBaeM-2v+2S%9M2)-*g?(8CCfRg*c?2};=eUh?^^3lx` z49w%gBky2ze_N9wm{;B)!9aMBw|ufF=_cK{IFYhWA<%x59?)T!VE@s(2BC&1HC`PpEI4Z$&})CNXuAbe4RPP7Uy z!Xt_n;dpoJ3kK69@bo!tmXUGeF*O|LaUlwOe34Q!UMBhh`T(&EM=;S*)y&y)!Lk{O z9&Sn~yoPeg*PK#cqAC8^^>M~MVYSN&NNr?T)47i zDVrI8gqBergpEn=NgCdHuM;i4xAZ{B!Ef9Za3%UO$!s%q7sc_p%Slg>OX`wWCGtXZ z{8*|^mz3-m!x1e_!$%gk60?*y8gP%%0P#e|L!uFfPq=TvHzGT@u+CSG^L z%m^5RgFn}F-lU#-QcRYDrlvA*oE$l+AD9KM$a91qh!X(r`lk>$KsTT#JqG5H`4kie z8sBsTpMtPx@&Q>KxFfIi?0z&PhGR)#IMO*Q^a%<5h=YNLhKAwwX%hE9HLd%QQ`~b9 z9=EA()hSl_2VXlkpX1{N(I+8_NvJHfyEJxoG0<)}!kH4VxNrD@TvtSqE+EyWys3PY z2uI}{BrXY+2#ba~i+rLfnH_vlkE-_Aoab#)vOU0jR^NFax>cnwP>S{r=H~c2+ zUqz9t;VCRg$Y-0s_c9mY9v^QQ@BV~CRvE^?zw(zoCwk~~51UYhYKe&p0cm&;No{Xo zP$JU`&OB}PttIs9Aw`cRHVkRxaI^JvM?t z_$pYg2o5sEq>R*)ELE7za?+1$KxEUSQR0&kFX*SQK_lLPUi9#gb{pKNKM_*)$9(?z z*Wvui3{(;vJy%WTTrz^Lo$K<9^O^?+`lDUw=Qg;QBV#Zc^}PFv)+%xXFhmUOJ(tNf z`X=XMr$UPSA>>nIAeV(GriO90qFIKq#uNQQ69nbR6mzO4g{8JI zC+)CFcVzdu)*}D^$pjo^ds*Nfp4o7dqU{+)Z+`8y+^4qA%L+K|Zi5@+MjGbgk!Spi zrcZD&EJ*L3k=HZQ76ywk8C65;vvqx@1Ib1-zZ!Ht;9!r1tfsn{F_G6xVQ_bo+6G}~J_dGJh+%bvZm1ZzF z&{N4^GO7X!rZtw4cWdk@{OMgn9Yk=4C1z3Y#(sFY*j^=3Jk`?1t~?`yUNw;SMe=S8 zbe17fTUM@7Qm_xm(LOc!;430{xG@T_(l;JpXgmx63iS9g9Eyz*@{=R$s`CUaeSx3- ziAXdFEn`dpPp(8sT_I=3m);1<%}>Mp5QOu}v_$$rOWqxF_tFL;y2}j)r#b1pd3_b; z#-I&E$fn%6xb^f;k?)`WA&7XM!@Hx2Udy&A%L#HNI0$DH`LHEN6D9hll)6@4byB&j zJaxnaw|e~V8XR~R(JXD2?vuvkBrK;iaVwo~- zx`(Oot$%_2dfUDR(EMHZn!o8`&^G!k^ofFj03gtZG4zf9u>%b?KloWwA@YN-h;&rQ zU7-;i?f!}HT^b1+QMSwj6q!fR;K}&FoPNxN8c$*ahJ-S?$Or5oWBDa&OU1#)OKK}} z8In^T91Xoq!%xP5Mwchlf~auO5E-weV2do3t7Qu2bes!9s3Tj@xmxqo(3f9h^{cS~ z@Yih{3PR>9@iR$%rMx%=qy|!;=TCwV!Y6=t$OR~)?}1Bu^m|?W;=Fq>@RELLxYH5? z6P6GiMZ3}la2`FR=Jc3Q4A&@bB8A9T3QwKlEn_VE?sgnSqp_d?Y+@^N*?2kfNk}Ny zqb#l`=}tU)^Hhr^!dibcb(S0lZjxDyn;-S(6mTjT*#bvEbH(S3qaPv0Ox$WSa_#Pg zftcMfjGo853$lE#=t{}5tD4AP5(s$XPPn)|)I9ExTT(aOuDvm>f?$&SLQ?LcaZlw{ zz`Bdgm|4C)S09sT7pgL*rM=(y-)H}=|HHg*{B;)$RQ>+y)1C%y)WfF%VyqygN<^Z-vx8Pp8tIaof@k@9^@4OHCYSQR)-=Zlr_mTpKEZc^A;-yi z@giUV5JB0O1L7XSg%jyG7{taLWw5I-kZ;1lz;?-ES_ zn58*qA+IjMHFMHC`h+$%r443@KnsaC-E3Rv)@>ZlyF<6#!0CYxzQ%L{*Fup8cXkR0 z&7EVM=8+KDy@ZlzkanB?d|76=xD354ggncUBe+6#bD67IG)Mg$WXSe1fI1HHss0q~ zN~ZV`a<1n*2GOtbYKeZ9tIYj}?mVh`oe11vZ%JSoO$77gIz^-Mt&JB;V%~IDqQM195Uhw}RHertpf1`IfZ$ubl7 z$fTQ4qCo}(h6HpT>ZgVXM)klD4=?k3poe#3Bko*^yin2=w~fr`VX87Aq!^uu%3Wf?7| zeFO#o^Py+}{K0IPz0yYMIqFNi%`RwMT$mwLdmu?vhb{B|HVV z2J-6EA>?&A`Y!ThX3HwuFPpcP#`Z^8;$ZB&NBt>jIJ62hcmYGEK6{>~UNFPmvm7kMdrK{ytF)lA#sXyhZU@V7N4lOQn+}!Q^QWf%0mzP65 z=XIPmTbIv`|4cK;Fv7k-Zj@+RSQAA~@aK9oY~8vy^!b?N8*Kz3I!fB=F9-1hbQ&VpPvMx;!uj2X<(wg{FB zF}!=oY&pKT-NmgT+DcM-E6N-*WpfZ6$E01CeH8DERh5Abw0Q#k&Qyqvu@eb}no>^{ zV1uK6O0tId3fugnVGZEQ7vNxEeg#G^0@*_TXaoi+Np&{o2po+Q5f=N;`5I*D^YR3g zq(?Lc(j*u6a9|KQ%Lv&W<-p(#W`@C=Gz>k{ZFAeLOE>18^XTG3Y(}@k%V>ZUsqB#BsNL>+%@hlPcrd8SU5qw)Jq|`50n*+`Aj{E@i;6iLmjQ7W zikbL+O>@=RN;;bMjen~J`uG&&8}B>+84zFu*+98`;4v=@5u?HQWM&`T01D*?#Xx$< zSn=4eoOfTF4M&1tA5t7HjSDnKhH#h7LWx|k;4FnC0iR5_i`1}(Qjd*s6t!luN2szX ziR@I;#i$G`;p1C^0~V?{o#4wzHAq;?t?`HK_By!ZCp*fCma4Lxuuq08_$Pk~0$jiF z_dx$H3+d*KKp+xVmLjZk_-PUJ(8muTZcK$h(0fw%`+@y1XV^b@}A{o4&PTi!(( zS!VqcKU;B!i`>=eIyg=H!S@`V`O53xyCu>&(s()D%dUtHAL>xCNf3C&u@ILEG8*ET z%4N-amg$5Sh`X{rrE+iAboM$<#G$4JgpeyqJyY%TD>@xve4h#Hts-A72@>UOt;-mX zrphBlDtwmfx_%qT9lYY9;TE#Iu|98i?AqpbI%K>S-+69%eHkIgOai$UQk^`jUyWUQ z6@24AT;UgCzWN}L5JLExf9mCrd-kPxY%U&ECa9obCMCkmI8$uGjAlsdKDrGmwMQ=l zD84MQhkn4=g1oZZ8n&<>xG2ORwXfBR+%MCp%IMK?s|(lkQ{3(H{?ut{9O0&P{l;K%DT6PB4$GEa zlo@&PiR>(@dED)FST4|^0-XI2Fm|-$Dz8NFR-iz;_Jva<>F7`KU3BtgnJn-#1prqJ zd;)figntHuq&87W9kXlDa>{Tq)K*!*E`QyDT73Qm2Kf{O#{z(bfrd3~0L)Kz5e9a; zJO^>g%f_Fbf9Z}#mb5EnFSObf(iEAj<1?-mBOjItsSie5GJAtX2)O*)p0r}^^o z3chIO*aSUTR=20Ov)ep2iohenO>*xb$#|H>CdTkD&~ya`$m$l}YcXc2SA*vrE#w`; z*Lsq@4!(75QzQb)=QIY-x4x{=buC0#-RIaZa?G-I*kCXeuUS49Y_O)Am=fGtw+%}5 zh}2`cbD!L~H^gm!*z{6n3mpa>r!?489`%H8dRg9!p`!r)hz9`f=HFPLfiL`C%&)`d z_-fw$8Kcq5>@=SzCO%^ogK%6Pos=gg9ZTZSE${@?(y}z@A8n0E3LAKC`HWkLvlA7z%G2>-}3QnENwdmCOLNn++ow)#Th@|*#N4nHT zmJF#fZc19qyj`BpThytCFn==W4F=YyV8bBL2L%j24+bW6j_GcpnB$k|ZTsYFp?~O* z8-NSmFnBT0(IF#XfLvdFdw&708Vou}LWNgwwrFF@@Bt4%aNkCG@2h~%5}B3@p%iWA z=(81J?r?<7$OgyV%J5mvo%0GqrzYfSOxkrEmb8b+ua>vt`9dg9`qe!t97JU=G-Vu0 z3Jxu1FYJ!lD#XQ_x-K*^hyZ`CiNVTaW}XUD0P<0Zucemuos0-qPsY37<@r`_rM5zO z+a`u z8s;cCkYRta8MSdg!3sE`pjaZ{m1VfhoCS^zySisMmD4%4m&+zXC^1S7vn$&=Q0(6w^G)P$XF`k#k2JIXYZ4<1iTsEwj#;?^ooX zAk_zK1-S7LD}9x$Nm;q~%5|7j4Z}jRvqBE;y8_D3OHY3ErTXnMAl2ydkL=jYts=zZk zRsg(s%iA#9=&;HPomA3Jkc`6K9^LCi4MPfU0KLjQWDkPp+vF;_6sh@wSeqH`#F0-xN+rpNA=8wqRf zl$BGB1?$|*K;*6@I^)&P$`xJa_Kg3Fe=&7tbl4ki2?UY>ei@K@01C!BhL|w4fAf(< zNR&4S{h845HrWANWr2XvYM{kAs}Y|3)$+V9qVNU}{@+JaK{j}fLagyF9Jl!{0!YN8 zW=-JXfx0oi7-E`ZJ@M)j;P{ezHv=6G|LH@DlNoq1aP z2w&TMsd0)G+hJ~Ar(sx4ib6P=pVlp+8?${TWoHc}cv@79ix5U82>o`(skcaG>beak z9_+a#=)-HBh?G2t%KkdzL->251I3d@cEj{eBZ_}}D%b{qj|rqzi|IPcZ0 z5aErVD#D|;#y}BBEo%#Jm_ovhY~;&5`eqOPvu{@LB}yT;Y5mRoR#WmxVKl>|PNfsH z8U?-rR!ufm9=NZM+ZmVZ8_b0wYZn;oaF=>2kkOkMlHm!xip(kPHn1|KQlWnY-dp!WnaI~*^xSLE6 zLOG3jBzyEL7I=6aPX-16nCBD$%uYWq0^#-q445imi$3yUVq5s86mzUq+j-lXVYVZb z@2H)_m`8yN`j9nOM)UN|A`dMOuI`YaFwq^PyDgfVq>!Xgox;6BtF4o*F>IQB^l4?1 zO-=5sHb~gwCmwt+y4F?Kbg1jrWmzHDdUvO~&AQO`12fdt8|L0mPMudEftKr_y?J^_ z*utDVXLu30xF}@XZ<8mZH)~s6sQrwK#?W#e4z31S8Hr51!sor?3PPSOr@_GJxOndI zoMA4tB`$!~S5@r>5QbA_6o;$l2|gpKRf$*_W?PdB>6qe5s}qD#h!7G}{3IM%0Ph^Y z#(ZUx2l?$7MCZIpGjyU*wpAUBU(OvURn1dMcWEW}N?%u*2H<|pP>pVP1=yw(oE~^$7D@p%S1+qdH%nXumDf57 zVT#VYjw5S+K&P2SuP2@ASH+WD5Si@UK;%_Ju z+G>vxBY)FGLac0fr!ZTIpGeo_o8nFni%4zYc^HSSpxX?^#Onw*IYjcPHk@FR)7Y+~ z0#sfPjcMRpATDo#7r_=eSHsH1vDNs3{6eEIzOFUHLDz>>$jT?Y`K7bAIU%r(x!(J_ z%_|%t;V4$TK9Oh0#Uq84BXkIqSOgvY1Jiig=VIq?t;F5PFq8!;JL?yCZ#Q9%9D*a{ zgA&Uj$dT%u4fvXwlTl;gNT-rQP2?>}iO3yqgh(u7$OBPrUEUavWmpBE-Cu#jt&#c#iy$|CA*1-@m@;a|2L#aDwn{SI9%_ zClrvQkTo~u+vGwIbVU*O#Wt?SouV9CearJ{@hRr8YJHfP+)6qxYEJX>mU#uboy;Ge zv-$DT*KH{APW4EwfDR0{7{)fm2@>4mQ}23R&VENcaP$=p!=~~OpO}PZLk7i#0a(Nl z%IcO-ddU((zjO$~B?`=^N#KLQhB9yR5r98MBX`WvaR`cYB3}S|=H!D`f80WzQfRf> zSgTOjQl%b)uOP8!m9&!W{>fe6t-0<9F~I{Nt{!EAw3zo;W(FdsssyD_guwRbA;U@s zvJ#8y7^s{klIZN0CA9Oz)9T3B4T1Q8IAV)tv zCFo}6_Ma_*k??_11fALgEBY~clR;BdKF8L==(p8&gmSLN%xr!aXt<49S#d!hT=}uG zU2bP!yG8y$2@&~>u;q8cJ9#^7wU)fiOkmpNo=K5eLoRr9@VP0sg71!-g$^dQM^QR( z+^p|0{BT}Q5K7{UNC8=qq)*;n$tCr4{a^f2GI^L4dc}UudH6gc3H=cAes#*Lsg>t1 z^7RcQacdntpCUY?hFjT&Y>NarPH>A(h$soC)lc=3)p9hk>U`5e=|<9#Lwgg>rlo?0 ziQI8f4loQ;4IG9Mu-`)%wk>WAo_xW4fjnfGGf=>j2uFk9ozacZb;g6pWv5UxKCz4=tWn+@fhq7N!XbgZjq;P@ikGtdP|+Z?ME)sTzY5)8R$Qx&-7ywBH2UMM6FHa&4fZTgGXXiU{hlQ$rz}{GZHuRkl!k(CMFCq z$tnqIrg)IUl6;_z?U19H+9ct&Ba|P>wjE+qMt-ZTa1V5+qpcnO!SxPgpf-%V(?94< z3U{H|hNc?MZf|&WLar^|-aO51=4zOD2Y1~*P2x+BlW|AfJKo~ zR>DcAil4_$dqbK(JU#gN;rl43yv>_aKMLLjPRNl!amzM@6(;iwdW{DR6UEa8Wtj55W=7UJy%iyj-e!EWI48wluZb!l}c^5 z@!Wir?^i2RI!Kx!ct@F)6_isSp%#;QZQ$!Y>(@9U-DxsV28O|+f~aYNffVmQzw{@w^4TP zJ(Gdi5~d$`UcH|o51$Uvlh-}FVyhXF z)eN4|#{)Bg_bXb&$EQM@h!q|tz;KHTQd5AZdp|&JP-mrnt}PF7kI~+|dhjz7DVOXx(^L!d%BF^$ZiYKo9->eO$jylB5U@~v-`NvZv zrj(uaSl6_7Z|vQNTv=ST|G~t3or2za!+Cq|8K@AB5(XU@iu@th=QqML(Znd8ck$xq z!ze&V=cAlgpeJKOfm2qti3?_FB4PE>n0R4aW=1>8c@Xan~Hl>{ny@;R{oZt&`$9O(u<*$%W{(cUBL==xBr z+#P8G=IEpSJhGOhxBVdyCOob*+^iGfP{zYdR^v#atxRUC%WUKjzYBbGi=(PVWR@|1i7;aW2m;dlEpP)FuJH3H@ zXNbc`3Bs1oOyu+FGR#L(DV^82P3W6bDiE5KM=9!vvgck7+;|Z@axQeFQ^1CE%g0gp z$s7K2mFfrcaYg6g_E2rG^R_F`OXn46Ah3op&%@VP@Id%LM|n`ZE*cc$(k)>N0V$z5 z!X)}JX}3Hdy`#LT#4;~^I|0LqF=C-S5Xd1g(R^T}@Q|4gez^!SO!UF9HEmgtNK+zu zDbsBPU}oBFavVo4ulO);t=#Fsy`&q@6l-LvPs+gmru7k$W<5LA((j0?Gmg;~ST)<(zh! zoJKP`QI2Qc8pI3I))B?qIcj(g40MLjv4-4ZfzffvF!7TFt$;!HgB7F{LXJX+I}!|{ z7l0@a5AlNuuDl9i5ju(0A#}7z8K0*RBd%uP6{r9%%pg~2pGwDca$du>JV=PK+Sxgn$tbRdAzOQp+qf!)%~d%Zp6$Ftr2Z*B_1|<_EuL}ycW;AeGzlmA zt#HS)oh7KXBuq}TF80&%-_JzZ>1@$0Y)E0YHM#c+bI0f6e1p1|QjmYZRK!O{A>zu+ ze4Bm02%)0~;I4k!?x*`@h|$bE4Vs*X#zPpd+YIt3WJL#pPd#<-t88Nq!rJmU;90>VoThOXzLE4mS^_yfulYBT8iV{33BYiIe@cCDf;36!z!l)%3fKys2??I1 z!(b`mUp;6uktIFf&_Oev5z6FNXLvw}S}9X%>ip!9CEk7e>~PAL^QS0#I!ouSxYnZ{;rSmfyI@lrI z4&{y0%=C$x+|QHeCd&KryU3|t8Dt3$jcVk^5n_v^Qv+o8L+U1+=-Y$BnU~OV^f|>m z7p(%KW9mS{U|@he_YAb8A)%}+Oq~KuBrO-?w~U{Y86?Sq5Q^g5y8;b3Ir6oR|M49D zr*!}vpD3W*-sIC$?!xr5|BC^$o(&j%q73~2C|3XrwgJrY$jOe4FzY+5VIoPpgWZGm) zq#WMc5^K>Fbau^*tC^1arnXXJdrLVQ7jf%Zn(H7{!=A-V@;h&>kDSim`xBu4GQnG3 zQywpG2cn;m~xasypr{q+}A;R(GI7SojZojY}GIr{)cpa z%KyIrFDT9v3s>>!k_sVP3yFJS7-nl_MFC{#YkUzB-wt*qdpe4aBEKW8x28$;i>yGgf zD&d%N2;+9O=jjwVv9O{`iFNdPV9gc@L^wxO!z|*{Gg=|%n6-N;%@*O9fes|T&=N6j z$wf5zk=&GsxD~kpv}T)?F0HF+=1t8zgluoz;tfd?+epIPuJ^X94Wl34YvTzM=kPG| z(H3-)N9XZqNN_Sy@Fc-cuBmXY><_NfUC1H&mfY3kld*2iX`!8eDgEpE-+$(TrY$*{5N8MS18Gnj+)G z=_JH>jGh2N4l3XwCq!&#s2q_jm|GY|$@b{54*r$tGQ7dd(6&n1ge_|P9QlR+Cl*Oo z{)2!TXAGbex}NeC+o!y;@WRv0@JPPPsKm=ur%2NNCq+vk~;jJ%Qp`e;hI zs<%C7r-|m(9|bc5^S`XcN5P9dV0f6vAQ+594M1G`=Tgwwdv?)X3>H>Mk`hWD;?$Fe znS;X6i4{lD_tDWU#0nkYJpePH#w&1}amrTD!K9-mj>tNNGS4 zU;1WwS$cY`JWqcBVC6kR68Z=o5zWumPeXE3uoW>!{2xJB!v9@qVh0YnW+Zq1=T*w8?wI$XI;at+eV{1vL zMj&9IgNew>eJQChMJB}6#Am-T1M};_{FAXUQ+Cn}9h{?pm4B`VKl_?pG}ss^Sd~x` zxe<^ju1W)ItW>3CfgP+I&D0E zJaZ3Vc02R(Eyj)4h4Qe!TsDb-IqOCIk;0Fu({NvVdU=>{mZk6kvF;V=@5MXnRn|oLrnv zY%@1--e_@x4w`!P@oa|(*^=7cD{8W}&KA-B+ZH)i1F)G?F94!OvN&nvBceSc=QJc8 zt5HlzSc|~~B=Wq}3|vOdsdEabBD>Url)n=6cVWH=-~A5^UYya9$zVD-ZZZ`fUnL_V z^CWA}z#**ZH)f#c%)xcrW%S(*Kq~+*L}(bTzIt^F$frc$l@~%2YSE9O^sBqlcnZp2 zYlGPs_AsmGGYK{-Fcbj1b?6ZVhqxsiaf>8zAeawLt`FNjis7BDQYde&FihgJJU{vw z`u6Zi+eH92R1NP#{ol}^bx9UbM~i=Ws=6Wes48j>h}-~k50;AaIJ+t&~}WKtJ?z) z2S$WHjDhDA{{}MOGO;QGYZWA6kQGzOHNeV{u8OBE_z_ZE;4)JWa^GayE-4jC72v^$( z$68i+Xu?l;ImD`TU~u(@IXa=7vNj=)u(L)oQLv>Z$j8=!ZumNyZ9mCR__suWQPi0} zGOcsN0Jv<$^cJRh%jJ;hreRXZm1CZUO}J$~0rD029lyNd{{)k}_7l5!^j+w480MZw zACE#*N4!>^D(_TkOhUh3*6<(w9P-u%yvAUVy2L`u3q>ceTgX;AYpG2w$5GUxz?ME# zzBVB!(KS_o)M$ZfA*UhUtY(6RC^rK?$l0BI#3{<@5YXZw^MqM(L-vMeK{9xFY|+_F z>^7w%5PopTs-TGokBL{JlPL*NZGkFEd07FE z+k6Q0$3F(3$lrxoMc(qeK`;XkeO7Y37&Dm?2#{W~A}8M8$t7M zIL!-93R`MUA^jE)xq>JFTh1#49zH^bM=k&hwi7SZI&&S+)bN=I!zSc|uXF@&9kVD= zS^*~dBo0(209l}n5EuvL_F$Lryy``tV3p-bpSn4$%s!FwO@N z$W_7?f=}0VpQyZ^2{0&}_~7S>m(PKjdkjFfAx_U^WN)++m@lg(nA`cDQC1@*1MrX; z;x$LRj6shbB$%{ScubBSFW>~2?t0M*)TSsTXAZH)ZDp$q@?|f;{m+4==thkixloDG?F1HD*xV<$`iZ57}zc31L!+Ak1})vd7OVVf3jdQ8a2u#0VQ0Xi1RM zE&_p28^ecFQ?`P!4nNW{D)h0Hx&5O_2oc+fP~b%zjSU`K#f{89!k(>4bIF|7r(L=v!XjX;lxyoHOOzq2 z?)@%*C75AoobKpDb3 zL>4>~%}fU(7CLd>aR;ixrrHA4kT?Px>$5K+M_J!b7lh<)J2Yc8*|ypZQ|7au8- zCmc~?&T68IMhj)Tlzd`P2*u=+YnezPJnNKB0NkM(nwb1SvbRs_6Ua2~!taPK)w6Pr zT=dWU?;!jdaL@aqll|Q2VdzZr)83vQJp++k{jpFp(9OR|JR1?Bfbhgab}Zbcq<1%wN8Uzee z(6$-~k?5#Q`>jZDR zyI?rV_GUH6GzlwxGN_)d?!_rw{f(H3_xCjk;hXrk5&$cg5GBGJO~rgO9cp?Um{F!9 zAzC+-#2`AdKQ7qC0Nz07G}?~YzwweoZAYkv#)(W3vHfmQ*@2f8;eF&{C{W49`ZYoa`%+__V5Qh=!E`^7C?Jlk1< z!k|`zY2M~B`TxJhZKBH?&S|7{&coVAQOma1nQ4VEaX5rdHW9Z>N!bZ@Myb-+8r7Z8 zH@9-=I_uP3aj*m)4D=GODbF8GJ^}u~KNCMQ&n+Wtg*@%Erw8k$CR>K9m2519G#>i ziQOX4BxIEdItGcRXz^+uL#6CYRYQV?nujr;3d6&Q`aMoegyRT#(a|2rf`1KR?)^i^ zlaTH25c=1HTs_H>1*ot+)HEa9(cKt_coV~VOUTg7ZNI-Pf8{T^KU$W*Ui885zb?zaUG*EkKV6r9xi0^4)zE{Ogn!`y_(Q%O+uM#c z%rY2)W(F!&g&Q9Nt%Fc#NeU|1N*TFV@l&$TeG7d}OWn(KG^;)G@0VrJ^j zArFVgwfc!sWWFgZ%QwsN`LcZB--_^~ll#RRZ;&>o+gW+DFrv&r&$=rsqtDZi8Q5b` zl8Mm4iYJ^AmnRGofuV-Q=s9QGIa)z-GozAqN2wUA3Tr1?;fuN^y4JG7)yRd6Tm<|p z!AuxJI~F>USV6N0@{48-PF6{fL*_HAWazq`rWIG9Li0?l@+r5-31_tFZ?FZUx)wa;z?-! zcNv50_KQIRVSex&gTWhMV2*L+dr8DZ7bFx`Da4BPXp`6m4HTy^;mNd5TW6Exv~(WL zhr}1nU4K&HHm>~JCng^_N>j0#xOar&dyT|vn<$(~YIdTnnH!090*tsY^BVn}&TDk$ zST{Z$MOlRKX}7ULlN3a}8b6#PzbEl^f93BBd`+OE-qCwjR3+Dq8K@jo>G)`4qL19!;bGj7y(u;H>vS+| zE$2weO=x|1$8qcBP@pX!WlO;WOoS%sPW)l?0v#Vm_k}gh+Ai*-e4cfbHC#BAYIY7o4)cm@DMrV!Y)V#tZYfMrB*+#)S2-a%T*C}X+t0;Sa+&VH?i~)wYl<3F){PrD&*s^@z-*$hnis5tJ zKVO%BylBw<6aIxazvc4>zkkF4wER!`3cTnSfcgZ;mtX!tgc<0!@GJjw$y9G5eH+#1kEbv@y41y$?9w3rbLq@I*M2no!*8ShRddQkA$N>4L_|j!U2!;4OMG+ z>g;N#GFyU1tLH%LI>erTAoG6<{B!@_c%=`yAe{J=SA!Z2eDX)8GZVu+TbN5m-@Hyk zkI{E^|7S%Rb6nw*3M4_Q2N)=firHkfmPaj`DLcjF?Xb!u4vl#(a!w=Z%A`tIF;B=M zbaFv(h%4ppG6oFh$Y1@~sRmCzD~TYKJd9VJI?a>olZuTHRMJPRoVF&;$qR2e<$=62 z9qll}C}Rat!;}%6DTq9*HR2+y6i6iH8ae@Q&jOFK3#dX_bF@&>N8;15x-!6%4wQ#% z23OoN z>5Y7`EoU2!&e}VLtiCQnquFT&bKYaFfJ|XV zFPWDW4vSKXwAQ>HQFe}uJ59n2Lp~Ooe(MeaGXMrE>nj}a7#GZZkDAeVrFLL?Ag|d% zXVR!B2P8aW^Gp98@2~iSF8|k^-}(<5`1cMb-e2$!9RAnd@6@Nnzg+Z}&;Nq&#q08~ ztnfWPJ@QY1^$S2MPn3fp5qD=)8iO8jMASS4gLTHK)moEN2;}GhRhn#>nVy7$Ve20U z&%Ps8w&YH6AeiPOiLg(Hj+F;*lNdgl-^sV_o3VglB%pc06!~ zulQnuIr%y3T}SB809RI8-F$xnysYExpZs$5-t9SAG&WjVv^YrLX^Ke& z;;`MON)%yK08JALQRY=97ZSuX#8`lTbzIbf7GM~{bEM(pDaTfXj;+RE@ezD$;{P0S zxfG~i$f5NSW*qTM@-2)PM?^vL8k`AzDhzBp5o&_+fP{$&4=F`fmDg$ms)O$RQ*Y-- zij`_xwgI5r5n_luD{A(f9y|JJvmSh^tLJxs{3!IN!F(oU{qJrSFwe!IbVR{Fu8!sd zKtU}(c)YOU90gX|6=llB4FaAmKP-O9msWplgZ~8|1y_x=@A=c+e>L+1|G~o#nS^{| zWcvA2;=f(>d2n1b}Q|MC-KnwsdC0KghRdY2qRDmVXqU3gna3HZbVFMIVCANAUCZ zP5mLnYBGEiVT7BSO*+I4)XEFY;3vUY1&mB+)Osv1s4@Nc(fKp~;V8-o(E%H)lr7#jYO~G z<-Ol5U%0p+#m&ln`A^rr@muBykm*1GsEiH@V7YY^R%PK_0tU<|hmefgE*pceaf0ON zOXo`;kPcqK&_zHwxkr*x!$-(z?g$L{f$(s&kffM|P(Bd;&L0c;D2Rkan$89jhoAxv zL<+iA$jymQNOf?shec31<$`u*QUT&3=le2k{5b>AUx)wFBksHWD~Z1&e+lDx_#gOo zyz1NWcl_n|`yQBB{S*%_CXmREDAbnFJIB)M5vMVT(8SPV^zCc(iLn}|@X|40U?-8R zDHrP#;T%y}I2>EzhIC|V2{jSVT1U}ut2X&xU>vSJwEx5cA+=?NW*FR2Q}8^ltpF2m z?cpZe41g#VNGZ%EN-3-`9J*E7dGtpmZTPgfs`#I*xLF#QPNRk3(V=a=^)G=}-yIS) z09H0chb?WXhtqG_W9>5cv-#^Z2D{Huqt#D-=D1Dntni5f<`K)19F1B9Im&?na#LDV z9;~3;eMhY0BJ3(^UG_doI9YkB2wNtM(+n!5>_X{bx&oLJPBSwZSxAULLRlrM(KMJ8 z4gFYQ!qxE0c7IS|*6kevTgpWs?&2H&F&oT256zc|HxyJ!{M#q76wZk!kyHcN!sAuN zS&Gb~gO&2NAG(@Azw#?i>5eqK&G8dgy~@Awrw$|{9bZ8L$<`$$#KoQPcm7iRJAW7E zSAxtyJ_<4hkwaIjkwOwtUcjpmam7lxnn(x9hYETC>XdBK`GU`W{4tDY-S_=>fJpd` z%m+M1+~@vRkAKgewPTT2!yqEjw~5E4c+15>;!V0NUm3!k zdDiFv5*|72$D#YYHvv!Z%;UKt{a2&IpDOR0easO{fB9wZG5z==%&Hma>Bj(M7+#&!$(00H2wNON83V#4%$=VJ1s=No_R{i{{~c?dslzV_(*!hd0i4$i6V*=`lf zK93Bsnqx48VBMQw4nEp5_ts4gj{K7x7kXb2xpH@O?&1`o#skUNl%P-R;%1`;GQ zRfrLbxF%YZ9t&Z(_isPw8Gb(Uy^Om?0ZlN3=~X6v8Z;_R0`U^*UbOuS}2-QK;J2+J}Raq2$A58H=A^nh%@3@ zMTca;%;{^tP&3j`QgteYMX#76G8Ms?e_0fQ0s=1|x_+_x=Z;?`c=C!h0sL4vRFd@C%%NlJ(%Cu$`&D3Ib!8#sKMaeTO?15Mqh{&k~`@) zA-N+RxkQ73uPq+LyCvXzJ4GyU0CJ+o9VXla=Vzn|>yoj`%9yk-gO@4y$ z+@Ou=9Qv6qf?#rlX1Wwxnl_Mh%Mi}japQvL_GaC#JABL8n!j;E-AWBPDad(g#v4hs z+g3(Rya|NLs0f^x;DoG^D+Pnkqhp1XzA2}w41_YLtY)%Jrt~?Fj%qXCcyzz;*Df9r z05ob$=%f736Y}RgAD;?5cHeH*5XDsnt5igMv<>YDb30T_TW z1P)dUc>IryT#A5XrDF6|7x~DCRgY^vPtr@|7){V(4pctuX$BVML*SK@?1)nN8A|tl4iiz*^NILv&^P)eK{(8|21SIhGAu=^o)DUt+ z;&>R4?3^M1fMiJ!E7qM8WaU!E>I-595(_^t_|d6JvDjKN;yOBNA=KpDU{H8=jzpw@ zojY|P_uMRewn)$sxloZ0P3uVC;PKWp3;Q&}KWd#kcf^fxL~Xi`ddd&HHLmr>qqkx+09(}8qL zp2>*`uns!=F>0lSOfWe`nJ$e7Rwd#PH?SR%mKHgjf;N><*{vmSrqpy)!tl5nWW$&b z4~{j|{9u!pk|I<40VfzDN78Q%NqACg{V23tB`P)i9Q_I8r+$?`VFvPP#1He}8{z$i zV$MbU%sMat;Ha}efrxlMnW5kpa&%Rllg}?UCci{cnOivwQ`_5d&uCFK=^@+y4{X+=G4cU_oMn#XNPXNKr% zHTF8TXr`;_QVNB`tzx}(L_!Fj!vP@CqYQvB!ZQ(DG?Px8&ypO;A%Pq{KBF^Yx$Tu& zsGcF3N0)s&q5>!<{nA$jERQ(~VoE1lu8(eC{T{z?!N2vEPasE%6LRix{=|4>w)hJg zyz)(shMGVpLZrgZ4zyiWvXg$9Bw2NZCAt^WCD*iQ3(tzrjhq*;$W97A!qwin9Natv z1s z)_8EGD>l6@iY`Lm4DJ0(PeLlGk6s?&^RvQs)3+0P#`AFsz|S!YB9nC?@gHE4e(|Ck#Sui?Z#t zO`4fC<=lSmSLB7Wbz(ScwxoT6YUZD)Jiy#n;U8C-gwQl8gaO>gLM;l$#zl`pxwX=XXT=w8dguo#cMpL$FNN@E*={G?m^MEp8CMVwB}6R_Sx3Y&PdFm>+sX4GH5iI;fb1;~ zQz;wa*iwfog$#WvNeN-%5X_YN+x*w8{1KY}NP}-``~c#p4TT32=eYNc@KOLk)_@`F zBPwzbCHj@my5^R*%ucNLo!`r)Ho#&npY1i(ot&}OrWw7 z9VE#DeOzS#GT$&{9tH^tXu{(GE5%(0{=L8cv%VxLuf&4l8HV&R#2iEX{{u(f>P~$s z{S@48QNtF8M^}{V6vH}^db zJE9+bM?4vBkX&E@oIo^Qh6V_gAg=63WicUnb%LZk{QK{&*^ZPKC5z5n6Qxkm`JBc_ zL5M!z_2dDSD~2IRhys8E6AV1QdVoRbguyVxDU3#+X=Ctg=lgXL*;^!Pq|%4U=f-#= zA`DTe5=Rt=T0wwOQZ5uLJVhG>9|hzl$t~P;tc*`6!Z4Ba$`KKDROW-Xc^gJw%J!CR zcSPFsh26TXgBnNaPyFDP zHJ6J|ZR6iUoD)K7A)g9~(^R3HW}Cp=Tmf4v5C3+xdBZ2CR#09i$8?9(D5i{KHAlDrx@4hbFq{DTMzSgBT| z>9#?C+=ZRMqdjF!T?8xIRb`O$5ypg^4CBPN)wO2rJ4(Qe^!?3cf@Ve0CdT<&*+$)LR>FI=5CW zZ&&iuv=-ltk0=rPsLfW9+`~YvY+HFSF`t}B&emn8@}WrXS2Sn0whEpZ0Ig1ypmAg{ zk|1}hP)}L{diAC7FCbs?>nZ=Upz2TA6Uh3hZ5+zn7r}}xM7N|rc{pLxt0y-tJq#%p zt6LE@X<}$3IFuh&Z{<7^GdP!;k!M9;7@ScG1+bW~>eN|p{b2JzWkn|xKb@3(0>kM9 zFl(43#nI7Cd$5xe?=jEZ47?;s)7hoG$vSI0B-RrjLh^Ok|DD43{Za61o=H`ym8n27 z!iwA6o5=1AIot*^7+lGeTGcZcc{6OevL9T*Q*$uOmA#QglEpJLGBU&V(wdAxJ_^ zlCpnN!&}s}`iQucm-eRe??P-nf|zxDGH2Eut&BblL-J?-QT1-s)Z!)L7AG(OmLcmc z?L5c$T*v7lWLtPrX2lOCTp|k0I`k!B>(*kcQ*d&MzJ+W7^JGd7+)Mz!)0S|p8&L|^ znbSvw2%oLcYB#p7Q|oJm50MCrR~Rtx_G$i=zuE8@`~jcC`N&~x z_&=`7Li)ZVbp`Lm3akXZFjxp@pQyorC+h|vp%d4ki945tf?%seFpmePpmZQkZObap zMG1Yqoq|bz78QK(3pW{xO7gjiU-z&2A=xC z1W#Twp~E(s;d44{tvt(T+s!a)lb`n!FOve(fd+$G2n85c;~7!lAE*-%Go^MTuY3`X z(2kO3X6>K}#5O`HG!J8Xabs|s+%^1R)gOp{%|C^}a5cW}1X4k4KAbF@TMTKoxT3+- zqNeTjrGeeaQ8=T3Cd85D0T3kcVoYk$=lBPSGBTY2V*p35@Mpj1%k<1oQ-W={*<3h)&U0BaqxTLg9^`tK2cB;7yu@6Xl?Niatcy`1i;(7DkWbuQNU1y6K}K1 zFh#IiPCG8lwLXSjk=rl|{0oI(m?8m^7@OmerlN-Gc0UJJkbw4uvcm+bQ&1K@{b(e? zgJ-tr021CMI_}0G{(u*)=oFuLw zS(&2{elUTD8A5yBvwDIl(6StTinokSOd#aL%BLBFI*P4zxP5FfjFYF-%{A0WacX0> zthF_hQxtwb&0`AwhU}ax6XnQEg0|*|>1ZgUW=(Vy-Rl#WCqk$#tC^%QE5HvO)QS?C zh+OnW07%3NDr_jAR!3?0t~rIR4S;eoyXxrkBce0aqV5xQ zOA)=72Ie88hesp1jY&cMZwj_yh*f!jK|zU_5;VPy^N@7h_Fa>xvCfjg+gmb{+s@G* z0%o}N)9$AS14#67OBN?T_H(`NOWwZaqZ*a6wnac4buf&*KMH=uf3D^K9jDK^3;w;B z|89$WanE!0hk7PEcMAwFizWc8m?H2H2m%{XNC8H1&7?jr2A?{R1r#+I7XCn$6Pss6 zArU+7g|EZ?yFSOo146!>0!a>SGI$?d7Wt%r$D;H<89^^#Ta5=b6I-Bi?_86h25l)b zY$3)VzYP5EE(OTt#0nUSSxsg*!qw43saF_!p2F^UVva)3!}H^YvV)U1sOVLVQJm>U zWQ!B8;rnAAopRJ|eLTXXh2dEp4taywASDang|dBE@AbvK&v=4 zJX{^_%*b+3qK79mZt)-FDvP&SgM6!l6G@@a3^4FRH%{zC$%BmUj zC}WNgNb!#qYOGH#1@eRWCu(B+Vv3g}+mgiUQ#vI322q5jRzT8xGZA_v?ogPR4NTzy zAz%j0d<%<7cD=?#QMes$*=?gc^=0W=Lsl4I;JH)CI+%#)u0^dd4`@KY3+DhtiD$lAQpOE&8a1FxOkCQ|N{XgS>$j<*X%=$ThF34Zb_!sg&_Z{twkWBG^bs)lBJc6zc9iDJFd?9_18$39X zh%BVSTOE)Tahe?Q56RDDDBcRBHWXH;#)`y9F18v@EKD8Z4S5_Qgion?n@z7lvItTD zgFmxQatn#u7rnr+{dR z&wVWdKkCVV3Qc2Bl2x?#k1fU^%--WGLU?B8p(GO8WPE+bmVPi1_vkSw4_1pN-GZEz zf;<>p*0kqwJGvXuefSkDh3}(hY<6K$FSeVW)GWr*~%?< z#|`>k#?AWf6gM!uMl&8{LJ#=fG0BC(PM*KAxJP4Kn}vwL>JGZGtY1m4n9KGWQT%zPH}?6HGd?-7&P;h|CNO4 z_iojP^WCDhCnCk| zCLs|!saNMq%1J!UrqhyeG@K)e+^AF>+YS?Ftpv?}#uY+o#+H&g zaSFT9qa>%uKTXfMAS;Mp>WRUa588kMPati=n3Qt7jdc!9FaSo1NG#`&U&tg-;#UAsgak+R%e_z1cUCYRsW}rpZP!1;bZx?9*n$* zqoINX41~y&zxE7d2=r8>8jDj-;#rNEEJDCe5!l9OYK0+S8kpeO+Z%;-wb2JTYFIVJ zgd@qb`V`F<0FWtUb83hL;tEoHN(vq{6%ic+4%8GJ1xT;P1>vUf#^}3N1u_ONHYWB%6I{@#OVm+9o$1usHgGcYqPD{|;)9R^*t zXu@dA$g-6_J;J-&!9a;H388?pOsoI^Bu}m(`tYd1Jh7UQ0{ZdbHJIgpkz8t!P2N)w zSL3})t@Umj2|~*O28s7QhHqh*=QM=mb6 z*(T@+8@5)Cg08h1Y|ks>H-Y|>m@oZN@STyU4iqy8k(dyEa3Iz}NE~!{hPQK2%~3d& zAy%#LEfN_P9@>v)Q)`9XX?YIA)|$9NGabl#*~sSUVOg0}97h*mN6)pA5yer3y>bii zeH{o@Lz5CDZt_}O?K;AXJ%PN5nRmt{E{ByInV|HtdT;D?d_AdO$r{>m@n zV2}xi`I#rr!>?C)We$XpxF7%)W+NBhjOAoRf{{~3qLTuNP_ckP0x2UOp_5{c)kVPh zD^}>N!Xy251qN^B!Ke5~Sv_DRu?;-d`7XGfj)h5dFx0Iej+6E#ba)?;)GB?Rv6j&Xa zQw*QG+P4h#c|S|onufl4FtFXo-kw=!hA2iWoMw6*npTc*mUOsw2yA%WVD7YdK`k0! z*wQVf5Phx~HGToe0Q}rvzP{w$`A;&AKEgRLIvmQQTL_m%>UOGa6lf%zi^BMn=pXEs z^$xJq+}(VEBpgtWMR3VTQ8xF^4b|)QNP7bsg!GQGb#RaVbfh z+^w9rAQbFmQDwn1A&4sg;Q2J2TLGqcgd!%7J@eCt8Te!VMVQ|WuFJRn9LNmhlleRU zDeu7;lqP{Z?k=o;^86kwbmftzXvQ{R+y4tIWpVm@zYEeq84q9>#1&L|IZ{SQ91%m} zihxn{Y6WycGC|Fnl5k3PjuJWg6b*BL!N06x)TOK;`%grUP(Yd6$0~Qn^@Y;g=#Vlq zkkLm4^s^vi&=|<2108EV90=#o?K}*DU;t0_QG_sL;S|nQrBn(>c3fJGAFSh0#SOn7hQyea-` zOIZ>KVCfdE202XD;S^RsHmMcYH5K2*{4BOv_wO(md`K{Io;K zeTq)}6QYUJ*bWcqlq>0ghu&N3t(i|NBGgMk*)U*883|oV2ZrcFF&0YMG~6bTZO3h< zXsq0bFD12tKe}gFNuO=xgj4$E7KZJ(AoGL^@?ZeQn{>_`2vpD-aD-<+VN&~*KZo;+ zSw8-;e&v4=W(K~q{HsO3wgnyl1kbbO!s=JwGmr^zv42VgFv>_x1|jhgn8}fnQaY4H z#&8Yq6;zONv0A*b;tF$Js2Mp#({7U#D?(`8OZ&_K;RwS;P8t=ibRAyFj#Gsr7HW%Q z-LB}+mf*(;QTUUX-+KC`2t5V?h93pOIi)k{asgk?gCr|zfrJ&dBmy&tZSb$7Toerj zXqS&|UKw0FKEHWI4zE*Y3&O~~Z3UQp)T}8JH{p{3b9%5`IvAqtVWsx7;URTfR6Vjo z8O`A^Os!~QOY`6dUhAYUtHop{%J_T_xmLPs7o5652nR(60EVR1V6w%0lSJ;ksQ;r} zhLO+fEG%1@BQF|T-*WDeb@(^VXm&32gVfvr2>B4mTl>;~7p(zE9pXQUSF%bxSyxA? zRm>xYwqCXWR4jqCT1Ulv>vS}pp9Zf(&&RDBW&{EN1U3^w>9|X2!i{lWxufV49Vjv==beAhN@kka7_+Z@Fw{=uV{;%9QI^}J{@+>uU~BHmOfTwFtbAIQIe z{35@d;D1JjKUwDwr~QM8&*wk(BxFu95?N8^rC@l?Cm&YRH8Th26$@;mq%ImkvC0?5 zO91e$LxpDm!->(7T0435B~pQdTY`+_B$})aD&++A79lz!81o--!X;YmHMdp`Mum|R z1^G*^uWt|?Bqi6C!TaBWf9t;w9Dg3OjE{oE0(qREhEL++96no)#3Y=L0tx&|xg}2j zM4HLMiI5Z$ba*m@{Csvb>zFg}*^U9|qwsrjiqpzv6UK_N$BmLYj|wMW5uLB0sKFd`Tes9>Jgjk3KF`r$~Y zo)64MmTw+f8TlN@NySNQRS?%C81&c;k}V2Ag`yv*tVt*LzV};W2J*gEzbquj1ht=b z7*}$FJiU~*p@mFayE??spPZyZz5DXKN-xGf6&xg!LUK2Pe*R@_f%%!KIh1blbIjF<+ z7sd-vEeX@G#l+Sx9eCuJJE9H;-j2&c#Hh)M{lK6JDwMGz)419KSpg@n6S0M;Gxznf z%Dg2Ja$l64xTFk2?i2(GJJB%HUw!mZIf|m2Kp#$XTgjE;L7^BgXIO1BG%3Zb8Hyncn*)W_|WEfrkknMr#3s z$yUrnfDH1O^mZ01iW`G<$n8PO_OI1Uuqmh&v^BPl9&>~wh1+-ejT4^+UFtn`u%Cp( zd~}HYux+_oH@$=__-IaQQ6453rf93H$2!qyPCJoLw_=#N2|=<|*f)X>lqbe2iY>7w zD0t327W`^XelHSE+Z&;u z)!Aiv=U>l$%@<++z4TZ99Joux-0IB6zxL^`-PJshBQJ4TuAYRvP>?`uFBbCAh*5wX z{{TP;f6dG+H3`91I;a6pXf1&s6?P(+vrRuMN;IvE+mKASQ?D5v!<*HJl~d~WnyaU_ zl+kym_Mm56`7S;ev1b&xS1Hji{r%;0{{n|CA%H}t{b_K_Kx0!Z(?@p*E5H(Z0H9)q zgyu){+v*gMLqwq<gCz0$0z6yzotgZ4FgmP^IOJ^$!xkat zc+M#j1+saZytfrX+zLRPBwTG3G$zHM92g3Rn%4-CjIC$LGq=#!F);`?LbEOlCj7?u zO=YXK+(z=`C$V=BiBMDyW8A1I7w(?eoc7I*qH}GXVV?cve+7 zrLb~3kXB6RpsePE+&S8ERILJoT6EIGDcTHJSp*O3L~$i=iyX4jiXmDWI=T0dpwn5a zASfF~bm&-hsn;kgaZIM%$JSkxI!Mw~l^n${TS}Mut7s;9rcYe1qpeWjs0$KEXWmQE z$)h7H!n=Jjw+Sn}gdF+eK%%RO2d|w7 z!WZAT)(~Y(Z&2Y?O?zZ@=TLBRozV*lBAMu~k`2PU?XSMF5`O`BLmH z5+Z_u)4w$X54|p;7q8+GPN%{=>5E5VCwNPam&H}`(ZNkcGo&kcN_(b?$BtGrJTYeA zP_U3~-W~d)X&YM^MrbCk+9ca&s^o?YLqFh3NNf@hGalrS)KKscfQgmlCO|$FQF+?? zJ&pHBEr)p^@L=17L-Dnuf1`jrguDq!co;|jz(qS~+X`pvFM^HdfX6nZ*xscW^|ZMgV{ICVBPPt8(kPFC`yW`5Zrh}g|%r2vk-x7ELe#M_LEdH;m{omB^`vDxL zILzmp8A#Dw4Pt$CZ_pl4LMtx3*FFW9$bebrZBif*X)2u4L5Euds%R1IL&(kS!0!|o zU+5t0EqRU8(iyh)lX1tWq|>BnZ}^Wnu3}CHriQARb&x#aA+c=8(KGs%NT-ez&ho&B zoN$;w)vI}56XQL7-h^=}ke#W~@KCI3!GFsy?Fg%e~LvZ{9F2+vfBlu1P7`lPlJ zu9GD7tg7ZZR5w$uDP(D16e>BSHK*r$SmANdMOCfxU@L(s|a=YJz(4dq8&L{5H-T1T(1SV{C|Y7A3SeM}MRXBN0I=c#^fk9I#TS0P5WL|t9rR$K>b+qU+-ROp79Y=P; z7Uyzn5AY-C6a|n9%4)(qPM&xdc*g%D5jQj+SsDGN0F#qY9Z8O%*T+*Ngl>|8m6Pdg z)jESgvusiO0KzE>I*CPg$oXdR6aP=ueaSyW@>#+~Aa_*{D;I%oR6`m7-e?&5VY_`d zkJ`h{qrR$^P8;I{E0LMr()J=Z{8(+9p4=qvOm(2?6(^XKA>jxO7@CmQ=JdJxHK8Mg6oL0&WJ zx@r=#ieM(X7>{g?oS?6ShPQ;%_|Gb30zo;g5OFTsWtihZ1+gDo!MwOJSU>uRD3Vmm z^$qS;)r1dwKjk+A{u_oL`OnBd_ZJ!dScof*TUKC<8R+p&zQiJ~)*=E4)kFahcsPLu zk7qlV&`wxU##^pWYud~(Kmu`zdzi>A*}FqX1ZEI?ZIM47A<5`dYZYgv<&ej{`jeKN>>{^AFS=7(jA9-dWXKQA=D`(OG+b3>vQ9fWDcll|jiler%HNDmBx1UEu1Bv+RXU^{=wWxjz5D|8?k!h1`mfP}~zAvl?bTqqxwxW`NB^I$J* z?+77tEX0v#8r%MGc#VEJAw+J3TmnE2V^x|+0+Mx{+CP{vhd$0VaUx)Q@##m87o5W& z;g;u1Ir@>(t|XW_|21Qfe+uyrapV+%n&3?Y!sO+20I717|5q!3B#;z+BBFDI2O%-q z@V%0IuAon~HL26wUH8rAk&+|s1)@X3^g1NS=Ob@9V*1exnt@*7Lz4IiKXfBSpitC} z>Zvo=(UTk@=M?!%*$yX|x0AT475yiB3!`o?dd4~Y|Hs(BFxj~rXJYR9smI}n6XQ9a zi$sx>C`z-$E&HGw8`uB{py#5o|EiyS->O<)H#TKOWMpJzEXj))%jChUcq+NCP5{sTVD&SXC*xGOuA~a!)3DsYeCh$ieMw70F=o z__cmJ$u+|AEi^1~$KT!3cYg$AsAM`hHs92lTuS` zv46k4PXK);#q)>~s%XC=uAror#)g+j^1{fIs8VnOOC{=BfCJP7{rz^MMxge~p8z61 z@e~|IQpgo+pm83$mM6&iVkfXT_uF#@OsFQRfMbvjc2&C5g*J-fUyycd+~LgaX5u^A zfo_M`$8JST!>LfvAr;30`l_|Wz{(a5tV2~VjZ#k0&k!= zkX^wVVy;LQa^#u}%ykooKdF2;f}GgshByY98i>>WI*$6M#3mAS)kkrApQLIn1__Wf zc-m(y|H5Oqra zgHi{y9u24i-c3R+tOe+*7B+Sq;o|!v{s}eH__LJ$%9{{~d! zKJ|Htz;FV`SBXl(w8lcV*6gmWNX#w2Us8F2$yaQMl}KZVg&KiN%tnn_kx&PpOC&I{ zfyt;Acs~#=UVQTXA%9@`4)pJZ{x-kBQThKK_#at=yl~fA33YtMY*Rzm(ZLm1I8imW zYj|^;D*-p=DLAOLO*C?KFgb;pjnH1x1G-qs$xJ?-+Z;QnihGZ5n4{q|FSO!fx^F(oB{Ns9}0z(E71 zgojht6GP~7CRFLC4&wY4P`$z&6>Y=!Jo#cT`Xy#1Uah{nQ(G2V-o8pMaI}LK3v9xU zHI7)v>=}}54s(O!gDH&e!0fKI2Jg$P0KTNcP5g6;Ke`vE<7UDf?6P?!D(% zg2oJAcC3+Uz@y84-2KuIn+(#-YNswlpTJn&lx3K_OH!k_kT`6vdF zq@d7X23MdXBITm7b zv_d!vk5e82LZNULQ!sf-UW$S!8Z2gjP_Zdv;XLGQp_dqBjSS(w-%+XhHZoVY+m~QO zy})41-UD&O&Oj`bKCYL|2vB*+;!;-f8EulfGLj035nPaLU?199zfXm)v_`zoJj}eAF1Q@b4Q2-2$uT?~tvQzO>I!+Mm4PXm%%{M+ zTs?5E+ybVCALAvC*v|w~ZF!;jBDOvP4{={Rupb6vCt~AQ3@qP=(~LgkEig4H=V_Sv z4<)(amrkZS5DMv%~klGv(;w-{(XMQYzKPm zm{0eqjHHhD+JwF9Uv>dI`QI<2KJ=cwnZOKQvDq+4Ud;n~ykfTG98txg>vA)lmfJXTeo&t zSRJ{zySiStji+H`Wvv~UEwt8PoK7$T6J&rXv6bfQ3Yb?T#J;4bpVM(oM||3y(jCW@ zrU0_y{x9Eqh|qrZ=aUca-kVLBm59md@in137R2c`X2tyH1n{LLJ+*372}VdF{EJY< zq|ekqY$DXqJj{gT1$A7_#th8n_x6Z+YhW?^`fQj$N9!s3r(&=P#6iF_mK)n+Wez8R z0Qf`XcCe#C1t~a{j|tDZTbnQfRjIG#B{r$oFG5DHeoip(HEUNN3$f3|fnP2(<_GJD z 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�b!~dg<8>Zb|`-x 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
    x@IJQX4vPmbkGIOm4)jjP|%p#%-MVqeNmpsNtCS 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

    E!T&B5i+0>l7)Ac83!neX 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 zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF X5FkK+009C72oNAZpc8@LjsN~XPvem& literal 0 HcmV?d00001 diff --git a/iris_grib/tests/unit/load_convert/test_translate_phenomenon.py b/iris_grib/tests/unit/load_convert/test_translate_phenomenon.py index f6e02516..dbb6f90a 100644 --- a/iris_grib/tests/unit/load_convert/test_translate_phenomenon.py +++ b/iris_grib/tests/unit/load_convert/test_translate_phenomenon.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# (C) British Crown Copyright 2014 - 2018, Met Office # # This file is part of iris-grib. # @@ -47,8 +47,8 @@ def setUp(self): self.metadata = {'aux_coords_and_dims': []} def test_basic(self): - result = translate_phenomenon(self.metadata, None, None, None, - probability=self.probability) + result = translate_phenomenon(self.metadata, None, None, None, None, + None, None, probability=self.probability) # Check metadata. thresh_coord = DimCoord([22.0], standard_name='air_temperature', @@ -62,8 +62,8 @@ def test_basic(self): def test_no_phenomenon(self): original_metadata = deepcopy(self.metadata) self.phenom_lookup_patch.return_value = None - result = translate_phenomenon(self.metadata, None, None, None, - probability=self.probability) + result = translate_phenomenon(self.metadata, None, None, None, None, + None, None, probability=self.probability) self.assertEqual(self.metadata, original_metadata) diff --git a/iris_grib/tests/unit/load_convert/test_vertical_coords.py b/iris_grib/tests/unit/load_convert/test_vertical_coords.py index 5d0a7544..dd39cd3b 100644 --- a/iris_grib/tests/unit/load_convert/test_vertical_coords.py +++ b/iris_grib/tests/unit/load_convert/test_vertical_coords.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# (C) British Crown Copyright 2014 - 2018, Met Office # # This file is part of iris-grib. # @@ -29,6 +29,8 @@ from copy import deepcopy import mock +from iris import load_cube +from iris.aux_factory import HybridHeightFactory from iris.coords import DimCoord from iris.exceptions import TranslationError @@ -173,5 +175,19 @@ def test_height_with_second_fixed_surface(self): self.assertEqual(metadata, expected) +class TestRealData(tests.IrisGribTest): + def test_load_hybrid_height(self): + """ + Temporary test for development. Replace with proper test or tidy up + for public consumption before making final PR. + """ + import os.path + here_dirpath = os.path.dirname(__file__) + filepath = here_dirpath + '/../../../test_data/' + fname = 'faked_sample_hh_grib_data.grib2' + cube = load_cube(filepath + fname, 'air_temperature') + self.assertIsInstance(cube.aux_factories[0], HybridHeightFactory) + + if __name__ == '__main__': tests.main() From ab83744f0284f7f4de293f5322fe75b2041a6f6e Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Mon, 4 Jun 2018 17:23:11 +0100 Subject: [PATCH 032/583] Rework hybrid height load test. --- .../integration/load_convert/__init__.py | 20 +++++++ .../load_convert/test_load_hybrid_height.py | 49 ++++++++++++++++++ .../testdata}/faked_sample_hh_grib_data.grib2 | Bin .../unit/load_convert/test_vertical_coords.py | 16 ------ 4 files changed, 69 insertions(+), 16 deletions(-) create mode 100644 iris_grib/tests/integration/load_convert/__init__.py create mode 100644 iris_grib/tests/integration/load_convert/test_load_hybrid_height.py rename iris_grib/{test_data => tests/testdata}/faked_sample_hh_grib_data.grib2 (100%) diff --git a/iris_grib/tests/integration/load_convert/__init__.py b/iris_grib/tests/integration/load_convert/__init__.py new file mode 100644 index 00000000..768f6918 --- /dev/null +++ b/iris_grib/tests/integration/load_convert/__init__.py @@ -0,0 +1,20 @@ +# (C) British Crown Copyright 2018, Met Office +# +# This file is part of iris-grib. +# +# iris-grib is free software: you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the +# Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# iris-grib is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with iris-grib. If not, see . +"""Integration tests for the :mod:`iris_grib._load_convert` package.""" + +from __future__ import (absolute_import, division, print_function) +from six.moves import (filter, input, map, range, zip) # noqa diff --git a/iris_grib/tests/integration/load_convert/test_load_hybrid_height.py b/iris_grib/tests/integration/load_convert/test_load_hybrid_height.py new file mode 100644 index 00000000..77ac8e1f --- /dev/null +++ b/iris_grib/tests/integration/load_convert/test_load_hybrid_height.py @@ -0,0 +1,49 @@ +# (C) British Crown Copyright 2014 - 2018, Met Office +# +# This file is part of iris-grib. +# +# iris-grib is free software: you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the +# Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# iris-grib is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with iris-grib. If not, see . +""" +Test function :func:`iris_grib._load_convert.vertical_coords`. + +""" + +from __future__ import (absolute_import, division, print_function) +from six.moves import (filter, input, map, range, zip) # noqa + +# import iris_grib.tests first so that some things can be initialised +# before importing anything else. +import iris_grib.tests as tests + + +from iris import load_cube +from iris.aux_factory import HybridHeightFactory + + +class TestRealData(tests.IrisGribTest): + def test_load_hybrid_height(self): + """ + Temporary test for development. Replace with proper test or tidy up + for public consumption before making final PR. + """ + import os.path + here_dirpath = os.path.dirname(__file__) + filepath = here_dirpath + '/../../testdata/' + fname = 'faked_sample_hh_grib_data.grib2' + cube = load_cube(filepath + fname, 'air_temperature') + self.assertIsInstance(cube.aux_factories[0], HybridHeightFactory) + + +if __name__ == '__main__': + tests.main() diff --git a/iris_grib/test_data/faked_sample_hh_grib_data.grib2 b/iris_grib/tests/testdata/faked_sample_hh_grib_data.grib2 similarity index 100% rename from iris_grib/test_data/faked_sample_hh_grib_data.grib2 rename to iris_grib/tests/testdata/faked_sample_hh_grib_data.grib2 diff --git a/iris_grib/tests/unit/load_convert/test_vertical_coords.py b/iris_grib/tests/unit/load_convert/test_vertical_coords.py index dd39cd3b..ae66d4d7 100644 --- a/iris_grib/tests/unit/load_convert/test_vertical_coords.py +++ b/iris_grib/tests/unit/load_convert/test_vertical_coords.py @@ -29,8 +29,6 @@ from copy import deepcopy import mock -from iris import load_cube -from iris.aux_factory import HybridHeightFactory from iris.coords import DimCoord from iris.exceptions import TranslationError @@ -175,19 +173,5 @@ def test_height_with_second_fixed_surface(self): self.assertEqual(metadata, expected) -class TestRealData(tests.IrisGribTest): - def test_load_hybrid_height(self): - """ - Temporary test for development. Replace with proper test or tidy up - for public consumption before making final PR. - """ - import os.path - here_dirpath = os.path.dirname(__file__) - filepath = here_dirpath + '/../../../test_data/' - fname = 'faked_sample_hh_grib_data.grib2' - cube = load_cube(filepath + fname, 'air_temperature') - self.assertIsInstance(cube.aux_factories[0], HybridHeightFactory) - - if __name__ == '__main__': tests.main() From 045244f9bd30398a9cbcc711b1a30c7e3643c534 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Tue, 5 Jun 2018 14:44:05 +0100 Subject: [PATCH 033/583] New test method 'get_testdata_path'. --- iris_grib/tests/__init__.py | 16 +++++++++++++++- .../load_convert/test_load_hybrid_height.py | 13 +++---------- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/iris_grib/tests/__init__.py b/iris_grib/tests/__init__.py index fc715b79..d8e2ef0a 100644 --- a/iris_grib/tests/__init__.py +++ b/iris_grib/tests/__init__.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2010 - 2017, Met Office +# (C) British Crown Copyright 2010 - 2018, Met Office # # This file is part of iris-grib. # @@ -42,6 +42,9 @@ #: Basepath for iris-grib test results. _RESULT_PATH = os.path.join(os.path.dirname(__file__), 'results') +#: Basepath for iris-grib loadable test files. +_TESTDATA_PATH = os.path.join(os.path.dirname(__file__), 'testdata') + class IrisGribTest(IrisTest): # A specialised version of an IrisTest that implements the correct @@ -92,3 +95,14 @@ def result_path(self, basename=None, ext=''): self.__class__.__name__.replace('Test_', ''), filename) return result + + @staticmethod + def get_testdata_path(relative_path): + """ + Returns the absolute path to a loadable test data file, when given the + relative path as a string, or sequence of strings. + + """ + if not isinstance(relative_path, six.string_types): + relative_path = os.path.join(*relative_path) + return os.path.abspath(os.path.join(_TESTDATA_PATH, relative_path)) diff --git a/iris_grib/tests/integration/load_convert/test_load_hybrid_height.py b/iris_grib/tests/integration/load_convert/test_load_hybrid_height.py index 77ac8e1f..6077afe9 100644 --- a/iris_grib/tests/integration/load_convert/test_load_hybrid_height.py +++ b/iris_grib/tests/integration/load_convert/test_load_hybrid_height.py @@ -15,7 +15,7 @@ # You should have received a copy of the GNU Lesser General Public License # along with iris-grib. If not, see . """ -Test function :func:`iris_grib._load_convert.vertical_coords`. +Integration test for loading hybrid height data. """ @@ -33,15 +33,8 @@ class TestRealData(tests.IrisGribTest): def test_load_hybrid_height(self): - """ - Temporary test for development. Replace with proper test or tidy up - for public consumption before making final PR. - """ - import os.path - here_dirpath = os.path.dirname(__file__) - filepath = here_dirpath + '/../../testdata/' - fname = 'faked_sample_hh_grib_data.grib2' - cube = load_cube(filepath + fname, 'air_temperature') + filepath = self.get_testdata_path('faked_sample_hh_grib_data.grib2') + cube = load_cube(filepath, 'air_temperature') self.assertIsInstance(cube.aux_factories[0], HybridHeightFactory) From c3c799c9b469e403b88cd3ed905ae5d5d9dc87bd Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Tue, 5 Jun 2018 15:09:38 +0100 Subject: [PATCH 034/583] Fix model-level indexing off-by-one, and add a test. --- iris_grib/_load_convert.py | 4 ++-- .../load_convert/test_load_hybrid_height.py | 20 +++++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index 0a253f5d..e0f645e6 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -1376,12 +1376,12 @@ def hybrid_factories(section, metadata): # Create the level pressure scalar coordinate. pv = section['pv'] offset = scaledValue - coord = DimCoord(pv[offset], long_name=level_value_name, + coord = DimCoord(pv[offset - 1], long_name=level_value_name, units=level_value_units) metadata['aux_coords_and_dims'].append((coord, None)) # Create the sigma scalar coordinate. offset = scaledValue + NV // 2 - coord = AuxCoord(pv[offset], long_name='sigma') + coord = AuxCoord(pv[offset - 1], long_name='sigma') metadata['aux_coords_and_dims'].append((coord, None)) # Create the associated factory reference. factory = Factory(factory_class, factory_args) diff --git a/iris_grib/tests/integration/load_convert/test_load_hybrid_height.py b/iris_grib/tests/integration/load_convert/test_load_hybrid_height.py index 6077afe9..8e364da9 100644 --- a/iris_grib/tests/integration/load_convert/test_load_hybrid_height.py +++ b/iris_grib/tests/integration/load_convert/test_load_hybrid_height.py @@ -35,8 +35,28 @@ class TestRealData(tests.IrisGribTest): def test_load_hybrid_height(self): filepath = self.get_testdata_path('faked_sample_hh_grib_data.grib2') cube = load_cube(filepath, 'air_temperature') + # Check that it loads right, and creates a factory. self.assertIsInstance(cube.aux_factories[0], HybridHeightFactory) + def test_levels_values(self): + filepath = self.get_testdata_path('faked_sample_hh_grib_data.grib2') + cube = load_cube(filepath, 'air_temperature') + + # check actual model level values. + self.assertArrayAllClose(cube.coord('model_level_number').points, + [1, 11, 21]) + + # check sigma values correctly loaded from indices 1, 11, 21. + # NOTE: level[0] == 1, so sigma[0] == 1.0 : This makes sense ! + self.assertArrayAllClose(cube.coord('sigma').points, + [1.0, 0.911, 0.694], + atol=0.001) + + # check height values too. + self.assertArrayAllClose(cube.coord('level_height').points, + [0., 800., 2933.], + atol=0.5) + if __name__ == '__main__': tests.main() From c6464edd07a3c48f9bfe117eef326d49b2e6ec39 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Tue, 5 Jun 2018 15:54:14 +0100 Subject: [PATCH 035/583] Review changes. --- iris_grib/_load_convert.py | 8 ++++---- .../integration/load_convert/test_load_hybrid_height.py | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index e0f645e6..4668abbf 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -1375,13 +1375,13 @@ def hybrid_factories(section, metadata): # Create the level pressure scalar coordinate. pv = section['pv'] - offset = scaledValue - coord = DimCoord(pv[offset - 1], long_name=level_value_name, + offset = scaledValue - 1 + coord = DimCoord(pv[offset], long_name=level_value_name, units=level_value_units) metadata['aux_coords_and_dims'].append((coord, None)) # Create the sigma scalar coordinate. - offset = scaledValue + NV // 2 - coord = AuxCoord(pv[offset - 1], long_name='sigma') + offset = NV // 2 + scaledValue - 1 + coord = AuxCoord(pv[offset], long_name='sigma') metadata['aux_coords_and_dims'].append((coord, None)) # Create the associated factory reference. factory = Factory(factory_class, factory_args) diff --git a/iris_grib/tests/integration/load_convert/test_load_hybrid_height.py b/iris_grib/tests/integration/load_convert/test_load_hybrid_height.py index 8e364da9..9bb5e9ec 100644 --- a/iris_grib/tests/integration/load_convert/test_load_hybrid_height.py +++ b/iris_grib/tests/integration/load_convert/test_load_hybrid_height.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2014 - 2018, Met Office +# (C) British Crown Copyright 2018, Met Office # # This file is part of iris-grib. # @@ -43,8 +43,8 @@ def test_levels_values(self): cube = load_cube(filepath, 'air_temperature') # check actual model level values. - self.assertArrayAllClose(cube.coord('model_level_number').points, - [1, 11, 21]) + self.assertArrayEqual(cube.coord('model_level_number').points, + [1, 11, 21]) # check sigma values correctly loaded from indices 1, 11, 21. # NOTE: level[0] == 1, so sigma[0] == 1.0 : This makes sense ! From a9004e71d2d305bf99e54fe865f521bfed876c68 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Tue, 5 Jun 2018 16:14:16 +0100 Subject: [PATCH 036/583] Adjusted cml for fixed load. --- .../tests/results/unit/load_cubes/load_cubes/reduced_raw.cml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iris_grib/tests/results/unit/load_cubes/load_cubes/reduced_raw.cml b/iris_grib/tests/results/unit/load_cubes/load_cubes/reduced_raw.cml index b4f27991..46e25cd7 100644 --- a/iris_grib/tests/results/unit/load_cubes/load_cubes/reduced_raw.cml +++ b/iris_grib/tests/results/unit/load_cubes/load_cubes/reduced_raw.cml @@ -18,7 +18,7 @@ - + From e0e3c39df8b8c462ad512702c75308bd1cf426c6 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Tue, 5 Jun 2018 18:19:06 +0100 Subject: [PATCH 037/583] Add a release-notes section. --- docs/index.rst | 23 ++++++++++++++++ docs/ref/release_notes.rst | 54 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 docs/ref/release_notes.rst diff --git a/docs/index.rst b/docs/index.rst index 36c49710..1796d3c5 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -91,6 +91,29 @@ using ``iris-grib``:: >>> iris.save(my_cube, 'my_file.grib2') +Getting Started +=============== + +To ensure all ``iris-grib`` dependencies, it is sufficient to have installed +:mod:`Iris ` itself. + +The simplest way to install is with +`conda `_ , +using the `conda-forge channel `_ , +with the command + + $ conda install iris-grib -c conda-forge + +Development sources are hosted at ``_ . + +Releases +-------- + +The latest release is v0.12.x . + +For recent changes, see `Release Notes `_ . + + Indices and tables ================== diff --git a/docs/ref/release_notes.rst b/docs/ref/release_notes.rst new file mode 100644 index 00000000..2b8066a5 --- /dev/null +++ b/docs/ref/release_notes.rst @@ -0,0 +1,54 @@ +What's new in Iris-grib v0.13 +============================= + +:Release: 0.13.0 +:Date: T.B.D. + +Features +-------- + +* Added loading for data on Hybrid Height levels (surface type 118 in + code table 4.5). + +Bug Fixes +--------- + +* Fixed a bug with loading data on Hybrid Pressure levels (surface types 105 + and 119 in code table 4.5). + Previously, *all* hybrid coordinate values, in both 'level_pressure' and + 'sigma' coordinates, were loaded from the next level up, + i.e. (model_level_number + 1). + + .. note:: + + This changes loading behaviour : previous results were simply wrong. + + +What's new in Iris-grib v0.12 +============================= + +:Release: 0.12 +:Date: 25 Oct 2017 + +Use `ecCodes `_ for +the file interface. +This is ECMWF's replacement for the older GRIB-API, which is now deprecated. + + +What's new in Iris-grib v0.11 +============================= + +:Release: 0.11 +:Date: 25 Oct 2017 + +Update for Iris v2.0+, using Dask instead of Biggus + + +What's new in Iris-grib v0.9 +============================= + +:Release: 0.9.0 +:Date: 25 Jul 2016 + +Stable release of iris_grib to support iris v1.10 + From 133db78b8b8caa92133f8158830be97eecca6688 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Wed, 6 Jun 2018 09:24:20 +0100 Subject: [PATCH 038/583] Add eccodes dependency note. --- docs/index.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/index.rst b/docs/index.rst index 1796d3c5..ae558482 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -95,7 +95,8 @@ Getting Started =============== To ensure all ``iris-grib`` dependencies, it is sufficient to have installed -:mod:`Iris ` itself. +:mod:`Iris ` itself, and +`ecCodes `_ . The simplest way to install is with `conda `_ , From c469d696d4ec11a54638de4c53c7abee40adf2a1 Mon Sep 17 00:00:00 2001 From: Corinne Bosley Date: Wed, 6 Jun 2018 11:12:18 +0100 Subject: [PATCH 039/583] add identification of grib codes for hybrid pressure reference --- iris_grib/_load_convert.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index 4668abbf..0ba8c21c 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -1275,13 +1275,22 @@ def translate_phenomenon(metadata, discipline, parameterCategory, metadata['long_name'] = long_name metadata['units'] = Unit(1) - if (discipline == 2 and - parameterCategory == 0 and - parameterNumber == 7 and - typeOfFirstFixedSurface == 1 and + # Identify hybrid height and pressure reference fields. + # Look for fields at surface level first. + if (typeOfFirstFixedSurface == 1 and scaledValueOfFirstFixedSurface == 0 and typeOfSecondFixedSurface == _TYPE_OF_FIXED_SURFACE_MISSING): - metadata['references'].append(ReferenceTarget('orography', None)) + # Land surface products for model terrain height: + if (discipline == 2 and + parameterCategory == 0 and + parameterNumber == 7): + metadata['references'].append(ReferenceTarget('orography', None)) + # Meteorological mass products for pressure: + elif (discipline == 0 and + parameterCategory == 3 and + parameterNumber == 0): + metadata['references'].append(ReferenceTarget('surface_pressure', + None)) def time_range_unit(indicatorOfUnitOfTimeRange): From d2c2f060421bf1b60fab6dcf5aa7e8cd58d13d3d Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Wed, 6 Jun 2018 11:34:30 +0100 Subject: [PATCH 040/583] Review changes. --- docs/ref/release_notes.rst | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/docs/ref/release_notes.rst b/docs/ref/release_notes.rst index 2b8066a5..67ca9568 100644 --- a/docs/ref/release_notes.rst +++ b/docs/ref/release_notes.rst @@ -1,4 +1,4 @@ -What's new in Iris-grib v0.13 +What's new in iris-grib v0.13 ============================= :Release: 0.13.0 @@ -21,34 +21,38 @@ Bug Fixes .. note:: - This changes loading behaviour : previous results were simply wrong. + This changes loading behaviour for data on hybrid pressure levels only. + This is an incompatible change, but the coefficent values previously + returned were essentially useless, with some values missing. -What's new in Iris-grib v0.12 +What's new in iris-grib v0.12 ============================= :Release: 0.12 :Date: 25 Oct 2017 -Use `ecCodes `_ for -the file interface. +Updated to work with +`ecCodes `_ as its +interface to GRIB files. This is ECMWF's replacement for the older GRIB-API, which is now deprecated. -What's new in Iris-grib v0.11 +What's new in iris-grib v0.11 ============================= :Release: 0.11 :Date: 25 Oct 2017 -Update for Iris v2.0+, using Dask instead of Biggus +Update for Iris v2.0+, using `dask `_ in place of +`biggus `_ for deferred loading. -What's new in Iris-grib v0.9 +What's new in iris-grib v0.9 ============================= :Release: 0.9.0 :Date: 25 Jul 2016 -Stable release of iris_grib to support iris v1.10 +Stable release of iris-grib to support iris v1.10 From 90da2fc287da9a4374bb8063ab7a666fbd752195 Mon Sep 17 00:00:00 2001 From: Corinne Bosley Date: Wed, 6 Jun 2018 11:56:31 +0100 Subject: [PATCH 041/583] let's try that again... --- .../load_convert/test_load_hybrid_pressure.py | 65 ++++++++++++++++++ .../tests/integration/save_rules/__init__.py | 20 ++++++ .../save_rules/test_save_hybrid_height.py | 39 +++++++++++ .../save_rules/test_save_hybrid_pressure.py | 39 +++++++++++ .../testdata/faked_sample_hp_grib_data.grib2 | Bin 0 -> 182 bytes 5 files changed, 163 insertions(+) create mode 100644 iris_grib/tests/integration/load_convert/test_load_hybrid_pressure.py create mode 100644 iris_grib/tests/integration/save_rules/__init__.py create mode 100644 iris_grib/tests/integration/save_rules/test_save_hybrid_height.py create mode 100644 iris_grib/tests/integration/save_rules/test_save_hybrid_pressure.py create mode 100644 iris_grib/tests/testdata/faked_sample_hp_grib_data.grib2 diff --git a/iris_grib/tests/integration/load_convert/test_load_hybrid_pressure.py b/iris_grib/tests/integration/load_convert/test_load_hybrid_pressure.py new file mode 100644 index 00000000..094f0956 --- /dev/null +++ b/iris_grib/tests/integration/load_convert/test_load_hybrid_pressure.py @@ -0,0 +1,65 @@ +# (C) British Crown Copyright 2018, Met Office +# +# This file is part of iris-grib. +# +# iris-grib is free software: you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the +# Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# iris-grib is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with iris-grib. If not, see . +""" +Integration test for loading hybrid pressure data. + +""" + +from __future__ import (absolute_import, division, print_function) +from six.moves import (filter, input, map, range, zip) # noqa + +# import iris_grib.tests first so that some things can be initialised +# before importing anything else. +import iris_grib.tests as tests + + +from iris import load_cube +from iris.aux_factory import HybridHeightFactory + +# TODO: Rename tests to reflect loading of hybrid pressure +# TODO: Rename cube to load (ask Patrick) +# TODO: Check all other things that need changing... +# TODO: Combine hybrid height and pressure test files? (Keep loading and saving separate) +class TestRealData(tests.IrisGribTest): + def test_load_hybrid_height(self): + filepath = self.get_testdata_path('faked_sample_hp_grib_data.grib2') + cube = load_cube(filepath, 'air_temperature') + # Check that it loads right, and creates a factory. + self.assertIsInstance(cube.aux_factories[0], HybridHeightFactory) + + def test_levels_values(self): + filepath = self.get_testdata_path('faked_sample_hh_grib_data.grib2') + cube = load_cube(filepath, 'air_temperature') + + # check actual model level values. + self.assertArrayEqual(cube.coord('model_level_number').points, + [1, 11, 21]) + + # check sigma values correctly loaded from indices 1, 11, 21. + # NOTE: level[0] == 1, so sigma[0] == 1.0 : This makes sense ! + self.assertArrayAllClose(cube.coord('sigma').points, + [1.0, 0.911, 0.694], + atol=0.001) + + # check height values too. + self.assertArrayAllClose(cube.coord('level_height').points, + [0., 800., 2933.], + atol=0.5) + + +if __name__ == '__main__': + tests.main() diff --git a/iris_grib/tests/integration/save_rules/__init__.py b/iris_grib/tests/integration/save_rules/__init__.py new file mode 100644 index 00000000..e8c75e8a --- /dev/null +++ b/iris_grib/tests/integration/save_rules/__init__.py @@ -0,0 +1,20 @@ +# (C) British Crown Copyright 2018, Met Office +# +# This file is part of iris-grib. +# +# iris-grib is free software: you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the +# Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# iris-grib is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with iris-grib. If not, see . +"""Integration tests for the :mod:`iris_grib._save_rules` package.""" + +from __future__ import (absolute_import, division, print_function) +from six.moves import (filter, input, map, range, zip) # noqa diff --git a/iris_grib/tests/integration/save_rules/test_save_hybrid_height.py b/iris_grib/tests/integration/save_rules/test_save_hybrid_height.py new file mode 100644 index 00000000..9ca1d2f8 --- /dev/null +++ b/iris_grib/tests/integration/save_rules/test_save_hybrid_height.py @@ -0,0 +1,39 @@ +# (C) British Crown Copyright 2018, Met Office +# +# This file is part of iris-grib. +# +# iris-grib is free software: you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the +# Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# iris-grib is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with iris-grib. If not, see . +""" +Integration test for saving hybrid height data. + +""" + +from __future__ import (absolute_import, division, print_function) +from six.moves import (filter, input, map, range, zip) # noqa + +# import iris_grib.tests first so that some things can be initialised +# before importing anything else. +import iris_grib.tests as tests + + +from iris import load_cube +from iris.aux_factory import HybridHeightFactory + + +class TestRealData(tests.IrisGribTest): +# TODO: Make some tests to check that the data has saved. +# TODO: Combine hybrid height and pressure test files? (Keep loading and saving separate) + +if __name__ == '__main__': + tests.main() diff --git a/iris_grib/tests/integration/save_rules/test_save_hybrid_pressure.py b/iris_grib/tests/integration/save_rules/test_save_hybrid_pressure.py new file mode 100644 index 00000000..d6282578 --- /dev/null +++ b/iris_grib/tests/integration/save_rules/test_save_hybrid_pressure.py @@ -0,0 +1,39 @@ +# (C) British Crown Copyright 2018, Met Office +# +# This file is part of iris-grib. +# +# iris-grib is free software: you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the +# Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# iris-grib is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with iris-grib. If not, see . +""" +Integration test for loading hybrid height data. + +""" + +from __future__ import (absolute_import, division, print_function) +from six.moves import (filter, input, map, range, zip) # noqa + +# import iris_grib.tests first so that some things can be initialised +# before importing anything else. +import iris_grib.tests as tests + + +from iris import load_cube +from iris.aux_factory import HybridHeightFactory + + +class TestRealData(tests.IrisGribTest): +# TODO: Make some tests to check that the data has saved. +# TODO: Combine hybrid height and pressure test files? (Keep loading and saving separate) + +if __name__ == '__main__': + tests.main() diff --git a/iris_grib/tests/testdata/faked_sample_hp_grib_data.grib2 b/iris_grib/tests/testdata/faked_sample_hp_grib_data.grib2 new file mode 100644 index 0000000000000000000000000000000000000000..5716f2a60782ed873f3ed6139240d0ccb1d10a1b GIT binary patch literal 182 zcmZ<{@^t$DpMi-10=5AuQAP$Y1_l-eM)rqXl0g1{W+34KB$!onK&luS7!oz!{f7gf z$QmGi2$BN{Hawkio8|Dm1OvvCJgFQJGSv)Bs(}oQd1ekk1*$ASf{_`d5X1mt2m#g! e5(Ej0vO?@~KODf&zy(qR1Z->|DOPrKAOHY$(l6)$ literal 0 HcmV?d00001 From cc59b4194c97a79bbbc8e91ce7d529d0a3c240f7 Mon Sep 17 00:00:00 2001 From: Corinne Bosley Date: Wed, 6 Jun 2018 12:28:57 +0100 Subject: [PATCH 042/583] rearranged test files a bit --- ...d_height.py => test_load_hybrid_coords.py} | 13 +++- .../load_convert/test_load_hybrid_pressure.py | 65 ------------------- ...d_height.py => test_save_hybrid_coords.py} | 14 +++- .../save_rules/test_save_hybrid_pressure.py | 39 ----------- 4 files changed, 22 insertions(+), 109 deletions(-) rename iris_grib/tests/integration/load_convert/{test_load_hybrid_height.py => test_load_hybrid_coords.py} (81%) delete mode 100644 iris_grib/tests/integration/load_convert/test_load_hybrid_pressure.py rename iris_grib/tests/integration/save_rules/{test_save_hybrid_height.py => test_save_hybrid_coords.py} (86%) delete mode 100644 iris_grib/tests/integration/save_rules/test_save_hybrid_pressure.py diff --git a/iris_grib/tests/integration/load_convert/test_load_hybrid_height.py b/iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py similarity index 81% rename from iris_grib/tests/integration/load_convert/test_load_hybrid_height.py rename to iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py index 9bb5e9ec..b0f99ffe 100644 --- a/iris_grib/tests/integration/load_convert/test_load_hybrid_height.py +++ b/iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py @@ -28,10 +28,10 @@ from iris import load_cube -from iris.aux_factory import HybridHeightFactory +from iris.aux_factory import HybridHeightFactory, HybridPressureFactory -class TestRealData(tests.IrisGribTest): +class TestHybridHeight(tests.IrisGribTest): def test_load_hybrid_height(self): filepath = self.get_testdata_path('faked_sample_hh_grib_data.grib2') cube = load_cube(filepath, 'air_temperature') @@ -58,5 +58,14 @@ def test_levels_values(self): atol=0.5) +class TestHybridPressure(tests.IrisGribTest): + def test_load_hybrid_pressure(self): + filepath = self.get_testdata_path('faked_sample_hp_grib_data.grib2') + cube = load_cube(filepath, 'air_pressure') + # cubes = load(filepath) + # print(cube) + # Check that it loads right, and creates a factory. + self.assertIsInstance(cube.aux_factories[0], HybridPressureFactory) + if __name__ == '__main__': tests.main() diff --git a/iris_grib/tests/integration/load_convert/test_load_hybrid_pressure.py b/iris_grib/tests/integration/load_convert/test_load_hybrid_pressure.py deleted file mode 100644 index 094f0956..00000000 --- a/iris_grib/tests/integration/load_convert/test_load_hybrid_pressure.py +++ /dev/null @@ -1,65 +0,0 @@ -# (C) British Crown Copyright 2018, Met Office -# -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . -""" -Integration test for loading hybrid pressure data. - -""" - -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - -# import iris_grib.tests first so that some things can be initialised -# before importing anything else. -import iris_grib.tests as tests - - -from iris import load_cube -from iris.aux_factory import HybridHeightFactory - -# TODO: Rename tests to reflect loading of hybrid pressure -# TODO: Rename cube to load (ask Patrick) -# TODO: Check all other things that need changing... -# TODO: Combine hybrid height and pressure test files? (Keep loading and saving separate) -class TestRealData(tests.IrisGribTest): - def test_load_hybrid_height(self): - filepath = self.get_testdata_path('faked_sample_hp_grib_data.grib2') - cube = load_cube(filepath, 'air_temperature') - # Check that it loads right, and creates a factory. - self.assertIsInstance(cube.aux_factories[0], HybridHeightFactory) - - def test_levels_values(self): - filepath = self.get_testdata_path('faked_sample_hh_grib_data.grib2') - cube = load_cube(filepath, 'air_temperature') - - # check actual model level values. - self.assertArrayEqual(cube.coord('model_level_number').points, - [1, 11, 21]) - - # check sigma values correctly loaded from indices 1, 11, 21. - # NOTE: level[0] == 1, so sigma[0] == 1.0 : This makes sense ! - self.assertArrayAllClose(cube.coord('sigma').points, - [1.0, 0.911, 0.694], - atol=0.001) - - # check height values too. - self.assertArrayAllClose(cube.coord('level_height').points, - [0., 800., 2933.], - atol=0.5) - - -if __name__ == '__main__': - tests.main() diff --git a/iris_grib/tests/integration/save_rules/test_save_hybrid_height.py b/iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py similarity index 86% rename from iris_grib/tests/integration/save_rules/test_save_hybrid_height.py rename to iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py index 9ca1d2f8..f25d19e4 100644 --- a/iris_grib/tests/integration/save_rules/test_save_hybrid_height.py +++ b/iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py @@ -30,10 +30,18 @@ from iris import load_cube from iris.aux_factory import HybridHeightFactory - -class TestRealData(tests.IrisGribTest): # TODO: Make some tests to check that the data has saved. -# TODO: Combine hybrid height and pressure test files? (Keep loading and saving separate) + + +class TestHybridHeight(tests.IrisGribTest): + def test_save_hybrid_height(self): + pass + + +class TestHybridPressure(tests.IrisGribTest): + def test_save_hybrid_pressure(self): + pass + if __name__ == '__main__': tests.main() diff --git a/iris_grib/tests/integration/save_rules/test_save_hybrid_pressure.py b/iris_grib/tests/integration/save_rules/test_save_hybrid_pressure.py deleted file mode 100644 index d6282578..00000000 --- a/iris_grib/tests/integration/save_rules/test_save_hybrid_pressure.py +++ /dev/null @@ -1,39 +0,0 @@ -# (C) British Crown Copyright 2018, Met Office -# -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . -""" -Integration test for loading hybrid height data. - -""" - -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - -# import iris_grib.tests first so that some things can be initialised -# before importing anything else. -import iris_grib.tests as tests - - -from iris import load_cube -from iris.aux_factory import HybridHeightFactory - - -class TestRealData(tests.IrisGribTest): -# TODO: Make some tests to check that the data has saved. -# TODO: Combine hybrid height and pressure test files? (Keep loading and saving separate) - -if __name__ == '__main__': - tests.main() From 74c991c5318077c8851c5dd7381eb4825b421b8b Mon Sep 17 00:00:00 2001 From: Corinne Bosley Date: Thu, 7 Jun 2018 07:46:29 +0100 Subject: [PATCH 043/583] progress so far --- iris_grib/_load_convert.py | 2 +- .../load_convert/test_load_hybrid_coords.py | 5 ++--- .../testdata/faked_sample_hp_grib_data.grib2 | Bin 182 -> 1855244 bytes .../testdata/faked_surface_pressure.grib2 | Bin 0 -> 182 bytes 4 files changed, 3 insertions(+), 4 deletions(-) create mode 100644 iris_grib/tests/testdata/faked_surface_pressure.grib2 diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index 0ba8c21c..d701153b 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -1289,7 +1289,7 @@ def translate_phenomenon(metadata, discipline, parameterCategory, elif (discipline == 0 and parameterCategory == 3 and parameterNumber == 0): - metadata['references'].append(ReferenceTarget('surface_pressure', + metadata['references'].append(ReferenceTarget('surface_air_pressure', None)) diff --git a/iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py b/iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py index b0f99ffe..a9b59fa7 100644 --- a/iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py +++ b/iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py @@ -27,7 +27,7 @@ import iris_grib.tests as tests -from iris import load_cube +from iris import load_cube, load from iris.aux_factory import HybridHeightFactory, HybridPressureFactory @@ -62,10 +62,9 @@ class TestHybridPressure(tests.IrisGribTest): def test_load_hybrid_pressure(self): filepath = self.get_testdata_path('faked_sample_hp_grib_data.grib2') cube = load_cube(filepath, 'air_pressure') - # cubes = load(filepath) - # print(cube) # Check that it loads right, and creates a factory. self.assertIsInstance(cube.aux_factories[0], HybridPressureFactory) + if __name__ == '__main__': tests.main() diff --git a/iris_grib/tests/testdata/faked_sample_hp_grib_data.grib2 b/iris_grib/tests/testdata/faked_sample_hp_grib_data.grib2 index 5716f2a60782ed873f3ed6139240d0ccb1d10a1b..529d569d12de30f707367b4aa9238bc27cdd52eb 100644 GIT binary patch literal 1855244 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

    S@mRCCf#;l z?j?%CQqLW2i|Ok1vdo%rbRI_B1l#0*eE#!QwNTZsYDh)i)JnhfH1SfQW! z5%Ica^GAZ@>9cg)M($hMbtX^zV=VL6fUzn{N*{|;`13ss)6wJbj@0za>r zqjh6`^lk^shG&ya43tqYMe;q3sNfIAU0&eDI>X6%Ag< zu?&Mtb!O<%90~oF>^mdeuIGN zXtPOlor!uLebtjTKJNOsp2keRQoZRG(#Pxcw{zw3&D~Kb?sdGcG<9MaRQ~O<$FxW1 zWX!5|waV^w_Dj-}Zyk+6+(H*YnD%Ko-o?etg7a%BUtARbLZ5Kp4}iv(mH+q)EFuoO zz=A*C_^tDA3L*U!2j|O;PcpFaqwDg+{M`W{scF4t9vK`RhZhC_!gHX;6DQ%B=I#N1 zqk+3VBQanEo=cC6LD--vWe)5m_m#n0OF$F&Fv$QY{0Y!lgabMe7e69(fm)BTwSw-MQu0)q=4?3CId{W)0 zcez}aAj!1QSe6n^(iO@kvwVFj$Gt$zE$wsI?jDV?f2zR=;dZiF;}a#QNuv!I8t60~ zfoupSWN*P$)#-&n+baDy0^_8Sc}poYYtljQmvY%hB~_p4vh}TlN~rjuSq4>xLs<4d z6nf^p+Q;WOYG!V_jx!;M?-I8_Pugv_^5I*H(FV0XroZLnkJOlVG@u__;2|=apX9e! zxPTG#0|SA(3qjdOme~3!^(tHZ0vo%E^HKgLLjRip4D55JDKUyAQ_uW9*Gw^$Y(btW zFz3hl!#z1(%fM#H&qRa@jR==9)Ts>EQTz!w`de2J1`S)BYyK7y@Dg!40vg;yFCsWZ zr;!qM;A-PI%vKpYlw9z#yCXP=GYN=W#<%FmYHfcx;w@~1fdPZkI7to)T0}YyeNpX_ zSkyCk^?5q_U7WeBvyL|2T9?QQZbCkgZ&$ad1ATn>0bhXINBKv;LLLy0 zZ@CKqa9Q|Z<5yiifdHldep&tp{q?J{k>7Cb_(SXRVSVxeo6ndLjT^H`0eLaFD#G!eRAn-f`;*K0<;;|HA%p?xDkZiyi9H8N69={9tdEN%g}dzGVcE_N4O=}W$&u2jQlaeStVRUFCeyXjx1f$GN`SwYhRb0%C{vCeZ`nac}b7C&jo!k!up2y4@zVjk4DAp(gGu9 zk|tz?q^kyNQ`Sh%rB6RtR*)$Wyi=YM2Bq)Hl54jKecYyd8Q@#8ZaVE*CIu{XQhg>S z2nGxKrarM^YCOn@4IvNSjnNACTU{ky2bVP?lx2d5G7 z*-E{CptwKXmKXZXj&D4m43zVq^?`e!BHw-hBfr=JefRjam(Ra-`62x^?vF0ZhnMBA z2@lc#9D4m(A1F!$LcvMkdCr;<;DrD%CR+OEYm6%7!JnX!UTEIZ^wp5EEW(}mgOEk+ z##s$m;>)wqfI)yI&3yXg=tUel&T>A+goX^^l9o@mhBx5}onvS!=}Gg9rO#0mqs z-6a~C5uv<7P*%Q09XAY=g9|cC)M^z;t|AGMyaM);#x10;JK|C?uaOBT&Giuj{p}~v z3+U6I8}LU5hC%-}_lTa%nYxrPI4zxYwMDbJGzJ>?ET3`=wp5W{N5J|K~FNscSM{NIvHDU)`&T&_edU%PyOAOQj(Fc{3c z2gDe~?jEA2s_sk|WL8bC{*AtKj)zBN-dhcjW^QgC9v=P*cfWZb)twe@ET*$}z%bM7 z;00Rk!6@dAuwKExZwn1;L}j%PXXf+nniEc)9pJg7i1P?x(0`v#miPGj% znkq4u(HFbmEWOo3My9U;J;P$#%G{7+_CJ#$xP4=nw3FUE@Q^VH4``#MeC#SS_6?$7 zn>itk8FbicLwH5JgpYEWfH0J1Qb%S+T4t7Dnx9w{nkAEMFh{t%$g{Nu8`GsWdW@0( zjv45Oz>5bC4pY6fCwUMo2_ZSuVLCU&!zkk-y1WMwozLQ%qwhK9aUMRW^WhoO%`d{9 z)1>DR%s&f9XSN2ei9wq?V_>=|7@{ZMHIW{l1JKhCrX<0O!qzMT{t=$_e0X>*uxdD8 z*)0=Op4}E0e#YCvgL(3K`j8w34-cn)hZbR&%(vH`S}8e}OtzFF82Y7093zV%#>C@c z4}vjB#WDtYWBa*B9Fh#ZuRIA+g>MM(Soq1VCq@$f)@}0bXuwC`1-DP{(2^`^nRG5) z+ygK(5E(V#?&ftPSO12#=Ja5?uW0k7*~;J2umjSwnA527FsY%(glXte(}M*Eu3@-c zjc;4=7P~Mra8}%s-_icALta5%I_-FfiSlaI9965U?VgX6exH?-#J&dZH=!_d3-L;B z0NZf}juasYBoN7zBL>lV=PWN`)lwLQpf%1VfK1 z0@x}TmHe<0DRSdh_$+Zf?(pH7d6R?WzXcu^$3$-e+HE=?0r(+qVs;mpE$j)8hEXqJ-QI*V!R++HJ8D!KvbSp3E>48h)BD z3~hLylVo!B+*x|fi1Wm&L1&s-M>B?#=e>-+ul9Q6`_ez#V-ixI49s8gu9h!5JV<}- zN`8$q&OA%>Fc^`7XCefQW@- z`B=%pYF?ByShA;0KlRN4m`P}7G?8#D)&~*hfo})mOuM9rI0$a=GQ)?200^_B>nTpe zN;4VolC3@qXS%xh)^0Qr{c^);f9n~@3lQ)f=Ip9uY&~g-GZS;r=}IOmE;v4-#99Dt zh$#wm+Tp|-&82NfBFuGvyF3S8Oj9r^9=-T_2I|>3OlL;VffTR{sc@EH!{t2#ikZf4 zV_Qrr#5_XyjZeFCi9#S}L*K&jO?b1P;0BmCp#>mTfx)kSPve6ZxTAztpv~Qh^L4~E zrWrWI*5jp_{>APvcP18>D(6Xp@yr{?uazJ(vc&FcE_7^N^PAIdhmiA&p6Tl1BuvQ| zhnAR6@pQ-I854|0JH`|=7+?kl7>`=|!H*I5OMn0S!k^=PY?@bX>J|Z>{TQbt7F*Qq z*Q9+@M`yRY4h>fGJU zPPf`_<7{Dwi6MwZjN0yD40<;4g3OVt7`30u3|TTDxdP12WG4^;CYWn2hz9t>=W@Wd zq|meXJG&tt+%n7%oB^m4>W7-4qVhCIA&GEB!F(R$!UcRc(c=Wd$pZZP!6Qs)6yJtw$WnRfza9Q{NxC> z}AH_THc{A+vqj77)&?^SUJ#!SZo|-L z@I1-!ZGPwK3f3?jaZS&Y4X}x6s4Wg+24%01j8Rmv)q#}rIF^GDM~E=Jio*pyk{0>DQ zH8?H`7(={4hJZueg7E|=!B6z2n>1LBJf=zzUX>%&=1OEbWZ=R}js@_D2eReDbZf1@IP` zwlW>CSn+K|A$y=bdQwrJZ*R^(=3Zb-Gvoyv$57G;UVyE))`mg>$0KjyJ|eq_WfuVp zf4Awe;WB{grKFjGdIz!T^_l@lA>|deUS}zFm)T`o=8T!}1E;N84l6OI_B5x7cB2Wl zPS9Hrr>$N}2IUQ>W%J)lbS%#jgnR^=YXZG?gu5{}PJA7SB!r>Vj$~dtFhffSNyWZ> zmjMW2S~JjF$hVR@OHP3Bk5P0`GnV01&PtUXCZhKI+UF=wbW{{mh|$NqV#)!(^k;WJ z+qWNW+xPbE@BEXMkNiG2Uv>z4NPg;{wSZr2`gPw2`}Si7rr!uNLU}TLO~rb|G38R}bisyI*@y=~ax2BIW8Pe41cSBk};|R&-s|{Be@|kI~F_9TtD^X&YZUG4N zF9UF;YdH5fvSfT)-3Uj1+SN(mgZ0Zq=yfcx1v4<{R<*{yS}cL>JS1aco?0x*g!L2k zqeswNmnhfq)_M?7X21g?_UK6!tgWG>#dHc70}XA0eGEG9wsQ2aRXXEFT4qzH&^};Q zhzp4-0w|%(z^@sG0~m~mT>}LMgdck4T-dq=3@-TK6Rg6K3Fjnsb6IE6Y~^Phe&hW{ zEFHx)v4&QSKW4~bXgHI_ao^qTV`6yO(_=k#Q0RQNxp;B|CwsoZ?{cBg<3f`kC8XmG zVNNR-F`{VVhGTsy(IpV#>f`pgZJ{bkLh#`p4{|Ryzw`CbV*vhW*RS<{y6GP@{)OKW z^Kl=;4M{N5@(cdz*1z=o(sS<@9)Kue`u(HlDzDM_Pd=G@saT%sLc0EdGb^q!ojYJEIhwfP(taZ@Qt{mpIw6(4XF{uR2m!m#1Ty*Un4o`*VBl*gYb}#&=86Pn83?FU!Oz-D@Z~HMbkcT}_Jigsv#J%Jlu|F6THs@E& zMyfGo>4!a@@$fJMFjWeE17|CYX_7#G@C~04eoL;*Axrp4_TDaiJ?Dwrzed5*fOBrZ z^g(gljB3fzm0@1vv}Ex;Lwawwc{lixVYSXH@9Ov>7MTPRJ{+zxAS)3D z8xn6zA|OfdAaLd~s+z*k4CGPJkQoRTSPaPtR~(MdT_k%6VIX!0W#D&%oN8RB&=9ba zlfo7jVRO%N*!|srxX$37dRQ>R=Se8qIRW34 zkN$HkvA)D|!^35_18nEZZ9GIQ+DvEpde>NcvFUm5XP$M?UwHcc++T})?nk~){TUz= zk3pxIHj0pHl%ZYYj%0$Fa(5>1SeMtXSz`Yo-p)Z-dTK`nr~6W=Rf8 zW_~tB*LQS?D9-$Dn9w?qayYJ9zc?)Yksa@9d42LI15T4|`wwIq<_>d_DV_ z!@J;@9%8)UQguu-RikY^GAlf??v~K-fudzder;Q?O>=|^iHGeNVl={AS37#%cAJE` zb~Fu}=H&=YI8E2bY2yhYd2Zbi&p=DP5==>+Q2()DQ zD@I03a6=T1Q*yu@35>0zg|oOs%cLDHyu7B6jOROIKMJyYNoj#^0s_}?B{@5Ho9%hc zJoGhct!Ika?YXq7@~VA^>0Uy>Y2196E3Evc84e>$5FO@ZB5(xSFmU2)xu^==3X53% zxuQ=|pO>B$8H2rb&dklYj{e_p`&yt=VJG#F=4Uekr+64{zwn2CAM&LJgn!(k9|ZEY z*FSOj)Zdc))4uVn$ggGoX?)Y6A?7)D=R_$AH`H4bZ*%qIA&?j7yks*88JiqLKJi8g zG`;rdE?|%fx=$hKK?|hQ)&9*KTit!>$263f987c3R;DA_tzAnb1IQSrEzAYl=#W_@ zLmw~-kCHJ_ea#jEhO=YilzbRNSOaimW+rEGZ05wr+y54p1}lu(4yv8R4X%K@10IvE zcru(+Zr=kwqO+Th-vIax7AS34u?aAo9Iu>sD~^3PIs$^Kql|emRbBA}=vQPg%S&M2 zE(TTR5yZC)eSHu%^SM(eC3ERs{%#aJ{IdqOaNr~mThHOWl$5J1BN_fmhtoJ)&*03l zhwBk>;<%$r_(+!<(Vw^o?LDwWeM2m%<2YjI+zsz{zWr&R!|CNUVF7tQ^s8(r9$r8_ z)?V<2ch`r0pZM$GPyB9|Cqth4z9Ce^UZTR~Bu zj7=Njg`1*f3BfItKe*>XN(tqxT7K#DL)+3Ov^-sW1@H^-1Ro6DR_d%1Gx8{0!OUyr z;$RoB-8M9hp0s6ojW?NVPaxWQ(aRBRp+BaRgh~s^=}{K1hGTJW9>iMYwHimizK`>-{iXP~<;`JC9-cRc{7x5Jb2FmVz13Tv=UM}TDrF!V8LGgv!Z zA&2&T9UNOZ(9glX zoF5MibV~Y5E#umLbeM#I5){7j10fZQ23#ed$^#jIwui{4h0g;J&1vKz5U~?p8@UI| zN~G6TPF$Uw(Q(qe&oSGYn;%Xc%!p{bEpx+4N;m@9b$(WVpigdaY6b{B(z_<7hM0GI zpv_a;a>{i1zsf@oheh-_@)Rns@XhYU;W+@8D4O}`df-keRHi}rFazr{%1fv1&V1UX z2$av}sG@dhrho-5MP5(!5Xeijryn#gvY1X?sm6Q?PM|oW>QZ}YD{3-J@ZorrJck`= z2H@Lm1J+5{=HiB0#{NXVEXL?Q=G($K`5@nJ!D^xeP;xB^(~w{f*e!YBIM2-~KZgdC zPovNslxa2f0u}GVS$9Jpa)Rd=0N}F^7xyGo91{0F^6ClrlR0|_6?`>ah z+p976cqQe@jiQQ7>WYU(>g~=zF~9X)GYk*4I{Jlre%vY*%)Qs!hR%D}Ev1_T5_sna z0zK8~9(rl&er}=nXPbxKmMKAx#Ps4oI=5#_+O3x*&q13mKAIP`t@9?cci%%~uuK7) zn?4NdXWt^WE2tU*Jp;FTtsyg&5M&x)E}-mClZG_VxWXCWF~!)Rvi5jb`QUY^XAGs{6ZZRkJ@ejVA)KA#TuvWbJXM1;-- z2=;e}^dw0iJpr$_2IxBmAfdUEbKQ?F)YPiFl0Mq1q}fW0WbEsNW|weANmxn+ z`jLY!^?uHoJv+Miw|0HHM%Zp#V|uNa5CKcB{GK6G4~{vsOo`(A_~f)g3zzbRxthD_ zSmwa=1jmMnPK9RLEogxv?5!k89pEGDR>E1GY)-pzBJjC55CPo7$%W62bB~!n+;T2j zOv9XkyHw4CUWOBe!Uz~}4F7SSCCX_HDo}OU4}pGp)ePhb&_Kn?jda|x@6v-5Bzn$Z zhvhb{JupN8O!Lp2Fuj|qPR$qI-h0Yc#>HL!G|h z@Z94Clq$+3grJHv@my>Sz&mpooA|Axi`~;M%VPE^2s0;t;hdP# z)(5xQ{x=-(?&>6}1lYO)QqgdGmrL=zRMM=foQX^5G&7j38g%a=xZl7Mkxp^fyGlYc zaH&t#349A&D^H|{t4Rh{_v|FTp^EyU2vd__sx+mm0l1ABINYGp0;)Z{G8PA7z{SN0 zPB)>yIS>*Hjy$yGi{CmU=3N;&!8S~j0r%g6tIOP5Y0=-)8b$rBF%^!gD#hNjc0U; z$T2=J+5F8f-*>#Gc=BSpA6`rmxbpx6#}h^tkQekv7dDlt?xT;^8HfxupR%`n`a-F5 zuq+=p^@TD3VHw(C)iZlDCT`*!F+R2SX}lb|Z1mSEQ*>{I*v@k@KF8Mda5!+yIe4{b ztNdVPVcwvLx?_aC1sQ|cs##~T9*>iWEi5iDmD>ti?bsxIJLe@#^q|mCyW>tNW-gji zr1oeQl9rm8N^Tk&%u-7fc-7vzPE@xpU0#s``Jg6GfJIZK7^Tu|9S7DnWI4fwO>GOH zuRs+Wd5D`dyWuYaWe&RrDqIO^$)NG!cbx>`XA)rbTbvSo)y!qwu#u z4?RgPM=D)#uwsRcCANV0$c&8D$YL4T$Alcq)nN%UrhK844UKkBWg2w6&t4PkMj%A! z;Ypi71C@i$yMgcgUM7!%H)kO7YN!D!<|9X2aMDNV5$G|!A=pY^mn8BH-p$$86KyPY z>N#_*0m9~bDCIcI)>Gz&t>QnkY&{3!XyUNdhLG7OoUI@hXuDn}GYL~TK;S^rO*GT@ znCbUO!5FgSzBqWch0$h0oR-;w=`bJmdgTq#ORjPaaMFGw{EBD4G5UBzK}FrWdNl)G z(o{8mQl&J=Y@%?s`B_sMFx{7S0M7z;qy$Kq#5=W_Qdo8Qy@%>bzdKd z(NL>1@(SNpfMby7@W*lzFwHLk?Aqu}e9(NMNWpn90GzRR;Yy zv%q_tpC0<6bwNued$~H#k(3JeOBYan_r?#`2b&YM&n-Pc@Ceu`zF}vY3Vd z2j2?`LH;jrGI1^Qew~Nm(>_4>ij$TacW?sE)eYtlm{;S$^61F`)@2P1XS=poOp-8` z?hUWj40L)=lP$~aHl8w0PV}s9uQa>yxruTZw^vw0Fu&bSu5`sz zGBxQcqNr3(&O-@gPNIk7!6BfpU?vS2cM8?pRf=+|w8vn-3(h;5sxMmdpzKqU6M9$?nP=w0s_P z6Rm$W+Peo=`#8j{bcNYDsjMOyaH5KC<{)w}8F%2vF#sWo$#L6lm(H0_Xp2mHq9eJ! z1wV}MJ5CvB{qV8aMavQ;a3JLEwms27?sqlUcob2;xUgxN{>Z(%4+1_VEg5iXn_x%C z)H7RATa93`YD26HLpK^3XAH73Xw1##T~x)-G*=uhm+U}xV|4C%tGr6<;WiO20aCiezwC+96TTXuOU|k)>w!RSRzG+ zGM>fnI=pv95fs8*08`sga-F5V5w>y=&G&w#zT3AuPgjVVfqwtO7}U4Jz^L9wj8ew- zio&Ms%RSTG1+&ZW*~O1=2yh*wFAO@h9*2GokZd@~z+X(Xtulvj4(8M~4JTW_GmhpM z%Gr~x!z78tXK?4CkIYL?hDlV2E3B#FIsrfWb{ZEyXNilm&;t$$@$Ss6C0jr-lG_0f z{^<*KBEBmp1oAM!n2wae0CVC2={=!AA_3!5+8921gkCWMtV4x#R|iD@O~5ROrnC&&>ncQlgo2<>G> zF^`WfiS{0ni1Hv}VDLOZAgf;hE%y-5x`2a_F z`A7#tX}7kk+D=0qTP8K1UW?4d&5}U@W(oh$j5uTF0mEG3If3R|b8M{^WiEO`w0sD* zP8^nDHilSXpUZ1=t?dxtnj((h1WYVxd2Z;1ue%6vFNVia5>133F`e4ZaNCXehBJm4 zpg)JX-~IDH-qkwWul(sBG6+Aocof2@$tqy`nZ~Ct=%Xj5UjuDrrdnnb&_{5d2EY3b zqT3T;svVuG`L1nRd&tZNH0P$0*0vI7NnAp|Aq_4XX4{4KZkR26CXlzoTnZOKmTh5z-)Z(^DX0 za5PspPRp!KCpv%g~ce~bH>sFF1CBuFbAvbU0tcMN>OV|;I`iP70sNb z$f@K!2i}b_$TE=UzhF);u~xNwHGU&ZDoP*FAiaqnFrTXo7{^Y zZ~)Fh=eiv7CG4|(a31d?A$&?Yn-Be4A;RDlu1*nG0EJEeJBes$>>-okmdPd>=D3v5 zg?(iR%o&KDsDin`A@C(MWp5dP{QjB0|K*>5;SYiNb6o}?|K=4>gZdtg*G(6die#x_ zYBj@w#(DDe%QO@1F_`A+-bs`8#H+qr&!*A3uxVR!axm@8sq|?ze)<<2BD>=tGG){a z-fbQwHH$3MbTt${>}NpL%FMDmntLH3q?EQIfv=r6k_;1>Bx)WvlP&TYkeHYBCaua< zO7jX9h*&Aap8)ztq-(B{u@zU&lZ}zFl^NmqxyD=cVyvcO< zlhWonV!Pd^Qx!T5@(LOHBE&ewZX7Obf#^A4H&mUqo@k50NVa}8qtin2xv4wCV)9t{$|?hgyx$OAM7r}O8jrf(m`q;H%?)@dT6d?47Lmcv+sPQm0W)73`Cye z10sJDw@f)1Lr2`M#-+xqhbw({d(np24PZV5*fnvQW@56n04CO@XgCdCM#;o(nO;ue zKGlTtMlq0_lj&rsGRdvcr%b&36VUu8ApRGz@&w3};VbteZx#SvMmhVqRY_ASG>ZnB z;T>OyG4VZmVs(~D{S`^)GbKtoq=_EqOa3}a`_wwux>)u%`Cn{APNC=z{|*k zvwK)tj1&<&^-rxnIET_{m`4Vu!tW)-UVt!HaLK!1vg*Y0QX+6x8F##$QEr`HJqM20 zcNrSaG#ySgDa!HCEwJL+jsKo$m!51EZh<=GFp2cv3Q>C#PgPiqW{3gpz;7k`NQhOw zx0(s3X%Q@s&|^xMn=6h0%PTlrL=qYB0;|H%>+TJjR5%H>g~9>iGy2ATJ^0`H`p5HL^67CUXt z^l}QLSU0r8hq=TSG6s3Y07)uFLLSY@k;6extrA9N)60a~WK+Ckk1f=$2P^6$v&|ui zJj)a|`2_Af0PhA-V{nW@_SsfxwD@ot%@u)2 zW~*k@rbvNwV&m)G=0rxPI6IC{Lu4;tuVOJRA0O8CZ+a4IAS1@wW$Qh=tFR?AolZE( zDeNQhs&Nz3C}LLF_@uL!Ef6C7Vy;ST7yZ~;vl`RCWB}&Bx%58@{jvY?=adK4Qm>V~ zXga-AEH$Yrb#pys2KFRm?q&LA9x`(*roKx*vK+wKqP?~D=Ak{Ka0pK^x2hUE3LyrR zj0Fy=P6GR(*-u>`hYMR$^a99}1c6ii;7%c>^cN}R(VG6^M(8ii3UGt7mxJW<(K6I? zo&ZTWT}hpDUpI~nqta=Ccu4G>na;yC(K1bxOmYa09)~%tk1&apaBvs`|KkIMn72S; zhTfga&4GLDsA5y1dui^2%F+r~+HfX?eeq(-B@3PI)8^-R31Z_~%_ulC|I0L6-?LRgGBSCkesy zESE)o=tL6r|M=+wf-87LGO*VX5~vZ((%eX$9Vo{ZZ_D#I4?kP$vYFW$ zflJbmJoGYA&kRI07G*xoK3dhSkEI?Fgk3tp-GJ0)wc?B#CW~DElhp_ zC!@F>&o>2&pLj(LK>WrWm?9j4c8`#)b@$BSplg-zDNCu1!Vo9CO+zG&4kF;R-b)6czw+bNiYNAT4W6tJX5k^DZVKSAeURq>%wPyy+R8V% zhu9Iq1h0@Ijpq?GG(@d&B&UYKlrZMv&*D;`i+;+u2ZdV96Ypu6gwR=vut54Q!ab?7bzmZ#9$dP+Ok9n@!$JDj zXRn!OL~8cfZR_4@=SzO<)+|~^1owEy=c}aGKn@?AdHQ;tBx-Z>sa4vO ziTCK*;OyP8d3zMcH(6X%g_aC14LAo&_<<4i6j(Ve7Cq=}Tf-tgYs9(6z?xScO2OK? zf)>bDFCj`8!U|R1QRw6(MH3H0I)$XuMfTF~q@6qi7w4ZelGS@M$zM)uUhVof zF!?Dg(~tiEf}cQqvd^wjTm!n5VzHLpP26A{FrgOft>G9RUhrxkGtfjYv(>nT!%=h% z91IMFed1>`e)N`mi#+2x%=%|Mq;W+0C! zBpgpDV7jl`liu-kdh*=6foZgE&!y2cIla{*Q3M==I(k?U$HK_#NW<>#_U>e6x0Tb& zh=mzRmV;As1DU1YD=stF7<-JiDCL>^idcAo@Dfw~S`g3LaL) zq02^xs^gHq32YrfeeGsEpF(Wau%24^p`Y6||JfPX(cwV*V4}PVzo!H_VNke>?|7?a zAa!~g@kMCY0-2W3+!|Z7C%}!=1(``PP|TbazYm5u;=Y3CX5dpU!nl&QCghslo!d^% zwv0i?$kjjE`Kr2I#c*J}WrYLZOeJB@j$ z*3hG9{bdK$3%vHTA9en@f49l>gZ|Rr0RG9o{obbQ08qOUECbn^yY42gN$n3_0Zv2Q zvxgV(2{w5yfNz`$wu*&QIPs#hk3a-=De2?$6il4Ky*9$gfAToETxlDGHVy$Z4zM@^b~{!Se|pRej7Wpq~R@_+1+u zfJvAa%9k!7y?VNYXlDrUgMFiVsnTx1%qX?nUhppT;Hdjf?Ur6c9)9Sfz?@F(u3K4x z7k-3GEL+xG%D16mZ1veWI!3c+;#Fv;7&8N#Ifx85dRCoFCpu&F9of4#kbmv&$`}|L z;Evd(RquSHO2`$GtK>=?v|1-X z;L-k9nGsHN;CmS{yqyH}3AV8daonmHEud_;N4mM_YucRU#l25Wl1b9_Cgr+qU%SY8 zC3@+4rm%nM@BTjFN1J@?vuz*qf5Q4d$o|uP`wyES5ph!$6r5v2u~oY!bYJl*1f%JS zgFsx3pThV&;NiFwAC7_OAm%7T&jKyhs@AiIgD5equ4g_*cII^uc{46%6% zPQa>UZonaF)>)?pElExRbT9%u(m+ETMo=<8m~wa*95RroVJ=XqSR^YPA3rD= zG9@r)NUkwgIr>Poy5;xW)5fs+3gENJh$@{2|z3XEyD-_d+SVgq>oF;kB$@pNe+4F9I4QbTM6^9H4c^`XH}WB-Dr#a%2|cuM&r0D4Tck6 zOF}pnTR6=`28$PeFrp&y|BC*DZTs&OgTD^`($9fB{xSN38GxCA^zsBIq1%?IrF5_GedH!lr?y4g@wj|jJz*E&Bb+sRYOO;?0?i!6 z+Sj4E&3u%~5WA!xeL{}FKHki@M4 zP{>RJ8H1@rng5!vHh9M4M-Kjc`xDcj`?dZP|LBXk_h0wzzks*xPqyukw(SqL?f19s z54Y_v_U&)+(~x$9?v4v*#fr!R-!Tn*P23c&GU5P;@I{2_ChMvPR%;gBXr350r*}at3BOwz@0D3GH`-tM2P;_JWOtUqBg9jLis>Jqg z_}~^`3zy>0;??w%-6I@I&gE1bj$1QcU0g!1JmS9G^*g}tZyTQj10VW50GfL z4u__$cmk}4KtHa~+V{=?9%6;o=pIx9dd|FK)Ib=z@19_uI*YT0L+36s*Zfn@o(1+} zn|m3%WgVB|#z}H9dN9GD2n;_n5Q^z7GC%gROFP zSr&f?bghby&&CkVhiFwZI+rdPP#XPF9xvSg;8$ustme@Upkk?Kij$Xhp87uHw+;LD zBc|ED{lGtS{fVFY{$}64w{3swPyGJFw*6;MzyHPq089_VKi@O}f9mTXkaXyY$g*)c zkMIKDxi4zYj5+Wf{qZ8gC% zXH>e*_TzdfBM%**qFW(Kz|CA~GdatyG=LjeHVkGG8-GHB1$OCFQRgN8FOU+N9NQxB z2ft8itZmzu{&Qf8dLB@-V;fOtOZ)A4rEDhUJDwh9wYnxZNkJpq#A zv?QMh)4b%6*Ibg55%-aQyY)F=;rXX5pPBe#e60P0G3)+#+x~3Zm~4OSH@UyZXMOwj ze*oL|U-s?K{1*5x$DI7TZTlN0r#~1^4}#aW#XWHh<*K7oXlw-{K+CV-Ht88i8xqll zxzrfKg~3G!wAC==-#7ZAYPZ@2uZ9lCJqgQ6eD2J5LxP(FN9!p_^|) z`AKpHK56ddB&Y=YGcla^LTaY*6t;CTPkN~(3W?!H@qDoB*MNWTw+tWo)$>cgJAUc! zF~Q79Fv8({?U&kr&O_kn>*r?R6Qjm6@ZBY1J6UaOYgH=B+A+DaBGtKS|TmhvB6UiJ$ zUYG8h{dzplX!`lG7=Td!2|WDCAsbgR#Hdb51{zx|ae--^3$gEdX?W$oI{eU&cGT@JJg{>=03_l^H>+y2je`%n9}@7w>hZ~ybY{jb~hzx$otGIG^C?Q7Z1Hjo78t~w11P8*L*t-{wx00L<9}PpG zh_NgA?1BT93_s4`n7{!(63Dot&@)B{JCl$AiK_ulGn?pLr!m^1b@|+4M&+0?%g9H zf8qcM@eF)$PU73Uu`3TP06z+2x_dwFtxUO%^M>Dy`@#fwtukW(`c3ZrC_>7HT_h7P z7#W!4R!`u5p}F(K;|Ljk>kNZAg>WaT?3z>VIZKr&0_hBFH5=>fHi~K}>?3PjMJEqe z*@$(;YsVCkiC)540sa|wePO|mQmCjY86_h*q=ht+hvbm_yzso@oeS@3f3R(T=l3r^ z*|#5hp#9%WJU{IH-mdBQNB)TKKW^LqvS|SRZ+-&&1AiF!7n?o+|8M*D=YH4xsedAi z@=yFQNz0^FmHejdO!#ZVHm8n6%y&BHOp0N_7sgShpYg+fV*tWLMv?~2u4rf`#0nPc zBgn@}8)`iet&J8|p2>WYpYrHSN%+AdH08vnICulbR>UUWZ6bzFI9uQWsuqfhO4x3} zsF13BDjc!F4AI5Oz2GGAKKN;bY4(*b`V;>W=2K(toex;}P=!an%)Q31$Mg$_as~dG z0qCc}dtVAB@x}Da_C7~SWq#b(Z=4D+S4r9*c-`4I4Dk#DPAO6nxnG^N zIXI-0X~0b2g2*keRvcjf;tA=k;>51~!NUR{pN=iwcIrZq(zq%QH&>e7hyzhu!J=dZ z4muC5Fsh=B<53u$rP<*tMgys6S_Df2GylaVptQR3B}{a_8ZrRr)z+^IulV%OKj-_{ zzhU6Zi@))EnNO+bO`rb#C7UU4TEoOsAhPUEdrWUSRTDAOxep4Wc1qLSx6EWe+F@7wze4fhaKZyxi;f zJlpaR90{E0EWs=65|%SyS3BiOAdlmAbVs?DZ3GUn0P;FQXeNZA1A|lYh@pAOm}oc+ z$7L6Zit_}njTC=Xsp~WJ>i;axiD9Sj1F^ zU@Fj+2Ie7(On%<~r_qefxdJBX5@d z#K`F5Gw>hy9rUNPK!7XY;~<tZ7L; z$qXiB#g!1cag_&Kww|_%CzE#ZP(LZx*`e{7gND?kE+U>g?erkU_K$w#`^01LbN-oV zuAW)vl6yJk9)%~4%a7X2U;Rn_a4opE_sV@={~T>&O64@m_N|(Lc2W`LISb# zqE}$oFuVAQlbebXiNz=uR~XjI4NUl28GX!fUJ-uHw4pXUtnNIe$sPnuDYSe%Ib*gA zy+z&kB ze(2vk{GosT_eancL-_CfanNTxfiw54oUx2iOe-zM5CN7Ga=+%ZWbZ1F78ngkavEqE zfF<+rvKySb%L%guC-}5=%|FezD|yOkg|g*~)>w{9_M8jSmHGN~WyF#w@c9{tz$yma z34uV#1eS(W!Wp|tQ>f(zo-EK6p2-lbB9G6Jq!VqTe87J<6fIBX126n_@Q3~?3)P^Cz6d@dH&yZb~z?(4xiB3MJM?5#?IO5@oiR3}_&JS8zZgae7$ShDw z;GoSgV`RDT$qyGt0wENBz=JF1ggw*B`k+xrX724jHLsAN{anOIzq5N_W)}zL9(GS) zi*Xx=F-`ct0UO8$3BPa!CQ$W_6U*cGul(|%BL?Jg;1hoy`z0-JF&Z3~em!)mS~k^8 z!mJF~fz}fu{uI7)nB(XnW87x-`?ynvGx~Ldn;gR{^(M4Ip{=kvOoRs{Ii!@3AKWjM z3IwbnYQgXojsg8-o07$b~e4#k_`x^6II3Uj(^&y9*%N=WuRf ziLFPLWlaVb1BIb6;)@V=om@zr6Mh>zu_d$8!W^G!!SOA<8*G(ZELrwXNmE`JrX9?RhhmB5{UBH zmC*q(IZn=Tm{a%eCdN47C`Q8BG}Z5b(Pc>DWZXDowB>5Rop9^N6N>6#WQHCmw_oyw zqccyhAs^t5;Q!oR{KD_@c+Pogf4<@Fte?;j1OLB{UD!lfhi@_X5tuoQq%m74!7-fq z$`4Vvq>z1;Fjb0H6>~@`tIll*(Ppyj-54cH55#M@M3v7*VFerI;Tw}8@~mw8@%S5* zqsOr``hJCzykz(VnquRElo`L8Trh;BZ;+8iJ%8Z$ynj2sBKe`;BY({Ep+6`5so(Sd z>8_sz{(#Eg^$Wni^gHDr@A~wQ7NGJmK>>g%Y?6~O6R84sTr3NGJ6uqf2n)QMgE`Vl zBx#@-HAWU74;L5Y#l;*G2R z$2^|-KlC?fANZF5v;&t;A@Oj?LkK`$2ts7mK~o+EwkSwp12uE+>=7D9<(oTBUU_zF@^qR+X8T&A_HC^$4|IoMEL>)i$$8~jmrQBF7As5Uj&lq7vPV34L=dMbGuO+ z_v0+b35N`j3i3mAG$Vivz;)lAf%fD&;kwO~<)-6UK{G8zJAce?(V2lZfeg2d|J>2% z{uc6c56S9!UkX=7St652A!hgsEg#TkG4PbJhgzB`b4)zXmM=Uvm?tc`S#m|Fp4%z|E;x<|Om0wwY7x8K69y4?Vt0xxBm*@2l)+{v;Bc5;V1qK zmYQb(QqN>V3GqC{2Sw^&70!sLnC6oQ0rXxOD?0K%lCvwHio*W_Xy5XMG!m3+=0s#E z0VL@)#~xf;$AeMwfV}y^S%RBrv68fMd1aT*c<|qb7|RwbzRyAnl9rK*!!qegg}4$@ zc(aVD=ah6Xl{4T_-t^`e9W^n=sVIDmA-tuoJm08!fZF&mABOnnRWHop_A~vcG~mr> zjSwmfGruuGg#CXFyH~jc}+$EyMXi3S^CoBninSWgR6OY(xuy5t`(Oq+@t+@ z;SaZeMpfqiiP}QF9Sw01o4kUEKb<%iFcBQ0IFv)XITbu#b$n zU@8MnLXtT-QM;)!S5PdzZX$YsaA*hGyDe745W6AImX8QqCu$p3PMzK76_;bq^XlY* z-@6dRlBE;XIZ3W&?9S37IJLo5`Zj}8At~KcJ+I3M6s8LTDRO!t?J(5F7H;4nWyZB~ zx&P=E_>srp&v>Ea70@NeY|I#BNrz_cQTdcNoyZdA83?GiR+(%@9$@AJF6F35xAdS-vJQ>ccF42_&Cm}eUg(@CqKB4L8P~#V5 z+d0JZx*+Eh{zqk)bxoc0#Lc*l2r&1C=ZIMCY^Q znN!eQB^QCVm!5mfKn&q3MauxhbLsR!wUyfqw=edVv%FKrtDkQA!9N6(lT&0HC)q+L zDWwa3$E5qml=j+)HF;1bVE1;M^bp45)pvODI{IMWVqqm zZM!&@3&aY}ytWJ_c4XG>dMdPY8*L;R0vzH*O9la}rE!S29Xk-=M_?5*O;CW&_R=|d zbkxEmA=s6cVxTIzLe`26^I1+ef{&vLx2b1NNiC%^43TZ3qYSuxDuDv{#6KwgG2e-} zx?Z`uC@_kIf^#cFl0_MFd7P5EkR*|;}if9VTeo;7q>(43vd;BEV05Z+}j*t4`b`zV(jJ=OSZIh zXkWWiNC;t~4Zh;~H_bqzbAYehO26dU&z}K)=*RCb+|*nI{u4!tLDk~9^tm5VzM@re zz!w32ur{uh#0sBayEOwXnImic;23tvA(#v0?!e^XTRVe4^4#XQEWDzku+IIaa)>Bi zF(1D4xF$O4id>;2$tRf{l&YTRWoWmrL91;!{{xRS4`azc|hv$?u7s_Pga^=673|06nRWMEkbm|#lu0XTb z%87+*0#gaPuR(_c^8kohK9Uo|Y_Jk7eYTy)e-eHHT-XO9eBTs_(v|@_(42V+F&9r` zwz$nwK6XzW?IIIHE=#1v_u0V;~}pe6&< zC!8*o6bzV(g-_I}N$&A3L&F2GXCMl77VJbZ^qy|bK!Rdx%>&M(JZkZQcH@qyG%${_ zdp|0_5KX-L%;v}jOIc=_riTS3SAt8Tk-`@FMd2rztgR_M1V4 z!mm>nkRFnWpDqj)3DpS408t@$Hy&PG50nkDkeSym5(qpbOJ6(B4`j&~gs@auC(5xU zuzPVs9-5Oa6(l;B8OV(Q)Ct!?mN3c~lxdrz%t$O}Q~3}I#1_AGJ#cGiV+@k#PhIM{ zO`+LaAa(SlnORuUvW7JeG?MJ)mCLANg(6} zQg11VLwTpR7tBmJjfL5gt|(Mth{~atQy4051AOA;S^?^foBhZw`7?h|%q@3qPy?bp zNGTPT)CLOQWFWXWp(zp!sajmCEZ=wwLzsSaGLx&Ce#|;UosC*cA~3;)ok%NKIAqoO z3E|#-fh~DuD{!Fi>|v@G$0RUh=q4nQfeFD9VKLEQ0uAuBWf=~>a=Vc$X=Y%$Fi7uA zIJ6yWtQ$1sLW9WzN_d9(1+O*!!Nvz3h9B`Ul-rHCzV)qfO{5F@r619G{NU+@o1%H) z;1aP@Hkl;CD=eO9yaYVTS+-*Y$jbp0NC}|_C0s`?NH^%aAQdEpr!pSrUfW3=i)M-> zA&?NP-~bxP6}O2(?(s{WA(>+y*G%jHvy^*zg;AT}mI;c`kOwdUjU>M5Ab}W?pT-I{ z@e*=FGeZn-aX3mEN6*TS5=tUfK{0$wNjSIUpX3N242LaCmdp@fInNGeah#&)Ay=!~ zgOY97iYMR!Bw1iraXW-CbO3rl1QcB-0fHN((l!&^or|REB-P@lpbP=<3fy)0r!G(> zY;uyTPgTT3tl-as8;Wby0Oa2ea##Ms7fqK@4_rN!5P+sUpec_xquRe2#R*6C$*wC+ zG+R#WBW^fRB$hCN^9;1Ms70X!2+(3{m`$s;$*OI|kg&tV4T6<3>>BVn&;m56W}Rh_ zgwWhG6O7M-aNK>!BSu2#IDlTraWFTiMg|9<2XJ?~M8{qO#2lidmA>$2Q$O@?asS$1 zLjA~3dMKv?0W@<>6b}_hZ_;-(DS!h!dcnafN(gP3D5LQqxS9BXOaMC2oF?Eyg9pTC z^s8pT4H$Lu@lEYxU{?ecPF0)F7H|(|_{pgRg|O0vhrtlG4xhABjl@W#$}`y*dhUHG zT<&WpP%<7$h;hGi4{SZ^1xF#m^@djg6e7$)W-K*NCZz<938pSr^R;t}Hkz zu!}hy00<{QP=II?S`z6B-fgiaas=GR(ZDi+Xx9*h@t1ee7+Vmv3*nFz__)D@&xNWK!6_1O#sZUJg-nTH z^Ho%V9Cr@6bovE_T_+G�^5=-hbr}rhc^P8{wb&OEIc~E~D!y1CBFcz}!0(2)r3Z zf?CD})gq2ZiX<%q!R~`QnvgM+tR|xK4BWSS%X1cOBtc;kSBP5}8FXSLlMVOUE=0Kz zri;0wh^z8>7jV4%hj0%nBKw0&4-k$Ku~&Y0`_g^K!JHyAMKp3=vna`T&MWQQuR%-a zmS>m`{pI`j{U@t`;os$c>=q*~OzVPNe)xcCn(-x9;9_sfMw2#ScIn%3!hI}a+R59liv7-lK^x=1`lZGXMV=kBe6Sh zt}i#(g`L{ys=hH0eD#_Y0pGa#vFq81WhO*t%1;=Ju1{{9+kfFN%YNvV`~;4RkU9i( z<1WZITMZnh0W`o6U{>$**DWB~GNWVhjG{-f+4_)oX~$}~-#^1~~tCCSn|%rowI z4t(LthfZSQ{E`{yYT;(F!kpxSKJ~Qx%4yfUrI2h?VG^2wq7~urp#`Cvb6O7h%4E(O zx6UY(l>j=O8S+V<1B#0-bE9b}g0rMZL!OWtsMOgQZfXjXF&TS-wYi- z%cc*6!>Q1?tZ`qdf!t%)EjO5g(Ga)>Zh3_WFLi|#E>zlv6%mewtEV2m@-L%k!yo#0 zp?pr28ORnlPJwBLc-l}ur~;TaV3u!;HAWyz|Jw5G!hG;e-TB2AffO)IqM$?rIFCOh z`QA#nWs*S1Yovr<%S1|aXtr9Jqaf{P;Z0Qv$a70yT>}DC zzJx8Wt<4!DU4a}2n~!{TH}&J1d2p>#JP;HKdE?SwdLn_ToRro(=AIQ|nj~l>#?V%? z@mnjTXh|lS<*!aYgXv45geU-k2`-4BCOAfVE%8>f zJN9$qBV(}$lfzPyv*kH5b}*fcrfGTMZFL$vD2MO<7{} zAtgjp`#Jw-{^Ri<`W-Phu2)#Yymwzc_a2}^QVef4&kc_h=tjZx9Bjh#48N0(IA%sAlX^NVGW9Z=+K#|LHHw$AVOKq9M5#S9|2NmXDJ-_Z8CzZ3Zz{yNp46Jp{^ ze|^aoRuJQwc&VZ*8JI9%qudP+uJQ_h(gMa8;2Y;&NC^4o^@u!tYyD{Z7yr04V^C^c zW^q`ys4@E5XDM9{QVc-G+AC+6sfbQA!zbZPND@vXAVXne_dX?I3{7Y&kPwxzK|_FL zAoR+CpR-ZYsvx|j+?q!Jq{Bg=v*a%5;X^7!hZ&mX0tg5;{@|1hVg`CvZ9C`? z;9_PAJXB#(f$xUUSsD`{a0q`_8WkqhMKPQJrms(z=sR5}!-4j22q!nL+mALADL-L5 z@Zjs_e!1me8YZsPZFXM`elZ;j zeZ+B`2Smqnha=`P{h%XEXoQS5^7Gmzq`^lBv)fsjZ`j5ytb}iYTD`OL%(O50m7xDV z@o)J^);~}BsW0U-Y&kBTRd}1m08F3aNtaFfJ(nII4xV&r#iiAa6CHsQ_VGh~BH)8u zSqRJ}-XgY2Mc*l|o(h|-v#ZvLB-g4gb5C`n(QX0w_f9xB``R*;6YdfIyKVbd#-LwY zl?`_USbn-}5JMryNqd0Gj5e+nZQ#0SE2pSf3U30cm##s+JaKK)&INV@X98R<#eaYk z$2Zt#3A|uYC=U5Ith<;%zhFBOEC&bEC9_YWvg*7^@);*F!)d>T{fwf-061p1h{g1(TolifGY|&xWwv5GKod|KsYZM z6n;DKDL;ncdl3Is{)@fd8fXSufC6|ufZ0Nk(0!DjhDpE$dFKkj94S(+Oppp;oP?1@J%K#!s9NI2Hvmf98sZxlJiEC44ZFJ}BdqXkMakiaPjLjmAMzaME8!!e!?kXn1`a{}XeErb z&v_T@f2Qes`GVMAPW{ZEQM~XoAumC#r*`vW=W zQrvO$RFd%I=fHpU10l3tLtQh`ujQup#1nXEKfC%i>4Cd7)mI0?CJ`d zAWWA5l>kHru>v1C&^c?YL^%p641YUoUbkezv0z02on_$a7#wF5EX?5vbmhu?(TTb-grSQ>wK_mG=IY8lf=|olhsdR)kRq8S zz1f5vco_4Ix4j?uUGR_mE||v*o;qkW;3bp9Lxbr7yf)4N(Ij#EXKqk1Di5cQ&=PwB zB!qi*JtdS4$BRq&NtHe^22D>V3DZ8$K;Tfxhy~L`BokFmzWl*4`-!)KS9yrF!*YJ# z;3$M4ppteI)!f@P05#>zd^2$35>Bw&7IUvW0MW)$N4(3ulkhc=x;`8}!4SKU9Jkvm z|0L!Io_>FA{FCvw44*Ovz03Quy!FFX)z5&mf9fHr3yyVMYB;&ke2CuC1+hGWB#Ex0 z@U9{aIGl38mzDBENlb)j6C%*yvvM^@qKcsCCbt{qbn$D%owG!9>BhYa!B)~PzTHD1 zs^0C}|KMpbW6;(0lmer8Y^YqKR#9bucwh#)fH4Y9F~=ySduO0FxG8oy!bK6o;1H5zDH#xstOU%58J#gvn25}8e~^g-5jY*m?kZ4v;<+PD zeuP>2QbH6Sd@Z2|;Kph(c7+MS{ug#c6|zeuC2<>5FkGLn_*`keR+yO>D~8Fbdrld; z>Zk#nxp=0%Ex42Ry=+;Ay^nGz4Af=b3N z*lEG^12O}MosbgY{8uc%=1J(e6anJ;W-JLg+89|ctqKmOz{IZB7$HN2rmS9m*7vUR8>f#JE zYD+$+8pA(Aj;uFDIHlR4u_aCb+8`z9j4GF36$b8Yf~ld!B8;BaFpjsYC@CNz$xN{G zbAdJ?e4;rRH^5fXI;WpDjn6o+#+yq4&kCVz0%3M(Ed^8cHaP3_JJBi8R2^zDgai2h z(jTpVjjCRidhNWdUH-V(Oj%s@iGf0E2CU=-_k*zV!8U^Cb*rb{5s zZxu-Ra^4;iPDca>zBJoy%|@2!F}#lcUD;4_yoEEkgk!hwkpKh7Fp+=oadOL)`vw2B zoxdIanLiKwX!GCod!%D4X}@3v1e%@dJ{+0i++zcpiogr`8|Pc z;@)-pjbBNTK@u^n%d1SkF$PutC)mq*1u|$(MUr%JYozz$0hLLGZ%m1Dd)r>xRXm3e z$l(y?NHT$J;^SKc(p-4^28UZ9G|Sdt{g`+i8Ec?CQiQtJk>~eZXhKGSQ=|^%Jbr)d zC%~V07=E| z>n3lwO>g1j0-oK7F#sA8Z8R)9RT*YDs@Sn4Z{W7{3>p+$$2jnC%2Ahb(aFknT zPeg+`>pV$qU`P=8Z5+(fXUP@XguN_mCVVX|jFK!{Vf+;T2)fGc%sj}jYk`QBpI9-V zHZxGuFR(o`1L2daU?(kU6vm~vZ7g%cV%!rR_c9C2X(#iQe9|7^76Q#_!hB5$Tf{VH zbyFD~?3yE;_T+w7bA9BGp8nkbZ{Uyp&&BXGqU!PtdF3*zNkYBRhRjA9KfrMCxL|19 z4?|B77$R_wN4DD~L63#&K4RxCc zcu5UlnsN8(zJ1`|NdMf=!h2I1UQ0+R2PLr;BP3oTnCluOL=3r2?0Y%0(zeODEKct4URGRKO7ONl06jS0P^u9 zv2%j}G}ZwM7~oD3OErR%VJ-32OH3btd*VuP6@NmRB%7iTDp7)oN1 zkXvCw$QGvp<%zH0pehQ7p0bYEFjQ)B&(13qyMYvuoZt{#(;zx&Eu4cWNu-Srj>SD& z$APLPUrjCuJb~+ISoxv7#l2vN-lWb|6{D_n&|+x~d_#cd`thd!GwXZX_BVd&pf#$s z-5@l3DlLr4W<;OAOd&l+Cs!*c3buxt)F-2i-(IY_NHad%|+&m(DFp?6sOi9N2 zz+6_Wa4>;OEGEq9%3-#!Me$t53?w1 z$V0^^{tWPM!Mi?w{|7fUZJq|n+yhf}i~@kF(*Se@vSf5%1x#Jtw?8fz43U9v{0dHP z*#+c}cb|ecm)3F+59RRlfB;H#S;cFag!6Om%Rdfe_VPm-0>n2ZWHX%9!W@Y@RXfE=9ctG(tZH|CR*8D6{6~KS z5jjAvmD~cq_LxFL2iqa*juucu4Uogp$w3H~u7R#qGKrHHMjvJ40eJD7h&SV|37os& zqk~`hC0p&kEAwb0x9EAwbD-Y>Kc$?=^RDtk0CRE}!qy>@klda8jKVnPQyPE(ej2BY z!<4W!prpXgB<&q_6H~0^?F@W*(r5R%Y<|L&hU{8{nC3Krd>~??EkF4_Se|g)Aek03 zM?O0`dRgFm(OApS^N7nboCp*i@;RH7R-%T*a?iJrGAJC5FH83|2$G-ti`Z^~1#p|< zq-S-|_oW)h#c|4fBE>N}>u3J=VLssTgWm*>CqSBu?xwYwD(GQ2fB~uwX805#qYrrF z7gh-RBHngA<3M7>=)KdM%E6yNysB`9hwmSN?LW844U+9U_k}#P&p6MB&^OwNVld&u zQD%%QI*$rhc#?RlqBd33`DSx3T!imJv3mxR zpEsK(+Y8?4>HSPaS1U_%j8Pr-*XBxinXh-|RS zwO%{`N$G>>3t3}v+$%nc5Q!vQ$3jvtZ=ajm}GpdUXvxFTtWJM0jGP8>D=zz+cZ z_tG#ADLF531j?&>odNYJr@QgvB+6Bg&1}o(xbLoeyi-y6Bv(#XqFzTdnNEHD`8-W) z#0U}QP-Y4*Q??eHS&iDN+;S;fe>z|Z3biy=>-k-KRpZhg`M9nv4 zo6gdGG=Kl;BFt)A;%ebV-tt9E1}s=(#Tjemaq)1 zcQF<018!VWGS=3lFqBz>FM|kuVl1FvYF6%pdR3Bbc<7C-6NB-Vk?82MO9J#R2{nYJ zoV}ispBa9RUQWlWSu-vwy5l$wCwT<^ z#s8=2uibZir{I&FcL=S`UW$zh$Byv9%-a<@HZOVg9S~$4`l50Ulhbj4f-%9IO{*s? zDGJC;G@lslcH1E?9R!g>Uk!c&O*qU5;lE(&R4^#$J1HXM>0GHfC^nKVLZH871T|Ca zM2Dpi(KoTy*; zA2|9q{|x7)KYdhJcByOWJl=ty0K>pw9)!-koU~(W29%um#*!7F06iwgo)+UnbFRjbC|U3l%v?oidF;z9r<<_03Uf7WEtuRD?;VpzIl6L1F*ICXpo`7!z9>@|*8SeC80M!jvpr3>% zlljB~yoZQL8yPn-J$A^-gXNeaMFLpo3bRQC86XeWj-B>N?dcX)8u!~*ndrEeTgWzF z`)Z#1N3~!3P53FDyKOYxqY>|=e|2)jpAP!VARlLVe&eI5G>*m@rW9cc4>$U1ilIVq zCcfFL>9dz=mHXmqOe8=0EX4?nXd9+tCu(D3-TtP%r3@2);;`>AeMcXW1V9hy%Z)I? za~)hI@lvR~eu5*| z>!pZiX{^!j4E7Mw68(q%Zk(u>Tj*Fh6eokfo^yL#Ja(XfTLr0fM`p;^Y+0 zdS~K&qVzhnx|9(haaE-arW_tVR|uzzV%v5Ah#ICig57}OL(h-u()EHM?0NE-=d0Zor21V+c%A9SwyEby1O+rCgUx>MiC;VP@G z+*54%;GeL)_LsXCn|}TA0>twl`aZgOKl!Iy*T&u}L*=V{D|DDR@IL2ytZMg-6z>}e zpPJt});^y`Df+%xo2jK*33piZUzMvIpgq(w<|5fol-L}0YLIVAS9F9;i9=F zK5mHj`KDi*zsx`G;lF426YpWagmub*rn8y<$kfo6ydlRE93bs5xr^zugDv;qts~E^ z-!}z=od;hBm-1*_eY)%uCOL1${NXO{y~@~fNlwlZBU=`#CCjsgk<`fnZ#gOtd6d^x z@vJs6jRg#bPGSUZrU(n)d|5l(8)~J$84_D*OippxjGO zqfEa8O*E#axjx20=S>B`DX+$#!~la|^OGfzfxaFT{;hFDyg#nwca3w5N4rRvSDHm@by;S?~C?x5ub!UStfz)vI))1MXq)E6i# z2>QY}O!z3H55p7-=&+Yy5k@W@PYF3{OwmM*QJI19F2;ApF(t&8PM+&R34Fv`!TJ&v zov(&_At-hM+JEzpDPHl$qxXRV|9RV^dyQUx^cKSB%6R?>)Zf%Hdv9d5K-hHnDT1%Z3uN`CaIa$Ym&`D zk68A-q@BC$ncgp?)srM@kft$}=CWEFkqluZ*;vY6f=9@GDX2vv&0##dN^&WTCUO&Y zI24}d1lhL-OlcoF!jvg; z&Y~-cdMb>MMOBC`5ZyEXI{4p=gx|aG01EZBTU$7g?oPAAZ~8bcGEZ^dZ7%z`z4?|& zX3|Koc7v4eF3!r;Xz&YN2G!BYZ6d;y%@QN+Qy4XT#&hA-K%^i87y_OP1I+;PF!^>2 z+$qMfMX+XSWc$ToO2;-a9{X(JER-2pA}2`5SR~h@e`#dJ-tmq|k715(m1^Q8 zw3DbL7t^QZN!0dFcF8QpZ8LU~$r{Jf6e5X`Ezp?CN#96T34uf@mW-a#bfVK-3a=5( zL94Lzv(aO#$ug(=T*gj9l}D~=l#uFYA$3rQYw9~P3)6g&h9I`R_tX6qRB7P#H$8V_dgv13xdLyNIhp zBX74fh#Mb2Ash~BfkH5n7?J22B7&F#cZ5t6@iR||7Ze}^7!pWOJw^aAgb=0_BclVC zeJoqZDBd+ zJQ;!-8)Y2L(BP#BpQ%T@jZQJ%E`^Z&S2zSUC_u*r!6Z^iLaxB0&`St+YC{;~tDkE) z37jel)lH2l!bs|xMsenW7ob=RFZZbH^9{0u{ab&1c(&>1fiKL134i0~PQU{7Mqj(% z>28sE8k3q7(U|T{noA8%ZO0|^1chW?#K>v|=+ng$4jY>;rX7MRa1cVakiA=g0{%XgM5=Eqrnz})y(oQf3ZO}PA1MN+zx7FhMM6}Y+{F{N1Dz*0}KW- zezNfFU94h?lrp{J(8dkBggls--x|7=~TG**L5Mv(FqC{e;8IP5R!l z%C*;&FyYbB(Tt`P2`xs=X!H_1MRjLnBZuVStv|fDFQ6}kW#aL376A3Yled}rbNvJT~b{f*Tn7YN!PbhbaI2P5Uf!%)YX-rf8QDdUjqn+ z1wbQBjRFl=iQaU6sy2nVyxC_%4EeRpuxdW*R zbeKq3C4roa8vq?1;;INx!g(;wBMcY?rU8Hed*X^jU#a|9dhQ>v(_Dc~?d7H6FOqCQ z4SgC7EV}jxPt=^nK~1C!A8-Z$gkVsE*z(?ueB%cpImtaLt~E5`%I&zn6d;A++8`nb z^r9uJ3~Fu502LBBg3 zwoO`qz9>^j?99ADwp*y9sewU>G`)rp3$(1{@wD#GFt!#1}Ws> za|^>{X|AGX>bqOBhj31Z!Lr~?;y|bkYISpUg@NxWk_d;X_N{D2?lGD&&OzIPf#CrG zm=L_xIyo@K=Qtb)F*WI2PFYCdyRYQvg}ePlhs}31k!81p_UQ8VbDekiYg1*suInL|Fjny?qUfKcwT_boAXP82^f71w-~e*bd4Ncg?+EBo4sWE$s6j;p&odzS6ey6Zb?GqIP@I zeR0>=;ofNqrd%ZkGsYD9p$=_UyPfQ5_3UPwSaV{*z*m&0tMvIvzZd52$mfIO#WH6x z*3`mBGPVaOR+APIwbB|<`I#7>8fzn_2JSsBjJkfnLIPn_gF8jULUI^2^(e`nqFMSV z5Bi9jlN_c@jnz3t&4m3mlWh=rDcGgMA*C{SOU=y7_V?iL2p*KX~eBBA%`bPx%zayvwEgU>h*T{=%7)@=Q{*;vRDI-&MI z0eWO3`268FwU+_`!& z$i3?zjGH*CjnrOC(4;odq*S^{B=J-YMc3FAnryr!b-w5nEeWS4iIjMWvHgJ;5xA2; z22g;|3}yOY_#&mNe!DjrTaL9pf>k6;*^32^z;euH?B`8FSjSw!ePVZX6}}~r-;;qP z!J~wc_`brE6D4rSSDox_3HE1(*%{-W#%lc$%K{216*~qrpX@D;v~TrnYi_Wn>ziw+7F1 zdU-VdWBQuWPr;1yK{(VNY_m-zhcdf~bQejx`3R#^Ub&pwRhTJB1{XU+QCv7NkW6?u44q_x6bFS&mv0?q>BI@W2Y`@Wa%-Kyluunr;A*D zVhMR$z>bN%2R|hl_QPkY(HKaEKgGC5%%;H$F&srVzJv~wNTD>yDv=z8kaboGDb>=r zGI&W$pEY9r=#;7GkMzn1D9(g|&*~TtI@4NCUyg{WH3RVVq0p&VPU$S=L~cJNft@-9 zW>2cC&|1c%B2!n(tkSKDXVx}*t$YW#xzoS#eFnuu7ZT8rx;r zgiWD}&30}(?UAFilJrfh5Sv_a8iX6+DurWQ*5#F5Z08g-s|9T2&dDJ~&~40aGLE$z z4a12K4O}ZfLaP{AGQ>SPOXLkA6`vTJ#uA#M#R8`gCWk6m#?#1~`A8)6t{m|R<0htS zBjbNsfJ;w1AR$*Fcx7Ob^wN<*$EjcpLpH+5$e`mcbPmLJOLDG`wud#v8T+qk0x{Db zHnTHpBXLZgWMeZ-4|Ezp7vmn2v^8~g#A2L~cSJ&(vgD}>*!7l66psW2Ry`(fwC7u1 zHU77lzThdy&jbB)W_q6<2L}Qj>G1}QcRY3c+5rP0pabM#1W)u8&kiIN_)j=2arL+4 ze4IW*uw&&Fj)iPt#z}5#@f=Mq7vcs9?Pl;? zVk|S}tR8ElHPtdFRR~uJk+EM~T1c{_Mi__26wW_5MU0n3m=ZFYK%_~@-bKb9Nv89u zEm$T|_&g33V?tPRFJ+pu*q(b~gs1W$!HA=S0sXjiM#%}Bpq5n>B3Vamw@wM!wGi13 zA=D{Rjy`Hn8CM z2s4V8GIOO(en_HRY3X7f_1qg#Lnp>*e|nh~e!1zNr2E!?PYcht$aFnp08pbFoZ?I) zzjLAfVkAKrB)R2^H`|Zr4vp3KW17>;nRq_@Z_f{_zi!n>9RdtO^hq_x(KSLIQ=kcS zf+X<>k9(!ifY$yGH3FTTE!rHD;swH z!GYB1xRi|q%V;9r14XW+If0+{sgniBiQ+8svr>}Qsgpl(DZ6a5EKr%<;3GgVfpU#p zaV4}7W@FtNb-U=B1RvJWW#YAQ7+O8l_QLEHt%#@9nS z{h9x%_AmV})V;PaZO+IG2co;-0TXZl45X1E0FY*<<{JHV zK5asY8U5HhbtNZ*tn&hOL4voMmihWZyMCOSI3FBjD!?7zZNW3J4rf9Cp zXom7P=VQBawGX+@#rZ`ZH!8^(A4FvqfDoW-HBGm}z_FC@QHv&1n2+poGBedGaxX;_ z9v!H6#ZK$b>0zU{)UF)i5f7E~K|O6|8jOXQWgG^@3?uBSjYyh?aY>rrpPpTqN^~Eo zM(XhMgo2WA;YMx8&Nw}qaqQOLt$y+|=4HMM``;*j=_gHE9y}>X*^Gezh*5<`zIHFu z>DBU^yM81oMX?CW@A0!}&x_dcjP0`LhUv5@$9#WW)nJJIMR*-OLhG8T|l18P0 z=QzMC3nw}a3;tt#{uB*zmVh|mk>o%+#UCGF zAPHnk9W>BSsc@E#Flawny&Jti6vRU8g-D~_&h&eTMx$*>uZ^Py|8R2Cx%KGT|D@$< zVWx{*yr(E@3)V2T3Cb$fPI%6(GTX*QL}!fB8ICnGJ+z-Kr@H8uTv@I)N6ay%usMj+ zKYGhO*SZbz6=y1I_-6kTeg_5f=!Ar+s5=`YA<`dtXbWrA;|7&2^Xf z2=}XX+~t)m7NoAV>(fP($M>{uxevK!A5ypvu1`xfYj4Hp-r*yZ^%5m$t)1{L#lO9a0d*&g8X02 zJo6ur|L8Bjfk95eEC=PeNZv3GMqN7tcmn@^d<)jk1IHA3)R3r0NCn~KW|oIMTVH#P45S)Lvlk2!riCS6rX_C)jCr>I_7*7&O`QcT zr?XT-Go^{bN-Sjxb1*d|aah}}5SOA{OPiPW3a!>YNHTOJ9Op*<(Pf$1`xV|rayg== zI$`f(p^t#cxg3;o;uK)*=S}^~d*;gj!O?g8S8|*FJCVP;mxB_Fw7HZ|YH*D~Ja^)? z`<-S7Ohgv)=0To=5*mC>hm#dGQ)|lqL5eQ?rd^X-7-md~t^p9=5*L0F9S+CmIIk)G zk65x=;be(j-Y5v=rPoO4v^?X5Y`6meAw89S949gb1_4ZXFp3Pk>ue0@;{~3~TsupG zGO~BlYnKmL*;BE2U? z3$VYcJO)3jL2S=xp2Fj8Jc4db@Y80EQ&!lKjL zj|>}!@t9ImjLL!O@({C3QKLe1?#OBwK4{wDbjdm(0I0=l=ehqF=Bx3q#PFD*kwJ!n z2qOk~GU=p^dgRbMj3>3EV9*R3-{VZ;jaP#&2OOZHgS>?2BJWbXgqCUKJw~CYX0U)+ zVW52gxPT)N4CjMp8VBK9@mcjW(5=xSptAsj!)vDQX=r7bx+K`|Pp9=Gj4$O&2Wlum?)Q5N!+GoWS47*k5J zJ%^c=NdoqBx_5oD5q1$Z7$|aX)sK)fqtb;Ljd1T=RclzS6UdS>8BNB8N}i?D(>mz) zi8^JOw!9qkx$rq!zL{F>a&Ht`-b}V=l@ptMbn7(3adff9Q{^WcKT?FQ!xYJ{DWM20 zkL084Bw32{F-RTGv}1W8j-%#j_ACC)N&jyb7+<=h>1E(fs|y+g7QhzZ5g1`94PL#x zwEVS0#`78VQ{gMXMF)Kmfs7avRLQd%h32!Jl)At;7q9RT7!=TfY*0M^8V8C+(6}laq|>vc42f+ecU6tcMgNMY1Q z8Nzbtq?)AK-}tA0fA#-~>`T9M=yZA^P@uM23Fruz7%PAXb(~9`5nib1DW~9%TsjSM z;A`qC14AMD8i|E49bn>`OT%nSWZ&@u^+YQ7JpSCSZW2Zw7_6mWpp)=+Kp*}Sltu@V zDF#U+i2^GCikJSu;A{V;nDIORzk5jC3t-TYLiR+qPZ}`-)Fdrn0@(G=bZz1Fsepp+ zAZfaBXF%aM4y4m*x6yIvfExq?f^k9E=hmK^u6(D&%h4Rc>G-b?H3QKNBPW`Ol(#E! zfu(G}^2-(pHcq2Q22aAs6ngtdS5fPWIgr)rAfKDlb(THpv6;HK#UGYJEMZ>? zUY#S7rY!Z;Tc%gB;L{cCa3hup=hu`(#uUTJ1qr_pKP*QM`wHrO-gIL z^gl2BmH)-mFZrV9rv)uQ2hmyd7yKj;#`M+-)HX$a4Gg-|nR2cg$6rfx7j+}UHx$~L znS`yb9%WIC5T*mHX_hWVU8VDO7axoXL7|`Ue1ssky~GILkVqhqA_bRdRgVNkEEy59 zN(PiJqr~5M4Tk(?=6Au*{U_z$@p}^#oOVW@j!@yDjRXL}AJTQ5vpCLEPPuaw#L^ky z>ihQ3ZaR(h8r^3C&1A}9zVLtB_?4fjFO1bX9Y8aUHzt!TZ>KEv2wDv3Rw!W1qrRjMa0{T>(T6eM89cMGZwiY1%m?#NlSITE13cy zIYs2kRe=J`6t-rPImRe(WnvgDSI)Bnjx~*G$q>61YT?s0og+3C_@JgP$&Z&Ps)8Unkg-{^#6hH0!%-`m|@z>$6 z`A*bN3%3jfOm~RVDFaDB$U+JC6crw#mod&Q(4LHS9Z9t>9YD_2tk*&KJN5NQ~4Nr{fhq)B6FsI3Fk=6$nKRho!exMjr;C1N5*UBZH}_)sg`)?TxSz-qq zxOc`u=f=RXbmxy7OcB>>ZquJ)FS%K8%yi|ycY5Zp?MP7LXm&Ba-Q*Qld1FY#Hv)g_ z0>EdGklf}9+Ml>IecQX&eukkExD*cJ6pS?puNZ4F8BPD^zJ8CXcWPDKw5 zWdp2A0w^IlEwtBM)u!gy63Hr$tGJQVvCL}G0KiX{kcT^G14aaIYA~dL)uElDt=a@3 zOCt9OdAnb9TE7zORTM&6y|786$;d*bmJ34P49Dfra)9Z9teL&K*>$5eBYAp6e^7an z>EeGL~^?c6X+3i zUitk%FVp6fEA1~Bgf}425j0K+AyevEYHnfLE&Av4Hu^odv|E^5HAh7essE7hWwv#BXMi`j9`5?|>3O2F? zlt~9HiYAcd@Ec^#X+8Jd!$<(jtbjX_-C(Yo0bEHC(cj^XTQEPe#9t!o35Hj-W68om@Fx zM3X!!_mGRMzw|7Li3RTGQ5D5+-WDH|T zG>K6}fR3@IL-+`Y1pqUCPBZ$4(a1I}_ta{u!yKxEp#3}W2!O6t3ArFsFi=qAi_6IL zAmNtpeI1M>R+S$zk0f%9LqWo!*$lfPZ#66jrgSuJtmOWcB#ag08&mieS{@@Ya)HBWoejIwIhp7P5JUnAd5@73rl1o`Zy_TdBRsf-4sy|E8a#3~3d;O} z^4jmfSN;jxGsECBeyi?(X6GxO(^iu;Ge7uAMtZ;DH?}Ba;iM&Ud!2l8v`+_QKtG6t zEAwXfAiH(yh>l3fM!Np&c6&H9xB&so#4_VYLxi@tJ*RSZxpN;F!Gr||;F0JQpUa_m z!lwoi?xY-IF-G_4J1+;ElRJYaM+jTo%iLz&NSHAy%t3^(3)ulmG8EuRMInU**HfxFUo8oz1RVVsR#Uw12K*qk~2^< z;g{)c;-c6H!Bux{YuG%a+{BiZBDVy!r^!KS$;_IHB;+tEz=2DXanedNraX48V!X%5 z*Aw9-9O><)KJHU6aNA(GN{W*)%!ENVDIXApbxxF^Z;{kegtVA@nUvm}C=Ymqv|b6_ z5m{ZwXrd!xmq`lfXNr8KVQ1Z_1`ov_cr(c5gK1|Z24jDWeJD)1VIMvYXYdDJ1k;60 zZHHWe#an`oqVQSq;nqEPYgbp_vWm}v0-E}z35a-mQYV4~X~u3z>Q)3ELI9(?H6!;J z2}=sf4qzPljgJ5d)Z;-{6i^FUIeen7cs~>JVKvif%{ECpk#e+rGq?qQ8G$vBhw&!@ zbc}BuEZv=u@eo3R$6n}-6Ub)--)+g#-^?&&6;q4|ul$65ZX|r+A337T5}zi3r_jZxjh3>&8I_`gCnoTHC$M z_%M*@u$=8-CW3FGDebV>uYbwn)eyUUa6VdTI+Lk zyAg(SVd7Gct>32{Y_?ZoINezH(WOq+O|pE2yEMYALzKNMA#hxLkZ*RZoowI47?)_( z*Zy(V_q2Ihk~TaQhQLty)G#ec4HpI?iJZ}AT?2z7U7XHwe4^d@{XkO-TRg(k3p3ae zb;bVALaxj>8=a->O(v6GLL=%MgUQ>IP=(WjNPs-JgakR5Luhvfa9}4A+ylM~4J+U9XNa(a~pU^kXSRZ78FIGGnOs9vGRzj!~D> zZ@5q=|JTo8AeseSane&Z5(^n7D6WZVE{li=B=&1pj$;h9H8h{1?2Ym+%n{drCBV{g zW@Ks{I*o7TPp7)Kw4X4n_811W-@rib^v+;7VbFC;>8`KAwSUQ&rY;5nT@$_BqSI^DmB3fFac{{gVnIo zH9!pJY{X!M9^Bmso1&9(6(U)wmfYGv5a;Sz@d4f>H&*hY0;|37BcDen6%t{>Q=%bw zG|wh>h0$oA8Aa$|5Ly}d5b|v7FfW3wC`NKRz?LUJeO#Yd{=|(jN}02owsNxFMj`&g zX}@M-<=>NCo=cnQ-rR8wf)}HaSd~G%1n( zWV{M!7s^>uZ@+-vCIAc!HWGr3Fa2xZZ~dr#w&_iHP zk~#du2xiGY+0$cS5KeNT#7Jg#7)UeHm7&q*4;G%&o~;05Y7ht$;pI}vw=#YP1bn)D zpz3e~{8_OG-iTD=vV=aJOTpaO`MxjYvS7;@b&4Gh!-+?0K9{4{(>v1at!xa>HO1y7 zEebkr`wR`2uv7M(=V@@=$SJLc{oDxX7cv-9gp_4UG2_I*&FIJI_S_+%D?w$z(!%#N z1)nh+;r~H{T#y>1X{-K4a;b?V-BkKa_f#O`CW>zwnJ%>3a$1hgiKp#j>Wb-alGIS< z>Rm;1w1ib{9}Z7v@aHo`e(v1JwC8u*_T_2&tN%0MZ``wVC4dkZj5V#LB*j4ZJP)%6G*ufZSvcQPdKJAdtc;V-;b z{vxc`oxk(`Xke6reerO2nmN3TT7@vaCk2ay z(UcS^@Xo4@cODWrvAlIQkgrRuO5%(W8e!%&$TLi!w~2l>PeQPO5dTHSu8b%IyZFNU zir)_Vd+sx%98-jE43c@^0ftwG%GdspqrP0*6iFtl_>kl9WY&f~jOPfG7VaJBIMaP@ z*oUR*9%#c*3t=pwZJ(sMB^!HWV~!XH>BI${a6_I%Vwc2c8fHvUBis0|0_FxG$CBx4 z;b`CbIjF{A>7Yo~ady_p8#!(;WycZ@ zf`U2XSDl>LBTFWEGMIaOh(BhijgpKy`IwqnM%{jDgF>>J4BCzIWcV|Y5Q!-;#dyU- zh3~(o?N8hGZzs`T{evue7AO!VfPSXye)xfe@IF1v2cMp!IqPnZ72qC-k(W~5Lg2=o zT}=yQ?08|G3^p;&rKG461(SS^mgRV4!}Y2-YPPhCVVcU^F~R!AZW!H*~v!C#1CEU7}Nd zEC&r%3_OpPe@Fw;gQ0X{MoVbPEU7mKm9iCfd;`L0@Uxlua$A8e1&Lz=_f}+sCmbq- z5$B6sNboyNrlA-dI=fx5FqWR&9#=Jkq8sy;BIuLFHOvL$fTprlfFX;EFD>jiWUG&R|EAgn~=4NC^6YU_bbaEx-Oq$gljO{=)wa-77%PaEGRLS^teC z0!A~KC>! z`v!_eiOGNft_K{8Z(1@ev<`Caf}gnQkJ|?rlP=TdQ67LQ}B~}kWOq8;vuwrhknR=iN2#J0pm}Dd}+x1~h1PEMSVLE3T&! zPDHz?nTAkyS~MPbrpe@ze-4_2pI*|X*k_IKnOZaP5;%bf038SbDB$v&P2XErBqTup z(C@kP`NkMX;II8hfPdnL4E{`cVn{ob;SzUAvd0gyS4s!(wnMuH(z!ES%t zbelv+U5WQ})h8%zu@U4V_(AO53Hu;+eU8vERk~1Pn$hyr!{S+Oa&C9Y+^2{orNsty zL~_+*lFT?@kWRci8QNwEX7A?-8LXjnFlpT^ZE^ z>4LP?Qfc?i4~5w~r@5^e8(hKk}{+;F(T{+N?t_%{gmm}~h<(;vM1UZ*@Z43lD z06IvxVdwxo1cu;)(F09o$ zJ8A^WdrXLAhCBq%35TTp4JZQ%4Rk>IPaxQ)H{MGgfneGaEDypjNUVR&^ffRT9sivS znP&?C$Vg_$630P7!uLi$08n6PlptOB22c>Gk~R_|&@i3Tfa$?Q8?LBDOAf?)+ys40 zLzzyYcctaen0=Bs)MvF1VknOWC{I-(FoUusSD9)737M*#ymzP1UJKji)ExR+3cpGa znq)0x2b3tL=I2rrGG=KVku&vp$V2k8jR`UL^3l?c{M$F?|S>MjIH0zTg+%EP1h4$y`S9`WyV4Bfv!)%UyfX{ zFP*ADhl3Qdlg3L1hN&`aM!c73D>@D=0+Hy%Z{4K7PpkUpS6}kCZSHYiLD&fz>@bky zOkI|#5F9{_s%Fd2h6_fWm1Z|M2m_6c_!BrKz@)mPE{2G*#As3;9O;~HwKtNTDJKM% zI3>5N0$>^m8MgfznU1qiNU#Z<5qb-58wr6sAPWox31NsO$$VopBT}*o3^I+{*Zv*T zANlX&{NDcFzbJVf06c9!22Qavo|${VOA$tygK#cR+-8A56!?T+) zt7=Ju-s2tsBixM(2C{24QhbgGJ^&FRPgNLHCZlOW4LVjpnI&%X#t2W%z#sIP7V@xV z8>=uEq`fVKU#O0bso`)ZDw^ezPdVsUP>UzWtU9;kM?_*tlqnmdT&qLpk<9ZkD<9t;H82$ofF@>_ns>L0QG#eWq29lsy(^BV$BR@n+rH!hf>OML^vd4*01NVRhd=LO~5J2H4Q#u_y zL4v7WfMY5l{DBZU12g}e>!^ENmv+eFynjc|jeBGm3bf_sgDz z)v)f?A5Z#^6#n9$1pdW8xBnvl6~CLE9s~gd0>%WUBo>#_Yh4&fkn>zY0Rkw%Jphm{ z{@Ga37zjS3yFVoPBNa1b%L|~QvuIYj>_cV7Nl0c$NTmpdT~?Fj)y~SZG)UIaAA}tI zPvHGQz?9H58rTc*41nMmXa?vJDKV1UWSHw<=}Tkazw&FQP5-Lu_xwnZ=bzD!{G*_a z&P+Zs$Q}%51%YpP4~$E!n{_3pZsWO%;WUX0np3A}S1sM0d@*ZH%kJ8M#5= z02GlQ#)22BB_+xjio`r6^rWy#3*UU=dT5ZUc3}hyZG^aRZ*0+CEI1G%n$dM=)@(oP z&~P|~sQ{YDIpab{Bt(H-D0u9RveUE;9>$u}thZ|ld8sXw z!8T$BC*Kbk1oy!68Xc5kbPj`fe;eOz_4Xso1=HU6Gv$v4z%SwXVIcpBoS)xUMo3@~ zz=W`=j|>=NtTJ!<5DXlZKW{Uoi?;*|0Ipa!_{t0l){$CpgBu*pUd>AjbEj@$jjVcl z9%^9f7VEe&BG#MR2h324$u4o(4WiJji zS(3A+uvcMFunwzITTijsK0?_;!TMpMEcvpF-hn;`dQU7J%3w4*EnnaUW89-oQYvA3 zWVKXCs}xj=FCI<_Y31A|IEMjWbtdfGjx=jMHp3 zF1vcQmBS>Z7=fWM$kmOb6976JdISckKsjTb;_{c-AN>@3vuP?A98d=GzvTJnZ^7UC z6NmAc|0|Lo{0Nk$^^+*Q0DTq-B=f)^KHy0ec6eVa7s^HBCy~m3#xVQX=aLl^;{^>ANn(*CUdf$}E5H4|@f(}*OMmXX@^9pM1d<;T z1@56N0%i?;pda!N_Tk@Cmb~Hp<6Q2sBsl4`C>97lVMf?fFC|P>i}Rnakhx9z^z5D$ z6Y><{Z24UMI-cfgw(mylWIMRmC&FjS-k2I{yS*2uU#^zVY`2A}5J}@q5UHnF9$OSz zJcL=O+|H^Mrg63p$`(x*;}6?{fgEJza@Cr3`q)yiwiN*8S_`#?a6(^8mI5gBLo$TN z?UWES_I53aas5nYSSSg#w5bb1@b@9g$rV+_mXce>QrqiKn9BBHU*6 zzxYe>cfJCaAe2cCNhV9|$_G%=4h-I${E6@4%njad@`RjM&5yVeNJZz;omp~PSVBk1 zhZ>aJ`)Sql=-IklFXfig@8RqHMgcUfM%?vf5Ct!xIbo2aeR^$=!WesF`w&L*#l2EP z(u6|D5@FGvrX~v3tkBxY;Y0h}9@go$d}$}E^EmL$5Z4aJ;ObtCu;p{;B>90*j=trB zsY9oalBkV~^5;%z*ep}AIV^)DMFtj?lS}BH)-XQ{jA`gp{Ux0!Gn%UKTz-+nPFq{2 zlONk_%V`wwVy7*$3pbv`KmsHQckX4n>?OYk@tKrPB1ju+Ghbe^-WAe|a3w7_G4GS6@3dT}F0aKF@44pA828l~z+OfeHUpHp&!9v-z zk=k-Fi19%W2DeOCUJ?$qTI7tq>);qu9mM!gX)%knwpk2EnEFI9t>&eU=;(tlx2sEc zx=_iN@@q|)(u8Rmd#4(ELmafX(+5pcR%m(KPl07j``o9@D5|B*)Si1n?Vie9sQRnr zFoW81ONtrW3oAU09a(1kkicLBH{>d*a9WCSW{8x=dE<`z*8kUl=0m-gp5mQC3KrBy6B)5%`hI1tILv594=NJ!v>On^Mz zg#7$wgbW+pe(;-+>6L}A`2Ks+?}h*52jN%#

    FXX??x@FqQo9!D0HaZ8wlFE(OUY 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%0D%_Hzw@c9g^mt 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

    h96YeOT!Z1$MgORT@Rg^}R(&Zx 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�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 z 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�b!~dg<8>Zb|`-x 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
      x@IJQX4vPmbkGIOm4)jjP|%p#%-MVqeNmpsNtCS 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

      E!T&B5i+0>l7)Ac83!neX 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 literal 0 HcmV?d00001 From 316493bdf72f732d9417ed7eb44a5a293ffb3cc7 Mon Sep 17 00:00:00 2001 From: Corinne Bosley Date: Thu, 7 Jun 2018 08:00:01 +0100 Subject: [PATCH 044/583] new test file --- iris_grib/_load_convert.py | 2 +- .../testdata/faked_sample_hp_grib_data.grib2 | Bin 1855244 -> 589415 bytes .../testdata/faked_surface_pressure.grib2 | Bin 182 -> 0 bytes 3 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 iris_grib/tests/testdata/faked_surface_pressure.grib2 diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index d701153b..ec8dcd97 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -1367,7 +1367,7 @@ def hybrid_factories(section, metadata): if typeOfFirstFixedSurface == 118: # height - level_value_name = 'level_height' + level_value_name = 'level_height' level_value_units = 'm' factory_class = HybridHeightFactory factory_args = [{'long_name': level_value_name}, diff --git a/iris_grib/tests/testdata/faked_sample_hp_grib_data.grib2 b/iris_grib/tests/testdata/faked_sample_hp_grib_data.grib2 index 529d569d12de30f707367b4aa9238bc27cdd52eb..a941d60eea671af067a01988eeade5e5c9957f48 100644 GIT binary patch literal 589415 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

      EVm4{)H3Ir{mh(srn#{x$8^E8($q5B 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

      fznu#E6tu^a*^HeZ5VtG3h2wT(1pmN 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

      S@mRCCf#;l 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�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

      FXX??x@FqQo9!D0HaZ8wlFE(OUY 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%0D%_Hzw@c9g^mt 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

      h96YeOT!Z1$MgORT@Rg^}R(&Zx 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�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 z z^)eytxXJI}y>!fSG;H_=V?C?PhN-491OEnY;S|?$Cd!D8q}Q=q#=Ecuri}PTl)xF( znZs~2ci`wo{#to-k80K4J!eA919*3vIw%f8HC#<|)9!VQuvT7|STPr*jQEbSlPs;uurM5$O}CpEIxv;V6?qGR5w1b4F^G@8 z0-NjDFy8FI*K6WdxQ@7N^61^LkmJ&Q4fE&7sR@ZGjn{C?i`5zLo+pi#LBe8E3g1bW<@$yXxx zS0L<}rOb@cYC7=HdsK!X5atj)!WpN|n7LX6YbGuDsRF^6_FD?6A-#agfT{PM3?Uhy)YuyU;!}oK@;ycUS7d#&KrTFQsTol zvW_u0%<#u7YlSdz%uk;i>^O>Bc+oljTz=_1bH5DqDF_fAzD%V+to3=sLnVIM|J32h z7|)<)y4I-o;batN&b_!y9hsTE2;-PHGiIVXX@k)@mPvqa#d;;FPsy?AtT1AvDl00A zu}}A5KW~bPDqTxAg-Xkw(>v`0PwBXiVUwU5u4YP8klqp)nfv-g^kw)IBaap&PSFaf zF^^NOlR_VkY80j>Xf;%{!mi;9Wlfgx!34=g!;mIj{Ofn)t4$aef8GHI^r^8jJ9Ng%JO zX2(d5*9TZf%VQmFv8uE4oPt<-f3g7cgYZA?pMocTz5*xCx|_|D*)S)Dq}~6PM`Yk< z&NJRGp>fQiM==7Cnd5CuX~&NdUHA-`4S_R|){sHWmH54pc$cXxhVE4&p+csyHLB{) z=(>ueTR`#Dhs~DaNjK9_oizjcekNgheIPU7)`s+z2>Tb6KOs`F6JC2!cUO;U=qNm~ zc`08vR+Dck6Zoz^soqN~nQ~E)1p$R6F!BLLq}DnR01xA#rN21$sK5a(02f0rb@<_o z>t02M(^+3v*b4`Lpz^Up_?T@j^;LIcXY1mqfC#^cJf)Bez!cBa2ZUymmTmSg_uK#U zK^SmcKLY2c;Q8JoR^4q=m3Xu**CwP=F*sK&^Y!OciEBjTX(SU^V*7LOTov{ae{>V= z6?;1#(RoMn=y~Lme4vQ(=EOaDUJr^VlCQNRqEdwe=Ze0p{Nu{G*?U^Uq^s{j`HW!a`+gx#){a>C8iC zUke~98g{-*Qb(yXTpfUZy0eV}k?`(>#W#?kT3yiyX zoHCxGN&nET5}e9>-<#(pghI*Ub1F7h0mS!g349sBpOYy`6&uSX&L&AaMytSD+`;S& z4Tl&Pw}HBFTLMRCXM^3>9_t$E4kS~9jrpM)Q!^5=Gvjg3M#YKBpA%=p{)*GR7yLEB zYBY;0pKjranW z*z)+}&M|=YD&Gg6H#_eRCl9c<@9hVW30z`VmGIqqr$)<&7SQkVNC$_2-(8v6V3nDb zxWT&~u`E?)@r|oQJ{#K1Cl2FvhaTN7!y1gr$b>&mgUk$>gWtf5=DRKi}r1H*9Hg zG%mI^Hb3#g{+^AF#Nf=^Oz-{nl4mjlA9_YBQ*FTB!aYy;eluViAuz_@4qk_HnXJN(pM0x@9tln1^#LOlObEqC*N$sJr(w( z+dpCM33+a7+7T`aoNjm1==;RqqP2kQedXDHYq?Y=)oU?T62G&mm`aK>70%23+Vq3T z)aEN(%ZvnSnUV43+jOoiIs!25TJ6uN~L`CWgqv6liQWkFM@>RXC-XWBG}BEKuC|m;K^Au}^(;SL30{*JGq0J0~5~+*N zrtwT&#>qr=CY#s6f;q6X64*>8;sS1~#l-+$JhmF`OZwFv=+6Qlc=nsh-1Cu)z;xR+ zXf~ddD+`c-(!JZwU8TDxop|A{uBXdQGtceuphVkZ_O+%a-@7aFmhB3qBO_USMO(F1 zUX|H>k?*4;p{H*5fv@+}e_LjRK}_J5Wl&*Qr|M$1Ts*qfktTwmLWX34UjlXgDMZy9 zDo4v&J{`wk?9XiiIHp#pHJhvD0-dN{QjPf(%n!n|32(Q5*?k152! zYwuTqQw@onjJ~uumjs*U@V6LRtrz$(b5F+UU%Hkv&3U%a>s>fq21v)lNGxcga! z#hH&l?{~oKP8OnawOr7O@mf=>&v^^*n;}^?nF3=egK#6EX* zQTsDpnPG|*`xG&fLYjC2!wk$Zre=)q7gH6B7R4z`aSA9|DH{e&)b43P@qDqtVAjtJkKqo&pf?Uwlm|l%lE6OFp0c5GNhL2n)S( zyUOCW5Sf}C%thd<8n%qeo{lJ#7z_i0u11Un>gWg)y?`m=m9u6pQU2hqF6Lw5mrV69W_1(CGA4RF#{P3Y zb^bB$*Q56Eg^f8;5r6|#AA=eGHoZeT?cOj$Vv24vQD?xuoAx|}Au{ltx+Rd?%6G;X zm&kNPUouOz&n(56vD&p-fSAhDG8@7Zu+)sSkfv_pDMW?ewF9$Q=uXX} z3%CAfHdyGiG-cHuM{P%7 zT8obQ&^WKXvxYx7F-!pQJ09x}KM9s!0hqfE(qQrIqhM4+`ed5*wN{IcItzrW`%6bu zI>|*+pDs4btT5xA(m(j$3G|#p3vYZS$gwGsn0?q}HvPT!eFozeNYiJ)GOqIkGU{Hz zONmUQfxLoSfOCeeiI^hra8#}B2!Fa3Jd!=)gm!%BW<(z{DGL`Z+R5>7jD!jdq}Mjy zd<*l0Z}}ADDD|l$HU}6F)Zo|z_X}`z4~YLhDGVSmLyTetHs^@dT5o9~7*}UC z87O^Q)Ag5*i(i#!%_!zL1ocAbr;M3r`_2Sr2nPpdBr=EOarCzWjzjNpMG*UxTs|jF zxNRl&Ef`6CW~-_|1B$B&k!n zQ>!D)$S;Kq|CJv5b#V_NwM6I};Ex~=++&wDv;4XxUtGms6e^RiT>X>PVz|9gH(e z-%RfwX~De76m$@d#`|_zzw0aX&Hg5>c7y zGF(6hrjkkj=gi)-R%%?9o-JYN0Xy)ga1cuOxBjO~tPx*^+MRBmc~DFih8b&Y*7$hg zj%$&$lK1`APQJ-FOKcDjVS!Dvo9Lu+~IMXNq?k4fw zI5P6`5h!dkV56E|rhow;rqo))Y1iQFz%X0tQ}C08%8$nlb=P)imK4|#HiI35!5~*K zcdK{l)R%B7BMf!0PrjJ6Ms>S&s2ba>!F&+Ne7LaP zxfRI(*PB^_$^d3=D|W6{z)?}pf!B}seMh2K%KodzGSe3wtexpmI92J4!SC{%pA2E< z@F|1WW7`T>27!;ZyAU%i$*~17IgXz|hWSGmS3IH#ON0RLbk7<@u-4T#uJ>_dSU8fQ z8-|SB3P$i$eijMK7jT@S#aA(z!sPxM1U9hMe=$zCi4**id2U|i6cgt6r~5qWfAm)& ze#-N-!>p;XwvAN1rlvTz`6C;2Hab*iie}6*sHX0_3ExBb5*i1e%mau;-qo6@xZrMl z-Q%TK_g7Q*Igf<^C@rKpChG}u>*5#IZC)$;*MgUB*;lF6KVzV|{&cV_)W@y>KV=8@ zsC51W0al_l^3F2JS0eoX-|(z=<|kcyRbG)Ki@u<@IQdR7m9EvZh&=GTZo(2&c4qbN zZvuaxo<7x`(X!tXm^qXbNm*C%+4eJ#;iD(o%o|$1691Y$@~d$#*@QM2cT?)X*irD5 zu_MPg7ZQ}L;c2yDrn>#u`3`hH7(K=V(|x@wuuN;q5JtQG(uRi5pas~#T9a9WXA_40 z?Y!+Tx+r*HXT=!E2Qkh$&4Wsd;vPp zTLP6aLIg@5VKVwP$MpK0_lxMzrjI?2LCiooWDu1%`4eYquKsA<9O(1k4R!TNPj7Se zE`v?ogqwLVqmIvPU<4wDsIcPzey%Dkq=|=23i2UiGcPf&e@@sUA0jm30jY+h?X$q@QFS{(M=bj3U&;zt10MoN_mbBuGsA8S`D9hO8M>LyLoYE#!hDz3zstO#O~r6Rphs(u z!PEUlY$Uyx#6O8kt<6pQe$mQ2r8e|a3MgfL$C-u30)ttDHd|>1Yq`hD9N~40u#kkY zAVL0|QnXw@0&SlC0iCQUYUYq&7o1pG1MCn?qh!vcB|=`HLSj_QfWYxRD8!1x+O zlOH>gSwwUh0fv0dd zopS5FAn@G=&}HHS#Zh5N$q2tH3@%6=$f#AJw8}g{P1>gRI^R@2n=Kq0?@vCuvN3o8 z|7VVvwx2a(_04V!^STCkQQN^>2N25JL{16~Qog26Wxm3x+lxo-$>-J2w@_#`)MZ|{ zGmT>~lk-paS%8|0X&&UI4ll8$VvMu-J^gAIFva#RW2|W7vF(f2$Ry4aD&hdkVwlua zH~}cQ+Xf?SegPv3aI&E0Y7=!KjOu<#Y_z^5{Xgrnb{jnW=6;(BTsNW0_)hLJoDb%R z5oY0=jFRT&d)g1r8XtD}BcAOkJm9 z#I_`QZgntCtmF|Z@st;B+TZPo#WB5en^)ip=P8)X5=*lL{7I-uP|KvL6dG!Z1h1`S zng?Y;3*eoh%CH%&1u;JK<<_IzCUCi7bfNR5gCRR&Q3E%#LuyBEz8L0AjC^7Ds(LEwHi-WX6n{Vf%jO z{6`|UWDXFn3L~AFnY5Jpa{}NCq4Lv+;2z5#;SAfkDql|}*cM0@b07xgGNnijRg&2I zmKQE@n+gv<#h*Vc@=<5Q_^H#+n|}=PkNv+~QN5H}A63%Y`6>HQN$2PbEt^xF*=&#W z3pi>J;PjW~^*YEhzh*f5td#eAp1jYV`3~GPLU#OG&gNX9XvtAX@8YQKd+8R^0&9nQ zkEy>F6x36Y3Szq08IN&VUB}jW%6OAQ9w+zofRSEW`$Q z`DWWhMm-TPISvtMI}{xMRcq2C9#v8#A{3YkkIaFzsilVhoTmYQNx%&orYKFiZKzxr zguk8uVo*G@19xC6yxW?VCe8>g0f<&!3?8TD&)&PhT7CT*%syOySfonhqDE>54$+K6 zIPT(zFZLTlGnHe-CV;JYjR$|#B)4=6ZTe}w;uKn8_(7!Xoxmlg3uy$5|7<2RoW|xl zv1srv)BY5hp%J&4|EG2{cH9=0)7bHpB=Tz5!ch%LxgAiA$V~d-d`dj*SR>XQ;E209 zZch2-tauXS;WSQ)@~XhZ@5tIFCS`FJ&?&`=e;4Ot-VXdr2)Cn^!TSZi&&yK70|cgG z`B3pTxs#3@!KVYPp>uTzx2iEX#hFq>9&_5QM4g}1>YLFu&lzCE95aE3)8k8I+)@Xo zh)o7T-OX`x9{g~=oT=-4Zb^y*d5J$8fZOD*IIRX^N&#=81yK_~7*-P<(J58(3HK+9 z&W6dlvuFMxYYnyle|NwAK78$dA1$AMKjkOof6BuAL$;-T==OAKJgPjbJ2Dkp;|U>6 zGpRD)T9zDf)CXtk*6oqfsVzxiYo%!EI+B^syxefjmz`yNTD{d-#Zduf$78P$ zq4ioYuONP9(XzL&s!g&Z(SqxvV8%%7h{th-m#`I=ha+S-{UIrG^)|M&$ymoC!U1n^ASn!vfHY6;f-fk= z#|_f_C@IAeUQ#ZWJAQ%8R8rVpO(JoWudF2n6vXsW!JInuc+YXm5bhYXKJc{rR1%RP z|DF;3-l;Af{IUn$!|W@lj7FT=^4oYOuzZ1e0Xswa#kYcW{$F&K!%oC@1R$kVC0D>pHL68mIy3tLO>>QH>_OhF>t zinaBIXQ~(I@F>v(GIDdw48tW}GL0Qw!#P!DA>Jp2BvN;LaWSyHHwFQ>FRsWOsN^*x zcCH|=lbVY0r3mV;CfDvLj>Yw-{6)i0!M+CXS!jRE7vLX#-~}v3-+t4+%m6K7Wd1gv zh<~`x@??R)&q<9(9n?@xxpo}Tnq;J^-%>7xQkHM`IjYROMBr+d?q%1F4B?h^ZVNaC zDv@+`V9Xxa#ph^DMNAnxV26XhR3hJazV!JBFD>|-QY)`qw15m1!K?pdmo4-v814cM z9(H`=5og^-@=Y}afJ30OxfxWu9_GJSMsst>XHeg@#zhzgUe5rly;MdqitJ?hc;0b}-*l~VdSv%MxQkD72L ziB*{KzKGL4#;MRHtan=3CD7bqX<||oQup4th?XO>T`wLHcn5DWwA+GQCX(ADo<-wq z=ENUhoP0re0{gHrLL>%kpoEM<6yqZb6{9YO`3Ou364(8c=E!f5K6+WejM&I$PTKCF zZ+mQR`w|hW&`{Gi0x2@h3c2^!zCSpLf18O^B z_f`Lq=@G7dIPg^;1GT{Qm()sBf8H_=$xA#63#Ry0aojV5$qs`Pf3SE2gITDr!Jd#4b_~9)6PPSdR;>t_y zz!;B_xeCmy+;9f_a1dAK8@jg-;l7T%{j&$C44wV+WWcgLjP%o99nYQc3|ocWjzDCr zf*w1WHA{s$!1PQ$B}ic)KHCY&R{_x!uq6zU41^Z5Aj?4vTsZjb*wR1cfj>v`6M-WWdC3kW{V|JK$qsy) ztJjL4(Wc^SXU0S!Hhk|4XGG7GzT7hHdjWPbNwUzAevn##Q!!vpwcQpPRRWt^%;MhW zh%X&j{B!#TFx|>GUQ|PatT@oFDNc_zo)0{jz-mz1I-4**9s2^b17W}VtK?59td;2K zEAemoPnYx4vE}*Cw;2GvlbRg4R{!U41S8E=%xgVEe@($Xw7xIpQbr~Hc3+h*XP9Y0 zj}}g0ioDB?p2ZkWg&7&xj?jlMo-c7B0I*~dr(l5F&#AL|0x7iYlVG~Q6d3REaw4o# zSBDtM9o4uKPj6q#jJ&HI4;rVsRiD%fF^IYNi2=>*mxTHyb{fFL?CwG>I z!~zXz!j50A3yvcE5D**qCBrs!qJ1#K7w`xKD$J1=`cHnr<-sOpiX#R>7-Ka2DOloT zIe;(yf!*kths?>DnIX<(n!^p||7FkTyv;tw%VcuL{_!P89KOsdcLNP6QB7>&oOmiT zMiQ#{ajv=zd)bj=D*2pV=+`tc*bba!xIwv|GYlkwBS|tAngafP{;Oe|P(8Z-^2M7?5dj-Rlm6nd`pGZ_B+^>SM9X} zFH5g2xGu)i9oE=c5IbY)c;CKw6z6&PQ{KR*-HsvTXg-tIgcKOpw-w&;Ql~6X`OHOv zFB8oXJaCPzQMn2nQ!A0}ZuyPJbJZBwukJESbL=uEMob?6s%S-ttb~@g9 zxQ^%>dJou)lLeTK*YA+^67w`>EHg_y3VU)XBr3iJLQjy1VG%jH8rWj;6|Fcsjb9Mw zmdx#uDKX_$`5A^ZVw%G!An;bM7edc`b8 zS9YLPX$M-H400+$3D%mb3Qzi9`*421bJd5Rj7op2Sg%@SxS-Uj>PxoY`m?6RPyO*1 zklZQ^z5*U|1qL-g40#F>%6l z1!Om&UO00UZLUs6b3DvkE$`Jm>KB;`)bBC4m}%3OwBQ8RIxH;OQ&DEXX8R80TSUOX6IG&#rjRq&;WGFrTt~47QPT#5aeSjze_dL%Tg*>Tz%;*76zP zk<5+|$LnBufEUmw6T;Dh;;7H6VvY}}_s9r?DFz2_1I?oRbrn8=CN7M|W`5>PC9uOW zQH9?Tr#D*D3%$ERNOm!A#;Sm*1V{R_+4;;NVX0O1!;baWf?Nw&;JAswF z;)lT_nOW*M&A6K6ERdPrz;kCim|1*4=BW^RRAOgB-In!KH$SDPm^D7PI2&`(7cqbO zhklDqe)-4a_WN|d4dh5m4DWjd;|E05fG3y4@Sz1voHK8UQ})KeBNkvpoEG5x z>yGTepAxp}eeN74UnzrfF=DegF-XGkj0@yi67B{Mm51&45) z5xp2$u6aoeoQixB$#LEGxS12@fhf{#@C#p=k*pn-C$E#83b)9egd{%IZsMJsVhzn# zpBmb4pgYj70r7z%&uKK}yXdQUqoB)=H*sQ@{;h)hAUV z)&jO}1inOF0jVpgKU@ke@0E#Dty&m?LTs)p^ajB&d!YRtobbflrc4%Kr=z53GYS7W zVK?}}7lXA^Q^KnZcGK>Gl4oRE?x5S*|t6Xpr&lm|z4E3@(b@~WZeN;6C zq3c%Gg+_uiaEZB=$&@HI!;dlB^ES`+*Z5}|``p&}(dsmAg8F*+wUb*ivm);EVBzP? z>SKDd;@;<~n}mS1^8{{#9r4#=k0Zf+N_P69q3GHl?^^)j$Q>iB^-q5jK5)N4*5KKM zy*hqN3@)&?;eDMZ7hVRE@`nU4-V=aO3lkgYd?sdLgG#>7+w?Wkm-~15G0i^oU{%i~ z>)o2?q+Ghb7LMenNb3Gf3qX|4n3)#LH7dE9`Md@0dBSJ39P#&UO*ME0pPDxjISTA> zFw3t%j=ddB@<3D`NBpQ9Q&Sej39K5LfizU95zV^eck2IMcdWAfy6>N}34P=JKATW& zyZUUu62w&4_qHp4lQQzI7*|8jDut4`74(v7sAQkjJfG5++A7yb_F<+Ai~!}W1)qHX z%^Hj~1`B5^k{Jt8A0rjWajxFLZq4d%!dM}xSc-XS`$b_@TRj7PJ5s=b0fBZ$vZ4i@ znUmwl$S9Ikxn3>Ku1P~Wc1rvTzTduGAx@9js{rCx0OKf`5}QJ$L@MLhct&Q6Jt8cp zGH`Rj44mirZy`)$#Y_n3)FBMvfjRyN5m+ZLqQV@%EN79v>*~9%!R*6XfYd`Hh@pFI06h*J5D!B92iQL_ z6^LuzP2DL-kEZbr;IrdZ`gzSa$=~I-Siif?uj~IYi;;yHzogk&m9L|1!%^LpV5&7a z({g6%G2R&i0yu8XPqA4#L-jo~wnp@}AB7?ZxZrxSNDL2RABnB25EJulI3)x>5at7i zIWk8#)vL$BGEFz%n~;E_eP{)8g?{$e#Q95Jo6SPgM+?nI;BRiX-{gDGuKTH|16_3b`YZP$pYr`lR~@C#f(2Zm2K zViXr0;vpQF9*?Bhc$okajHpgM8{q_yT<{T7!&DN{Qp(8<_p9Z%irerSHHjCejCEyZ1PL^I?R&o(HJX5Eh|M~3esL{eMWj_vXJ31 zFh=w`sB_%!)M$17msqE<>aolnN5bZvFSu~%MYy`$94(%= z*>%Tq(={|^i-7Rwh(9%y(GEl_-R!{I?XT{)|9qeSZmz#!aBJz=hsx`xU`NHTy!K6M z2|$D@`BmZy_{bhIv{F>xgV3tAnHMsh&AYfOl>Aw4?@96&pdj*+2r86_Y z2EZAJ&EoY~!hFb6iLmKCOXF&%)}HhBjrx;GE|j*}x_q*8-X{P<`&lBF?R2zQ=zhat zll;Kmc&_>dh!_>Z@iJN$cm&|KUV@)5k^Gz@tUBx>oH{7Qf<1?yGL104kbHsoiOkQx zzt2x?J_Ud0cUk#9`Oq;ldl}c6(oGxqF$)*ak?AC~*Kh~Y08n)0*s(N7h~Ac7{4#?( zHrL@1vmWuN=2sBRE7%FXVs4pHtOYnQ*=-mV>cxn-Q%t2$Vdc^hE6X>V_Bom^i6d;b z*>d>^^g9H%Wc;niZ|=AMbie&|{<}FVu`;%$E5iR|2j1qp(S(ShkxT%IVL10)rO-HH z6ZSMB&+4mMwV3CXh2yqx%1%r%r_Oo2FL}t{H$B8{U<5*p!2JR_`f0j9Q~L^<522_t zC=5{vTQxLj!b``+fG_OA2;3J4OfCuw+={I#Of>*z$rL6RMo1z8_=gx7!U5`sK+F2q z!Bt@kaQZ8fky*xB&QW0B4n4m5{F(C%d8og zGbcOLs!NK@VN!em^&Ue^f?%s73S$SvNJ|9w_+Y-iZTeH04LEOfSH)7C@2V8ZHP|h$j(oZJ*4V+Dd zxXtaXEP&our60%at7kX@!RU zr)zo_gT;C(7vY^ENI@`Q_`4ue_7*VpUuE34r*1Vum_hh!@aU!y-z>cV{-X6R&-^97 z`#KwM5oZVHmLx6BWqhFCcjP#yS&fHN@l*`vl=oU_NEIM+j>GwX1&;m#9D~c|eWC?Z zuH&UlIO&Mz8zMB$z-JBu z@4$Qz`YG5W^^hq(#;=Xb40M)E^(SEFH<-^(Y596>gl0VOcMN1q(F|2?&CHA$=EX9_ zw{RxkmH6{^1W>?1)TwwtQ!f3$mDzZOT_e$YSg3tW!nM}nxvlX~UZrbi;b}^-zT}S; zYt7f78rpTgx!wM^`|aQ5$Klz5`8A*~Kr#a%tW!p&cZE7qw8U^tQ`n+92~HMCLB-k^ z)o4M=hYx3neJo9-S{n3qH>ItCzwbBxg6JCb1eqq;tuL&9Sq!j`|y71nw88{Dsqo!c(pQ*Pyo>2Wap>-!>`rng~C>%pU&9%Y)JGmLt-!vw2y9Q zo)7HiGR`|k#0<6(f=$I~J$fdpLlum}IC;KC3@)Gxyl{6QS&VD9k!&zr^9x?(8&3Iy z$pjveALb@%`D&9vNqu}hKP|YXOyklEG|)RctzZZKwU5Bt?f;kGHmI!~xPA)0O`U-? zNS!ra26(Bj#CZ}#G-mNvjHHZKB0m=ATpc3C?CV=~PR&*RYlv^R>C5*^ukjsUehudL zfmw_%*@|RHvcSFwPgE0s+SGbZi^Jg*-w_|C_?<8FPzZdb0A3zEYYoZP2 zlh4vqPd$RCr@>a-Z|}GNm|r#crE5O|?Lfb3==ST^px;R7Df=f*ku(Om3-wia5=@aN zp2Rlk6MG%-n2KWg%iwNA>o&%tMIFa`|Ca82-C|$Upl_Q`VBo&+OShk+sR-yYo8vd$ zuf`|B00GdsY8Zqa8F`6uF^m^Zt@LXY{5wZ3zPXj&7@?G7>QSlJD zt?`9%*a5k!DUvuN9DKCKSK|MWFq+FpX|{&DT)*^qo9Y=hn2bzC?x}VMdY(Q4EkoZe z|0ipaG-JlYY|lKTv+ZEV>{I92L=`d;28?C)5ro$ug~QjnK6~%? zz~8*z=g%5N?x&zN=nK&H8{ruFxz!U!5^tSVOq!F6I6-dF!Z?k_T%|Yy5nJ-Ty{A*D zKg*ywUfVbQYO~rSV!JgZzTTI>h@rE!Uh?q2M{?E(%fd*^r)ym=%a`mr22?^!@Ugs1 z)%d{)V_9H7Dox>(sJDVV{1W&qw?4doWi#9L`!+6sf#U)}?4C5?3w*bkvz#%jQZ2`I z)oSE8im@{xy@8Xy5?!DTz2fWbkMxo>30KHe%oXOrS0;X7W;kPPl1seLNS7wl@ivod z&i6)o&VGZRv(0EBMhw4`oMHABJb{Y6yYJn#RcKZ5DQj);CJ0xa1JWN!FYUU~fNo*t| zOsg@t>bx!8Jr5mVu^EgRq(Y7?%p}L!u{=aLFq(Zpo%h0UHovzOXc1t-rAMo9bYr~g z$KW!{W`TWLRjH}usM?x-KuO!OHp@4mKT3eV?6B+nhT(Sy@(YK5yba$D)a5ai7HhrY zqXj%!@9-vtG(}&U%Q}XMBfRE5af-HaZhGC;X3Vx(S}-m)V17+IzTIwM=-ro*Z_Drt zdE+CQC;xK0eMi8NYzz3Eu7ME85uyfbzXBCzjj5N|L^qNl8q94)+hD|xIMxnxMd&K< zIhZhO!kaiZ)WsuH29MZnoL&Q%V}KFF(c;dLO_2`{AVzqXYeGG6+hOZwI@@kuX^mcQ zxvkt{ONJtWLas*m4IF_h@kYkcLLguW?=yJtK*Tzhhxwj>;k1zg&l&jVY@Xp{bP?r0 zWw3|F$!vQUh>?%*$b;LKCv#|fDJsj$t(DzIH}cOx5aVf+hcxk z%MSDtnU9m-=06PiFZnEyJKfLsOjmk6El#7&8~$ek!6TCagSFT&;8Xt?rXiUzxJ(Om zP+bIhP{o-LS_I;ni)Hz6-nfo0rfQA+0}`7Q3N6ApzEZguFaO}NwmsJJT%D38N14uq z+-7VLda9&TRSVE>`SQCyfA?YC{XRbn|L6RB>A%TeJpE&S=ipDAchqBzx~9-&im#@> zs?BdYsIb$=LOE!eM&(t6TWk_fL7LI2>THa_6gw0fSOu3E06-k6Ah6phAlHW1@*UKj1=s@RWB9D=#@W3Pmme`g`jzXFs z6DR!bKJ-hDXtyJLksM|rS62a&UkDc(Mito%Fe`;I&Qa7?s0|pV)gs)|%1a*~oy9Dq zzkR$K{eaDPwIq+q8=?ZgCU%C(0M`g&<~bw1XpY=&m^sf5d2f{!vexV${HOf{yn^S_ zTOP+P=D?B6z~eCc{#@k+jfEdz*=IRWYZR$}xIK1YtMthbs#xM*nI;SJ{W9_TY(gI@ z9^>!xJ1ZZ7{*IWb(aq@Uwf5;_XGTwPW?c7#f9?^EB&==%gLS!6WLg**#n`NhkPtHr zxg8=I$eiOniV;{U@pUX$@nMZ*p%&m%)znj_h0cHt zrm8CZ6UdjI1*oup=Wj;txBrm;VC1*?wZr^4+)qIj(>{IdU@&-__*Gy^oq!)hc)NYn z)5ZYrW9!g-Pt!}BtCQ4N-eo_`ruj8p)083de!qrx1k%20Z`ZA;N6%?0?z? zY+J{5P3_8`c(`EXrQly;=YRUXzhNuWEstZTM%ZaCG1v$Xe#ExJqYgxP0zSuw)=qHc zMSgQCBO?J{{Wcx$B))=A3Xb(v#a3_OSfJPr{@7ETkD6ORzlIqASFf2Pj03-cUu8yS zj9ekZj58w*7xo0sIAu_uGqG+>?EAd;=MYbOvv~zi-BCCjNP^+xR4aDg(~Vh95lkIB z==wU=hEw&82`u%5{ZX=s^HZKG{7a4^@0FN+X?S|`%XvTc=BXlnpI7OFkbo8!+Gs87 zENQNuI^us$S=dMPXeI$iqE!K9B-sHtDul;!BtO+c)G5vs-Nsa{5u0P>qcXY$scr8k zO`OJj%svS62ew#+7v7ey-skFg*#f_6Q(^V)gFfCTcMH&ux4!)>zIVskRufPU4-2q^Voq9?~4@bJ@%%B=KjGkHy>_kmUR(i)xj z{w<9|52X7#*mhLj@p@YscocWzMn1kKiya%HOn7X@?6FCgh40rjk`KcFp8pG^|7NS? zmJII`fAAw1(Sn){ULiHGE9U42pxcmEYB4nyNCwX|w!$G+0F7iPLh>csuUIbM#AfLu{OUGgOewB#UokB2^@14}kHGLF`PSh5VlA|a8Il={ zbjNqKKS~tV0<;eueOmi0bX562ySep*Ud-Fn{R*npJh0uft z1XBooh2VqdF;4!A9!dP@hNdbS0klF=*I z48|s{@7W%H1h($_?f1Pa1rFgjknrk#Io&Zl0=opm@`2GZmVsJm@WG;7YgSYc_QJ*MR(wV#7TA(ieR8+cFr* zW#>MM6_~AZ)ym*uJ|e7S_|IoS?Pc|h2)Ob_4Eg(j0mgAVkhg=6`F_*GtjrOsa4e76 z`#>$ws_~D>;$y=5l$mdwFeYHu^Zf1Y_Mh_4q5Xi?j}Sqgq$tk2OMh3tI!?wQpp_a& zz%Z2lKXmG_sv*M7 zSz&C0CxGQ;^N%%(r5kSq`*thu+u7UoHLMd&J_KI(8WtJJ#lb$9mbe)Zq7j=tmH z18HK#M&|YkSQy9>V2~~?ViP>vo`!bYTZ9!5U=SDcKBE3>)`ZcdL4V|mFH$s=6)a0tIK?$vt&U2ac%Up<@uY%2VR zg-SBsr3Z(ox?pA*vXBSG!Xd1e1BXeVt|=~PJx>KTp+tU5??>Q&f4}{2d4@hhJV_6e zYrW9HPk~PFaCW~;#q`cdguo~BDU)C-mi%qHARfW1PsgKO9?Qbm@^wUU>}>TKS@`g8 zkEe9Kn%Hgwuhe%)4eS+mb#6C30n|d>y}^}_u*juW`1m88)bO=fCAH>V7NBLQUkZZw zDSzDf1)%!>HVY8`+x$x;^`|n%x1DiupNdV&pmA0pc;%ww@u=_A+q;!@h3^luHGYb) z%UDI*LTcD>b6LmRg!FF$7AlEIQXQL585s5lcAF5Q72C@NWFb^W zR=F5Cbb5EDYt2|Xi`L&CVac?)QJ;Z1Du_aL!yk_0bqi%&7e7}7K4*$5xr|WUV9#`k z9S-8L)?#pEY_N>w`?J}?IqFO0qRY-Kz54)SfVC15FBJkwsvw?8zqmMkxjcrP_ zYw{7X6J+1N%l(h{+y8pI{k!~^3%}2=q0M)>kc5{Vl#t0B<3dN&bp!!fvB7#VjOj zC2gG#mP-qcz*K~1YcQKoHJQUb?1(Jln5%zu&V!h8g~29&}-c$LV!uM)5X) zSaeL4`K|PIp>1ITb^Y*izXX%*C!T@O<6^^7*-M$NL*)5v8M?<32j6!9y^V`*&bl~R%+ap1_wq&Y6pVh( zD|>9eT8 z;%l$ZZRL;6IR?6^hz)UtEwDzq$1Om3LHNtarXROQ3~}2kr5z98u>4xxadu$v3XD9- zXua=i$|u%SUP|$EJ_VQMZIk**{E=f8sgJ<_aJ&6~?zjK1{}HGB3yr_>vsm`(r~Tx; zxHj?8*4@)byTc(_&fpA^6#VAja~57Bl-K9`yyBCfkjj~txGnH_nD{>e$p_Rza6=tk za2t4~yOTQE{YY3Km`m}h9^J<}GM@^20U4b>qNnUk#TvT3Yfqo^7b16mOOn4FQJ-0f z{SM6E3;#*o@+Xu(LCio+wTWzsZFMAZP7JpJVIO)4hfn>$@b3vM@{|5CnAdmhpeAbi zl(AQE+WPf=`*zk&Xj&xa{gU4x$Yp=4f4$Ad7~KPohjWZ)SImm&?ZNRfAqlJ=ZwV;^ zjbk)5J_5VIj?1PHc@Z$1wjjOG8w(HZj*J zv0EVWV=YD+KRggg@>Q826HkdHQ_1TUdINVq!l(3tadCc6K_=jf_qwb7(qfa&OE7}g z3E0)dnNa7M?}0hpYzL>^>1KO+`g@L@z!Cnn8Cde2kbeulXO^y#n__W@89n|wip7W-j!__cIR{M3XNVcW^K$8Yla z_t*KA)bI1Zkl;sGMm}Y9&70PDRN6$i%vU2(vE9KAAq&O)81SeSI!f%nyvJ|o6rvYou7#FKcVmw0R_}4z0RLmRb=NledM@fa5awNdL#uMw@qpu3 zMgo<8seHxK+$$Se3Q!s=$_yat%mU!@Jzg&JfC)R^)xe}*8-ScZ|Lzb7eS`5#g2Tfty?k#DtT}@ z!N%`Q;1IpKMWq6Xa|N8R8$X+)8_tz5)!;cBY$RX9+enThzG6*%sMiG}&yHDZn5$xl z1U8{=qBX&%Vm0~j_(T3#;BRcgygok#`%RQvD%14h5FI&fMSME9IWDo?bTZS*1mGjb zU#~pn#f?~qU!)-MfD~ApX~`|EioL?yWBtMdVZvuPJG4tN{3TiWsBldME-^*|D)Sa1 zxdg;U?8=GO_4Wv~$gAv`(u%bUodo@T@0Wi0m7p$IhW^~~dx_ur6i-Jq!jHpt;8T8$ zpd-pfmm)hWRPp>8Om-(7bi;lldD{g{YO97VCQhM8ILDTE24FW@v%Y0Deb0+VfAgGm zKLhYJ^y1uBi**_QU<4yqgIBs@V<+$`09t`#>WJ0;SUwQ-Io=k$$zsLONVaA6oA{?| z=@eEqdX*w;hyHT9N)bW@xSI&!z|}S3@0Xv5DXxkkM3^|&4(ulMlzwcz7}!6J-odo> zos%_$nVI2iBa45}W+*;aC4LRBeUhsyJ=QjJ#yhXObMAG66-=&-@ocSN^z-fZ?3k-6 zt{`LZSLo>S$cPuT6!V&x!U47a&=tUrL2-tTM=$OlytVv=$Zzs51OHQYpl_0=c+pk^ zu*P81?WU112Jo5$#HL3e!a9yADi7I97a0Crd3sUT;&*xAuK1b>p{x5$9oSk_-aze8 zJYg*R7u_XO-FO-KfcPhceMAf=^?@I76=V6f;(r9g!segbnyL}i9wNRFEq)vKK0gKf znOBMY*xQf5-{jX3`l36SJ`SI{12Za`3#PenEMHR?nxg}b2M!Z~*&|}p4gObgyVj<( z$Q=VM`|7~~GLue<7lcYlX)+%Us%AS2<}TVW8MV_=DK!D-xGJuVk4 zRJ~gFW$NgjTgGdjam4hika8)`)J-=LdlD)G^Cj```4eF(km7WtU0r>ZCP4Tl@I8^M z&(x~#nl7FM#^a1x=m}}l!{1QJj>^JOf6H%5C8Qx*Rv3#>JqKw*Y3=G49Jvkv2rN1!`h!1@@<-C|@+(1qQ|$ZsU3TEX&$^r$n9hPd zKX1bm=MMEm_^%Mx;1^x>+Sz!D+&XVOE%R*mXB8~mryYUo_M3j)CPE=02ChUm zMpps*y(MswS))>!Hv#NmX8**?vS0Pu`N7n~cvM=wsaVG*q4sDb%A9Vd3+;v5uUUZK zleJPfUb8;qUE*s5zF&7>EYNaAah`Ub3CzU-P1pK0qKME9rUTZi8ILzWvG9iPc&>?m2&s8~Dj3_==2U$}~3E zaSXcJ25aOI^9fSd(0OE$A6#yQq}LEY`?$Fx5v8(XlP+xLbJNLDk#$(Om6dVah?BI2EWJ2_|rk3&e<@$Jk$Xs=~D3tjF z-Kd%}dWv?+h)4%9+eZc0N}$Es%A@qZ2P3}9<%e`8s`7J1=6h9Av=cv>?h2g+*G0is zVa6%(ETYGaI}dL$-OLGtjiJM=9zflFjcpYlif`z)*H&^V3; zxYeuEH?B`!*HFu>qvMOIXAocY+bj4;mKb*t^Pqfn{O5cG{?@;Q$#13n@a2axrpQd+ zPwOwUYBt*a-WrnYMCq?%Cj=Ilk3diR9(wq)Zk(yr`?w<}FlOmK=GMF8S0wQc4=@f6 zeYp}?8W+$z{MFz4Fy~p_rl%4S#Ad1i@S*jE`k0vAU3hRfiTI>ZJ{)rbh;?sYE_1O#1?*Y z-0GdiR;HuArrpfvk9GJtslBpxEHk_FYJ{(%-BfgE8fgUnl)p*Lc zU!#RRXP656H8nF6%i}T6WJVG32Fiq^+hE?}V`1xxp>~?rU&ObSrYv4TvKR|jzwxqy z&oi7l1nABH>`9hpb%&4H#%GoiJOy%Luu!4L` z`l~WYXGZ!0kC=Ca6K%9ccdKhCsQnW4GC1x!nfw-B4f6>v7M4mCH-4z&T*c7mc!*n^ z9_%3;I>d>VZs|9;ui*XVIaHwhH%T?NS2$0vnO^ZS>nrQLvUG&;lXYp5wvZ17KTmmC zvzqd&r@zW?;QfO%FV1%e0g_zsZUCmLx6qk^<9cp01~Z45tJUKBXz|#<-ZASt(C4KG zn~+q1i+Q%TUw*jrYyYRXSQFm)G-(;OHH6H@;~Y!Cn;yw4{6CbP>5gPca-HuB>j&2X zN&UFe457>j0n-E`t3*=ko9a8~n3?;%k<}ytgTvh1mSc;1MlM}_^cJS6{ERITNv#Q= z!zbU{nu08y4vpIi;X2gg;M>QXr#Li%XE0sBgYbLBXBEl{JYpYw(&MW}h|hukQk55v zkAFOXc>^gRnyh@7r+O6gY5&Rs=kZU7P$ak2M}eoZ`zF55`ec�b!~dg<8>Zb|`-x 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
        x@IJQX4vPmbkGIOm4)jjP|%p#%-MVqeNmpsNtCS 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

        E!T&B5i+0>l7)Ac83!neX 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 From 087f66ed07e16fba5b78ac60def91ddfa2ef7312 Mon Sep 17 00:00:00 2001 From: Corinne Bosley Date: Thu, 7 Jun 2018 08:15:41 +0100 Subject: [PATCH 045/583] indent corrected --- iris_grib/_load_convert.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index ec8dcd97..d701153b 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -1367,7 +1367,7 @@ def hybrid_factories(section, metadata): if typeOfFirstFixedSurface == 118: # height - level_value_name = 'level_height' + level_value_name = 'level_height' level_value_units = 'm' factory_class = HybridHeightFactory factory_args = [{'long_name': level_value_name}, From df76ee580595c17ebb5d1c6524d7cdc75db2e9fe Mon Sep 17 00:00:00 2001 From: Corinne Bosley Date: Thu, 7 Jun 2018 08:26:34 +0100 Subject: [PATCH 046/583] try different reference arg for factory --- iris_grib/_load_convert.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index d701153b..1c0b0895 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -1289,8 +1289,8 @@ def translate_phenomenon(metadata, discipline, parameterCategory, elif (discipline == 0 and parameterCategory == 3 and parameterNumber == 0): - metadata['references'].append(ReferenceTarget('surface_air_pressure', - None)) + metadata['references'].append(ReferenceTarget( + 'surface_air_pressure', None)) def time_range_unit(indicatorOfUnitOfTimeRange): @@ -1380,7 +1380,7 @@ def hybrid_factories(section, metadata): factory_class = HybridPressureFactory factory_args = [{'long_name': level_value_name}, {'long_name': 'sigma'}, - Reference('surface_air_pressure')] + Reference('air_pressure')] # Create the level pressure scalar coordinate. pv = section['pv'] From 4e6f2b7c1c9645c3bd4abb26733ab4e2a11b25e3 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Thu, 7 Jun 2018 17:05:12 +0100 Subject: [PATCH 047/583] Working hybrid-height load, plus test with improved test data. --- iris_grib/_load_convert.py | 26 +++++++++- .../load_convert/test_load_hybrid_coords.py | 45 +++++++++++++---- .../tests/integration/save_rules/__init__.py | 20 -------- .../save_rules/test_save_hybrid_coords.py | 47 ------------------ .../testdata/faked_sample_hp_grib_data.grib2 | Bin 589415 -> 589415 bytes 5 files changed, 60 insertions(+), 78 deletions(-) delete mode 100644 iris_grib/tests/integration/save_rules/__init__.py delete mode 100644 iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index 1c0b0895..d261b96e 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -1290,7 +1290,29 @@ def translate_phenomenon(metadata, discipline, parameterCategory, parameterCategory == 3 and parameterNumber == 0): metadata['references'].append(ReferenceTarget( - 'surface_air_pressure', None)) + 'surface_air_pressure', ensure_surface_air_pressure_name)) + + +def ensure_surface_air_pressure_name(cube): + # A 'transform' function for a iris.fileformats.rules.ReferenceTarget, + # instructing the rules code to rename the reference as + # 'surface_air_pressure'. + # + # Needed because the surface-air-pressure (reference) message normally + # loads as a plain 'air_pressure' cube. + # As references for factory construction are identified by .name(), in this + # case that can get confused with the derived coordinate produced by the + # HybridPressureFactory itself, which is also named 'air_pressure'. + # This will cause an infinite loop when building the derived coord (!) + name = cube.name() + # Just check the passed cube is of the sort expected. + expected_names = ('air_pressure', 'surface_air_pressure') + if name not in expected_names: + msg = ('Unexpected cube name for hybrid-pressure reference data : ' + 'Expected one of {}, got {!r}.') + raise ValueError(msg.format(expected_names, name)) + # Get the caller (in rules.py) to rename it. + return {'standard_name': 'surface_air_pressure'} def time_range_unit(indicatorOfUnitOfTimeRange): @@ -1380,7 +1402,7 @@ def hybrid_factories(section, metadata): factory_class = HybridPressureFactory factory_args = [{'long_name': level_value_name}, {'long_name': 'sigma'}, - Reference('air_pressure')] + Reference('surface_air_pressure')] # Create the level pressure scalar coordinate. pv = section['pv'] diff --git a/iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py b/iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py index a9b59fa7..1040a814 100644 --- a/iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py +++ b/iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py @@ -32,15 +32,17 @@ class TestHybridHeight(tests.IrisGribTest): - def test_load_hybrid_height(self): + def setUp(self): filepath = self.get_testdata_path('faked_sample_hh_grib_data.grib2') - cube = load_cube(filepath, 'air_temperature') + self.testdata_cube = load_cube(filepath, 'air_temperature') + + def test_load_hybrid_height(self): # Check that it loads right, and creates a factory. - self.assertIsInstance(cube.aux_factories[0], HybridHeightFactory) + self.assertIsInstance(self.testdata_cube.aux_factories[0], + HybridHeightFactory) - def test_levels_values(self): - filepath = self.get_testdata_path('faked_sample_hh_grib_data.grib2') - cube = load_cube(filepath, 'air_temperature') + def test_hybrid_height_coords_values(self): + cube = self.testdata_cube # check actual model level values. self.assertArrayEqual(cube.coord('model_level_number').points, @@ -59,11 +61,36 @@ def test_levels_values(self): class TestHybridPressure(tests.IrisGribTest): - def test_load_hybrid_pressure(self): + def setUp(self): filepath = self.get_testdata_path('faked_sample_hp_grib_data.grib2') - cube = load_cube(filepath, 'air_pressure') + self.testdata_cube = load_cube(filepath, 'air_temperature') + + def test_load_hybrid_pressure(self): # Check that it loads right, and creates a factory. - self.assertIsInstance(cube.aux_factories[0], HybridPressureFactory) + self.assertIsInstance(self.testdata_cube.aux_factories[0], + HybridPressureFactory) + + def test_hybrid_pressure_coords_values(self): + cube = self.testdata_cube + + # Check existence, and some values, of the loaded coefficients. + self.assertArrayEqual(cube.coord('model_level_number').points, + [1, 51, 91]) + self.assertArrayAllClose(cube.coord('sigma').points, + [0., 0.036, 0.998], atol=0.001) + self.assertArrayAllClose(cube.coord('level_pressure').points, + [0., 18191.0, 0.00316], rtol=0.001) + self.assertArrayAllClose( + cube.coord('surface_air_pressure')[:2, :3].points, + [[103493.8, 103493.8, 103493.8], + [103401.0, 103407.4, 103412.2]], atol=0.1) + + # Also check a few values from the derived coord. + self.assertArrayAllClose( + cube.coord('air_pressure')[:, :3, 0].points, + [[0., 0., 0.], + [21940.3, 21936.9, 21932.8], + [103248.5, 103156.0, 103041.0]], atol=0.1) if __name__ == '__main__': diff --git a/iris_grib/tests/integration/save_rules/__init__.py b/iris_grib/tests/integration/save_rules/__init__.py deleted file mode 100644 index e8c75e8a..00000000 --- a/iris_grib/tests/integration/save_rules/__init__.py +++ /dev/null @@ -1,20 +0,0 @@ -# (C) British Crown Copyright 2018, Met Office -# -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . -"""Integration tests for the :mod:`iris_grib._save_rules` package.""" - -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa diff --git a/iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py b/iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py deleted file mode 100644 index f25d19e4..00000000 --- a/iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py +++ /dev/null @@ -1,47 +0,0 @@ -# (C) British Crown Copyright 2018, Met Office -# -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . -""" -Integration test for saving hybrid height data. - -""" - -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - -# import iris_grib.tests first so that some things can be initialised -# before importing anything else. -import iris_grib.tests as tests - - -from iris import load_cube -from iris.aux_factory import HybridHeightFactory - -# TODO: Make some tests to check that the data has saved. - - -class TestHybridHeight(tests.IrisGribTest): - def test_save_hybrid_height(self): - pass - - -class TestHybridPressure(tests.IrisGribTest): - def test_save_hybrid_pressure(self): - pass - - -if __name__ == '__main__': - tests.main() diff --git a/iris_grib/tests/testdata/faked_sample_hp_grib_data.grib2 b/iris_grib/tests/testdata/faked_sample_hp_grib_data.grib2 index a941d60eea671af067a01988eeade5e5c9957f48..730a977b373734943eb65940733333d0a6f469b1 100644 GIT binary patch delta 262789 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%0AUQ>-pFWH;;LEI%y6Gw?_ z+o*%oGrB(Ag>C{`g`-B0pUJ<-9pq|=XazZ(tV8@D>yT4Gay+2wQ1!`w;5Qmhyostn zrBnG-F_i?8q&^|QU*N}xiUdneCVv9E?+3-xmXr{F{21N=JBs~@eZ=)d6XFm#mt05g zClTTwglK~QhFgwX%lRRC$wY}%j1!w>bqB69H_aE;*Z`_;fm3tR> z$9hM2r+RhX&EBu*Ff;>xUx4-o)RaT(L5|2qx1rb3JLqvV0rkTev>j~y9l$pfRik^c z_LvX*f=|HZ5R41)F*q^?7vQD%M`AdU0c|YN0RIPn2;W;1bBS!iM+69zFc2aljaURB zIuNM%KE4*W;q&pKcxSvBUJLt$y~AF^mDR=v;Ue6RZ^n1y>v12h!ISXm_-s5Cmq2$J z_*{GXZPR<26t8+Rbr;rF} z`XeBfLe2(GxAR7BBS=nR*YB=9?tsVW9qe5P`Oxb5=n(P*_PN%l7OBN(8}5+iBI7)FFc~hzPJ3^;o96sy-))r{ z?`q$u80iaP(z4NMZ&PxUuO+Qml)sQ$V4QE6cV*uG`I8pRUATPFf5{D!?=KcE-knk* zWkyO#%8%3qscX|}r4i}2{h}Ye}}xJ}7&yt;p)NR<%;u zT^-Av6ynbG9>-98E!_Mkq@1crouP{uJG(H{E|eNd3Uvrx4!VNlgDnH!0-FN0e6RRf zY$k0WZxc6&9AY=Qh-ymxO=C=FW*<9~J;62MdT^E5KiM>pBA=PhY%o1iW(}1bS zRArhnT|fbq2e#MHEvd^?0hLQx07wC9D|H95LVtQXJ%^qM8mBAB_aSs|>MfN*iixh+ zRrF7^n)efG#?tY0qBG$l((y}pQ_O(1#JV9^0PlyNBZd<5i4MSoBKS5DUrCH2UXUL0 z6Ez5mh$WPcic+VkUr-ASr^nKh=!Gx{mQKJm4Wo`w1IQ9cJO>CZ(FcNeJp|rZyd7Q} z`-=UIt;Y1&Bp~3)mjZwWBV}VB(@j6F2!1+*8psbfcI*n4bV|2 zi+;m&*kd@A8{+*iei8Wk8U7ak0PPb|o@hi2AZ8P(#7r3W6X5kMK*Vf31!7%|s{mXY zJO{9lz!`}6Hqhy6ERLC3qeH&5b=rS9=O_&mx}eOluFQ@*de= zIj?&h=ms?3(>3RYZL{%=_C?kR)lx-VHdOR5<50SK@v5W>3(FSHU#MQVWC3z?e(}87 zbLY-&GWWv##S0fE%}RciQYB?=YVA}(>bbO}w2$d|OXe(XyR1dV_)M2zyYQ%Jr}&&y zB)_4ath1SJ+g3VyBb^*a?YpvH*;_bDoD1A>bUV?I%%&Prv#Axdh*`;voMmI&RBjcwi`&Q@<=gNF zd~W{`{}%r(|DXQ3zO%jw{8c{8`}t$O#=cA+?#uEu_Qz1g20N$crD3{sn!$Sj36lNrKvVj43Q=_gQzu7jVN zF}qldo6TM0-f>a(4cm=zGmYuLp+ucZts^fJPl*rGK0(_cf+<*bSC|d(K2_~{!k;R*+~G(VrCgLhp{5e3AQo&2it);#tf$m>1vdn z`~)fEGBFwd8;{{6gwRHaX%e4>*TBwWD=`Ag!scTAKnH(AAEAd(3LWeH;N1febQZ0Q z4gj97=H2E^_jdBO0s*qnyU5$i^V0LDXOFjq_bPe{JB~+*mO$l0i5mE89Qi?vCpME^ zNEf-0Tu(BjjGRYKCnu48h;PIi$N^RGtN0OU2Voc#o(_tz30?U=FXz30HbtkPGtkc7*D$Oy?^f?o7?9L+*E7Vu&TVvW^vv?M^*%y{XatQT z5ZSLV7e0q*0DQIpH>2OZbzNVbpK^vcoG!W%HL{#o);(J5<_aeVeD=K;?>tRmLhd%{!I z^}#*XTLCK}C(s?~55SM>=?hFLSC23A{pa5ms2FG)5Qot4{7BtMFmfkaDcU8P9xaaE zioT3)iFS`7Zb={@MNs{?Y#N{!D*~|KC7|KttG?pJVeAoFt>>9>Iucl|v z%jo;eZuTNy&ez=c-S71m_(%Jc{3NadbDOD4@1`#?1DLgJT{ej&*~462PR$+W-f;K0 zQVz-F#&GjE6yRoIFEjgS3Dto32r6I!#-QuH=e>ixJ-mNoz3^M4m0Az=tDV--PWn1y zgBtiHz;p&zi`~H@texG+RpinDgg3Z5TrpRV?M#25){`OP9#KH-BEFEF$acgBVmA>Y z!o+6cEOCY?A(9dN7rqi-1hKsv6Jw1*xokoU(GcoHmp~+UMEjyCP#LU7^ML~g0~6Ll z+o1i?K~M>gL=mh!Rt6d-fb(#M_7IT8#9Xo}Nsv3qB2rBDC!3ND$>spf9^@DRqn9j% zhLVfPj>KzXJs}|KOO)S^-U9-62_&LB6UA zBBeK42kn6-qnT)H5N&tCSeofMwuj4yn*kX#f>?y{aHeN&?pw}_TS2o7p<0kQ)eA)hw z!H&Tr!5hJK5M+;|zejsUJ4UBRFUE@E%J`G`hxnm*BEB|$Fa9=Gmd6%F-$gZ%-QlC5l|g@Ccc8ETp?{ZuhyPcgIG7t65n2-5 z6DR~aFF^vn;IGh|kRu@C`_bRY2c(_a!rbD!`Ktw{25SY`;EzyphzjY0KZCsk9sE^% zmH9E;5zYf#zZ9B=i*tAQUc8B4%b(!S@_Tq6KbxzV*h8~8~$H@ z9^Znm#hvB4vV)k(fQqBcJQiump5yv*qaayS0$@zx0^DERRj!On;;OJ0*u(63_91Zp zTWHVWTQU=&S;|TllcUK+f(vH|p%mOKrz~|vLvHh3? ztBvkMG1P#fU{Zd?#$j%3EA|)2ljjIt1D}j@K(9M+A$Au_!y1A{*I^g%>UcxEDTsy9UgmUdkp!{6+kEB@5su; zUeHPzcmaWsIUqB~QooUB$?H^qaKV!3%k&HC7tzOEoLyTp7!f{9oxO1Se8a+e$*#1P zORg<*W>_-&W?mJf33kJz`UCfT*Zun5L ziM@%N31my6F!4Gsls`G&pFcEjeqw5ziZ6`&LyW&WoAgMkHs zXn+YQ0@}dNVDn&da8|HU;6t!WaBZkZXh0AN^!DxJxAU2Nv9Gpoysra)g%5$&@$n2V z;`{SmU^(0~pWL_E7xi`K5$+N<1#F(zTtguIT+YX_Tt0`~BGn#%#qjXb> zCSQ?D;pY)#DbpB7k(jMj>}|kLzWxEY@v5i8kivv6T=9C_z35D5AMnWqCb?dr*IuenKML~MA{K2 z@C+374)k_H7vl8^0&u;G{0DU04|+a57W@DW)g3@rm#PYodkI7QhkQgHC)dIh#Cu8v zwND4SHF&!tnE~vdTnXD7UyGD!F=6+`dlyWYe|gc7lnYD7Eh9542u2GXFuPt)+)tb& zsVJQVGb#@i{Sd|PiW$nIS(gp{t;3N&Tqn>Fp`kiZVe%Vs2|tIU#63BAUqE=)Cw}iQf|w60y8md4{}Ad1vze$sdr<<=-x-R?xm+ zVu8BAQ7||ET|SXNKEG|=x4g}HbMh)Do+ln9b|jD?adnK3o{F}NSi?`lzVHfAGOkEG zGAtYoHwfJfT?<_eT?tnUha;mRN#UV^tG;qvMfNejE#M423f~UT3;qh+4!8mrgWUqp z{r7w-egId(?FCAXL-6(SvA!4nO1@pbA^bnS8GcQ$ap*{-Qlu!dDl#v8Cu~H*okGt- z+e7it%Fx5`(6AxAEc8A!E4Vc{G4LNme+_@C@3=49XZ6uOldmg(3S!&Kd-ypZGp4iu zvA?*9oRhO~L)h;?;2GRI-o{_^Rq$2eAM#FaKO11WQ8!@D=m^xwo9JN>XFfWM?oT}d zHthzaggD5tWJ|IdSVWJ2-R6RW!{Q76*W0LyU4k;P4|*3}1(M`6)&!GbYoH<=h;Jfh z5iiMQz?OHZ&QyY)0CmF$b_X|%OXoVXo7vWk8>)!8(8(d{IaI_lC^-61_bH5OPSV7` zgq)}cA()Dlp%)P_LDzwoGsfH0I~J{tWfPr%#Wv6n**(5lfp4Mn;h`Z}uxDUKph;j+ zpd_#^FyGJlviQzidA2`OOuwV^oi$ zn~Dzgrh0aJ8oNcVFECep*Hh@N>Ya)rjj-pWjxJ*e`Vplfdl3i72INj^D%ABZFwgv? zk6O;exmwIF?6{+DRw%P%@u&rN7S>K~npS6NLFRN}PmxVLOS~SIaQu?&mHw3XmoJyM zku8&LRW{M&8sBA)$hqu(f&E3zV%D(3nGTc^tcMNsSavC&?7QiIi3HXJ2M1S&x`(cY z3nR&q>(TbntmwN~X?#KAd|s8jMR{lQhvtj&=jV^f&&q#PkXf*y;B>)|K-A~hp@BH`$7(WIy% z+9$F;(hY)87+A_Kz*!``qhtO-vGR}2+|S_esx^mzeC zAV2T`NP7kdn2r9Ez7Ri!tHYLKTG9&YKZLpn=1Gi6W~+c_GoHE2AW#^Z7#EYmbYzAz zSJ>lR9``R;^i|ne%%99WrX83tyXjt(3EYv|)M@%JhGF(G8u}SMALdBgkO6Wi`8(*_ z6+}0%B_@IGJPz05MIc76;fJ7HZHFDf9M~dk8a5Bhz>o}VG*$zvi51~*$&K_BsDiVY zBu34=VYhM)z6r17)qF!v$DU%BK$+T?dBq4Ir{Q3|u(X*@rcLx~7;YZZiCzFRyguqG z-GXjUeW&hFcd6&pE4mi#VN%#xTyMUg?^!S$$&ZC&bHo1xe)>iJZ^5TXI5)f@6b^Rw z|M0!#8TK|~rQd*C^@ScmH2}+XI(ZsE^Of91ZY2+pDkvZ35)Y}K)H|vPehWQ~reYX= z89#@S;Cnv8Gl@Rf4bNrQLRYreOYEdyuzlI#Y-e^h+mA`52U08PR$yi=rf<`K&{OFn z^gtZ>=E}9M)wGbLEpw$!O8K5PeQA@-O2ToXr;-$D3H;BEmeL~W4f$y07+BSLRntum zs~7C|ox5BI-1og|Y#(tQ;P;TIM!2X`Tm|2SfGOBD7z}j{T??m&OT*V9?Lc%ijc$mg z$GgSO#`JVCD`KsIqwuD7Ca5mlrMoJa_ zIRD&d_jmVi4M!;$^pEg8^-ToZy}iFp zpj99%P}!gEd*So(Pq?*gC;B2?k=jWerQXxcVEVoZIO_|+H3^cFAQ@*<)0kCUZT1)= zqyIptpHNW##|&boL90eD0n2;=$b(A^!4xvn=od6iy(M1~C!w5rOLPE^TLr$J2i!a! zY_w`n8w$}aAgE7(6+I500g~h=b{h3b|-rtgwYRvF^I8kP}%l`+SUXT=`KGR?4x`9pS+H@@E?4e z{FD6-zsXNQInD(;1*4%#A!W!Psuy_cf8>7_oDm)ynIA3*mil-4uKRBI&iGnFPW;4g z^_}qd^SSs2U_#ZRzEDBBGt(DglBisKg!drYo)|=HnI>c*R^9X3+Y60?x(EU~z~Jlaa0wd1OO$e5`kTSfW$nLf+6kecsA^WB#iA zI}p_~3oaJAiy9P7EE-xgt7vcWv|^%oV$q(WiG>deo8>Fw7bAB=Nr4squx~5BnLEaL z5#H!83^}4B;@uLp67}M-*qd0ts3CGC!bGk_*Twe5EpdJ9Nc2l|bF3~Dm+NA`1AlLW zNPifa5qcC%gZl1WaAoj(u!et?uM2k-9^@JBqAxE{JJ8Wzg}=k^^zr`Hflx3%Tr;AI zJd2DDj{~LABy=N~>~F*)HeT0DR7@1F8BND_b zQbskQCo}gzH=SSxP&3HR;D)pTz0m^iieP?h1(?j=V0xuDhyoTb!+#Q);ATG{^mqm~ z7ORH0A?{M0U_rrhdLknSmp`3($6SVG2QRobpnzU;)4ALHbUxqL%J&9Ji^l%_fbakK z{@|X@Wj{lCzl6oP5&Qz5!9Uz@@b~iZ;Gd4-tMVznUVdb3U>KN6jf34F4NnLz3GM}d z_GRQ<^t5^PKmoAdV;J>9R#O;DLDLb@M*i!pP3g-TVl26Q|@|aSq^Etr#&edzSNkO zo!)urq>T3>y$n^ZS8>WR#V=LmtS*|}+IHFvhEA4fq;?2cLMaPOp7j7?Dm1mFj3c39WUl-r+z61W9f!#rW@Nsaq{{rw}3VRv2 z^_AZiSPPOp7HJbb9XlU85UUHJ+$gp)wlDf`v>Fn55Dmqo5ZS$=d!RZMMJfl|@XKL| zNegb5Z)c!E;6$)raA?5pALZlx!vja*^e=)70-pj80;Pd@fwEAe@ZXWrNYn6u@bF0Y zNF?0YzlHry7tu{=sI1ru++1H1zto@OJK|INYx-~cclq-981Ll&;otDXI7Gr;V;j(g z?GM%ZqQ0X-WeXxh^#+L;ughbJbaUySSew%zt!EXh73w{-p z7Dx(S6mBid$`{1bqLm|vA!>OY}|b&Fh}GIe#t?bdQ3Oh06+y3a=HF2gNbHsIVBRT0E(ENYU4# zC&dGb`QqvY1@U2_A-V+IO61 zxzBuUegdD&KlJB^Izp+c311Fd!lxtE!=m7uz%+k(s1djFTJAYpK<}XH!EApCd7j)r zm7}ffIJP(W39as0?mFb1h)Kb59)Tfl9LEn}BfYb%p=NmK8|xnv7!Q?ldAN@&0-XX2{5O1mA$&5s8r;Zp^m}?S*$f+w zR>nMJ5NkqE&1_WN)}a z;IbbX>AUS)$EUJ0nMP1rbft%a?edl?M;N^?VS$yx9mNdfP0(%*g2yw6iev#biTH}S zy^B0mz*gMvdgU387873T2Q!N4NE_(!^i4+2^q{lg?zO~BIqmgM>9x$`8T~UVEf6QU!dZ6Z{7PLS~L0pa+HpU#yBKO>7wBP)^9 zsU9@N{A3BHIx*6-Jol<=Ak6!=MeBQaqBn^CWSAK5y$5TZ%qRuRH$>PpRE6)Nr?V9p zHGPXIVpEv8RAmAggbT18U=&}(4#K*mhcJ2agQV~)=t^&O_dl-NF2pkmuSB_MHTgel zHd;bPKTQ@>lj%Xs8SXEi%wNIx$oCYcs=fq}peI}!b3p+vjz5kjg-aq0qhI6AV$&ku zqr&)-#MGELJUn_zNWVN1|y#oBW%xV7Pv?L4juZ$`z}YpISkz zT(xR&X|Iya#ScpsmDo!f7Jn|8QZk@eU39AGe9@(%Y6ag4o`MGuD5_epBj1wOD&96) zDSRe8IQX|;0oK!Q-#T9s7iZfu0eUTYkXT4oqR!D>$hKIr_Z}+8y;K+a1U-#J{A3Mk zE5k9J$%`En!) z^f&1v(x;^FT>3!xpHim3X(_gTw*BEiz1z7fFf-E6Kb(CJNvZ=rge>qo!DcEu+l@qV$rv32p0@u!I?iC|uhJSOjJzOJA_L0Q4q!d*puirht~i$@lp zDE?R+Djr+Bri3ctiu8H?BlCl80=GiKaL>^A;9rp?d7}ys6=viOiItDE3nzhC^G8}n z3ZiJdU7|E`KYk*X5gisOAKD7~A>Dt5E1@+&Za9rJqUSQb+0)zxt_!<~JK3vHWOmqP=0uXA?_GD+Vh3qPDIHqxHU?~~lui>-!s|JE0dn7wHE3S_}Nc2po;;&+K zbWMy;Tq>wom{nA(P?^6BYWneoAC@03ZM@>|(z|6N%O)1Ikwz#}46UYEtQr(vB-DAgiXVTCs9{X}RUGR0IMe# zcngyArzZFq8u5l3g_42=0j=NXzYrMfZ_ec~Wz0I}I-O4TAf#kp@(?K^dy+e-p5SNJ zBUTX`NG08c*#))aNbELt7ypk~M*c<*V6q52x0CIQz1Xvu(lKjcs+VVwp?o`Eea7uQ zVLxX4UA;$IoOxkMaau`Quk@K2Me^CkcexXYQr5_q__q2_gVw+ASM!^}-Tmnw6j%}3 z3C@=%)GE+3*fG2#k`gNKNBmbqN24d=v*H`$+vBD2^@)CY!}Evb@6LZ#(6eA=VgJI9 zMV*QU6gi4J6`wDuf)qa~sa+B(@f6+3-x|9e9vnCnkOm83g78=PxA?8%Wh?SZjuyPl zn-||2Jrx-kX#m!7B=ToWn^!)+LgH-fakOUW58r6E0i$6ju$jyn24^cWKDrHchFJ?U zgXw%TUp;@^KaktYHsq@C=lK_$k#%v^`Nn(>KaxWpa$7l?vq1@U$KMG2zX72e5j^rS z>xL$D@%-VuBh&WPBeb)pC2jS`#k^7B*)GH#9~Ln1j5tqR(4ZG;Qq zfrx*lf3yF4piZEizsQ%x6|w2;Bz7%mADowRYp5dc$=ovM30Q!AA$KE^d)(E;<#&fX zcfEr=)7_gr>(M&ieeP4PWY-nXHEa#lknIh#HI-Q#yOnKA6%wt8j^t(XCB6#1fiXl+ zVgU99`$48MdE5zp8BF6`)oyf{~_kw8g`Q^J-K3rS0;o62(>-(=ex-M;vq-<(gZH2UP6~4k^}SnsS-~@b|Bs?`fRZcgqHt_Z zY-3_$V%xUuWTFWw>NLxEw%@CI`B$&3m6c4Uy6W9~?ml~e=XT7K*J~;1 zTk8AjI|f>`uCIyDi;P26JOEF(3Q-c-;67}BlR9ksi-c84oIQtkD&`|layl6$Z&T$c z3-t{|wUhqDi0phW7k7bQ&JX1hxC-0>{+7^`drjZLW5^n?9Zulw@nQH-VjxwOiSm!c z3ql`eAn732k#P%jAyH^QhoL^SEY_cBP4q+4z5U#^TyEDy=Tv*tHqd&)deyoUg1O7q zc5vvvaK3dswEeUVwRdzZb53&Y@YuXQZ#Pe}XM)G$IqmuAIR|n34A))PE_Xgpaqm8) z7g%}ukZh!dj|GKwz&qT#z}MM#&$r2Y-)Gr|uEHzht+9@%1C65J!B+W&-Gw@xg)K!p zqdCz;Y$$dETZLTqKJ$D57n=k+;QtE-~ ziE7fk#By6xHxJxaKjo-BN7{ky(JdV}_XoUx^Y*IA`@lizXdP+mX8}y)LW%`K@w&;e zlx;vX?z7If)dS3CmaQ>ZFTET~9R=+x?W63^90#16Tx}sVsOz5P8Skr&e8zI1FOUPi z3ZA>3!@m5eK%9a{a)!Ca&0_bFiRcP+7r~P&2rIRSUnH606`>%1j^EB6WN0?b7vXks zBY4Xp@8xHKCT*Dj{Zg7z@Oo#q3U(QwxYw(x`@qt$Q^cmbBwfCvA42Ap-HZo zaAEtDq+>wQ-c31?Hq??9N}FNrZaZt^(;6plO6r(+efyD4b~-J= zn%nLKv#g?BbJTKh&b$sHRkw^@S?1*Wr1w<~dHE$EzZ^m@Awk&7EhP*3PI=s(uI^**OI{p#jIATCvm2$^N(X5r-U3E^FMD*Vf7E1^45bZHw)lb&)lneWsmB zyt2+%mAYYd(vY;Y0q_w^6oIPZ#o$@j1dUA4F9b2};>T2X( z;x6eN>41LEGu)MAZ*OY`4|EO~wV4*%b9=fZ{09}Hb@Cim&ZnV6$kJ3{q7Lzg%O&)n-ue=Z0z?lUc`%#LQ+!1F*|W1D8E3zQ4W zZ260PQOP6kh3kn93uT0&+$W|xIB~V{zUXPBnUC^a@XhcruGWrHwu8{?&9-g;rxQ)J zLRK!M9!VQu6|J8kQ8XMMTxqU<91y%F*V+DXd&z_y+bboFN+n@(WV)5KS9f%E6tg%Q zIRA5XcV@c^yT>~gC5&CQdttBH3#KidI%`4oO)Xsy@J@JBd@1DH9f`;L!=b)ALhM=v1nA!H088<124^*w>$VLWgE53t&>vX7%7j3z1d zFUbew2BJr3%6H+4GItouc$y{?v3GF#Rra0t%ydn4qK;qo1Ayb60(gFwbvgu8qU}34 z_ovcMroIBQcTloBWs+@}v%URdTEXP4$zxJnX#=g#ZEx%gz`l$)F;_cRqU)mTn@e*Y z^>p{_aTMKNW!-}1>cSceuB|SayuxS4MxiH(Vw9I^Vu7dCmYhT^BPx;uAnQ(nujpN*`ygvQyb{Y+i5o0)EGSj^qA_e~UxKanb^5 zA(t2H?0WCml=VdBJ3mKEkbWt-ls>XYY9-9#M6k4f@fL$S#$M!h2*tQV z^Z+P{?})kBVB|13{mYO=-m{)bF5V&A%UKTt&2Oglf={C;gr`reKdj}_2B!sVhg@Ob z6Z8?vqBy4D1+eZ=V&`HTu)nd{uy9Laukc2=MwBEb5-W%f_!)d0o&!69^+r2@KQIuz zWI>$X6TU)VzU1<~@WqitWRY){ubuBEQVyAeuEqWWsP;Bln4AaJ`FdhD-U=D+TY_vx z*7<6CKDygECfX_jTs_H_$3EM>(>4z5=pX=nMIAP09=n$IHFXw{A2I7+X+Pk=$!%=} zQ$NG4tYS9wFiDHo|zLZr;-qc&?@{)G^Z4-s^=# zpZC7;PV-KOK(!Cj8L5k01|H@+vK8W_L%tQhKWG)qBpcJW*n&(Csvl7aZ-yVipW|1k zUwjw(oTsp32wp=NP5<$Hb`|k-@Z@(LcK33&wj{sZI(O^wl#Z?dUWTqj1@I-vbl+g# z5qN<*=zgjeKT%$+T@ADhjt^!B+2E^C$>6Er-r&2SX5KK1`7h~X6`P!>R8u<1qol23 z3O|=EN`Iv%l9{+0D~e=!?|90)%en?Ri`XC9d4N-z*zN$#@YC_c@yqqpW7*|a9b>F5 zQp}{~i5rv5)aup|P$cHtD%*zJvTS$lsm?a8h`YGEqEQq-9ieX0h3L_A zXX+RfYCD5k*iBp+t~48AJ?v%nC9ANT+2>rCZ^D=4%L|1iLV7Ch6w@TPP?Koy#$11S zM`FoT1~-O}@lE-`0w%hpCh|(INk65C!12@g??OXv5q*Z-h93YV z`#3fWE#~`;6!u;5HgWfLjdnJ&Ssqxs0_*?8_6!=wLiTKXf0%S>;>_z^hi*by^F7_t>UxzexfSY6KjCIfDFh1!RB+aEYa3NaAZOBnrE!1Cge9IeHA_1-AkR1 zoo$?p9GUiGj_!`3wq|K_tX4-yVEh(3{f=$+z4kF6x^2$NF#8a2esI2UCwS9+$YRQ8>#A>3A z5EohqU5<`Lmx6b>7d?V*MaKJj`CekBiBVK9rXnkGx5y(gW!s-)mnQ#0tt}NAs zs?Urk4?t32=W?3SY(k zdgox>U=d58APDLl`YC_NJZ-))Q-a0KWBz}&1xiD?qwJ7B%B97HLK}WHcbNUoBvMWB z3s__16A;4!7W-Vk_T*cff@WmFv^W8Jia}8S1Ti!>|9=-AGbpHV4KBoh5Fdjd;54(>2 z!G95(iDtxX;w5p3_(p!92#SD}eTTk6ccJUkiS%QpE7O9WLhYfaGihuowl!Gp2`t48 z;Y;xOx!e2-p(Ou{zb~{BT;dR^k6cP>DbA2)igheh7vDUjCAF8&6!r;0v6pyLDkUYz zYm@|aw0c%6rZrbbOP#nR_A38G*vs>LJ3fuu&6*IXKVYho62w+(LG52d(~;f272fHd zDy{*Jla8KttMv}pmTetHoW-4cT)CaPE7R8+D}&yK5*I*wqT8{5i6NAwIWwGZEG`jm zi=%|yyvgNehEgH23DFsU3>wsJ?ib^p6Oidc`m;ZeUGz?r=+hkQVY3(mP6aXOTR!3tUM;5J7GI5M*e_xz6k4r zmq%*4WzS}`B^)?e*gm`^UI#A@WB?8u(1Bzk1z|hlyBw z$_Y%5u z-}y68Xv=Ve@PDACxaynhtpi~0V{bR_YV;QKMI0csmIejWG7F@42{#FMi{=lP4wTg! zXxsfGL;f&rp7MK)FM3ofqz+QLif8!|Q0}T)m;v;5P_MlRC)Nu&jr8)Z^KSB1@&w#t zoS)#cNpv@Zqv$nsIRE)Bx*5k$dly@0V7;cL-L-XewsF5i1`-6Z-LuA)-}cy*?LOqm z;XRAw1ViHk(!^)=O+#veY1-2_oOo1t38EcuwpGZdn5k9Z9~XdQpC0 zlSb0#U{!1MLHakHK^Ld)L5*I;++;GDPO!5Ju+6zee0%<(Fj*KXbQHD<u?GdP+*DAeUfP=hcX`G#1L(;ySzEc7z&&#o-z7W-lQHdj-R#T|C_ zce&gvJol0Ds1sT4dx}l~;V}_EPP_QU;#s+aGFYvnYHDYBr+A;g&GJkox-%KUzv3yl z1G@r+I2SBnOESQK*U(+)60|8=8ex6eupKL*`9MtPgal_M(ix577 zIsu?|GZ;CWWxor=(0E5#dj)H+)WxYafcy_yOWE7QA-fLR>tF7=&JsY=SzYUVQ;~ms z@4=S8jh@7(5oPer*josA4Y@HKcN>=|Ajqmd~dzvl|NhL{NqOirR8@q?HOybF)- zCyK%`(;ORwjlv8pjvd6FVW+XhSUs#aq+%V>&saZf9SX!3@&v1c<75S@8P$&bL%FC& zRDU2S-%!QLzVvuDz+9zsP`~JB%mwx^dzT%-?&T~yxB$11cZ(H-cYJ_v&ORfWyC*n4 zcznKo?$e&ySO+REBPy{7n%+1v2IR+q(3D`~;Gs|jb6LP{2F#28R;oj;A#IedN~gsH zemWau|AAiV9hE>;AXD(=Xb<4W=7W0L1zA|oQ^M_ZQ^3EU@RGjs$UF;D3TcEykReEZ zv<-aZH1?6|&-7s%ac9{jSbf(&&aLjb?pxj>h!y=CgjWci35hQU+}kR&HaY_Bj~0hR zwj)*)tAXc-E{VbGVV~eYPQ+K>KgcdrOX@Ujg9CdB^M-lBbfCX7-I%RxF_vIH(;~f! zu?SplJ`aCYFvU*rRTxZoA9oYH&UM@#vA5Jv>Ljt!1L;4hij-TLC8sFGWm0izS=tHZ zmMqB!mHjHO=1@#+jg}x67gx&pBw3gxG!$HX6ZQ(AeM#&~z8U{Q=qskn6{SvmQ7Q{N z3x(_wH2H2MZt=bGtpx_MsYiA{htaTE0N1tj4D@dItwO4R4Bvq6hj;dd&c_uK`iuAF zx=ID*fZAAjqjZtK$}`3F{37-Qoj{5tO}g=$=v#CKxE~$x!q`RpG`;~rz3Y9A(ZZO7 zeLyFHMtJ5m;ZKI6?XYf;xYqSqI(SK-8wR>8&SKV_se{v&!cfe6JJ7(kk@kS?AwZ>c z+A82YZva~Q(Ei93cBI%4r;2pOdtBdYK_5zErjo9}9p5^9d zaK|_nax)*Fi@(jEy&H^IBwR|KgBvD*-|GnPi&rz*o24Tj_*rZba^X~=9~hS3)42IVFTqZ?qTJ1hF_t3TIJ~(WuAy3eKNCD3+ZxbKwW4)O7 zE+V6CKzzSK8)G@~snig*Fc-1#&xCZ*D(6;ODD#yv@&@Uiv_>i>PURo4kJ#F5SNc5J z7oURVM}OkU#8~_`=-Q`9C!`KC4H*h>s_HA^8v>2{UiWCojZ%G^kpFuktr`@ylbFPHZvu;k)PTF;tksoPKwdR2f8>S>%awqYr#jVF3L%fagXVh4-9R4?! zjI~6rBLmPY7=d<03*vpqAoYq0le35b9zqg5*`5@S=&g^+y( z5f|ph`?0f>MQRSMUdSCg99rgY6DVoc_h%SG49R~wP{8?8Xp$IbIa~1k&mS zc9(#EMZaJWc0O}}9!5`M*0C4_hxM2^_6;77hRUD{he0p+oNPuGA^yPJU>2E&Y(RW~ zxhk6UlTXO6q+)@@TcbLWZzz-QPcNsBFeRAjY+iOXdz_oX5zq-v;CsO6gx~dN_ znj77Vc46urV*;U{lprc$5j5#&GU0t>PYa}uR6(KpiD4dxtcdq*PW z(855(uW_Gs?sBzu&2_HzULs~8n3M68@xAxNy|a*O-u$k4o~Snn^YHmyDS%_Ybf0zi za=D$2?d@SAn6S@se)f(4lkGfJ2UoD?cn4@h7l6>wv2IXZ1n}B|R28NeZ5c=2BfsMJ zyuDp-Ja;^s-7}DK#3!m4*`7E^R;5Nk8W5nL(aF?x>K^rrvQm}Foe<6Ai^>G(|ljutn!9U|$Fe~}bjd7b~OaaFM?5B;6OrK6GX zwSY(erLWLOLfJZ@Kh}<^LzGd{GqH-0gZmB6KyJPT`;d7?Kc@w135wtu{uA2> zLwQHN-(kS@g!iNG13DYqj9EmGffJAsz8**;IAop>bI57b8mQ5w$tG~6<36?_+fG=g z$jW>1E7ym_f$ScERzPF;7~&6ElROVbT^9g0th7##hp*l+VznFMdj-0NUF={MWmDL< z@IEJUdBAQP!2QR)z#L1~*odeU3MRowl`SI;*CI=F>C9A+Fd-AORVzS+LmMmc+XmV#yW!P^+kMn6C} z8OMu*a$vBHm`daz|As-%ab#YqAJdVRU=nT*+05JDS-?Hp_aExQ9}umGQse_LppxnC zFiA9#*}`08O463kbQJK=!W2ioCk1ji*@GMjv(69TcLhN8|0c_T2(N+7!ZJZ#js_R= zIq{l&M3;n=D-J?BALC-nG2a+Jn+t|G8i4qi&)tM){I4(oQnMuCqbP`1#S7w3@x9bf zIwE{$eiJ9rA5;g;5#Amu7o2Yi2DRJLcD;CTez25(wlT$@7?|xJX_VFODlvJrJX!oL zbQ1cAZN=XFVb%rHP6GLqNP+>?EkrTs6GVJ9PT)nrX3B-UKx(5cfSEr*41%nnBXGg< zFomc=oFnIg5J`l0y^Xv>^NIgO|_$r(>IxV z%oyeofOU1*v20g%6uSXRvX?yx>GneIiI7XUB`89&a7}n678BkHqlCZV*BTHU=~6Mt zCD)T@%2VYPa+35${3T?tS@dy!g<4$8FRkPp+-8|o|J6$BzxcaqOuUKqNCA{DEP!^6SOSkgNfKCq@edGIu!i^jM!#mA6_1Mr1J2&SQ@}n zA4}I}02~zlNHyhys-Rv_mnk2Vf7M26dFi&;R4B<7CkNqnyaG6ahp`3NJkN65TbOW} zk$TVe%6-f;5N1N!yL)+?5>F}2*WKC9#lzsuO0*9YnCI9akgt<~5ort$q&W%}41N(W z>hpW+L5{x6;y&nHYaM7i?tPAJLuC-uld%TS0WLum>>=5mssquiPA#EKrWbRJ-p7=n zXXEuzn(RPNhV$|+WCedwU!YOP;P1-9pSbA#a2PM3ljwC|yw-(&4LG8Z|JZcaC#O2GqMN&m||7q*KLc>~n9WT~oB zMth{FY)+W|D~!D)x|276shi7~Y#{)UN`uc(gRRH@0wBeb&X2_uuUk;+W=uC_$xwbAtV)2w;EOSy%trI$4h7B zIdTbUDX88@Ag&+t^T4^@E({bl^Iy2tY)MKZOH$h?77qfoI}g&5(r7Wngp=Im+k(^u zyLlYU&6Y+MV>oEX9Mn$GQ}aoho(>bhalWVMSGuWRwO*R0j#rEL-v=vbZ{;cy!G1$V zI4s{>s(0G|yK>Jm$S^GqE-je&H0h9S3IwvJ5E`tK4M-F3c8}>n0mk2rbOQ!v8`YTj z0y6wLz^R|Xh;{n*pcv7bTuM{};9?;1)?L)G(|*r=6l)7U$1S2Mv6;L?zoes7Eiylu zk6KQjrk~TvG{%gxFt3?g%xn5O2t)^6jsDH#WM{Cm7#k$DDbPTdVs0~Encqx+=}M!N zOztP!kttLjvJsJ+s7IV2tHL{VkrT=oX@ntUq#Cs&upD?^lQrI@lb4r32z`fK6&~->E)$L!vR!5}Iv4eU~}Ryk}dn|FI^pqUZQw zJjWyaF8&Aq9Ln)RkrMAp>9CkP$WC}uz2vL%R{4%nQmLbCSG>w;)zVo}!BVIMt>9(( zp_rTN$AyF&@*epJ-a#J%4$EZcCyI@m57uB1re67T^jIp$-zuk!!xs=pJGhRfrN9mEFb!NEcGh zo6FnY{oA*kXh)8NBephK4a8PU@J*BGsdP>#z-O2TjLD2(da)JR$1q?~hTR6`<_Oo5 zOXT{nJlCJk&HiG}GZUF~_6W=mZJ_&Ds2b!8stqK-^N6M}h*FuDOC&=b+yf`}W~wFm z92~6t&?6z#0qOyD4JMl@x)Q8p8*HL6AUpfeEvebmIQl<`AR03fsB6DDCl}|A@x_D{ z;%(`G(nfirTvn&6xcX50q+M4F$$yLcz!NAT)MYD6mL8@(81%Q(d&zZ}3)BdqsxjC< z$!H#^>`&5LX(QAw%15P#_(H(BYqvj9NkErDc#EcfbekBy<+83ZyVk=q^+g776=>9byh~i}+cJ$=yNKib@0JKP3R$ z^@&IV-)&6eVM7i&Ef?(@0N+9q4rDa0PPRZy3M4y;yv-3)J~iw7KVuN zu=qz90GuDg4`7S4bGTHlJzEAs`_6Pj>JsU|FX1bQy!a0|YUB76Ftbv@+W8Cf5P5(k z-U`mBPWHerqlyKrF%&$o6~tIVrpwdWY+GTqv|F2Cr0Z?9KJsej1+l_M+D4?TO6zJ} z;CPDFpmHD;?S!p(+ONcJ+ZHFEaU{C)c)Izj`qqOJGQv{;u)MoY#nT&kMA~QtR?HSg zXD3lHFd_C+NBOe+9(FbN9M-@JZU|`^j5R|Bc^>;5#6NTaQa~S)#rU0UO=2?@V_2pd z!-E2B$gXAAvGv)J>};T(dvev;d0c1iK1Xv++0VQMApMnGVJJl9*uU5gOa-`lVm#zx zed)5Glk3y@=r;6v*j>-51=IxU9rcuoQ(qwqK1ZFV+F4*SNv5;tG??*^Lio_0t`BYI z0a)P#HI2^te?r5YWD~iLY;R^cyPbO|G#593TeMxxtyR`5X??VS(NRxQ2P+-rhccp% z4HogQ&0LX%TpUmSkudF+MNo zS2ur6s3E)ueKSa`EM8aoYhh!RKj1%Ug!G!)OHEd2Wx85Jt|bP=#lmH&g;bi`2ExV8 zOk?}7GM5h)Y<@uytbiGIV`P9hy3rl!5d0S;vztxl*70)$n|MsxA$^la%X{U@Qb%d1 zMG8o7UkVo|;<;DPxrc zWrRFIE+OOc3AMA))gK7dQc9`?wfovR=?^~zkfqDqPUaTvW$H6M7(087v+~cS#nK7k zAHJUSLvtw&#DTJV2l53wj3vVKM`N-*nFRwkPI?2A z#P${JN^bRsUPXBZcYLv_{S#_iQf4}Kxz2hwz=ZoqSGg2V(xQ}Csg!k@6K+rRgg|Z= z^M&2R9nYLoUE`cv+%vIdR0hBWH<|tHVgN1L;z!6#Zml>^Y|Eb$O7Ww)PlAuV3wl?f zdeEP_@ys`TEOLv!C?>(oNF|8e7O<0`g=xzsFo&4ZwB;hRhRw|!VH3DMU^rdk8nHLI za}Y=*itg_$c>mlI({-dAox z+Pgz9r9ISKI%15`59l-esySGzu530_gY^RchHIKP{XGG)US@37*C-9-0jj12wW{hc z^}Kpg=`CA9f_xIQr6qC~p$YwpdB$^MSGl@Woj)q%hP;c<_1W)_9LeS^B z`68g5j|r4GObWt6^k~iWm0C{amvUO^sgzYZC_|M;>PpqCvg#~Y(4Vy$>QkV?+iSJ7 zAzD=LtxwS|Sm65~uWnN}sRqy+X<#HgSB|Qp_FeyK3^UH?Nf046*A%^n+CV4@^PA~V zYRkgS2xZCgL~(KpHIO{Q*`V31twsY*^QHOP-&%agiSlXfs(fEwtE`cWNhd-7%$B2~ zm7mD>;+Mh{O`6zRY9Y8FW3p&q79fz|KcVYTA*wbxmN-Ww5J$-c&?*mw^Gbo2@)8f> zN(C#?97450_!#$$yUYF{h9kp?-9on1p05b)%Se!I$NAD+HkZI| zg>u~kit%waH+z>)6pHdqxeWfaP?dLx{iNYyU$F)JKW##gPvJ(emf0{8JB;S&!E`@* z3jLO8$t-42Fh@=?>C9+I!D}*un1z6%Ev8*CLYu&>gZh3KewWI;V#WgRJCWW^H)8U$ zb{NL02JQgEiS#dasZvC%t0XBmv@+ULJ;7*YbT*0_GmUt_2rdj(Fll3kde~^^$1Ude zh!TDi?ixEA&l%oiV#W&DCbrk0S=22?75`8Dx|X1Rk^d4diw=v7Yl=KV!4Sr9coY7AmspJ4Rc)XIPCP_~2By8yfC~H-OWM!c? zR?Q{%m3vDTgxx{5AZJmX>9_oRNVE@&gM_&-lF~&SCLdA~l|$MqW2C+f@{j@QE_J=S zUp=Va)2eFQwKLjyt+y7`E9vL;Q+hLfo_^CPVJtOT=*zT^+BR*U_7W_*!HNzJaJGKl zKRZyxUqve*OX4kYv3f~wtTYi#3-^hOvoiS$9cX`$Qaoi0-1hXvvyM6{7Xa(zvHHwk zH!#4j7$wvcc=Ekr18tTMs~OrhI1O3@NPsCB`g&l%R>&iywc<(P5r08w$7gUG*e8sK zdCb2O$MQ|-Pt+kAqj%Azpu>DKx@^LY(r&nhoq89Pl*v& z>9|r(tF0}Se(;~jAM|UbsQ7@}i5%MgC#k*j8rqNud)}lD*|v8}o-M}K=EqFdNhYS5i@wK@hf+W5H>xq-B z@*pWq8Yc#Y&%zX5~F!{m!N8u(v942EbscZCuAUmEL6O1j! zM&pQ)VEhP_4;Bpd3w{k%2u6)z%H2ry-K8`7hIVEi-WkgL7XKO61C^j0eUn}b$9O|Y z)m3ehc0=1OE$16sgi0Jw2brF%B9)MT@FT^Q+BNNrzS-c7wfaJ>ihk8!Si7cf()#Po z_2>F}MU`bWkGw?ME`OJ53#-IT@tLripC@tp8i+5WT2#&>S>%%9dH6iOiZvxc+#{7& zMk$-*ZZKQfM=h-_hOTM9@x-4;pQc&tS`l>!RA~)fpqSoOp9sIY>x=c1#$w~Pzmf6Y zm|;vdrs=OC8GUIK(FdrjmFwyp)vwzEJ#heo=8l3Cgus@0P!DK4=#yN3Onw}|ub z=k6oeJ0czZhP`9c)j1%$I%tI>T-!#%rfS#iJ*}UxK-U z*P`k1C(%m*7x>(6Wri|WsS90eL*au^P-?0TG39XU;6i<>_z9%ZnfsHdnMfu{oJT$(T5({hTRfG$2E?@_A=mJZw@{v?^` zJ7B+TUjn4lWOqU5LuaCuPlOxM9dn&-nAYCvO+#BE4>1+bBpO1L@|ZeH@1~wn_sQzy z0IsJ}UFjs=lSV=W@l-e=4iP> z0GjY+0>$rutR*Zq7cBS0^KuIKR#S~P#vZ@hF9wp${$@=xr};BnHuNF%B>2&sW9Csm znk#qq&s-e4yOZ3pAiZh4QlwU3wR&G(t+?cZ(rJHxiK{|{|H{d*3H)Q~!GQsfx!7E*y;Quii+f63q%@&8nudfd$uRHF3U-QI2yOH)@E7s7*Uzfm#SZ{% zcehBT{3RnJqIts8184LPV7s*AyL0{6nL@UD$zMb{0ofQMY!NcV{bF(cv3Nv0F4X1M z@&^I7c_^-xU-OI6`?kE!2Vzs*p;ytLEAP}h{$c(C>Q?~Lh6*m)iY-IRdh5WVPWH`5 zJ3+j=+MUmr4=D~{{x{6h9_+&}WHaI%J{|JdFcBeKcyrnzQ)*W+pIAmt6!UoCgp|}hzh>SGo%gD3ehj1d=2(BdkA*%1=yA(e-CdDDCd_|lHZ=g^}N65e8d4V>4~!2Xg&_KGP2}kafXtrY>|&CVflul(5oSd8rawM}4EwSifhq4a_v%W_q|_q-N+AP~SsLGBDYgsnO~i05iTA`~B_w zNdYOa+yByU`gi%a`78Td`Ty~!`xEr1P{w=crm-$iGk7WZ$(-W96Ntd4&?Qtn_-~ks z_>AsG+;AvEMaydWx&9s|7gNJ0Vz+|Lp{n0VU!2)6%*j`|h2V>f(ViHy{ClH$I!8!c| zI7T0`7e1b>O${X$5-pf9(kVp{uk)BtQEVnm;}f`7P<1Uw`I_7dW&ljSev=q=yH?sb z?w_O^(gk6(G7X;6C$N^I&rd&~8 ztCfIlY@_8;A806O#)xuUM&!Sw^^yth(KeA3dkJU75@Jj|CL9o+h=zF3A})v3ONkYD zQpgX$Sy`zMqygEoLuw$R(f~10>@NKSF4-x0qq0{E1tK9=C@XX-^eNmvG$>Rr^iTM| zXsw7Z@+-U{YzyT#`A!oKqK}sD~CqvBsGO!tQ_aI zNUOxfT#{xfV{})iNuT8d$~JkknxyXxya{^4-{N=U8L>T~4T1m6j{cke1x6RBj~fH^ z0tfw>euwr*S}C1ZB~{T3|2Biri)stOw)mk3b-RATV0Bb?`->X4poML!j{tL`b0B|U zXrOoCb*NjUedKtoZLD3Sdbm_*xh1HWy94cwoB9oXf`0A)je_462nI$476vB!kNV#P z`UXe{j@IZe^mJpczhdB8s8Hxv=!BVKjyC@bJPsP6!;!sFf4pGK5*Q-&6ef#Us73rh z^nCPeM(vCTS;exSg?p*69Yb2y@AS3N2mV~_M`5wv+xTWAn3l=G&Ve$4(~%qTyRj+p zwsH75Z1IgTU+iZ*M^>|4+p?rUL#8CQo~T1Tp$EuP{78C*kYTP>c+o1n;=2g7g>u3* zrKs9l9u9G2E^&mYiURER9DHw{hIXt8bdp`Mp6CKH0WR(P=yEzx&jwe)wCFZHVVa|} zMQR?NsLnAihKDHgSp}5990H|qNY7gUwRJ7d4`NmL;c0n}mxb^twu zmhv4Yp1|cjWw<}W0dcB$U%1OIfI;o~%pYN}Xo|0-a$+wzufEh+=YJE78@IH4&;@;x zf9UyjMz^WI)c49u#nMfFpwyDr$$1q-iK<1^otjtgs$I}$8tI0nx6__#cXhjeYXCKq zgWE#;Bc&rfLs!iQ{>_@Gae6AazAe;(P{N_lB(IX=@+tWiEZ`r~Txp|BC?l1v zN_)T$&PeyApd`UTj>>bCZE6nnq&C80%nKHd2+_HbSJ8%%A(2xNd$fPd7ONEXMN39r zhhkwPc*Cq0sHT0&ez&hnM)MtQv+ddYc6hQvyZ+6tkXbr?m)TND=WcL2l~R%+?o_I) z-}PhKR=t9L8L+-vu#y%8r$!otN5w2z_cNwNUxj;x9*0_+@lXM?Pr#DjY;BeZw1MUJ zOV3bS=>q_;SYqZ5V*Z!LL&K}L)@K`ejd}iD{+|A|ppo7M7MoU>a`%~op`d;WjSA%q zzKhg|-AZqiaWcb(a)R*3?3!LSU5U@h zSQ(22?`7DtriUj2T)i#SJAOB7dB*YZRkf|y*eI%|$#sps<`sC?_tUL$d-|bhI9S)L z9sC{(WsJ(|o>hKlrJb9@gQaRrBhFHeOm=VKex%P#UmZn5t(4Bf6_A^z^jg`XjFKP8 z5vj6NLh37S1dHmbv`3kZdXhQ#0UL|#MP1e0BORj?>c9^n?3mKUmxgJ~T&cNHLoceP zn{)Jz+KqreaKOKvmoN)P1Ax#JF0ULyyn%7fh9ragusrA$3&ezrY{&=D2qv)E*(#Vm} zn@~bP_hb}FeYkXG!jFPd@F(#uxbeJhbn+Dgal=4{2C*9Wy z>m&RH{A^&exiK_2?2q=3#3I4?{;Y)TW*MpR#OSJMVmKJQ92#UkGasAH0<~bd4f8)Y zJ{q-*AO4yCLT1%q8`Ej-2yFJ(3p5PKf!5%dS#q10nQeXx_6sVZ>)|(%9no>I#Q50w ziF6^OY39(ZxmlsCO6lvPZ=-i(HKNxe_He0iyO0qaVSWv|gM)+lgNVtQzF;TwZxG&R z%!R?G!9k(=;bxIgbW~(jXircwH=0w;E&jUxv;KGfTE=bd??7_c8fYIYpE=i(9m%+p z)g-+@M()g0;XawCvNF=kWOfSs!4=FEObQhWzE^|nIz1jd9y%RKh}gnkqPe3pgF^zt zq{dt-g!N+;Mb8Y9!G~rWH6QsD`4P`6^mI@>k@-YD4~|R3Q|UuX`KV(i10c9=!bzu@u~^WWBu>@Mr3ujgDp^ zy|vO^%kNLu=K|%uTo}z1AUlyZ>Ndmj?YY0;vf@=#KB64-gw4sSSR=SeVm6jRb|NNH z$6$u|j^I!lYm=2!wV$+r-O0?svXQ*(R*OHu_-&N&&o#OSdYL&w|AoJYbNUs1OCZzV z!MJ5y&=(nf1FeIlgGWN|Lo3X;0mY9(DDgV5)SP6VF>9O6%#r4y;I!c6P;tmSjz(L= z#>8)?r)C__yqtL}gG!$nKOFlRy&XOkJRP|0zw9q#lr~!Fn_y=g(UxhJ_xgVT)4BDn zaB^>hzCYQhs&CZK8a0hme$hY1KR3`Qm=Kv8ADdo3{yY9WJ}!PMJy-hH^dA|UG8(1F z;~!$Zqc0-wBK3nW%#Hp&{?-0@O7AFku-bt?yT|XIzc+pF_&vWfm8|W1qPw;9WaUHP zV(hs2pZbaGA$|0>v-oeD$AWo6l|mn)d*k=wzhjHyj;tTqd$PQl3(~3dmg&c1>G5vy zLs218KJ+ehF4#V}D2SOA0_THk!X3i-!hJ()f`x(^ky_EpkMFxbELOp^~Fcidtf0<~Yoj+G# zoxifCszU7RPFv>M%rP0|GY_TPGcD;;wJGuL**7zKXIIT!7G{-yg3TkD=0I%_XK2C5 z6-#DlN1u#7aAb@E<#yWWt#kgLfkw(^sTH@Gu~K>Pjc5R0L+uuivvZL`Iv###u8RGM zpO3E$)-ZEHG%xyp>reE;>RdHZZY+D`+fqb2BwmzDu+OOkTE!9^JCm#0I^egNpVBDx zxj0!IDtC}ZK!$c(JE~ZUiIty`g8p1ED%$ z9|(=vkq^`#noW49gExl0ebkrLu7Q7HF zX6`hnm}3L+fICn(Fgkz)*uZ78oO#$}&3C~8!9St#p$?(ep@orEv6C5PGft%MO1Df; zf1Xh={YFMohMw6yvs1>i40rmV__tUn);EHLL!l>uu3#rG@mJKU$Mzn7d@`_S%igVr z`|Xo=pWWFkOlsAE=W{XfpWJxR@n-Y`Kb7eNnzO3B3ik=04<8A~qP3#oSc$0RdW?#v#wtaw zM4CqO2j7QIhnAVS!ds&YVwPBH4_QC8oS<|wHWu#;j&Gg5ptQXmr zch=suWLN#2P5hezHQ{XQ7(T8SH#)}hWjM3X@3g1KqHFvfrF-CC{{{al{f!op2XUxY zz&}PG50-|V5y?vy^(^EW>y!l{TUPJ%lG)ZB)iS5X+DC%1L-8^ZEim4HL%XWJ2D9L> z{)Or7edHcwZ<4ZTeeu!6g%Y~z{Uts>>Q}QEQCwsbWh~P2W>TM$+qP- zhwYcMT1uOQ%c(K8yZj@mjXDBVM59q*v>a_lGtnshJ}Qa)^`okv)SfQ|w6-?Clt0CP z6C%XE(qy@r{7|{ZDPPoas;K6uJ~f{bp-hnDr8ud$kSbIa&I^BpZO#XdD|T#OVEbY3 zVqan(VxM6jVZQ-T^wL?yna-DSUf|2|Gla2Xm_+1d(h6~wI6)dG)e|2{`{nlXVCk3i zLVPM_3V-<5&S)SZH2`ZyCR5AU|8ayw?oP@D*WBwRy{(iT?6k2(Dxts9nrKUz!uOGV zm$!dhw39d(+nxf`tEmU1Or3_QXNV@n}yex$B0^iYj%z4$>#WBj!(|*_iJMyoDWZ}47hR!(0zRi|oduIL5+Kt~LOcgM1cPveNlhnepMBS{- zQMqvSn(|D(DjyS@$pw{v)Q2ijf_XJHB5jJz?sy|KbF6X(JC-CDvA%|Two|_#e-bC! z&ZKNhxtr3~G1<~DJ})sYA=h5kQOud?a9D1}-MXEm$ch7g9&d52R-N z3u|Cf(UcVar>Hr7wxG1ymf#e|B?lz?EZ?oGqtg!*+!noKHrF|DaLDtEZZJ&?$4-g) z80Qx|Gj?(UiLsr0zmM#Gd|=z*`$yj%n|@q9T7Lh{{d@LC26sJB>TvprvM?XiG%_pl z=jktSCVX&Y(wTmdx6eL_y_dK(v1H=Qq>t8?&N6@n!_yvGZY1ZVR7$>;@Hmz0;BeY| zI;@Ug_KyI)FYKl>&6=BVE_D}QQf#VSLLHC=?a=S&FEB?Akt^7Z3!oL~F#d|ZYNoP5 zE+F~jf^vO%njEN{QZux@`T~8X-cawZx79mqm$a6uMO~p4RL3Ye@<%CJyd(ySapDy5 z9)Q#c-sJdo{Bph-zkrW}g|$trE_M{Y101iG=1Q+&v7CWQJw*zTT0&91DLs&NrIoxx z{wn>JYfCeviNakzp11R3f%`s9v!(1xooE@F@+D<$e5ie5R)xzE+9umo%+bqq5i5jz zN*P-senac=VTl`K&ZGoclSHnx*iP&sjS$aDrBqcfq5Z<`m3{nU$6BGCTvhrCckUWs zwZD+-oaI<&t(~$sZN0NF-&g48j26yFNLnUWR;DOB6}xs^IVo?GpUHit>C!&An0!KM zs|;1ksteTD+66tI_E>Xi=d>Wbi@r*`s)i`{lxwog$-&YU@tl||hKn_XoxFuV!yo1Q zI6bge$HQ6=6$%Lt`PF;Dw)1Sxl{-qm#&8$6NIyxSbxL z?X+LBJmR^uj!B0svqeRn>nJ2Gkxz5apdB@xZf#zY^{|Jnu`}x zhJr>gH#Yj>FI$RO(Vm;O%#vd7XvdDn_5*yrxc*1VZ=bnt#mXYfJ8fLLyYazMr_grYl}}mD-MTR5!smz!aKO~Hu;WKsAKMo` z|MVs}f?;Ar7YG#l!;I9Xa}_UEhhDFJLcRD-i7_dyE#=eZr&*x3k4y_nO-eeQ9BRMo z?CS`2R&cbiCprE)o~FG@ewj4Y#^h*Rn~cMk2*G~1H||cj5i}nyPwL@w=m@Hbci|X3 z8c#?5+BAYN0$p>pBPwA)3Qkp9n$`-ki6ef?AGdQKc;#T%6 z=}Is8kK98ZBrTAp31j&^d<*9h2ea2n%djY^JyIW72B#<~V-uDr4KBrA%Fo;7I$7)7 z6MR2>JXwiv7}0nHiI);ALoCs$mF$BY)x{%9ITXZBn2qTa{To^(! zEG3lZPYeD$_s*7L*>h~%jxU%UixHxpWaTdh6bbU`aOMyc33^E{8o#oC6td!TR9AfU3c-97$LqA z2MCLV#zK(LoWCcWmWspjd@TMewB>-MymLg@KiQ|+e%pK4r#T)t>N#Eti9p3Tdkbri zv@?8dJ)b;R2ymp>K3k0B{BiT*$HlKo8gJh%-BX`w?X|ITl2SpjD{Yj4dMlDihLdh6 zf#hd)97XTYyLf@QhrH2>lY*?i+}qh5>Z?s&tDaM`aS6;d<-=2dr)-Tc9kVU&R$L)C zUUhn0fkZ8>j&+VDFE%RipskCoPuk4HH*rxhBcmo=+~J=2qdR=p*il4(gxvH~I~IzNTt%s-aF%8!C5{ z6G}B@hSEzZEnk)sM*sJ+FCJGn>tmo$PR$#l}e)Oue?_$ zD=(FON*#FR4!NR~Cn`dFVK;2YCyqk)foXzeQ|kD%d}(dDlxvpTiSMmP=+zt1-h+r- zX`Q(u>qSNk8G+l7N$OQ;l5CNXqp%}b*etZu9BiAbq1nf5VYDG<^n6lh@xAm$-mZ35 zo{DXRp^g}*OPp+*Vj;F7K(c@EO@z9_d%2^w77f?4^mzT8o~A$0yK7z`uA+Wh=gMks z?V5g357U?HRp2k@>yz~7`ceHanu3d>R;WMfqmR>8sROj)S}Uy`?16krkbF{(my=|R zoG71=%ZjUoh2mW4fZS0!Aw3X(f_5CuPjeP`Ja@)AXF7{JJ2?07VPdTKRH_EFe7kI@ zO|{QZWdza72^;vMQZMZYpPP0zxvnM6xkBox`Rn8K!uk#^M4O@oqq?Lo3d9HTdgR0> z$Ye5JKdDFHINVs@uAS8rSq=HSy_TZ_pRJD4&+AK2BpFUaaO*f1eCYn+h|m$|r39^9Wz!OIJ+ zJ+}$3zr5*VP|KjtLAAD>++Jn-oE=klM(tb<&-tr#pw9lP!Tup95B_)HFFZ_i&iGV}F~n}O#aTP2v`9_m zoW-RqsflB=b+Mz0*hGG$UsoE-$LLtY!va_YO{Y$JlE%{Ev^rfuhmdb1h9I(uG{t#j z5E(}%;ODU4N0SMpEWS-f;_tAsCt!k;aSYJ#cKRp%t-f2Ip@##73DeGNbF^bxapi*i zubeAiQaUKy8D%R7%E@Yf^@P?1?ypyEtWwpZTvzL=5z1v{s`6MZpa!TGZGhHVU9Zdr zlHMA2!*L+nnkWlDou_P^nKy}va)*MiY+)Ur3UDfUYWP9KhS9P22)GKQo(~7E5s;ur%7peW>N=#7pDkqhZ(h(t9 zS^=%OC|N|0R6y(w1>>f3pp)_C`6A9NeuCo#FNMciWgK0<8bREVO?K5qU)8<&WI7^EaM4x!p*;5`Rtw;?>QS3b& z1(NGr6ydy6+u6FO8intU>Y7x=wo9re%z%YmENIUb-?kTlIXf!t^5aHtZN`Z^-v@JT zgZl=5*c-KHXmH-Xav`3>AqTG>?tl0ooZ5Hh;F!?T@K|Zz(fQ#^;9P?}Fb`V)e8US@ zW9KL4#cxPx8b2u^GRdAeFLkA3m1CaW;^4tt*lGRf^cVAs7UxajJ?#1efPp1YH8P5h zG_cu;B>dV~(5!#O&OM$r1?KXQZYBXQ&;i6UL_O`H!G1L{2weZYxu_s-y4 zQk1MFEfCgsq8M};D0qF;2n|FHb*BBRMQM$d_sS5ps;a9$)SFsy^|bm&{iJ1R&$PAL z1Z|VHU;U`IRCjCpv^tufngL7vhISDsDc3}ehZVg_@hL^+JMuDl5BRzDgfEW2&Odw^ zM<07D>x0zBmgi}Qtu@jvK)T^ia<7D^N$stT)I9TYZk@cAH?+&2vaT49wI1R*A;KuB z*EUPJc9G{Un|GpDb*bL2?%~E=(gK%53^m3_^L!Jn{|2eDC*7P;ppj~(>K96o{TTub6y6{Gh z(=VczXfJHTCy0X|{0t{TLas@_#2566aQWa zzu4;H!4!`oD*L5QpaQ%*c75I6O}%$Dg$K*GJ`fHEYd$&H?qJ%HItQ&GYxidFT^*8q zXzY>Ep@WXTJkjk~UwGK($j}Z)+l1vD^_{MN_Ud`A%-O+b?_cN=I};{$*2lew_m6uJ zzd5;>#Xn`0y(wSNe#kjqSjBJPhYOKnjPtMcr`$>_fNJ0Zv>RyyeV{;Z844Rm|Iqq$ z0=W$!okmLm`6xlI(E{XOSn0KiPSSyZjKsC^KopLi0XTmo%}4>9hC?|Vi^rhTaIe?k zK6n&*hL)flJQopETtBVX2cmgKf25DstHU~;tX0=~YgM%J+6FC7ucF0jv$ZHa6*be3 zYHQWcAV%fa=jau+ZfdqVKsl=f1IGKwMI=Sq0Bt7{sya>xBb>bBul--ED-EamK`MmH zORbyYm$WXiMnZl#)AvVWXZiQlL3vkh9LcMFv*)F+-WBFoJR$v+cEs?{dgFfMdy`o; zV|@Cs^h$2Ym1@p1bInn-DVeK_%13pAv{M?b{E!W)i4><~sf~bHeAia0v8tvu)MZ=% z-sClW5C0`k$W`*2yd^3}R?zme0y#~NkYQv$)Uie+oA4x-w8FPwpZ`K}xCnBf!8)f0 z>iu=M?$PIIm$mKMOmOk4s-M-S$|rfHWJ-PHxpH|aSiCMS7di<3LTUc2FoA!`cM<9c zy@day#X?uxe!iF;TQ2fDm8t4D)WOrx;4YD!v=x-w*{mMEr1#UB%Q5^8XR__BJzm+0 z=MfkBNDS0Q>MOq1-qO140RBzpV2XO&vcv#An9k4RaxW9Wl zdKY^qdHh`eIu|D$w0E;7@(ZQ&!aF%fS(N%9#U6k4`6@FBjYYVs3mmjP=R!PZK*?)Rf%Rh7OlA z+*wo{CS}M?B(@{^$?Kdy-rNeC@W-%<-bK+pAe z+^6NpC!&xKWDQwDPLSSsGkiFKgw(**(N2J@Vt5>0hil>T0M!oxz?$H?=sS7=I!Y3n zg|?#U`eS{x_C@=uSK+k3+IuZe`w4t+uD%y_K||qQKhm3O3)JVpRzBz^aJrJ(0X0|o zrOZ*9$fjIO`Xf1|Q=$m{+*P3~7>t{p@0`^g^=yUH5+PjuU+T})mX=1z8A&4&4#uxc z^ouW%IwAe?&51WwUq658an^p%bzhA4R>nQg95-iVzRr|03T2kbnC#6=FYA5bYv4&S zmeLQjI4Pwox~{)gvC>$}1C8vjT1Fp=5}@a6q+V7quFW#K zk#3~}=}dB+)+1+#gFL0(;rbONDlthvd;r(Lwa{`r2@kc zEnNBC%iJ&B32YrXYLqj5t`>&HsEt3MdD;Rf$d!0adN1EoPv`+SmmR{Vv_cy991YWF zC@cAP4pAtrs^E4WlV7XPnh*9CD32Bpm5Sxr zJ@8I69*xuA;fmOX_hCX7!9{f&dUv~JI@b4a&zD19qGG!?6&S35^`XF`2*kf z-woS%c=@3XVeP};g*`mlCj4^vw&RK6t4>5;$V?fLkeY1e5|>?Easi*Obn$lLhlF4l zv3Qo!Flk%-n1o{%OIlyY72%F}QQoRfQMRZ-TBIHYjrkAqjJ~1YXerj8<&v6EGw;!1 zB#CT>l5`hW!F@s3U}Pc5p~VO$KH8Kvp#=e;JfsgS>Hg#!?vHGslN`eNF?SabY697d zGjSv^xpW}hJ$ zw2z<^dbHYVd!>e)0yf5d`L+C0YA=42UP-&ehvEn!SU4`sc4j(TI91-yInNPjPqBBl z`8eyoREH%O0zxa3S3m~35dnu6h?ww6|4yh_S&_C96^P z>2zPZ>22$4mEPPOOun&#l%t{4ABxpgI)wFQr|Ba)M=wiS(%IxXEa1kZ0zQhz+w811Jut@^cj7_ zrO`*U7N}WuxEdot1+}V)$|bd?T1WYyP$gdJA!~9yc?-z)QzU<}p)gNaC_EHf@!f?u z+X>;V+SAm%&%Keph^$>1e(uWIv0UaL-waQl=dZh~XRD{XJJ1+TPQg!l7BAG=f!Etu z-Kic|zH0@we%gC!ixRKxm)&Zx(7+xp&QlwT2PMJUSj@)C3LSl{HhAyk3I_$+#hhvPOVM92~=x;WZ7syZ5j$xtsXB5imow)9S!ozf>|M#>pW zRN7*T)Aq&_ow?@npF8=k4bK>?IMoei9WFh`+uoPYbt1P=_SCEa89rYTvjr5SW%vp% zPv)}|tR=nA_8N1H{zh4IAr%0QDO`bb&@)fL7F-CQCzXjzzGDG@Cc(5BZ4MvDS!3#< z?_eKHq=9q`9Y9iOaXN}TAWQH@Sj@}uKd`WO1JrW^@md^-!%!>$ODp}Q&VyW3RqLVN zROf<@Jxm>=o>Df0DpFi&AdivOiVc8#j2HV0If6?Za8OxJvC zGTUYaWfk{W>L(` zI*~K*uAT!y?g5g+9}*0#?O%EnXmtSnL{E~ZWD4m9EUqgpLEDnQBo$PleqnTlhz7d^j zBW#fF93Eu0a|as*=vVxd)bo_~9m=TSon+Q4 z7OaIGvQ-)j33scsPpu7iHB$@KerjVurX8b=(AO!=#m>%n+fiEt&z!}?Q(6uAqHxuj z-*+@a)NReWN%(IK^OU%=n8XVk*NaZ+t9C?woit$JAR{yI57G=An^-&_ zZPi=pjrCo~A4Jnr=qxG?_q4nIUS9}X>=1NI)#1JORCR5m`ayjQ6!Q_JC7Q^m<)e}z zWkSTF2iVsq#PVW3VVlrGXviOOMmqhRYn%fdn;jDzTorKr%Ub@V+=68DkklWk7tUrq8U<}BN$QhrD+^>xZtO^}R-x@twX_jpq zh2Q^Ur;KaHNVB0i%4M+cW}eH>Ol4C^9!@4h@OUzZ?gg>qE$cupK@n>}{&KW1xkR#n zLWh%gMCU#sODefMN)V9L2wZ10$UQMaP|!YP9F zF3yO0600QdNZORhCHJ$JR>!KtwWgqwJwij!EzCV7$IvG{jLarK=?*HgV>AM~zlAsm zY?WMq7$-@e3=DE>0!bIM| zWGXu3J9PO@`fekbP_~>6G^!fyjeSOx5o>HUdKx#3Pv&uxxw^1lrqk_py=7-<0lJVJ zAdPVbT%rBoc1RS_3D7g2Aum7$DFS<519`tMollRDkI;|=!6M#7s*wI>Dgvn zGQY9fMp=AQe+r;`jVw-onQ3NkcE57XbB{59vGue(eu?*xp|mlrO*f-Y>Lay;6fgdg ze)FpZCSB7E)laFZdbOd@L!DIfv{RhsulaNznh&n*Kk8s5KpAI0DsEMaC_&bjmJ$F< z!7v5+Fs^3ow?sH>8xE96Ng5SjuQ@*Ori!zfMu9fY(S~^&7aPb+8XEa|GO& z%j6I}$eOY-Mj)GpkAshL5ad?{Bt8KUM~0?v1>QlpsyGlnieV?7u0OzIaYMXI>dZ%*kYyy1=Ft%(i*==eWHG#a9DU7Z(f?q59|H<=mHa~n<3_kWbW8VO zO^ksqasz6ww*`Z)4eEiyP`G|UU#;DMEYxb1ff=z~*(9fN(k0OHGNq1EfS4^b<=Z${ z@uhf)AIIn8S2`~{k{n9_r#m{z*gxCv+Lu{Brp-wGmioh5(^kp)1YGeV&Ywa(b&S^7 zQ#SXz$K~1KJ7;bXLY4daJzPa@W^pKOvbMQO7`s^n3p1)1Q;aU)o!gAVY?iUeIAC%U zT`OH3%zNe+Piaq}`N=Fsud@Ldp=bJQ=!AaZG1QMnLx0FX4YkrFx`wW!IW(Jo1Y%wk zH2!t8J4n|zi2=W7Kx1B=9Ka&vXpZBVcoGQLZS_B>1=PfDdIA)xN06C0p%qZOsGHT< z;5_c()H%>HZ;>LTD6uG?u3ThRZ@-L*+2J{hvkc#?EF-5$_KPe7PM2z*9+J@`t5bR* zS2$iEcTkJqR@xP9B)*^>(HFrtxkYlxZD{0MX+KbP#6xVSfs*EM@y*0PN@Z=2x&so`G_{q;K*gycy^zYt>54!2XqVI?TBLGc`bXKUuGdH4)}Z$; zMr*~x0Q~sn4u{KB@Yj4Nz zMiWsRlHaDOsU#DBhkmd+NKK!hZ$Ap1dut<@9VbQb1(4!j;I_CUkP;c{=WcwTti#bj zNFv}{$C5_)6e)|Tr-wc~1*G98kG<;8K%O{&e+#q&JFm;E;9ZFb8X zU-pKa9@#r`q^#B%V>3dyj6dlU+~?dwjrZzfF;p+Ax5iHa$+~ERw64(6&q7DAKidWA zhHiK@)QV5~VP&}ZuhK|81`^Cw*k1or1!m!%<`eH?UqjDr^R79@Q_a}Lwi;{ARY0Esb zlq*(bTa$Ll*2?atCA3;^^|>d(>60I{`c5UtHFvC;sf zJ4sEtp4@9%vDxlmIX&k%B_S0ap9)E_L`V>lW0_l!5G)?Dr>Kw#sB;e}t_y{Q4 z%W(sgfGZ=QA3!bR)hFs4^`mlC{wU{2U!)@-)z%QR#LuE3jB(y}Se$WucjsbfJS6>> z!Hm=w7*2|GOt$^8W!R3}OWGss9ISoBPY_B#`Z-4Wtk%`%0uPQft9o|1XLw6;=0zox z59X`dhT0y8P3b&yy-~=#V6Jk_bJca1F-sVajqa?oG0auVUBm2T=CMM(fh5)%<0=@Dep}%5emyDXeC%#G^*&Sn^rq_(2%!#_woA^H{ zI0_qSwqlPVg4TpmtpI+{!ClV}s?2IF1QL8x)W=#^J)I2I{{Y>Lf%ntKZOhp0nPMzv z!RB^a$LPfhm=9<#x)=!L16%=Qgu=|<{K;ygg5rM=)G_oWxH;U+%J?f7_B&`%9ID*q z@5%w%C`dlGP=?6=@VVj)xs-H88>oHOxZdzrxmp6iB*kTLM|6hY=)A6fQI`lU`Ie5V zR@vFgk;WIX4Hy0RH@1V0n-1044`67P_)M#Zn*q~13y4t%bdAkyCi!F(q}xDPO=Ek3 z5hFmAD}WkLNITk-mBM*A5PH67uzWWF2>&7pG>n6W2+`K)HK~Ad@kvq{x}P-Av*BS- zbPaimmywdtJl3WPZD-`LU+j&Mk6mC(jDoN(qSz0}NWocCECHxzA25~gk?Z6XdWsIh zg8l@W?@zpd94AeHVW#4}0BQXpwvY)FFXCNW6U*TRuLa(dzPTB{7>oQ`55W?4T zHgP6G2sx1-$cH&O$7?6d>Ns~gt~i1qW}n~j)cK4bCma!1!4S#?7^jk9bTLRPjxLjW z#voT6x9;}$cA$CcXen3-ab_vc-N@6yDB&{A39bZJF;`vVhq25EGR~V@T-!MFrMcO> zWvpbw3D1hs8}tH@?TxT@2O87ZUlv9#poLJ+|B{N(RBVT~VmBKEG-L@Fv<1jPxQw5P zhBN4B8bb1DCE5c@)>L9AFbz$jKE(3P5&gFf(`Q(_uk7G#;e^<3enYDcZ*TL!FCfL+Iu==$r)6cNxmjJ*nq%T-0dW)DK%Kjvm zX&C?Xp)jQY3*h}L(2K~|y@$wmAgWx%yb=ipK`U~ZPm4noz7CEG#S zn+niy4)neNnn7>U1Uehk{lDtx!CtQgIo4L7c@6~edY%4M zU#A^ZdF3$}*?sueNnJ+TxX4S}=?HlcDn#r~D1^8wH z2i|11cHK0IE6l8DOf*WGZf`}`ZTC;tXV*k`J2H@zW$$TmwhS~|ro9BdCxI(W@e$U6 z>@l90fkrB6%-&=yNgwKaYhD6DI~N6`)hL4vba{-*=GOER^e?+ZJE?=@GICROwmuQW z+M#F_2efh|^&^XjAG8sH|Fc#}ZKJ>Pxx29E;fQ)dly&5D(ItG zv<-fN2FgR#9`abnTp`f$UFyI`@>5|dx|PGKj3;$L1^t8)0GuDOrR+K5$RH@~;ZQYR zK+@7hGk{d*u&eAPP>nTUF2>WM^dIVH95U*&ZlH|pXJ3q^MrBqL{hI_K<*h0o<*UN}y8@&}OUC z)S^lsz=V zAQ)!vo3dT&aSKySxFhQeH%0W$v&HLFMUjUPY27=})*Ql$fi!0gJ08en*;$R8@$MsgEyzqT4Al;L@yh}@08Byf(U&d*{?JP_(xU2UoCM+y-;J4$(I zxgU}q@a=ZcBKS1^0an&?0&I``Wv$p~HikY0J`qkhHieF%1<@VS1NOrmV2B;rYk0Ln zxx;KQYYA)956m(|yMagHhDP%?2(gc72pdm-kk`;EhCtfk4E@4_jr@#fo!Cs{xq-}z zW>vF;(UEl}44`wOYK8z>6`8#XoxmS#6|wfV+1!t}c9;zE#;>qko1TRZ<+khPv`GR|ZF z8oi9|?2);Rh8eTnJ>A?M_i)#2K=JeJp%HF|vze?tP|{dXJqoE^opY1{xD9wURmgp| z$9QB&pl&x~@C1{@L1Dpd%1$|@;C^g0L$}V-F@{SW5DgkIC zb^sX|MXS(G5F+bAFaYaL))W|B9hHYppeLOU9h(&(WCjGMs{+3}2xYkp3j#{f8HGZE z@(b-pRq#ef06Ts`5=lIJMsG8Ytq1w8FEseqNG;NaErXES6E>MP!56???*<+_7X&DO zf<9mySR9)J7~U9o3QzabLa?Y{HwQH^@ z<-1iu(I7LerlwiaMVLT?TuWT7Tz;-5u0gKuF2D#@)wL6U)z3lLmg;RtVW^=^Xm6SU zvera4*yI`;PoOXJ8gJQ5x_}sf1*eTP0Fd+0lw-1jHJ}(EqY~(!=OB{$1kz1=;oVM$ zkL~C-I)e?=6!{?m&D6hwHgHt;qCsFxJ=G_m**M22Y?Sr9%Q~6WID3EA)$IJ))3T@M zjLhDZ*&*XnW_VV1b_p({iSL@r3r%4QcU5mzdVn{>{lI+Z+30HOT54AGRCo7tC#G-D z?2*3BWqKzXUC~*(Oh1S>kqo1Vk?Y!FesQ002Y7dRS3|G-9%s6jdVhHvdTqvJehuA^ z1Moa;mEHUKc&Pr+54pPe#) zTD~sN)_>7jky4 zvaHX?2vE_5en4967_>JNKoi~w?%!|PQtGGo#;eIOTAG6vaUZP-|Me$%Pdftjj%P*K zN+!Y=4ly4lA-(9bYqR-Ft?gB%^RGV-+W`tF{it% zZjHpKE%-f)6UE78R;eXw~J(mAX*gOm;3&7$Dij03jC zZ3B<)0E9uJfEJ#|T_F+z2|n}%5nKr+Lj_BO&uZ(N(R$Pl&BFyrby}HujBf5`>Alk9 ze7TuMc2v%S+^V@nvxa3}%J`6ZHcQPK?K_m!)Hm7v*EP!1-IeXi^R)96F?+Zz=^wls zJYnwP-U=C7R?Cb`-vcgvxbKW-9*cuTl?t*`CW~_oboraB+(%po-Jw3-t$Uwo4QXon zGdJ;sy29*9`ftd(--3+aRr!CzHYGHtF2bD0WqmJrDE+lBdQDwG>rfP!c>WNx?+5g3 zKe<9zk*C6K=OF&QTuaSBUCd!dw7Js7} z?KdpxgRBmFz?MLh=LZY1J$;LPprGCa*y_ZQ_V_Z}V)SIcj5%zPG1<5Te$7+XoTjqv z&f>N!z8Vx4Yeu#<; zRoAN_>UJ#xCZnHe1Ju6iQ}u&>6B@0uP{B{4$sn;9qzAqXdD*wr2dLT87z={TVq=i` z$yM4l5jJOfid_p=Kl)67S)&4yK>E!x(Q&FrtlOU_*6fG2rXG2fK9#0QNM{ zw0XF0188$d_{M^BJ_yxibn}60kte^m zDNqlux3GIV{P}5mjr5P{H@(dB2-J}^Y%=)fA7IbiXWh(4##D2cxx`8DqZm}Zt9^l>y&_cgM z$*v;*5>)-S!YS93i7GcyQREroIDS2vLacZTJ_y-_C{~-)|pi{ z+8P}VpV7|fV;llyAkS#Uz8TNV>CnlBLYOKT0+8md!%$gy00bSQ)IAN z%}v2SYi6!%CHe|Oz8o0==xLzZaVHcd0!%rmVf=8T8%<))bJjaJ5LQUbqx#&-#OkUyt?#t<;X+LmB-JBK2!B9kL?^l&@t(2f7vwZS`By3gQWK zAh`OHOr)#XIF^jx>W_fpRWshWobLRd^z=8raBn?ul?wQ#dY^i@P;Y>zrYFi9=K1ES z=DNoadtCS+0)4U~>m1q3ERcG*$LbhA%_Jk< zI1AOIgHlNtlJrHr=o#+Xk~u}%ZS5s%$i-Hfk4&FY3NOP`Yq@=?{RoD zx(RvAK*ZrLkpGzs4#;na4jd+DglW$4&M(44y{UQH6$n08cVMo+p?SW?`mqpt7mD;- z+8Yq^GaO#*iAT? zfjI}v(ayn$Q41KL+5lzvJW-)&)PdQ)creqCf+jQsrhJJTy>)lX(eH}329Ml*H=vp)fk|bYnH10}LVRw9juDUmk0-m)Mevp4y zTUL-Qp>fp0#u?E6Uxsq?i9Mmoz<^%ULlC4Z51XVQ#Bxi6C-h5QASMZ)h58U3c?zvp z4|i4fd~>7u*1gVLZKNBoOwKjdSOt9Mq-&JPnWM}Av#>eD+-;6GhZ_6Mwq`Lyfz@6d z7J9r<2#~fGnT%fO&qyJ5jy2*~N4y(B1RZjjHT4RBbpPORT9s8~lK=yrz~x^6>Bn%8 zmJ+E7jd&j1H#m)#E`+c`3K>S-YzPzBFP8;|(fnNt+=txnJT`AFPf@d!ndy#p*EdT; z0WO3V63w2O^5SIN&5xqHT1jChgNm)1t zW3KYY5t`;psiF1D*x=ga$#FgO%uL_n&F>irxq%1fE=Yl2(7OVl8~{KWt9J!q@)vAd z6SDN1(I_}>gVItUTWqq6{$s_f!8-QArcB_NFw(%s#mba%smba!`d@6PPZ-0nMD zNJ)1i-O}Or<9qf&5#4p>&Ku|a>)3a#q4sI_N4Thw zbxtqN`?LBTN{prMGWK*hFJZSc926`yU)>OtpP=Nf?)2bCPKNV&gV4T+Q=f;6%ExI6 zF#VJES*@cz#eQL08LS*o5;^R?VCOM>X!pJoG}PDIz`gULidteVXK636EDybEFRMRi zd|L3Ym7re*!M!e+cg=~$O5pQ<%%W5*dk7_|Y(^T(^>yZVS(VRhYE1%8n`SqM@7NA( zDOnw@-)LP&@)T=>p@-S0c`9cC7A@%7x~H z6j08^?i`-pDwbw7vjkd)w%j2nt(p2idUmUVv5GXHiU@pm8Rv`?Q>3YXj0C}87i7g* z*Vq2t!#7Sr@puHbE5cr(T{cR<-@SBlQH)M?Ja#4A442Fu-@n7Xo6y$&$?4>D-1wO-iIqGqtxf4*>ClefAc6sP$%DzbNQpxKio1fo@30O)T{e3$J5CHAE%>V8$>CQ zVqJ5hIG*#teD!k_c5)qOh11d*$y$Glq;wiaq;ZJvO2L7f_CF}8H`{+3(Pl$lZn%9H zOvnuta38s%vk+9Fr0WTlah^Dy)y@!SCMSM(aIY-Ra8B#hZf!8_HT>92#$0o?o|f>8 zCHTJ9n$^L`U$TWx*&-)JPkW4$l_Iq^FLn(kh4qGRrdZXjD&`h&f_LbDn(@0@$gbke zsvyOFQ>Ee7^blKNG{$I~lkU3T`_-Dxw@C(cU@OPt}l z)D}D3g3j5{kbti?r9wm8$9&5&H0vom zhiz=Jv0OY=jZ>V5eqE!`YK=NdGsa`cc*1#Un5JEo|Mn4m)G~Iuf^_|7Ycg7g@79G# zH_ED@mD4NHL7g@B=usf#7mXR}8Eu-8#wg~|Porw6V9qmUfqVJ%vvPzGD|M46DRt32 zK9|SJZRKN1C*_&4SuLQ3sY~E&5kG_bAINC&5 zk=!a_Rf3beH}UeZ_Mtas2`8kTK*qcdfIB^G(NEMHx%Fwr7SmG%Jx@9A^~+W@-pR-B zI!5~5ea1yIs}-h{5f*5_8F^tYN&_&5nNzGHl%gu0VS^fBJLK~eH>ZPL2UX)9t%}vz z+-;39ma8|3n#iu6RTGdJy#SnO&gGkEJ*HJ#&$)-jl;gV)M|7CSI_eyzB;Ia6b=ErZ zcs5G7nVnMf>dE#tG#U%7Y_MLN%^;XX1ZLxToO&niwoXR7mD$2}oLz36gkhnlp*HR_ z#G02~FJIdz+d8`?oLAIItHDSPqlPMGod7AAfq8!ca7}SNJs|8hC@jw~Ew5F>wyEAD z?0xpHXua;6;Z{L2!U*VtjH(E)GwGx7GF-zMnaDDHgbPwfj`O=Y-PmMiuu@y&4MT5X zCY!1C)yfTZiniV?Z4W|ETh^S1{iZpY2a`B8L_3FhiYT5o)^6j1u^#+v3=;i)9*&e> zECHl;F4nVWW;LwAmy8Z5y&D=Q;Xc~x*H~yxX*2yi@N&kl_JgD=ZWFX09h^9~q5Bmd z+)DAJ)P=`c*eGSC3XO7~B}`Au;Er<7g+{uW31T&AxY~x=yMx?HZgJ-k^}=!3#u|FS z>}`5#S~bkM1j&rk%NRNJjV!_hf_Dm0TCc*{ImIrCU*Q1%bi{rDJvGAGV;6DK+gqHF z+t#?OoR%&N4b`C#>bv0kr^}{R54%MtEry_qxxnu|zyVFn`B|mmLb~`gQh8FcDxxL& zPZH4D?UWyT)FN7Ktt#o2=?Iu?uY6EjQ%XeY9kkPWCH0P!)z`#-IO->Fm7|ZOL!mi( zeX+NB$6RFL-W0AVyHv&Kt$#(nLc{_mfKK+wNW(Er^Cio9AT;Yks~XVkL_9wO%_sUd zu3)d86da|cvx*^K|Jn8k#Hj3sY-{eUXUG5RTm@WP3MJc}T9_YU?AF)XURL~cJ}=A6 zuB|rOT20_{np#~z|DHJ2?E}UgEElP)Unwd-*k{c=R%>eKfD_|1wDHO#+`HmbaL$5% z3_`-R9ZYbtwb05A(bvc7=m9{zMpxQ^YvH(?6_&D^`IZawkTW*4j54!4%}BdY1~=NV z-8Rk?Fz;J@>Sf)EwwF)u4tL*cqZv0y7YeTx$W~Suqx5IS6m>2;e51Jwx#eL!lfF-z zz-6{k`y2B1uJ%UHVPw+&(<*88b8MBdK`}LQ` zYzXINh|a5+`>{UjW1yQ>!hFU&$o#oZey_!_&>p()N@(9Fd` z+0ZFFMyjfX>y_npW_mY?!gQ%K*W2VXC+y$Jy#kpZo z)Lu6_kfQY2D2;?Q+E$F^)=;Yv02RFt;MNNBjWym{VtTflCy`V{q2t+WUvfHu?Qb&H z6Q*)W@oGnv1#(yMmb?PdNCEYR+E;s^mK2XEJLCxEn10*Lqt%dy3m4^PlAmO(P4c7Q zBVmm=TiOA)@mwt@*Kr95(xfa{n1 z=Y`G6E2E`#POm7ul}iGbmdEdq3y8g^k%ad{1QrlQ$ zN=Cf#TyBqFZis!$7-hG2PPsvzV6>N&j*lAB5T&sqw1DKVjuvp&vGWgPNQIDAk+| zJ1+BK9b}7FSPYmEyVq=j2EE{{JVpsV5f0!dZV=- zbe)2c*<;iLFilA;7dqfhN$@~2oKDP;a0Gy)rn||_=x#x|xR3^=fgQ{COQ2HdZnguE zJ_V>y%rT95^f4p2SRc_vHRW>d4o6(ZSOP=z6JFyt|)lpAT0oua zlrmNh*Lo}MWY2naq1HhyBf3fksh*TdI4IvS4p6PP(uT{G15reB*A*HISA^?Q8l|Gz zPg*Os5@LiRVr8{70TltQkDgY2tEJWqt$v(w=yb#n5z8ZvMD>ue8Mjb@jHJeq<(IJD zm60%g`7Yyu>fekzzAHH!%dPev`uqXViFB;56XKnnu^*LtJxyI~EnEE+Z0`I&8+4AA_>K4;~&+Ofy$kS%f5NXK6K zheItprk0-IAbr7$_d6z@(T1Amxtzr;47An=WjNnP z8;?;)_97u+xph##V3l#Qg<9Fou-mod@IGqww#Om4yzk`auSIOoAwHA?oR(Wn*;)zJ z@Y(8S-^VZJ`A$VZ&xB0dEU%{+Cp<rR`Ncd(>|HM_btwtGitW-Ap)Dbympt3g}{f2ecUMlmidC;IU8OLT}EaIsvsRBvc07ZV7>|SU=i@ zQ9u4bvz);^jlw~|8TS_&$NP46YX%(Gb`F(c_8h}h_9?csM<^@YP<9ik9Hsq-J5X2i z$c{8o=_o&xONwXZy4oJCwJ}hd>ct37XM3bhN(Mnb2%%G}5bKJt_7cI~%plXeX1s$?ao4F+5bOR5EA5 zr%SWC!?;GP+A^w*_NZ9XnMduZ^gn%^(;xz0oeMyZv*1Z5*n8=5CxP}2H&Xx_mJvL8 z0JdkSts^-MntdrduEB%n)$&tAtk!h%0yJlTH_7qZ6y^3IR=_l8qVtoR-s64@WeqiO z@;MWnwfK_$Fq4Sk*r!XzLJs2_=6p8fStEgP(I>_cW32uLc02?9{WASMsNZiq_$%f| zV;a=_8a~dYRGYJNfH?`jbPJ-GJ`>GVSN9Ck zv*@xp1le&LBnZE-t-hGMwZYyN{uAzy=ymbOlV;ofokR8ry}FbUoNT<>o^Yxa+6Uvl z{eS|k9z^2>w<)C60V=%WKof0wlD5;$P9}ijnL8@9CG->W)+jVkWvCp#7_NE5@EOaw zWqO%MJU~Hn?Q&KMr0XBJ^xqn{QLaUCWn{rRwN{=g?T}-YF3J>jBB{Q;<=nEYF41?v z6&}*tskzB~+cln+ECn`j7Av9=mBV77xAx{;x1JNA>dj>fSS;Fe8kR#fG0EBw z%Q}+EH_9wd>TX8i52dNcYVNXd989vt6R@pWbod^lsZqerph@VQy4$TdD1KwPjI{DW z#V@xt3XPI@qSuiLd5OlV2wN{Nmu@F;z|&SSBLPKW6*_?NNY4fLhSS8kFP}c%IG|tD#?#Erhgn#Fm$sqx ziduJ}IV5(zuu-0WD2LRO!r|51G-r3w5lv{M&ite9`tfqEKdA98!S zYu&1D6X%%o&@JsM?qO6SBSAxVL(?kmRCkZl3&L@cv))YuDi*14gZ=u#eKCfnmRixy zU}ZA55jZiyC}(^_;65H4rL1;XIwE8HDbJ&7RGNnxn`R%R=iW@tHtH<%42TEXSiW& z2gVDvG~HQ9J@84XgAn0&Z87|BK3-l2i0bxutus)JP6TQ4R7Yfdh<8%iT1MB_6Cl+= zX8wbD4&`sWwGcS16}MG0ezmcqxZ6W^Q>ue8q{b|>vYBhRx}MlY^d#Y?m>+tsiLvixuZOx%5HmSxZQ@Byj4~M zsKo`&N>m;fL3s;s7^NZepuOp}%TU!_MTE4_z6*9&%k70J^A0R$DPGbmXA)g~6YHC0 z(i?~DaOjuC&RWj7d-S_ct&jZtwtz4roaMkSeXIz#B!~GsXNq0W_H?$NA}x6cj?sok zbOZ(0cXrbU&$j}oB@ZOr3R5*x*{Pj8a5q0ttZxKP{>Z(*lJu`m^n8UldixWtdyEx+ z%E+&Wv`1j3MfEZyL;s+Cz$5ia4>xid1@+1N_jUDjxN2_djfnXFsyFlK#mS|d&s94> zdk<(d4thPkZo`QErwN27{i-+Ccj+tjMsW3q$vJ(7sCcrG&ALun-ZJ~75$;Tg9xhf6 z8|3eu@WFlQBmmFtiN5SVIiG(R_g#lZ|F>x43wJx|_C9dN=W;T6=6-jsaJ-6dAW{OK(ncK|*AVMdNeflMu z>ow#9+r*Fz)ki6%m31t&{-_DOs;t>`z5g2b%)J!tbD*oYSmU@6Uy6-{y~4dA3Q@EkpnkOkSMjJnQCy6E8bkkT+mva`6eq15L9MYnL%uu2~ysI=(QZ&Kx0&UkZmonln`ViighTD$!4u2d$J|n2 zhYhSGGo)WPJ-SddO{0y++3;2xURL@4P&{%4=)JB9J0A^@RZL^1W^31r0FYLHAmrTQO zD5)e$@Eq8!bh8_)WIcb{32Gq`v}c7`MwNo|#QfqUA#dPKphYlN_$YNEp5w7NSnMpd z6Gj9}1RgSwG2Z($&{dq`e;p{IZg5}OyYRp3ZR9gb4Y{9ml5ohc%0zu6VywK>w#(>c z3Xoh>6)@=&Tz4XoYsrr3R&);YDGowpw8?owX`R&$bAEQVx~b@tU!eZ1!!cZsBJLau z@3FZK?f6?gqp`}UW~K$27)$4W!h9aM5salw%c^;L%af@4{<8v3dPFtPoc!RG$x4b` zjO@STS{|_d+4fpT2T)#3+gaUS?=(iezJ-e6SAsc1#&h)kkGT7r*;C0i{RKqWbf&<7 zcB7STV2?FlpdNfchUNW;PPFsYb|B!B?5*x;cc>?{En#><4=&oBc8t};dF&SF zu_MW&5TEQ;cH*45&Q9)xo9y82Jb^R_O@>h?-*GnaXFDmxB6$WGkg2ZHc_f}g2wKPy`%ERTMvPWs8 z)>8Me%CG4SF{d6z$bTLjJT)(8h+Q#gL>8BQ!Eeqw%{6m#FKpE7dbDL~E@e}ogIrT> zsZUiC)xK(3#Z@%*f}Us$vzFU+-D^~UQ=D1Qu?9wq7Zlq0Sl9iCo)`(!RS#BQA#Ab? zjaD+E)%G}ir*IOw6tJmCQf|zRPz~%PHJHK#Fw-Em^z)>sPST$mT};mptZB#aBAr`8 zgK>%ofy`{CetcU^VkiA%n(h@hiI>DwVtR22xm~%$Fh=WClBx)ggN=ea{0)3V=RqTSaR%xuA?&pLj2^mAX6S{?7hCWkM_i^6aFsIxp`|w8w-B#3-i2%ZW zl=RCzIJ_oOa8|UQ^CNE)Ix-q*eQv8P73(@M{3L5C#Nth0=MKDp27Fj|jHy6LWvPSr z64^MIw2*}y#kpB@Hke-tb&%p$Om&TFsA-k=$|toA0cLYaPR$^_S4%_0bvD-Mo3tz1 zk7{E&D$iq46MiP!_?jfjtx2x?j|97re1ef$x-?UIC(XtenJf=hu2N)HQ7;3UL>r5Y z@%l%jG7q}4Ms$3vq?#~AMW7-N8wGLFJ=0oi+2j^NVR5Z8SkH*mEHCK*<<%6mqn@PY z)=OA%D5|PE{hekWf@X&EHPESzq@Ww2z>6TueggGKvT8!5`Z#EIP#JbHuNx6&KckA# z1H7jM2%pBWT$gs@2(8EnV-kq|b8Q4rep2qCmq*FHbUmB(q6QWg(540Cdi!v8;q@Ast}?f<99(j_+$05L9a>V7*gk zpnIvN)S_uRq?}cE5*%WQ|1fULmd;8U32oV^mDN_07SlrU$a|Uh+KA{}$6!`vVvz zS&q`)XruJQdPB@(dQEWoAIR}N84>?@)#40-bQ+CQz~t7accd}+DE+v%Ec{u zZ^lOz!OQxyI#7*Ah%s4jLr?ITsKRI3YIH1_$wlfzsTQeUQ+`pFss)u};xM_Y)Qs^m zMWv1$*8{~~%m`Q^+!5{s@B4p@yW~$7JJQ$DKR@^^a#Gm+Bc|W;N=jga-V1fFejdB< zC>l_g;=?355nBcS{2rZ3A)JA`&^v5%#sI=uZeDjCNM>Fq#_dQoFaxRm@Ag>=&(DZ$ zXA)l5o&vNg?0*BRuJI!b+8*@6W$CPQ06?{b5j@5-YH58FFUfm6#76vs>oYSQTsF6o zbx|9tr!vMU=adw^F~!GbtFqhE`p@>+YwSqFMCaSsoTVp19nXW1?r$#(h11z(qZwOi zbg}c|a52n*+BYt=r$8E0>@x^59>AerC+(sHwyi#)$!cWg#R~dAL}&LLlWu6Ivb}&MMl6VsIJH@pSct2R~_!fTl@9 z?^w&YMqF7%EnJ(akJByvKY)tk`cfLZU8KImX%*FFq+VrJ{aQP;)m4<5@=cF22z+Z7 zNA4N9sPu)=N!b{))LN0H@K%n54^)Nnu? zA}$pk(<%0duN*Tc?tRR|_>97aVCBg7NB#;6i+?JfSC*@zITJ@2C%H9(#$`gtOH=vW z1f!-;-n-wH%%R3^)+mh}(K zR)kqhpJ-;beuk2)3MG}2F)IFkd*AoEsdvYpDKJcdB#A+6ZVh88yjzoSy=Ay!5o$<<4-Q zJN0deDw5Jj zv7A#1$cyAu@>F>ik>(GiI^;j+BPK_@AgmFN1kW>{Fb8vb$^?f8YcSz8eK1cT!vD%& z)t@zxH4sm+**jPyxIN$zh6Qg5wS;xS-_0>$bHgLdSap-JMIT`fqMvO@@cLYRKIddl z<|JIx6zcrUY7ON89Mg4lBn^!kY|_01{;Yx-#2H!`z4tl%T_x#&gGkGtS%0JRIYyJ+ zle?-vUKl?@`=D_PoAMkzLhq~J(5_NYOhLuG5*KHEfSb1300t3^Q9k0Fs6bNcO0^|o zr6TG9WvrSOA4OI*le%3^(W1HHb}J!iWuRQ(y0~3vC0Fstg?ThZ#GFD4;fh#CSRv#U zjtBGmj>OE4nc?jaKUZ84h>Y78OcQ;}n?u~G)I?CShEC=M@4^eOWl;%DgwqHaB3hw* zs3I2;RdpH1V+tkaEN2mHa)iBu!ZiX4?=r>8Hv6i%6sEl`Iifo)&s~&i1xRqKrbif4 z0ig5QYq-I0BCxJWuyPUmI^|fne$&b-j1T^$ZBz^6>CE8hR5>+`P3YLF8WtDVas3X6 z_*MH`+!wKmdYn^#0zYj6B+MC*qkqW>nQ8Xb$q?h-8-rLSojDs?ex&}3NAIC`MP_%7 z8hEbLiV&@{R6{-K@)|f*0biF9mNCu!n6MR?dJo3bEvVPh;t70-L3yA%*Nt=I@dvJU zZa62A?i~fZiUL3E=ggy^83*NX5ih|K6tPXM+sIeCT3kU!exBeQNXwdtH#{@Yc>Dw| zooJlVzZlK%YULyY_#gF-Rv!sTU;VY-i<2vhT330;q`NKDvK}S(cle3mvdhp6gGkR1 z0dbeeX&K8~Ogbew7_@(*s{9dGbYYTI4`NZ@E))xH2qqG1)`7u%z5EXY6#@Z<9PaQ0 z1b;t&xbHfXy%)vZ_80d>ISEJJ#C5;{URX^+Fc=HP@SgtmuC)?zN-wPqUhsQHMNn{2 zdy2`hi(53YP^c}XrQg|`STfYt73q&V6SeXIU`wJ~+6PDM0e=2qwk3>Zidli*WoHmc zd8%Yj6JskG-ah0oPf0WXi~A`Jzs3>An3XXid({eRN#(XupW`ubMio%POoT`^j?E-na~!QtXjC9~9CIv^|*>jf_dmjwP6S_fYVe|dMso+bTi zbYNkig;>mY$yYC`mdE>En53Sdia(4rCKDKbG969=BV%d-9&X~az6KFn!JftC`x`=x z+H`{(>{zQG^6K#zm)01+8;O8c3UhJJ8?}vBRu{tQ>d|g3HJ3v=oS;ki1@!kWU>jaS z@B$q_KyAASOWq5);~5x~<(5FMN8#`Ou;#;CZD(stB>m$!3ZQk?db_DQB;csUm2xCE zb~T@Jw^cUVLoNjEl6r#eV#FwIWS8TVXZj-RqB0Wx*iqlIJ#$-!LiqslqRpqei(_&h z6-7N7`6r>mIDw`lI0=6yZ1jYFbtc;9?3uXHnqnsS%xS&G{m0#oonR^nH`g#w73P~- zJK1qJ6+>)op^Kl5QMbQc7S;Gk(rx;|Z`L+z>F@Ep-RE7MWrotv(A2rj_2$nU;JNg{ z+CwVI#%d2O7mlKO55yc+WF`+u{5_#SC>NM6>rjlx8pB|a z1|wF^hK|sq_tj4GwGMek1$8&udZM~a9jGKJUz9b<6(t(x#dB63DPNQiGS6;;JY7zf z<5}mWAe^qyQv9KhP<_%$v`yz3Ez^Ne)e+KtI^tSlIpLC!Nhrdw-Kl=TUnqDwxL?eu zT-CRFJ+Z}NC;D;*qad%g=?jhQw5MO-5jTQ=G$%2Co>9;22CboRarba$cp#l~an~>8 z+W7#-Q4zfE3IMBL?{D;{0Q+pLWirTO*jveX51D+Afg~rv2QNXyKewNL7nY(4u<-$$ zKhl76{s|La{52Rsvlu~x72j9znHDn^=2}{ zQiw!%vpX>qVCfEbCWfjfGzj^S?9FktP&fB&sEd0O++(A=)4fjeQ3Y7TYe0H_yaQ!D z_9u)dVVuzpF7}DIQhvkBke3ADZ=jx+v5KrCk}}CyhW;TF#a3^c?NWvgjq)#jB2Y8c z<59I46TYH!ul^$=I3v_|^b`-7o!kkv@H4Hu`az8&?YTYUHb%;Rr5wQB6lD>4synH= zJ?9vRrOF%R-bw?;Vx|)%@jXh2^g^}ZJE1V6Vuu9(W#C-@U{tVdV4MFJ-xY6i+@-iO zG52Ci_&`7RfkSXa-^5*0rDaAv(t!!EkD?LchXk(_n$M~HF;}#0ZP5NcS z0D`VVQ_)UoiN~eeG>nbJGvfH*a$&46N(w1^m~%N?t|O1a zI#))#@7)kRJf^a@x?J8UPpcY(8+aelJ0@W?%~1_iFcup@e!mk%Tvq!S#*_tIS9#6D zrp|S{iy>C?^a3dAwpnSAGVCyZ1;%=8*3lES1s-*?7HQltr{Lm#glV8J{7gkA)ZRer z(u}zc!;qkTTPj~9AU;GD7nO8T80p%06y0+#3hZ%HKDdKw?B zLFNo_qnwDBVv%!}0wLLWlD^QP*<*a|E_i_AUzo%sIy>d`f@a6t(rL%V#Z?zo8 zVWjqT5Tgig33qB}CANVMw&=VCsveYZCt*y;4*e1;9_ofxJ|`UJ8+R9lNPlG9Wl*`! zcA5iFuVx`X!+O3Q`e6WVXl=4WpR)O`Q{ME!tdPojV^=mMYm^7!NPeq?d74i;3bE}3 zVlljg&+TL!K`92OoM*%JM6cdXizU1K(f1LY$cvAFcAQe*s;9w;$C2!QSN)lxg|(HV zoNZyCek0^V@_Ur?4VWPGi7^iI#H&&vakB8Y@I_cGOcZtmqXRF3g#t>zQ^(&i{%_x0 zU(2{zapBAYTk88Ouqmdux(P+j_FOt$r zsYyo3OYlZ9xi143SCQ=O71PLhzjwsasDJ@j^I94sL<`l$SJEi0IG8|grf1g_dMVYl zHvXN#LB1=|p8LV9>I9(F)|4B9zJ>N6#9}*#==?56PiM62<*kocrAB{`ks(t4qPZ1m z&L74A{(Zps%_@S4YzjzlK~kh=P{NeeUV!VjGB&V=nvkB916-skL2dcWNb1X@)&i9B ztIYi9Dz8x=xApKyrlQU4udUbL5FDHrM(-2|{t*%pE`nW{)O%NL4YMsizeQ$ky({6Ht+ea9qqY`HL@quO8*TV9iecKnWMo}2vYRhid>g3- zkS{x@$Okxzh(QR6Ay3E9poA3!#t5MmWZ8U1EdMQ33$$_)p1y*Z2o5>}FsEa(Z#1y=QB!o98M6QTATtrQJJbF zD5I1$(j|)RYY6FgiA@eWU*mB}&y*B#4y8u)oIY28-PiK^gUBROsqI)CEm#1pos4uIOqS`3-z5hEe7m>oHWM=uM2oHs2k$+WsNfXHi+9;h@`dHQMQ}RA}x%yJ6E%oxZ zktPHJanV90c_y`SSA+@W^^Pb8{xnMh%>0FRwi9zux)_;2LyBQf@|e`QCf)lty`a9r zc!-{(EP8hhBG!lPq!L1rnr0@($ga|6=~ECY?;+*9INrX2AV8ZCAyx(TT4a`@W+*^L zI;wdPju_M)JpggXXj|kS!BfG>ilY`Hw4|z)i-fFu40ZS&7HBVO`wAXb^gZa6%S2B; zp*(5|i1YwAD6^Rn71u%{R)Kk_O(EeHsE5_c!S=zLN(K8Ha^srjX%^r;rz(QFF?hpD za0oAOySVd1(=eef3zc$Tx^La%?mPDZNf|vt7cj4`bqnK-naHy4;g-U-Thj4trm5(G z9Po>i8pGI2+QrF~*z+LGyCA}B!_hpP+bj=3doyV)24NrG3U@ECvKP}tri0na#P6?= z6w=G6qLX!vHu}6?k_h)V+DOK5PS<8@i!}zJLz7%hq_ma0~Ti>y?9Dhe?0k}MvqIoolHuqRWEdl4>0?Xgh z%YgL!$HY`oS*CVV$0{e37)7U`K1PPxcyJ!S)RF+Jp;BL|tMF9l0<_ZsPNf0WMFiJ( zHu!RmoZ9&tXBsQJNGuyZPk)hgmgIfD^vXEWO|&8WB1L@p!#6u9ae7PB~5 zMH(i5G14%4>UUt(afr`H!hqeUW9)#S`n(~-1)fC-mXR-ozV98w*$x`7q3S;wUnx^| zu-1wj$HmcjPsc&94q2B}TheH5@Nabx*Wbxe2bplHa5 zk14^e%TjeiqeJ%-s$sCsOCIjep~;~%l+_>HuQ249kJeDKE6Ai|s{}NS* zNR4gTnNXUf<84);{km?w2RZlTLih9tBzrn#(oED0kErcDFaRqkw*73%fKeKtAQ#%L zTb$ZI>h+oB7Sc-N=oqR+615n^aa}+yqz+SdDT|enN>};5B2Z>#P*W?Z<=Dq#2`39CcXrRZO2VYXyoqz12MN6s z_7bV8%5zLl`l%Fy%gnx+P{F)_h6&H#1gRg^q0=xZ&|H$`b*kHckd$E_C z9+LH`QdsFuCh}PIggFrzUkhzIUE>mQvRcSV(f5lU?X=<->iGu-Gy5*ZER^$kgqXl% zsS%)Jy!I7s?=m9?>fWkAGKZP%`Y%ZM7@)@f`Xykh3Kofh41lu?EN zmjz6-9t@Ip28m@glSP|!SKk9aB9vx2Ks(;rZ4qvH8n8?R+Tn$}P^^-snEzHtQf0WqWq4UWO* zrAD-Q+1P;=0wX7GkCXbJTD+MH+olavVNwnBggeNKW9%l&aRdUs0i3u$I_UeaI(6Of zkQo{QnN-H@&#FEcdO*?rE9-ifJHV~%E^_l@$-RocsUs4#GtPXcoihgXdj?8~l618T z$j4qww$mA)#cv?{>+n-g#H!eZT#%qul%XB(KnIHPj{l?!xIixuW*jnVqpwKTJr|gJ zUl5ULn5GjFl3pvVHJ}7ppk`OQtBMj$zSBFt&e91Oy>m=17{K}CspFr#O;Yb>oZ7Z zCVPQij%9Q}9WP7|T!>BZ&Vn^5ht)8s>8Lp z%)pFBjPVg?TsOTRLWOGjcR|uy(xlq!5!y-ozg(Yr8MV*{Kkrvyhlbi$*0DuTaFn)j z2O0ZLFYU)V)j0fY4hZ1B5m+%Pu{#QY-dm^T;4H$Wb zSjkVsGWKcg%g}U3jdaW;T*O4xx-_V`el~gMS`^H#-6~;n7o3 zOQ%tvYPr=->M?Z@LzvGg-$;=7SM9?rm1~rrAC=z}PX#5GL11%~Ry0eSq?}SdaWt!8 zHzPO}28J+HW+zkKBmEoVJ9zcj&rCv3hM3q8-6eWSbg}5?QPZNnMBWMSwyn(JtL9^l zr^X~+e!~wRA1WLADP$5xwuQMuF~>d~Q;&T}d7E_SSnZ@TZr#KtNe4qylbR%q@FYC4 zQ%LKI`u<9__+T@kvwvWGOaDP72d>yk>T$I#J#Y@za2Y0=XV5Z1Qci|Iyh?|#K>i~8 zjD>oyTsH| zA!&0UCB}0oJ}rZF^9Cz3Ci{jODK!-~NgL$SsKDCDm(?&ix4&LslmA%YM9}e{4Sox} z6vnC7spM6y6bti(Q5uQ*zxs4-hd!D(mOA=&k|G(qhPdoDoAS8!gVqrl?=Y6=QFOr} zmg_A&M*j@8KN!?Gn%Rb&?Y*^rBsV`+%c_h7QO{~wwN}tZOR?CjRm*lk=|3DC)yQ#QpdQ5CT9M5*gCE+4jdmKh-w9(MsxL3~^*IJN*EL63 zSxJT|4~AqSZ#->0Q(hRJGFo?~26JmuYd&KyCDl=CfxB@3y(kg2DyiSmkWt=fKFO51DRWI^&)ZwU&QEMW$MRz?A z+&b2O%E)bhA4@)&n2}%XO`!_l_i94VrH}{RaJ%aBeL z0daZ-+iYWot4x!}$z9|+*bV2w^81Bn!9RmL0uKTs{g!{azgc{(c*%DGfPIqpq}T6V z5x0LlUnBPwbKdWw6bA#y};jL=W)6|5j{ zl04fOlQxl9@Q+$f^(npTNKHo^bjaAs+=tJ48b-?J(U+oTpG(HgdKlmLNXwoBK~2`y z0z^h=?a@rW#|eo8lAh-(f88#_tAQRZk=G()f493Z^p^=P}_s#@*NjQf$xJD^r0Lq9gN3>5}XASSIqj@ zudx?6U7-<9%Puhd^yUIY-#g-ppwo*^ymNlAaj(|9fqe9Dgwqq#|YjoN3JLe(iLIHc!IUGzTp26|RfaOp-Z#{@#CzK7@s9P*^A?X?8`~=SeoV8d@aP(m3nCjutc!RYkr z{AIJ8|6FVS&L+~Hr$3SG@gIoY)ub(hW4ELW5v68%k=s)l+hU{93uMY~s5+ za)VZ**GX2&a$)_=^?DVb!*}p<75wNtz7tSi`-ST*mwJO;|6QipTKir1fHMLqzO+)| z?+oepwBx+WCmc0;sF@o;EcjDG%g_P()RmNrFEzorZQfL7sJ#*0r=WxEV}74+ew==8 zBo#nj{7-|K3wXuoZnnZ;s~GzvqgGfXr@|~e9=>=_)FWO|L>Ru>$l3lo!*7N+b>yq|Q~4NLGq zONEjcJ`uV|wrJ+$*o5kiCo^{GVo*a_)EsKL=r6ujadm<}D|6*Hu>GZA`h)V{Frhy& zknJVgvpXYG*C@G^92l{#%cFqpa*ExsW3@nzavx!#$%N}{f#Uuu@whEv`qZLmzB@6b0?TV~aQR>O1`D{KR zoodF4odz&lR{f^E;B0RXm3jd>q95~s=CjHtQGV^FXCBGe$+xHnS7=@7q3&`|9LHwx zfH1NN_`JtKU1l>R?TL|*DCY>+@CP(+V_5DTuxU>+Uh6$QZpbh+Q(-bKIUN(=y#6&> z8^zJ-yaLN9hk5n{TF|COE#n84STcyuF$!luw`%qalH&K1j+&2by+_Q3o{gWT5I^Y^OBwz9@3e!Jz_ntaA!d-;^~e~& z={#7Up*Ml)8c0(fBq*db&!Ig*E#v77o8W6%M_|h}Wcpp8+xA0EWR~tqt(kKkB|Zh| zctn!GuhI$ef%pNIyp3>A7)9my2|3ete`Ne>pVu4mW{>MnJ$=m+BgPzzK1KNvjP4!T zC-QNG91#f55m7L_a70R&8nbLq#HNE=ziuD7zQ;}}=Cb^k1v}?{O(29fRK~613^o>6 zMae|{7^<3ZGjUevZSoSgmQ%rqGWv5<^iz8UPsQEx-ipa2WK+WBj>>QHefg<80@3S5 z^v@3zPd~`eS`-{PbrK*U8&Fav@Rkp9-`KT;U!ZrsvlFGW@RS=h2?C@(y##iQ3Nkn&MHX&O^Z3CE3$x_%N{WeE{)?4R zUmwUwq3$fKnYdj3uq?N)bJBLrn$AWyCA8l)o$^jUT_x}NI>O2x+Fx#cM0%g~18RTP zOhx8}G==xN4s`jOI*mKBhc=NmW-)XgR;bE)M%4WkAxV}YsKl3qg2jeZ$wpIJ989yb z9#1??C!-jF5&6+9ogmHi6?}hTYd@)$ic>W)ZOr269SEOT$mFO3k-ehQMiz_O6VV|i#`~L+Q_C$q zl7C^!QAo)urN~vp3Bk9)kHQ>fvq7S-UD9l5a%gEmsMkN_R8n)P2u;f?PS3jP8@;w( zOBfInFPtDbWW3r@ZNLrlrw1j%O<9+}D2?QKvL!!NepUu4EtCVwVdW&}^Dh2;wwwjV z^QQQ>_+Bb2l@UjXlf^b-QL%`$UXlrHD8uztQAwxfP@brzkYxVNA|B1f8$of>5MXu% zJ7p`AMGGoLWkboY7DZ#5hy2^&DDOOH&4(^s_JVzS zWii^2g76FrZeiRHlc1zdQkaZD`O}Nt(VN_ZNM2l9$d)}EDSxV|xR{2i>DcLI)R}5_ ziwR2+QEx`WloZ$#_|@<8 zC&#Dw-ukx2CB;3BJrcVoCOT$fOtF~m(J|5cqN-DV+=(m{Q7A$PyBN_S>_f!yumNHG zS#;)o*VgaZ_Haj;1KVRB1_zmyxqbzszV#=_Pl<%D32hP8!srjMv|mUxt`W zAzdO^AuudZ%fFH;dZX`Yd^%r@PwNe8yi(Zf@L$3UAKi1bchuO!i#I&kQFiP59nB9d3AkJ(|EXW}PuAOnT#4%w zbu65wHO;w5Ze(H0BH864^D~3;WB<>->Aq>c5pgR>Gq^-W@E7;WM`@vGiz~(XVlj^p z5C#fIgf2oaai};_c#h35Oqdtk9as~{>ObyZ5ii9rjL+oT=Nsv3;mhT%7Pla7bnKhh z*qF$eAAoJfL=TM`9~BpQhRs+jVrAH|$hv`#e|}V2;2gSkMi^DrUnj<8Ii;CAAM=CuGZrGR)lOq7x)KI;Uxmv40MKG-qn%a5Y2$WHXqeE{`Q-en zouXKb#?J^W9kCt_cx zP5E~(+5Y3+Hb;6zHwO|etG`ga+9>N+NXF?*Jj!Fg2lFK@>=#@eI z|7v`cm_}?8EH5_mTY(7SuvA0p%%roI!WLiGxO3ih(Np5)dCQB#gsoaH{W30ySnaAd zAJQVLIxhG+zS_|xM+XN|sRq`Y#ys;M$kXw3lz&G3x{A`dx^zvFIkR){e&)$PQ8)=$ z=gLXz#kVZX|50=m;8s>!knRRix{*de8U$&OMpC-F8{{C}&Ali8?yeIzC~4^i>29Pu z-n{R8APC(1$J%RV&6>4$uSE8ELv*_i$J$46Mkw5n3%xAf797#N&h6ms^WMhH*mWF6 z{};w`!m*1uuIevL4evxAXda&tON*QF0r4h@42fZhM~Mfi1yheh1^t{x!cGt2T|jhx zpSl5R-Q^uWrl!QZrxt=q<}&yf#LH`^)pG6T{<>CvmBTx*@+>Z%g zkHoW-`H8P7A#5^L1$%d#+>r_Ha@1~&Spe(d;5bm*b`nA4#EO;CRyZT|TWoIhRkW`A(f!*k?wmxbp5aurk6WyH z(;NYiIcNNA|Lhoo$|^@S+{Gn zGSKU}_sxD`^i&$kBa}vZ75htK4mu&r(6OHl>3Mb9rt}gRSSu0VPy8FTC&RDHjf#~k&N7S&xqdlVEqH3&ftb6oT zyl|{lY*xHZVtPu$)T)?hsvIv8zn?0l-A-%(ywpXu*pqTOZD`8x@fqQ}JZOE8;r5X;IZ7AKAZY9_4>8h+n_hR2uPMOQ4u|iu;e@ zu$jucBG@sfUTlH)F}l%iYu>kds$usg8k>9Y&TGW4p`g7Rzllof-?(ot%BgOsYqP|* z!W0|v4j>FqM*AWfN_bMhP{r<+Y$^UQDN5ojOZjBG{*{Q;KaXDzG|>M_+; zI;j0+Re7!SRU9#u8!q?MO6vKvr#h$mE!MH!iOvS+t<~SSrKYI7npMAIHH(f;$?Z#R zhYsFtbUdo3eT8DTFl}zi%=iiOg3!vEizB9QUIgE4M{IWVG$^L#+=-5et%51BRQz@7uW1@4Qiq(wafy_=d~a1D&X0>h9DS4l|#a*p6oR$b^qh^g>G5i9IfE1KaneEKUie z3`jgo@EA+{j0u3;(WS9mm}zN&7Gmk>Bu{XcgO(0*_rSlj*!{~sWzR<|@s{1$?rN2_ zvzlAYc}8yix^`I4sMSTXE~-S75ps6vp;Sj^iA4 zes%tJirBsh)>E{Mx|^bz-B@FcFtX|=^qBTelhu3bC#AcZS2>}4ugpZ19b@VAl8DqXaP%WjLl@2MVv?BU^ZK|=w&J`;O4)g(I7%DWio#_1CO>GcmUGVTuerufn$Ae zYy{+|lhIqan@u=UKC`>Sy$7%FRMfs}JTULBTPG~jIpzHYAApZYj7z+Zjr90f#n|Q8tLP!G6naz>+*{5Y zXPgZX@+wCs#wy@4xcIKb1?azI`WZ|y&&9k{P8bZ{#`L(HAkm^b8M_oa7Hbr15StS( zAA5~da|lJqgy>C=hcjrCTgM&eb@fEAi+dO$9gO}MT^5b`qU}5yB|SB&)DN^R!(DYSqGG68@6rk6>Jpf>~V>1Y5C*(;zxm+3|vLOrc_CvxT_`frCL6S zPixbZ)Dcn5^{i!15A#b5+i}D`fJF9;or~2$KDZL|BN_RlYvJgq5N#NZpt7xuIry@W z9vk59Ox4*_`A$ZIGzj+_e7>fXOw#EBm znP!d;h|NIO+ykyWG1e=V-4`A2TFyOtzdg>bY9(9U%yZ@iYl~gTj@uuc<<17Tm|Mro z?;dl9N7?Qd*h?)Vzr_t9osr)|7@->=h>@W{EHY7_f?7CN-2xA_yDx(blP_y7PC@L$NrA~ zhR)U`;C&mI(T8LH=^5Is!(&xrF1okr(IuFLx`%JQ!foMphpdp>+2;;%&bp(#647$8 zZm|u~G2Xx46K`I$F^*$yADs?iVq~mO%t|Qz;G7JCEHOF7IW;wp)zb&719g@9uT;I*QZQ+2#zi2O~aunLA8h z%;=(%T0gCZx=x*=lvh@YPoxUMc`+BC5Psxaa}&95><#7~`v*ImKdKjZQUgcU@87mN zR3_~@INt&9rE}EY1=lzJ5!x< z_Ahomi!vXZWsSd$5xT8k)f?-(^@0%Jaw$uc67ol7rP59z`G-GOx)VwLlDJI5iHm6KVHN0NVW9y@N z2}08hm=Fe_x7`Qh2}MAfp2M8p6+4~fjV+GNL*aQCRAW#qFW_2^K18*9J^H~r2a##7 zJ=dCP-Y|LdnF;@fdD`5AW`4-*1^K4A+0`m+UbZ#2rrXlz%I-?H2=J&e{0ndGKW)XC zTR_$R$E=2 z)9xN{z6sIu@e`0(4#8@E5Sw{5ODmi53c5-bTnKr?1wcff+t*{GJLA>TJd2W&Pjuv7G>=>ONl zLLYn_PtZbs1B(3{hjc`g^x2%xW!Te|z(GO~~)P`yX<(aZd*)9zdDM1h_@iBf9 zpOO2(m1p;{EtyfAuPvvVedXejZCgig`6^FJ%@-e@(#x%CWz!ksteI|?aKrAMXi>MM zcf@ULlV-Y;+sWrqQ7$$qHYQ#=wi258XfVdg(aBH&RwHC5IA5^s#qM0z9wtw>#I_1p~~y`f%4tFA53#;Jd+mEczy zsgyxav^VY`vwT)=DOqBwa)IBeOq9Ba>C!J!Q*kF36Do6rG+b^YFW}bm8T22lH{SU~ z8?-a4r!>NT!QZ9$5!ef2h3z}88B0xL(N%c_+{_EV*yR*o9vH;_!l=cQ_=wmqFb!6Z z4vT$<^*J*-5^t-bm+n<}ySjDJ2}rTCT5}P<9n1!XWQ;WS8mY!7vza;FtY{p;qU>bU zz-N;=)+%V-vEfa!KRatsJA84=Ib-epPHA_t{n=vdT+U#9Hf#%nj3IV*pWVpT@UZIH zIh}O-mQ&t6;hZp6n~j_-)_6;{UOAcE_ug5QC4-~8fr(>5xNpaX#ZE*&L|4QoCw2fS zXM=Fiv8!lf42tfFX7fIHcU=c)@fGFE7N@oI!Hqgu%rj;t{fr*bXBmymT4tJ6*Xm~- zv3y_cE6yC}iu=vG1A_F6D@3;eu}Vfu#0JDC#8!Ec=)7optY3o0LFCP$bli`v0u7%8 z8i^y{yl$Xh-@8lP%BYeifPw{4DQWJHUM>8)(%!RZ0sNQ&o#0`tDv0T}_<5+lQamO8 zBQ|SE_r7^8eJBzC-?`Z1sxIN&2aqgwtGU^n2hIox3jhE8IH!}n*#6EM4M~C1KWHbE zPs$~wo-z^fFkHAOeBht+Yx#!!0?#y)kPVjJZI&qx)1NpY_*Vt?h0y$}7CD~b>oX%}Tz)|NZYTI7U zaeJ!$z-THR5KSf3ykb>$bjVp{VX(Ymt+9_eM_kiRGO`+Nj1%TpdkNq!>~?aSds}?C z#zwIm(P>_q7lQ2a!8+?`@xdv}q3wK)rUKBH-nv=w$W0t-)+fu^?iDp_EuY@Ow{TquchN+VR?|&+x)|M<2q3n zbAo+Pl4XeYiPnmi@@l}${j<}`IqcMP%G)n(-x6z;DVwjY97qY4-2^T1H&APKxZB(o z&P3}Hmfsrto^{V!XZ~q?L}$Ocwo+r&OKMBChq7Pos(e-o$q9L>d{VxqOjTwn`;_)d z19`C0kiQghs2;S&E|b3J$8gW-yW|e)3pJJ4NHURm;r(PxJsw@_!(#KIPdy!Fh!d?C z9TQy>yO>y$S}d(v>hFnhkjoY%Iz#gq6Q3C0kN;MK(W;wAqmeQi8L){bLAn^^qye_u zq9iW~qe?mJq;bPIj7t^tZF*L%nbt@frZv?TVj*tU&S`VCHfVSKtv%2#=u36q5PgWg z$S7c_=67aSM0ZbnkyFaq>y~vh0KsH8li5Y8%O8`6>HU#_CK)@-2j(?%voXp#YCW?& zjG2mdF>}AQ!TH7g-Ai-xx!Iz9v60dHs2E-5Wpl7?Q^h&5*rr~o(KVj4~4x07N zMOHrRlhfVx0U35hS4Bx+L|gcpQy@YdH&e}HW*;MF&b3b1f1uA*-RfZ)<|gY$GYDVh zKy-x_GlNM0v<@1+7RGAB!Ed`_)h@An!KHK#W23l=5e&yLshXuE(}TA!pf&@8RA@={8c z3MliX>cV&GdwsXr(>WIXf;QR%v{jaPPopK>H3-$>)(db)(GJ+ftSgW+{(zM60xnq2 z>}$Gq5xb1N3KXuElk8Ns%3CwRH7lB&nPmD}8ol+>T5l~c;(3#zs@>%AasYPOLZBQ+ zhidjrJZJQIbTg3uxnlrK zH@O|1YmQ*=fL8ajlj=0G_u2j7>0J$mG(qpJO;z8i&D3S;N_DQ94r!*9np@4G7E=Qd zo8BmYsu7ekr1nj}h92n#y^E2@=x_c4i^~S{5Bsaz7B6hG-CO>RY0M9jeZBM##zsrD zcH7gO!scPK9ZKe0_H^@$^}s3XSXfYRP^Z*)c3~5)lHk7GqkX+$ZWgec`Bup8;%<&k zb2eb3?yv3@XQbO2RdREr>4$CuXPZ6F$!9;cx){S$P067&lW)iqlwL|<A}ucFn3p|Xee971bvy{q2SsAP--WHmB4eEQ*UuQMl@0duT*0Qvs1vj}0$L%i$b zEk;Z3VsxA5JLx=47j=8L`$_pX{4f6q}ONu-ZfMC~6SKb$ztfRvn?&4PE3>`M5#3JSVN|yl zu-}t~y{)<>6uH&x z+;(oOkq-|csMAJm*zi32D^8?US2Ergq!a61E{NZlKs^_iv*ty za&KevnpMZ@Z#6P~SHb5Bm;;Q7`gwJR(of1Fp62gyX`9C_>8b#PI;!X>Pzjcw#vw%zc$O6*~|uJYxAJ-!W?aE z0U4!@>qb@mkakjCu4I$*NlUQ!(nMM;D*hyP5x+_ErDKvO7nl8VH^g=~xu?`xR;13# zSpKX(kkmZs6)}Zy$UKqk!D7kf{fqp@w)=#oRdE}*J_7V1gmPntn*%Z38&bk4%Wu3h z1{*Q`pxMdp;#6?wyYIYrIDkNO`=J)B4kq{6S!NHh9@&cB19y|dyl!?i{xOoxF8V9I ziJq(;01IlVw8mLr!+|5+q<^JFQYEpPuw7gSbMHj?n(WCVpOQy8uKuQWR0Z{e z)=_(=uhP@C7h1A@53KN#QNW~}Ic7mIH#e8LCftyptEt)!v%WFFN>~%k57up~y0zWj zW3!Hk0_Bbq0ER5H#u;y%3f2{SkWDBCW6zmP|1ym6t||pQI1+WkpizDkIcGD4qTTCCR8h*D`6p>qGFW z_UQ+W+4^O>yR!@L@}m{CzFJ$YMP?ym87TNy{eb#fxu<+q$Eo|&Md~EgP`_w}wJF+U zZN1(Z?QGGg;4`)wiyX_rTMnV*IIKI_ zD-Bh&r!&?mXjig_*@GZf5oS}w2y3h~${C}LR%Q!Ony8UtB&)BqMsf}W_0L=mHZNO) znalQOCNbTZQp_hh&iE!!ucZ2G|KSvOxz~JWhFE{AhjCaR474}J{9-QYweUu4FEkey z3m5r%!WZR^wjDm#TMmo<@Mi0)Q{Q@F1)+2uHqM(vQQ_>?zZy$*UL6Q;U|DIp(nImV z+I`E&VcY~MEn-|S{x!Pm*Rhy8>pS%3K5dBFS*a<#7SD@Ag>%9Kv7oR<>?Uf`&xq+m za#JZP-V^6a2e8EMNT(zh_N=l>Mp_BJ^j`|i3oZ#XNj{jICAsU?6GYJnWji``bLOrDQHu_iOjf;+Nfz!fS>K1jz+t_Q{$!X8F zW?8>jhP56ncdJ<&I|99gJ$;Y1MXRQ?lQ+R~uvz>n{4MU17EAv~w3JcoDD)Nn68npU z*ih^x))YsJujTJ#Udf~^Q;sNtT1j1ix4%l8r`^|XAYr%Dx2P_v?(6b-Znuv;A~cta zAu=;*YxP6M38aktb}?K`)TsiX`E31Ty+^rJ%Oo}1tY^*E`x!k<&MITb`0UWODNp#* zQZD1TdB(bA<~LVZovmetY-g~`T7TI+tzV53a6i^kzDXm+g5m^(^aA9G9`by-w!BlV zqxqJpIh4`rezm&VLAk7UP_OCj^&ZKYv82zaJJhe*Jk%JIfd@x*Q7>lv zWUMkYD-*JfWexS2MaHqZ+c0Sox%LD4ZADQ&1|5HIA4c0i8|YqT69s&-r7tY=coNIj(-NV#vt^-4B%tTxIhZ_L#P;KKe!-;mRP(hF;UYU5Q=%_x7A zx{Gs!gy0G{g;xS2E*C$FSEL`Lpfp+>BJxrNsjT$HCk>TuNIfyjb6rX0FA`Tm8@6vs z&Y4^@Y0vfy+YTp5;qSz~C`nhF)3kN!bvwo*qa zr2e2bRVQi#)ZkKl5$5to(Cnll)#Qq=vN>=5*^bE;gz?(!LpMkb-Am_M8aYwn5w@sG9q}c=qt@N@JZA#J6LZ((nsp| z_1@}z*%Qn0H?Zi2i;{Fn+AS@RVzR2vfnj}_l1m*Xe~_z6>GD2hxms6!g?pZ-WYS0I zRgG&HOIn8gkjiPk6>4S(57p#9Wku%YUcjb*m8PJFnUz6`sjOGVp|LO)jfFLc`R{;b z?WH(ytA>1D`BAwkzXMUbpv+QFqD1|Kz^tt|HnUo$`N^QrA?{}8061la#PI>IWE>Qf zwMh5Bf}WSv%j>1|x_Ty`c1atetF5`6!3^o+8?MKa%f*P-=A6!b+u%RYlOXGG2wt%Q6iKd)Xfl7DDA4A zOFO78hrzU+x=;l&%D+h?gttNxe}|_8Ubw=S<_GbA2_2BOpNM~nn}zF$@^<29@mH~{ zC`lAJ2ABIyf9KGnK)WCxc^vW+S;VY}g!Nh_{g_Yhsr6G^%By8rP1hCpygC`# zwFBBC{fTiG@^T*i9~h_7)Dv0-?X^BmZ=q#V^JycDBrB(R3Q}}m#C9`dKL&3yX+Nv) zp_}hl2dnwi8p>KYVt2{2VC1bV9u&8T)x_gsD`6)8l+Vu<;+yde_`G}r&bNzu4|Cyc zK^OKS#y1Nsgn_~#aW3f9LuoxcS{>Dya!BeZ{v);)TJX(94th^W^|T^tHmxeupwW6p zBqtA^_>p*O*Feivy|Ic7xA13=wW<0PZL@kp-Xgc>wulwX3;=jPGRj%)q0SnmjX!+G z3T1~f%=DT67%%mG+G@3(SiH~Q&i^_nQKOX|tM$dt^^F7_X3B*AVqFs-jF(4l2{6#bPn; zI6IG@EhTF?)Fkz#5>fjZLs0jg1v1>yhwDFTv$Y?!ELcBF)T3H!t&4g`U8NM2@(Le? z8vH(?m!L_ty30D9G=SsdNa!qNiI6_#(@8^dI?Zry`F|IxL6W4Ltrc*CnGxw(pd2}l66>UDl`>;6Rz`*_$KUQE-(9) zTL2S6C-xn?lN-c!;CgYHx%%t{_AEYQSwFXmo6difCdBgb$}2aOKd9%F ztLk6~39I#TMs9R>av=i@1{2t-K2Sv%(`u?CR7dZs71Oe+*KtAbl|te=aTcAQyP_Xg zi{cfG(S{%j{(|!-m(fZ)C_mQ98PoKO5F)Fn8AXk+!Z+rp^Mvq+&{@cW3m+xX;%T37 zQamQk5jO&Ex(dC;X-YSUProa5)qHYYiB)6Z#vQedT2{KuuG9U$mhBgmOBmzrZ$mgOL<7z^7SJEvGKm+Ng){7W3n;mP3J_rc{Lss0OOu z-=&$*d)rGNr2_D}dF(zWKV6Y%M|C70(`zV>QJA`XU;VTk%)ziY*{586&G6)~MrB>}DNQT3e% z6m^iFzz_NwoH!^h7LvO->A5JOl~I+ zky^@i)lAA`$-YKyh+0kKom?rKnNpk`455adQG zekG6mUVb5e0arb(lvYRT6;Q?sNOF7Np9z6Ow(#MBW|K=x`=!}ZAMvs{NH`?eLWED} z@1n2yg*(YDdO!c0KU zFrhz?=@}p8>u`T^HupF8lFz}DyvyI^2C<{qx=rIB1FdI@!pzDHN44$vW{4%>Tn9TCyX*#DT-%uQwrbAt7_3|uWv;H&X}3q6HOLUly>a=xR`T|6P~m#Rpr zoL6oLC4GU!OTCZ>GKur0K~f#jHw2tzlT=kaC;cRMkYAx{s{{Yj8MUO=Rh^`yC;{cJ za$QlC-<2R9USWjmK-q$uahWt#x-Y!}xDJ%&$z^0+DXT0}iz_dcarhhO_V;wx0vt7JrS14rJ)Mukg6#8)aUAM1+#2gId!|{!>`B5=ag2;V|k`rN-hJgdsR7x zdUAziNE4)sfN_J5F+D>o$cD;rnNT|6mMpc1@~3h`S*7|$D!tT#icccdpCCfDR&L1u zh^c%*zB#{$JH3*1p|6MK;D!I1P#AJc_dPbJ8e z==9q3UYe&a(*@`OOcAW?i(E#2yATyeV-(B8i)pJ&P?{)*ky?IHGD`QL36v8LN{-xK z{z4Qv!u?_4`O`;^%njBJC5l?J)^%PUs27;G%AJm z{XoA`W1+5riRux1MtbL1iaXw3ZZ6i7l=e~*_{(fQGgphLMIT~lY`5@CULX&bCW*g` zxuxpzG`#B`atfBzO+<5BB(ne4QcpmvK1d6p4zv;v0i^1Idd}iWt{7LH+X(z4#K{=I zi3y*iSyCn+UzWK{?_-)XbC_k!RJJ;^glWT!Va76H<`e56&S!Azf!bR+n(NGs;ZisT z#;mNoDtss07q>{+z-|W#KY@e~=dba7`Ln#j-xt1!wLrlqim#;|Qkpau%la)Ox6krC z`4Dtw1x5P>Fssh;KG_#Qz0(4fO*>rs0!%39M}2!55ArZRrg#iGSRE-@E{AlnL>?uV zkaVn-G_j9xT?h;9`ER_! zfdn~%NKgytW$a3>4a^F!(Dt9=6C=V+{+O7gv{P3oDp2f!>{IF@TeX&3%0=Z0@&I`P zCOn2?X7e8Yq`cfp{KlPNC@vB19SoC4xii=&;JoZtDqtNj(i5eMk`?T(KIDl$QgL~Q z+8N-}RFZ|?x#N6oekgKlSMD?Sgm&p=bUN+(z}2F6K{~iW|3@!oU+^Y>Qs~M5Dl`^$ ziD^(NN6Arq*|VY}OocHa$o6DI>@2o0;OHK^gt3_sY*DTc^x~fE6Xq^`m!3#vCTmfD zQ02&Z)Glf}l5}12IJuqrof=L>>8kW}dNuP0*O=cUWDqI}QJ=ULp!!zMgfQwW=aBvq z_VdZYVvx+^VhiDvuoC6g5@EG4L0G{b!*W_LG!ohhv~W!P125sLaE6cYIoMB38ufnlwYlKE7z6TO#MNrlPR^h@5?Upgs{ zkrGm>cugoSR1$xZI!afiwNh_sjod_@E;q-+XQ5PVl^&v$+KHr@Q=B2@6P^ma`71(A zz60XABBycR@qI8}wH=z_Fg_c7lFkT#8c7eJFVZt;hpA6Lp%2hUXoktouuNn65`CP> z$5f*~`PghM!Gf)>$UkjatA(ju7ZPuya>>C5aBJlqtf1yhGAMtmU7 zL>@-Y6I&x!BDKOT!WSZQ!V|;C!ZRWQNmJ*TM_dy&%(mkC@M-*0Y{qgy7$D^Y=$w?t zL8708a*L6Mh@$wNI9TJ&U1W~I|o zR)F$WNR12{ExY8Z0P5RHVQH1rTzJiG;4bsIkXZY2Ihj*jJtiY@jowFlXkl%nrcoL> zgd(^pLb6y?sL0>tKM6ynF~HK+l7!nGDRk$2o0$VlS!M&%oNf(?VLj6b3*!>ApUuns z!>G&<`Z~Rpa>=p8L9#MQkR!?VR4>$S0ZJh!k_X9MR3&N%U5ROezrB*#$X?>|0NHwS z$-E*A7Hdm`6H;{YhjLdiAlzuHV&+Z`uO!sx+QAXgBo3AZ25IXR!xLF**zZ0?xcTmbr12k)*Zz^j2k5UGd zQ<7L-AcSi?#kYq|uqRiF8^_J#mh%1iA;=1|*bDR<>H?LQI!Afbb-Et)m2ON|py$yf z^2Z8#JH3_Oi1=>FOh&vnVY)I4(Gl%{r97A0$kt|mV{@>JnF-7sIzd;Yee_PC>M%C5 zk7~J>D9%1isUAS{d5wnCN!VRe38|0dx_nXn12}Yxq)VL#T3y4!sFw3^fg23l0jeCHj%y&@KovTiGRC4bW1B ztH;_f9c~a;OL?Wdcy7s}DV3ILi8K_X>|$Zz5y)siP>9w*%FEN-MSyWD?ke{VeE$R2mwmw%VXHFRnJj>n zI&^iW7kz}u!?xgl=R&9v&T~&tnm^)lvJ=6iJJPl32UKHbyN}#T-zKHxusF}l>AA6< z@p!DDGf1h;iF_(Em}*28Aj=aOsE6EYzORr4lEieLXRp#LkwRZE6X-AW0wmdcY#H=+ z`Y<)n*ZG^9CX^Cei!~rtbc5{N0;1Lmp%Z_KugtyTYOqD&5zL8zti;vher0{fnNHLd zY9`f?Do$0UI#OHcA@o}OY8cgwYE6lBdAb>$!pvh9&@bq7^cyB4oo4CYbPu`(4Jc)w0)EG`L)qor z5iyTX`ixddX89@z^C?M`)=TXnA1)Nfh&6=6f{%X*B`iB&<_4byqZM8F_K5a=!dRiV zP>0_I)4?*1;v8;1dlIXsD|3Y5=_k}~a&P2w_~&rN@PN>j(C}d8z`bCRK+8bhz|epj zco>`!svKTIcvLZPY+oyOGV8I$@deh=F{ThVmVbpsR0c|DRk4^jUc4gq#smCG=r7#G z|2ZJ86*nTM*ORk@BV`dT3t_3WsG~qBEC$4$LO*^5N|8>S#J>RP$_D0tStNz$LV5OI zZYO&SEr$ctTV^uRH&}x#Mn9!QA5kunGcqo`D||Y#jy{UmAI=xxllbrXg(4}g74q=& zQRUpFuTW>HM$`|aLS`bnABQPt=MbQg#e@0cNsuL1plPGfp=?fAZ&0n#~+?Z_VD z3bB>gw#Zj!fC23gU=!&dsX63ZayC^2{)jB3LM^37fut`*!rIRcW>+!`8J8&nmRuCb zuTwKPkDM9_f;nVV?z&Sjez(!w$E~CPX4X(+$$XJ~;m6@W$!W|w9{_V5TZKK#TxC?s zCR3@YbW^$)b)VWt?V)5!r0!BS)c{vL2=_mk$;`!}@GKO@^E9gC6yfLp$2514J;`jO zU(z3$K5P}{0+Y@(r#@3%$#bMg&Lpo=v#G)46Oto$lWAm#JVDXa2C4_YTf9h9iAbp6PC*%>YqroPk5r1Bq0usJad?hv)zZX6T6Zrf5C6xQQ z!8300UwzyjW;~1rT{u7YiEjb$8P7fC%A!~6axJ*+>_#>x(;csXrYPb;cxAX^=xp#_ z;FRA>e(BGU{4RNpKbOCB@^*iNK&imsV4ILHY!WZ2vD6Ft3Dc12!e(Mj+Mu^F+kq{Q zxyn!kCGHtN87pX{ke6S~`y4<=d4UrLh&{zNVoQDs1cevEDl}Ej2`7XG0Ol=NdLP&p z>{PZC-xK=hP_eqOO<2GWXHRk**PrS^R;F0$Co&T07U@p)rkavXiM-+6;f>+`VT#Po zoM*4FCbyq^&S!@M?k%^FJE+aY zGD-&F*DlHGY&KNa0^N=7%Cuq%LVWfk@lK+vP(7)94L3DxBC${hVy_pNb(9Z2`1ixKN0 z{X%+ZT_`|IqPtMX$b0zmS8(YYBEutj!heR|hU{wFAfvq)L-7sk&4J zY5`)T1MTZehv`+MM?57CM?OcYhf9P82VaKDh5iZ^2=xvx2(Jij2tEjph&&?}Qa-j2 zKVG;k?U9$GT|ZVVDI5^K0mTcN6PpJHrLN2aWSy6`Q^rZ_{R+<1JgzoW#i4JBwB0Qot; z4wY~vRLhUq)#1BLKz5}uVpMSWY1~cr8atd>%Y+zTW2QIXOen*@K|d=ycY(dmb?2H= z|02mg3ZGA&71$N2L73!X;u>+C2u13Klfjf+dJpGvW!Q9l+p+8nV8?y77_%4@Wd>eN zR$^Y{OXN(XVPs6?Rpbg$kSIm8L!heQ72T;!$Qf-Sv9J@~6PX-Y?2AkYli^9B$H51o z{o(TAvXKIa^~S_dVi;ng3eh=oikLvwCLTlN2gNbd!xD2``C^59bfcfmrA|*^D|tz9NeeGa^SKt;54Z z&qBk3DZ#tJ*1@{LlfmObHn7P5mw$cowjc`<&xotQt+m8@+)GR17_plmiIGG} zViPeD&!ji`oa#h2h-?Xeh}4N(BvQx>#Cx&=8K$z6he?;@u|AUVEFzITk?+F|Lt>~v za6n*$zl%SozqUVbvYb3B`Hy5K`LTaVU~SM>A^2NpU}Pt?nG=M&!jHmY;ezm0>;vkY ziOWUhr1~-o5MC+l8?HDzh3UbRq_bJ@+0k`$icjZWR9H zo1t#ljUa4BCqu~S&E$j7cA2jSiai{KOigwyDBAhRnc%Hp-+&j+Lu@CCM1qm5Vc(6& ztjKR+FT99gm?7+Zwk2XY#WjAsCKaBC-(KBj>|c!(`-# z$aH)KHM}>x$QLObDHa|W4&lE9VtzGofGj~=A|k{b;tDy3EEPEy{v2r=z7rl5eiNC7 z^f@wkIk+=u1gC`hg%*W|hrH0KuoUToh)<6EP0S=G(xu7aXG%;xles+@vC5=oj;BOHif<(9>@h7#4eoUXCi-E560f(MTJ)#>^ zw70?nz=cJTI=)D6yoZrQIkGzOCh|O- z61o)rAuNYqM^;AujJ(8UlOi=EE5ql&XLknA2L}b}`gbJ1OZt|?B~?r+ zl=N%Tf~3(&RS{NWk}vwl`7Z?A;O4MO*Jo!ji`XIjSl-}Cp%?d&&ITB3NR0%+Z$ZUr z-x45ON$Lm{qJN=&jO+-#3f2mBA3gIrKxgPiSMPcxYDWVMqyGi%cgn zlT(<+Y#p{DQjf)qftb;ZI*c~mK{7va1vhjy;u{v0L*qkJLl?qXLslqLXlHnT_+BIv zUQ6DviMV(f>K)n^-~+zk)Zll)1Hs*akHJo%3ZYTKR>5kaXW_viE_gdwI`BSlJxGKS zAtH1joGV;0QYw-Z85a>F+affPFLEd{4@&5e@bbuS#IVTq@T2gu@Uqa?&`DqT*U;H; zmT-D#LSRp@Bm!`L;C--Guu(7)%7Je^H+VK=hZcugMEVnbsAa(yn?u_Zp+oE(?Ww{G zfAh8IJ5cg|iu@Gn;qRZE&2I*)g!o8~FdLo|iX)VVnrlyHQosr{39!LZ!P_Cr7y2{weQ;~wMPQVFy}y*dRx*=hCJo-sZ@aL) z7Cyt0@+B2as*}_)saMjpq=Ctq{j~$NgI^;r$iWEGvXEIi&}GPZkyW8jp`}PYPIz+o zFCrs3n@oq`I-mS8{65q^*e01zk^@g86^K>@PtKvLlhXjnc_NP@zU-mpKrX>QKS|zh zZNIf`)7I8oJ8%7C%d#ycx3t_G-aL9Uw`I)M>)Tf1QZ^(rfwiH5;X6bI;uoS9;RE5y zN&ZS6Bj2Keo(aM2CNh9W#i%uO9h7Bv>GkvhW)#zi$;2!H$#201P(wdr%2RKtDdcKs z4WE3d?K7hE7|&j0J2R=w3&u~BPfqb~L$c@)4EUb}Q$mx2nS$AZ$3uK*Y-mFyK-eTl zyAT?FVe-&C7Vl$fGZ1kHaB?lNHll}>aNSVH;QCO<(B9DR*nnVvsAcFskkfy|MZ$SQ zvxCu*fRsYgT5ibQ1EJ?b>JstzXpMuft3L^6huE{u%Gu&@UQhx_5TyBh;(x> z5DCPCV}dt=UqX@4@sJt18u}348>t-59eN&VgZx%2d=uZec2Edj2vrL;LeQ=V)(mvP zTYuxf>u(syAIReW*T2(m2FeC{1%iQF!LOlDK7`7qMbpG zp;Rdj32{Y22xN$l`%DC_ySr}PyLH*R?`~!5veoZ=|7$J^4G?BB=ef^)|IWijP>3`v zF@v{S0IjMIEYOduUC#Zs<+uMko}T6DkaK z2~L#->7KMx$`)4hF+45Q7BJzi*iqammWyK%QIaM~7v#-BDVP{?7Y{G#R(M(%Ej`h1q2uV7JErALq(CK z;*p?SuR;C#m%b}oP7%0QV5K2`7ldrD@OEnGZl@l&AvHI{T-lD)XFJa_T9<;R!YC>|4T66q9) z4j&7X;oFfZNO3C=%$l$=7nIq{S1oof&RRScTG2|t4R-)B4=D?R7wAzM1&L1s*Y&Bm zdc+()5osDpi<|>QxwUvmu@B0ve(|zm2k6L=aBO5kGTbvw8q*e*CHxF$#i+r#_(U`lXPm@FO?$`XG{ zPr{W-M=YtgqROh)D;!JbF0Nm8qO@D_^YB*rxfGU%$RC2skl+tU^36iCLMubDp(&vg zp-rK~;8UxFR)>BGJ_@0sz2P2VI_wAqu`4NjLkNnhnQay!W@70ZLA&(d|-6U+|!jBCT~>@ORki=D+(*t0}qG+MAZa*5m%NN*%9sotyU9y6J8iz67fc6gwBRehZ}~E zmMkjWR`vq;fEjH4x{5yKAAmCKFMAC^EvBql>Ga}qBr-U%1w>N;$~Gd>D>5u%iF}Xr zjx;LnT8tG_k#CWSU@u<7Be{{m;l1I-Aj&mEtKbd~g6dX;iI5mH%FQK>TpRq~Z_;Ji z75qJTFSsn!B6KA5E_5@;--LG;^K3%;oW$gnz}q<&WW!VQ=VJ$Ps)K zJQe&i_#b$eesY@JOFjoBISuNjn_L)d87zfDo+ZDR-^eBM40(WbR5~kdkj6-pMNI4} z-W2V^HercyMDXzMgi*qIv6eVbydxv6x7i%Mcka!T-$+ojD*iPG<7X%IsmfRN9IRMZ~CynPuCp{+Wgp7|w>ijnb=)Z*J^ z6#$0km7lHXQPH@3P1(Vc2a!9GQQ@tjqv7hIOTp!#PN5IMjq=w}uTb|;bOb9tT3WlJ z#o|dodV2#@O)hhRd`~HzSZXVE7Z*YqzbaOQZ-t^lZ9`P5k~S$_^U!yp5qR1IdClG4sx%# zeSBs9vQWSWxP0y*x0YMLv0O*45_^tq!F*$0F&>(tZqW?=foZ~gWm8!sj!kCQaQ(Sf z+;F~=&_(Pb=8FOGp;QNK$q=cVlq`JUJM+`|cl^KnPf+$^p-7m-KNBhoQ-nUkW^sV< zOn3>7rn-16G!+_eC;5d?!ad{ba|f7ZbX)2t^%v!!lBk_jDK&fXWlm^WNQz8OD_e_XZ6(ywKT(jUNuwWWon*3u4OMw^0K;$T&+CCdO$@Zk3=mCr5vQr5p@WcX=# z5cJu8Aw4wUI4M_ZA|cM;j*vBYIb5}POv&WZH=ymQ6`AEr%G;G4E%O3+K2_QSlKWU_ zqR%4!P`tcLejtCBgEAQ`2n_})o)mf-mLppuDIsleXXr4rnKq%_!6%{Fp~*pmJYD(_ z90H(zZm?~zv+R-k$gy%~>0h}w{8C;^xt25ykzDdq>6%zBhk|>8Rpk%zjo_frlSrG$ zuVEH?v^$gl%<4yIUZ@VNk(I&yL2J+%)XT4=SKw=eqU&DjL zQ{|t+4=NMuL+)g{P)8^`^IGgHJ7vF&LW=qoe(Y9p4Ijhop&v0wA=`VJE+p$N7VN19ltzAI&hSY&SN*6wrH_M$~5FCz(Snq*l zlhTt~vK3iK^`bUXW5_JB5wVfjN7f^D5b4Beay8YAYC)Z&zEWxQAf_)fn{CG?u+6x} zP~1-blF&f7Ejqrh!t+CWLK{Gw(?Vl|3jjB%f-B@3(ouP;++PYwYe6x)%Q>=D zUN8S8FP8cWBy_+E@xI(sek^y88^|5yHo;wCbvP3un=1GieDh)GnpNaDM6N7j@-6tr zfIM4L2wNbnjpf}!oN!BQBrcN{!IBv-cMDd6WtS%&qcibt#1S$?jb^Lx4Fxqc+gx#o zR7)%u-tivhDLs;QGt<~^+zO#9DC8)Wa^&X40qa;v$k+&Atr*OG0_4q$sQ9q4fs zMIk&LWOA8_)DJ3w(vg`&3Nf2FN8YCxYAN-GRxoj_jy=Wcg*M_T36&&iglH9B!?716 z_^c2SRzPEE4Eh)3k8azm8uex)J?}zsNtKrUy|YsJ>8U0qQrh8W~MZrJm9} zQ;S*0s@W>cQ?3@bi(AEIag)LER_BL7+4kZ}xnbNfKAQW7b92pDFRNk|tcLx{t>*)R zf&awMgG_i9PO~m+V67}-XBRP@sLxbAg249@c5*D)pV&?Gz@Oq5@tycNT*gP>2>z3p zia*3-iG1<|X{YMbN?KqVu~F=K_9QECqEH}Kf%bG*Y%2~CD~SW7(XuaiKU5Y<30;be zDUJb1yS4aJ$*Ypv#g@opu%WXfFC*6@e?|@>ku{MVaJTD9x|X&8XeN~YTROc2EA~bP zhH-Fxzk(e-BNp)Y1*@b9#)a7Ml!&YNW$}gLQ>ACh=agM6rAu~}oGKxUcNQNgUK<%4 zS`|DltHc=SlBCdu|AXJledKQOrNTaGyhO`0LfOG#;>%$DaD!0C;D-=`g!BLxItMNC zEV()iohE~cej`4FCcG4Q(0|gul2`5`_mvh%UBtP+*Ab5`X;0Qa(W912QQ|YU;N2)Gt=H~%R;)SZvEjx=b;z;2jH1VlIx^PN( zgov$pC;1686DsNf+fz6#U6%^PEWt0Rghyg?v9@p%6e~f{3l6cKs1i)PpBEwj_2GJR zDO^3SGAl7x*lNs4`d?-elTMGJM!^k?AqvRuRd zWnl-fb=Xnt0w!Q3*b>Zy>9GY^4t58_ux1!C2g}6n5xt1(ag!FDv<4vI%tttj7Slf-J{_L5xTfh@wAfv z0J`)q8(W$Q{Pt0?yEwP_KxBXDVlZ2-EQ0gn_3#=j;8LMg`FR`Hi1qUmg{|Uz$s$b? zw@53Y^!f%hq2Zx!!FRzp`K)Y~&Ozw#Nf{7wwu%?Q)-?i)J5h>~>p_d&Cn2R$W#NZ7 z7t;6{SRg;8HBu7jdzy4WBBTq_VW{AJQmJ%YdL%uC$kkNZB9Y?1!dl>??IC3U$v+aB z@|*b~dCUJ(`O(oKUXd|7^3}#-k zzcAOB^~_$jK1;I(h;vn06T;abT2^9zu&dbrF>3lVQ;w;`7xgDXy5aQ)}k}SSMgbjQu*N~mSTDdgdA^gHW z2eU;p6Co~bJ`nd*m3ok@Q+_C)WY9qLB0D?eZBJSue+kPXsl; zjc>}Gw{fI8aOZpr;l-^I7 z$x~zt;vLzH>`hK1Cy`$AHu;j853!~*{R|xQ9(EtQj2*!k=xwwJ!Tt;AW;Ietv?XMs z8-k@^)j*|U&=8u1jzvxAdo(xT2$<07SWTQEQt+!#NOg%b#5rOI*^>O5Zp5@;ma#S1 zVQgb&FEaq{r-H0Rwj=wJoyqpZe_%zI5~qlrgq4^@WWoD0#7bf@ahkYE>>(tgkidzp zL^&~)NF>e^lQE>Sf2Q}luc6QDukSAjR1JK`t`OY`Bk_d%hl(Y)kd5K0GKsfDExaS9 z!D8{|L}#)#`G}IJvlIrag`{WG`{=Xuahjz|nP$v9hGSc?voQuIp|(gpDmj8|1)rAc|Bq>#Eoezi&^(oX=j^T9t~ zmfrzAb;|K_O-U~n2vzth+#{}n%i}h40=I_m!#4sAtjBg@+5l-9ME^!NqMlPo1Um8+ zDjrWltD}Pgb|2xdf{w;m>;<&V=~!#@Bl;Ojz;swUtQWLW0eeBzBG=N@n0jmjb`~Sk z@9D+Vf1rE|iM#l1^uNG4bQ|^#bE1O-S^lT~8NRc=zTQ{90^b#1uFnoPQG*6CCzgvw z0{a4afhP#M0aIc3@%DHuzJX{5g}0K}LWGEQ!~?t~-UpAv=fG$5p!#X}M0^sy2uJag z_*0?*;e^^YgH!H^--XBYc!=l7@Rj;X>- zWe%}5m@`ZaRPKCg8PxPwFz3I)TAxRKqh#_l^&1r;j}jJqAbKlsC(z$t;`jKo{FQy5 z;4Rhnt8cBpn!ly*v(M=3;2ZDL`HuKIApSXl$>?UR9-JYIy~MoO9L$fc#xB9fkFfvn zrg#)20*ts%&IB*_mgyyomturl{2U0XKJGl{;#=@O{)pHR225`yLT(+L73vSTcC@?$ zv`;I=1^Gxx$pje3s(>i>jF92!0P==O`QWK<@rwkcslbSgd<*uq9fi3@%kaR+h{(Kf zUU))y7z{{y1^39K#V_I^Q7il-;CyrDCDWTZ&ej47aF({vjlpgXBqri#h(6>5x*L0o zU&EgjeiMHa=LugRCFOAcu+yQ>Z{>bv?}J@E$B%}17tI$6>r1`l5VOx%`^0o|A+{t&wfHMmQ_2v%|HIU`t%b=(GSD%+C&0R}aO zdPr@jY}9yaEY+M06L*M7a2Rkg@Z3AYJy% z$92lx&uw?7y0?2qdsh3Z1iGSw&>CoMbQD}dCA1l8#gbr!ti}H$2IHUcO<+SV;hkYjBDDPu$ZO?b_51-2W#=F={d*^ydvN+LZX-91 zmD#Q^)#=9;2vfy7;(W0hu)sCoVFyZW#5ZC~{xCmDm?13+-U?rcxFaDLPDck%%4?;~ z;s-GRp{kM4L5LUB;wb5PaABxYsAp(w$QsHD{uLY^>j=q z&Or7WV5T_`wY98;%i+s}IzkiS7oo2p2}S$|;eWzgm@jOT`bwk3XQE5&BYLEoVzw|1 zp6fco_2e3`pTQsyY%vVc+HsxOU2y%Q>DE*#)e>&WcCv&_CHCQe;TpUxW*|8C$n|9xZ`5s^^;K+Urho zzwqRF+j%$nQv9L7D^!hkMth?uS?*Cv( zHTDEO2RzF?hdhXTmHUvlp_lVKgX;`?>$sP@N4d9nT6=r>y9Uw%!~BQ+&As=$l|9!y zTRn%oao$tDM!phQ>A8W%fl%Nd^fhh)V`3$IO2VvmD$o5a1i?h4ga1KnE&WMsTITvXm6FFcMik?@EV@O2BH@+ zGxj_1fHSbj^BJT*`<4^f<4hK9r9Dh9=6`erP0|NI2QSkn=nb?N!onE(FW54mhAQ6( zplKuT=T`GIgmyxX;1zxs-26}e9{++r%J+lCyO&+a%%x5A9%eZGj4o%Q*jenqtdCjC zbf@#F)?`iMGua#n(*S%G-W*$pV6D(ffnWVU{p)=@ywAOaH`#mMx7+_e-#(psA<|I@q*85405)1qotdV2nS($9NG>CwC{;ZPy>JqpqLsv2Km~xO=xNSaia* z#=YJBo2!khm#f(2bxn4)bsVPiP}Fsp z!^{qDx>yGo*`L6Dzl53vBl1#dD~NeD(J7Q5pw-p+eY_Ps@JC_2xC$6uUpZD<2g<)g z+$Y9^jabY-;nRV9JYok!HXe(YU@Ng{Sarw@M+4OZ9ie%P0U1rfe!-RzZNQGO_!qJV z0I7G>F!B#b(s6W{u1CQhWXeZHQys}yB+Rg>y1<+)6!L@~OHZaR!oc7xvx$vi*RvE? z4KVRpu8<3H^Pm|;voXwjaD6HmF|;NhkUPmw)G<0h|4#FCB3+AWNFexBuxl4#flWcr z!7YjMU-j4bzVwdwTy&o9Z}oZrGeGjEEmR<1gCP427QpEiZ+>%gnr!+cR7q)T@@*NB8_jhow zLDCCu#j$L>65bZuhj#EKAfEc}!R{Ka6|RL)odI}(3OwE2 z7u`X3fv2{2jo<3O>HEX$^(b6diuxhzieid>x{kOndJ^1c+?8Bt(W#=UMT=b1U3HPg z&a+5EWQy~KGspQB9`zPALCTP;MR7$JVWBodULtdfX1SKTe!4!oOFiek7kmcapMGQr z_>zwp1~QpP^dxcc?-+g(qVpGW0r`Xa0GkoUF+kK)_XqqHf$@P)=plR}Q9&%k`(cmqmBdD} zFR>Z_K_roxU{@ZKZ%FVkkbMS%+Z%*e$NS>Dh%4kBSfU)=6h!?LOgcWp-WVFFT4!bt zDHxnnZTSW6?Wk9*Uur{ZIVee9wK8 zJTKf4*E82zS6b2OqFRU_$%3x`q-b{0WTbmxUcn5<(tI}WzAZWTf^AWrY(JMjz@BW| zkn}aEr=~JIojt1a^>9k+&#I6a<}G|=GM!J%8q2$&N5_8$|}v;mbDqI zx$(Jap7~evWsAm|lC>|VT5eNY*Swy2=khM)HOjq^TR&H4%gNiCALUTwud{iw`kN-} zD|E;S{S{-rDZ$KV2l92!`h}$9l;de(8KQF4cfax;^xcE<+v-{4DFY`n**no&;eGGr zJrBVdocAUA`uhg^Uil9OdIzTaPx<0JqI+=BYh*t%3Ymh`b8^mXr{MHEjZTv@-r2M8 zec^s*pQ1|cd7k<1uq(Q#A<_|X{)L2!^5F#yAP=4IoFkmwoU@=)HFX-Cj>4>h29B$R zHJoFdV+!?!t>N33BC*H?5$fviuI2jb+UKd}O9s1r zD1f4u(U+(hvl3ZkZ^8qXL`SS49+3v}Bh{0d1*6+4H1a>X6Fq}oNk4)C!XV~vwg7g$ zG+{6B+r@0DmsBAA2hePh=n-28tN6QoPwqLl7sg7Xn0N4XH@Nzo31+5kxpr(_NO>wY z3&8v;`Z5(qY{HEgj=n_`_jCJz12J$y*0f)paE*%et)aLK=cJ3jo`=ev-oz% z^q=tCcqx7etl8CyR7v2bb;ySq6D?r0`!px(Dl*l+TL|!1P6?tcDr*nPTob{{qLw1{-+Sz|) z66(KOpsMY~&j zSJznQ&^^%Y(!SEx(~ufOvrpSadrG%SkLXwFN9*hA6?(sJr#4? zp0S=v?zmRp7!~9U-B;Gx$?&4jmevv zr^<8ZNqPBsv+_drGmhDg^NwMTSp{Oj$$XpblxTgVo!E%?)MHvevZW4qIC%a3-13YHbzDcD+Yqp(fEyTZ7l zYTm`@2&^l57i)qk07g~860x&*Z+tsZ3EzMx;@eWLLoUH_3O@ z1bP9J!{pJY=>OOpzPB&|2DjgZy8Y zFIw!@&eqA+cGkgGlXaq{+#E8^H1;x-8RqFv>bvS5>2B)Y>luS+9BW);Of`-*EYdyI zK2=Xr*;RE_)l^k7KV*JJGB0MvD(@<Z7qtfaW7Y@+<1!kSSp?OGa{ z-Xf!eq9W6yF4y@@Uvui^jm^um&C315HY+bRze+*vLT};CLJY3)VnKI@CjYPeXAWn< zl!DuZ8fQN8*)`hT)Vt3idqf?kg9`Gf3(@{mQgWx0=Y+vI4nZ)F!| z&&>LnHPafjW?3&=Us~&#b*9m#3QH}^4$EXqCktynXzZx3tsh}f8BQ4v!K%M%s$!~X zYHR9d!pv)|t+Hliug%rkDBGx9d+v)oyFE2;k8PE$B2SZ7W;>bt#WpoB!`?9OWZwU5 zr)^2M13#V1}?yAyD?<-}7@};{Am?!M*_ieStYde*`bwp9<4m=%Lgl z0Cp$HCBT4^;o17($VjX=3>~Tjl>UJ4v5)m$_Y5d{={!_8vS4*#U1w$Idt`T!>9~8UXBmJ@=zpT^N0Pv`Rn=r=U?PM z9OxOC9atD}LYzMo_!k|FMx(U?FVRkDHo68uPXi448$E-MwYRj{ zT7|BzzMj5VPwNx(v!oDx`39@Y}fSAG}Uxh|EZ2wyEXBePnz$V z$C`gNw>6aJ7o|#ZU4bZcicT4&8ST<5((9*Hq-CXzOMRNUG<8Ypk<^cAyqEmf7~&3&6V{F32c2Rq&=@kK=v*Vf%J_m%I|2HRpBqgY1P_hq9_! zVMCmiw~hhJ)z$1VcQjWrZ7~fnelvbHstkkl<8)ti2X#mzZIX6^cB}S>7S-6)d(@va z6`G5hUE0pNCc1*tQ%H>H^aMOzXh84YQXmQF-2zQl0q6O_^+U|qhWqR{@nasjw<<*y-Dt+Y})EG zuQ6e!@77w`_iU%_x9#n-E9qM+A1hX>T)HayL;A%~k{#8L)ZJ9CRQFUDRIk*d)GGBN zb*4I~_NkkzE~@LQwdx#oKh;asLv>rVPVG|9Quk6XRIgAUP#37as+_8Esur1upgf|S zszj7emA91{%4*7Al`bWt?4UTMY^3z1FG(*<`V^>3(PIkicOD`iSbOiF{~gUS1o zzoqm|(Wcx;ZJx3dlPQ%uLM&LkqJyYgqQ@oEh2vtQ_lcD{0kQn^`tm$}I1# zoh%jRrC@f(8&?{R>2K->BhVsR=&i8Go*2x=Q?XJxUb!N3 zVCDtY6xD5YnfjSJMwP0HgIAWOPZb980|&fGeeXC`DRQt%``u@JhF5(B^%e6 zJL_NT2k73x=?>ICHnuTsvdpjsvN~sJvL0lg z%Xw$3lh?>z+kPQG-O;un(>bbWj+^%W2xMUh{)E^@d?MBpT>#A6NCoVI-9YW4&eEBT zlC6m_H<<)x1Z)kb3w$IpTzg%wB}SG4Dpe;S&JU4~6u zJnWz74vr}S_uwIXFF@||I5G)9QzGVpe^pphVDe3{p;!;}INB|6EO0CEGq5`l8%Pg4 zMTdd~FNcqk1A)MffE;M--yawNTMv$-`%x5)3n0EFo@7_JD9V}Y_?F++j@irY)ARhc z^SLEiYfMvg+qD+$GTi_}1B*TPvfXAol4UX$Yf2CWpEfz|fU-cdU*AyQNP9rjPu*Iz zMYT~Ss77SIS5;9>QfXCVGhb((hmT`a12XSs9#_>+HOX`-H!7o)O%z8JT{47>sTsX9 znr76?=#!y=|6v(})A_VRX>C%UrFBWe)Ba1(PQQ|VH+^Y(UOJlUgkrvtnw4@ZB|8Nf znNm6VZ1SPxEy**ImM8U0>X)=Mc}OyhJd*!NEmZtZ{l!pZK4@K&<OI8*;r zzfON#f7Z~}@XC1IWH5a(U$bzQRCBCJWlA;uVY*?`n#P!JS(;mk?9sWD{b=DO_cXs3 zJ4GxbTfxQxC9#3jke{gzR6N~{iHF~t=*28$dcanN2|&*7(j#G;?o9F|@fv@M{f)Ip zi_r`;I&j7he}CYkr;@84GQRLc!8*rgh+CU%Ey0etvN7wwmTBfB^GLJXQp55oD?a;H z?huZ|6M_$(_M7VQ`P&y9}L_=w?okuVas86z-HLvrNt(|rmp?iJ&ePCL;pn| zqMK1O3?2?*m9Toi4gW>AqDFKsnux}tNPn~kIFj~I>*;=-_pZn6>EL&CnqLPN^X_(Dd}a>-$}QV&LF;D`3Y9h>W53Fv zJ8zOLgk_bbnz_szG9#sC%Iq>*%@fU4Ob1Lkrq0H9#@(VpD90*-zQy7I+>iF+%NHB0-8W4okIIqL} z@WOfVJ>uy_8xxc5VI1@sdH{8Znn*^7-(jS*7_|oq{U`kceU$fv=Zd?qDB{d62s$R_kG1~_3?VW5 zaaN+`nmOAv(%8eGHbfgv7?&d^o4JE|t0mUjHfwzLvE13VWqEh=XFJ{$&T~#d8WdG_ zb#M>&M8gOn+F#Sp_&)^Z1&+dQuTAI$G>pc<>~}QUJa8>=8HQ^P)Qye|+z90UpZm## z@pB(<(A&sU;C|p%x*in$h4`JMa|IBj;f04CR(qXXDGRx7>1T>JY7C6-fo53dh>VBn zpELF;uc&wGUKvH>Tis^m+LYHxza@1`u8~Zpq@*p#c%!_YiDqt7wNY(WJyWr&+L^ai zEkUBsD7PsXMRi4#VyEJZ;+CRZ!6{0ipqHjIX?W^^)Ve8|P`D?O&m|vDCX6aGrLo46?PThh3sriuR~ zO-Y`ZlAQ7}wQ(wyZd6{^?9{I}b}_n)v4%elDTX9t1LIrMP~#qBCu3z}S7Q%jBjZqG znen!9w=vh4X|x#^8Qy?g2aHvXCS!g54?U7+m}a=4U7p@;!Hu}~bM1+Z($6TzD*jPC z&8(TZSNUCW4rEuS+^N`<{!iMx)L)bTNm`S5Ix!=$XX1jS%c;*5H5F3Y;=~v6jTTg$ zcWmy6IQ{G@v9YmJV*i|dGR_n?b@t`BK69kG_PB#HTTb2^vufhlDK}?Lp7$hiecFJu zrb*S2_(Abl(#Ev&8O_p@(nn^5m4lUA6o=DSr2I_INclbEZ&kT!YlXE0 zWLfkgv2Idya+{RI^cqS*T?f34Pd!d&FfFne&6|x5{ds*Z#P3J?Wk85-8vZa%vDCEY zWp&STWN*)_Ryf-;6s?6nBYqMe!8em6(v=!dCo}b!iExYp0@wz&2K%Y^)O7Lypfw41 zVI#l`DE(`Ed%e3ow>{Ne7mDf>ekrJ(pJgAMH^4S1=b!BQmaV4IhTgi&fB8T2C)*F?eXAS!_Y*kjvoSAtu^O>b&ZwDm611nrn`7n&O(G zZ^o94;*490u8Lk6mow(4e@b7S-X?8O>XelIDY+^2l9fr1k}f5^g}3aau}O21CMO==jVQ<2Z#BPa05=SHsg!f|-ZHZ(;y@YuQ>l6M=IG=C~Nvx81Ah~|Z&9ti-LB%8G zjm)E}{c6AZA59BQp0)?@zu~%3y3TOS)NRm@*IzX>&|lWi(Vfr@2RdliO4{SvZCa<6 z)GpP8Gu`RKQ--8Or|Hv^QbsLQ%ubovYSxxHw-$6+SaSirKwQYh2NzXYq)6~2K1^zz zaAZ+d0@63>J?L{F;p)O#3wp#~NV<|bCPkS*%DZ3`CC&x~SnyQ<& zdIlYPWM0#FDQQ_+y0WYKq;8|ZZ?qbZ7%PmUjSY=S5F0+}TWdW!wP{n%!FP?zoG}pBM>8t4%>mM0986qGy$4moEtIbM_6?UAk*>iI`3Q|0#m$F{7_mlV=}j8wpAR+5Hsdw9L%_vfz(UeoO&pA zed>Ry-%?MezE4|`-Y4yH>cNyVDMcwuQ+`j`ow6fkS<1xZCCRmuB1yj_c21a+Fe2e& z;+e#EiAf1d6Jiq*6VwS~5`Kw474M9{wrK964~e~#C#2rUXsh6qDVfzXPpSm<2=!rb zLWi~Ww7+O>YL05YXmfPcb=f)&(RI@f*0fL;sV@UYS*gCIPSE_We`xAr$X88C>9lb4 z9AVb!X%{E&nrxfaab|;=y{5jJSTX+o_z~k5M1PE)8XY~p`S=eLx{UugVNuNG$#ti? zX7rAoI7d6rId9|K(A@vcZ@6e+a+_pFym8jo7<$yMVb7wTN7;v(hZu*jL$3{MGz^J~ zatu8_lpd-X@?=QLkQGCp4x2gb&Mh7s$ryQL;c2fO`X)$LeyqZvHJTZRH_`A_J#||EOaky%DhY@9?=rK*l zlF=t)9#0uGeZ;J!IWrgjlDHu?Bcru)s;Zk>)NDj_4GoP=O-(n9f9Nmj@^ps{n7O`n zb@rv4A35K0Lb*nJsdK4kWuP&71omv)Alt%-E{)Ptg%BcN(7osknB;Y(Jmg-oKJ4tR ziO<6_U}sQW-(Bx9&mOnv>WEA&?Cof0SLLCc zEAzFga;8&Rt~dtTb|qs?#x_MQ#X6-wGhbB%=UArA*45F;`glW{(P$b3T&J=*+x!pk z&^DG9mUPQE>%OeA?5nxxQV|u%EU;6s=c4=KwO{wEkvr8XKK*twCqH5K`udN1W*()xrIi{2-E zOFEPMIr&xc6!0bwljKC#qW23j7FHx!QmUsXD*n!lsLIuS)nQFH%|oqHJ5V!D{hJC` z?NP_6535hB3n5rlQSMUA&ghx0OuLiDr5#N#NPn2NDY+zJ(xR>jKa#yk|1EUQx*x5pL7?wI|4?zFj&;u2>Jo49|>-C@%Qp6%DHPmkV{doAnLr#QG=px4eLMb-0(9a?vA`Z>du&2W4?{;I0i`^ojAJP z=r3ba$EA#8#>I{sKF&1GJ@(_6qoe1JYCUq&h)W|Dk3dG$AND26FtqQ`=263k9T~oD z_^siuM;sibALAW&dV)MzHKR{l)ch@rx+YS|^^%{as8aUA(LcE;`D)q(WuC^WtE$l$FGaI*VH5-lS;i~IqxzLPjh=2eX>2g; z)1T09H8dC*MzP@^5PYv0UKkD-)*Hi31C~H*g>|-Nk?DuA#;_CM_?)TUG|?1f@-kJJ zBh8;dLm6)xnZ|b0JaaD~@9?Gz<{^A7F zon%k2Cjo-RVso>>ZNbIwt-ma5&AZJzEz7O{79T0zWW8f~V;O6yGygJ0>ciAuRMQJ- z`NkaAbYW6+{LXkuyghCp`d5TGbZ=0pJW`q`7K(-m-T5x;3G{W;GU`e?#3VA;umqe$ zL9ygrz;*etz{jB@qi?3VWM75y!gHBfKQpmu$CB2^ybO;D$y3}8cqdkHAtsZ4it&!M zp1p+qi8H`G&G+DskL>V?+A1a3<^vS>{lQZCxcc7FAC`j^$GbE z(i4&pvM6*?SZUaau$5s=VY9=&DrI56!b(FAgbG3yg}4XXg3bhmD4@nbt$c*+ip(0| zDc=`_3F!~p7d|;s5Opc$V*Kc&*Xbj(J@RA)g2Ij>oQ9`8q}`}NtA}ZQ%~;2Wsv9+t zl^e>OOCEv2tGMKsJ)tM zyRuu*b+apJQuRbTG$Cm`rSoIQ;r4;Hw6U*R4b2P2Y;W8$YH{6!8hce?MPu2E(qkYF z+Dn$(JB$CdV$CKK$p{(87_XUfO*>8B&1|#HeA<$0xoa)5?ki>&FR=yMPTE!WS0xJ^ zEu~dus&WcoeuNc;71HwSP_0v)tv;px#3%=# z5X&0}8g`GmIOL@PK(+4$ku2V**F%eey_TqP>{bo zpOd#PcT-Md_NweXIcxJ&1xM5Wr0+K*#pri=t3h8qhT9zqmmG#M{%gzME2Aq~-u28;>VA}SV+oBRe>GaC@+FzrIEtlFlJ4cM`0{a6mwp)~zzb%UZstJ}rOTXo*)z3<{MuDk#x(#8wVP9S{#WAb2qikf^h|<-i`K4k& zxt?|iN@_t}Is5h3>9ipr2z%G)hc3(-NTGsWPd|ewJ$MmEyU@ zQ;TWVH^mMB<;f*p_GIf-V+W+3okz-8oVqIYXa+9paQ2_<;LODIh3Vq-Lm4d@>oQEC z`$DdVR0JOivINeQ2M0WncY*tTC-8XSoWOGmtKtc0rogR%GWq;~T*+~vm^+o7!w%!p z_`gN7Bn(M|__(MAr% z5mB90=V%BT-QE=5+}UDnxzw_w1=Z{|=EP`2!`}K!wX3UJD%;CXmxVZH+V9#Ttv{@M z%R&&ggeJN%6y!jg4Zn@0#+Rl+K;bJb@2&OV{;##2FCjTtjv0=L4m0HFD|Ia`FU@eQ zb__3h=I8?D*cu1imT10aI1MO;I9Cl?}>Z9tTntQrV{Vx4^-2rWw#$Da1 zE>*`A-7T7>CTqSJaOU&Huk8lg3F{5>CvzI0@?KhQn5&IDjbc-Pxx#ct->UW~oL{ut zs3_r9+^v$AL#s<>7Z+O2SghtZrtO9&dX^5Yy{<#(B6Kd=QJROEZCZl%rS32wmY3)c z>pvN^MjsR2++lSu78IMUQ!O>?O0lIT1r}G8Z700 zQf}Pg=)6c##Ind?k?s*b%0hvM5GQID*NP`VqLad7LYUx!V2>c5pU-{Bv9MVz8B@im zp?A=hP_I#5l9!U)2&3>#_x?8ZOEq0l;iJ^VSW2d0Fzz;?nm z!p6bcVK?9n2nOP`-va-Ss4v)Nf;TCSf~G!Xgs|KBrzDpY)G$V5SoEow@@Pm9u{`Wz z2o&^LaXoNUKq_F-B|IHR#HwV>qZ!HPi5&zM!GmyvxSRNd=#Srsn~0;}+VM*KT|z$L zKJhG>O6jHUrY)e?FnrY=2Ptu5SJ@JEGE^R+bXE3F4q zw5Q;HURQ2Q?t}c8g1aiJ>U#(%_^LO)9HqrYb? zX9hD<7zgPGX}we{WeoW|If~Ro6yPP8Ehw3PkRKXx0C5Jf2ayNg48cR;k?`|~Ren0Z z9zRd`OIV&ygVzL)z3yhWWo~obIUfF=L0%Jl5WctITl~`f)&A%Fe;_TWW=sX%mH3ph zoo--$;LPS*L~_Z!0A-*=u_fq4aB*;ZuzwIaaCN{b>2h(Mu$Vuc`S!JGO^nAZ zPqqhpC;J=wC_9d|jup=GVbNF))_HaedjWe7+r%ni+@?EIQz&TiGV*iE9IBP(M(d%I z8BWYx)&q{3Yvn%X;do>CjlwkXCE13+iNRbbbV)cla#KuJ+}T8UGA}hZ{dCsK-0cMe zs=aC-^MTFwPqt*e-M~lDN+xX6~U*E1v(MD(>4OTNk!_|z}(sYo&zR$-^aPY!Cz%eKYb`OB1s1re&5)-H*WA>UYBmA3KS8rzU8dSn@H}6em!A7DkDm9X zfKynava9Z^wio^>_)&n#-&KGsgsI4?zf?X2hCJu&gISrGf3lWm@6Xwjo0Z#{J16&E zUTHo)e`|qT!HE35`Q`cHP=0>?k%EE3$*SHWlIm^Ys{(VrbKc+iUsRuT7*nbBmp!$l zvgEU45(u!CvUR0%?Qg6cV~%bD=!%PVQ}pS2lkT@}C#VOAj7=cfFdA2ZVFwFHj1T(x zy5-s^4Oab8%hzj-V@zB_fqG@`(KLDd^O(7@sDu-#&$1w5c5`NKiY_iBqCM18u_@rZ zFM6=w%_fI`yr3bo&t~E?lCT(oN|YM9_AP}Y}la@HBNI~F1wxd zuzK$BdJXwdeDh%~@JWbPzXtyq$e-v9*tPg4q!h|UdIf7Fr-C;@AQEatco8I;FX|RW z33m&=@qhE~bN6!Avv;zNFqbjHXl;~5q&LJZL_fka!VN+Tz7OYtk)tgB5ByI1c_EtM z-{1pqGkgi6+3zLt0{Rv9Eq(zA-djl#Bxo+_9@&ZXi8P<&N=zaQ5n%X71Uz9IaRccW zrJd$OH!(sPrSwm959&`UiL!(;K-ookNA;qPq`U_I@~8`G8FV^>z>H+g;)uE5`1geu z#fPN(0v;>$AvwzX(eU_FDW@}6Q*ADMT$orWD4Yq(oP?rXkeZ^-Rp+Q( ziZWD;f=vKi{dv>!s|&8E3c#4&tbu9TG|#n(+79gmZLa2zW|1aA{XlImx>cku@-Ff# zDlhs1a)39QU`>}yb!mPnyOVAtT!?4KWyUqf zcP9KyG9_mwFHLSwrX}r98kH22L`lLVMI^0HZcEvkmXlGKbtt!~AV@W!MyhA2vx{yN zz1I+RX@*;-Yvv|Xm%*+*rA}21%kRr+%{ZLuo&+Tor4pd5sDfP0H2ogKSbdKUr4?wE zI%iO?*6PDS?K)RS)S-1Fv`aMqs{g3nidZU5;hMsr!Wflr(MrvFolW;ad!p!dfm;qP z6O%qRotmDS4o}^c>=7Ro^+CBi_*39Y**ft9VJaWb9nYD_zRC7v9$~o9_>7H=iS*sn zcVtL_e~P(}I*xpV{D?|Ik^Fxk9>H?GKY8VN&h#AcJnDJYv%+JE`+T=Yn1>;j!22nr|umhd&>A z1&zc=u+?~H!Y49?nnPDJ39KRZ0nS$LD2V%oC+7KcS91Pv0@>B9v#cVPC-W$?m~ohX znKqj$ATK1j612E}%yiUP|60Tbcq8mS>>oG}J_bG!9tk@Hx?U#iJp8Jk*nbeY8#NOx zK`+OUFmte;*feY+b_8Y-MuW-03}C)s4cKMa)7Y;#3tma+Cb7wfsW2*Z0pNNwHHfmG zQco$MImvt+7CuIOUDV|9^<{?9}p}TrAmzob$DQWQTon& zvU;p8MpvhqsT!B>pZz0qO@=Omka0CjlcUZnDex_LQ*b^1eqK?|=4?aO(yaN}ikzTa zL*A(Tto(Zgf`T-tKwB`XU|zwgf|mu43YHbH@{M`WSKG_Wd5C*o6(n^lX@;CG3i6%o5awB!wF*(YzgBN?k1KbeowL_ zRVV&V^orjS$BOBVc8gpc(GYG|wuK!Fiw*q@2+W6JE@5$D&@!b$`6_%#1S29Ke3$Zx zk{b3-c_d<8bYUDUft=`-a4r5ryj$GdxNGsF6Pyy@@e|{g$KHxA!C_>e%f)}nU z3@ezOe=#2h<@M!_&U>7HqR?4YUG$H}Uvo$ET_Y~i7PRH;%!p5R#5F`73|kgludoG< z3!JK;C?+c$ftG+FX`<+j;3l8OUB@Y6!2NdBx!7a{Zs?+I_mJvrrQk@E2hP%#p zJL(?k4tJ|?9dKFfyvOOKQ|!pkPSMUqt_kiJyn1~;!WO|B;7j4F5Wap9$Q+Cx-ix@K zd=Ow|9`!B_Nvotir<>`^>C@=}w8bF_>TIOQ`!0 z$_YvKXZg_)0=OD>5LOK{!=}JK!Rz4f5Lt+NL<5`n4WR>sb0?yXxP#XBm?+&SoCS7Ut}Q@(B5!`HdhIaLcpi z_T`Mv&d&Uuu`<0bts!+=DkEi1@|R>vl2^ik_>9=yG3Y33#HMgm*pkr7khKp5j!7E5|GQbN1UDbdEV^S?-o~x$_2Z51DsG67R(C^X&Y%#)J>F=5%!YS~rh@JjY42?cYVIWh;SVIA|e!_LWIMA!Pmpf;R*0G zcrU^YvD@!2|3%0>sK*#2HVHQh-%n^GDv3KuBS22Z zCM%ZqNG?chk}*<_tVSN7kOfOa-NH797e#WTQ)0I!h?A0&`;%8D4J1sB%a55B{VV20 zd}`9#G;QXL?6Wxsa=Nm|XGt@DXUNj;rT?43&d_97Gvw*#)1%UQQdg%;OI9Y%k3S## zJ|-Y)Z{(_oHxZ8TyAVM0lhCAKwIW+yEIS~rlIX+^(I{bqpq0OtFXqGfN&LSB-hx;` zfc`86%Z#qAhC%pqMM>KVuE;*@Gp@{ zbW!va5=|HW7G?;x2r>j{{zv`}emKw04P{?tl`=UDDSZOni#9;LO!=GaPWXx2hG|80 zBZvDv^z%eS!sC5E`xJQfc-(aFb-V6%);-gM;PJpy?WqN^UE*Hh_So&1JKg=6#|zJI zUa!2@_$YnW`_g^a!gO#x!WD7Tug~A#AFA;Dg!_vIj$p+=$#Py?uWs8*B$c@x=& zj7IX1;m9g5GrWwvj$DIO`+xTT%fHTlqW@iFIm#0?1$7g302P8v^G6^y!L=}%Z;sCq zpGiJFK3jd>`-*%mzEgdV!@OV)*gbeD{5xVS;)x&6FT>C5*XeiO-+?rtc0d?Cj)#9i zbdXxfaI%o}g|w7ZPntr;l7CV$v`~5={R5+uiDmv|kK(QuESKN|<|t+dPYz)PD-}+% zH{!{HHlBcUf|JNGayD`vaCUIS>`K-imYFq)E#-)~a_(ndDEB=#oTFpUVF$Bw*^fEr zxKH>l0){X})FXyIOFIKRU6QiZE?xLI@$~yh1HM6hM^@ zNZ6u}!nZ;<0fR5)3Aqf8lwHAk!kWpdW~H-`%)JmZm+^^lj_Jx=&pO1Ra~Jcm0*A0i zG$0<7td;%_=n2dTiVevKGlW|sQ=-1bWXB3)?J*Ccr$!EjJBKQR1_E;f&IYgoRPw06 zc|pwJnIUIG_lI>URpGXX+fnCZ1LFTl8c6j`=Vk24+>^!4a>~p||CQ#RT%Vwh`4+ie z34IJxhTc=UL`;t1CPbzv(%y!SlfSIdv`lK{?%J$?@Nz#N%@u{&3qMt`4M%)Nr zt=t@TA@oYfK+uE0^8rm#lGshyELb3D7CaUo7u!XTMIpjc!4UrfKZ8%@=kPBI+J#c# zcHw*B8DXlRh2O#}=4Nq{*?FuAW*@}(n|_pb74Uoq$^9e|VJ7Yb<|t~Be-ok_w%AwT zgYeGuI^$LE#qqrE+3bn*_}e4h{j2+Gca_^)w_?`~F1MY3IJ2D~C%luJQ;gFN=K|-S zE;C)pu2bBGxs7r6aX;m;0ZcP5ct7*`*Y^r+E<6@~2BAdsAvPnHB68tdVbBHNO+I71 z6TBik+dK)L{+@-NC%saz0{U8}4FdS{HUc?0x8=U{fGTS|L2mTf-@0y=CcG#jM?I96N;_ z%zDXcW8s*WnLC*KnOB(inb(=SnTwb!nQvGV*kzn{?i^k_-<9vjTgiRSb?3yfFR-t0 z3b`q~ZvG2ljHptqlekNoB)cWIB=^7=yGb%$k|Dv1p2;34FEngOJNw!})TH-5OC`=H*_|7~EHB4$LUm8YCaE=>wfM8uzsONc3pg5twJg{=))5sd#cUzl$6@3aflAxb3aHn9r-1=oOijW#2%`e!3SY$wf7ot zj@KctaxbLkI!~#`O!pV=QnyyuJFdm9L|0E&nd^WX-tCDDnL6 zW${|(b=K>t*DnC@Y;S0m_eUR{&l%q^-$lNEV7ahGu($9y_%Z|*vCuEV?~VU@WGgBI zO-4V*til>`-ngxJGXY0Dir}U%YJ~P*+Q+(oR{U z?3wJMEK-^*@fV#E&JipXIPv%MF9|q;B|?sHmhh3tN%%{6OSnNeC>$@GBHRj&_=q4D zD7Ow59ub!x_ff&8%a@(=%u*Xl7bFeHi^T<1F(f+nwXb z`N7@AE9BkaXYx-7@&(_8yG7H*kfcnSDnrSR1gHWo$)n|~0c|mQV;b`0Gso-$gXj42Eo14&;<_oZ2>%P7~$zsY!# zgcwFp;$=7@<|q0BYCf_QFx=kox3DL^?|m@<+&jDjK?v{g%Jx!tiM@in61|GN>|SMF z2CpbDAIS5BXPqa^W3h+SeUE#x+YPr0H&@qHu4-4T%fBwyUGBIJa}9SLa{cO7>h{20 z<$laV=rO_LvM0tf*R$Jmx92M_oL90}qt{BWd)`#96P&7z>t$g>K_|@I3rhf|M|q@QavFTu%H*Qj%Io z8%cM`BgqVMD!GGvjZ#R3(cI{9jD4(XP9jet@E6_^S4;MRNT!j^kwG$VX`ZB5oGX$G zi2^!5m$!qb;)wvUlfi4`&EhTQP2@#!&u{}do$SMGSC$GC{394w8Ep&&M1MnHMlYm0 z(YDa)XeqRKS{3ayUCY2QJ}_^y4zp))k~n9%T&|8giaVA&kvorjlIP1S<6Y&)@mKIa z3zz~4$Q$qRr|?60_jyCSEFP8T#Qn^D$9=G5(*o^^r9r2I&xfoHwS|og8&Z;#JHpE&f+LAh@MyQ_k1;1= zp*Un*f86KzqWHrJu?aU5CniNEy-S{u{51J@@*XIekVH%PC*B%+H6|zOOXNS1J`qzQ z%n@Y~QzH&W+>AIJQ5}9&`8DiL=!_6W&{@!dr~&`Vu1GISo=9B9GLc=lOz=^V$3Mo; z;63JzXK!U~VXkMarZ1wDkHrjkEIYO`=|yg z^o0h|-q2&|qkv|Toz9@`pz*0KluhI-r02v>gg*o?JQ){;HDU(P$I#BGWaOa#Eq{*R z7{qym1U?6jge`GfX;A*eS%$wZH8doFe5A!;ME&63M?K}F%JN~!vf!ia7LscIuUC@sptXX z4dR=hvme?|>R0I3?RNrX?j`<*k#yvEs)<%gU&M4`^>QTK z2mEQm5Yb++3`H)3$rj6A%RYk%x=wmc8X;LI@e%ind7?+6J)-rZt)io%tD+mCygolM(!3IHtpkL@Ld?;o}_Q>YSS1L{f-w(a2oE$MC5+8Xz zDl94`3K6+95*g7LelOe{?hSZD=kTKNM-g)(tD-WZ8PWg5SYy_LW{y4`^)d2k#E$T0 zWo#HVlo?VGyfZj6*gNQD&_6+!f(`{O3MvUgDCR2=P+*mOuiPmhLDnt3B&A4d#mB@1 zQKfLF;I|-%Z{u}w7lJxR6>Bf^7n2YAt$|hv;5k5EOS(g15GN4b2x|zn1TCN@CKIj` z1BmlUNYWtLjXauslfnl@n{LWf%6N*NLIFj{D)MkrH_32`}=$>|fybz;BEn0dX2J0g;9vz(2t+!*{?JfkMhycn#bJH^4P; z9e`;SybV4Bz7c*N5O#iuKtusz6k-Um8dNwhBOW6@`VIH<@x%Ht{Um;2e(`>pekwnc zU#VZcALQ5Xx6p4V2~Ql=`3lZG)d|y*(b4zzlmE!Z$#OE*m@+u@S}KoZXLwwVE3`6GZ%n) z(0TiJJa`H|xhBOfrq-GJ7gtvsvgf2oAxWn~?>4b|!4sjkyMtVlxN7+I>Mtj3x zGEJm z!@=)DzJy)~gPOy>D3g^9%8ANx;HOntsLWNWm6ggqP)*2*kci-Y!8t)+f;I%T1my=Qg0PCOiqndIMQGsZz&JqZJq^If!le01IdXrocN5mi`Y!$6V4JGgyHzP_$b^5+)msa z+-%$~{BV2~VI*N6aRF%w`54uSR!HB$gy^h6_7`q0Zyx^)7~{_Zn25!5#W%&z#izxc zVt-Mm@QM&2hytOgm%EkoiX#JX{mq)lVl(eBS1>!7CCof#6qCzzW87fOVkFS-(2cb7 zG$C~?O_4+J4Rp4=w&)s zQEWK-CTA|UfalKJ!dLUZ3WkIX;UP6O+)`{)^eJ=-PT=dnwSgsp1oo!mcQT|k`dl1wjsB(+PP zN$ldMfaQ25DigjI)(Sog#_+%M8+fmIM(#;4qcOAJu$$OUtbP`jxttlqIK{9qMt~GA zhwe<*6Ur#4gTsijmcHH8{T#Z!J!Zc;W; zCW3+-ll+>zncPSY2JF~oQZ4SDQ8n4O87gdBq`MQV`gfD;TtN|1ce#K>S|B2tTNM9xMYLViGT zQ8v^{)LYP7y3p4#Y`}pZ#Cl*euszrV*f%(ToD>(2%fjX2GI4RZ02~SDg8dhJ8N%+y zuE5U3_JMq*2RjW^DEDFS;+%03oC!A#cN*`EkH9zL*Wn+7NoN|Ng|Hfoa?V5<(M+65 zJOL0NN9rNnAd3M1{Th5z$Eab{4KxnzFFKq)mi~wl1rpgyOgE;G8N*CuDw$NqSH>Ym z2P1_3oIaHv2_gwu(O&-LS0fk2Jm6@hudCB6&94*)oC=1&Jp#dd)#_6+|VcpT^N<8S6K2hNE- z{8oN7znHJ%t3cE7?fgc5KYtbfEQsuEfmSe0a9M~H7770XvstdFT=ci-rI;aBi6@BH ziO-8)ivLKwBp_3jc!+u0M!Fqv1 zK;~cMxAXbD3%oiWoV%JE#ks`X#q4A1nPL#AFEN%f#xT+ubow_ifmlPI2ei@*wa+kP*SO?bnc@u6E))B^mJV!zB!@tL0!SBK^ z#`oh}@a1>|J{O;ikH&|Am?*&u@EklHPr_sIet1v(2;5iPOWbYT8Qd=13fyE|6F^l0 z*ka?2eS`&?wMJ!ayqFig}BP5!0at)a#f9SpI4sT?`x<){yBE6z zfV&EthYbbSalyO>9r6I?Z_I2=7p4iqRA4L^H6{;?Mw#G|3o4o>Oc`c0W+G+=7z6fV zE@NI|M`8(B1sJ``uoJ*IuoHU;j08?N98L`SdI7j>BW^ry2saP647U!q6}KCA0Cxm; z9Cr$Q?z6aaxbwIRxQn<;xGT78xSQbHxQ}~^`xo~K_XqERhcI|HJ_MhEFUGgw=i&F@ z?-Sez0R$6BCyx>S5JQQL#O=iIq)5_u(it*}tOo<~TS_nmq8z5WQj@3?s0XOuXhNEv z)&nN6H)%iVc)Eg~PB+o(=Z>I00?+2^n&eE^a@6lfYZqS{9XGj={ z5W~b6%b3U5$9Tx}V9J;}W*2iC^Dzs_if1*jma(p~o!K(Bf!z(3Bi&^G=1@4191Wn? zdN_Y^)^c`n4s%X%&T`HH%Iz3uA7=|^1!pE_0;iUv<-~Eg9B&Ye&$HLEd)an&G#kfy z&pOVU$EpG6#xP${uTxJ^p*{bJ!&AX084V(UhMG=|q)MrDDiWac8|4+{F6AQSC}js_ zEoBj92BnwM0aA}DkXY-%YKcrr5+#PBqy$l96cI?bITR*^L7`J<|7i^Hj7{Nz#6?O8 zq=Zr;De;t4N;U{n28tb|G7XfmlnD@6P&5O~TUJokQ?`Re7{@8+C|4=BDGw>n!2+ZA zl+WNz`~YLY|J#02zEi$XK7ixTDEBDW!7Gn|H}*I9>mf=zr3Rcf9bAS*fs=obACu3L zw~^4Z24+MZAX`c&1(2}BKSby;@f1j$W)a(nCB#f(5RpQ3 zC%h-zA{+r7ZZ_z0)dUTgHU<#LU?%(x{}g{2e-OU`KOc0yR(u6shfl|c<3)Hf9*!Rg zAoUag>@0xa7TikQU$`l_E*yj#g)75ZaB5r*E(O3<33`ke$Hg&lWB_0kghSwbab7rg zoGXa>PGH75;=kHR@XQ70hVum741q&|7n5;J93Lmcg@9RYG8jm-0Qt4JvAAyBOo05& zxWl;1xW~9Jcy~MjM1pv{8eff{2;S;8Fg`vfj35vRL4;gFC83+JoN$P6570e0A`}cb zpIYJ|SW?q~L;>uNid0AHC#@tMBHbo^A;ZWVauitwrcdL^b3np*lzbELVpPiqE?>KkeGv>IAD z2(4zChL%T52W*j&7C__D$TWYNJM|a!9rY2I`~7zs^xt{$|AyB>|E+iX|Nk5Kzn}mA z>J6<{N0Aa?%j_r_RjbkC$J=EvubTm0? zfWDN`p>kw9QXH`kr9|Hm=X;p*@Le}#4s9Sn!SAqQuS2l`cNM=`iktE1a7(*Z4aY;zoQ zTz9;1{3?Zk?bD&9*`+0=ZKbn;63O|}S7jb$oU)`cM_EtVy0S}U-@q2pB%ts&ulz*$ z=L%*;KG5IUQSomjt+J?cu<}He6A%__soGiftvaN-sd{(ypPIOuE}(RYs@2ynt9?@! zQa7&dTs^MdR==tKIfv!GE=8{`e`4d)sOjgH2xqelSk;n|~~jFAGvha*isKv4Lv zrpL{EpjN!4`D;s9OH0e{mLIL5tqs8A;oq^WvHG#o#-1Ac2a-WnXex9Fde=s5OKz)e zo6~l%?P>S?lyW@Mur;gVhPdn~*Tm?Gy`#UywEbo{F6#AQh7egU9 znY4odH1FTG-)KM3zM{Rqy{^5mJ*=J7KCJD2+kv))ZBUyIn5m$l_s|(=In)LfK~l(V z?47Zj#!ecmg~p1$fHLlgKP89cpVlv|*VH5H&ee6* z#n%3=-466`#WgQ$me*KoXw~wzd`b}`lZ&br?^ z09o}`q2;IL6wu=-vxHf^%(u;*xXM5Z)TxvAf@5s2>% z2j?v^cYz)8?<`!fKM-1Ed1U2StF60=J&JY3n{3{;Qrl^})IPh!rKGXsrNiR5TdFU; zUuG|RTi#mXT`|8hu<}fmz1pdIaZPN^*TyTxPagkjLhOVY zKqg5sv18(?NeEz+Gh@=#E<{%v&~x10^`aZsozz{|J-7Q{_tPGCAgP|*V*^sDvw^|d z2_XLaq1Oc%3UYfxdXs?Hfwi}$cWiGLu*R4NY%$mMZUwv55B44f-iD`oPlLya-Xp#H zdw2A1=!KR8_27Q+;tJp+72hlBMfUvYxzn@1X94hJ)AR)P_;f!8>XQ9HNLAWBtm|yo zY@pXIob+kZP9TRG0|ZeIfwvnu;m3q66DomK)<5Hi#>b8OJZ|~8!f`I0n>&r2ULD&y zOdTHWo7y$)BidHBWkR2zIZ)KtM`OFj3R=%Yt#z%amhCO-<{!;-n!}oIHjM#h8Josr zj(#zE+-PFsmd3P(`wa~Z?xW@aZ11U0ue(*}sQpqqt`-h7NCnk9s*|d&Rh3kJuk5d6 zRP3%OEdNwKqdctaQQ2Twbm?ax4_r|yaeM`#cABFML_dbZ1t>ONFF9JWy<|9=FQI9Os zE%D~}=6PTf@xP`ireNbOphHPD95&bt9{RuaIbc)#U%CYC8|`duqUMuknMS4YRv%Wk zs)LI@7i}wQDvB!dP+e6mQ;mUCSt=e-YkE<5u5f$d(!%M5-G%Li&4rDijVWv`>;TWF z6wWJLS-7?EaN(uGM}?nN9$;5ekSbeMsp?m4P+cz?SrkxYFIrf1U(Hh2st;?3nikDN zZMOCp*l>DWp9?fR+Kf~nqB0s_|EXn#wX!$_s6+f?-&``_fGSI~%H-wv3MU{I`A^l! z>K!$!YUkGV*SC+VZ?FUFhtx63CVn%fWkky}fa6tAXIo)Av;9@a-<`H`Xke*e1|~Rt z6Hyaq0w1dhlRg4%^F08nwcW>huswF*PWcO;zXNQ# z0tQsjz?gvM*>He)WNL5 z0^q-71V-3);L%n7pH>R|jEccA4Y0*X2lk_3gVI6PAa2lmaM-}Rf%`x>doS=TnlaEZ zPzHRylmqku_x{(w6KPvNG^ZcxH}}T@J#DwXXMM-}mIGfI6L9KA0OjHxK#x5e*nwW} znFjP*e*-tR9AJky(8Zjz4G3PI1U3;TC&Z241(f;z8t2*B&~c|D4(PdhwN*mrAko;q z)>o}5Ez4V6fJeolCi z1-5pZ0{}M7mH=d-l5LqbmCbCcur-3?lWct;{Puw`$FkzBZkAV;W0u(<_OZFdX?0hS%%WdNvZ6-k=eJf?{$A*|LFd${qKPks%c>Qz=?sMz};9k z*gLpm@Zpf>kYp$exLc1OnlZE#co}X4Z7p!To(HUwCk!PNb%J7#`XI3KzD#gXGM>=`!%re(s#qU_5!t4k4Y;5zOPQS0LRt};N7Jk zcV=8*=Zuc`9SQAI+itZHpu(}et-FAByJxeYDP@dxbZg_(hBc!O)!(lBR)?((uPLdX zRduNfS!o0i_A75GdtFvm`WC>~&#?}`_iM=_AesByzSeGl?7p^rwn`9Y&lI;73$6F8 z)2&%nAIn9{TuX%|!NRd1fPBa>%Sellg=|q+vMp7X0n0keS<4IS2rJ4;1ImjjKs+Vg zq%ip!uNeoxPW_ue9Lh;Q73_ZBqtohKwFk64TD!JDTcoYh&d{C*o6yQYT;%H~>%SWy zBY+OxSOL<7w+URZAX)x&j=x6GMy4@hEpVp>oj%Y&E zOVu7lC8|9t_ri>Vp8NxO@A62wDLD<<%d&1~5i?6Oj)CR!ThlYrex@Bvn-4bOElN9@ z_8aVJTbY5*n39RlT$`1Y^&H9`%n8eR1@@Zg@~Qd%791&Dty)mDOubL@QpeY~8t$2L zfKo?6@k4v9V?^mdIi_N66~1~(txH{f{oRK6#+75-n{3T{TVZ20(A>6*?cY27#u3K* zkN-a5+{CGqk|(|E>g%R-ukMlbZ0MEruIXd-&F@F`clUn>mg}bmd4o{f;MpO6fZTDw zt?}~E`^lb@DU$;x#{&0m{p7OA4U-|@P2LU6!6!{_2hZ%lt2BHvW3t=OD`1DT5m+CM z9?}d&3{imV^<7{WHw{2F8ra4>1>Qvc1J;4a0TS@Qe%*hs|9bzm{#(G9<_)l(_Zc7$ zh=4$4@<1*G1hb9ch4ujlh|QG)wF9FE+6H z8-RM>eUq;yLNi*kPV+zu(*|mDwI$k7+9uE%wYA!6@MzUe)^5>0)p2yAbyxJ^`ZWeJ zIQ37X9*CfQ1Nm;2$p}E4X5s@Kzyrn>qtI{_Y>$Tl)d!hwmo6G8AH``7YvR?%)leqb z+UZdJR?Su^L2@xz7*+5NsOhBVf5;!or{ygNn4XyPAV-@0|8R5`&{1X07RKEN26qTD zxNAJ=w7a{zyWZAx$Bifu+}+*X-G;&4-R;%?R5*}fO4Pmlh%hb{Xm;vKRzPrV7BPm8gqwy&2h)(5fx*6C-jkkk zH`CR}@!Y=KRt9x+su}sqc*n3n&(XEiY*e#U4HWC;df80r07*abWRXI+3N}(bB$vn_ zYaztz%{|DqaVNms{$tK{&P~oMZY#L^(_pDqa+g5}>Jn}VR}VA(9XPi+>o{>pGvRQU z94XYj3pwYx%~%Z9F^Ea?vyX6^a#A@?&Kk}GgxiBl<`!^|@mlbR5aaq0#)NkW1`Eny zZ|1;1|6J5j)JN1o_*A$;NQcB>M9`F<%WuL9!eFI^^Nhn|pJC5ntz>m$#u?ukCi)Ay zhW3JHq`s%xDPJfq@(*&D+@7?QgdzSQ?jpvCeBu;hXTl4@4uXp?6n_kl&~aCAXzXTe z4~!T6FM3K&73wp@N1e$gXT8hXk+mV~Q8pXZKBp;q943MNf;SRwlcthglv>!Z=hAB! ziA8P2`z8U`Q$gp5MbT0fI z>Wz=FBf0)~KP0{dK=H@&2zgiGi1o6-S@0VUV;=zLy9wauk65?TcV!mjL6T({zzd& z4jexcJeL7yuV>T}Jsley^TdwjwgI|bUhc7Yt2iybG|@02NgT-=k{8Om09eT^;M;~^ zsn!DVa$Wubz$N`INGhNeMB%u4v*2f8$HK0KZ3_q@#|4;szd}ZG6yvn?BiEHp$ zXU4zBcgEfE@xZDp${i6q65~eSM)RVBBZne_@SCtcbUxG}I2`Hif9+fB#koJY7CSW# zj6KUnw^}Sk=2}y}k*@!w(`yc@8!4yD5$PR?N<3K9U6=*Qr$hM1Ak}vu?--BCJ5K&@8kM z^f044V-pk2yh?XN0ECTkg4u;@7WSwT4IfFR2xD}Abc%9GX9~D4a3Dna>!9e~E zz8S70I(G%<4QDu;%Zee)<%}cro3xkI@6@K0b}*|mfH;yc15d`8u?sOTF--Ie^cr+M zdN=wHMu0hmor0~w-oZ7;wZ^{0uETOLpE1Rl5$Nma8ng*5LQ7!_E<(>oFGW|O4d~%H zr*l}SD=19%-t4Ja2eJfN-7>#qHOb1!I`KdHdd_}KZ!A)ZZ%mL87eW%{0*a10jQWyx zntqEpg0+uR#;Xw=5;u^}lxvkiwM$FW_b^;Ag)QT)Pwk7GB6m;E8K1%b84(9phAxD! zM0Q2vv6R@8+}wEY_&Qi_hw{?$HsyB%n9#cXdj(D4JU9>@Jqy|Zt^Ed2;_?B_G5`UB zz#7=iCIgG*WTGk|ON<9m;bMGI+!-eVRkeNYXF$K4%w3b4fQ8yAwhxNY579`pb7Xad z5dH}WR7ZGP=x1nKNEvD!Tojyu>_>=!#~?1u3^ext=Rf8@0B=|PPyIgw?E<|5gFrJ( z3JeYm35*Y51J(etCh!@-AuEHef{NhoP^%C*R28}v9uba*-$j&>CsB3uaf}5F+h)0` zxtiSk+@-mPav#Q9!_9~f5Tpv&b_;=R{J)plDc&63#>M6E;_oFoC&t0I(itwd+;|dv zjViY%;0HIxN@JE78CbYqqPwH+=vXB3BvKp6fTN=*v_JSQ*fQ|Zf7qAs5BZr{O!`?%=lJkcGGvxEuIs`16EX zVlim}#GBlt-htEFY5G0JZl((41~0ogdohQ?ZNc3MCG<`HG`M_Lew)_>WO>_;dbYF|#PoEbT^9C}Vx&d8juIqh=#Y(1(V=PYIjHjaBhm_T&Fvi?d% z(>6f?@_@aFYvp5veMN62yJT?%OEp=Oq(hPn6HI6e-==g3U8$ZH-p&5(!0up|5IL-k zNC5%&IOYT>Bt3USyaoKkH^l!yUcUowyK?}Cu1buLe~Pb{ugC7OdUPI+XNIS<`>A^$Fjz|5W$s1pgYKuEww{rIL&kZqo;1%` zPhU{V8@hkEe|nn3`1RbJP~^&6qy$}5&0e+79~Yh zQFBxWY-eIL3m!yxPXixw;f(kzvIG9?)JUuF)9{IKeV7L1;*r5DWR(A_Z@V|_kpM)^ z;jDG+uphClvzjc;5R=PrLElenRbNrz6}RP4*;L7A@g|W@*pGjiSIXscve|f+g}DaG z($RDVO+d|{v>_cK1_>m57EX&jj3r^4VgAFMz#PQv$Lz*z#LUMeFnSCN!^C(n7qNOA z1&7$3K zG;&kI2AmfY&AEq~lf5eIN0v47Pi9SKDlE2!nUgbDX5q3MW-mt#Kygt7RI}`w?EYEX zvrJjUEDAi&%{ra+HM>uCYPKx9Jo`Lq5UMDrMNSF2J9<8*AEp-D9-D`2gR4RCN%)n7 zP6RxGNa%`Rjqi=~WA9=qnA?~bto31-BuoY-gt?8SV{hV=xc7Jup(SBGF-R&P|4Y@= zCou=I!9Bq5BkUpWBb_K$Dz|95>Vk&5=HXVFo$o}syL+zt5`n?U>QJXJK0=QUj_!{2 zjj>@-=f)~xOJm4>&}`qr<6^8NHYBV4p>1wGb!+i;0lIL8R&b`ho#|?+e(cQiYNJd+1y{ul# zT?^Cv+&tgxG8@c3bFF!w`I)7QCBtGvEUPRpp)FKl{c4lh&f6#1i|yAO?Hw~55=Ydr z)N$DHuj3IYz~>#?9SZ>-JIArj@c?>7EN8j%nDdKk81N{Uy1u)4?&F^6o;BWH-kA5P zFUvQ__X@g1LH|Dg*TBetBv2Q)i3~+z$XnRvZ-)rb4|*5=JKQ^rv=zCR9G^Qch;haWoEn5Hk`p z2Rj6?1Jn_ z_MGgisKF>ZY9s0#>OATY>Hz9q&KQUZVqn@~PGG&bez;wD0{%LIM%YgHMI1;RPn=G~ z6V1eB#QUUnq^`tI#1+Ie!a0JR&<1}PpTLvx{ct~UZ}6@0bo_Aw9U(j-%84gQT}gb> zX7UvBcWQH*h|z@khBJUSTS%2mmJe4o(=5@wG2AtkSdy$)?MGcrJz@V}h%Xd@M%{}j z88)6t(YBGF(KgYEQAIRAS`oEJ$3%`sQlL@SGGqlG``^2kzU zAzPZ6*P5}W`zD{M7m!}1h98Ewp@V(}fFybP68%p@iE*Owy2)tzYW7(gTPm!htY>U$ z+Yfut{?#FM9B{UBPIaQ3W1S5hhY?4y!|1R94EeruqBGBV86e*nV5{zM{dSYw>pb0{ z_xH`KhJ8HAr}CBimiSgehwy;!wLjUvD)0{o@_#`?(T3;{EHW_g8`>&Y0%rp!0>=U; z0iOLH>58NwN+gQZAghrJ!M}r%(BA;&;D>KU21O`2(rwqe$0<{hR1hEdx4YMNr1tg$#O9LI0RZN&P( zI7xGne-UN4Lzs!EOIceo-lUhOEr$s5^tAQq@{Fk&zcS;QyE02M+h?%T>(YM1=T@aR zN79#P7&DVI|75Mp7NUmbj6?^peQ@6hPciLqGYND!Y+a&|t5KY++Jg$CvQX`_pJ(6C{*6jS&4JG{ za!PWR<}A*col~E)E9VPbP3tg77mN#Y3roaa#|81Ju(=*3N{E+8JxG}(87Ysnlk|x^ zk?ep};?9%^wLNtmjYPW&QZxz@i*M5O)W_6pN&*zW#l#9i2_zPe0)=lFegOeT>_ogx zT1=Kx;3PpkKwC@S%WTNXrDH8SH9N~NDIyjvtY|v z8<`VPMJNDIe+akQ%hB)AebGTsBcehqpc^+v<{;R>*FbTgiJ#^Rd&@ofZmWywL^()y zzwMkY#k$uz-Lls5w;3`004NmClx!Mh>S}yytTqlZ%+kMt=xB)+(Uhqd0l5t6q$~tL zN-M=T#Ww)CPE{7DnyVJ8(dwI;H0bXppwIhI>(mMKc~JYe0Z71GSkGOcwfr4=_=oIG z?St)u0Hb`VRz`5=dW;BL~p<{5EbW9qC zfKg*gq3-#F9feh3XJgOc8beO&8vIx&=Uv3^#O0*nq;+Hrr7`6qbpee-drcS9_cMCH zarFq}8?yo90t3<0@6o5hsrMY5c`GS{$Y;q2xi_hVc#iOr&;p->JAtdf)!~lgTjHts zRfKMYB}59TC+REs3FRGaFuj(^W1G0A1q{(UX-v^XW!JpW$4qRi&au*c2Oy!7gWtk` zh1W(}M1+wWQAg~rm^bE+HHvl)-wD+Py~siY=@{4;5cxmBS~h!Wo{p|V&X_}Ex7+Hi zm#qygoy?7lR}8g!i7r(;Lqk&|s!hsA%8rWZAX9CWb&?iJdrCG+vc#vv>7sQ&uM7xY z2~_-V{1yBtznp(jFkP@uh!vg|O%+v$9*9%LMnn}O5L2q@iFu+K zZJuWS%X9_y^mfJ?<5FibP_F|>jUXeU6%X6lFON&0OD zqOq~@glUC&i{+=yYJcZUb4_xch5N`7kIGx*`xM|H_Ta#vJ{SxZ2A2hoK|QrNh({hH zr3e?9iZnq2a{>FF>?`)Q^B(l(d#8D}d)m4cu0QVP?gEd?yVBnvAVrRZdWC5bPPAWi zEmUvSxg&CK14_CVoR&q2e(_!LY|yiZ#e`9Mq+v*m`1}&@Sa%2KP{3`DwcIdIGB(l; zRBe~H5HtBZI4$YF$Pyd{g-ZXKIw%GCJ7r;7-}H4EWf_`ua_YvEjx#UK>^I}-%my=O z%=FLPG4o||*W?+=g5+rOmgEm9(^C8?TT&JO z>zG4OyI;k2$9h5C7=Rmx>j5jdAFdKFAP|U2#LdKaq{gJ7q&l*mQcS%}@5Nv+=LJIXSFBDjP8o<4%6p{}QVq9lQ6-hK-HHpU&sv6|y?KZ& z*ZI|(5*QHlLC>%{njf1P+mqWk_B~b+Jr&s&_JzC8)*BWWstqNEu)%DQ7%Js_A2uhk8z6*g? z0F()S2#<+$iR_8$V&dH8iOzXUFq%{Vhq?~L!4YUE%6}D|l%Ig_}r?rA0oo_Qv zCND}Imu60PWiT__WtL|?$ZC^?bjkdkxjU1XaUz3}F*t*gaXqsp%b1;m8jgL0`+~nm z@Dp|uHWDfc%ZYtR&B;?KEXqg94hTTIPiTe-eLaBJj&e3 zyv7>ATFmakX2GK;YaMGavxM1*QO7VdYM8B=d*O52INx|m{&(SWu|X=3SE(jya}4_d z!0SkIFYs+bQbNm#e8Q^2{?8hT=ykUZ!I#~L7 zxCXecI5KV#?j3#*elk7-!TShZi2X=0N^`25=A-i%sZ2BbA8ts%6su$+#YfdwjZ!NH zcJ(}cZ+)@;DS!ZT3?xIEp_l%SzChnkSFL@Z`L4dHs!>uDL*+@bG^t497T19H%P7K$ zxFWkKBua=@ikpZlB;zFOCBLLoq)TKG2+l55qczBN9Zvt!)YP)dUgGNIKH$mmG;uF; zKlXO?Jqm0>P9YDF$pL}?q5n&O7RU`u@f&?n?=A0g?+)*J*sRI!nSg`u>YC{)cb#_q z=WgU);qC6vMD~V0M-owE^jB;_?!5Smyy^ML`DZ}`?F#rwY5}vLOMW14UZNgSPBUCA6sJG0hkzw| zBCS+3QQlO&0z+$G)m#9tB`Jc6p7KA6R*H7=m-0=B9B{MpYPnJNpY)#Op!kwFS@a%U zejyQ2#1O3#j}f0AoRSU_%1jCCxI7m-~aHbqI}T>v06fshUHBauhc2p zhlV9)ly$ZJs`IjYl^5-+@s|c>1l9#!2JQ!9{yYBOKAW$J_o%lRj0<6RsSA-f{@CeO zjOncYz2>>{gM6Z7jc7W5JGU!KO+QDKkVg}zL3GvtY(q>t^glUiC}wtE*4wP&EOOSs ztVWr?vqol>W_QW1M|D9NP|HzAQP<(1VMB{Br*IL%bmAUzXG$?Gk2#s+=D!h-k^WTV zsQyv!)i&2P)$P$I>t`YQgZh2?h`yuFt39i2rfI7>t{f+qN#o)Jz^AO`_vLQkIM}(Y zpRCKQm+U@l0^7^PV!F#{W8S5YC6w{7xV8+;`IV+dme{>S4g0@9SLYSn23z zzizLzPqrNcNhZnG&6Z-@Y_E6rbx-!L4@?UB!@S79v2M9z`Xg^gJ}3WtL96_q z`D^nhzbqTy`p{`GHoaECXS7{j;%)s zQ^^Re8SNp6AwF6g#=l&xXn-^Y;K_eW+DIl#PXM3fi(-*{Jdj5>OC*vu;ugXr-Y!lm z^E>@HtraCmE+ezJ>)7j^Gb)LWZdoz_FvBi4Ymu|$yymz1s%pEkS}_YQ zj05to3W{QxvV-!hx|L?WE=9lE@X^Gzw6@;2#~mA;D(7>T)!oExcF%IVKq<&{Q$PdD z0{NoEdC{@V_T6&RWYS;PwpG5DxkQ_J*Vup23n^S;DSk4Rj6Rby3sngbyX~_OZf14H z`HV^F-!gh<7&BI6EP!WR1|M=4cVsMs_Zblxqs)}6q&hKxSNL+Si@k{XjZq7< zpBZ!x{UvnFcC(5R00azXU1W`CS{NJYf9M?AKH5m?V(K8uCP*U1Q{r&?KT4ZLw=(R^ z)$H~hBexs?vXA*;LB0qrxuck(X{Y~Yo@JZw?B?#_+3LLsTo1bU8|diQprStOneUqI zaN0ZCuGuY)Hujgc-{6bxZB2#a>t=gH+Z#L5z<%7B@9FHjhv-78@af3js5RCnb`ScR zyAzdp!}CmefjoPjAa7t|dHhlCquAWY&5$54&{OO5+IhBd)+}?i!KHoxq>)W*HSIoG z1Ny;O(r=oHwS?yvju%~%aAlv>$%Z0phW)Dju`Obi!}c`6@zMF+mE>xKxLUY+IyX8@ zwqi?_>5}1>&aZAKZ!I1t=xEJ1ZqkaCGo?F4$N4|GZCIn}-)MJeyJ>f6bE)Sk-zht& z!>L=SeoA-ZYy3OhC;UMC7bsO85f&3zKmgiH%p$HO-h|%IUE+5L3zU!+k$#i&DO4(p zmPbFw{ELNVJ2}W!UK0Ph@QC=F^rXC0*;v(I-AOZCd&tnlwB0JSI~+Tm>EK13?0E0+ z!>%wC%;i!W!^d2k} z*CmLG)1-NFf?~09yK1L;GfYAJr&*&JpkAU5sjJi?6V&1c!kAXoYv;u7Z>= z#+|{J5bOw%Lz+oOQ+7j->NmRw2jMp3_T#SMTSd!dH`Ek;u~}-n?A+tN?0Mx)@n(6M z&>7t5o(8DACH7W!qCIMxXW22+96Kv~63Ef`b7-?Si;avN3laP`JrkW+yU)h9HaGpJU!c~) zy1vbxM?X%Z&~25CY-qNzcG#t@WG@TSnrSrs9V8IKD z`U=kQa#$bf^Qhg)$3S??CmTthNMaD=(4?)TpQHz*LK2k}Cif)&OEFLm!|pJPW~6Hv z;~8t2e>0D;?s1a2b-agyEa5}(BIy*FL!Pg=r@E>|3@a@i>{^%4+thc-e>u?AzsL8$ zyUc@3bRBorIZikTjz;!_pwQCoPDfWK#`V^7*0&)L38F$DA`Ix_nWMuab>X|A2SI0G ziEoFug?ovM1&F{Ts|GOOQp0T^(#o%^masHAB``(1@j^O(5e5Yq1g3@2vhA$1|Q~ zu7WP-?@U%kVfvMHTzbQ_pXo{IjC50aLHeZ(R>sH7Kvs*a=O{C}2G^3{C4Hc7U|i*l z;1h*ECBvn!#27s z8$9n1I6iJIf4_K={Ice|@sJg9G(nsz zT{ob!x!kqc*}|@|Rl;ML^|-mv5Y@iaT+qsOUk!OihjFX1&S)}9jB`vp^A+nShuU?= zJJD}|F2MM(HNuOIkM+-On|lF#Ew2)sgf-D9J}eg(n;ktE85s2Vr+LOZZ#kOT##n}! zTI%;|>gAtABe`kpWjq8UjwqWmFkm87+@$!5uR@DvvA+*M%yBtB@6u?jduqcVMA!2^5tLU1H}`huvCa+^cJ$ z`m7*Ht3)dW4SDI@BRm{f_R9IqxK4H&;|;`#dl5=8r5mLor5^=N(NR`YGiVuf7o&(t zV?Jhi*rV7#;DmpI_b>mCu#af07$fmZkI9E9wyRcYd+6_(_F8it6J4i))B4{3Cy?cT z;&1HT?CIkQIg=b?p@jR#cF|T~gALkFb7VM~E{A)*=dlm#--`?Zt+Y7I3M0$I+R(<} zVni9}>wD?F=vn3->P)jwvldx`=67bl>7J>Jain3A9<5udE7CpEkJUHTmFOz;>y10j zx2$&C8pjCG15&+Oui5j_^V$2*Kh!_VM|8XF_bj6flhi~hn%{!?h$bbkB7LeoWEW8 zR?)?~(VdJ=Ut zWg_Vmv6^s_pog0&jesSP2~NUV!YNP#%3v4g6GFtcBoakNd&wNln#JzP)^J3;sPMRS zi}I58u5r2Lob8I;ZSP>?SwBFnH^qF$xD5D@pMd*f)cOFe-bvj}bx(Z@(eBspGp3qY z=0fW@doRaV*9C6_e@(Dw=pHP+M6^2gE#56&8n2Ack6(zN1=m&*7_{h-`C&;g%U|kw z;@aRiVB2UZFkLmCHsop(ih4;)@fdlzzKPZ92s%lw?Y@q|!I5Us>Cv;X#kqyKU%{jj zOPKQpfX%x)f$YiKoqwfZT0w*ShXpAGvkN%+<~(9zbnewyyV#$oIg%UR7n&2C82A%N z_Mh^LVL)x7_aArINwN30#w~Nq4@{d3`*kza<;o7SLy~e4PtcU>W1VAU(^ypSWmDfk z@iv0~j0qbX`zp6TkIWB&UH_cuhWL{dCwq=4cB$$$F5L|M6Qjd)$I=#>2B&Q6?WdhB zT>rQ`xVL(SgYk8|d!6f#i|$+t*yE4(ziq`fF_a+*dm~39VU*k7O|rhehHX!G12C)s23Rwv=Y2 zH)8Z>RJ9#M1bG zxw+AY5l?t_=wZ<2|L7g!Zsjbn@37h|-7QPDN{dU9ibOEh)+Fz0qDB7N zL|JY|w0Afh$`3vXA~TR8BpImy&2lR!^j(7ugLN>$c{tP?*%WB)6MJ+{Fv=Q+t2Rl0 zi46R?oacZ*kkW53RDYAmBH0eRsWZ z9dzZogf6Aa?~=M2Idh$(ogExs998xMV8P`g7K{0onFiw$XN+j$SR=t`H=Z(?&4bNe zbKLyU^2U~I?`ZF1tFWdnRF4q_YGit~_6^6oh{03tYHs^w zer+6}{iLLc(Ofq(L{FmZBWiKeF*`B$pw${gufhz*DT#HI-ShzSHTwfs$18@ho9l2L zFA}elHj|B%?Uy%~FIU`DQPn547+}<{(a+L_wT%D{I$PCAc~UuCzFE3oB9tV-%-kqJ zFZOl%9cn5i1EHLx6)^s=z1&s&OCpohr5Fx#X+u=AHKTM7jWN>+=wP-nam~lAEA9UP z#a3lqW)f@vQ#_I|1PFH&YXp4}^#!#7g-5oMa)=z@75pH)C%hx7NFnm+|4k5qD%KFJ zn;j{yfNPJhqrhCXnw`=&3{K7c)8nXZMl zkLs;rtvmsY=`*Sh>THb_e)ogHYMNo0Z0liP;rQSpds_Os1SSN>hJHkfqt9~(#An36 zC7Q+)aeVwvqB#CDb}3>H6GQKUOZ-o~6Ww>+e>tbyKH5$@L+*DjHDaA>nrofv-iM@y zDB%Xt$?;eD4-5MjbuLLSA2w_FtP7QcD!)}dt)5=puDU^WzpCd|sLH!l1FCG5XDVKl z%`G`wyu4^_p{nR~fiJIDd{AsdGz6~iIpLmQWMRYK*gS#)hs2_&BPxonj133-;eyzp z$d!=FU+*$oXgVZCIaXREZY4|xD&-Alv z4*wlG8)66F!*KO*!~t@e**D0eaHTmWgO^KWo^8z5kI{A2Zq{~EA5&43GZY;8G{A$u zmV_h*NkFn(az*k`+Fkldj#IRf>ty|4z(%xjwU{ToAb2WxB`g%3ki3*Tm1C64Rc+Keb#B9N(;3Sm+daotr^30=walXd z&)Y=zH5cAdZ9|)98C&Rr>Or#IA_;#2=QwjIRYEKyj3x@ne83OVXb+gkK5k3?QXv7P z;v3=~Fe1s7&XXON?@>HZG1Q3qGK}Zn&@9ug*VXCW2D;(Ap+vt?w^X}X^G=hh9;F;2 z(@FS}#u9}%nP0{_OM6e@k#K|uL_K9GvyxXR+9pd;^3~V1THPewA*h)!W}LO1t&NRm ztFtQ{cU%#~?RQTAM6}zo-#A5Ml&uha;z*feX&c8;DCutH_TjK}sQI z5w#IjM_o%j26J)KD9@=wse7mosZ7dUDwU?9_oMfqJ)}3K^XW$!m)Q#b63G$eO07%3 z$k0YlhmmfN4$-bvA6AwshR8oEDwQ-PvQk;6JfM1_ouGei>TI@IX4|^ipF20ZlRa^7 zu}|io8JLK4M%KZuy*Z+e2BTqEP9I`lVy~k9@SkuZEC`K3X8LdV2Y8RVi(GY{C17Rz z?a6Vhb+rl<#AfHU&l{09vw&B;w`_KWdDi_Ze6^_ham~n@aLxJJ=CwwoZcN>Ob+7Ac z>lV+Z&wezUR%@;LFl!F%-IGh!7pD|d=27FBf9Y0$lU16$d0fu#1ElD`@))t zDS9q;Ep|ILAZm(y3cm@?@%M61vq#Oh_0QE?VW#EW{lQgIBY%c zy5_4zx`ZY~N^;vIkny1Jt7dhikc;)VKj+eIe7OJs8SE1>qnhvz; z?!sK&UT!*PB5NbFHDf58?hn$AQ`b=crrd$8rHb-}N};xggn9-&iLs5@k2#pRhSiMm zl(rPMr`yz0I6?QK*U(N<_LDi3;WRG&JtLnfL|ETA7A~7NSMXl!gBiEi@-!t&y+HfQ zkZ%TlZav)TC2K-B(JRm*Bc?*-XB17|Ty${0ZZi~f_P z;U@9%f-|DlVzy+ztfRc8e2$`v;+pa$q(MBC|sDIq(z*(U_oW{i4Na$y6HUH+3&Uj`FaSwVzy9`DHN6*vIw7;}pv?>i2vNTR<=4qMQx4I_=vGJGL zYB^?oW-GCsu@f8x&abW_*FVntu2RUCSl~rceZhb&*em!5jzhPiQ=_g(efT6eVcUm# z2Qk4;$l*YRe}-QS#pT;j$Kb5cx7_Ikp^~K1qB2DVwW>k&lNwEpw&r>5(Yma+G zP#WTeA4i)sSYc7*uuZfljj&` zx~gq1zbA2uHVa4dX0s6t;~@PieF<$B+oDmfw-tL)m%`dj~VQ5ct6dpJs5<6SKfXCFsf+W~8``M3!&X6Wx|->93*wQwZs zBJLqNE*!x7$UV&K${!~n2p!_4lEbogvX$~N3as+Enx$#08KUW>$YQc?ad= zbj!_pTSq(3G1B?3hw1II%yGumy=bT`i1&-Xm= zGWa%J7daZ0N4b&n5njXs&$l98a03s^MH(dj$!}0#DEzk=DV@ti7(TQr=g!(2ZcU(~DUOUcCIngU6D zRK$lI@!YewH*(dNr1u0pI8#~gSf`kW=yJ+VQa!N&bbGGg_JYIuIAIYnkJJ#9@KR{* zxQJCmfM)`Bu#||*BJPA)-NOVU;H{eCG0?AGj7tM66$;D8k}>Zvi!e^iC=3<*l2Ap` zkv5WtQH=~0t2ryezQo%m!pmAKf536;x8|f~u&%$Up*3J<*q_^9+T*sPaPrT#EHGa; zoiO&+m8sV#^AyF3_Hv%AT-HT;Te?cBkak8S*QKqbZ{^bzGZiP5S;`lxe039bT+<8$ zf{p5}nl&)-t2TBsFNX>CB-=yVExX7*-Fnsh*3?j6u9>GAulS>2%05VX3I5^uSuPm6 z-_KmZJ}#UrzpA-p7;0W^-|D*Wk$6sedH#PR_Wb^ZAM;j6$Az9nMnyT1^J>{W*P&< z7|a+C4V&JyHuO~bQ`&7R9=wjLX>8gydI94ND~ZkE-VjZfw@@WCJ9YI2mT`>Xr$MfN zsORhU>BzbXP%ExPw1c$6V5i=vo1QuI!|+D`@hIaw^=% zW<%9is@|auL8)@l*3Y@#n;t+ygClKV#G(=^0Yh$ad{e@cmy|!IV11FJgjqJIeEX~k zl~<}&HStpx$3zu>wDFE>#x+u=dx$-tV1T$JgkmaHJ!Ds;%>$Ga+qW;om`Sr zRGxo7(IYoKF*7tVoN{3S$^Yqncn*xK7{*0q-Qrp=}vMvtM3j-c(UrRrVgwa#qcpU{PvB_S>FBE>h# zWM#j~29%0RN0%6j2>Hpmi$fQ@L#(OVWa%+JhLubI1USJURY=Y!E+pXb^Y9#e0YO46 zAjwHvND1Oa=xqK&Kod3*+YxI(8{a^hMJgbzBbkZo2u}%E{9=3)+%lX3`yK1X_QSlz zT*I8g9L3zg&cOZxu@<4?Zx9EPi)el5OgfJKkY(Ua65(Vg)cv&MHEmQ4RGC_ZQDd>& z2H74%8|{dVV#~4Juq*AOYz-`(jED8N_1$zobQH}C^-9%MX-z&cf2hg|5)2a#x zSm~lXrkVi(R{v@yXfhyOszm$7KsGT=+e{he?$#BEV}w)ceCtxVMmam!AKKPhCK=pX zjb@;Fva*Y8rueLIIo}8luLk_Vg4dE}iZabh{XUb#_S!Q)zzqCCazamFnqhJ1SHK;3 z7CIOfA(`H;&b8KEhAK@BRDB&3O+~rfIO_rPBBPKtj68~P1Ye8aN*ql-4Bv7CIx?J* z!%BtJiW;_x{SQmctN`m(0V785LGQzmGgi=^QSMUoR5A@u@5*S$9M1}JmJ7tv{>rH4 zqCUs)(});uf+LWiTdQ5FVX8hU!wRhY5d0rFWpkvvqzh#m6-BB6DxPwHTq)};odgK> z4AFR@M@Sa_3%4@^B2CCT%4W!>RI$IZx~jA~THB&dGkf}+adS`3UCe?h(oMy+#VJLJf|aq)NW!z*-PA>PjJ6_6Z6dcV@Hm+4|Lr~HDRgzQ z9x~SJY5MMl8q*f@9ZN?G-u&2z=v>;R`Zk6-Q)`RbcHch7w$@r^*=AmEDl~2|b~o%Y zwl?jwO>%RPiBVUgrf@{biSpaCs1@(aD@v~y#|tLp?h1Z!FEAZZW(yv&xr{yZ))YH2 zj(>#UH-i`N4~!r-C0-?`P}|e`QJ+))q4>#5NP9>o(tUCi*pwNRY2@$Z3*_bGDX`{c z#E-;*gz@;vxb9dib_li=CJav4y_mC@!I;+A!8i%N75)S98u8)M9cBYYzp@&HoE9QG9Z6vuF9p=*?@gYy_TLgd!dmaCQq=B}ng zrspQL;hBD{_K0SQ`iFYEnhxjm<;NDQ2DJwcYAm z<8I;J>fYq~>S_;K=~rt%V@$V0^F;MYaYQ~%)<)7-L=r8K3`fKTf;s#vl4dH0ez_&n zH73w0qz`Y2Y>IY*<5kOWakzt@;^=D5H9au3*8Qz41ZO~vEK8!5OqQ5L&AAg8w`fTe z99VYa&|-{||AF#DNgqmo&$4p(93ePG#R@V+)&c0I zNK?>ehq34JKT1U^osMn%%M=Df!cK!h_fFeEwM@}cx?DU*_*(Ezuv>6jI0>5W?W8%9 zbE5l#&w_QLV#z0Iy2!&D%*vtfrfs1MnR-yge({w6V(%)vDk>9aNqR^p$*gj&e6IYb z3ac-$xxE8|e{%ce9WS_0v>hq+mA|RDGpqfqot3Yv#kGIe&7K{bQ&Ycj{+k6y7fhco zo42z5dwsON@tnnVp_+x&gDR8C55VmH=n_&f2J#+KAf!iCn3KOeT;UZudfR*0qt?%+ z<%ZS9&z2iDj%}#*n&rLmkhZsyAa5)?t9-2etouv#T2-U{s2`esFLZL{Em=uYyXZY@w#n8qm-* zgm#{G3!#y%Q>WMdPDG_Wp)&kGmEN^;AOSFWiZS_b~EJ|F6cIE=4$@ZWU48O-?D&ICyU7s$S|Te0w?bp_l97UlqXk9K1=o~FX|ZD zFX}yNiRQQdiaBh%?d;&9z#3pV%N$YLGO!_!H!Rdo(CKs+4DC!UtO(yF4eX0?^XY|_ z!axBfksL`N!##5?F~tksdS(tiPTN2^P0Ysrz$$Tf@XPT+{9$4b(n!)zN*V11;|psb ztCq!N$`~<*p0OT&6hrAQnhy*-c4{4UE{Igys0xahvz%|27#V;lJO3-xhm9F{uYclmu+D?;TY$lTI9+ zQcKaE(+Rah)Gm!g{|Xd5zhjVRLSRWaJ$fT|Y22RsU(6c)H?}aB9OHzKL83uZ-#q^< z|5tAxM}Lz|>xK}{2FjaKAO9zNB?F-asK2Q1sB35w>4l8(2qT@D#vaX?&sojZvHG#d zY!Q1b^CNQy3&osAzYdP?meeD(e)N$H2CEzQyF{TrV|-y0IN?bg*o*O`E|b z6p}B2HuEuvpL-}AEUXtD6K@lx;=|=P ztFmhXbv5`RnIZ)wi89tTw;OTk*AgY-wTf*~0aC+j9ev zuc5NQcK?U~4Y}-pY0WY<)E-c7l|NTBMdT->PEi*@KyX!{<*nxSWzS|lX2w_<&{RDI zjk1d(_Wx0I7Qj)YT^Gh3_QTy-+?~ZGgm^M;Jucnj?law^JsJ=0?!LIYYk~&}?zXu7 z_b0_dimI(ZUb*kR=R8N;NS;*gQx8|IRc=vHbT!S5ZTSw9^OZ~P9A)QQcbH!pzZxd! zT=33sh>cWyR@}lSt6W;EX`Zu;7ziW$GGd%7XlrbmshJ|_&$-9^m$8@Lnero73lBcr zpM5juP0stAWjWd$M{dKsew6ogHggqBbdR%Nvahq>u^+PDGv_l~FuO8#(a+QC(>BvK z(Jq2xW_a$q>`hrcGA^X&rWL3CO6R7xNc))HKD|Deb~nQ0BqjY?R^Qx0nvP}Xr3!0G zn<{YBD8C}>E4z+vRCD!&`GV~PZkK@k`{?c1wHOv1M4p8?@a@1|-%#%n*K^wf;}?B~K5UejY%oflrjKh|qg3%AK9$>@ z*%J(U{op0Im)Vrrm)V--!+u-HlH5bhNngI;bE=`TfXRWJQQ zi_Xpk<>O9!*fLW0TiHU|ouA7lL4Gc#HKm-OO{<^_=--*0VE83mj=SrDcS1f$oN8k-CF2A2rFYf~q|(@kn>cZ>l!x4;i&!L!D~~>IP|S*k~bz zU7IqTb0^r2~;z=9S}o0Qfgt>=vMGp?sCO~*32 zWRA=#$?Zn(&21#8Cz49;%O1!+OTS6q$=6}$H9HMemZNsJBh@anUb8&2K6Jcv|L`{P znA{_Mq?v*VoZF0Y>Q!nT+B(K>=4nf*+bDGGg}O|j^_#i7dhucF#z z9cSO4_kCfVMJ0>1i@q-!v~cGF@4Q)ae$2u(B{lQ!CniOIl1D@BhA0R@ zro!ZV6PkftR;J6=@vpESuw1N4CQh3GQl){E|KO$3@UG~c#*7y z?4;rVwnf=Qc~b4uY|;5l3hN`=eVfBN)^y1*R9mG^$Bro0%AU(6NS})*ZjC`U}V3Unm4^}3jTJ+(DeHmdoqlfck`%>qnv+{gCe)|gM75?5&#K7e2%@;GK?6! z=$<~lHoIerdp?fgRd|SKL4*j4Z-#$@FGO&NBR)NT-))1V`=^WI{(}$nnf!MH z^Md_@xq**?P+&r!p5Nokz$?5)_fF>~M~3|j4ySaXW4e>-s_WY7e&?M6?(HMq`QA*= zPwzk8DsV?qJS|)=oo7J_JJ9g}s30QOSnmjb+fZuwBRQ3P5&anF$9u<*C&womL~fA_ zNpC3TUxQz8RoPBi+L+kJ$%fkoiXqSV+H_j~P}Nv^kbjKbmR^(Aflk1f3LnSZ!kWNd z%AL&V!}v=7$jk(|<`p){+Qv9chxrR_3WLqwhBOmqiu;M)i#|wm(Yh+PHe$fdoy{K& zKUH?ASFoP%&ur{J{e^x3Qz+$X%Nyq4Vl95ee4dnp@d_hKDp^#dO6FZgvIt2e6?NN0Al zOIU~4%lP$Wgsz&y9cU4A7xpi`K6~-J`3q*ue={#Rcf*{svzyNBSaPvYkysu%9BfH+ z^SpGGImZG2WS!-!_P6$+4pDKiopMw#nb{TY2z(Z83-vaInRl0xNpVt~)Y)_%eLH;y z;~YE2>A=ERJ-Gw;g@VTXCVZJ-k!Y}Vh@van6eBb}b$9g5bYFB2wI+2Z?3QAktWugK z7K=>csiHajzTE$~<(vt}FP=OJ|!|_gHh8 z9{NM-io9_-iY$5hi5V+XKh4n2IFWiHFv|1WgG(AS$TF9wJ$qEXp>h*JE8p) zHx!4^$EuyW{>E|U)z&KxybIvPzr)Y%&ZJB0*@#ai+WVV<3+!=dGSF;R2J8EcK7zPJ zG{?=}+ulsPz7K~LT^O!O-U0%SA<{5>J>(DG4c7E0d~{;Gce`hhtHSZe_QHDJ*2>=2 zp>$Q=$C0p>nNZ;64lxV`X6|h5cNIf=5qZWQ!RSEm z2sZm$KtvwPe!_Xey~pXwaM7&IQ4u>cwq}-xcpHEKBZ+ z*C#E3%|43PiS)d}poa+H+Ly~CWrSjgxOhHe-24s|{C81*Qv zKfNw}9ity(3v&#sBkL+F1%}tlm<-tFJ(zJOeuQ;~(~DOqxCpCpwRADyb6YCr$!XFq zVw$LjFjufwz~&!A?jSe#UStAiA$vS4k11x#;PUCp`3Ym#o9KCYsgwe9kbKp5&2x=a zvrYg1O!PD6>81?rDzu@XI@Ou6EnS^)HrtR_No&C9$nMS+BQ#+x(P!~4T#_MeDE&`b zDPAiu^QN&W%rIjW-A5Zl@#j3u5@saQYo`U%?5P)0noS))<-@eH)PFNHxoenOWRavD zI#}t#j)R%ti}ILyjZSLlYCLS&X)kiNcHVY%aQ<+vb*8w+dwURk;;CO2DkN`{XMiX- zm86rO!WF@RzIHf%%aJdgpZmyQGn`W1UU zDt9;M7Z}8E1IGJ2P)Ka{2#H}nCUKMS`G)vM``7rp1LIuis}7`?mcAkQH*d(BP0SDU z4Z6d=$PjXP_+B(M);8je2%>YM$0O&-=6I-YKuB!zcwFP5njLL9VpJG#Q(fZ-U2WBH zsS`mtCs@B3xl9kIK5G`^E4wZC4=q#ouD?f^liRH@vq*O{3%Jm4CL9}oQ_F z@uVSfH(`nK!h1rDz#Wgo_CNC{U3bYrB!l0TU%?+EXee+Z8@L#^5$_xSEZEaNAfFMO zcLrdjNdS)TK|Fw+$>yD4zXv-Hl_6#vVmyWg-k)8Q_e``#Uap>L*k?KGAl%bDQEw-2 zWA_%^Io=kwxJ+LSKXfM`h#;i9Wpr8oGV68CFcZfIIFi`zR-k*MQ%NU&Wupw*nKO zDKZEtN7f@u-a)7=zOip{R9xK7oxu9TtVN#*;)8z}rOYS%m6%g|N3%&iM$=s1&pg5U z-gW|f%cJd4`vWlRh^+yAi852voo3H+XVw6aNSCaFyqnaSjL)1$u;>2~M8plGZKShg zLHTL<5}8ZVlz*0Ugw>ZpFsjkBDOI^>wk_i`uph>xC1>=&f%r3iM$?Q*Sp#y`(7SWL ziML=*T?fNj{Y#jF_0#<@mRmYnzuE6OdpZxgOs`eY9@H}>pbkb~n%_q!Z(__;H^B$u? zvjF=de$2+1b2uZ}U0LtBJ8;e+;N34}2RSM148|M!dBz6#Ue;hVp)X}V;?)+um9NIe z$g{*IVIDt(G~#Y&?`N86?%dDWV>0`tN7I9uD{^~L7t$ZInsA?roTyDd%qn*F_i%_m z!4;$;S~C`lpN!L^Z^-WdH?~cjQ$X( zpQI0_Zv#Ez7{(CBFs78nXMKU{X9L_{IOJYz^x>E1S6&5WU-3)!tkH&q)-M~4=UJC@kKg@QF6#C!b6q8WiQ=2oUa@R>O=mwe_nzvXP zwqK4~u4Ufaz>204M+v+?Udz4D@y#+yUsKaarem(nHRnn)UZx~du4km=jiG0-@_0)D zP@E>rm;5I?E?=*B1%E?1+EQLiynug|Q^EYssG?WW8s=Td;b+xO-=9XLCo-DOIG4IM zeQZ`Fr-ZVYGf4Wcx`l3;sk^nY^||#TpuHYDa$GCjyFCWnGaH_SgW(N#5hyM*yvqr> z??zxwm>R7g{Wqc_KSXXtJmG@S(9oE0I=~h8MBgNWiIn(-R}#V|YA%HJDwj)~x)(7524P_6Kth%vG^(wA%;{Nmf}z3v(6JZ!IFJ!YP3 zIA)w++GkpA4w+7C33P)v$?eY4uy3$@%*Wh+xMKj{5M`N|8<^{uID^LE!Pw;seF$R~ zccO?dKZ8}GsH~afs^|)i3}oKVtxOv{?fF#e)D~0cPhCH?aGGh_?P>2*yJXbLS-}{~ zH_7!HlX0W9i=&CF*qii!3HK!jKt9Mv@@v=<9OgTV_j2quakWKgKM_r^1pw58MGol) z*#yZ@$={MPV4t=Wwh#;w)B)D?8Nnw(NMHn3bZfzV08-;t;VRK?!8_g<)-lE;dMDZy zS{&Z8PiR|V`M^YjmPb3on84h_Zpk^y8;q=gsZU$PBkV11B++AwwLdg@$`G0<9>wd+ z`IobpZDULI*?#ga} zv)i$!KxDvvD7CGu1MFMeoxGh$J!Bn!B!3Hk8&bqGa~E+U><`fEzrlPAkV!MGF?A8; zD!r2bMX5H4?IWEpJZtb9P&o?0#I_h<-s=by=X$bTbseoNeBBv&6(^0NqPC?T&EArl zIqhWnamsGSR5r$6C@K=;|C6kf4^TYDM9NF5R!TMIQ2Zx*FTTWY&Kbs9&E(PhQXA$? z&wid+Eq!`=$8;Br8mnb2&z(Z+#}-Ipnjyx=w*9W&?h)<-o}pePXvgRK^uFVM#CHVW z?j`ZNzWae5L1}1l_+%t4+B~u^S_6ovTVkcr(~&jg6LKXUkw%xr$b>IHmK+;<9Uq+d zAHZ>$iN}do@g-4Jq%nDxTpm6f+ybh{mP9Kco2Gg@0tX54M7*uN+i`@bPY8&v_$To5 z)bZi|%)m6j>{ODiBfMzuNR*5Ne6)GsxPOFS;XfE?5WGs3Mh^g4qkrT@c%*+Xfmh-z zx88|4zS%1*JB&F7lOdp6qdBRnQ1~SaMa9T%;M87bXR}UnpYlGii^0WpgRzlLWk~5i z=r0+0^x1R{vz*^cc3w4FGg^5-u9Q^gb;@g(dTUBz^7E9wscln!Pg^jp-!wd>LrVGd zdo$Xmm1T_0D$9GuOd@+^HF34t@YFKRe%50nRKC&vLO@Ke52g?oU9W6q#tcm-bgSf+ z=!xWxv`R|K*1?4;mpWxVq)u@=@C(+1&OsZ2OmIYaNpwNsBI~Nyf>h$J(9POGMx-O#XV^V)V^L7_KjGg327fj3KW>QgjMIxfpEHs(lf8ts zo!y@!gE!w!`0N`i0}Mw8!JL1QTh7~rT;eYlEEH`PzXK84ME-i-R<4W91Qk&XXGxe6 zD3W^9jr1whL$qgt4cgAuOvew;S|2^|E%+xiHPj}!4ZIN>eHh{Q9&;<4MstCBfqXsx zCIh96&*`7JD=U%3&e)Odq8?!GL2S|y@-_0Qis9&NY_IC9MgzvgYbt><50l7t33nj> za*wd5Fc#A+l*PGQvhgFC+cJXSM}3m%%<|>bpnT=YW%pHA^ye*Y?3-NkJOlAszRm#H zJx3fTmiwgvcEA*z5KIeZhWP*=DvsF5FXWhL-9*2{W#BoFh)sGO~%V}V()d=42SexRo`Ve>sEUADIF(Gn_PWL&&gGjJ5Ewf z%AMSE(!ELRrnH@Mda5&}bIPKWi_`C>jn8({-f>=w)}TVo9;4TK!v4_F#_`rcHy7xv z%BQj_DIxtV*$29)9_U;gLbFKp0M=4DR5K17TryQNbf|2&xJcv^|4-6UvQgSaS|Sxo zHcQq)NYxPW4$)hPYtak#L6L1|ET>HY%K24Fn9_>UJ?}QC0AA*0&j%>*qYNeQnDGH=sTGXP6vLjvXGBF;WfSQ-ztcv$C_@d4m|`$XH1No2ce$ zr|VuCJm$~#EiRw;4uR|OEkvgOX-F0B9C}9Xj=hZEkI|w9vFC}>WH3<~n;uyfxea+g zrIG(4$0O#5B+>zx&U;7$fT{O}PldBXlHk|iRHu?4A@1f=y8oe5N=lh7O+|Qv?KEfq*WIC%^SLg-GY0}r?{-WW+)q;J3 z6QXosO@z)}2@vu)uNO2W=X%A`7~>7*2UcZ)GmzXoFIR- zs8BWr9VOR6JWFTMSFmdAk}5!A6I88%;4M2!L;ux~#=VYFcxP{kLvK2(-KONoxzfI{ zj891!(yr2&v{LGU*glyIoXDxbaeFAv5`5*YW6x%k(~OjIO4GbudDU|#g6w!=&fJ{O zd0i>5=}(y-SY270Ij{LKQI4pCfQxM7Wpf|#dhq%qV-@Go?U)gJ0_w?u*fmU#&Bv5j z9P1!kC88nExL3HVIW-s;=-(Nym_Jwsc1Lak!FwPB_;my|1;xUK5GGeD$`$VwFM)r` z6y6K=Ms_A=7+cBe&s@bMSoK*|&@#zprLd+luG4N)=W^~Tebx=`4mez-;d`(;6y!zn ze_?m1mcQIr$E)-ByocR%OG|Y$(p*i9XxJFc%t^>($zEssi+(yq;Kvd}Hrqu&8e+uYl;iGS`-ym-{UDZ62T{ z!R=Ab9Kh9!`^d{t1iPZrYjzo1S^u_AboO-L#`_YR0&B^I(d<}*L>q{>x|&SJMUXR) z03g3N%82|!;-c{Fun!_5_+XXZ5I zC6Zo}+mg@HQpr{EEOBe`Xn~tOmE8~-%nd_c8qVs+k}+>HEle%PFPWsCU{qQi)?S7+ zis{U2*$1Nf3EjpmkRo=?Jq5R3al=mv{ zcwSy^XTUT5q_}Zf0sRtix-86v+&0L5{$>7W1cVom{h~%X3sWT}@?r9`Xfw1cT8{m~ z{$PGs(R;z+@DygAVMtzffa zi+c+&UPpEgLje;}l>UW5FncrW!cZIkzED!#$Si# zlUE_rVFj>HdV-n0r{4uRIn}@)<8%g$b*1^=-p#xi*SbX(}-uv$VE3VI;B3SgL)mnu~3hZxS`&b;j8!a~1tFsQzTs+Id5B zZsx4dN#@n3xmXu?R}no|%Ns59$ZCOv_^C!>7+_v!)3_$#p8~hT@#y$OZn7{jA$B^p zERM$a#X^yFzElU#uZObL+yM4$q`*f;H%M z-5paM^GI_e^;KaNYb;gGI;C3gmiWg7`uZrI<+j_ZmE4)Rx3ahyvNZmT%CzI4q;EUy5gO32{swc2G}e9SUp19Sa-tI-qFjS z7oDGQB^{gTin{U=={s>vq?kRJAp`f&5+Ix2hA#Jb2Eu@zD5ys!fs*C~JHe_(zd&6;Un8Vz zZ#%pAss*=_^J2%q4eX0|iH1qMOSm|+8#wpXi6Rf`C&G2Lap6;Y4 z-_z7R%r)AXbd=hDTW?$ET8~@zSw~ygW|3*TiDvv@_@U=%E47V*pm$ksG1WJ(19k*% zaSnA4^$sS~f!U$8pn`}dM}onke!)x7!T&0JSA4j1MCta@ktHqi`-MOF#yB5<_-2Kp z$}&(tSa(C0ioJl)!H)7hiVtWWx)@C;Hpt#f5V20Moi_vYq4)Stxu;qA%oU8AP{?Jm z)a?EIak3nZ+3-Ju!6Y#h;UJr^2wzGxHet9c{H?3VI8kPOA;%f|oP*g$SjTO$mt<9D zHO-P{pU7>N8-VZ~F69O7EaN;&#$E_|z#gzR6he($ioM0=pu-fYiuKB=fb=_M@ELRL z&cLODA*HuVDhttYQ)?exZA}K+S^7lEm9NY|IXkisP;6UupL zCLGk$(F<6a@(KC@NJ0(Ka}eO1raXkzlwK2kLE5v{u^j9??k)jOSSh+Ceu|3}LKc{# zT=Gqd>WX>jQFOAbu8_yeWcO!IXIx{{qDSd3=m#0qppAYS(mofl>ajYoMlvq}ZhJm0 zk84HE76d;LS{+fu4arVPPI7VLN&Hppc{CKwA!WWj?h@-B?MY>Ig;e4dEtNKtbL7nx z7nK#@q8JT`C;TrQo15u6gX zkk843ufYUxvU{5A4=6c!ZoQl3zUdj}Y3*JO zJlvKb61n9_b&PkI9c(buAGe!qg;vCJ-&zYIG#^;@TcYMt<5y!{gUZlGU!l9Hqv`tV z;>ISH6nh6(Gfxrz&Ob4DE!sKhDyS%YRb(tO7yqvWFDWhlRJ^fpT6|p?@8H|#oouTz zJu|O0*$rwvs*S0(p%2mOs0V_$J!m<)Ua?F5SXL$3Cw2)Q@h^d0c_)&^O=A@@M6`ct zm5e)#+pIObgTfh#qq-sb3gc_wWDPW_^;`5u97(X`%@51)guy1QWbdYY&r8eQoVzRc ze>p>PuIJ3p*^E=Z(U=qybqFZ@+Obyf_6XBOkrr-L>x(S$7`Wd`LMT#+4ZO8{D6l37HULzj}KX=NO zOY_C2MNVNSUYu1-Z;X-mlr z=|*{2u?|~}MX+J8U4lxw{FVHKx~I0QW`}yadZDVWoGrZ~9*WF{B$yx2Pcu@+`zL*7_g^5)MRCm!6(nG>-++wzZ6=td#_n0;&!PtT`-Y^$2FTuw$<`ifw zS!wCCLRNp_A=O>$KB71>B`%Cjj45LmBP%2CqS5emc=w<7R@oLB(=}ntEVIk#s6=&0 z`&C;Nv3#c|Pw zceO~2UDRGhp{%#GxA>W8r_dx&2*wHiC!h&CiXO?DqAS%!`aY%~c87Zdu`lo;)HP%w z`#|S|jOIqqlO=&I(DQSF(nIC<5gYK+FeyCYY3YhMKf1DAVVBIc-Bsbb>&|sY-4fS* zK>7CsDRv9T62}Nf9s66{e$&3)o^;f4D1m%^1R?=404sOR>@^X_vqsdg(;zZnhULa? zh9AbiO+;=IO=3r{xb;l z`wUlgqt%yG7ga4)e<`o2CaH>`$vFyZi1t-@2Kz81!XChjF>0T5gd z&^FM2(K8vnxVe0ZXf}FRJKJ!|vc+EA-pTgCT4rr(d*rBYu29woYmF7+C6d&el)E51 zYfDwrF4Au?rZbx`Y_yg1mdrx-5zZoBKZvosEovjICY&yvh>lSlS41!|Hd*ln9f_lJ zz!32ao1;n9UebRvZMVJzh06{5H}gpSXw?Dqj{Fs%C9W!dq3^L$K#0~-SQOh7`xQY& zs=T&zwj@>bkHC(c;R-nexc?$Ape?ac*jsp1(p!E{vJnD`_Jgu?xIiW<6=#aaiI+<* z%L)`x^eX05UQyYUpD|nn(KRM)ABJhVYHn)s)!o&5v~kevc2b;|?H5lG(xAVwOhl1B zL(eE1VrHx<`UkrJjz2HV?@m2#&7Yࠡ?_ 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%0AJVe#P^o~6hlv+P-% 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≠&IN zofsJrYnRz0PDF+WYlZMo7k#9DUZ)g6pey6Hn z4XqTJp4lZfKkHFWmm`A?UW`l&osn=MCA2i#73!kaGrB1+f~KvpDw#zLI$R}~AkSc0 z;Ww~eX#c=aR|<3jgbGBag}77wr5+YH%dfN-!AYTp#$}}}bC_5`&l289TcpL>*`O;t zJJ?c6d<=oF17QYx|#U|8qHp2fF#!5lGNYEZ$ zX5zy9OSzBQSAP<`6}}Ly7HJ*4t@koofvRPwaZi0EzT{hQC4m~Wn0*7J#RM7GI5j3e z(pKxmg4d%fGfgomI9;73w4%?`U6{XkGxv!cA2{tV@9pj@5g3nN#zrGckuCn_?#|wa zz8qhcZ%v>awux-dJmX*TCQ0bRx8!cJ6DgXiK|LlHQp4Gq%rAgjwZraXm&qN>d}ak- zATCjAh|871BFX*DrHB=!pGKwV6Pcx=9BCF!+3pr2h zBfJ(b^0g=&H=*0n*QAYWDuFg$Il;GKit^=^KZ1jTzx0`E33Zh=M4c_0#o2sk&MItD znrjb?ZJ|FxJq${JZsY}h!NtKYA#eCgbV9siXY*z zXJ_W=h+)z{D$A9#$}*W!tI3QwO?U^|&0q3HrKmc@5Tdh#TjXX!BeuTy!w5w4qRqk& zf~n!!VLsk7b4b>^=&Dda`yd82J$h58nDasj^^G_$+&5&zN`}Sh{5*~-f zdd7kY^V!boP&c#)egMQ5|D_SxM1;yln}*-3sbW*=E5ed(^uh79Ay%ZA2O^?xlK90(xlA`YvbA`onU$v2<%Q>MxvhN)(p4%?#NoLE?J$03QRQS&A5Goo)L$j0>fO6G@ zD_X#)tpBBz)y>93j!~91))7_1s+WzM74Xihi zF+`3L)`}g)mI5Rc5k_#Q**~df_%*^x_ogGvP%fFvWn0ikfv(<>*~0G-iZP}|Jw zcjkS{5@3z`^w;_rWurbMQo+F0OVTc86
        slN*D5C!>vYE2~?tPsfv{RsK>|MdRG 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 {oPq?gcfO>tZ9tzO-|crfO=^!krs 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 Date: Fri, 8 Jun 2018 10:55:24 +0100 Subject: [PATCH 048/583] unpin numpy and cartopy versions --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index c86fdbdf..6f1f103e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,7 +2,6 @@ language: python sudo: false env: - python=2.7 - iris=master install: # Fetch and install conda @@ -17,7 +16,7 @@ install: # Install iris-grib's dependencies # -------------------------------- - - conda install --quiet --yes python=${python} iris ecmwf_grib numpy=1.13 cartopy=0.15 mock filelock pep8; + - conda install --quiet --yes python=${python} iris ecmwf_grib numpy cartopy mock filelock pep8; - conda list # Download iris-test-data From 3fbd5cddd285c5c9d99cf3f558ad6f39e9caa182 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Fri, 1 Jun 2018 20:21:27 +0100 Subject: [PATCH 049/583] First working code to save hybrid height. --- iris_grib/__init__.py | 2 +- iris_grib/_save_rules.py | 102 +++++++++++++----- iris_grib/tests/integration/__init__.py | 20 ++++ .../tests/integration/save_rules/__init__.py | 20 ++++ .../save_rules/test_save_hybrid_height.py | 91 ++++++++++++++++ 5 files changed, 206 insertions(+), 29 deletions(-) create mode 100644 iris_grib/tests/integration/__init__.py create mode 100644 iris_grib/tests/integration/save_rules/__init__.py create mode 100644 iris_grib/tests/integration/save_rules/test_save_hybrid_height.py diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index 59ce26f2..713ec121 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -839,7 +839,7 @@ def save_pairs_from_cube(cube): # Save each latlon slice2D in the cube for slice2D in cube.slices([y_coords[0], x_coords[0]]): grib_message = gribapi.grib_new_from_samples("GRIB2") - _save_rules.run(slice2D, grib_message) + _save_rules.run(slice2D, grib_message, cube) yield (slice2D, grib_message) diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index 63f46f09..4ad5ef6f 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -34,9 +34,11 @@ import cartopy.crs as ccrs import iris -import iris.exceptions +from iris.aux_factory import HybridHeightFactory from iris.coord_systems import (GeogCS, RotatedGeogCS, TransverseMercator, LambertConformal) +import iris.exceptions + from . import grib_phenom_translation as gptx from ._load_convert import (_STATISTIC_TYPE_NAMES, _TIME_RANGE_UNITS) from iris.util import is_regular, regular_step @@ -731,13 +733,33 @@ def set_forecast_time(cube, grib): gribapi.grib_set(grib, "forecastTime", fp) -def set_fixed_surfaces(cube, grib): +def set_fixed_surfaces(cube, grib, full3d_cube): # Look for something we can export v_coord = grib_v_code = output_unit = None + # checkout factories for hybrid vertical coordinates. + hybrid_height_factories = [ + factory for factory in cube.aux_factories + if isinstance(factory, HybridHeightFactory)] + if not hybrid_height_factories: + hybrid_height_factory = None + else: + # N.B. get the matching 'complete' factory from the full 3d cube, so we + # have all the level information. + factory, = hybrid_height_factories + hybrid_height_factory = full3d_cube.aux_factory(factory.name()) + + # hybrid pressure + if hybrid_height_factory: + # N.B. in this case, there are additional operations, besides just + # encoding v_coord : see below at end .. + grib_v_code = 118 + output_unit = cf_units.Unit("1") + v_coord = cube.coord('model_level_number') + # pressure - if cube.coords("air_pressure") or cube.coords("pressure"): + elif cube.coords("air_pressure") or cube.coords("pressure"): grib_v_code = 100 output_unit = cf_units.Unit("Pa") v_coord = (cube.coords("air_pressure") or cube.coords("pressure"))[0] @@ -811,6 +833,24 @@ def set_fixed_surfaces(cube, grib): gribapi.grib_set(grib, "scaledValueOfSecondFixedSurface", int(output_v[1])) + if hybrid_height_factory: + # need to record ALL the level coefficents in a 'PV' vector. + level_height_coord = hybrid_height_factory.delta + sigma_coord = hybrid_height_factory.sigma + n_levels, = full3d_cube.coords(axis='z')[0].shape + # In sample data we have seen, there seems to be an extra missing data + # value after each set of n-levels coefficients. + # For now, we retain that encoding. This should not cause problems as + # values are indexed according to model-level-number, + # as in sigma, delta = PV[i], PV[NV/2+i] + n_pv = n_levels + 1 + coeffs_array = np.zeros(n_pv * 2, dtype=np.float32) + coeffs_array[:n_levels] = level_height_coord.points + coeffs_array[n_pv:n_pv + n_levels] = sigma_coord.points + pv_values = [float(el) for el in coeffs_array] + gribapi.grib_set(grib, "NV", n_pv * 2) + gribapi.grib_set_array(grib, "pv", pv_values) + def set_time_range(time_coord, grib): """ @@ -942,7 +982,7 @@ def set_ensemble(cube, grib): gribapi.grib_set(grib, "typeOfEnsembleForecast", 255) -def product_definition_template_common(cube, grib): +def product_definition_template_common(cube, grib, full3d_cube): """ Set keys within the provided grib message that are common across all of the supported product definition templates. @@ -959,10 +999,10 @@ def product_definition_template_common(cube, grib): set_forecast_time(cube, grib) # Handle vertical coords. - set_fixed_surfaces(cube, grib) + set_fixed_surfaces(cube, grib, full3d_cube) -def product_definition_template_0(cube, grib): +def product_definition_template_0(cube, grib, full3d_cube): """ Set keys within the provided grib message based on Product Definition Template 4.0. @@ -972,10 +1012,10 @@ def product_definition_template_0(cube, grib): """ gribapi.grib_set_long(grib, "productDefinitionTemplateNumber", 0) - product_definition_template_common(cube, grib) + product_definition_template_common(cube, grib, full3d_cube) -def product_definition_template_1(cube, grib): +def product_definition_template_1(cube, grib, full3d_cube): """ Set keys within the provided grib message based on Product Definition Template 4.1. @@ -990,7 +1030,7 @@ def product_definition_template_1(cube, grib): set_ensemble(cube, grib) -def product_definition_template_8(cube, grib): +def product_definition_template_8(cube, grib, full3d_cube): """ Set keys within the provided grib message based on Product Definition Template 4.8. @@ -1003,7 +1043,7 @@ def product_definition_template_8(cube, grib): _product_definition_template_8_10_and_11(cube, grib) -def product_definition_template_10(cube, grib): +def product_definition_template_10(cube, grib, full3d_cube): """ Set keys within the provided grib message based on Product Definition Template 4.10. @@ -1022,7 +1062,7 @@ def product_definition_template_10(cube, grib): _product_definition_template_8_10_and_11(cube, grib) -def product_definition_template_11(cube, grib): +def product_definition_template_11(cube, grib, full3d_cube): """ Set keys within the provided grib message based on Product Definition Template 4.11. @@ -1036,7 +1076,7 @@ def product_definition_template_11(cube, grib): _product_definition_template_8_10_and_11(cube, grib) -def _product_definition_template_8_10_and_11(cube, grib): +def _product_definition_template_8_10_and_11(cube, grib, full3d_cube): """ Set keys within the provided grib message based on common aspects of Product Definition Templates 4.8 and 4.11. @@ -1045,7 +1085,7 @@ def _product_definition_template_8_10_and_11(cube, grib): interval. """ - product_definition_template_common(cube, grib) + product_definition_template_common(cube, grib, full3d_cube) # Check for time coordinate. time_coord = cube.coord('time') @@ -1107,7 +1147,7 @@ def _product_definition_template_8_10_and_11(cube, grib): set_time_increment(cell_method, grib) -def product_definition_template_40(cube, grib): +def product_definition_template_40(cube, grib, full3d_cube): """ Set keys within the provided grib message based on Product Definition Template 4.40. @@ -1123,7 +1163,7 @@ def product_definition_template_40(cube, grib): gribapi.grib_set(grib, "constituentType", constituent_type) -def product_definition_section(cube, grib): +def product_definition_section(cube, grib, full3d_cube): """ Set keys within the product definition section of the provided grib message based on the properties of the cube. @@ -1132,13 +1172,13 @@ def product_definition_section(cube, grib): if not cube.coord("time").has_bounds(): if cube.coords('realization'): # ensemble forecast (template 4.1) - pdt = product_definition_template_1(cube, grib) + pdt = product_definition_template_1(cube, grib, full3d_cube) elif 'WMO_constituent_type' in cube.attributes: # forecast for atmospheric chemical constiuent (template 4.40) - product_definition_template_40(cube, grib) + product_definition_template_40(cube, grib, full3d_cube) else: # forecast (template 4.0) - product_definition_template_0(cube, grib) + product_definition_template_0(cube, grib, full3d_cube) elif _cube_is_time_statistic(cube): if cube.coords('realization'): # time processed (template 4.11) @@ -1150,7 +1190,7 @@ def product_definition_section(cube, grib): # time processed (template 4.8) pdt = product_definition_template_8 try: - pdt(cube, grib) + pdt(cube, grib, full3d_cube) except ValueError as e: raise ValueError('Saving to GRIB2 failed: the cube is not suitable' ' for saving as a time processed statistic GRIB' @@ -1229,30 +1269,36 @@ def gribbability_check(cube): raise iris.exceptions.TranslationError("time coord not found") -def run(cube, grib): +def run(slice2d_cube, grib, full3d_cube): """ - Set the keys of the grib message based on the contents of the cube. + Set the keys of the grib message based on the contents of the slice2d_cube. Args: - * cube: - An instance of :class:`iris.cube.Cube`. + * slice2d_cube: + A :class:`iris.slice2d_cube.Cube` representing a 2d field. * grib_message_id: ID of a grib message in memory. This is typically the return value of :func:`gribapi.grib_new_from_samples`. + * full3d_cube: + A :class:`iris.slice2d_cube.Cube` representing the entire save cube. + This is required to write data with hybrid vertical coordinates, as + the GRIB2 spec records hybrid coefficients for *all* the levels in + every message. + """ - gribbability_check(cube) + gribbability_check(slice2d_cube) # Section 1 - Identification Section. - identification(cube, grib) + identification(slice2d_cube, grib) # Section 3 - Grid Definition Section (Grid Definition Template) - grid_definition_section(cube, grib) + grid_definition_section(slice2d_cube, grib) # Section 4 - Product Definition Section (Product Definition Template) - product_definition_section(cube, grib) + product_definition_section(slice2d_cube, grib, full3d_cube) # Section 5 - Data Representation Section (Data Representation Template) - data_section(cube, grib) + data_section(slice2d_cube, grib) diff --git a/iris_grib/tests/integration/__init__.py b/iris_grib/tests/integration/__init__.py new file mode 100644 index 00000000..e178d7cc --- /dev/null +++ b/iris_grib/tests/integration/__init__.py @@ -0,0 +1,20 @@ +# (C) British Crown Copyright 2014 - 2016, Met Office +# +# This file is part of iris-grib. +# +# iris-grib is free software: you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the +# Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# iris-grib is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with iris-grib. If not, see . +"""Integration tests for the :mod:`iris_grib` package.""" + +from __future__ import (absolute_import, division, print_function) +from six.moves import (filter, input, map, range, zip) # noqa diff --git a/iris_grib/tests/integration/save_rules/__init__.py b/iris_grib/tests/integration/save_rules/__init__.py new file mode 100644 index 00000000..979cc428 --- /dev/null +++ b/iris_grib/tests/integration/save_rules/__init__.py @@ -0,0 +1,20 @@ +# (C) British Crown Copyright 2014 - 2016, Met Office +# +# This file is part of iris-grib. +# +# iris-grib is free software: you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the +# Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# iris-grib is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with iris-grib. If not, see . +"""Unit tests for the :mod:`iris_grib._save_rules` package.""" + +from __future__ import (absolute_import, division, print_function) +from six.moves import (filter, input, map, range, zip) # noqa diff --git a/iris_grib/tests/integration/save_rules/test_save_hybrid_height.py b/iris_grib/tests/integration/save_rules/test_save_hybrid_height.py new file mode 100644 index 00000000..d6dbefc7 --- /dev/null +++ b/iris_grib/tests/integration/save_rules/test_save_hybrid_height.py @@ -0,0 +1,91 @@ +# (C) British Crown Copyright 2014 - 2017, Met Office +# +# This file is part of iris-grib. +# +# iris-grib is free software: you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the +# Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# iris-grib is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with iris-grib. If not, see . +""" +Unit tests for :func:`iris_grib._save_rules.data_section`. + +""" +from __future__ import (absolute_import, division, print_function) +from six.moves import (filter, input, map, range, zip) # noqa + +# import iris_grib.tests first so that some things can be initialised before +# importing anything else +import iris_grib.tests as tests + + +import iris +from iris.cube import Cube +from iris import sample_data_path + +from iris_grib import save_pairs_from_cube, save_messages, load_cubes + + +class TestSaveHybridHeight(tests.IrisGribTest): + def setUp(self): + reference_data_filepath = sample_data_path('hybrid_height.nc') + if (hasattr(iris.FUTURE, 'netcdf_promote') and + not iris.FUTURE.netcdf_promote): + iris.FUTURE.netcdf_promote = True + data_cube = iris.load_cube(reference_data_filepath, + 'air_potential_temperature') + # Only use 3 levels. + data_cube = data_cube[:3] + self.test_hh_data_cube = data_cube + + # Also make up a grib-saveable orography cube. + # (look what a fuss this is !!) + co_orog = data_cube.aux_factory().orography + orog_cube = Cube(co_orog.points, + standard_name=co_orog.standard_name, + units=co_orog.units) + for dim in range(2): + orog_cube.add_dim_coord(data_cube[0].coord(dimensions=dim), dim) + orog_cube.add_aux_coord(data_cube.coord('time')) + self.test_orog_cube = orog_cube + + def test_roundtrip(self): + # Get save-pairs for the test data. + save_pairs = save_pairs_from_cube(self.test_hh_data_cube) + # Check there are 3 of them (and nothing failed !) + save_pairs = list(save_pairs) + self.assertEqual(len(save_pairs), 3) + # Also get save-pairs for the orography. + orog_save_pairs = save_pairs_from_cube(self.test_orog_cube) + # Get a list of just the messages. + msgs = [pair[1] for pair in save_pairs] + msgs.append(next(orog_save_pairs)[1]) + # Save the messages to a temporary file. + with self.temp_filename() as temp_path: + save_messages(msgs, temp_path, append=True) + + # ? read back in + check the resulting cubes ? + # XX Can't do that till we get hybrid-height *loading* implemented. +# readback_cubes = list(load_cubes(temp_path)) + + # Instead, just run a grib-count command + check they saved. + import subprocess + command = 'grib_count {}'.format(temp_path) + grib_count_output_lines = subprocess.check_output( + command, shell=True) + + # Check we at least saved 4 fields of "something" without errors. + self.assertEqual(grib_count_output_lines.split(), ['4']) + +# print( readback_cubes ) + + +if __name__ == '__main__': + tests.main() From 3d2f8ce62b76864f9ef1bff8338d990bf9a776ee Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Fri, 1 Jun 2018 20:24:01 +0100 Subject: [PATCH 050/583] Fix license headers. --- iris_grib/__init__.py | 2 +- iris_grib/_save_rules.py | 2 +- iris_grib/tests/integration/__init__.py | 2 +- iris_grib/tests/integration/save_rules/__init__.py | 2 +- .../tests/integration/save_rules/test_save_hybrid_height.py | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index 713ec121..bb47b014 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2010 - 2017, Met Office +# (C) British Crown Copyright 2010 - 2018, Met Office # # This file is part of iris-grib. # diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index 4ad5ef6f..c4b5bd45 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2010 - 2017, Met Office +# (C) British Crown Copyright 2010 - 2018, Met Office # # This file is part of iris-grib. # diff --git a/iris_grib/tests/integration/__init__.py b/iris_grib/tests/integration/__init__.py index e178d7cc..dcaa2b72 100644 --- a/iris_grib/tests/integration/__init__.py +++ b/iris_grib/tests/integration/__init__.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# (C) British Crown Copyright 2018, Met Office # # This file is part of iris-grib. # diff --git a/iris_grib/tests/integration/save_rules/__init__.py b/iris_grib/tests/integration/save_rules/__init__.py index 979cc428..e017b7c0 100644 --- a/iris_grib/tests/integration/save_rules/__init__.py +++ b/iris_grib/tests/integration/save_rules/__init__.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# (C) British Crown Copyright 2018, Met Office # # This file is part of iris-grib. # diff --git a/iris_grib/tests/integration/save_rules/test_save_hybrid_height.py b/iris_grib/tests/integration/save_rules/test_save_hybrid_height.py index d6dbefc7..0bd71567 100644 --- a/iris_grib/tests/integration/save_rules/test_save_hybrid_height.py +++ b/iris_grib/tests/integration/save_rules/test_save_hybrid_height.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2014 - 2017, Met Office +# (C) British Crown Copyright 2018, Met Office # # This file is part of iris-grib. # From 18f9f4f4734abb095c70339096e9b00f04013702 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Fri, 1 Jun 2018 20:38:46 +0100 Subject: [PATCH 051/583] Usage fixes for whitebox testing. --- iris_grib/_save_rules.py | 20 +++++++++---------- .../save_rules/test_save_hybrid_height.py | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index c4b5bd45..2ee56bf3 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -733,7 +733,7 @@ def set_forecast_time(cube, grib): gribapi.grib_set(grib, "forecastTime", fp) -def set_fixed_surfaces(cube, grib, full3d_cube): +def set_fixed_surfaces(cube, grib, full3d_cube=None): # Look for something we can export v_coord = grib_v_code = output_unit = None @@ -982,7 +982,7 @@ def set_ensemble(cube, grib): gribapi.grib_set(grib, "typeOfEnsembleForecast", 255) -def product_definition_template_common(cube, grib, full3d_cube): +def product_definition_template_common(cube, grib, full3d_cube=None): """ Set keys within the provided grib message that are common across all of the supported product definition templates. @@ -1002,7 +1002,7 @@ def product_definition_template_common(cube, grib, full3d_cube): set_fixed_surfaces(cube, grib, full3d_cube) -def product_definition_template_0(cube, grib, full3d_cube): +def product_definition_template_0(cube, grib, full3d_cube=None): """ Set keys within the provided grib message based on Product Definition Template 4.0. @@ -1015,7 +1015,7 @@ def product_definition_template_0(cube, grib, full3d_cube): product_definition_template_common(cube, grib, full3d_cube) -def product_definition_template_1(cube, grib, full3d_cube): +def product_definition_template_1(cube, grib, full3d_cube=None): """ Set keys within the provided grib message based on Product Definition Template 4.1. @@ -1030,7 +1030,7 @@ def product_definition_template_1(cube, grib, full3d_cube): set_ensemble(cube, grib) -def product_definition_template_8(cube, grib, full3d_cube): +def product_definition_template_8(cube, grib, full3d_cube=None): """ Set keys within the provided grib message based on Product Definition Template 4.8. @@ -1043,7 +1043,7 @@ def product_definition_template_8(cube, grib, full3d_cube): _product_definition_template_8_10_and_11(cube, grib) -def product_definition_template_10(cube, grib, full3d_cube): +def product_definition_template_10(cube, grib, full3d_cube=None): """ Set keys within the provided grib message based on Product Definition Template 4.10. @@ -1062,7 +1062,7 @@ def product_definition_template_10(cube, grib, full3d_cube): _product_definition_template_8_10_and_11(cube, grib) -def product_definition_template_11(cube, grib, full3d_cube): +def product_definition_template_11(cube, grib, full3d_cube=None): """ Set keys within the provided grib message based on Product Definition Template 4.11. @@ -1076,7 +1076,7 @@ def product_definition_template_11(cube, grib, full3d_cube): _product_definition_template_8_10_and_11(cube, grib) -def _product_definition_template_8_10_and_11(cube, grib, full3d_cube): +def _product_definition_template_8_10_and_11(cube, grib, full3d_cube=None): """ Set keys within the provided grib message based on common aspects of Product Definition Templates 4.8 and 4.11. @@ -1147,7 +1147,7 @@ def _product_definition_template_8_10_and_11(cube, grib, full3d_cube): set_time_increment(cell_method, grib) -def product_definition_template_40(cube, grib, full3d_cube): +def product_definition_template_40(cube, grib, full3d_cube=None): """ Set keys within the provided grib message based on Product Definition Template 4.40. @@ -1163,7 +1163,7 @@ def product_definition_template_40(cube, grib, full3d_cube): gribapi.grib_set(grib, "constituentType", constituent_type) -def product_definition_section(cube, grib, full3d_cube): +def product_definition_section(cube, grib, full3d_cube=None): """ Set keys within the product definition section of the provided grib message based on the properties of the cube. diff --git a/iris_grib/tests/integration/save_rules/test_save_hybrid_height.py b/iris_grib/tests/integration/save_rules/test_save_hybrid_height.py index 0bd71567..40b6b461 100644 --- a/iris_grib/tests/integration/save_rules/test_save_hybrid_height.py +++ b/iris_grib/tests/integration/save_rules/test_save_hybrid_height.py @@ -40,7 +40,7 @@ def setUp(self): not iris.FUTURE.netcdf_promote): iris.FUTURE.netcdf_promote = True data_cube = iris.load_cube(reference_data_filepath, - 'air_potential_temperature') + 'air_potential_temperature') # Only use 3 levels. data_cube = data_cube[:3] self.test_hh_data_cube = data_cube From 89457382635b773f747ceaf891f45a275029ad64 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Mon, 4 Jun 2018 15:32:46 +0100 Subject: [PATCH 052/583] Include new test data file; test gribfile output. --- .../save_rules/test_save_hybrid_height.py | 63 +++++++++--------- iris_grib/tests/testdata/hybrid_height.nc | Bin 0 -> 1710642 bytes 2 files changed, 30 insertions(+), 33 deletions(-) create mode 100644 iris_grib/tests/testdata/hybrid_height.nc diff --git a/iris_grib/tests/integration/save_rules/test_save_hybrid_height.py b/iris_grib/tests/integration/save_rules/test_save_hybrid_height.py index 40b6b461..9e86f377 100644 --- a/iris_grib/tests/integration/save_rules/test_save_hybrid_height.py +++ b/iris_grib/tests/integration/save_rules/test_save_hybrid_height.py @@ -25,66 +25,63 @@ # importing anything else import iris_grib.tests as tests - import iris from iris.cube import Cube -from iris import sample_data_path -from iris_grib import save_pairs_from_cube, save_messages, load_cubes +from iris_grib import save_pairs_from_cube, save_messages, GribMessage class TestSaveHybridHeight(tests.IrisGribTest): def setUp(self): - reference_data_filepath = sample_data_path('hybrid_height.nc') + reference_data_filepath = self.get_testdata_path('hybrid_height.nc') if (hasattr(iris.FUTURE, 'netcdf_promote') and not iris.FUTURE.netcdf_promote): iris.FUTURE.netcdf_promote = True data_cube = iris.load_cube(reference_data_filepath, 'air_potential_temperature') - # Only use 3 levels. - data_cube = data_cube[:3] + # Only use 3 levels and a single timestep. + data_cube = data_cube[0, :3] self.test_hh_data_cube = data_cube - # Also make up a grib-saveable orography cube. - # (look what a fuss this is !!) - co_orog = data_cube.aux_factory().orography - orog_cube = Cube(co_orog.points, - standard_name=co_orog.standard_name, - units=co_orog.units) - for dim in range(2): - orog_cube.add_dim_coord(data_cube[0].coord(dimensions=dim), dim) - orog_cube.add_aux_coord(data_cube.coord('time')) - self.test_orog_cube = orog_cube - - def test_roundtrip(self): + def test_save(self): # Get save-pairs for the test data. save_pairs = save_pairs_from_cube(self.test_hh_data_cube) + # Check there are 3 of them (and nothing failed !) save_pairs = list(save_pairs) self.assertEqual(len(save_pairs), 3) - # Also get save-pairs for the orography. - orog_save_pairs = save_pairs_from_cube(self.test_orog_cube) + # Get a list of just the messages. msgs = [pair[1] for pair in save_pairs] - msgs.append(next(orog_save_pairs)[1]) + # Save the messages to a temporary file. with self.temp_filename() as temp_path: save_messages(msgs, temp_path, append=True) - # ? read back in + check the resulting cubes ? - # XX Can't do that till we get hybrid-height *loading* implemented. -# readback_cubes = list(load_cubes(temp_path)) - - # Instead, just run a grib-count command + check they saved. - import subprocess - command = 'grib_count {}'.format(temp_path) - grib_count_output_lines = subprocess.check_output( - command, shell=True) + # Read back as GribMessage-s. + msgs = list(GribMessage.messages_from_filename(temp_path)) - # Check we at least saved 4 fields of "something" without errors. - self.assertEqual(grib_count_output_lines.split(), ['4']) + # Check 3 messages were saved. + self.assertEqual(len(msgs), 3) -# print( readback_cubes ) + # Check one message has correctly encoded hybrid height. + msg_lev2 = msgs[1] + # first surface type = 118 (i.e. hybrid height). + self.assertEqual( + msg_lev2.sections[4]['typeOfFirstFixedSurface'], + 118) + # first surface scaling = 0. + self.assertEqual( + msg_lev2.sections[4]['scaleFactorOfFirstFixedSurface'], + 0) + # first surface value = 2 (i.e. model level). + self.assertEqual( + msg_lev2.sections[4]['scaledValueOfFirstFixedSurface'], + 2) + # second surface type = NONE (i.e. unbounded level). + self.assertEqual( + msg_lev2.sections[4]['typeOfSecondFixedSurface'], + 255) if __name__ == '__main__': diff --git a/iris_grib/tests/testdata/hybrid_height.nc b/iris_grib/tests/testdata/hybrid_height.nc new file mode 100644 index 0000000000000000000000000000000000000000..ecdd85dbd13b0bbbb91e7d4ccd19688e850cf52a GIT binary patch literal 1710642 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⪚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 x8atD9knhzlhR@% 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≈o*UB4d>Z<-AlXz&ZZKb)(J_)_g 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 }O}O3z}D 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 z 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

        VG!-TrVwd&{ir8qtV~z7%gN&*cFzTwa4;( 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 z z>;ZmBSt%@UVe$7G+p(O5TRfJS4kOvNUS9Yg%_He9+`=6EFBY9XYhn4+@@0&-FEgjX z?K3O~;x?8x-<@kLVvEKa|83hzXS1-%!>X~}c&@}P4rco?3)d~u<9WokRGrKlY!C0^ z%G=G@Lw~ujS&l zRelcLCK`{`;)rVxAEkEvyqJ5rd_0Hizca+k+jsQ?mMv+s)-hVUtX?l65V5)21V@>}D~1+j|Ex?ohF9uH&qv2=Y|EqZIDy|d+p1!@OMXubTgrci<5JruEHSPw!&P1dwoSjTl-82} zHOo60cl=IG#b&y=O`na_`6yd78bj>bv2YKe)nNWjmzAwwlitQ}f-!mthKp_cj~}+T z{JfLCps`#ScEW8Q7MI)66h6f3^q2rjCpKmSfIRkUcsW`s-mgo3i8qe;U)1Bj&d(C@}(g+RC#wOt|?Ow6koN?Y9*(k*`PD%*)A*e1qcxm?+7czurL2JGWucG&t~nAWA!0`jIy z!?Th@>GC3;W3aq2$=FPzg(mO;^}aRI+$yla>j@pcBaJdx{jf|$lf`X2!2YDgwpd^3 zX+C2;%*)@y?mLYBY^wcOl%cs}__+XFFopH9mc!g}H$4tguCH=88#`CTer+wWgEo_4 zxgOJ0w#{qL-~Qm|^R@l7I)Ci{q^`BS@42>ft^qH9rEV|8cbYtMU0qJ8-#)*w!`vR1 z>l?LqGnUefSQWuy!#w2{sV|y zUrdsQ`B5WjI>+nEzx!g^55o%+%?&2&n^ESJSk@oN7jVjs<&NI8if1_Q>n@#UJ?QeR z^&)s4A0VE~OVO47u}qHDxh6D+#dVgkHBMOF!mJ*ibL2Io-4-;t1lzI77Lhl+rujdX z|J79oEHfz|`&a%nLd=?LPI1XRO`L4zJhCevZ)EH#DrTN}PUkc^=bB@l*N-Q)^8!5_ z#)}?vVUZBGEw}{V-7-i2vd5O6;xfpwmoLUpnF-2-Ym~QbOF^6Ae@*q+^@YYv+#>0V z-j;9R|24K**lfr67Q+TpX>Xi!RV?RXnQaIbzeo6NN1V!I`FD5yHNZG${iyXj(n{DB z?Pd-mEz_S5bT*c;;y-H(mZ@<{hD9mX7RU4$W^X9ovCi^tVOWSQZe%VgueiL&H5fmy zZoLYY`=oL7&5dDV(QN0hHyqpf&LG!_!nS4Cc^U;JALKezCr3r9Q**8Xlu@YHPg@jh>*n_LkdYn^5{E8>;-{pl92{ ze_%7%XPotLeYG)`*G6maByExwpBV96MR_`Sh+RCsJ9(gf!t4VKud%Oj9WOm7y-$~o zq=jt%y^Hamg?Fg7#AqL#-EKhNc;vyU5SBgpZV&9D&}rhfbb#^un2(SbzC+c#npjXv z+u3I81?~T_a!K`Vc(!ilJ#jwxc2@68k$#EgZdUA>x!6Da`ZPYr)CtRB7>55hTsgp} zcIaCy!hZ%cYJX4dKR8`o9P=%GlxH4&;v0gCxXy#|sjl>e z<&2JabfQuE{6pC=|2fpeIEmkbf*JI9IHUcA7)vvND|yHQc;eR&$N8mF+TYB>YjJj)gQySW<-PJIB zYW*-fiQ(V!tNr5KKsrO&@ST(*SeC?VCToY`OkB=mH58);*3-z3*$ls~V&iXov8ms& zz0HsM63>LnZDxh-_cPtb87MAj|5vZfAIyb1x*nX+`A>MyMR@+D%}agth;Ll-+k5G8 zleoXlK3ERKf*E-8Irzt)rZrQ@`mLElr98Ot9re1_ow7Oq$380wcunQlN}LK&t$kQ4C_Xbqzt;jgtSuh#aQp+uS~#_@qVMH> zXxkcP8taP*jr60uqZKf<{VQd=OQ+lKl5H*fMD+b-@$sp-`ZT&c9j+I-7TnGMB$B<< zUw4grH|g;d{j>0{sBSx*ci|bImYUGi(M9~99^ca5Ygjy_^#`9Qr(IDUrbK+9iQZja+t41-_qXhQQCe~V>jx@?cvMm(lt(*v7WSf1j? z53DDW-;2GX<(OhY&j$Se2V+iUabDS?th;h?9qWECZByTF;^Wm+-Zz3}3fGCkdxOIN zMyvgc1D5&!F+aF2Zd}zTNBI+;h4#|kZuQdsSD0kb{_|Mg9FGx}Q6|z1o^>!O$tuw6 z4QY7JdD{P2_Q!J_hRNqTZDm=VLIe@=RsKh)>G{7 z8!=~$)82gIXa0a!cHGWlT3h?uVmXDyZRS|=n$}mp24YW(i1~NL+VsuG=kV3CxTMD@ z7t2$D)};M#3M?}?)<(?#!7MA*$?Q|N674H9(0&;mx32mm9D@&k{@b;U_*i}>Ufy$m z;sRa%cSn72{P3E3H`) zmNwDW>R9IB%l&a{i&X)7tYp1z6FwwwbYt7gVs{z`w8!?A8zb8~EeS9VExW1=!OEmv^Nlj>1^l=Jau{&R-mXybSn`V8-} zT5J6I;W~Zb7f%}gmy_d?dY)IWKfX$wHewmKbB@J-7V^U1!iQ7nDn5|I&OXJ$_L!O~xAb;eR-` z?_{pfT^q1`h~-i2p5wNJO|qO%Ubv4C&KHN_SPj2*bt2}DXYo9ONZ_eDWIYpH=@0#(nAcC+Ow?R=X_!h4)6WXst02n;5M5Bx5?g*TrByrYCWU zgikZ+c1-iK^(+Z*Gdd<4sboy~1J z&{9WprLJ^DhcVc)z^w^Jv=p_Se!}v21Lqld47IIREp@G}pXy^HonC{FR>v8W=lEe_z{-IB{bP-2~s|R*Ru}osFzAvSB-npj! zAC?a;@Pm_n{}O%Rx8aoEJ*_Rr=yRubZr4ZKj0x+E^OzpTWepZNw0}B=UpV%KKP*oW z&+!S*NIl0iq3z*W+z!efv^;f|b2pm&S~_1|F=fYK*@K<2&k)v9pSSKs1O4sWSD#{- z>NoXb^Se5K>MXWl_Yqzz=x<20}%;u(TpH;RMH%?TINk8~b3KVmU+vO0_s zL+L5kAC~dFi^&OTV%w%DbJO}FyuPqcRSZY54Aw`py2{lYYn+tUQf`@JUFGL(yPG%l z7E`c{+TJmKp^pychWM^*V|;2Y_RwW)JRf5huJeq>?JylSuB-p$*AV0C)zlvA{c5XA zbu6*zCx2OKb1xjL(_CU!QC=A1bJsI(v7CeTE{QwaWqV#WwVL^t`m`RZ-87iY*pt?^ zjbqM#?qeCgYq;jTemG)m#PBd%$*=RXE(g{5FdgF9d4sq_k2P00A6cs2{B$Z-*T&<9 z!Isf}cevlh;(Lrb%MZ_;hX0Lpv>yJObeW}^N|#u+w>)DUEwQa*=wA7!mZP#sgXyL# zjrY(8>VCbgF&E1Tn5O870nRHrnfKtCrxA^^@SV&P^!G(gzl-S%OditUBm7F%a$X~S zhEJ-h@^Kl2(F(eYQi=Zf`BU2KWBGGs^3vqn_RWKJV`Vn5oysJ)Z>$dDm-{jPp_*u?ox%oyhX_c{LG2JcTi!=Qu zP91O>H_q{~4A1JlhiACjM?-)77@=(tM-DcgRdvfGrI;26#PZqh-< z#;E>#>%6BmKY!&N2E*UjexI%{JLfv+{1LY_`?VdrE!(wSj114U?BwSMqz6|UH*h>K z$DDJPaY?)X8KLk0(3UaEVG%gIFK^dK|%r2 zt4d%3)l?*UY{4!|7==ezahPf=`4(sm(^#=RkggWknvIeC%ATZyoo=H zAN|AxERQ(X`QCr^;yxFzu`I&B>l~&V9LsF9|6hK4vo^8SmUFKa@7M4VcGL2_KaDvH z?K{nRCMMxo(}T45Jr)Hmx5OduFk|i@a~Am@%D*qKm2F?(c%DVY{<8IE@<-sFLz!^j zI}%G^-{;c$_7Crh&d-jvQm5ADi!JzVOLL4i`s}BOdoyVo`t91b*TI1nC)YGr#H~;{ zW2dx#1>=u2u`*$=v|s_jdRPtv#9 z4Ep?FtT>CuSHq04bRV8Cn>LsRvAD&;^Y&?nh`X5HWjit3plo^R9_iomnz7FIDJ#JZ$y9WhIYSudR8OV?mksep5P<)dO;#Ci&P+$(R#H{z0V1La>U>o?V- zRZs2rzve#fJ*Iu2p2nT7clpg#zH-3)a+71PrrpK-l|`LrezSm&ETZ`(G$Gw2ug)BP zJ6nvNNpEc7RBfQK?}nIjU~#Fhv68jyuPi2mFlit^@CyI4nU3#=ERXVqrBS6x6+cUt#;F&@boI`CvD7!Y&>CU6uBbUgXCa>WVM4HX6UaIF_lZ&*`rRcD3jycSZ5{ zJF%vOb8>9j6g7^Q5g#zEOso0ijm4>MJ~1;tAGiG$X0@f8FI9tYx@WJDF+9V2 z-EtJ%2e8)m3;$_Y&`sIS`mGZ`(T2peoUhQT4O)!O+2qZ%b$!@%z{ zj_nJJceuR4<#QGvw-0hVca^p)L^JvMN=|+9wXrXUcF2D%ZJo=#A^FASzs`=8_33zS z{N7xp4sCZ7A6yffblli*-8}IOogZ`kcel2zSMLS%J6%3jzfILYIBlG0J~a+gtd@-w z=UHCyZrdN&V3(L*W}>NE+MgDSYQ0?-$Dj{Og-5^6uFv7HzYBJ_Z0_#2yP981x3lS% zUn)~c-I}p|%C3>u!M+6?W8`nnS6H|w@zpPwwKF&U5vMAyGvHW;{=THOEZAk$&MHOp zRYB}=TZYpaY%XH=6E3YVdXCG_*|7e~n3mOCpS`hs=}YlBv-4=npR;Ysr`M&88uqV@c||ek2eG~wZDN=N zzd|{TIas`pL2WEnd|@2VD9(Q_etc#Qm);zcWle{BTJsg@P-#ke8$T6~trt`-p7jeE z{67086P@ax-z$l|E$Hu<7&afzzxdu#W56t9zy!ZJSa*!}e-ywOhqWqFLC1IEOaG~;IuDnIKB`M{8OmW98p$;tJ_u?x%$BNKl z5jtCrT|o>+V{dTm#(K-? z?cX*hO_by>>OO3$ST|D~p{H|0`4e{CuzK^WxqSz5xQBIY`e;)o?Qd9vezYwroBX3# z%_^`JY`pf~(6;&dX-)<4O=WHBH$%e5fEV6Q&*bMt*#%rzp zFDU=4v~htYW#=)=%05^BXqYv{YC|DX3EY}tFRPrfUDvNV?OvncjS zbC!`k%Hn*BWz?QHUz*ou(qEtB<#&H#P5DX#>*eHsr%YbQ$mw_~zZNST`?T~I>j@k` z_~lbp-*RgflTEY!7W=?&W%fItJ4Q6WbH?#%I(|lad7gxR5}HTi(LwuL#xYjK=7+Ix zjwzYrHZIXbW7>&q+BlGW6$w0UVhT2SA(+J7;v^SsphRedk=i?sY=9^Gf+ z1IN|Bmp;y#KpXYtfOo`HzqdkNg@q2lc>!f@e`^R^jrH=WZW1sRnYu|DV z4C4Ey*2))y3oi7%uD4ko-|UL{|Jf?v?|Pg4=v!Sae5)(B?{ppZovuc{({;voxjL~t zzSou0`un!ecFd}NJF9+AM`zUzi0_TP*J-Ht==AW+#;@j^t-NEbin(S9-_gix zvRKMzw%@Pzzvwu{9q%o+$$Agl;(AUjk^jFXO{*TR^(Rm19nbDNA99`>S6Z5NXEWJu zwx0dQzGmrJCDx0bV%1$oyugyW<`9M5wmglcWD{&p%~m>YQFbb+_o1@rY=ZOZtZY>h z=Y;Hn|KeqlhVOpWu}^p9!#n4rzK@rAn z%4=A!=)VAE+{eIn>-R$o4#D?HVgE13_&LVmy|`0xo{95?e3-E`d2z+&7-n^Iy6=wR zNsMBA<-EXiU`4;w2Y7w-xnrf*H@Ho5AGD3@f7e~NdYgTQ;UeuH&-$=(>AS!5Qz zSyNVT4L>l(J6jb{~ETs9Slw^>W)(OFm()}1Y6 zm)J+P6=O}<9qZv-JG>LUfPI&_H&)PjV?{PIt~%}z=hUZLU(XHV_j@CKQNwkPy55Od z#e3Ir+~z+PrAvBV7|Takw)&3l3i>Y)UjJg12&3nj-MeJ_F$(X4i@^qG^ejjQ{qw2k zlu~=<7^_^EO~r1V{PWWK>>+N2ak$Q!;j;;|(pWheD!2ldy6Sx$kC)n$O8wtg_nL9^ zwfgsFncwx>uDdRj-$6PnCZAy|S#tKqHJd%IEjEv#uPhI>94CtF5Rts2lJ$&CzpU(A z%DgbQ{7-zLv7eubcdU%%6c5GWdt#%sqxBAN%xj|3#Y^)v$0+M}x=s|+&*M2*yPG&B zZk7F~B2snFYFUnkUtT;n7sudR@479f@8#XLp3ri;!dS_Fla*g(p&MK)`yX3w%Q(y@Kz4_CB_8rI+ck8vBVB!+*BolbWt*89dU?H>M^Nq>-c)wV)-l(H=e+a<5JZJ$`q zc-P$KmbuLh^OS$gjo7(s=KO4iys5T-e#ba?)mVJl+~~S7#(t?CW2xWIsZI-Kng@!R z*|CgS8y9@urNR6K+yg2zwBYojVhs)E!|WlSjx1eeeJeel&dxXR%9{^s<)`PtB$&MG znBL*TpMCCqn)I0;$D~-DW8b8=o{FAX4a_cLmJq{9bl8pmgm;$?!!15;)uZsU$b3`( zH~gPo#!2(BY}!#@8{0{*vuu_>)ZVkVwcUCyoSsT!$uBQ2Ije@z6ZRd8%qn4({)%(W z3-a07OU5bbHv0PPtm^?MooAfESNnY=mIA}7{CYY6*vR)b#}*5ueX;9{;~0MQ6QA3_jk-o7v-n4yljvD5(_sTHkVQ^{I99+E@L(g?xNY{elMoq{-VG6 z%0Aj3;M-0O_TP*q*qhIJU7N*PS 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
      1. 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 literal 0 HcmV?d00001 From 82f16bab4492b09aadf9d983f2b9d67e984a7e27 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Tue, 5 Jun 2018 14:16:50 +0100 Subject: [PATCH 053/583] Review change: clearer test. --- .../save_rules/test_save_hybrid_height.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/iris_grib/tests/integration/save_rules/test_save_hybrid_height.py b/iris_grib/tests/integration/save_rules/test_save_hybrid_height.py index 9e86f377..1b51eb79 100644 --- a/iris_grib/tests/integration/save_rules/test_save_hybrid_height.py +++ b/iris_grib/tests/integration/save_rules/test_save_hybrid_height.py @@ -64,23 +64,26 @@ def test_save(self): # Check 3 messages were saved. self.assertEqual(len(msgs), 3) - # Check one message has correctly encoded hybrid height. - msg_lev2 = msgs[1] + # Check message 2/3 has the correctly encoded hybrid height. + model_levels = \ + self.test_hh_data_cube.coord('model_level_number').points + msg_2of3 = msgs[1] + model_level_2of3 = model_levels[1] # first surface type = 118 (i.e. hybrid height). self.assertEqual( - msg_lev2.sections[4]['typeOfFirstFixedSurface'], + msg_2of3.sections[4]['typeOfFirstFixedSurface'], 118) # first surface scaling = 0. self.assertEqual( - msg_lev2.sections[4]['scaleFactorOfFirstFixedSurface'], + msg_2of3.sections[4]['scaleFactorOfFirstFixedSurface'], 0) - # first surface value = 2 (i.e. model level). + # first surface value = 2 (i.e. model level #2). self.assertEqual( - msg_lev2.sections[4]['scaledValueOfFirstFixedSurface'], - 2) + msg_2of3.sections[4]['scaledValueOfFirstFixedSurface'], + model_level_2of3) # second surface type = NONE (i.e. unbounded level). self.assertEqual( - msg_lev2.sections[4]['typeOfSecondFixedSurface'], + msg_2of3.sections[4]['typeOfSecondFixedSurface'], 255) From 0bd2805f5042a58c1cb14804ddca399f10b48773 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Tue, 5 Jun 2018 14:27:19 +0100 Subject: [PATCH 054/583] Fix PV indexing and length. --- iris_grib/_save_rules.py | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index 2ee56bf3..6e0b6c37 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -837,18 +837,39 @@ def set_fixed_surfaces(cube, grib, full3d_cube=None): # need to record ALL the level coefficents in a 'PV' vector. level_height_coord = hybrid_height_factory.delta sigma_coord = hybrid_height_factory.sigma - n_levels, = full3d_cube.coords(axis='z')[0].shape + model_levels = full3d_cube.coord('model_level_number').points + # Just check these make some kind of sense (!) + if model_levels.dtype.kind not in 'iu': + msg = 'model_level_number is not an integer: dtype={}.' + raise ValueError(msg.format(model_levels.dtype)) + if np.min(model_levels) < 1: + msg = 'model_level_number must be > 0: mininum value = {}.' + raise ValueError(msg.format(np.min(model_levels))) + # Need to save enough levels for indexes up to [max(model_levels)] + n_levels = np.max(model_levels) + max_valid_nlevels = 9999 + if n_levels > max_valid_nlevels: + msg = ('model_level_number values are > {} : ' + 'maximum value = {}.') + raise ValueError(msg.format(max_valid_nlevels, n_levels)) # In sample data we have seen, there seems to be an extra missing data # value after each set of n-levels coefficients. # For now, we retain that encoding. This should not cause problems as # values are indexed according to model-level-number, # as in sigma, delta = PV[i], PV[NV/2+i] - n_pv = n_levels + 1 - coeffs_array = np.zeros(n_pv * 2, dtype=np.float32) - coeffs_array[:n_levels] = level_height_coord.points - coeffs_array[n_pv:n_pv + n_levels] = sigma_coord.points + n_coeffs = n_levels + 1 + coeffs_array = np.zeros(n_coeffs * 2, dtype=np.float32) + for n_lev, height, sigma in zip(model_levels, + level_height_coord.points, + sigma_coord.points): + # Record all the level coefficients coming from the 'full' cube. + # Note: if some model levels are missing, we must still have the + # coeffs at the correct index according to the model_level_number + # value, i.e. at [level - 1] and [NV // 2 + level - 1]. + coeffs_array[n_lev - 1] = height + coeffs_array[n_coeffs + n_lev - 1] = sigma pv_values = [float(el) for el in coeffs_array] - gribapi.grib_set(grib, "NV", n_pv * 2) + gribapi.grib_set(grib, "NV", n_coeffs * 2) gribapi.grib_set_array(grib, "pv", pv_values) From 4689aa5249bc8dad4e53edee6b18441d30bfd125 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Thu, 7 Jun 2018 18:14:31 +0100 Subject: [PATCH 055/583] Review changes -- improved test and comments a bit. --- iris_grib/_save_rules.py | 11 ++++--- .../save_rules/test_save_hybrid_height.py | 33 +++++++++++-------- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index 6e0b6c37..7967ca6f 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -738,16 +738,17 @@ def set_fixed_surfaces(cube, grib, full3d_cube=None): # Look for something we can export v_coord = grib_v_code = output_unit = None - # checkout factories for hybrid vertical coordinates. + # Detect factories for hybrid vertical coordinates. hybrid_height_factories = [ factory for factory in cube.aux_factories if isinstance(factory, HybridHeightFactory)] if not hybrid_height_factories: hybrid_height_factory = None else: - # N.B. get the matching 'complete' factory from the full 3d cube, so we - # have all the level information. + # If any, there should be just one. factory, = hybrid_height_factories + # Fetch the matching 'complete' factory from the *full* 3d cube, so we + # have all the level information. hybrid_height_factory = full3d_cube.aux_factory(factory.name()) # hybrid pressure @@ -834,7 +835,7 @@ def set_fixed_surfaces(cube, grib, full3d_cube=None): int(output_v[1])) if hybrid_height_factory: - # need to record ALL the level coefficents in a 'PV' vector. + # Need to record ALL the level coefficents in a 'PV' vector. level_height_coord = hybrid_height_factory.delta sigma_coord = hybrid_height_factory.sigma model_levels = full3d_cube.coord('model_level_number').points @@ -856,7 +857,7 @@ def set_fixed_surfaces(cube, grib, full3d_cube=None): # value after each set of n-levels coefficients. # For now, we retain that encoding. This should not cause problems as # values are indexed according to model-level-number, - # as in sigma, delta = PV[i], PV[NV/2+i] + # I.E. sigma, delta = PV[i], PV[NV/2+i] n_coeffs = n_levels + 1 coeffs_array = np.zeros(n_coeffs * 2, dtype=np.float32) for n_lev, height, sigma in zip(model_levels, diff --git a/iris_grib/tests/integration/save_rules/test_save_hybrid_height.py b/iris_grib/tests/integration/save_rules/test_save_hybrid_height.py index 1b51eb79..87bc149d 100644 --- a/iris_grib/tests/integration/save_rules/test_save_hybrid_height.py +++ b/iris_grib/tests/integration/save_rules/test_save_hybrid_height.py @@ -39,8 +39,8 @@ def setUp(self): iris.FUTURE.netcdf_promote = True data_cube = iris.load_cube(reference_data_filepath, 'air_potential_temperature') - # Only use 3 levels and a single timestep. - data_cube = data_cube[0, :3] + # Use only 3 (non-contiguous) levels, and a single timestep. + data_cube = data_cube[0, :6:2] self.test_hh_data_cube = data_cube def test_save(self): @@ -64,26 +64,31 @@ def test_save(self): # Check 3 messages were saved. self.assertEqual(len(msgs), 3) - # Check message 2/3 has the correctly encoded hybrid height. - model_levels = \ - self.test_hh_data_cube.coord('model_level_number').points - msg_2of3 = msgs[1] - model_level_2of3 = model_levels[1] + # Check that the PV vector (same in all messages) is as expected. + # Note: gaps here are because we took model levels = (1, 3, 5). + self.assertArrayAllClose( + msgs[0].sections[4]['pv'], + [5., 0, 45., 0, 111.667, 0, + 0.999, 0, 0.995, 0, 0.987, 0], + atol=0.0015) + + # Check message #2-of-3 has the correctly encoded hybrid height. + msg = msgs[1] # first surface type = 118 (i.e. hybrid height). self.assertEqual( - msg_2of3.sections[4]['typeOfFirstFixedSurface'], + msg.sections[4]['typeOfFirstFixedSurface'], 118) # first surface scaling = 0. self.assertEqual( - msg_2of3.sections[4]['scaleFactorOfFirstFixedSurface'], + msg.sections[4]['scaleFactorOfFirstFixedSurface'], 0) - # first surface value = 2 (i.e. model level #2). + # first surface value = 3 -- i.e. #2 of (1, 3, 5). self.assertEqual( - msg_2of3.sections[4]['scaledValueOfFirstFixedSurface'], - model_level_2of3) - # second surface type = NONE (i.e. unbounded level). + msg.sections[4]['scaledValueOfFirstFixedSurface'], + 3) + # second surface type = "NONE" -- i.e. unbounded level. self.assertEqual( - msg_2of3.sections[4]['typeOfSecondFixedSurface'], + msg.sections[4]['typeOfSecondFixedSurface'], 255) From c1573ac558f16aab74edc546319ca716f48b99f8 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Thu, 7 Jun 2018 18:16:35 +0100 Subject: [PATCH 056/583] Extend whatsnew, tweak a comment. --- docs/ref/release_notes.rst | 2 +- iris_grib/_save_rules.py | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/ref/release_notes.rst b/docs/ref/release_notes.rst index 67ca9568..379ab2ee 100644 --- a/docs/ref/release_notes.rst +++ b/docs/ref/release_notes.rst @@ -7,7 +7,7 @@ What's new in iris-grib v0.13 Features -------- -* Added loading for data on Hybrid Height levels (surface type 118 in +* Added loading and saving of data on Hybrid Height levels (surface type 118 in code table 4.5). Bug Fixes diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index 7967ca6f..be249411 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -867,6 +867,8 @@ def set_fixed_surfaces(cube, grib, full3d_cube=None): # Note: if some model levels are missing, we must still have the # coeffs at the correct index according to the model_level_number # value, i.e. at [level - 1] and [NV // 2 + level - 1]. + # Thus, we can *not* paste the values in a block: each one needs to + # go in the index corresponding to its 'model_level_number' value. coeffs_array[n_lev - 1] = height coeffs_array[n_coeffs + n_lev - 1] = sigma pv_values = [float(el) for el in coeffs_array] From da552689afc55ce3c6c2d721ebb6e94364c85fe4 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Fri, 8 Jun 2018 14:38:16 +0100 Subject: [PATCH 057/583] Review change : fix comment + add code clarity. --- iris_grib/_save_rules.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index be249411..b3298de9 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -751,7 +751,8 @@ def set_fixed_surfaces(cube, grib, full3d_cube=None): # have all the level information. hybrid_height_factory = full3d_cube.aux_factory(factory.name()) - # hybrid pressure + # Handle various different styles of vertical coordinate. + # hybrid height if hybrid_height_factory: # N.B. in this case, there are additional operations, besides just # encoding v_coord : see below at end .. From 9f26e7aa23d15e93356598b4c231db887abdcd46 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Fri, 8 Jun 2018 14:40:24 +0100 Subject: [PATCH 058/583] Give refs unique names, matching only each other. --- iris_grib/_load_convert.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index d261b96e..f1da7d41 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -1284,13 +1284,14 @@ def translate_phenomenon(metadata, discipline, parameterCategory, if (discipline == 2 and parameterCategory == 0 and parameterNumber == 7): - metadata['references'].append(ReferenceTarget('orography', None)) + metadata['references'].append(ReferenceTarget( + 'ref_orography', None)) # Meteorological mass products for pressure: elif (discipline == 0 and parameterCategory == 3 and parameterNumber == 0): metadata['references'].append(ReferenceTarget( - 'surface_air_pressure', ensure_surface_air_pressure_name)) + 'ref_surface_pressure', ensure_surface_air_pressure_name)) def ensure_surface_air_pressure_name(cube): @@ -1394,7 +1395,7 @@ def hybrid_factories(section, metadata): factory_class = HybridHeightFactory factory_args = [{'long_name': level_value_name}, {'long_name': 'sigma'}, - Reference('orography')] + Reference('ref_orography')] else: # pressure level_value_name = 'level_pressure' @@ -1402,7 +1403,7 @@ def hybrid_factories(section, metadata): factory_class = HybridPressureFactory factory_args = [{'long_name': level_value_name}, {'long_name': 'sigma'}, - Reference('surface_air_pressure')] + Reference('ref_surface_pressure')] # Create the level pressure scalar coordinate. pv = section['pv'] From d166460d45f0775268d693caf18b861d25409d97 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Fri, 8 Jun 2018 14:12:41 +0100 Subject: [PATCH 059/583] Extend hybrid-levels save to do hybrid-pressure. --- iris_grib/_save_rules.py | 40 +++++++----- ...d_height.py => test_save_hybrid_coords.py} | 60 ++++++++++++++++++ iris_grib/tests/testdata/hybrid_pressure.nc | Bin 0 -> 2103186 bytes 3 files changed, 84 insertions(+), 16 deletions(-) rename iris_grib/tests/integration/save_rules/{test_save_hybrid_height.py => test_save_hybrid_coords.py} (60%) create mode 100644 iris_grib/tests/testdata/hybrid_pressure.nc diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index b3298de9..63b592fa 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -34,7 +34,7 @@ import cartopy.crs as ccrs import iris -from iris.aux_factory import HybridHeightFactory +from iris.aux_factory import HybridHeightFactory, HybridPressureFactory from iris.coord_systems import (GeogCS, RotatedGeogCS, TransverseMercator, LambertConformal) import iris.exceptions @@ -739,26 +739,34 @@ def set_fixed_surfaces(cube, grib, full3d_cube=None): v_coord = grib_v_code = output_unit = None # Detect factories for hybrid vertical coordinates. - hybrid_height_factories = [ + hybrid_factories = [ factory for factory in cube.aux_factories - if isinstance(factory, HybridHeightFactory)] - if not hybrid_height_factories: - hybrid_height_factory = None + if isinstance(factory, (HybridHeightFactory, HybridPressureFactory))] + if not hybrid_factories: + hybrid_factory = None + elif len(hybrid_factories) > 1: + msg = 'Data contains >1 vertical coordinate factory : {}' + raise ValueError(msg.format(hybrid_factories)) else: - # If any, there should be just one. - factory, = hybrid_height_factories + factory = hybrid_factories[0] # Fetch the matching 'complete' factory from the *full* 3d cube, so we # have all the level information. - hybrid_height_factory = full3d_cube.aux_factory(factory.name()) + hybrid_factory = full3d_cube.aux_factory(factory.name()) # Handle various different styles of vertical coordinate. - # hybrid height - if hybrid_height_factory: + # hybrid height / pressure + if hybrid_factory is not None: # N.B. in this case, there are additional operations, besides just # encoding v_coord : see below at end .. - grib_v_code = 118 - output_unit = cf_units.Unit("1") v_coord = cube.coord('model_level_number') + output_unit = cf_units.Unit("1") + if isinstance(hybrid_factory, HybridHeightFactory): + grib_v_code = 118 + elif isinstance(hybrid_factory, HybridPressureFactory): + grib_v_code = 119 + else: + msg = 'Unrecognised factory type : {}' + raise ValueError(msg.format(hybrid_factory)) # pressure elif cube.coords("air_pressure") or cube.coords("pressure"): @@ -835,10 +843,10 @@ def set_fixed_surfaces(cube, grib, full3d_cube=None): gribapi.grib_set(grib, "scaledValueOfSecondFixedSurface", int(output_v[1])) - if hybrid_height_factory: + if hybrid_factory is not None: # Need to record ALL the level coefficents in a 'PV' vector. - level_height_coord = hybrid_height_factory.delta - sigma_coord = hybrid_height_factory.sigma + level_delta_coord = hybrid_factory.delta + sigma_coord = hybrid_factory.sigma model_levels = full3d_cube.coord('model_level_number').points # Just check these make some kind of sense (!) if model_levels.dtype.kind not in 'iu': @@ -862,7 +870,7 @@ def set_fixed_surfaces(cube, grib, full3d_cube=None): n_coeffs = n_levels + 1 coeffs_array = np.zeros(n_coeffs * 2, dtype=np.float32) for n_lev, height, sigma in zip(model_levels, - level_height_coord.points, + level_delta_coord.points, sigma_coord.points): # Record all the level coefficients coming from the 'full' cube. # Note: if some model levels are missing, we must still have the diff --git a/iris_grib/tests/integration/save_rules/test_save_hybrid_height.py b/iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py similarity index 60% rename from iris_grib/tests/integration/save_rules/test_save_hybrid_height.py rename to iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py index 87bc149d..3638fbfb 100644 --- a/iris_grib/tests/integration/save_rules/test_save_hybrid_height.py +++ b/iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py @@ -25,6 +25,8 @@ # importing anything else import iris_grib.tests as tests +import numpy as np + import iris from iris.cube import Cube @@ -92,5 +94,63 @@ def test_save(self): 255) +class TestSaveHybridPressure(tests.IrisGribTest): + def setUp(self): + reference_data_filepath = self.get_testdata_path( + 'hybrid_pressure.nc') + data_cube = iris.load_cube(reference_data_filepath, + 'air_temperature') + self.test_hp_data_cube = data_cube + + def test_save(self): + # Get save-pairs for the test data. + save_pairs = save_pairs_from_cube(self.test_hp_data_cube) + + # Check there are 3 of them (and nothing failed !) + save_pairs = list(save_pairs) + self.assertEqual(len(save_pairs), 3) + + # Get a list of just the messages. + msgs = [pair[1] for pair in save_pairs] + + # Save the messages to a temporary file. + with self.temp_filename() as temp_path: + save_messages(msgs, temp_path, append=True) + + # Read back as GribMessage-s. + msgs = list(GribMessage.messages_from_filename(temp_path)) + + # Check 3 messages were saved. + self.assertEqual(len(msgs), 3) + + # Check that the PV vector (same in all messages) is as expected. + # Note: HUGE gaps here because we took model levels = (1, 51, 91). + self.assertEqual(msgs[0].sections[4]['NV'], 184) + pv_expected = np.zeros(184, dtype=np.float64) + pv_expected[[0, 50, 90]] = [0., 18191.03, 0.003] + pv_expected[[92, 142, 182]] = [0., 0.036, 0.998] + self.assertArrayAllClose( + msgs[0].sections[4]['pv'], pv_expected, atol=0.001) + + # Check message #2-of-3 has the correctly encoded hybrid height. + msg = msgs[1] + # first surface type = 118 (i.e. hybrid height). + self.assertEqual( + msg.sections[4]['typeOfFirstFixedSurface'], + 119) + # first surface scaling = 0. + self.assertEqual( + msg.sections[4]['scaleFactorOfFirstFixedSurface'], + 0) + # first surface value = 3 -- i.e. #2 of (1, 3, 5). + self.assertEqual( + msg.sections[4]['scaledValueOfFirstFixedSurface'], + 51) + # second surface type = "NONE" -- i.e. unbounded level. + self.assertEqual( + msg.sections[4]['typeOfSecondFixedSurface'], + 255) + + if __name__ == '__main__': tests.main() diff --git a/iris_grib/tests/testdata/hybrid_pressure.nc b/iris_grib/tests/testdata/hybrid_pressure.nc new file mode 100644 index 0000000000000000000000000000000000000000..4e7f787a8de7ef4aa1ca2915c6d317fd802ba3fd GIT binary patch literal 2103186 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

        _6Lqb!49}v7I<3Un7{pAxvNwwqO-z zlrMrg^HfH&ydGb!7uVP7^C|7(^F1Tlx6eG{{rD=+ zFEi}zg89hjv;F?5-e;a>uYW%am=FD)N1OSwhg}_FR}V)DH)4M6U|$!|=i}PU z!+tM2K_0<5Y@Vd}GU)pe1Lkw@cZXy7OTJ9LzbY1A6Bnn7&C^8N=i@Ua`~J8Jc6cwB z-tWz4tW%wzNMHM@=zGrmUR`p9^eO9R=UU1By|%nTvhP7?|61~Bf&OOv|3+N=RxE!f z+77o}7qjmB9CG|;{9&KluB&0!`P}j9{u+9_dw+FG_%Tdj0)1|@f$aCtoPPc%<)Z>^ zf42T8ef$Tp|9df`d==QI+%;%B*!FP~JH+fF7qCw|#MmvJUn-pu?NYr)@{slkuai8# zUiAGLb?l{-c3RR-A??#9e;wzW^7#F?8RczI52@RSdQbnR^s3l(K1YyYR~I}_mDqtk zPhz{ek3F4ZPY2k^eeB8{`*?}H>GKvd?BX7Fs(-g=VZRRG4A$1z!4u@F_kCdx_Sfi_ z`1kK3jz1y&7Wwgc^eXwbT|A?l9iA(^4__@+e}2z$LjATG7a{$uP5XGiIAomVv}>Do zwq0Cjocg_jG5y4LvEOg4)2~YUoA;3`^ux;K^sAqX>CeRaWnyxP=zV3MFY8_?y?;*& zek3_&9_n8p+4t$J-kW!>^xbcZ(L}6aFE37$?B4_Z{$R|!IcHw={TVIh?IrX3fcf6% zmwTz=^LgdQ@sdYFv3ZPG`H)zCK&%bK*89ZXdqm$qVEZ{`z3O5=d;iG$N-gYX?-BttiibqW^|&w%xQO#H(G`pk_3qDueC0^S*L(=oP4eukDSabfEvUx|4E9$2*7t&Yij6(Q@HJvP7DulZ>u~WZ$!3T?gE8S6#1jy2gLK-Y zo05;pn)Yl`o(lClqud$&Yj~j2_j5#x=L|nb&6p?roD{uT{{4HC=a={h>8o!OeJI$Y-WOfhQB%Ca^e{> z|HjzyE#~1i>5iC>+prHCxF`7c`y~qkBB>G;m=B1Lmv{OR8JG}<=o089h{QKPd zl5+YyYwJ42mt8OVJ+kJnBsUjgWIOzKl3Un&!BX<{Ph#gU;^ME!e;2)<-N4@NVs9td z+dj|I#O^Gh&v!4_r|n{&mN3O0kJ#6)V3$u|7yCTG&h@zu?+cHx*L}Xo=jv_8k8uy- zka#A<>-P^k{(Xgf`J9f+=Y4$d^9R&Zi~1Y=UiH-CIVZSTa{brvCb4#dSj@$Q_Vl<} z(hmdrUq=6!F^;>i4P)r{0ev3B_u7n@7kp3lkoh8+Dg8dr=f3ya_jI`bx<9w*-+qrU zKcDdDiIwkAo{3mJL(EPS2d9etuZqJl?q3vVpBHUE*G`n&I6?G18NS!e_g)0d+n$$a ztRH?)K7EhESKloT-z7HRA=cj}Mn{N~!^PfP;9=tU&0_f`u?+`rl$^XltoOv|5V3L) zGV84ElU4f&`(nN~{`V3K*7-i1!pWX;uj1eKobA38yQSD5e^cxlpC6uJ2iV?Xjj>vx#W|XT2yOcMh{53eBUP2haCLBWhpAfD`d`;r7lI|Q%$=8g0S14bP z^19wa`kDK&&-weg#?No@>s9algT-D?^tq79VUo+k#pMy=hioXr`~t-nLf^w26Hgna(7)6Aeyb&Rqt83~zPsvA6mO2bm|iS-FcW=mUFT<# zZNCpLmpm@S?iFIbhSuAzT@Y^m3&Q_gbo`aeB>Vdr4f2tZueJB-`krXtf8z4BsmIax z6ki5?pUMz9hIQ!QwQI<}uOOgaYt(;>`bZe0Jdf#$-mHbE75bj#h@1ORrmt5Q+`aTuk#}+T7_x%rk57qnl6YTQl@8!?$yUme( zPG$NBx%<9}Xers}ReXQl@XylQPVN6iat@cU`d8`wyN31tJtV?kL3};ffHhc$Aq?R7 zPl|s+KHGnk?DIFam;HOei078xjq>MvsO#9v^Q)!zJ&H}*sYbim9&R#T=9kI8<$!i> z(*J#*j(;DSF`nwg+lKy~WP)71Qt`H+pWBAGw;T`Y_`5!%pDNsd{^@yUbiVZAx#IFH zv0xsnoGv*&Rh+Va;P2qgz97Bd8=rj||DO~qA1B;#Vt%Z+^t}2(+}|(8?-k2;i@v9; z&HP_w-k%*I_wnJP&vW`d0H22}55@fu(d*&lAj$rnf3XpN(C0Hk*3q&nckjC<`$_ix zo%ii3*sa-mxlgeVZ7143t)uV2Reuf#Td!3-BRGW_jG*m-#Odv&a5L*Bvp_~exe7r#oJ!5oILjz6b2Bi`aA3RmndE?y)CFBE%` zxZG77?IQM{FDB0uv*(I6nC>jO3Fj^R!wT#?NBZ$jVzHxGh4BuO=g$^1SilJP5>5%{ z_qoeUa6~*y^4Ww#(yPG<`53_*R$LzE4=!Mh_(B-L9vnfZ-zGmZ z*d?EJ%Cj_Sk2>u&p#7RJP<___ON?mu5&fXjmcC8D?9tzv^rsR1c^u1MOh5N?L`eT1 z!_J=a*WXKA?kyIt75)3eU|-4pePqOQbjkeSbJ7gtcU?V<_+j@glE*NC zK4<20_N(t#zCr$dZr{I~rOaPGSLXMI6XvTqOv!H-|0VSKC!deX@i!n`oAUa1FQ4nO zoOoY>aPxze&ldUheC+#9;v*^dK=l51ni6g#R!$a2UlSJ@`ftKB#pbufISeO~+pq)s z(B~2>XUU(x&oW2$_gUs=ILoD}r$5C+iqU%3DK{z~7EF(Z7B z@nXBz>9k09b-aD|-~PBbJWlj}v(ITnACP|jJ~4Zb=W<7C%-5fK&*H}O5%==z%8mt?u=OkGlW-x`3_1M!sXW2VI>81ONK9{-JS8@aP zUnkk;K{^|d_Yr-LAn!;HpzUOzM~GSXy`Q$&L;lm(h+!;FUWNQhae&>sY8Ssm`r3=d z&TeA$MPl=XVg+_!hhZ4q!V} zI?)rw`V++Y*n$$PN6pVF&hL3g>nwoq%*}dBX+O95d2m4gpY26F z>qY+_GG-h#7-v4GJwdK}9KwL{>T@6S0~Futd$|Wm_Ite3LnQk=dx2bowp*tg_ax6E31&eeTHR_WguDZHkRb9M*m;+4Oe>7r0w);%@@|ox$Z#6h698459bU{GFKLRPNrV?|omg zzuy+~{NVGQzQ?xy4f(56AAQ#=^;|tg?*8s&oAwCMPx0q^U4B#k{oVBz&nbiNN}pn< zbX-rA$NSN?ll(m5ef{!Eg|A>YPp=_gb8&i|==alVH%j*TTz?<1MDO$3{tlqeanFcn zOuRmKPVvb!qhi&u)Y~VkD3HlEHr#ma23HETjqvY|k z&|?RWpDNjQXz~QyA1AgSE85-*9)teTVikrkg*E*3;AjmKK}+wRLG4_+mDpV{Y*yq~=Kz5@1P`*rePhY5PypS6ADZu>Jtwtbxt z&gazg{pH_wZ{C$`d)RjO>Us2i<=!XWoblYm{%kRxgV)I4A{H~`I`--m|8>I8;Mnrs z3OB@GlWQuXgj<1dC7jCa{2}2lf>B<@&6^U4TtD` zPn5%FpOe2jbUF#?_#W1bc>JD_?-gAA&g1EdCuhC&_Z7TfHT|~Sea}gJo@9S_aeThy z{`bYs55)FVw7u>9+17=)L)$f#A4{MAP^?@a`u@VvxstnQi{9t=_a{s2gnlOX@z?PW zZBI{-L;Tsk=u;0v>Y?*3h0jSZar%_ENjd#|;d82!nZnsl>|RcOu7p>Mt+^OoFV1cd zmp6)j&$RO^$re=t}j_H4X4s^ea<f>01Ft< zZV`0&1#+KwgYPJwAsoRLv_IebGbMh1k7O}X_$i#Mq1~O|()lDGxywg-i8fScp=J#=CZJ;}buY;dUL5LVZ) zg`B}I;rqllA^ysn6;F-y$I$m8G#-C**HQerM!AraTGdj05E_pkAu?mE5^Eyq8$k#2WGtw(wWKkK9AT_wFZoLA+zq z8I$gkd<@BFkMa$ukG!Gq)yIq7CyKSFh>d56Gx|^2l04W|tYgn5FO}SRl{jP^_?*A* z`DkyDd;B_a4t?&qxv%t=y+7;sM{S4ueFcxh!QKkD+)JE5+lj@V(mP*1XVNCWIpZ^= z98<>UjPi{brvqqx^b*C}f0^j_1J=HOIe4|)eZFdf|1sec(usLKiK*W)^T2Rtg>O** zKChEA&MVO8mMS~Q|CDxX?@sHB=?UO zdmlyqm^k~mn51HSg1G#YSbkb;ohZ(cYp{;LHsSmo-1w7(g9%(4fBYHwv%NhzNwUAY zUVcS#{}eI(x|p0M`n&1reT04JbJ49C z;Vu<@es+AhWS=uw{8DmywOGAY?9N5s+v4*U-gj>OO76C!eLlkXkT0*3yYEw*5`Xt9 z=@ZhOT`Ae;Y;9Nje1p%$`+Sefm0hTCb;?~*4?cJ9b}ngu+oQF!70%Bki*HKyJ;QD4 z-`^+o?*ZgA%wOS0q+c9^`-jB#2SwkfQM^~O-$VEP%#C+S-+Y@G z^~K&{V*WPIxOP9f+#UVPM4!92y_)VVz2Bqtd$s-!P|5h3uHhWn=RWe+DxS)E(%Vxk zV$tWZ3&vskQt55yPIp6op;*C=jIdYz`%U-xa-U(p#;^r_zA0xskBP_66Wy06d`9{M z>c#Ib)Z20&Qg0dg$zLFSm3aLgK~BBbo+I~YN3mp_7tbIZ?H7c|+l$M`iBsf~_U=4e z`X=R%$mi;N%FN^5|EL`<|C6_ge!sGJlw|MA)LD0YzmvZsu>6Gl`Ta%P$>E98FJbpH zl7}#YzE`UEX}QOr5+^4R9y;Cy@s+Hjlh5J*^Z19}$1ZTUy&WSjVD$?MH^L70cgWJQ z^!~j#`_X_5Nr~y@#~JoOTIdhxUqSUq9b1>6h+*ey^>dA5Y4$Z z(<8=7&*K4lyi{-x@$Yj>wyPuR*}r$i&L8>jP_8la$RJhvtm;4V|r-!eQ+-Dv1 zdE(W56;G|(+7z~AkOYD*0GC+_mSMVw;0|_%xmHpCUALA z>1(iY56Ppu;~!eTzA1ctH*{t?k8bDE4UI2JPKz zO7DK?{Yk&i==T;I&%s|y9PKOy&l5BE?_DKFk(j(tZ0s&}+M@4k@x3Oq*GTW@(D@#c z{l1~^De*q8-%kt}e_gnIwZeHH+3&-)NY~G=DbKGN`L+EUQm(;Hil@1QIAomWj2AzL zHavb|4gVSAtwMd(sHZXMwW*gL_0oHZ((!#X736$3=_lm3OZbrZO4=nM-PPx4+Bv8F zeO|}UkLjBJR;3@!9;5W;PZT5Oi4;3Ndb#wCy~WyoqTh$~zJ3dAt1NrmsqJxi1 zo_z{_Rvcg_R8NxZ-(QH)2%@2#UW5pT%GS=CU=YksP^-qw$jP$(Eo=}bs>vxax_bGq%OA6=j@(e#M zd3d7OCcO963gQ{r-XfmG7vQ` zRbC}IBi}jpv%eqYbHVWs<*#!-;m;9$j=}q?<4k%#pR}=uZBN!|uZ;d+`)ovi8NwV6 zO#1PZ{xvyH>CA>=mwuSiPkryD?;-A>&tV(?Rl?7q?_rw~|MYm$A>D#;Rje6T75aId zay97Z{#|KAzxDI3?eIS1d3uu4@%OO(p2YMt>DyFM(4b52#BbK3ttuNqoLHu4FzRV#j;m zdS-hV#<*wuD?Z=P8zA?IC)`)=EzajkCyGq}Cu2}3OHl8iE zpCP8KcX5b6*1hQQl4p+-6Xfs-lI_3qWc(3N`c!0?LEGmQ{8gVMe=XwkdDzZl&_7)4 zKS&&4A4WCwcN3$#h|N2ruZn{^A>UCPZ7tT}_zsfu+l%4t#8yQd-CCS%B_=R~RosVg za2xrX6TV4&OIW}zY{NR~Psz`K{7%S!gYvXs4g<;^Q4i%kl>Yc$VsKwEyuax4Ez3Z1 zvW+-eL+>LG9w>L8Yw>xO>BFRtA0gHsEw0*0+evP?U1{g;)A099vAToUreE3~Yws-m z=(%F~Jh8Ql=<@`v7f7y0_=8jIJ-^pFWjxehB!3fV`!IMh@xDa#y)V8$FWDV;!i|aF z_k+xkOVUa4SAk93eNRmJe8o4QTusUuwWROuC@!d{!P6zzJgyjTeK>|b=dxscjj8WZ zQ{ku7x1T>;k5%$r*-ie;2KthDq)C30=g40`d<)|D`?)>Z+wYP3{nUW|;`31XgDKZT zMgK0de5~Z0a(LcyJ^OvzlKuV3!4ZwrNO2zQgqR&^%KO;GS zUED+49oQ8Rahl5)G83H4WeRO$MA^RCCrNP6#&2Vayt z`I2ZmrS>(+-Um;xQ+)2g?}Pasz33wO_rA05IrDpX;au*W8^v%T#=jNQ-;4Pl#5wf$ zJ}S8TJ2JzY<*)l|v3Zl|ed*wO$?0|fojLLtF34B=TKUVb5`!y5zvnlRu5`w6qL^!X{G&wI2cl9O}9zT4pklKp;Ua-rmce(B#u%qe=mFWLIB{QG&x z_uRB{>3t47C;iDcrT6(1e@E88^9*Tce}AyexLkOic`xbF9+kIAULGd;Jrlq0Ufn4D zv?~tw7j1_&Hb}1RBL;8^W8C}D@1M^dZeN9)>?iuWAp_F$eH^~;Y4x1P>*e3`dvbu} zko--F&-S?6CR>R8bz-aRJagT;b+2jsL!A6w43Mk1*YIBE>B??;SCr$zeyooMwuG4cBRx9#HzcIxW5W&HYHm>G8Ug8Cm)|2|ih zQJ$1^XVlN|1>_(4T*w@Mwx8>ibIv@HVXw!en=voUm^Y$r6>s?{F@wGbX3D%WA-vy{ zaDQmNm~gKW{a$EogXAUisDID%{)*52#jGQP_shTca~ng+3F~nicG0KU84>jU+58xV zYkgR>o$UC1@2bD^S_8*bOc0m;3_hgNwxYGI3Oh;nnD`6Mc`{@@C1tZ+ZDA$^IT>omYNAv~xPg{d&>&v!uV0?B}*B{jax>KEU12T{Xvd zx!kLlivHcf-zkc6>GQKh+xaEqB|k~}{)u9b=LkPf`}>2@d*q(JQ(X4NoOb9ODtWe1 z^geX4pXAZ&@Xvhfa}mpZrT6}?_pNQmTFwrTKc7o3UN712`T2Lm-a*p$4;H)7_p%0E z!jZ3t^nD&AMDKlb-#69UTjBiui{KTK{eDsWUy^+ubl#Heb-({?$=#+nc`E)x(fiF& zLvrwF(eK6OkC2=^Qk*?X^gR}pZ6y!ZFnf&jBmB1?F1hs((e`q3Kgs=ji{pEWQ|!Iv zoh1+NBsT9T7F**F1~9t4^n(iAN?c<1F0hAV?Bfu7dH6Tk%>!6LpTQLW1>tRn$JoyW z=}c~|^lI4Aeb^>H!`sSzemimD{N4dQtWcgDd5OP-a3kW&NG~S+28_|W9!kP3i7%!e zyTc(p8nAQ8hpD*_ee*?nXj!#L?cBbEJt&;zc^0<6M>_XqC z;&Z*#Cn}xtNn)LGwtSl8h;sV8?{FvSeXiK|Wcyz4jPjR+TM}QB`1?;#_{R2P3)ZdHsJxF8b+iFk#e1EpTV-vrd_}(x2chC8UB^SpK z4qC1sEBzeyhLV@aCE=?_qbL5(dnKnwiQcd4ABmiZ^LL7~w~N!aindGqJsaPjJ;9&% z^ZY#=zh_x}hr;_FlMeouFd)6`UGmo@KTGPz``+H~4vvt&5__p6d>#KOC zzi(M(U7wzS`$)`B7QN5b#ZIW6FMakSu{#q-zYx=_M1Sw3y+HnhIQy&U?{W9|p5B1( z>s4XO_W(P5Kd@3NTuS%=yF2;4^yST>zYo&70r^_d`{A~i7eAA}kA38OG`v6Q`v!eq zxW6~!d&TQ#D}3b)(f7B6W63^GoPI*GpYMEbspfu1J5Ooj(T^ENdd=vWpf;Msr zhp-OgwhC$i1pS2X zN;bCKuz7!OM!XBstKLL9zZCu5BlnBO_oR=$gFEH(`<^}zRX<7Yes9C)a26kt-rtWM zQ?LGRcZYeR)t5ip(|)h8bFlPn?CK_VZx0U9kFk4wPhEuU`FV=$?*c4{*Y@&|_!b8$ zy$SM|_`N@#G4I9DT(9yp&%oIg$e z{5x+wl-%52v>o90yKE=V>vE4CCi=a#&O;G zt;IU_+~D?-8_?$-Mz@pRtm5wT7fr$^=LK zyT~Kl1N^rLpTihda1Zf6CY}I}U_rdiKP#PtaL!jB`@Mj+>od|xoo~Wtq&Fwt7OX;- ztBt?R=@Q@6&k59%?eKzntkYhLyQv<>Jm=)JxBEd%KN&wl{u+LMdaUH(HRP(8F_jBG_Ht5ejPd#{s{8yeS_MRpBK53s1_PJWydrjh5kPpAlSS7#7qshm^ z#e#l6eIW8S;)rqJ`$bxhl0IpO70TUyqU1UDZ2WY|W9-=(9HAfJugf@X5a0Nb3O8YV zR^X6)`uR4)zn_m|(ytNkoO&L+{;0R%vlYM3H~T$7->>24j{2JUW=cFI^%_u)kaA6k zx7Skq{aq>l?xOG6%=SY6I??+TzVE2R`X3~?W5;!llAOWrdnHc>qVI$9{%Xwn;@^Wa zwgF^r(!L!2U4VaPf^ze=db!k`47+!4wr1Z-23ESpX(o% zyU&v>QptXgta7sC!Kq^ROn9!?_<4WrDpk z@%OL!j&%(VZ13PN$KHofG zLb==D#{aiO-ye~DUGnHF=uZ-}6UEs_#en{|aDQW*^l7&W?LNSsDd<-|ciP@h@iZ8B z**=oH(7)4H>2KBji3?=$Atc0Vf^;rC;$H4q(XUoo;m)!+>e1COzj{HRvadEo1JVi{Y7vH-Xeop%N zr^NhYVtB0BV}A0vnS_2)qkVk8a>@MR?`6&CA1UphL4V(5LVpODr+goW&uQ5H_I&Pn z&F?MxUaVzD`SdxF2K_HYKg2$+?k#`aJ;hlp=C2Ubmxw-(==+tuKQ&^#i&&?otc%kp z5)bS4=&_RhdujA&$=yeZem~FaukTMtA1HU<$1u5%;n5v-&4e(e(fDdD|8npPFAdKYmDo$eTUgunO>^5^~6hR%=#9zR1T2 zPGJfo*n%@yP`(EF9sgeG4Q=0JPj|4_+v`++Big5NJIVPS#gO){-&1n;-eTi^qVF;3 z(0>{ak=}OR^bwMMzu$0M$u;_E2HkJF$bIPhv*Ya)ZUKwON%lT$lW{N&(LYJ_dyT#a z!tt)&6GDF5f&BYCd7XYAQtshB9w~fpVU{tJmTk;=oy52CS=|T zq3=iWd5#o+y&dF#yfg7f;;4V9wmL_XyW;ZSh7C&Ue#VI zeIE|j$kR{A-RCAd$4kzR6{p0XvCjBC_Xg{{_m!*fA)a>=?p>nyhev(%ZxSn%D}TM@ zG3$-b7yA3Njn~M%@hY*#da!zL%1fm8_p16Yle-r!c7Y?yo2H4FF?3rN|yXMaSodxy!T5I!^v(9~65> zit*uMcChIC>3u(Z8B0HWrC7X7T+*+~-6Z?_ulb8`-(4&jzy5BO@1^gpmwRttNWb#E zISKv7`5cq)z~k=(g{yp?@Lv{}^p|8Jd60|UABn}KV*M)7-)EfuUh?$s;*95_hTHj` zYX8yw#Ki-}=EKC^BgEuUV(ZbkBiA1;IeM_z$Bu4be+TrhoPJpShw|a?yl2--9$X>% z`Nzv!s|x)kXPl3i7yRDf zl6LiX3B0dcqaS&GX&_Hw$UHWOtv!{#@4;BTZy9&rJL`TmeYyPCpzn2!UMzh;zns57 za{KwB?@^vVTeA1p{Cjfq3DQTb!^=lW9zC4!te0)<0KW$|!k+Q>HvCvBRR*OcD%Ja zNI%(HY~D$%U^kcKBf|b}5nsgq>J)pik3BiWUX8G03+&no_UsJzF7|63do)LmY-bZb z#6BKfEBmy6wV3}B`}oTLi>osapO~u7Ke$B{32sD14I(fgN&uBnK?V>QP$cf-h9j~> z+=3fZ>k=1g+(+ETm2p8wt1!5Zd(^7Yx=gLh)TK_XwW)3WrP|h5tIqF__w#x=PH*_fBp-}yGA(TdSm)AgBOpmHz#~2gz(`W_df+k zU`2l4<-j%AQEtFe4W+l=7B2r*SZ;(qhkN=9$;GdPGx$;Qd&$e4 zu*7b>#GYKjpF8Z$8|;l8{5Xf_Ol~e7lz=Vy-F`}M_7x60UB~h3d|sgUkL|dh^Ie2}iugE6*=@h|hBvFpmb*?>&rqj}vCh^X3_n?FYSkiR8Wgue^Ub?{R#s z@)z*I=@%q#YvF|XQGZYJ^vA-%&xO^$375=^_K%W>@Yjszyt$2@V~QQQgf9=_#nCa! z--4UFNj8r*Z(hKg!#gT}4sTv_otAkM^WByILH+6en|`*!;+OQ3``G-`nODs_l;6BgIAOln@21al3V3ee`6{=8w@%R$Gv-ZqOYW1N!iSxTo~(orMYOq0h$%?x=LfHLF=iZ6_;lrTpNQv~vp(Iff@^;E?h|%5|a2 z_iiQ}?kCJ|AS~cpBm4sr{00W_*XFqunJudQLw^@c9+vnK6z%`(=PRA{gGz8KaSJgqn_g*I)8Ll@Hm1k{T|Vuka}zSRnae>pR?n74f-TvoSI|R zuN8W!kDl6`sPyu_!uV8SbEeSyIDKBB;|1=XsQm6(!odrL^~;1i_<;BQJAQNbM&&zx zfbA)R_bT1-RA*O9_BmkbHIl0j36~!buCEe~uM~P;T{4wiu)gf*-}HG(kN#ZPgYRe0 zmb`enaQal?l67czkz~h549}B1V%2tP zJ|-M|PU!t{`8Oo{eCYM}C6D1ny`M>*|1;(OP1yX0aP?c^3|=yY-!|~)4twJW9zB82 z6xfq(m!80@Q?Q|2M?2}Cbe#>?^M1k!d_JeYV|Y$mt9$^jaeOkz@$>)n;5{nm^O|i> zZr`AE$8#B8A=&>!7O#}tUM?IyU)aA)==fibmry)T>5il6IF$CM+MJ~Pi21f*zIh+` zmiOHIptsBypCb`HO!a+Uo8N<$_htD~FZB5})`!z~ zDt+@N;f{He6_TT82!|Jg=%@M-k~a^g9D2(3-M#Pdq4M|kqn{z!`)Rr}C3{_1BDY{k zea8_fkTddUr>lPNG+~H-9HYOyzo&P1<@Xa|dbF_UA+yf=f2{4rwo65~SGksTF@gu% z9vj1NlN+jBeLbOhjpIj@95fwOu*k`a}E^?7t9WM_zIL9sIWgbFlaq@xMM8kZ%8r z8o7Zt_u#V`cHIu(bf_=KQ{|4zh?C>rZGj1Kvq0jft476W$?s2AEN4s0v_4mq>bU&9F&$EDUZ}!!^ z^8QNu!P{Rax|Q-BH#=mWPwz9OCZSmmnQ2oreb%)FU- zAKys%9rHgR-TONoN73=X9lvBwe{<01_gwcpAHTmt%30psPS=g$-y^@@2PwT}e0sd^ z{hKR2JWy!+|2C8ykv?|0TPxjmZI6rnOiI?#HTr6J3hkiRlCvaN=YZ(j%}BEU>!$Fo z<+GLEpue+Ha`-A?_Znew1^5Qxb|!SZs^Ch=OV)=0Jj8Jw9N%g1K9y_9AI&A(&pG8f zj%(3fuKW%CTeAL}mkge%eEVNaFO@uen$YK5*)K0eAm8ec|MrLhtw5 zJ8$C}%3mdnnZG_SGh=>FUZ?zk??}hR*t}fn-e0$QF*5VBfCu%SqI92!>i-+NhbVn- zpVY~cM}48=(@vOw^Se`?eD5>yzK7skg(Jr7ylD z+&jl*DS3jv>)u4UR|x&TEO@5m?Zv{;V}(ACdT)PSs`S+Zh2sYZ+p{Qtrm)X?;QwQj z)0Do$u428?Fz>vde!{v^-bdxjdkgJf8KIwM$12@^jRAVl_Oa*)<>7JujJ?qN%gj^Ft5)!yA$+HUM>X&y+i}$s39vFgaBmMSwjK_b@c$+7;%!94JZ+JdKo_EJ{^YdAe-_TA* z{oMZ{n2(MdIJyDzo$s~z0h04u3Vr^K--ijjxxKUUeXh&;NXg@)grSjip93?c{(|>v zdJC0b?k_BOkJ1}SuEEhwBs<=?yl zPAJ!azK@9Z2ej*R)f4nZ$NkL?)b$--Wy<~gyvi;7Dud5Or*Oa4lju+Xx0^jg`960g zd9>uoSlC=79J8*L@aM(zmA-_pZeLEhR}0&z&~a%uZE7>`uxx08puVQ`h|B8_3?f(ZpS2X9n7#zm+sBb?d`#1IOru+y# zJ?%^OKGyIoWY)(%&wmQ9o<5#@p0EGYdtYaLh4LMLdh&kBK970G`ak%V(nmiK7Vw7f z=aTD&^nVuy@Q>ubC6E6{Xg}9Eym!NY^Buf;j6FKW9^Kk5jlFO}`OP0`w-YYlIn^&D z?|vvOzAfB*SvdZzF#o8~=koa6c=H+i{SKIyDL8wL>b3BlDg1N7ds4hW`HN@KKJ#zR zyel84^ze~F$Egp`mh5;&<}dXLN-yp%T*6lte*f>QbjOp7?k{=E^RIaR=IwpnpS|<% zUZwIG@8kAL$@b?SUnAN3NGrzAelP28==_xO_S+ATxBskq_Dh=mqvVQy zE;o{k?+CMR2pylg$9PRXLcIm}Het?u@_)1q^JeCG^8}S!o+tFayWwLbH;)1zA>5$v z^K&I{&lYB92nXmj?;mf`Cwu#R&~FL)twKKy&}+j()Q-=C9v&>YxQ(znNa*t}%!3`5 zx4F6Un*)XRFYY7zzin`U@>e$%I^Kls$o6wJU*4G?!vh2OUk?8>znzmmpnPH83UA86 zfb<65WdGnk?XIym+wZ~tx&i46c$@tpTGGu|huEcepzYW@^KN*d{eoxkVf#iKVTd}?7rUbw`DxN4=|+vBY1WWf6wVp zOaJEZ;_%1f%RP8=zLA`MUs!!t7=KT=BYjP|9d_>;zTIaWTE@$KKj*#&+;_=+WS%$h z;TY_J8|Fdh@2cOcAEo^}z&V&;cW!nnmtSA=w+MueKRD$*C?lmOcM!IBqTCTe`x&&n zmj!&l@fZ7dQMs-sOnG0kJ4y~|zX>I0HxX9!C%ds^+nICvWjpZt_R89p}EdRQcYA7CcvS??uAVONEY`;r%W1E0k{k z+Ql0r2k_~M<<~2H0}qK_jZC}U3nb4bLht|X!TWlbD1CXcZ~*$;*Zvcg?)U=(?r+ae zgYqNRqmJ=$JbuSlbX=t5M70;6Ahdr)c(i2u#oJHae(MvS-}2Tfx4MO};ybfuKF<%P z9p0Oe`88qQ`5efSbu8k#>tj`K27j`Dwa@QyJSYEu^*KS__ntqE{_uSBQu1EhlXsDS ztuU^H3wXiaIU?|#3OFUkH7&udHQ0d zSI-v~mmxnzxISO#b07K-lbk(BxVpd4adYBRB=>l)XUspx8O`oVeqR`$BwU>;%+UjJ zD!GJLbr(vW=aher(0;%Fd9)a-d;$79ta*&mn~`t}f41Mw>P)5Ez8o{Jx_c;nem7xuIOWhs4SLGFw+@wG z-BjrFJvKLxyttmw=Wf_PG=N9c*oh-#pVQ%eT8>*WpuIhwypP%~@k5=%V@h~WWF81# z9hfI#pUuG*T*B*Yzg)so6ZnrKJ=b?Vy=9g*&G_B%GO9#X%i z-%Hz-;hhb9a|_Q5;h8)5V+4QflOAHvwV#CfcglUn^k)gK!4dbBa=+&H=EdgOjrk_L zGKFWFN4xzUcH$16Kc`ZiUwdLuhR=`+&%&OeOuhYCk`653CzCO@Lx+z`=E2PclE;r1&d&oM z`+wyj>q(DtG3fo}-hV!$e!}>SSZ{p(`EaOqSN9cW@RW>oX2J8Uczz?EoBy+9eDAck zr9So;?{6I-JN`>~2bEjI!U6Nj|3lWy%Qf?G$a^#O{K6i&qo0mz>NuwX>5jM3JV4j+ zIqUsPB-@^E`>D@cDdA7UkEvYzC82q=;}1mNS9%R^_4(F&cEzpolb;K#e-`$BDI9^z zM)Kwt!udae)bqI~K9{9{Cl%jSx$K)lpWnRvjAX}?D?T8($9=VLmmJJUf1R*?mC*6N z*SrtA=P7;rT;cl9guQ17(T$nOmz4uA>KHr@2 zbew0Ovt3`Ua?MiM|FCce|F$1>O1aesm0$fO<-s91A%A#{^1ZLK`Xq7%)iHY zPP2aOKVRvCXA8X_*yo;fPg1(i(H`ea`7u#`qVsGv)p(#%D}BQ|!wD;~da$_uu}~4bLT`-1KkZ$KMhrVEG-% z5#wN9zUBHo#?SWg75)@Gc(MKBCpXo6_J5BRcC8TJ7#yVhbtLq9J~&wN7W8^w+@AJG z_kKXz(E{?lf3Loy%G#UAeImf?o9E*zU_v!DNdiHzn!-H0gqvPTYZm0G(jEn30e9nyP zIj;2JSjxkDg1brHQqKOeQKIzq@xt^3VQ?Rz<7sqfNFJOktVY5eywUt~_Ee?&T&U(U z$^L&IyioG+r9z)`7QR-p|6luDF`o~dz%RxxQ@QGLVe=wkLAztne#++OlZncC|I{#( zyc!E9j}p!vCd?l!bli(9m0W=NgCr-c7v4XfQGZSPmho!OR(bEI*`6wS3XgF-MaNro zT*i#&*Br_9?nFDxhcWZS{`LMZQ;_a>iaGPNB9Paq2m`c$Qc-YRr%c)guPD-M;{ZKw>9vu@V!c};Dh$h zU%yG|`Rj!R^WO2m{e9?tT-kF~&gWM2pDx*PEK=rg$9#*2${!DeyAy>i{J1><`R+o; z^;{qaJTLn{yS{m|&th`o>o;$qK3Kn1a`<*(1^QebpSxGQL-}*^XK$0-2d7|6xxMqvnTOtgJo>omrJoZH zz9J02C0sD?mOqv}`kBz*WwtN(f3Eb+R=E3-u=jo8l=->(Yso9F<2Zd|czky)7 z-zDrbF5A~hPSKx^Uo?D?(u?N{eZI|(=jC&}mzODj_$*yK4?FZ@#XR(X zsx|Y0qP3B1|+vKH{f75t@zXN}-B6Zo0^bC>Ya2|O#t zJ{iLI9G}7du~YL|$}N#M@H6wT68<=ar}f}r^R@b4d{el@o;mxPe6N?Np5r}xpPKy#;v<#cKZ5oT7dGIK{P|s!KIVFB%-1c?&9eRW9lz1`Hxi^DRF_>1)0_V|cpbF*!b>_r*G%&64}}xuDBOsh!m&LZ8DD@*I5* zjsHLI?IZhw%KLwMA6~n`PThW9`T1vrla;XlQK8Ro?q5y*2Zagfb0((O{NM6R=U>j$q2-C}jYo2q*I5@tJ{k-R|R=MC+LdR2YUO_w5^LPe~Z#q@}@U_B>=a8c>0-jF^ z_TlaRZd;;n%&)xr79orT{GqRc)xEBk8aVM#nV+j zda^L&Is3m_@-U@4ZsFz($;rvWmU(1ekf2ZI2PwZkK)BvdIJ+U~`+)x|p5nL=*?&s5 zU-1|onA$D~ZyUh3?5Dbc7nwiR@TMvJZwwB=2tI87mB7!I*eB=yzyDSBXYwUsQ_;WA z3kP5ijKBpr`hv>!|4JCw!U;TZ!gbA4=iJBYrz*FF_lEFbe@`UXZ5@}*ejF3VYYJ{` zf2N%Y?b=S>G7c;FXbJycfgSy9>1WHh+CQRzFHdM^$GAcAB8#dGhuzT-(<WB!6&vSsy)X!o4`YS4rXg!0#>XCKKI%G zx7&NDoypyWQ!oK{$I)+a13#>g%VU&3<34R)i&#hcM=9TNkgGdNHqWphX^I}$nZMF* zMn5{Rx|`~+S-%`F#CE`8M1RmH_5-v1zR&e@p3eXtGd)!GLay)c7yl>o{-2nB)bQmw z{R!`?`tD!oapJk#{@goT<;D*eHct?ymkKw}6|Ptx9Y-s_Lg|Ay2^Vh>uHP#3`3M>5 zGcY2*0n@ju{1UW%W%fp;d)=I~E`-lldU%=8=k>Md|M)`MdyKIEP+@+5q4$Z8nTI~7 z-S*)rH;_EN zp0E!(j_2Y=O5cJL%G=K>LJ#y|r8_Q8Nxd26(<79> zI6>(13))9WUhy2dT(aXc*gt2?^UdC)eDmJ;Ba)Zka4C880pW`Bw*M}eHwE*nWbsodB6ifvXXG=l%|~YN!R+PA_jx`$_+I=bz6pSRt4-nSq*Mj$Z#(a!;4kMmR#PhAdn)%c+zkE*Y2>xwbeW` z!H)OH{u}E{=+~t}$JYs-BRP7WFfN4tkL3RliaSV(3>6eeS4z1$)@PEJX^;xv^D(es1*NVa`&a4*S2c=rZAvuEEvO8Jg^V?SY^ zGt}Ne`O)o#_Me!-4}6}t&qvITQ@J(Q+1y3)g!1vBk~8>lY@Wn(u)VydU-s9oxc=JD zjrvWGe)0Tz$4f4cCH-zf+v9h%>+dAnt0H)g<5HEUtKNv`*R#I7Q0YDg!RJnIUZwO7 zUXsIGCg}GG>yOV%Tfa-?6Y_^wO5VOrxPG&+d4n)|t+2;+maKn1C%RxAov&r*5w zv)v_<(nOzF#;2S6~88Dc4=5`Vn%E_Ioc>y7xaL@crTOO?WO1&&%IyoAXt_&vOnQDLHwBaPx5RVZ!1e!u7er zly%(yFG|+M{$a}BMneBD^ZugI^^`u^p}){;F?wnP@7tos+O5is;d>+aT8JGpgx3}D zwlVSo**ws^D~BIfpHRDN_;7k1H1FMggmTvk+YbrL_Y1T43b*eO4#D14l4tJ|ZayIF zt`<(<+vTSum+-;{{yN}0V8Q)Hd@p1_Qu%~&iT+7)1V2u&JMZAp_6K(y4%@Nq$5O*P zd+_Lt?~DX~I)>+)?-%gui19VA9x(0+`LoZdUj_HKV!TuCd(L>~A6B^q<3FKX!FNkd z`4w1`-_ibn{ucOW*uNzDx!UzSvY&jydO7}$^2^@}bLQiAKh4kit%Tl3l*7N$laxL^ zL)hM5nDSnX;mZN<&6f8l9;sZz`{nbe7Oa+OcD$P@?Qdw;|A(fJQ@H?a zA0v6d``pledq1W7JdgSwl1K0$?L+OFJiy#O8^^;NESZ{Zf% zaUMcs$8+v8j^Q~f-|~E?W62xV$vT(pb!!HHs9vS?A?wc^epADjx9?Vdh&+2c?NWYp zg=C*ISeKF=|H|I_x11lS>yE+E4JG^BBcIQcMoPDT zzU}tQ6O~?jew{6Oihfz49}@J-jQ2cvqRNe*CA1&C?TBOMo8zlEK39LL@@w*E%%ku{ zN{``D_V08&nC@xHx4-<1`BXha>0{7w443pPVIDTmQ#r?X>ELODmnhxw8O_%nN34PO z^?0xBr|Cuv>e7`MuJ_F{-jOUraKbEWq9p7Eq{;Kc)433wZqE|)( z<<}1sj(LBk@T-LH()=mPAA&77<$eOj&3^9*bSQpk{O8T0462l*6_f~oDzloTq-bds(u#S&02Vf17X$E=V6yZcM%1Lgl(^s1F~UU|&t(s|ELwU_YPXr!ZkW zBF3kHN2l258~F5s^&!J9oiWaR(EAG=7cOKSiSawO-}aL6E*a;B@iVUuJl>RBG0wK@ zH=ogcu2vx5BN_LfGR|A%70+P;nqLnYr{u_Sv}4}w`2OV+be)Fxdk$_$@5874J=~t7@)hgz3_djEe(Y~;{|(!rH;L-m@2@^a zvhBt`uc$jh>E_Y)Gq%6B>zlXQkHq|a$aU;bGD5FhH*S>uE-L!HhTn!f5AT;xPEddL z;0Hu^(7Cn7gztw`wlPK+h2{I^nQyudNs!nE&Z&Y7>_unC0TqT@+P#Am! z{G@R8S>gB#!sg4u(bt6?n0{4q{zakpA1*#c`p1RAwL-@iNfwfOVElf`Bjk$y74KAf z{ubf#wL<^*@O!X9KbN`k2aIp;F_P`ay!W4(c^5uF`ChlTtlt~br=ZWDwBJT7%u!q`zxq&x&pPqSfR;m2@b3*$Yhw!@v z`4xOFf}gJ7uj99?-UNPIT_w2>w(pjlUMY-b!s7M9=5@jt?5>bJMjlhHN4*L@J$g2yA_kSaF z{AuqCOjuVE?ET9xt6cRZ;R1QDzh6`O5?&j^yNB@J^(U1d!-uyYkz8Yk?jeU@^ikyp zlyCU%>C^5Q`?LMo9rxMiuB;i4j_(P_)fn>~F=9L%e>o4Bx2)^I!IFE2klqt|e_4Gm z^07k{_mkX*hk5_X?rf!xhr$v1*1WrccblKt@56TL;iIUBULK$~TlA{`zlX@?(aGaf zukkwjP{|4XNa^?P-bx>{j<1fATywvU+cDrhw?C@mG@Czfj#j-a5iZRO?k>51kN=DQ zf9*I69sO9LUq;~WzN$AlT{vJoeeT=tEZPM#@@w>52S4=rssqMh{4nZ0To^q<==C{d z+_UqP9>OQ4=+`Z{xj^}2(01Lv*Gc$8jDDU!Tjg8qaf=rs!yDEwmYjh0Ys{akbjP>d z(%y*YK09CeL-_G@B)RtxVaa&R7^jGNx;l+^PZmauyZxIR^t}I1ERR&VEw}@h%$w{k zv_rb%aXYU67XCXARL*fmeZFS(C%yL*(0)Q&`qU#o{e#MTfBFXATz5*((QhID z=VJ6`4}Dtwt;#J}Z)`tU@I5|bow8qC43F-Cj_aPnziju8Z=ine_7|>hCA5E7!FNS) zn9^I1-!YPx#|yo`a>e^vouzc2$Fmn-_%TYac>YWDh3Dgjd1#)T!LQclWz6%0_rYl<>Sh<+ohd@eF47 zQ~e!!I7IJE4p(}Q@$GISd3Fn->R5pWEW|4i}7jFH<{y4mEnkc9MkpjyLT8jXj?4ihS$+5#v5*o$z_4YsPys z(e?Zvp!ZU)|4O0#!NzZr+?$iX5XRREr=JuKE8*&|NdKyEQVX|W^mXK~k^dFp>I=f% zXN1v8n8VA%Yb2*1pxk?f$@_#c{pw$Ze5J7eW?}Dj!ul1$z5Uea-{dl-Z=Xi_44LQG z=XuW0ReE~1aB+q(L4P`~hW7`0f0OMy-goN#HBGGgEqo*0Px5FV;Szl^vYij!V!zZi zddd6RdOwyPb3C{Zy*7m>mF8{m;pL}QeuF%MPn)+z@VP!b&vwqyT=m9R3J37p-CHCF zVE+x|ze+fKnQ;74;pB4R>Mw-rmkXOI_-0`bK3;!7atL4S;LqLXmA=7_n|xdH`g_6_ zJ4p9a$p!j<^iPrp*jZ~Zg)iFg*XNZC;mhOS(T?q|Jg181G{9~h{-eqbH^K$|DzJ;M z&0mqd?{C4ld;eecMb*!FK9f&L?mjNGzl{AfMx-Z{>r=0VHz&03I3HdI9cOTaUB2(} z;d{b%`HFSa_dC0u=4*2^;RHRqxXyYvKUDelmz^Cid4ruOI90O$^QZTdyyN{czxMg{ z-dEswU*yl(YK)nBo06zE0U8T!2M{x848zT^Eh75uG!BK<wy`^SRgY zgCwsW0;1nCz7u>NNA2$h#&Jiv$my*A$wjn}-fS+Byn|m%o*{YgEMbbAlAlx0@yF~R z7t(&tI_G`(0X!z5owbqmZ4UZ6y=UsW{$K8W{9CT;^?AsBwGUDG@dJe=d@ExfMkg!1 z<2hL0uTCNz{+xn7Uoqx6&3R5G=;v;K81E0A!lNCZBD;;+_dWyLX9v80=F2(!w?IF6 zpTZhBM1T1|rupm~{nlY`w%+_wK(r%yc&J^_be~_eu-Y&p#Sa1TRdCW-NGN6mq>P851+Rb%#}X-fN=8>;p)@i7llbJ z+IK5_Wx_uCwqo8T=vDtu-0?l?|8?FM5~5cf7cuXvy$HKe#rinreV!ho{O};5 z&p+AjD|v+8@cGd_^hpbEp1{j|{zf0Zw}GcQuGj{?HpDMCg`c(XOUJ_~;hh8Q&GzRQ z!m}LzBEtT;#qV~6U&i2l;&02h3a76V=2r-V*9a%C5RP9djKK|jxrSdS)DPdHa_zf> z-TQ@G{1xWdRhRI?g8sJf!ZG)qVgKm(uCN{-|AX4I{W)g*%y;d-=lzC`W9R*ZA?r*J zyUk#y_7<#LB|Lf#&)jf5$ET~Y(=2!{nfa`d^vyTaZccjoCCT=W_WgGsQ+mgD#hCG# z@qIDk`R#blZg0Uj`8>fP<5m7h?Ky5?%lAgXd>dhp5B{if;Y~Gv9WQMcNzT!~-uEA& zKexv!-{;TAtXEUsC!eR`@6&9k^7do2U&i#ITnGJHpbtazY{Yvz;yXA%9}eNoGxT8i z=d=&b&VeF$fAcJKU`>j&@rxkc!AFwiy6l?>xun1 z(`Tywj`3XnndAlI>3w(JkG*^j*QH(nj~=>R*29YHm8@$O>tV!mw4cWueQmpw*U>fQ zoIa#}1)o^6o@U%{aIX4g`|^_UAMpLLJw^F@=RTY)*>;mPeA?eT3*;HRdV3$0?|6PC z&&P3__r8xP=Y8dSaW`Vscf5-6EoqPUFT9E5aDSoC6SCcTg`OJn-um2F`%^6br1yD3 zxe|GRo?F1b6V|CAJbU#Ys+awXaE-nTuvbJ|rRSvEZ@LGccKoBwZ&Yr_^~Zb{EU&No zNx|TTlDFJ|%y)?=R=Z@;G<@9U6t+jddwC;NXmZpxJBw*$94 zU)#y-_h0f}+MhV!c`wm-HG0kedG_MAF)w3yU5cEe=Sna$-{$@B`8p|j&-`!%|M!2U z9eQMn-bvA0aZlrwFn+^3NG=)I9+-j!`6=b?Z&cn{^~Q$_9cSGB)b?+S(Sx?5WcN^c z+f)2~lk@%IeFYtQe#v{hMNcdqulng&m@s||^w|0wrLWP0$pa+!`A#k#BzZ>rIqeqc zkrq9*LceWar1Hy`38z;G<114|3%@lM*g;N@?By3ebSMa-;^9uKKzno zpQoLzB-_t%lW|F%Lgtq%< zeBb0em))b4Z#!2X{aT)&^wC{}!#fG1gM}6E_hx^|6ZFCgJ>>H|8ti-p|IJhE%hT)V zoeI9^IAaU=jrEn!kz2xt7T=d%s=gy!z{|`x_u_28+hX`yj{nB^ld3nnMmYG8Fn+Hv zf1|Kx9{g&_TkOa?c=7m6N-x0>oX?cLfj4ijlw2=JUkV#|;)4FHu$wpV%7Fem&h%bf zW9%U@ywK;jY~a-mXnBAg#phZ(PPWf0S)%8?u4Ft<^XUAy>aWk4>GK>DuCw|c_k%rp zX1-i2eFZw*ekc*oZOeC%zi+}%tDgOw?Ux=gUJ*RHf=4G`Q28;>cSd_T{g{1I`4jqQ z|Hc*fG3NVW%sLhysCn)9XaV}v=U98++!|h2oucxqA@$H-EA)H)DKs^ z8vR(H=UU!V>(iF^b?{h~Z+X8RZ_MWg)Yb>jRypt62}xf(UFqg&bJ{ik+}o$fefhtW z{U*$tMt!xDvu-U|PwlTVJ4gApr+eS=oblPA?<2;?`zAa1U3Hr3Z&{xm_rdW<99P8q zH&e#n|Fg}ny)Uz1-S&AVqbI5T?o#2xyi za6!F_c6>gY|4Zz6zV%6J&vws*=QV{FboW=j&#CC~9B1%v@5kKSRpoj|2p5M4&8Pj{ z>T_`%r!csU%B^oH^ttf%iw;AjM_|JHyuF#yCpQ*4&Q5g$$=SZb7G7Oqr*<48`?HPz zRr*@UFN}v1wZY6oex?4w*hpfk& zJ4&`+S<8BzFs=i>^X;#`=Z6I!G%sHwZ>YBg9T#Pd+#Rj!IgVqA9vGjj^bI^>&HFuJ zUitkmnO`aMWOA13wJy)R-N5?>yayrm*1YGVQ&rFZMK<@4?0v2Cp5)$|2V!78GW6z-ul1CignuYJZ*QbdA=(@f8N6h@9P}>v%Z1a z579HWC&%#RE#K+38&9zx`y7k~ylcyM`~v=Le(m%3Y>!^@U2ps9fc69UqwS4-_;i6i zw1v0LE9tj6ysX5YY5xuHOKY!Hxe&jK-8&@@-!2@#O}Kpr<*+Aj-XnPh|1QDG_K1^bUrzo>F8?bdup`5f;7l7K38IQ=s!W}lZ(NNgg&>*ylMsCZFsNy=*2iw zdGE*e`F1&aq6T-Ds@w)WVZUDcPe$h`e*|wW;62%iN-vSEr@bEb(9HD-=oK?UEA4h51%l8ea6%KFMMv(+Uv$Cs^6X}w0+uknCKBox8KW}ab7Xbb9i*{ zG?m*hJ^_5%c4)^*UNMea^1V+hxJ320@a71#U-Xpw^uAC3UyaUFJ;w>H;I|XzQxCr2 zecIXSD(`(tj>`};UJLHGW}cOnv{~EZ`j(yk>T|+Hrhd$9L-;$@RfKo_Cni+e3x6H~Ji%9Xzvz zcW>dP)qyH+|LfsRCFeI1M*9kFS4e&*eX@gB*Vr8#|E~Wh<)^HV8`|-I*%Y~^ocVQf zJ+5JZ|q?Z02!%w(<++Z-{e^-*fae)-;y(LYY<(LIDd52@xmV8?wd_#W_olofi<_V^-E{W;ee z93i;^C-8CeYyTH;9R4ZS*>N9!UwVv#|4&XBpMY{cPr&cpnDiQb*gI4Gu-(S*_x56? z`~O<^Jjwax!tmA9n+XT+6i(hR+%1JZUvTzG$<3#P!%riBMp#tB7`|M7LvsJy!Wr`9 ztCEv12s_&KdEh;+8(ppZ-3NsW_;Nsc_yMI)-X)y9Sr~9%KCd!(rqYL(2yIt(T#d=2 zm2Q3PeIp_3Tg&qac`g&yMf=;=cT)ZIR>Ck4?tPd4T6)6v#_+#%owO77{}=p&Fd*Oi&iD8@yg9~>T!Tx# zUjq2_06C}p7XEL(?f8Q`?Cx{MV+4OLLHj-D$O$;Z{yh1L`fL015Igjk@$4ACmhU+wCs6b!TPgVN%0^t}v;eB+Y2apaADzG>D|9-^% zrVms(`wzG9F8^>7LQZD`K0aQOZedCLFAt$T%ICy|Mucq zpQ?2G&!mjM{~vqbjr}5uOy%tt=za3tMM__R-rwFZ&ffnsc7W7eTw87beshHMK0;T;|=>9 z>F`|DvmcV%2 zcCpIUw-;8oL%xmBcA=Ve&V1VO?|dHN0A6dq#2Nar2L|xp<$h{+FW&Rb zBs-3X{WctbdIXOys9#-Qi@_O6@AKUKAIkRVig~dBy^mqe zd%ER)x8Jn=8#c`E68$rSC$8bSKF4Hqyslp#Ck*MQ&!-9CJK0IfFTsL#{J&&L`?mKk zPgD8v3Bon=)&J>x%val?{e59Ow&QL(E>OpHGu|7I+lKeYv@QF`_vVfPVX{Rv^S5(e;R$9EonPU+$2g_|!3 zlP?SFuLy_W5G?%L2=4nCHAM)hXc zp#!kPe!2aG^3AXJ;yu87Cs!*!`ViOupfH4gw;z^VV<%l==N@2hPN-*oy{6p``|}k3 zH-`Uq@J*jfV*i8DH+3DKyEoweYp|of`Dy=qD&O#Zv-o@Z>{`lmPy`hDZ8b_3}Sd zzT^94{3FQ~_GiZfDe15Mj_pUX`-#feKc*i2@P1Io>)7#p5CGczS|J-1= zu9ycY-)laH56X7`*<)4S_dVkI zc|1ovZ_kGW9$|kH>*0=d&hb|^UdLJg7p%wa5xQRgP+^Mf{Yo3w->%)bTSX(R66 z-zoO%i!V}p{*IaOJZxu~Gv3wdT>rkptS|IFQS%hr)v6Q7zmL%V9{%q1zQX)ov`6_l zyx4KTo4b?+D&b7=Y%5yW1)~z72S5q5URecxb-A(#@l7 zpKfog^yUEYmcsEtLZ3UoV;$YHj@mD-+gIg`j#F*FZ13-m_&=7TpH|=uJ>9{>`2c%}_l=MKDE+r^eeSo%eK_9W;7GL}GyWr<+m?BepbsnNzxl4?+5`_% z{fK$#|8pz!;Ewe65h|B6Z><;BeBU{a*pzxX^WMDI{`sDFy;Ibld8h5k3*MVP^E(3T z`>A}2?0Wv*^Zau>`_0`{e#Si9F)#hS+donH?a4y_zZ>$tuSnm}Px}K7k^R5M_T`d( zPZ@Xntven|ewMD|^9MYhQ{L|kdqMaNm0Lbv=s23in@GP(=s3>yNA|fT#V3?M1?R?( zE4@LkKP@@A7Q0cbgIDY4h_00c|=gh1587d!~CYZ)pO5oRRK$(M$8+pQ(JwxTo;sgy&fDTz&qQ z?be&E>NW7v_AoJ(r4z+^n1nlPx;Onepc<)P%zhBr>nS9*v%f{)f*uYEB2tV$Z=U?0shLr~PDm z^uzHP{C|EjP`$$XgMRnvN5u7(@X8)~+Wa`9A0_!q*2RGPnq8pwyNiW6Xn%(>?Z@0_ z_#lSY&`^X*7(C6rE@2dPU<)dS`KI#77S(y*RLwug( z;z*UZU3o$N8VngP^SbB=mG}3q&-30yN?*Z~hqse#9=##m`yE=!`&^cW?`ZSt0X*4p zt9z`Q_8akj37;F5U0>JB;i=xoX#eLa`Tp+}{9bx#_G_W{-8;Uf^;Y&f<+tduCH&a? z9~ao8tRHRX>a*VVDQ`RX@OtX!ED-v9^3Clf`+0Q7OK#v1ecprNBb2^G&-i=4c%;(n zk+7ni|HqAa&tmwq<1PBX$neRkH++)Nb_MGZ^F#kf8$OWhp{ItP&tOb?{Q#9)fccro z=(z;`8u)$gE8qL4OWr&CjW|wF$a}J*e#HAe1n0c>WAb~XTaQ_Sr~{&u|AJ@iU@ zZ}q34e;w^+{J*NHZ+*E%f3DHT0pmKDsGZT}!rc|Z^*e;N`>sDEd2)?#3Hn@k^WOYw z-(WdDT} zKDqsd`dNV9&t|`f1@_%3cFP)j?wEA%N1Va?X7JuAeBJ&Qj^EZ{58qbkL-@Ai?bWnn zUOfGQ%Ek1*;l5IEK)U^9e1ARamGJH*JhKMvAMLovQ+RC+f8HBs^XUJlek^$|C3-ia ze2D#e3NP&;*YMb(?bZA@$l$dh{cnAr@aPhL++#d@=F5zKwo!i^KO?6fj?3ruqM@HT z{oZgtt3RlIzMtl`|FifUsVVEV|HJt_kNF8I@Be87zDsRa@xHzip0|UC4A5V;PutG1 zMb8c4Q?^6Sy?($i6V{;#{ALLM@xJqz^}sy5VBJ{J&Jw-gcv1`2FZ;(9=u@v>IqQh` zec3;8%zCnBeKBus=ubiay2omq^7Dn}sUu|DzvmZI?kPg=-?Lx#g!CzPlIjA=!^^$y zcJ$Zw+&TB}`$@UK3HR-NIUD+G`|Ozen9-isu>tFrzb6vbr3KH;aVjRPtBzANg)dIw z89UZF+p$u{)BE!6SMPJr7yIjer~3%^?1$JdN_b9n3+0c{=M>&k`5oUs_OtAm zHzo5l2NUi;=l+J&v)`xVf)z)pUHilC;QQu}?VXixySevm1&1o#aZbZSBnNjA4q{<) z2ch@FZ4Q&X>ufXp1DmROSE5>O7+AncgN*bMdb5I`Z@BK5`PSY*{a%K`g6Fh4PIB*5(&4==@BNPVyaXLz#``xS%5}V# z{vI7YMD6A9Y@dHQ;JqJSsQm3k!X5e}1gE|p`gcKlKEKNT#P;WR{OZ|t^t9ve&v`%m zp4*SjcHYgs)DNHQ)Se`{I7R4v0OnyU)(iVFt!dx;7Ob!Q{qFyY0eXB({f2QL+*j9G za9w}LG^f!I`1s&V$^LH`p&z|3)Bb7svsBLe>e^RG?p{awOxVCz+qX+D-z7B99m01j zaC?>V$L|(al;42mT0ycOC^t< zESxfrHjkA&X1-^LNXael$L!XU^P33$KWMVA5<$V6q7QW(hIU0D3-+%AJXwVCN{!3ZEG`!aldZzhb>4}(i#C~BJ{M>d^f2XJD zhc)`5gfAxOlm3s?UdaFaId;{Rc_lbWFTFs{`A*8{x8pAFNRQyziyx{VHT-`7zaG-xnsT<6cl6Ka29B8*UY8d8 zXg;oPDD?gq+oz^?C7<^q1O0!}`^$YUN^`o(Z&^3?_W!|iZGQ>jV;OocIYaeA^lLPb zYEKVQcC-a{|1&QbgJv+z36p(lJEi{l_U4#*5%xkYc= z4<&?G^}!A8=iI0DarSs!*XvvMB+2Ddg#BDNL7#QkkwengPg6Ocm$kY?viEt|j^5H= z{}=AFF8eu*`F?1)?-~8|Ix<0Du6eE*&&TW29Q~QxN7ql_$ve-JyD7anTv*&m=y*lm z_djQzZTSvc(VqG3g8Iu_sJ``Q#((=UJjw5$c~!a7`%>Og^%8hoc9`ToJU2U5vg482 zkGbGEM$8+hd%ayT9#if+!|qbj-<k*spGaeZuS0 zjCI6*b6fOiz`BxS=jbuNmh`LoBkKX<74n=N-(rP6oAZ7ZPtbVuE&?wUu1F8j3)9Ca z-T%Mr|6id$1M?Z|qxLt7;L+Z9kZ_&x`D$-*9!UG%|JA{#BY625y*5A(Oqu^H^jZe) z&M?qIk|=-6_q+9*zq<$MvmWnFep8hngVX&a_X1&aL*eKKq+d_i zqSyW1J>h*U;lCw3Ic9wrpg;P**L&-@o%OzIZ$rE3^(BW~x27N7uRNjO4gIX$KfeEC zc)I!55dAU2Zfd(_fc|p)&JFd9_D2ceZ!`2-17GZeD|n^PB_E(4xA4v}`fmpRwSPm1 zY&&a6xh?&)pLoP|?Qgyy-|`T?S~?wcoc}el?YEBi@BexW`fLAa>-81sj@!}szR>dp z=<+q|fX^{lu%7t)YRr6aJ1P3SX8bC~)6d8MF+$H9=G(;c^FYm$igh_+9dk)jk=oroO;}zgjQ?DiJYP60gvAR$^!AW)z2_=@M*3tTxj`R#f1dq%2VCFl zbB}e&{s|-2%@ym1_vw}BOWT>66Lp>Z?!xr0!XEn4@n08*Dt&yguwb4!9)k7f=H|-x z|GmXsB-^iHcbH`JMgJG6na{Qhq`Xff^hRX6BYY=BzqRP;1^vqIr1t$^WpCayZ(8P! z{|h_5M$0^Ne2nIvYA1nDy4?Vt+vonr;Oe$2-`+tOBKus5Ep`^i$y_4$;kgUm-#O^` z5b*)r4|;y*^(o{!@a646lDF{jE&Vb-Z|Khi9$xZ19Y103ocZI`j`uD4d&J)Zi&*(y zKYjj54?UEyUim+5#=0`Mp5!?W%!`rj*VrSyvfbf2|MNoDuZ;D<`}D`y9k$=odYWL5 z$dFTT$o`cIo;}4rJ!4&~S$A8;Ys`4q-@$fb$Dz+I(0KGN7LG0vI-c$r{osAkRi^xi z@~&^c)aVJyx8HLzraknN&#@@r=jr*%cbwzZqa+XEM*(_oi9THN{`-HT|Gy0>7o*QB z_^fe5yL0qT@n~JALtpw_81Ii*QOVFNWvYPCUTAIyA4gj2^Tdc#hpQ$Np>{-9w-4(2pT}a$Kug`qAh(al=d1zR!iq(3f7nZHHQOKMl{J!``%J-JG#*20V|!S!%a8 z5c-^C`_tyPSNfXy8Zb{CFTC1E`62H`jU3-t>0{=*<3B9nZA0{wV!z?kmFPuY}o`gd@`J zKUcx8y^nvx^Bo#u=^e^yTnU4zec zUlO_k>UXh1AFCk;rs!{D^v^bW;28eu^Ht_=<<+UzxRuQ}g>KN!%2}b^U#!9(`{eIW zrabK&q8EF33^!r{--{te|LxSYxQOH;RXC|$9ld8j=&aJ0=MYPYp_Oo`)}cE z@YNFU(I0$I|1Hq_)!$tQZ27Le@&?@ay*%$d-r9eM$fY*_ZN+otm!{vg{O1O8s;3-1 zCHb2-1Z$@Af9h{09dy5S%ec}WGdVWnmAN>e6j7#JD8qd@9T^+uqoj`xLDdW}q zn)}S3HT=_i>DtUcye3?ma?2s_!rOUhg;Ppy#&#I(%Ngz3Mvj0ef)|diOU;S8uLikM6O5I48eAZ(jVf zl=ptA{yzw9yw>5LhMxXOunO);FaKrI_q47zqY=<1K zUPXPEffodgM_+|MbeZQZ_^9^h34CFSeo?zL&l~r94qus^LOT4R1OMN@Ea`{;o_W`Y zuWjKQ#&7l>RO2@2k2OL6++$yL-+zq0*S22xWBUzx-{@^Y&p|fekH`JCdh*Nkhx>`z zd$eDU;M3k8;(lleJ#vkFFu#O7sE7Wqf3o+xG|;0xw^4)EPs4K@YwQP2_@L*cC#1_K z`>ZdtV|bpVjsD!lp4_It$Hv{WU*1=>Kk>MnA(p4~(NF zpe4qE|FFB)}{*?#H_bMr0y z=e?ziLwDX2bl=*z2;%g^$=5!)K_Ao4uX1PdJs)m-i8g$)`pM+4nXmHW7V~z;e6Qb- za-R1-px?F7_l&1oZl;{)t@n-4JM^69C84)`U!C*=<@B?CaU3M~r@9}=^Xm@=U4J*> zC)y|V|E*r0a%Hf2Md&K)k3RM6_>R`?$)DXFoPRc`KXea1+=b6qkb6`5uTTHapgo^y zzgH>0g)0K77J+V{Q1S>*6+gX!Esc|F{-3?wI_( z0skM;Uz5xDe&&nwSw9u`^=q`dPCx9hkEkcF*>9WTXRv_JwP?3?*8}MT_?Y+mRot(8 z5sv(R`n`fat>10~`P7APtj^2#tdIj+uycOWTjY1Z7JQ?I{1_k?8_c&Z<4M1m<=a!w zas3Y;Ex})F$iq7QFlD`SKtCS*Rph4kVeS4y=mGYW67q4x^ZFa^HYqp#_rcyj3wHlJ zSVAA3{T(K@KyDn9eiN%spRWF(z`#jaeHd$v+7?%_=Njt^;XKuk4x}p z^|W;-`I`rWW%!nMZuM6E_Vi!t(=Pc_pXaB1_Zt0p{7mYdJR2N>Ytjc_OZtKSseC?k z<#C=PeE{~s7X7$?H07ob1@)Ub-mgWww5RK5Gob&Mpm9%!l(&E7+hf|*|HhFT2lJ`ZDd~yGp!Qf1DEQGyM;@*QIWN*VH3d)Zaz!Xg6BDGS97F8Z4oQu8<=&_>A_SJ@T%Don-~BpM-uaZJyUJyuVLB zP3hkQwEBAkxhPiXmkR%7Tu%Gi>H(*O_Wa!H^`Xo3!|08nXYfb;9tIaAy@wppKlm8G z2l=YLrX6>5WuEgK)(U;jxR_hUrSS&p>cNap@1L!mpL!a!!~3(RXD5BdxGeLW_ND{t zy)DnHN43zaygzNkywWdXQ>5Ms{8j(AGJMf{HxBS;<%WI(8~D3^4ToD&pMDSRTSIqm z4h}yWT;33D^M21!8>d5mjVArrepkwm(F2VS*1Rm~bUolRE_XYImU+FdV_xb;>L+0?o336$8U+V8G=ROl!`M9|;wEiyT+n|xB+MT=~ zsz*N-ytiPy&d$km+70Hcwa6 zzS@HyteL+}=B@FFn(%`u`e0Q(6ZF2KF?`VbKlR_J!gssqk*>2npD=+x)%YImrE|uO z>xnA-(R)a`{Kp3AL*z%Dei-1#<^I=%_8&mcTX=4|j=#Yg`}qEE!rzu6>22%`HRM9) zMRLOP-W~MDvhRaWdY*m7_coAouItr@SB#G}{V-r0*WgR?9p%RAos2*FV}o2AoyT}! zJgwoQ6~@g}IZ1!@T~E+{_a*z-qt%!FKI68o_`e;{cvaeE`smM#|0Vsp{)fTU9|ae` z7wrCaaQ}1ie;Ta+A~-|8F8z7vD(&jA4rtP!9r#f1WBL9q^LY8W(3{7D>n{dJ*fI61 z?e>$d|A6-0!`(@*GSAgZy|1)$fAV+TU>SW~y|IV>r9a7$zucAbP3<2a=RNS10sLv; zd+$lUaW%caszN_q3~te%N{@_0_*0oIfA*UcB{lp}hyN|5WG${iHv{ zvHz@>ejPnQ`Cd@{d5PY;=X=&*2h{IPKN=Gos)7pQWArXZIDCd z3iiMX=~d>t_gU0fZ&z4{4_SBDuv5(7lj@}d=Ck)Djp1AB`3Lw~3qGlT=nT0~Cto|} z;FNryaqkc6W60at8Og8NZ@jO3GS9s_SV6ulUmkk%GM+>38h3y8%A`-w(+{r--Gc8b zx6N-*ulvBp<6o5XoPLzXTT-9tUzq$Z@}Y-(P_K~xs|QsX2g7&gx%T^m?r%&!9NPVG z*eJ8{c)$xYpjJACLZe z#yMCqPddz>-iK08gYWXZwSIE)+c|t)KH~Xr{S5R^o7|fEYVhaj9iavnww=z%k574gb`7`5#G;d73L)H)4_dTz!zeV@jl$&24^t`-r*8234fC$_iqxlH+6w)-3P1F`fafPh{}1{H zdh?EQ`cLV<=6Qw!`|AolbBlh}#ttzff9?4P_MJSJte@b+@<2cD2J5N zA~>0W*q_IL5W0<>xdOJ(vpav8{09GR$a-(fycxm=%Gacy%kVkZ#f^uPK0vRVd@c0! z%fVxOO7yVB{YhWn7aXI9tB2OfuXU3@;JGEZc{J(9CmTK%x@|jnzWf>LM<1)xZuj@~ z|4>ga-IekU^yDdex938%m-yXt-m^o0)jzoTZ0f1~Ft~UjSd4<}=YxIp>fU!lx1J7; zp8~%c?0zMv-r0X5^o;j5=#Mr1Q#_b_Hguw{+cz(k3<42OOpNH+8QGSSg9Kq-3$V2b9F)oVd^Of(VOH;4*A>#%) z{};%~Y9r;m&uIc*sGptm(wl;P=COXt`Vr5OD{J^f1AZ`kYo6O9KeU&0&|{5@GlkDh z{$=J}`JV^3|7*}V$phwf72J?t0k=F?Lcd<4kL%xH+>8NyL_R(_A?=iJuF=QJ=O^9s zV8=L#?@#&`K2YVm-G9@sWpPf*?LhtG7W8X{bmNj1=yRUOZ=Rax8}QM?DWNy;p$+ZS zuH(Ld^6jV(Q%?n)qPKfKW==f~+Oy>Ux6vnz$Kbu6&CAn{Ipe1b8rRkR{>oJ;*DQj@ z<=NjB+WFyr)$CJAKYTK%|52avo_E&YbjEw#H`niC%=a9?DsoNv-a&6`^1Wm73-qKG zbjfn)dn@KsoB2|sfAnAQ{FHIx)c+gs+2tMiuBG3}{4Ssi$~Bqq9lqQBz|QS?zC*t2 zjL8j2_dJeq=XU6gQ~1V`|FOLy<&8t8f5)12^f6B92UE_tA{*Al-qWUklk18W<6;C( zzzzN7dAbIA#E||jDtS)>KBNClh51mX{Lz1u`o{0)yRQs-Z|*VPa5L#WQ2!F`298tL z2gV^(59+bbU7wnIwqTw4{5rAoW{^uOmg)-TEXX6UJP*JF&Q75fKsu%q1w+H?0a#>JR%Go_zL z|8x3z{ZE3Ge;nNXMX<35dLM#uTlG(BGta#z(l~8X_@4I6G5S#D3;CYW>jdHQ#>?npWPH#W$rYA5O1 zsny%v-%_8f(tiCKs=P;k-g!Uu9Pf$#cIfeQ!4dj%>&Kz%KMfAR(T||fqgTVwbL#1T zEA;BC!Tl4#4SKV7{}Stmg7$6EPd8njr~mxU4gG8!y$1ba{}|U>e{16_)%b5U>f2L~ z=g=EB<$aTn1+|xGPj2%+Yv|wlYqZ-bUwkxJzAEVbZw{H<^bM^y3x!^px}={L=MtYnk%iD>CJ|@?RxgdyIZ{Tlj|Y9t!x2euaDZQWgH? zzJ2$-`3~)j%47A$1N~+{s~_ku>AszI%s&5Rhkn+9Zt!2!$2V`!dw235`0JMEY@h%0 z!1MBB{fgax+)__bO}*u_sh{zoz0mVM`mgq{O}X|pLG6GI#-)C-?GGh?NV@Ug^$#1~ zo_zVA{!|P2=H#K|PnoBcdqcNa$Cj8EHRhFZ+vLmobvTag=Z*b~9;RPnh4k_{c~6u6 zwciV9&&?VyOg&D0aB&&mg+90E`@JV*b$#-U3p7CAoiM+LHzwaW!c)qRD7Oadq?d}6 zH%{2*BcaFe8TpRy@f=~nf9&xe^_wSOOM=>$d+^H^dgB^B#kiE(k%#Ej6YPcS z7wOxF|2urGg}!UNu{!$B0eheO<@&p|(Hqc$5;4{0)2Q0-|r#^8rVnFpL>)Wpf68& zeuVwnI22{|W!4A2-?$x~QxPLc6 z?#>v;p1U_bwf~v_KmTj$)&FJ9cry;P>oM1j2fn}gfz;dhM9_Wx!$YC_>Sxf!{Ym#c+ZO$*ggkh$ zKS1xEl&_(GEzomUyl;#?x9FtY{()fkb3xB5)}Z&a)^owt^TF~@g1esuw?7Xapl9gSL(129zD&Kl zLCQ~f|D5)C?r!)b^`gfwK=tg^qscGvf131X1?sKI*aLch zoBHLO{lA6=m(0%>$D8Ppf56_*LJyx)-w^&^z^6z5Z|e2j%@}?%1U;|bdqvvaW<4-w z{vYKq|D)MVIqwUT&(@LGL*(@oxvrh=X#c0&`W>lf2l^iGrBUCWkw4(M)g^gu@a~}Y z@iF6}uD*btaX35Ww2K=*rAE0n&uKrLe=z0MmyOF+pvUQtsy?_ypPMqym!SUl8|Fue z@jhn$^?P}bamTvM>l*V~ezt*sF5!d2TWKHj$@pzU{)_uB`XA_r+qpQ;t?8H1xuGZY z&*;q11@of|?fyWQ|Da#N=)#ouKbJ2LJ^K*#(hnoBcU988$J+JAl=Lk)zB=WM-!bO9 zmRBad&HwS*-$t4Lq&}`a-189w_>}i*wfR5B(b)35{o1EpZRB7XoYSrrI3|7F zNIQFst1bOhKQrmt_lyT=+_u?ElYfl24nL{9A?ezwN2i7M9%b!y-a|30CVvEfbHAs_ zf0hq=U&Z(g>gT_Yc)rGahObM$@pz55S$SE~SG3!61KtZY#16RB&Wpa-z}~vXuflsP zJnyDIuyKUe@XrJKxBBmbdUoiC1NCJ66X2g^-qS)K9`IZneR2;Pzs_@b70RpM%SYEI z2>TRRrKc# z-@Bo{jsD;C{~S5CW&g2-{k15iz20X&X57q~?{miQ`~tqK7VI-l)N?%_v^hQb?jy=y zhCF|8UNBF#@bhCn<5c`%%2JbzLyhxWXu@rnT=n){uJ*6+o0!u8tvq3|MHxU{+#+7 z@7|Yk)%ORR9||7rJhza3YjE_j;QT6R#@(KIv}T^_XWSvZac0U7-V$`4xX!GVlCEAm zVqPs-Zw|p7d{95z4Sc_lU&BZD>=RDl#}nj13;x(*K5fyv%knFp-@)Itn+)M^bNF`) z{k(V)mUxfnsJHOl1JBDRmy|QUgmOzgzXu<1UEV(-{Zr6hnryi z_vfdacJ4LxdH!2}o;u@o#dy^(Xn%d4uiqFvKzBY8dI_qxbs5j2o0D&RqAlxB&qXx8 zlKj%Qg0rWCtFH&!p9k*?x*wz;gMO_0k0yUu1iQ?mE%R_qf4Tn9-nc|=9GFkqp~s|8 zz+=4Eb5nl<)ZhE4m-9dLGcM7NHT}6q?;T&6dKS>`XVgho51pfrHhd18kgopSVZCkK zx*GqZPP+H1_}_N)*AD*E|9IM?{aXLw2K~AIaPmidhxc#~u1R|7>fnL?UcHO*jI-WZ zp(p60P58~=B|L{bUV!dbjmbB@neh*`rw!q61Nqm2Q*GmAGx5tzQeehgC+JIYuIUx zr)fM>_fI#BTle{@@bfAB^tj%BTgFM_twG}em5|%sLs)@7l$t5${Oz*t_B?Kh`n6Zj z-=6Y4@8-FX(i>8~bZYSUy|ixt zzpNssyoa*|pIP6V=SH6mdLLlzuF(1cEbb1yfbV-AZHL}lxj*^p!`@q{|E%`t@jWS5 z2P>d1N8IN7Swg-9vtqE(@)ne2Mu{xi;zh zn}T)f86&3($~j-17tZGje7tW!$xi-P|5|GSUScu(q?QqH&^{?|42``?!QzZR&STR#l_ zIE>$6-01@Tx4I$kYw%w;=--a372``k5YH*sNN@9<^1p&{zK3s3m`|R6-7p{b@+bH} ziS_t``Cnxn@BY^YzGB?pG36WZGx_1<_4yvp1?z7xdQH+r?FU`>f%fkm_0`e4Ht-SK z<2mFi?>Fv^@zUu@3{_OTn+gyZkh4!5tl)rl( zeheQO!T)#XrQ9BVFh)+ePBbp6>-HV7E1JJ{VfNwEnsK`*@!Ei#tObM|nv*mOQWi zJ4P;To=o}8mxJ16i?2}66T!*D(CFpMPlwi@q4L?#GxX>A*D3$)pneuz^x@eHNv}R1 z?0+v1#KZ`JXb$se0W}^!}vQeuId-1o*8OqYt}pran4?kLp*k{IBtIDB}k)0UP>1!QX4} zuQmK_hn&;iydvFmg8G}aDX0H*6}v?DzvaDs_}pB1O8FjgOFumI<(_sIBJS%0Gbbt!MW;@%aZt$&ZcIsQn}r_2-Y z9TJP1lV80lXk22~pJV3PteyPkr-P0AgRNe02p^gbLNA{V_QBfML%ToLc{sG^1hix5 zM?K_yBj+*mX~2AJ*Yo@cIbnR6A^lvXANTJ~IpdfQ&kw!fKkHAeJn{auozL+fN7SqR z+y1VQubqFxe_SJ{HmsW*7gN&J%l+RgzE8b)%Kvj5XxHBIT@!FgIq#jW!p}yxV#E2EE9Ps;mxuLd|+O?KW5xU<4YJvvV$I9Q~!leHr(GLy#v49K{w!gTlBmo z`t6qXc|Vc<5<|*~+9TwzbM!)SO?^GuQA4k;QqNlb625r6XO4Q@-&@nq+W(jE!yf!_ z4z9r(a;K#n0=@sU`-b%M6#dilgmw644LfN4)RZ&c&l3Jx;lI@3`%C1)f&Q(~-Vy!0 zq95FkEYt7iSJ`K*qOZ%>cduYP@IBh24(gZi?Je`L!Tc=CC*Yflcc&ip>N#?I&-2E$ zpPrR+UHFguK)bB*vqtde#*<&8Hncp}f$zZl#>FQ24-aM%kydoVaf zzg!`IDz_(n!27nm$8(T%JcjNt6gWFPWhu*ND zT<60{-(qjsH+VntxpHyn2IFkRJg8rt^eOEaQQzUJq`M#QI??kp%hx8q@`_*!ep5l; zT*L3(-}AhR@sL{Z9ph>i=$l*QPYr&%*x)DpUxFRvR11B1f*k0e&l*3+xEk)4O)bZJ zjaRy&y-TnGpYy(2_h%2t!3F%Y%KHZB!RqCH#}IqVkniz4%EtXl+OvZX>$lNCJ`}G@ zziNLP(7&Fi-@|X0$bkj?whkX^@}C?0|1tcs1%IlMzGa+D7&kNidx>$d`&io1WV}t$ zU$pNU_uKPnW9$~jxiwD3lzGw=8OMuO>epX?#d{97CVdSbC^7F^_at4u(`7!XU$?2Z zcW25S?z2pCN)Q4GD z4fsDpkQkky>b1?Jg*;e@2=3EFKc&rFX?Oe zy8aof2a;cZC^-CV(EUvPoQ+qc-go#^$|;ws_lDlz4^rRekPf1ciu{K1XE*++vba8A1C zX&Q`^HFDIr>7FZ6Z`Lm5d9yKcZclyPkK{d*4+cG_K4YG{UUxsN|B94T&-8w{FRVO;1Z;W-igU0pY|ZlON()(!LT0H1MxY5iczweAZV zKTo-?%>`-lw10fO*!Ue1&-?U)*CSID9ts z4SKZeao+y~^pn9Id|~iZ=stRMf!;g?>!A0NF20oV-G_soNAX^a_Vr2E&Z?i`0R4D# zb@EHs1gBsRbUo8%KF+U5IpeI9E)9LOV_y<_P5R(Hp*P4E_31w2V@Nx;wBv})JU2&= zo*_5&2kY^Cn{vjPUcyi6@Hfw4s9#U{j`4?6zkJVqv+-?7@7)_T4vP1ZjQQVP#%aO& zPQI%BdxpF(? z8^_&y+N;zzXFaZ-t-nVTJ$j8ECZAAG?_%d1u@2YXQ2cH5TI~%}^wt`DXMz5DKp*y8 zTMa#U{nvSZ`5%I%Rj~PQgLQBLcKHhxwW z`K{e+4BuBTR_+_`u}Xg&&&!~vx~{D=KL_xIA@g=dIrlXu^xNz$>6bD6=DEQR|H*r# z8k93Wi0fM847h%n(!LtsQKCJ@F&M&M zll=N;f@A8RBY(@#+H+QSr`#OAIz(R0znt{_Gr`SsLGKM5A`eTCCw=uuP(Q}zlcD#> z&(2pv_r4hPoa65H&;{dIdEkFkk1o;vCF9#TsC)i*k8vDI4bp!Vq*TAp4)#%+POL>IAmQ{dsk@vfVO-`9r?4qA^CIUc8hV_V;s9acHA%EXD#^K9C0kPB1voHcsZ4!-Ppye)ir%6J^M^1SO+eB)^v$9+J46>NQqdeD#bb5j33Jeqvt%NuvI{{ZcP zzqDwd_uBWF*Nd;E+y>h73AHbg4j++UG`^X1&k>HH_3x;DBl%70TYe#Q(Ip)|>AIxO z{B^%azbW`miJ)djGFOPycyv4jNy#^Y4;AK@YD}e*^tlKa)A@gX(`zdF>VY(QME= z2Pdb0I_2Pi|58UkTZ7s$w`ZrE=V+%Fh1TDo(+sWOkp7F43zBYJn}YE%fbXuLwWqF; zclwo7k$1;)qvU(9SLH0~e`j#!d||v-!8-F~&Aj&BQ1}0~@Ws_#sb>T(Nca4}6g}Gg z!!mrw^UKcrA@f=LZu^SVtG=qggnl6_=9A~p7swss!+I}(^JCBd)4#^J9A)HN|IECv z&wn$XXN&jrY0r-S@SKbHgLKiyTIgF9_`v~Og6fka_{s)-)B8>IyHG#%++GQ}G?L$Z zBJJJsz8>{eX@`D#Yxt*ri!<~<^;_*bedNP|_851~{nf$!{14=tag7(YpZ~t#{XKAS zN1oIE-GXmw-)=sb{5tyc2)VUK{_Ve>`~rH3+#TPS^d|LruCar>H6BI_IXtl(?W!=o z7mT|p^2+_#`jx4_$N!$94_BcVA4-0idAy^%`=;vAGs@MS@6guMMy@THhZW>!?>(u% z%{+C#rVoD@(%wGxjjvDn690FG9<7`o(Eddu<@AFtE)IP-D`MQad_tom~+xBadK1IGM*Ng*QJu&%x%RIz{Re)eJ+pRm%FjL-^xW2f@m_;J)W|RHPPyS@!SUCE9p>9H9wYhc z*=^>Z>)jFa%k$2C=9&7pc1Hb+XVj)JN*wt`$V4qcUU9scw7-KoF#uAu%rUD8LFC%w#b1@&&=3p46h{~dlH<=rP8 z^8A4Db+kvrH=2yYiulny-(bDglmCF87i=T9wCB&TceLrx;=a@~WnAj-Gobz2>*QC) z8R(y%=ZqiIf{zvGS<7>hKYDX;^~T@?T$~zudRnmi)?oc@!7`{`V0@1O<<++;C#Jl1 zYW)#9qz}}e+5h)mwkCGl1N(11{2XBJ5e8R<)~|lfxEnC8ON?j7!J2y1pN*S3dsFK1|95EDn06h<$0;dS z=70BTX9fA|y`bJBWP99~p2Ls#pGZBPOD^BfcQEc7%n#$&szqKOk>9@QWULM2&f}WBzEb*S(!3+-6TY*~`a!=0&xNbcu5L~F-EBej*VU&&+rR4$^@8&2KL26NxG5Mn zi>p(9Ks#5qmvqlBS8qtU5zmi59@==*-d|_j;UV8wqJ1^KvkN^T-}Qq2jruRPkk{(_ zRlY~P+w+a?A1}ITkMgzpc<44*Aa~Wb7u44QJr6m4AkV4yyN^7g|CIy#%TsQ2X|V4& zgI4d+KBM1JnQ?f4PiqI-FkY2Q%AY>+NPnLy?_DEjOVB0cr00EFm~x_V zg*@+L`4M)an(;lfOaEVyE85XF$Uo0}w`li@@zGMhy*BT6eKg`fj?u3Mlvn?$Fi+J# z-5(mmFV%l~)H}H`^_OlB_L-j}^y5DBRy%SF{_Xvx%`fFS<5TpW4PAUQxO+0V{bEr2 z@2nr%_{p7zLKo;qp090_-hM3k$NHWMz4%UW^S$7D7@R%>J{=s8KKnsv1(q)9t> zj7QJ$Oyx(-lpizR^j97skMsj{eda#Hv#@| zdE>cQ?Ffx}>aWv&?I07boG?b>J!F? zaDRV=KDItN<)-k#CiVl*4KB6YqCXqg;kXZmzTIbC?m6u}dUTcjulj!pUuyjCLF3sE zup9T$pI7M3hkucB6ZGj7`D^kgmc!qp^1r405Pki?{@e)vJmVn^PNbjU=XLnK`m*Qf zn#hYe>zdLTd2U_}daixR|90QRxHsD6mdJDCxs;hF#{1D8q#bDZrqti&{~15Db5hdR z{I~vFLO1!}ea1=sf~41xm+l{_SLokXmfzl&@-_IOcE8SNlRje}cus5ypDa^;1D{@g zn)cku`=Kk)p0iee_FRT?eSeo-ra$}x9%60hkobT7K zMEk>p@pQDa!%xeMo1;8`H1BJCF4za%IPOogHN{4OuqMg&ER7-_*SKy{0*qR!2b3gyQ+Ma`P?hsJJ=r-vN#ykYYt$=}cpIKHT}O5J zzb(dV>E6^oxjQIdI8a~j<4M;qs&rTAF7vAY82Mm{^f5SLo~ai%o=*AJv%%W;gPrdN zJ$Ks~gl>E#=siQtuZPxdTmE9`Iq#o;A$0R=!RdE`CG_FV4?~xs>%-9NZwH68qe=c? zl=Lyr&1mnK_Ur$({1)}{e8F?&G0*=Z*#22?@j`I&T(H6SR-Op$KAC=QCFb4wmgFy6 z!6E;teOu@`{PpOsha4=SFD~J?b^fdI{2WJP#*6+Lb;r+jso(vl-Swf{@c9;eVgVXo z+w=H)_>1d3?Fz;P*usa7eieMrlySMZ>j%zo}u$P z>V>bYUL9IL5AT~8oRIV`{%kAO=R@@8A?tL{VNcPUTj<++_>Sv!yLoxOQ+vqagVhg*E|~A08>>B(^ieO^f0A-v4(`4bbRFJ#EVOazJzq9_Bmow z4}#;L2N&pU}8n4nGoHQ10lz$+~?8f8X;ReZGGT>i0KcT#w*e z(@&&c_gCD%)qW>m>+v4#<}>u{U?4YVtdng8x*8Q=W?Kik01#_$dOHCpVCd5+opkUigQyy^~qAFkVXoIh-#w|efd zjb3Y>@mAA8@4ejZ))>@~Q-zq*3IS_^;YA@v&{T;N zJ357aek1g2gA@8?LjDeU(nLG=3*^`Cl02tXAId~y->4(AYw}WH&q4CSA zJU@rOw8?LfzI!~+tse;*XH!3qIrF4hBwzn8_1gZWJjb}M@_kkGoHg^q|Db%-{_Hu- zHgbQ$|8m~AUtW7(-qYd#sn5(=_cp->^LI@73G-S%#R_`!(Dll-skaTEk`KuTyD#Ej zQ|A8yeX7j&ju>B4zSsELJ;vea^t@-ycN(w3^JA{(4-~oAYsh~`kLJBK(0yRziyXSiAKx9EBX5i| zTA@89=G6>7tN%ss+&s5CGpJrxy(n~({++yoa_C7l`dK}CR7-xB=ZuH2hYwd7w>$n@ zo&V^5hgk5RSF}@oU%%_^jd{qOt=ggY9}Uhx&mp*8_q^_k_LrF# zqjU1ykncaPPvI}4xAH#vqt18}jlWi=f5ynI7snTxydm}U%R%{_=YF*#RB1=~0?M5Y zGTxi;<2w9$OnVC6yXJZ4!-RHef2#34)z_xp?Ms7GP(P6U2}!T;o*nHO@ZWaVCExw> zCG*Dhwst%1a8>^6kmuAJ4iBUr&p&ML2(5ot@%hl|$>Z;ZZjFQEUj=JF3wp1Rej4?! zCcQlfYQJs&By<%$bN+m2WUQm*ugVDZV| z68&@xz2-UX7#*HhzgDmITzi%AxBW=!Gfw@O@!7gQ>3ha=8Gc*4Kk21MgA=}E`%q}@ zb8Fh``O5|0QKp@fyHei$!vWvp{%!^SWn9I@l_|e~zt@qkJFwAAzUL3C?+b0b65|&r zUkC8t?WME>KHY|ItWHmQ4?Z=2W$4x`g58$~*YJli@jZ;g;koJs_GkUf3iM9zQCaZ3 z_5kAn?Kn?p+#=5#R?w%7uir-Ro#Ge0LLXidKckO5*?XbXzxB&#qA$19*YQ)+KE9>B zo@=SSEZ;q|-ERo3d>FhbbQLVUIkfwb%84=jxR0FFe?vX0#yG5@uXs+n$G9l?@5*1} zY*bFl`?{|Uwq76XogAz}mre`aKR3AI|4$ib%2DIZ>z_7a{!YKe^FI#me>2$monRY& zEZ^$Bkn|yZd&2XcKN)^K`91Ie-|$?@=;7oqm?s_PWs`m=GoSb1@T!#GzdyLUJUD-E zu=}py5_#r+fbr>!_w4#&d|t}yPu-@!v=g>3PJWB|Q-Bp|{&R`$!~rzxP>ns_+L%_pZj-9`l*M$SSMfXknVcKb(!~O&dK+_9rp{hE9z zXO)ZcoNwiy!?yep_*{s8TOuQ)%)jN7As%!MhZpZE0S(8eX5ygKyoRlzasAEKWh-ko&& zcX4~@J^f$#RA}|2q7!;Te(e*Xr;PvUeW7=E2iug_uV1@|e!A+r)89(@{%;1Wze_#n zlLPd_!4Iexe!uy7=pOmTO)n@{eJ=UNgPi>+wD#%24@2u;+(geFe<$hVZwE)v^KXUL zuDc*#d#`>RCE9oRjg+6G_fCEmdi%>@o$qe)ofYWGuaaN>1?8!y!*{Ou?t*%zl$(%V zCA~_2uBfj=ewp?h_poAbWGtwH&G_4?2o@VFklCF$Ecf}Yj>=@-BXk9{-W|iJ70r-R4%kHNO|Mj>o2*uJn19;Yr%M3d?e`y{`0=zeIE`E z(E}%M3B7p}c^i4Hbr`{#wU_n0@%(L-( zc@J`1zs5fL+??<0@V$PA`d+h<=e_TBdS2)~dVz66To1Vau{fLOC|B^k1>@qlZ_ar2 zJeqvPbFAarQjh+475MJ#`lKJ;AFN##-1EJwCiFGI9{;V$^L=m!-<-h@7w}WhjnqD! z=e2K)Zx5}%b_@RRd2;=MjeFW+JPepeu7d^_rk*+fTfb%JxBcUK!#FHk`m^)4Jl}dN z?W14a@7Pnn@hlvVP5P(GJRC7D3i{Fg3eOvPUZ`NaXkS?|-i;UTec$R`Gx~AQ|0~na z&ab20h;{10aY*|bjC<|T(|6}PwWH7Kp{tC?74yQlHv{HNpZVdu(m#Jm{pz_b`mc&S zI@quDxAiyA$$RUxr$WEY7=P{?m6(4k#&?_VT00KumpbEV%=nu#p1Smh_bPAT8}n20 ze&aOv;kzZizs-26(k|oJHtx=I%KuI`^!#zY=aJyz^Fi&C##L88u057~;}uM(=kPGk zeI;1>esKId!O1ju_`AX89|yPOHz$<)-Qf7w!PYN>o1X@2;OsXjhn_fs|Lc#u`VP;3 zJJ=ZpXW-`f(CYbn(&tYlee>mD@2kPiGrNpZ zCz8M6|9Z|&{c>?n@{KpD-Bx?G=d<^Br=0t{9r%NG>@xE}`?h|1=6B%}s~c&rc0c%v zentA_Y4;f1m-0Q{?>QCcL#vbgEqva%Of|}DXVDH_d@ALgxBZ(#&uHI_c1_Uh)vtT# zStIza{@gqC;_Zi1kNZXXNmh|xb@G*WvrAHb06&^kc>eXl#cPA}6M`G`Qth@K^ynS_ z4=e1r#@AGjuH(0Hz<%B1Tt|=RSKQ~)L*E@y-NR+-u&~ zq5Z}`@;s#HM)Xh7-=Ux%^y53gH?`yGH?x6X7w^t{r|@U>-8ud1d3x>6CHS-P8QR04qxq?{2f9-YtzXX=xo}_{?mw6OG5l)y&Cqk^d-V@O zcmIB{1lE5I4gc9Z8+!3f(DNFN=R#M09CSa-`<8dScXn^`^~ciR%5`I(`QUlHf_YoJ zGtX(q-_UPO{*Qi3hYM0}Og|RL{Q>Fj&sWfYOBbj73_0KDInRlycMs7MW-qE|UeEK# zI1J2N<6}&(NxtVv%ji*_b7(N0X0`*lTt`lq{jcb8%`;Npi1an(JjZ3cL-(=QXQlkU z7HsgI{(C}qo59izLH|pi@#(p5{dDW}r~BgWdo3Gze)FNA{vBoNIlzzmHzmI&KLn-A z*C$^+&-I7rM2vH>h98dkj{2o}ZgNp@N>{S#*N#}IVgIXyei9qrEatN!#e`n%8f z51IFV|8f08yDI$W1z2ZXbm$-Xz_!SHH`fJ=57U17txkUokQeI54d#jV{x1F4z9Y|T z2X+1F`eS-k@~g}r?a=N|EclNF-*H?g(XW#W^St*Nw3rv3quxqWe!;vN@!Wy=m$uG9URne&Qy zw`1P9&$neBO+J!(X7>lxC)&KnIL0IRg&k4|@3P(5v4Lmi{1kf8E#lzIOM{n+O>zm?}2v}e!rUCaG|{9$lTKXmDr`8SeY=0E#i zClB-71Hr?+!SUU}5&CBjx$gP9O(*&4p~iO_F%RnSg%&utJ>~TaQy+C*x%g=E^+Wca z-1;Yzt{gWW>4^3%m{$whU*>xbkI=q{sP~>=netPO`^D3T)pH`JaHza*X`T~Buzb5HR`1euIs3l!HYw5M2%P*rme$Pie7yWmF z-n)O1-$wt0Jm>w-tCxo!p9qp)DTQu8dmh7cA64}43Hj>3?w55=$@2%=+kZ`H?;~HH z9NKf=#-S*kn)EGtrsq;-$W{IS8t`}hFy`nr#-Z~3XXA?0SEpa)NJ@&9Yg6XRm&w=suL9rvT) zJA3$$c8Mu`VfwSYcLP6Jpm#66pLF91t$q|*Ke8@#^BLNW9GEh%_cv1S$AbEqlv=i9V@`YY7g&Fg`p{eScj=r(`rCrW#q7~PW%QmJ^@;i=lo-{AFgx8jPEU|pTU&=JD#89JKZl*Uz=1@ZwEbSa%O1zZAd>kkG%I!y<0o& zf_^zL|MhFpAE!b8_1~ZR+whAC=>u>I-_}mrzAoikMR1M$+T8+uYj6t|%$ElJH>W@K zW7l3&qn+-l#|?(4YilD`J0%$Gj@Mg7usmgC3!ir44lI|gqJ zHWr%dH;d& zEFU(`pX;{`|8IvLQ{0{Ur}qY{v}68cXz%k_qc0ufSipy8=vAICS@rXragm!}rk+7? zF$~Us9BltO*!hEC>raA9aQpkAH-8vxPJ`;vwLc2o{U3vUaQJ7TH`H5tA@tJs)BgFl zldhgT{ch+X>E>6TO}g?H`3M#zF1S-=ZW z33VACwI@=p-UGWq@1Z>)|7N!*U43>>`jGKoLyz9DepAnGB5&1)_192Oslb1?@D<}8 zRNyZi_>g|s?h|V7ULmhN-?T%{&-k9s!)dpE9%JUshVPkx+R5}s^WGohzV<(ndW`#5 zz~45sTf60~NV(p%ycd08LV5kLx6s`iQ_k~>?ho(aGw#PtE=f7#3N>CI+Iv#_=*e~L zzdQ8l_DfUF_?_#MLVK^_?Bvix>NB3F_l0*)NWS+?8TZ0CM4p>Ae((BiDc^ika8M3T zP7NA=w8HzeBhSxE{_=vLahBxk!&=h&^n>?2)tX74T@$Pz=kymGBL~O)mt%k5kn-9g zCj6)MRY~_=AJ3WSZ!<@ZjTpB_e-EB>-J@N*by4aY@m&Y>GWBue$WAX!xdw8;{Tk!& zET2xkerx@oLNotczYaZxUmnn(%kb$v{K4}Viyx(Yjr2AA#`Dnb|Bc|MCFIBU(LCq= z)aWkSaZm8L?*m_`+?Mnm<9$Fs4=zu-e#4G$?W>*-sJtuX%JidtpW0Q8`#YvS;}aNP zY{v7Qi&Kwsy~TKIF|M@py1%W|CzM64L4%emL5%Zx;{|{-$?wsTgXpisn+~kn&?DE|M=RfGWV?;aar>8#sDS zYR6ZX|JI{_r;H2t$@{3!X$A5d->Y(EtoKMBo$Z+t0q|B2vn95L^wwOn`y*ae^d3f*Y3V)6X<;P(4)hX{e zNBvbx=*`tvCExq0Jg;3ogXi879K)Y0=TZKWVCB6*?IZy{COM`3VX@R_Qo#VdknsoJV{c(z`^8Del-~|0-esO61 zD3|bg$BBMMyT?+_eYQFL$#|N^_Zj^r^-Y6y_>22oWB5WDzSf`~&v$svxnj8=Qy=A4 z@W}!Ew)4g0R~`hNkIb_L^HjeM{m3WC^Wp<}?!bTc{8kmZM*jFcDd&HvK>OV43f}L3 zVcvMIprCw{aW$`{yywx}7f>&#pPT&Sy@+Rqc0ZxQcsRT>>Bgtiem&ql#f8ZqQ=j8} z$UIw|mi!U(Vat1#ZzmmE|IjY=8h>Q}j+E2RuHAY|y~A?y2h9KC#L&j=HBOl4Sr;cK zzjbO*`(o#U(B41XW?txLwt0W@*NpE9)Qi=->-3Ly z&xQIN-|zZGzZ%bc92x&A z`JT^d{SoESpI84V^y;4mTVU_cLl6H!aQ|oI&w^`_^!}eFz56G@-X8~N^i%0KL+h_G zh4#Fm`vI-zQf~Q7u+KWdb3$FlwL@>=E6q<)4t?44;hy*I@*Q)^=|8ey zetC{?_wm#-yEWLlGpJw6ah$S;OZ>~~)bw<*cZwq>!MLUJ@6ed?BUpu7nef1wyZh2m5O250m z>^i2&cf%)9D4cpg2xN_`{#>jr(o zxQL!t>!3%gH#%>+%wO*#EhwiR)3`A2Q=e<_9`(k8_DpE!p_206C)Z$I?fHi0E2!^; zpmBU%U&{wJZ%qD@@19&7y2ke{FAqI=UvSQR(a+qt_f`7W`!!ayZ}yfv*QMP(&~-qC zb%cH|(=$`Pe}3>ld(?M5mpHnfe8ycBEN)4<=ONt}QGa#+s>J+0@Lg@_{mpsa{eI(U z>>20#PV$Xkc4&uQB40Z2A>&h3<^NZv+=_O4o=txa$9a$b9yC*a`+?w|alL2$cy6!6 z|ESvjYg1molO^-e^V3VlzkV|%{=54lBl=r^LeG`x=cAoSd8gl_{wPiQ@96*axwNM= z3|8SsbNG(w-R~xUiyqVaM(Ey?;3L7w1Ht)cg9Y^$(E4|l&=;!rrd;#UVEdcFCGXR} zdG%D%yPprPsJH)>(DKpV&qM1+Ts$6ni+*|dR%p-hEq}`MzYGr1=a#<{x;7#Gw}TV- zx#tKsUNA0~(DQDd*T1*{?Rc#+ zF7@v>Zink{&vWa?p+BU4OvbU0|GBTe`DotjzLxi#G~h?ZQ5xNsa_aS-Gu(eB>Bi$2 z+!=cE$)M{~&q*K1pHrWDx&A2H;n(oxIs9>bd+OVRgWE!Dhtn^_bLopB`RZQfa{lY(>Pr}5-hCsOV;!AUvTIF<6R4^CeP zO*!KQdEZ}?`j7q`$j9~Rd2aF6;P|v)^^BnB!rJc(y}UG7=KGC%Frr_VcPC%@)Zu@X zLH*}Fzh?ZP#Y5E3cs}ZT?W8;Y+Si3{AYVqbt3!KMA4tCYrZwc#0=ag$g6DZ|^TE)a zD}!ayJx|j%{l?@EJ{{~o8f-ri96uFQ&g^~?x`W*54nsFV&x^FamvsF;Iy|?BZ>V4I zo=rL9g*KlLT}Qw6e1(2(#t$`)Pgj1?$#efdSMMGDKy}^wx{twts1|+bqKhuN=tCFP z!hjk2(9D=R^uZJlU338k1Q?Jp*aBmF+=U(6igRNtH@V5=CQg)_+(fzMExotidQWS; zfAs$Ne!jo8;=jIY@3YUDnN#-JbIv~d_`lNs&(VqEd!0REK5v4vqm=IUo-yBs*ggL5 zv_2TXx4oXwKiagP&#kQ}cffNz-+LX+{>qJQ_52~&-I@2Cwbe^wY^1;8SleAMK5{J3GdZrytg@*5OD4x z15HR@%89nLCCETR8{W5%E35>}SG z1Uc-mn0d}|vh6>xxKeVCckTUH`~7*|Si0Xbe~i&9{*D@a&yU`Rv7PL7@S>&X*}o>C zef)oJzx_V?$o_zBp6B)K8SQ01o+ka&=MNft@%`i*GM?=J;W&>ozH4w1@)rwh7x13c zqwUq{z2ZkN3P-OB=h!iwr^)v<;q(sS>H(qS^|n*dzBj&igXjwVIYI9)&`-sUN)K)k z=9Hg4E86EkmgrmCMP2OY?roB@pYZre(S7u3j2`XYBYtq7(0&jzOzk&Q~q`xc-sF(2zqF2m&lLtk2>2KbLNNN9irt}Pq=ub2H-Ti6HopX`28e4jI%tSh=?o?iHTVoiMSzs6gM4#3tnqQi!;x36%>_jjcli71Vcpw&dH?tM^IP_95tp_D_l~lYB{k7}3wXKT>C2&Y7p}2krAO z_9I!*Ui~9fUUZajZQb)Q(LU$ndv_+-;Xap?^4??Y=Y;vX%lIsrKOC2S`h?0280V9_ zM0?{KehE<;}vBexB0*TeOq+ zS9;L(h;mO7`aDtVEYUt!;r*}n7sXF#ui^Qk>$KzA`V-^7I!EdLKeydpQ1A0Sm2Ugc zeguwt;rIlW^Et$7JLOyKEc7{6|MwO9iSPC2{`R6LM*9DpakBgz>FW!9KEUUzL(VgUXHIm`;6o!yqEQW{h}Qg#qZVMRr0o% zm%E4_Qa=THB;G{)VguoFJrI4<-cs~vYxsOei~0(85iU)cg|VPc9V}^tV3ab%ma3@gJG~(Q{`!-~JSi zYdk{#*+1EFQXPk>OTU`){Q=*dGC$;d>3uv8B+Luxf#Q#tAABC5ML9l~>VD?@ZOZSE z&+7t1>&4?$uFt#MAFku?ze(w~XMGQ>-julS<$|a#qp1apia<#H8CU?=hcxeqDZ1<=PKzNVy%JW510UedzpNuO4DQH_(gTpR=EIdX~z!-JP8+ zdU?7qC*6J`@nz!MpTvHy(Q)G24l~*>c7A};y?z+L zkNMj3>l`~c-$e4^R>A@Enf)bw-%5;~?0ZsY_(vDazuEdccSB)P6Ar-`yFA?+K6-k^ z_k?`U+W*H%k_%51E{=dcQt0}q$X8>&a=gXhBFVLBXU}U%SNs9xJO0M>Xz{&1?DH|p zeZ&tA61I4L*%lpweB=`*1#YxMoK`tMt*=gdNIXJ}TP!d5YW$y^t`@C+HFH-_>rQoC}2u z#)19)dmZt8{wyTDPrLctVm;nFPjWr_<(zpagKxj*g6G=5 z!EsER=#c^Fa}~8?Rql{>p7Q_TeG{KE?$IAw$oZT`8+{a0uK(BV=iz?UZ|XV0enOu+ zX&xqe0s7ou4gJ_dZ`n_A!g#ZN;kX6eyHrjS`!>5rbk!5aF9^q97lvT)lIZDc@V_DK zJtnkWGNZiKwc?l83w_Qxzg={Op0b@2P)_)y(%VmixiG(3Xn&FM1MnXgwq7LtS>c%P z$w<#07T@c*=@X*sl;icvKK53GzO@}34J4nuFYJGx@~}_mFN^j)*dg_p@m}6v9KR~L z!7Ipdm{Ug4A3_bGqfiBX*XSpTqwfVKEan{!Li@0sISL z@3+DQ`J-Qn9{gI^1-*V<`>FVI>c{6NSMP~myeUknuO;;~?Teq&{$6+PLc2Ze|6DQO zMqu`!^7|f0|8Laj2P4X{U!?!nW~8^CQT~kj?wNiBKK(jmKK1{*{W{y|nJ#+8ddqf= z{nYF~H91q|+Wsy&Jm&)Vlox$bwC$$!647n=6XZkW?f>C(kIM@s@B7~JM0EW;Vaa@N z`+fqwID_Y$CY+ojY`MHIi4OU1u$^apYX33Y&$g?)zn>qe{Hv3N4bXAKCfJu=udrWn zYir5JTL=s2&gVr>m^Y)1Mf*P1>4u_5pAt4dEA%>a`Z3YdPYC<$2j|?g9b#wKu@4fS z*W>w({giKUuyA~ou*GsEtc+cA5;@i)rbEs&~JEpz<<8%BY<~PSbv%hG@do*}|->c9+Tjj>F za6&)Kn5XQ=Qlo!+pTqIc`&TQU{qP#-=^A?6dSc1=?V$II`;@PGNVsHN+wa4Efz8{L z?)|CZ&7wol_XcJ5?veu((WrTgFmAE%l##n>?*9VlO3mFLHc4xrTd(l{e7cN#rM7BG2_kg zC+%n4$BqoKo3nkDZ$`hdUv}U267R9vf#+^3Y%N$? z$vJ*@pK>Q#iND+u+)mh`UgF(E=e&OvigtW<`*~aM*#CQoob^&bJxqDOI?qeCS9!yo zgbSW${orvtW<1+}K0`k{o@!zJ+f_Mju#SG{T`GP9y|G}vNa(jIeE$!Q=vQ8kwqJ+$ zIjz_GjC1=X_UVU?mzN%?=h|=IaaG2Ar~P^g+THrde(+=ZiPxn^N2omeq1jK}=a_Am zM+ZpG_HyGe(d~nTOOFfQw}#&JKGK5v=rZn-yOnQ_zFB@%wCz^gm$nnVp6PotR&Pi? z#V&K)h1o#-_Ort7bHc^fgw{J=m-fDx&wGXFtMU=a_Z}8b!5Zat9uvP0`u;uNJLNbO zUa##wBzgM_m%QJKa!29&tuZ#B~Mriok99p!T|j@KS%Uhd^z$>E)qY#RG3^Tv_G`>-zJxd zA0?!d&+FDh?2^&tO1FLA;(Z#tkL~I3Y|4S(;63{>&q4p@XNpcqw;f)c0w2BCJ5qFb zjL_>5^J7H^CkegJ)*{~mJ?eNJp6_S-NZxUUyl?7xezmUB?KfR9?>cUCv4zsTjl3e4fa06IVy89IqGq{Gj8cP7hUjO1=BMpX1I&Ev2{i7bbfObI|^UzLzfD zL+QPy(EA9>Q=v~2`h2|4->3X9dcCI&?R}UI^H}F%<+uOR@H)}GTZJq1z5S$T=nMOI z_&+&B|9hVC{#N#=%5mJ&@D|ZNM`3?N`x#EJRr-)|Z)`CB96xh(h2(s`qHwu)itlrZ zOTH(%N&G44bLe_1zW32f`bURxX?w`)ldj(u|6yJajOmB=+i_fE`yD%eozGv{pLw{k zp6_w8{JiL3bK#6}A{>z~LeBRgd4J0F z*C*eQ`f2igF28l4%JaQ{KKEA~FaGL8q4o8O_79jh*7OE?VnBcNJdu7$`5jkd0X;z8 z>p)(g=`&w6(C66&=C6ZEG2>!--s-#I}aO{kxM zdBpyIbM%?-d-VTUaj@RQ@i7L_US}S8-ea6pUy!{0r{*_^c09E9U84Kg9X`K2dP)55 z>%#OE;qo2fa3qXA5Qc9GE9@TM*O!oQ@wC$IUtI5r_C2cgJ4D-`&GxbVs~w-H&3nzz zdpY(~?LOr%?iE@u*08ti&$f6*=?&g%3~l>`jQ9@6Q;y-czp3=)cZBu# zg~5-Ye=kh_t8nq(gxUWPM*mwF{!d|jA#51`Np$r);p7*>`Ok&PM?%}rK9?B3Eq*o> zI-a)c#rqAtuPWXBGp1de^wXK!gLWU#9{vyVxz^U>ya)B?eSnnu>3^5>Z-Z|MJFf|= zmxV*>wd{+wAO7Ge(No^X`zMW?#rOHc0(+;rKzzsTvR_0Uy*E2g>7Ea5cUnJsJQo*B zF2pYGGT+v26u-@UK1q@LvT${|utxse^LZ?O&U^Ztn*DOU?pva_?O)>kK=0f6oRjV6 zF?x1>n#%8>=i2*;?j8c74lm7Z)R9BeF{ zZy;=7Pq#M}z1UosZX_($5%%oA!F}Iz-`h?6X~%gEwvl{eH{po)oM2CuJBi_x9J~l|IW!ucN`qY z9~?0r=hU;$i>8cE-)mB*y}dr@ILAI8TQR=u|36|p`P`t-$@RC?dj#~G?p~r-O`-3P zbDV^L{?yu;d^-xWZH4ZCwu@`@H@~;bAM7dlrTZavS9>4v`;=cWe*ND)+nVQXCoFib z@5}D`d(ay_=mquRcs-7vnV^44^h<^w@;=yd3q2>s-uL>b&mD{yKb?~#7ob;{=!?#o z;&;#oo=5!O?fbYI^v~!r$$MQnrysS@J1ypiI`c+wzU0T)ne|geN6=lKZ@&@m8`|&L zeq_Zl%IAHLlz!mZWIZZ%xAXy zr+i-Gr?B&&u=beHaX$xN z7d?GRX#aqj%cFjJcPl;Qz3g}FxEf>1@i`T*59ipqb?ozm_wPTe^4ipg_YJ+Co$y_g zCnVRT9Is2;54`t^(&IOTKG*5^AJKc_C#7&L-rUciebGEn(2QLJ^LqN z`QJh4$sa^VQ(@yL!p?`n`nQCOw}k`x$zlNgvT*XG(EiBwe|NnvsDJm5;T@8nF>gh8 ziO#|1L!yV&qyIy)x5Qu3KO4MfH59+e`z-07jz>M`{e3Tv??-GS7t=56_oy8A!}(>R zy)Wi_h#cR?@oyZ*qt5v4ovD1`DZ&6f)$EF1TqJCu*CyAA9#S8{O`=ECljBH6*NWdl zFF3AkLOHh2ygoiSUGm;9?4y_F=$!`dHA0{J++&J9O^|ckq!>Fb+*jp#{mb!3JNt<5 zbpoF!v7dnTX?-Wj`CQa|JJBQbaL99}JSWBe%eSHY&k23+V8y&P-9&ufFX;Huy^o6@ z;#Zk`O0@5H@x9vNj^Z!&6#5*L`!&SgnQyQB z*_J~4O^r4a?R8<>)4tEe|5@b$~Zh^ihd*JV5oCmz$itqLJbt$I>`ah!DNbiwuARN_%WAxA3Ipm$i z_jlM1?4Kb15Pj=-aOH{O=gb%WUmnxWK4&n#PI4tULGMp56hHlf(Cg5?@7en%5ptt* zCFlD}yw2@?)b`m*4|&fP{mk*~?7!yysW$CxJ??sS+`^Fd?H;ajd&daVBZL$5XHNYL zjuzkNFzkQieKwyz$#_r4V{Kfce2#0eWSp+xFB$JKf{e2&{Ocv~{Uxnp=6DBj^7<%}3qKn@PN3?%}eV+Y5eEYH3zVGv%YySm&f8LXPm-dX^FYggQ zru`ex<2xxI{v;D!-7ailKX<9G&a2|*^vB{mqNgKa=Urj?mT>a6(D#>5;D^-j_!Xsl z{XcNOxIz5#3Sk-xM;8cVuzQYZ|L1$ZY>Iu{M2{tBNv=Fy=yl1pxak*(@Ac;37SR*1 zOF#B`;E?e@LmzZ6lYHk=q2uBg7mD^dZO2&{qOX#pls-parIF}1dVFnN#C9S18q8;& z*LT|8Kv83HkfGtGs+$q1T1#n~3hzgthfZ z-%vREtT6htu<<$J6uFZ8jz8tNAYMPRogeI_e6|B8EzueCy4M4JF3*1Eb=txA%lrPx zChcXv`s_5yqu-3q6y1Q|Jz4blc;WCEVH>O;DLSN`=DgRCdh>B;Vg!*rgsE z&!D!M__OVV-k(iv=Nu-!&x3kj!{-~TJ(S+tiE?%oX7m&9`&S2w@3?tQzH`(OKRi!3 zxLUYmTr3_G-FZgnb1z=sSfDo|^vLXMGnj+>c_wS7Pta(22^q2V=qU-09AN^CKfBD?E&%tEO2O0Xt{|DWs^85ch zrG0&#+3nbCOU~yr66l;9&#@Wqql{v9|&zf*MBRz_n(CGKNr^jvoQZF(mxWmhQivrLfa#~r$vvS6n3$n zM!ZLz_p-l)?N|GMg%2p7&-YFFzT$4mg-+3DBffWftI|X2p-nlC2RcJfruXq)qf#9z>E@n0hU_rm%=LeGUI82!8G9_az{`Cp4apL$#-9 z`%^Y|5$$y|pTA$!#IM#7wm&26t}C3cC(Je$4mK1vk(-cj_IdHWE;idy^qReKtZ2uh zD5;Mb_33z}^>ZZW^MDEMF{EE)7bv|?fAT!wcy!*^n9)yS?BzD?u;96#ce=D|#r)Gm zu77}@Gu=(-eS5DzI(|U3nbK=~zv({qfzOp?TT5=$5N5P*bb{y!?cO~~bYmxB847)` zx#RMNv}d*#@&^fL;EM8NzH9FKx>0g%a9N19-$wd1(O#z+p+~$=x?q0wIr#3ilFx1t zj;;~b!Q?j4eK2DjPI-R!dZl|k(D!&Xc}{q@(yLt9A)n7zczv+-C8aw~ug@dY&J^G0 zPAl|}_cQEIzT`i8gx*PMmmdAWel`R8YjaBsit2&i}eU)paa z*+b7M>Ho_}w9lEx*uVDIvp%t%JYb$`qGufcc}hPXU8?d{=%18+;(nJif7BRf%`+r# z``Z3w_TTb-eM{g9$cf!u!2)q9%4E~w) ze-&n6?O#L>X2R+pgtI>rE`BPEe<*DK0QB?U5*>bB=<}1K=SAn#*XVK4j#KS>1ntLB zdr;{E?A7iAqP<=}W*(f-FZ_Qrqh9Sl-+Np6s_zMt9|;5cyVsN5KE6lN{{72WBtLpu zXn$wqdIr#Y|qN~pc=Nk(hH!Ij$^o)7U^VuAF#C+adUviy5 z=(rojx}u{Eg=_ZUI-={J63#yTALZsdiq5D9pWAaBr-=4z9xJ(!`F(tpX#Y2PT_mKv z$}cM2>(TaKpVKb_+RN+A5%Xv3IOWS}NBa{O%p>;8DUfq~sRr*Ac^(f{&R|R4V{@V7 zcQrN;?R(E1x2#ROMB6L9vA59iT?^WGyubL4^X>ngKF=9!qx8<6!j$>d=SJg(_+Iz# zQ=ZrBe7<19cwAnEJoBd4Yi#G%ZzeqxPC>5^mtPit?K~FcjII@bak(Q;EyOxhdTd$-SBG0(apzRMmq(3dG2m8DF9GT-cc)hT3 zhRXAQPMvEr-9|PLCM|s{q^7>>< z|MY**NE@3pNZpK_jXV|-#=)-j|u#QdazwR zgKz()n#Ym#6zT5Q1MEuc#})nF`o-%6j{C8qe(LDe-qCu$W3o_x*s>X;*ZZKJrM@EFnLjEf8*9`q6be3dk+Z;BSNxcGLLhqUXO5Hvd#;|JND$JMW91eOK6eR~URl*nLwtdIA0u!oh>W z$vr~buT%6&d7t?9Z)>B^T3-==X*~vx;g9c7y5o=dyjezh_V@65W(~bLAYbcV<+s0u z?Y@Zm4Y04W_awLCJ9~Vm?<;H}=X>-V$3J>T`FfO>JuSMAo$dQny#DF9(e-yEmwaD1 zE}=hyo(QLZCCvU&xS9*Q|5I4~yKwez!fYl?{}%ku!tQT{!#@%F{*=h=4i@h#-RJNe zcf|eE{}01QBp1*>?RVIuA4HETJ$+nQ1M828w!IwFj^)GR``*c^`xosJ@_u#b#p{xH z9KkW|6%57iL+3Av_Bs98S4F3{3BBK8KPj*8))=q$_wNCd=c0YT+JyPKh5Z#X?<5*KOr2fE3|*d{BxpxZ*WOI@6Tp?C_Ot=7+Ig6BHHs=ev;_X zQShl}--j`EyT(c%pDMI{-Gy&IM9)|836fhy!UfNDJP-RzMznLr`z?46`*FnkDSx!P zu%JFOaK4%NvrUB+_H!ND>(e>yZ+l`%`*~e{NPo((*WLcZ?Nx4<@=DsfwVU|EhOoY^ zaK5>4M*FAxi_VS}cKyBQiuSq8!8xKG*R{*IoP$Hg?c#dL%`OopmkGyUpK-Q!o)5nF z&1Y9gzPenPUJZSfutSD>w_#U4-wp|ciNV&*4zRvVY@qJII z_0rnCrpT|^J^bfSPgK4U{i~o}?HA$u<-C6D|E2M+%IEdO3GFv(ir;Ao{lDz}n4EFc zV*F0&5B6_p?nFN1O8QkmyZ7n8K3~u!eaQ2DPI19Fb)4=Fdd~Y_A>~HA(U;60;wBMQap!KNxx$SB1n343E<0KNJ(^v{Id9}8_)W!NjzH^ujQ zVEn9Tzn}dw{2$)@s?vQ9s=Qyc{W^W$*_d%Zp#7KB&m4WTx=s0_dxbua?R9P2UxNpf zKIS={yG1*`p7mPtkodljJ9$;K?b+H}qU|qGds}qzhS2^Uu7BT0XnVO!y(F}w{RZqu z+@}2Adn(WOjx>HCI;8#bKNCIqopANn!t@W&|150%yU=!YF&EwZ@51Td3KxGNoc||b z@Ed6QL;iiylXrzP`jgjnd-TuXHKjLR5th#hizkHDWAF>1{oH$`JFctOo!8I(slN)k_igblKcHQw{Fk;x!LJ#=-yzT2D`pEO8{g>@`?Q??JRVv@}yq|A7p~8-ic@Ll0E_e^` zw^it2$BP^7sB-figuZ7W-&FK$ePQjh!U%NS<<6GkkC_*}Z`a&M{Nh0261!@Cgy{ah z^KLhz|5KU~&pAiv{q^c<(cV|@pD)_?ZUmQ$_B{svubQ4NzULR8FK?cW zJoaRAg6Qf)kD$ zS6n83HxY){3Dc{DiRI8kmLHLCi9VR3XBwwb&Iv-tQ}BA?kb1U1h4&W{#`6$#JeOKa z<=D=v+1_)1qn&GvTmPpI=?}Kg?VlfEM_Yf`|H$jfJ_lQ;{PJKu-~0J(>@M4tj)!JH z+Zp<2&UgA;h1W;J?Ny%75eMkE<>ulW{a@+$bW6U^{?~KHkNbayer|B6 zAdZ{qeYP6k+hAO^sCTc=SBwMe56=%v`eQ}^vz_IAlKxlpUEbfELpyF`pMF%)KU2m} zNk2-DrM|%8Fwq(PB;fyQu(SAczSrx|#i8Q6y_U4!nDS%vZI}MrL$BKJ#OG`i-aEnW zn?9y;?N`uxRJ8q0GwfvFlQ+e_Dc_Tv{Z@V7#qw9;J5F%pzlhHNQrMmfTYo03kgxwz z^sFTPePQ;xaP^YV_e}fzb2k^?@ipwiX#2T&lH{%5JIwQ~NPPQq_D3iN|3@~M zH!HA@ek?ARoaf`JBRV)vI6GJvGQW90(&ua(cfsq9<8>uJ{kX6MC!Y{KUQg(KN3Sy$ z%zsm`upNax>gP8}_c~_SRC(U_^ZI4e`H`=7;eECjMm1prd%667lA}KMv5#F`63=-C z`u@TElalv2`PSy5>!9`g=pf2JO6Ymn_X;e|6u)=2aD{$fg1)C9zD((!r+i+}_OsVV zZ4ZUW*D2TcXS7dIIRWL@&J~@&4^I%iJX$zBL|CK#d`{1PmtKbpc9)#vGT2YraZbFx z=yjxGf5``j3)lWHcy68dX;N>te`4CNLHpSsr@xiT8Ez!Zwh-E`h;|k|A-~&YLis*N z=JS#{?`J=dDbJh3?=v2H)Z^kDmA^Vq=yB)uE!){G#^sXn8_+)fUmemP9H-KLUY#$h zT<=SHeEWQ_FaLN3cp|9-M)#N>V&TxT#aJ*dq z*UqV*2JPu}T<(FhNzpME6D{fK`G4^SbdPt6yT#Ns0_c!;075&Ql z`;(g`pJYPEp=jIyeGTcC3mrcwjz!PWKaOkX@mDfV=MBkqb_1yg|1VdhN4)f{WS(`VfJoKgK+@z>%d-yyoXOIZJ^(Cej+cj35O>Dx-5V&}9z5Iw^V^1aK0 zKNCOsYvlhR?9YT_=+)ndp8ZNV{7|@fS6KRa*v*a~=ldv@4@<6gzp(Xy&~{Uk_Nr3x zeeS~dM-=EO+W}+R&--fK+mz3KZjOUjJ}v&_ap8*RCe+^~7k|L>htR%1x{KZBxP8(0 zB|oJ;N8c44P_Mo(yH9;Au+zFPNY3ZKjcal5UR1i{Bs;E$<8hC9P8Yj*`4h?aJ`#3+ zDQy22>y+_H zO7}gzDf77dfBh1r&n^=t*9nX3g>&fO8u+|t$oR2;uFrEhURb&}^5`?4e{me;;B!jv ztuGuwd%bqJ4*Az59lhU1@B1F#4*GGjkK|f=2yL$|cM)A%f&RR(%RK0P;^-jpBigIziq651e&GH0 z#o3g{e^z+4=%xG9#iAF?0|D(7UMjx*3QG5f)5Q`ndq}2Bme*FlZ1A4v4_bs}gH9L}XoW%YyqU{g6c7A?O@teCNznw6r z{(TR-_xIbO(nI=B%KK&XkDT}PJuoT#+V_5}*=h90F5m5V*)jFmryWz;)#KOa6ny{M zuBNdSYiJt5Wf9vX3*|GDR%mRelTNxv){#leo$PZ^2YQdp9gF6o(X!!c12A8 z=+O=d{mSQ7CzNNu@fLclIz!JH(2oY#pDp@V#rubC$+eFcHck-wKF&7nFy2f2I^#8_ zeeKWS|E7#|uhaJE5AKgM+PR{<2IZR{9jNE{oNU4P>@xnm-d<8q8RKn9{frndUH$`- z15}>>4;%Z6UhXFJ`f&&SV1H@Hhi-2zxhYuNUbOeitXJ#@V!L^P{v2&CdHa_qe7F6t z?Dt*qUJ>KS`vLx6UeOQR^ar04oF^*Z^M}uqEwQJWIHvyp{^NMw{x7y3Xp=vnU->*p;r>Z~jA-A4aWm&Vy-!XM2{t^-GH2RA84dXSUr|llwnL-)R;bhoSHS2wW7hxFGK{iJcLrL$7&$i#y`m9&dk9 zwCyC%_fwwl{^NdVf4~m&nd7zEpTY653fkZIY}k*oWWKdM8S%ZA>mRT8vH$TLI;OvO z=Lhm_N+ zi+21nuLs(X#c>`I>c#%$W9oSce}1&eX+WpE_jrHt7uXB-!|g%)Jk{Dd?TM1NpSJDi zD$vbZ2jPc_2#*p^$e$r%j$@~A;e#W+^=X)u=+DEvep1ptJ`dl2S^yCm> zjrOrWT#fJUdVDh89N(zUcMbTSCH3hz!yfP6H?tlX?xg31+Y1}p3ddUuea<D>aRt&C&I~3g}v_!y&gFpinhHMeoOT1Wnukkq2t5Z?)QJdoO!=@jpVv~ zXLgBb$Gh}8PlNXI`KjPe$vM7R_Mqq%^^xBrdWJnzP(NO$wm+`@bM1c{d|ml`ub#gz z{kHf4=z1N!Ccf93W4=29?HACb+{r-li*E`m>dot?1$KJ-L!S2o;p|7?56MTnG=D8R z{-v-3-T$rVWGY;NOZf5c#LsEx_WPpy?}6_KeSX#Pu{%$Q?>HFKCq?(37rOoyFNrSr zUjJ{|U&Zy}_#G+zrtyaI^~pb^Kl^?_uXA@vUy!d$zWJNV-=KfisOJgwY<~S!$=PpY zLI0WFCBDyD46hLFecUGcB4<7+m`CPcklYNt?Rd`_a-%azKV4{hqei;tNBb$(naA2Z z&*v09-_|czIWd@_KPtvg#{2X<&!WG)kMB4`%N?bkd@{DAgaTqWA)#1`ne zChauAUUB<+Kg01jW?xkP=@~+=Hzy~FUbDBEN1E1~mnz-+BqjY|PXF`z@Y*`{$&#+UC^`SP`JTxR{loUjaBIn}**Uw3?qGj-9W!o=-#t|5_z%^=v| z-_!f|6YRf)?~RU=T+907LeYKD@#DRooY3EDv{Qb(Hp^iK2hJO}xR{@ve4eE*-dTcYi6Uh-aJ>ecJZ?|qem@zX$WX5bi{@!bvjeS`k)xa{_i@H$`d z4V6ECL+EwA4)#&!Bk^rd^{}T3u=5+G2R{>bz9+O_aN`}(qi+iHH-*8A&<_jycMAQV zqq4yhnr}vj?7b(B%DWd&`jO&u}9mj8)OTPD@aB;sddq6mULTG<--=E_9 z0PRm zn+JSt~AJz#j4X zfbEbReNbK?xhb^I;g`J6kn!UE-5SsJdUzc@)$eddGOwxUDydb=jN zy}q#XSz+^&Li%9r{yZ0T}{Oiw=TzQhv>(z@di1zuiIr%5oi|>1(eU8lW@fH^;-Sb}K zT+v;=$MaOdJhh@f*>7M)e@ht`_A_vtwHp1>@g(fm?ehV)-{TYX+*(`MZwgb|A=pav zgm!ZO^geioT)u_mLi$lbKXm*<$NBdDgzf3s&dTSw3pJh}VZTipO1C{|zoNzN;(Om^ zO#f?Q4~4wNR@56n(iIh`|vIp}i`CG~HAgwD~DTf5&8yTkT}qbe8Ao0}ZPG6r zM@Y`+1Oobl{g=H@X8-5b4wAP%?QJ7^vbC^*Ui3MUCVa=6nUWswB>C>1LZ3HC(L<|) z#P>R`{o6*=_xKQ{J1%{VepX|C${7DG+Ry9n3FF-7F?^3tjGk(sx9Zqmt4nx4>bqoK ztI_W~pOrk{{bWKrHtFBKCuNBqu)XhiFeBzI$FuJoqvtM;6HX|{=ZzdcKcXEc^q(1e z)ZaDXJ34n#P9gODY>w06{qY|5i0zu;yONK-Cv@Dp=|ptvPlU~%34LB}`W?|eS2v)X z>KpK%6;^i(9mjcmC4BmA7yTR3E?%$kI&_Yl*PTn+v1I&qZ&rE1UBdo-&=2vPo-lq! zxO`GLc}zHdRM-a{@7ewZj-x$!m3#wX_?pmmV*ZNgF?L?}MbVD$=Jn>~o8r&k7WRii z`{%~rg#RsJ{JyXn3BCSZz_0y4{Om`<+Rudp(C6oBABsN)9nU%VK>YMQq0gOmd9U6Z zlt;hu{p`)B#4o7lkovTLb4)#i>yNUj7?4kVj z)`RG;@e&->Y}49g`V$xkD>o3vVE0aVnuyF&7gA2m!wTi@Bfv^`?GH@S)DA@BdN742!i>Wcp=+s)~<%IA2-(et>gIx`HFh<{#XyalaTIx z)d}Ui!xNJXAdWhW|{6e(vZB9NQ9l62xL^r=9 zw7oUtxxL%O_d4^G|DP7^;dKq$#r_{~T+4v*IYrMqeo*4^d#B2uJ|OfuX!)4v_<5o4 zaj_qA`jq%h>LI&dbR9k7djs3Z1iof{2F#U-z`l+!0BVk5*LB0U{yBH$>mT-n$pM6ub z?-xm47Cpc&?(m)ABjV@Of2$B}|Bj0Kno&>oFSebX_9fqFi;d7k~A2hbV+XAR!d z@i&q;RgTXAMlXr>`)1UCdm#RT_LcR) z=9Azew2nRnX< ziZ1sQIxd;lQ}S)ZxBuy+Cc5=0VHdyR>Br!&Cv0y7eqQKu+FOaP;M>0Kt|NZ@31RtZ zVfVAb#kxYEc&omC1zK6hZQKG9QpIf~DmP+1sS9z=G{zJksG&$8FL>V(N?Squw#QvCUFWUcgwl{olo&8IzO(Yl5Pb&K3a3#Ao`nb{y`q%I? zq8s#&MJT$vlQ0BV@EzZ$t59a7$`-cq4w*-rQ{$n}zgK1M!~I~vrh{lVsp6PGi-PR|eS z5jy_H7(Fn1P<+R6_IKJIUOuMu1bs2OTeRbG)NU3%zD?-=k`y~Tx>NiP-{<!-i`3tQ=DnJ<=N#<8_d0O-qU62L(RxU9h~Ayh4n63cdM>DUuWR_8_rb%;Z##Cu zyzKpe;d4rNoSEot(YF8X4>Nd8eDAXi`^dcnpYO?`N6(1w_<4@E?(eDb9lmee{(o)y zbBI3nzL(Fd*#Fgjp#gGHtmn<4Juj5l-CpTQ(Xt_yu$u)mJz>{G%x5QZBG?e}cIzyLeQ_ReB+$t9Z! zm+L{VFAO#o_BIrHKi=^^n#j#IP`dBo2sRb%{rQaNEO?IPybfJ%D|yHL@OdZCcb+!~ z2TRWP(zcHj9a7J>XTsyf_kR2MEXqG$X#a}VWul8jXgy|qGrJr48-(`vNa;8B(+MwD zy4M*R*t?^v#4oN8PQclfqE|fM``Z5ROOYF52d&U+;XTSXL+{NP&l%&h#<=yoVm<0} zDFeP^&U@MaFg#b~+HP^2gYhonyM5+ci>}d+yf1D)QlGa9J}bG5_$m$J6vj*0(Ie;# zySmALmi3I`y!Sl;ac>gVh{hfripNrk#H-tXN=y>Kn zN43KK8nh(mc*T>$L{G7kQ~GCmsQ6J^Xgk#Qr|pF5Mx}fG+4q;__ln=RPw4fenD#Co z5PwL2=-(!~jh*596sEU}zq&`_2=|Jl~=Pq0{wsAA>H?2JMLewr}BB7y2X6q{*hw`J3gG( zcYEl$1^vnXLmBl{o}_XekGbC!ZET+*I*f#lBe=HyOgq@G%YM2Y^iz(0bNhK-OnLt5 z1eNPJ(Q9$bj}_nNrK3N3&*qs*Z_)m3^j`dB@xA}&^MzCNpzo`8oa4nqk`JE;UlBU~ zu+Pi&za{?sEnzSa&R!5E&kCoH3p z@#Q$Y@g0)yqThW#N)J6?J8t!`pvANLu;KM+4X9J<{S6OW%y4+dVz)l!~ zw$BHYJ2q}9`GV)z4(@C$ezGCyJTF>b^mJ39{Z5y4(LR^hqCJnD*2`Z1@jh)zJCCrZ>&&ZOcknr*g!$L@cz(Ca&FJUj>qWa?TmO~x5C1p%f6wa- z-tYH$?0Q$_j2T}8`f~=F9$v(ET_`Nc7o(@Ur;DGVC!5ELUL7Hf4i*mf68ik3|BtLM z98V(NUvk!~YwM%5&lL1I&z$yMqJMp!b;$EV((}VqZvPP8gZJtj1dZL^BA@+Y9N*FB zSF5(oz=Rq0? zeENacp9Zv3PWw0x$B_9f1?{Kdb!Xep-p{D>UKQo|T(13md_JjQUaz6I9B(wv^nMlN zAi(}9UJ!rU7y2AnhW)feZixQ$I-%D~LdJ#9nKzjqthfDs3H9jp^bYmAKp!N0m+feu z)9z6}74_I;o^X6ZuXp6=0gu<}etpmK5n=NoVf|iVgZgm%@DcX2G3^d>T`lV zs_`CEG*tSiT*&VmoUbkQIpJD$Dw|hlBHXl(tBz_0|-bKH7pD{g8=`qjq zKAHW}+UTt*`eDjAvc9QKQT`q{JV~_uI>zY50=?Wr|HeB?uD+$PyP}= zN_V`m=60fOmpXo({RbV#D&jfaQ1Z2{gsr+T-$*#!KsOr$a#G`-bQ>sKc~D1 z`3U*e=Os7aMCj)RJBco-2m8Bty|2N1o?5}Qn z*6Y!&obqV@QBQR6lyCxuedJyiu3i#mq|cZaypK4?-WZ@y+dRkfV{w!6dwo2(S@h_7 zVZc1=^B?waYqCCJKRNqJMT{HU2^IanfgTOdQn~SI!ZG&6@&wV2)9AS70poh!CY|=E z?Je4VH{QQW_7~sh`~2Tyf8?>BgWk0tdwpN!3!B2#enRhq*{`f~sQB4o!qW7Sq8;zu z=L)KW#1C4+@qxlF@0s%*@jl|)52Qi)A=o-X=|0cr_2nLRT}D6bP_JG3srOMEXDWY) z9`yVd&|VSk?EPBrpA2cQA^E4E_Yan5s9f9a_FEe9J_-5j=wt84`rP7__Vs?4{iNMr z%1czf{iS{GV~8D8F-~gFNNx(+@4@~D(?aQ!yM&HY&`U-8eAN>Dyr6&k-r4!Fl8b4F zG3~mfT}SALI^Q#*pEaRve|Nen$Ln|v>fQgf@hwW9-!Ak%Q~OTn+l0fLg#GJcKd?rgsxe)X(y4)&fB-G5N%xF#X>xV%;TF7+7RFWPYf zZ7-MT$u9G$*CUq5H{loPQSS@d|0Y5IPM%Qt?tl5yqN5jiF5eN-U*}JX@B4G?r@bVf z{nKZBr}etexq3e7@SQ!{u}**JxZTmm!*ldJ-!HntZt^`W&pSfji!eaHMU2Zn^Mm6Agu6<q=+gv#1 zxfRdt^1i+=Yzpl-Ad79t$9uIYXRx*SK40(iYQ86Uw!hNnhX@^4D>__sK>b-iH%=7a zeu5eOVM4pN=}-1cwjSw!S^0YCn;H6Pa-;Ye{nB=7?R# z{Vrzcckd^*pI5n#yE%S|_k!PMd^Q=^zRz{Q`{b0LU!#0JuirXfwEY{4<3x`RrF{B@ z+skoM`t-AKL&`}kP#p18%XG8jr{VWFP-!b~$|3kk2pg&Olf_Wo*MRfZO@SDQk@dHQVx+7BZ*Klebo)tH`%1o`Kc)MK9_}ez@E!hNOL&gY>v=ud`yKWt^m=gT zRF%_b9;~R}fco>fL;K;DmrK5)U6--w`FTS7l{lVYjrLj6K8sT%SMuB$?Nj4^>uUjDGa_yYOl8y-znne-F{` z_6M)iFMW>E`^%1pyz%>@^Y?}Ed%}+O*_)yr&uxU>^LfT8?dx-oUN5M9jeO{@ z=q}OoTZOhG+tg>7iQnV9bI|qR{SL45cj<36^4Y)0=k+=dsXY6+%)Tz#^S0xt*v|L5 zNQQp)I(YE7^38if`)Tx_5Mq(?Y^Mj^wGaF`nUHNddx>&-x)GK6UOa=aU3!Z zLiBY?|Ll-|PCqTLpBi|TvIu%jfBljd5_Nvy&vv4y>~8~`fPjX9fW?r?jF#43d4PcW9Fq6 z^V$l%>wQuCIgXB&eCs%&<2L!cyU)WnFH^eLr5ztXxy@if0#wC!%6 z*YNue4qZ3yI;^R6Z(z!Pb%bm z{;y5B;pQs0gbp?kU92NqeMT5zKaW|LEa(r)PjJ|NcNa-iz+a*7{SLpNh^OxW=FSXthJ$X+!|4>-_u`nrx z!*2`g?+D9p34N}o|0e0~SLo~E{o;?mCXCR_Bj`T;YC^yAI#=&X$-AHTt`(i2$7`VD z#T4{6$31GCA^H3i;pjx6*Hc&6Y2LT%oUL^4o7f*9K306k33q&z@Br~=`w8t2;dSEj z81cQ{?dRp_i$PoIKCd$6IhOM|Os@~G#ogFP`9hxCMql~GwemLzqS}3L+0i5T;;QWiTzJ1^o{>F0?N1lhtIt>7+>KfD#w1k<2yuqU)}K} zy#DO-RlO%9H+w)>r$496+dbytoOVwSk=*&wBDqSx$h?0`A?ck!^&yOf(!4|BfP`!LqaE#7m%IC1~3 zpQm!#w7dQ0I_P2V2aZVhx{&h^E>-?Hc0~7j(LL&`PJM=%_{-ab9q1DcC>P{u?XwllS}VFXy=h@BqRrZ$!ND2J{=i zHw#PRz0Vd!q(=|2{xG7vd~d}Mkl)sC+j|mD`O{GJ6uSRL(Y_zpev{~McVW-@-y*tv ztFYKt*xFC%cX`JLi}w3x-9&VVyz)NM)_t6#74Lm}-#aRqZ!+YR?NxoAX1k7Mru^{* z!uAzH+o=xe{}tn5cDLet@Tu=vWOtIE^lipTjvm{E?>ukK7(XM%-2gph{FKV+J}311 zp9}OTzxO#FE8cbKA*RLgLSTW`)S!+DLO&k*zTvG-zSU{+tsZ< zsr0jn(Edby@5%4A`aQ4iACc}S!W_E&UD3YZ?(@+6dxU>S*e-=#)QM~oP_R*s4&%^#dCi^Qq zhhNrj6Yc$wd|%N6``+ZrRp!mx5I!AQ)Az=w02Okh^`w83KuF1DX&UF~4#U)B_ zdxe1cv8Ful1KA%(;`XN9qT`f5Jysa;{{!^Rl=u<-(>`12D(bPIKYfoSI$rViJDu@8 z&zH@4ik~6BhS!U(?-trFc!2zD&^J1dDc*LfojXLgt`$bKV?%xXUw+qgd63ej2M8PH z$tl>`N8uIyYX6%B{ptIww!889iu-9nyG+kjIrfidy`_DX!m|$x?I(3}1>Z%^*k4m& zz3ytoPiU{2@`qtUhCaftrWW1jc8m@v<;&_idS?|<7qVxFlyj|arT9KL1pUsI_22pSO4p;j;afy6`Q8Y9*ZNLIy2VaPXT8RH zj_pqUo`(H^_^Ex7{|1MvT;JQVJ;~xgg|7}1j*k-h{j>TM(b2nvzQ^T# z7t>Sb#en|sy;9pJcaS@6^BdzdWn8C>gT;gTj_sdpU$wM6A1K~-9=4;feRU3>N2K%p z-VXeiJ*)h_FC2bWbPJpyXENpskJFs;V#a6c|0u|RxzP7yGvwx&aagq#@AC-H8?$#P ze8qU|LEGO~m;TJbYG0*~m{*p&impRpYdfLepRb^o#Cv?%&vWoPrSFn%0IpxD@bVSH zF?91P(F<_!YSAOg*}Pu#3N&3q_u-3bXQgZQ6m||2=I95rGenQs-|_y@=rV=-p3dxA z(ZP+v68UaByYyoUU(&Br=B3dW6~489^BvKP?+b^2D6IZiScCbGMYsP*I3fM!yP{{5 zlS4O^!h$Q7Jyqy^+Oi|MK0#on=SrdXTYYc9_rvU$B6@`M4-0*-D_}h4A69tH|5~r@9<6Zu zw@eSA9Ol7*`OoKO@y?1bcN6-Z_!{{bvYzn%Sjl+u`mbi(clf_4^4WIi%~dKlFNC&> zN}=t)#P>ftS14T<{>sf?nZo@JMULE>(+?i!A>(F2eQXCXXFiD^RXM(w<9ltLmlPg+ zMVNe@bl(v6kT2G!o3AN+@xb>ox z>(K8heB<_tuTi|^T1>hSxjiD@`yk8fl-~PP-tSI_3ZFkC^m*ct{~A24@D1|b=Z+zA zwqpLaUG|#)Zy3k@`;~v(7fz|iyc>ho0rsoO#j)RUUHYx75q={X3=xn-F~Ni55x9fG2?dn zF1~w=aE5-E9VEJfZ?io_Tfc4XF53IhL-;r*-0R}meoB|e!Y%uWw}_5H;dlpO{|&?!ru46 zp9=ebChYu3SbtsUcfx#6XG%FM%3XX->3q+A@lnwM^4;g4wu@dcuG*I=o$q_uzS4do z6ZC@(a=t`=NNC3~^vL1wRe6(l3)7Q?BgSc`4Sj@gaHMcW_}ud0RE1}hV|}4W74H4j zIrZ>-V*3&AM|VzBdY@<6j;uIT;T!m3#klXmFSg?tQZL&%^v_VfEjxvCL|6QGpZdAp z4);D&%KTYerF`p)gagK--|wFC-z(&#_Z=I))1@8-@^Vdh2G-QW`^h=w%?Nk-742;O z+UKeEmu`KzpkGEu^Z&@3KJ8ht8k7tjYHvQ#w;F5ZcPf@-O<70BB=!ki;ca3QK zleYg8-)CMiFZtcP`InX6c4Zyp&fs?x-hD~f|BNsqfBcMSpC8!&NP4HjlaB}&)W_$0 z^|cDO{clbC1+-J2^d;!{-lfVn25rYOC*P9v_S;{hAJmMenEH5KHe@`ePpMq{$@6)! z-z~I%J=;P1J(ltT<+I;f`$M<>Fk)OctP^}r;QF@tk8W4xB*tB6H;dAul;w;j+ zzZstc#-s18#I$e9|9gMV``}*RqkV#L*eLA;p}1P`-Qe& zwOvPam%?-6Yxu$UvzCu3-hOjt9}}H1zRY)X#$AIv>5P@m{Mh@H==9^l7UkrRi}pE+ z{nr$?5sqAGJ}5eWFZgbu=XLv^jZRSb?0De@y~XF%w)eCDT>HCC=s)+@oN+SWL*;aL z5hiaGPIeUf9iA@Za89`GJiKpRze?%t2i^YgmfH}%t#I`^;ev8(KiwmI29~c^y7_j( zHQ$eR6FuR7{2rd~0eSwjeWBmi%dS>F?-#9*Kkb_o9?~Bhw!Z`omZN1t1v%Y6%y}nO9#^l>D-)zoSxntz`gnBo~ANyyRAlLoAxA!;u9qLQ@ z-uLx=%$#^D@6B6H#tMJ?TR<>dvdbEZU18X+#c;V zCVq9Q(nb8I+s}G)n{;dPdB4^70ewHP<^M*W_#82&-}+!myLBngb{sYTTQcre%)9n~ zpWd%}mgrlyAL^5SiM*fEJ_&Nr|5F~L{O0$~n?%=vu>VS7?^Qytzr7E=c?;?GCEWo+ z-!Jt&*_Zn>=+ob}^R|6mO+CvGs~q3QT3jaD{AK^r0prp3P+kX>j5FJ9m>)v=)%~`l zy}e#tzhB=eXm{H?Ogx_;zwFm!%MJ~Bv3W`Pqt6NbE=c=n%4MFjf4A0S3b#FR#&>*f zH@{x-n`?wQ?X$dGwC~9cq32+6t>S%8V|b8S}71F-)RfJp5 z?cb$v`^odZmgjA+6YM{GO*_ReD4*M}^`z(=Ior8gba=ba^T@C#dPKcL{&xg=9cDjY z|WBcZ;qFuh@4O zpile0T1h?pF5O~J<@34NivRR|oaji!Cw#Yes%YCckKljX%@@q;zBgLjsPqf?p=7*{ zA5eHqzx(~G^+O8pfR@`^{tU=xy*i`3E^;PBKBVZyKCkk9m+>c6zVE%*e}e6&y3Z@# z{?j|iAD8R<(u4bz&h|zL|5qS?Iu|K^lL_t5%kTcw^w;1$iVx8re6H&IFW#?MoTzk@ zwlF$SSTRoR2WD$OcMrw)iT8M}B87YZIp2Zuwinvo$nRrr-mLI0Xn*Cl2l0D_4$pT} z`VRBrit;ncpYEjiCGj27H*Zt8_Y*hAi?&|1JWsU!7J9uuxkBNqtArVPj_t}?$V1DO z^;1gM{){mA9q?O1+d0pE0sTv1`ZvP$-wKC+C+yV1=#PcvPlS`73A=>bZrb+Nvlq$t zSz$4TMy~taM9&{>#?=@(SMuN4#mZ+p0Q*myG0(43#rqzh?Xc$WQn>9b7L3P$aNpZ2 z;Q#7irQa~_#;n`@-mC2eZ0DCD7kZWt=ur!>eXhz2&!B#MKLuOVV||L^i&KR|m8rp)t0#@PyN%*Twc3cX@Pz8-qP*1CoN+Pqia zE#dC~{tb>%_zHR2?TGI4pDo%WKyHjFr^|nLEZ@oR{f#B%dS5x>d-hi{W`5};`kvo& zT*7DmZgzpXz&tWUlufdXW>h-J7TYSD&(eCztQh!+At9rr_?cKXubk01O4MoqN5GG*ysOW%n zBl2zN&(2MX_j$vdaa_SK{X+45#(8+D=-BOZrD(4!!|O!*9ISn<=!|l$XO8)9hySrZ zj`Tjt_q+-Q_b7Zr{jC@FKdNy1&1gR(+V=|kpBCLrg!vbU|BTRnYWok1?l8V1zUTWU zBgS<_e{2}vwo9?z8I!I7JrB*hDt}4;_85=$Q|fWnp`8lKcfWYQKcL-g-(i2|wu^TA zEvbJ37U*w#}oSB^SsBE{oZ;V zIiP?+bP`l2ouV& zpXk)_+bdo524RC9?fV8D>SzA3KH>eD-X+S{MUU~hqV30q$oVO9KSz#r>6aAwI~uAS z%TK>Um48Lywf~5!uTJB?cWI3zZ6c$SN@6U{HMa|dqVr88hk>u z=fMs0hV^FOx3NEd`yulBA?Yf=*R5M}+2iRn#rGLE_IHt;q;T(F&X7OWoBb||?^&nF ztG?yd(aIm3EX-4(?SiN87rjBBtfMZLX`w}1}e3)@wfr>ndc z^0GjGb-VOgzuOMb=d?a2Z!?ekK5}%8%JaL>0sQNFPZ($Rd*XhH_%HiewSUzq|L=1Y z+jq21)OY5`3;q6#@7Yag5Brbxy9+Jaxg>x0DDodB933w7J>@>}jpwC<6`vd`%;`t( zi+Dez$GGx2Z+x55w?W@?3gIvBS32LA{~jT?LiA?)548W**_$c%wZiE(!tS=h0Qq6R zo|Bfsdk2!9|6MVDZ9g6}{(Wz6%=q*AyShmE7Z>s!`mg?w=sEQtBd;^sJ!kx-r;v~F zKjl9ozFRZ?eQ&W%e>RL$m*;be1>dp0?e&}QrPY_~dp?JnGOknlV{)hBJ+7OZMK7)s zZmtr#fBc``2OXf_b!ev{dY<>~L&n1jIhfo{8J< zO42h&@*Q>sNwWaUV z?MrA@dxQRC2HKxf1s`Xm^SY^kPjd87`;FMZZ{DBv{S*7&uiN@g1D2rQ>5JZ} z`03$7`wbW$BHI3TyzU<$w=&RjZGHmfq{19_!(Uk+qrZIrvjZKtANk+t11fI= zzs^q*T`~U^)ML)NV7Ra12m1*f@BdtN6y7jjO_2xQPa4915#zxAST=?7mDdV~^v{(3 z_4;!@Q2gitVfLVK3V$_y(YEXNx^zbR?xTvY9|xZj+AsR#dC`k62yG`;!FP)n6&|rZ zwOvQ@tiqQc7jD^^Ag|{9&l)~6->l#R_hZDo?(^XVa@Ob5-Y*PjU+)Kc-_U+fY!@0L zx4nO4f4A9-baxl+`##Y&q6hf5 zvzRNdgy0bV z?^EA`|FT_5k9Hi=ztMRr$9{`O{MQtDZvUYp=AkA1)H*=N=&fpDpiKd%w!(X(jV)e2~(&_Y(HrEcCgQ?;m$xt?*?a zjJ6k!b`qw@wI21(j#qf+6k#8^I7FXq(_XeW9n-FT`Xh8Z(@)ulRL&TBOn=ps=kwhu z-}CwJ3VyP^zxlF2e!2gr^t<<;3+ijE_>SiR-$U~`zx7}57uZivc7y8OqhA{MEa89L zpVreO#+&)q_j~8&GxU&(c5?kap8Lp|igxloT4esFKGj{Sm+c60=JP4@{S?0IKCX1W zAD2ERx&ZB8&-1eHDa~F`x&d-L|FY=xTfzm{`iAIPDeQe(xPDS-dzKY?{pKU2yIxop zLhHdECkxuw=N3Ni+Ts`Fg8h$oXix8l`W|A8+*o(@9iOXCuNLifllP5=t`E2Z*YKzB zWro)%zx6QtWo(mfO1$^khyGvUU7r*_sZ*8b^?%kDZ99buc@!}}Y)(}C612VQ`dGrr z@B84spV*?D1?7a~FUaTjlxFC)J@nBo?dWsCkaihcUh#ihb~3cD&!v{M|B7-p@PY5; zROst-|L5WQ56_RCBSaULr_|T`9WnCN^YIvYV1I`#A_(KLfCLqryA4 z3BCUFyU0uUtc$+tcYlK0DfeFCUVY4!36Bj6~FnBaQ=N^yAs+@V)7E{7?+E&=;c$w zka6vE)anBY?=wDZ4=_c4upLH^apnC>pJP|2EB`1JChrk8%%cHvs5n~TJ;s6U(;~*x z);lG~D4q91Yw9<+SmCy#-CQoZf**R!t2O;*{Vbl+kar2`7`{e(iM*jtNVrC&$Ivegj!4pL47}sC3I*IHtZ8@+&)1;r@=_C-Xhx;I#}T$^KS_s3_A+z<;cdqrTvr_Ol(8?W;EY*8p6(eLOxr&XLzSeBk#~vb*%12KhX`SG4Uo%O^zJ zzqtK;j^Rt&Yxq9W`Z=X9KP$|bx8sTE>6eA=ZwUSVc>p~u6}}>U?dRu!G(&qpAg?Cn()1feoHCG=L;?5@reHQ{*Bk!Ipfyj$m7`i)YiABj6aY2 zlJPwue+BD7xH{r-l+d- zm`}IP8Cd^y?@+w``L=Eo-M&@WgQ8Nk6PX z&l~Zv`fm4d;UW5 z$FRSRXuqFmKQg`-;PspTXU;hCI@{-fBgVtxPL;PoF2@7WokxW3r)DHNrT<1xiynSP zxcQuLjlAvuuILOoJNl03{11i29}Bxb7fyak{ExvO3LElGDR1*7h4)?*w#KAGZucJ& z?RzYpzUU?VVLi0Nd{v&T_yj)A;ZL`p+kVOWF>CVye3HQ5o?m@mCb*vOULs5x2O)COdWh$tDRQ%QvC`L9 z3Hvt-gZqTThlSB&Li@AYJSln%rbE&_AZ*>+3TZjJX{BltbxzgMmYa?g6c=S$m} zc>P?{pM#9=o+Y&1wD&#Q^iM{APEH{m{powgJ~v$NL%nwsj&>1t;MdjL2!FfKew*z7 z$9k{*dT&lsx|sg99dG;|g^yEVPQ84u-F6!GTR(e)(#^INM#zck|J8bX{r?L$uOWU1 zVY-vB*+Wd>Mg8EpWZ845~e|1E=_t9t8$YJl#2DJN}c5b)%{t?2O z?}YCX-MpJ{+G|7ml=Q3b8|G&!o%Py2=?lK+ee{C*FR54S9Od&pec!XO{m_PS7oD$k zIpZs$-^}MV?X`iQ=lqw?+x-sGjC2+M@AbOZ?;-V`!Kb#%TEd4ure*fj8p4_6XuJ+;}t%zAEG7S zF`rq!jTk>`4ZaMMb;XpOeqU++Sn*)8i~) zocUaOe67CU^n^A4>vN!z|86m_CZsEvA0znC`bKq+%2_fGPT;fdiwd`$>#&0Urm*u3 zq4%X1zax73Ibr=7q2B}beb?6A3LhaKEHA7t_}pYo{p%Z*esCQ~zj@q_;480Bwvh3a zg5IB)x*v~GdDW5B=P=>=0AaMBaA~?N+WLCVc()$r{Vbo4jQGx&eBQTiyq&2O{TuKG=rdJfL{*GX{)< zf`05EUwyA+_C=*{z9bxfRakvpIQ=#>dhz(XqWxZB`Fo;6(zVIgWBiQ9iZ4GQ?1K4| zq6gHsbBE}N|MkA6<+Jrk+s6;+7q8!AGu};odeBaOaYORMaj#B!DcHQzj%KzK0 zvxMKgf1L6??_0Ows}lKL(*M?*ybkrbg7@hb@6z`Z<^}8huDAWWXSvdqAK?Eo;e_uE zXonPe;B#=J_2M!5KnEOv5qg02>jCtPau+h?p^?lpf4sH@1z&F0vu_ipfo%(`f z;TRgU}xp_MR4cUt;oU(SBDr{JQAyYeK)DRXs1-=hc3X(B=F6&H5us z=lc)dZ=S!8a{2$s*`lp4FOiSoISOxx_d0rjzPJQi#M@rW=LpM-_zrTVOF!4=D%|^U zGrpG)?)%h3zMm04=R2JVwERTAOkHIO5pYxsG z%i5!W_PW;g%Ms(Z!}qQ4ulfHq@^%DPpw9`spJ}^*xKKUpzbl|U?T>VRvEqGB;BzV8 zKeRsYeS#7EZNDTF_^LtfOhCum|3gB!@9CTGxAxWfZ?C)De>HN-|6fzz*z+s@-@Z`) z;dMpHfA&Zh!k2T}!}j`~Z|#TF{yMy#oPI*(_C8BHp)XlaZlN!a!1ODmFNMWR!r8Mz zzpGL|BHDU%=VsB98->&Bg|_oIA6nmDdA{fW0{CM3vhnS8Ux+*$A&z1Lh<95%#`A?>MDjFmKw{gt7nCpacwn6P9-!Z`T#>K+g3_my-(&pcPbl1a-ROSNKF9DpGh+PMo^1%f zM3y(mvFHfpw;j9v97abee097q0Bx6LzjPJ)SmybVexD=HYvyg+8Cecak*_oQ$9&pc zsqYQ05L&Kzo$qtBE%|nf(v5BtdL2A~_PY%E)rzkv*Y^u%&<*i^N2Ys^(vKe#E}szw zpBE0`@A#{tSI7hVq@4&B03Nd+@8hM6b|qNBf8#z=xe!^mspE_6}h{ zcuIQvJIyH1{(YA4btfX<_TaWczsEFth3F;va=^WbF8k0U?7tkJa*h?gM){JRg(327 z%O4T?e9U~FG44ID)u$?7%D4_0=M~{|NDd=XtxwxX9o?=Wp>p4e5PeVSU)=jp@<)?f~rbpDA+OcB!fV zAN0Q3g7(a;H}hTVac$&O=PJJA`Hy+A1HUIXDBku6Gx#?^zWe>)<|9gHyQzl!UeDT} z!1`gOn?EHi;dk3Pd%f&;XcFXf>(kT&IckxYZI6GTtj!a42Z z^<_wUpDV3TQ@V_C5z^oGGuyxV9**xbjNRYxONyMf{m&G+JGouuPwx^o_X@r4vEAJWxjX-u;&X5{621O} zaPhRz`c*@^g7K9-q4?S3Li=qgAA-JLXuAOGjREtE*IWKS`w?ATqwZ}NfX~)9z-lIz2dqx<;$G(s6`$Wy} zDBkO(`Lm*ZAGt-p`CWt7jf&q~A@un`@gdRPcMfPb&tna8&-Ny^Ys)TFz9I6_=iz>QkQ?=z zL=Sfo`hAnlj-u0m^ytO&|4Vim%l}(ALQifJ-vUSfkKz;3*Z&Rr{}jgP)%LF$@1pN4 zSr06bFI(+kIf=eEXa0^D-^EGFAEF;vfAsyNkapV~sdT+WXg}yR@h$kr=eRX`c$@OQ z|7*Q7=KI#;yYQLyo($T0SB`#Vd+0v=@B1*e+uHCw%h8Db_ql=Xe7qi5FkVXj!~5wu z`G$-)>*4mR-e(>foTc_yFn$ZveMk-v{W)v*#%X{_cHT^bq;)dyMv@Yyand&uYg1HOS)@{M?+Y za@y|`uFj-f^dp}ij9=D|mg5Wfd&RhjQ{|7*D=lwJ%aac(-uE|4=q~jrsE7B#y^ret zim6|YUg2{O`$4uHhV68`KAbWBeNJV*+w4kxBVl__q5ThZ4-nmA-WePtdU>KSf-ilp z>UE&^ZEU~ccb;a9H{Yk-vR}Sd<=Nk>?|pl|*t#!(9yvr_XXhxN_ls=j zjtkKKpj*&>PjmDZrMKN=%KSNoU#wqM=5P2qroTMC1IC5V4HwAyf_&cR*)X4V;2Yc1 z4hc_4@Aa9_w+D=a9{l6==bZ5{xw0g)f&+i50x6$7=$Qhq=ng0gNdl8skrSdcQv0^+M?Jv&l z(Wiav-{1B*j$hDEUFPA8@_IMvJ1#fAMf8Mp4fz)Iul-*69ANQ+(l5U#v_73pC*NxBr_Xq`on8;V_qkl>0_v9uGx)`RxxGK^ z{p0W*O6U6w_V3gnFT9Upd&SvtN*}$G@1S2-hl%bpUe=7G3c1nVN%8e|!q#hqC3^4# zy|?&ZrS}H^3H|rK2#fziIQmy%&q#Rizbkw|`U&&`y?Vlabg;d?JK9+|*-e-s|6=%J zbd17l#`zTV|L4fjExR@T-~0MC@xEVO6TdoAMc}aEUw|f;H*elxIH9sON~_+_@7dL&L-c&#`|!E3_ZI^AH9+sF=trL;*iK@J zd>Aorc2A=|;F56b&)((N85`&`54BopfA^AhXN-Z$&L zj6XK}>pRQ6g!ZFVzEN~H6#5;A>F%Q2`v?>GGB#ha&J7uFOZdoobc(()WW3q0yZycS zJTkpT<&UltTCQeSh#p)fj2UM=);}TTmb62Q`V{cdmfa)#-eLZnpeN+1*B%jWyN`x?tiU<(0qv7e-^Am_bo>TfY>4L}j4&Sr=ZTx`3eZRPP zNOWf?tl-~1^ql;QzT)k-v*ADI7m$y3$!IU@Pu^GX{>X^_w7;myuH*+3#`AhNh4*#= zSwGfq6CLdL~lMKtgja?$yZ%1dWO8u8JAOV z%g%&!=Hr}l*FEL0_`df~eSW#%JGN6O;Pdc&y-GJD{m|(jRJiB8uJe;Fg?9OK(oY{(KKs=vJ}tWQqHy?va00*2o)X=LPYd|E zfKNO8cg=WPpQ-fLJA4lA{fiajwnUD#8F#+N5mE2>9+hJ~WW{*%{#K9vDw)T+Z&ms+ z{JNmOtyk5^3(wcK6X{dmt@B07wY_V`xXKPu`IG&GUF62<^`iUOVRX@dC;u7!cO~rn z&%y|L`M-&7p$`Y>&tvwdYxbL`U`hClee3Bf^PfwwI)+s69^LgQf?+)Lobj8t>3*A3T zbVB%=?=A`NCyEaa6t-g0GY&$qOTYPjWBU{AAFA~BJLdZ|wi}u;KH6t1T^qU3My}_K z`|M)HkC7AY>qw6rSlukz_Rcl&eajX2!SXJ+MCl8{ecoI82_7t{}!xQAL$NT)R-^O*^h44qEqzl^1l*Kc!B;r{5ORM=;KI`t>`M&gYHcTSRyH-*`{aCE-m=^oVg{`_&2M_vq&l^3?ZTQskuVZSC)D zj(oCy>-!Bga$?4~?Sg*)u2ZNU^_9Zq6~fk~!oJI8oHiFLe2QM}a~bQC_1TJ_qgRb6 z$NM9LI}~5v1w#A0aB;iBUC)$w-&geglreJ9{BA!O{%+-U1@-a0K+hKi^T+&s`d$hS zGtm|K)=mfAA)WW3y#G4BK>1?$*!Rnd4=OyOJ`Lr0-z8<7dcQkGo^(3OXMHSVd}qj! z**g_KVjTLuM7@{7{a*3%^`e_s3dg>`@LK3dXuD49tIOjQzJgyi$SvD}+aEZ}h2yshhwzd4seqs6%&)WkNsnCV9xd8- zPd@icXxEVV(Gg0QB3~?bO60*9d9XN8=|+bOEr&WMh#s6Iw0)QPcgFuu&R6^de)9Ul z`_FUu!}bx2k*t;^4pXyy;*2GSg+6R*RhWr%ipVX!O6ld<9d3C=nit#^J;q+g->=APPY@z zUng8Mt~-I~3_5;==rQwE8Hz4<6AqEXQ~KHV^WK+9PEX*RBOU8T3c+bsW zjCY?CuMQ?Z{9wJm&3sg$m)IW7=WzBD>UD9C@oo8NxorKtO*u>YzeWEK-2d=f4gXKT z9^=CAXZYQnl=dCcUiPDtGr!Gl)PH$j#_x4ycPf0wxb?bkLwfriT*8;FdzF3wnlF4l z(|=I$U2yiO=;>4BdsgUsp3!r}KO;;&DV%&lxP-QUjUMTpuZLW)z19SI5uvvxkE@&( zxEP9#9u^Mo7WQrs4lWVK%y(_tGo$}K9xLQo_Zp?&JSJR!Ntk>~*#4q$OgpSe-)Eez zj#B*e?Lzx^P7W7sc|Aa0_#KBO<7<7n()BJA7SOgE%aOOf&uG5%ebk0=He)_)y-wvs z%$E^*ul3^$JB$_Bu>TyguiOW7?4aBKpY-PHRh0W$VZ4KIu#?dH&4b-V``swt_sHL( z@Pu}nz^8uy*Xs1~`BUWPVqev- z^H$;3Jk9*P*_;1jo-Rn|_hk#@alW(Cg>MiJkoUGrZ@p3BHR)`>S5jU`eQM;a^{blk z9DGRmz22V|qU}$^_v|LjYqq2Cy`Sn9rT6>M0r}fkD7<^AFzX68jMENiIca%ly{AEb zk4~qY_Y2$9x5K!eU#)PT8+qM7yj|hxy+XgUv|;}C`PUeEx4us4YzJ-q&G&(9&u;$_ zDe^j^eztS;K9lWOz2DS1Tjkr1+WXP-OyTy=VY?aovGaLsm;bju-khm?1HSM1ZB4tC zrzqa@T*G`~yI$Wn_xVf<{m}O$62|XrPn8oez9RID$*T!}jj+Y|Y%#t^=7YB4yYN#+ zeJlRQ_ebo9X~no4ouzym+S%j5c247y6kkxT?>*T5Y0P-w8uYA7u-9c`RDL+XRze3OOx;Hvi;W_QG z_B``J(qAB)F;Drt$nR7lez?LO)MB(EcKQ z?=W_{vC<{XyVjenAN!tE`yQq9xpa9a^hbo%HNq`>or^?w`Trr~#d6K(tX{7)^mBzg z%oxu_q;iIg+cERd>QxH2f94hYJ8R~xDf>b(`#>A!!+aa%OSTurZx(u8=5xa#=7AUg>?`)cS?@KWzs+fsZ{NW6H7q=ke|GZO7t$KHp17JNjO8tkCDTL&kS-n8HVg z3Tx2&KE9VXhffypjn|(e=y(t1pEHkd2;c0d@G0f`e5Q~5GXDqXDP2Q#2VfoI==mqS ziSOMgoRH7^KGwUfNBf-^>!G%T_BoCBWf#w=yxC`jA$)8B=t)7he%( zVEHBDUlfM$cgS}ZA5-|t?}aWNQ+V=-FoU1%SJQT!E$f}kcNOxihdlGV>w7N#-^mM< zTM6f&?ZukD!o7}OGOiblt2Xj=4d3Ls=yj+s}ZZI!S83Snj>zWoM;FZoWim+0he z!ZvcRdW+}@7!W_FeXI|7zsBp)@@(a^UK5-q+UGppk6WWpkKmh(erTPf^yP^{+b?dA zcfQxzr`?jhmCo|B%l}#L4QR&+I0SuOI1H7)wY{(kgf;En(7qjTN_*O`=#u;!+SBKi z){ktL($Ef5`afjc%o#7eTlHPfzxMk$hd(^e*)P)gW~H|so#l-6a@%qAE>b$52PW`U znkn4t)A=c)YvgIexVOIPd)Kyi_4^o;%aqUe&n>57_&a`-cxbQdeZP4~JG9{I^1VuL zz25q2j{fTVpabX@>06Aug8wpY`S&TCeoJ zmhJPsADSMi^0)Lm=8pih{qyi0O4r#}xPkxLyNPZ*zR)*@jL&9A#jlws453iLc~yN!VV zjrOEm5tDN~ULhqjs7$+s` z$LdnP$9VNViQlDL-k^B%t@YT+SmEP|aQ;Q%?5o1~8^Y<=g%R_s^=j+e`R7Sb{`Qwd zSEbPYuTtjW@#CZ)2)%BdqTes?RCup1oG@S6?~l)~?61W8j>)@~evaI>9i7{MO+NxOgKntMGZ`$rMyww~|mSF7C3 z>xAJOg$aCR|5q*eug5qV!k@Oo_r6-dxNL*=129GI8#m~$bxYs#J)!~QFJ)W~-=_El z=_izv(r*1XDZULBJBgmqp7w7&qFqPGgTeMnSH4ELq#YKt_ki*&XS(pS_v=IY*ZT!S z#m=*tPKR^ZY#_vE?5AnT1=zB=@DWa#x31jrPfO*FHw(Y%l%BUm(AG8_Da8d~4P#3+%@i z?CaZpyrN&4H}Rjy!zdQLwjRZQct5j!sp1##d6)TY13%awmG^BU!nf=c`^q2PEbLz| z95b#x54NvVxcv}KE)wnY`00C~(VG_Vf$e9!9@^S>I!Ebi_`>$Geuu*M5PFX&T`&?> zPYLbUuE+oS{^OMKVm&WBP3djV*FTGL-Y=}r6&BQIm5KH}qUcP~IsZ2UCzLa%{vFyQ zMNjH5UaiMZXb<}zTryACU$gziZ`td@KYqt_#C+TkZhorwRsFnQH-R7L%&XB`6hGV< zWSlMF<9d6AubFSX|73m9`eFAdr5nI^L)xKBI~1oY-uyQt-2^#kKQi7Ai}(-kgJss= zt(WYo@~o$<{U7KL0s5`|5v47qpTjpx%CWzO1#-~#SZn0aoOaFOGwa7bXR?3c3GF-p zXJE~L1kCgCv8spVkL~pArzA(tx8N_|PiSuBe{U1E?iW@c6OKMDY=55k68h`H&Q!Rb z2@B@i`rD$HUjfM%epU41cZHL033KN2lz97@?lbSMpHjNu31RCI;S{;z`&NE`qJM$n zea@eyqHPcC_myMxFWax@^#3|k`slUbHo}7a<%<1f>&;X4heFF+?)OZWlE?Kw2q%9p z48RfL%YRmQie2M^^VtdZj0N)C_kXkI9*j8s?V`c9${hgCYMhrv5%(9?_2JD^$My)XpfcpuEueu>&2@ z9)5RiOD}(`%JIEV->Ybtzv?#MLGP^z_xV~2y&wX6@YR^{5s)u9LFH`Oxgh7O_bJ?V zh4EFQr?(252ZYr}LG-*Od^R2`-1h>D+eP=8AH$D`w%v39zm|6?-0$D`UeA>B#^|pd z_^|n&(ocUZ9Q<6k`3qt2SHjsZg`K|?wtpdP$X9+}^yv451@gfB9>MP|zzxOhGTJa(6Jwk2_Zc@1SpF9tb z&sDhn-Z{Q?3E}8HefoD)DBOC><_6K5JB91}ggxq6cS-+#;nu#|yG1Wg68gMy_72hW zNH|~~?YvHOvXjvJ#lE-PK@N18f9G!?J#wOao9HkRj^Kv`^!aFWnBskJ&-E53cSFrz-z0isvTzYTJ&jec7o zM>F;{)RzJDDdSG^AN z`xagF-qr{8opvVd^B*bWYsmPTy-V>W`eO|Lb!ivhr}I8_dWzEf{<7x_@2~irH9tt{ zX8Q<-dkGWf-xTzDb|1dW8Miay8}em@+x|Y<(h6#9K)+jX=;g|FTuT<Azp8k;Vxv+}2teA7RH?;Ry?;di> z{x<#YMNI#D|Gqp>>HY4c*SXoj3im$Y{AAI~_X>*(g&XD(>&<>Yp#8Aorz7FkIm>56 zThE<5Mf^j;>~7%{{cCcg=y^|QzpB%|=-EBO=rN(+i}Zf;@<$49ej$wiN|^jwn1j); zL@(gy)?bJY|5P}joZfdum+))(HPJcpV)7NyGx&HkAs+rsJ}$auo*msKI=)$G{~A88 z9uV*Q5#GPv+@|zH>(>v6UeN9#7~QAv5`ANMrD)%)^1ia~Wi9B>kYt`!yNT4}HEH@ZIbZ^_pQ?1Mf)CpxQFQ3+l7AbWu1uj zd2yHcXm5qvUU*Zr!g?s2A{T6D zoH6dZjK?g9dum~rNN;SuTVKVo)<%I%#h95ZgRQ$+U(Pg2pN zGlgr~#p|~b`G$-)+jZK$xX*ks+*kRHKDV8r?`CgSy!{Qt%tHhCwY96_r;L*vT%tF6 z|JLsjuR^6SUoZ4MiQ;vlyWsG(qW#|JhWbqRQn>9KmgxQ7FN%&*yzPsN<4AA0fE@BU zmCvOE{$s#=8&D6Q8+&~@pX z82nHe|5zCPnXvlRZ(~Y$@pFZbp?iM;{Yzm=K8I&NQMl*lRwcUoyQKfJFkn88N1}`S zgkF!gkRwCZo9Vk1KRQO}^Go}$vb{!wJWkkGZXs{i$k!Zh z{R;1VOqhI5SirYA>)IiFH&`gX`**_mZ-fiwS*xd&4c-vjjWvdw#p}&5>s<+TZsl*3f=`BEOOJ zR}0(M3TMpY1Hy;2a}PTDu+nvULbv;f`b-|ByiW*|XTYa~vE>u}IHlYaIaQpibiTim zoK8OUS)Zqdhbnx1h_HWzaP>~1_08gF(J?q6eto3E=Y)4o7G3ha;aQ@avxUB|S$s%z z>vCaiyiBzHpH=)fp>HkEQFxAC~Jg@s6LTh*B+rYY1eH7b~_q{LTeFW$=ax}#*uS7q$9Y+WGk|JM*=npxVZcn@HB3v^6 z+m74&psRv*xI@^5k8R)83>0qr;*@r@-C}^;nb9BJTS2F9z6UcoQQ=GUzPKaWcEHuUL^r3BAKG^O%eKM`_+tQ{&6o$4`zU_3r?7**Hr|Qy z7?078qV3PQvzzE4>Enp}Y0W)$?HIhYIigSlC4`uKrqd{a3=7!~a6` z^w+}lA4&Jm!fFZq55o4ZgyGMG%b76!17Y{~h4I&ke@Qt0q;Lg)+OJ6OLWLLa6(%PM zmxl?r_9GdeCF9Zda}D}x%)aQvdM5gs_h~cYSLkyU`d=IUIRw|}(JSZzJ-fwzZT~N% z59Z(sJ-dhAIr~S&hbv)&{yu>oL3`ggp`JtPZN0U}zITuEL+WjPzDNC2;+sFy_Y(Br z5x60|&410%Ys()h{Rn-x`aboZ35WcD&ibLne{GhEpRj(Ipg$L1Re1h6;o$Sa^*4ku z=}Ouy{Rf42XpfZnvu59E&3wCpU+1iML*(T09gGv?r{#zJk$K*anQyl2mf@%21Ipii zTv)(Yi%*I6eLml(O`jtj>p}ac^ZCkz`85PPcPhQ_(^ij)?xK&5;oAnj>BEQ1zf-#W zUxcHTaPuF9bHY>ja`v}`!7$7H-KT&w{6Jhv$VNJg3 z3!-g5?RFZ{9=*pDKYmE)^|JM5+nWbBE55l+xV%L;x=Cn%o!-y4{=B?e@xu=b{Z9G- zc^RWO4{lfd06A0A?m7KB`n=-(4r}wG==n3k*^|O-AhaLwmE{!r&+r_@+b@CrSKCis za+c!T=%4nF<9qVn&t0G=%uZ8!`wi$5-Xpw~@jbrp^Z&tR3NNk_x}B^?CzmKZzC!4C z%jz3N``x1n{V}F}+aFYXafWblvM@sb*&HX@_9GR1xO@xwLSgnw;ppGQ?*V#n$^J%$ zJx9WMRfl~9+k52fBQH3gTY(+)krng78aa`@O5d{`-4s2>_quG)vEGh)y+PPRZ(8jm z+I~cqXNoQ_71}T3gmJc}-F&XKWE>8!Q~C`3+wWl17b|@B0io?6e7<2jj27vXd_D4+fN&B&L~-ae1>d4cUt0_vTDUJv-)QTsEq9p>;neaHU$GUQai z_{*=M{)|)aqa@4+_WL||PU*VL2R@&TrV3yDm~wtDoYles`g7~gL~s6FnEgiB`6prV z?}g)k7EZvy--~WhPDcLV7YeU_A{;XRCd|JZ>gji)n}MW{iH^fHU@wm(IVvs{*ZL&rwy18zW5&L z(34B{i8o+GcpF^*p3+agBW(D7PCJy|e+TF2d1hgK{7$9!d}DugtH%^xQEvW%=vgH!{zN$bTjBCQ3A_I$Y;SYT zNw0XtD=uBWT39y?fl@sA2`QJ*<_ z{TjZ`zNh#CzV5)+txqU?{eUpLLukMC*3U-pyY~k|w;%oDchOeJzY+3qU8uZ>{0p$% zk=0&++0fiO!!F+U~t|gJ|y~j*!%eF)lKHiqt^-;KiCz-!cOj=& zDSS=6eb3VNu1ol4ezwvrP8Ztm!XOoGe_XZ;x7}&Hx8f(r?eKNb=)Ly;=l9H4*on3O zRs5c!H+%l}K3?)_z6)mCi*BK>EKGy8d-l1!^{Fj8&^IdobXTGM-PwPE@1@y)U;li* zPk-32R6)PbtT$h)bP?%7+TZ>+Y=1FfJPc`X_nZA^RP=LnlgjIZ1HRL{Lg6*~^yDJG zOSvohZw9ug|Au;vDQ8BxwzJCnDkr;DSl%Y|eaZ>)E+t)ybQR-1zKry&BMbCA`$cRY zq4*rR9VDbbRJeGj(Dwr~=q2fVpEin>Zh4@vzrQehhtT`cn?SVvxzD!~9llv;{jc6p zbWZ#v6g}Nj=i4ba<{d^h5|Ti-iL<@;X7 z_)O7D*4H)PFKM3@>xqQ+Si+Az{sghLHZW->}}XN|!KB*6$L%b>HIsqJ2Mha<1qy7xpaQEYFbFW5#99 z{8FQLHlI+w>_uV!E5gNhgw2nHv!8)K7g}HL{i$g0Pp^L?db$)gVDS&4*MBdJNSFMj z=&%;feL(+R+cZS}b5yF@@W%bWD5Le_r=G#oI35{z_uxz3p3; z=qdJpX!}&J6S~xAgPv7iq;lJ52|d5Ysc7rLy)#6Qk+b$EX1`ez<|W^ApP_fzA8+y@ zP*8QCaSjY z@=8_Ipr}z)3Md9ph@w*Wx>8rFxYP}+pi~73q7YFbpg>uKum{;HvJ^xudt@zwQgNZ6 zLPdch_*i7C8|HDrz8~)2{lBiqPxp1soS96LS?)~EoLOuy9HZ}1evnAt0=<4-NA~|6 zpHsWyetfQj{kaO-``US^v}3Q6N89N-!#4_RuMqmb;qZmXTML&w?*;ACaRz+eNw|gV zCbTcdcg-kw@N%W6*m=FQU6X#zzk+t+{k)w(>2=zv*O473Yw~=hJ3gxSLwJ3(PCsjG z$@M9J`d{CT5$$~ZSlQV>b@T+u9qQ@x-W(6V%k%KLGycyt;kk}qt^AJ1utFX(FFL-3 z&mW35l6{@}PPXFu@NLI8@VdDDw_~1@(;M{9#XmGZ&+)Sg*HL-iui55(r11UtElRf^ zQ{x?yYws5NT$m2yk^i?u@Wk3q*wO!dj;8&Do6IxbU(-EM_U*3=(?VFCA#7eO>|7&E zeoQ(z`kCa}&(Z%>*tt=-U|xxSA=&%A`r3zuJ|84}A$rEm4()I9C%v!gKH&s^j?V3pbJn4I@aPi$JI4QD1z+x9 zSNpZ{*$=pc4_ENu2J6^k>{{^QDdqRUoN|{&cy1UBpL|<#0xutO{n6FZ*Lbe}PMX1^9gla&{MdPc z+R2h}G-NyrKPY`?7omAq9o{>pUqy#0y>X<_>#F0U$bYP`p#A2^(ecukCkvZr3A^VD z2UiH^6ZG`AXePM{@2xE*$E-VN&k#S3Hisu~C0uSQT&yolA6CBcJ(PEwaC(cdLw^o# zmOSFR_S^D$bAG$hGjRAD$==U6{ULHGte-9Pd8RAo_0=BI2jHA}zL`nC>`$CKa)>4zr?s|$o(zE?_~%aZ32+@bXLt-{%L!s&N~ z;fcbG`zyaBIj6pJ+D%Hk39w%tEj!2E^?vX<&&BJC@#kbW2Yt@nl<$iP_w9X`ehxY5 zz1@|6{0U(KZyGS)I(|dAtylFe_;Q+iL5zWWs6;F&_lLs&jnviB8Nk>moLF)w=`Qfo7%m(Le=Hx;g2 z&c>2Q8wxwfK7V;gKCgEU;2~azo^G#v_M@@COvQ7tKS$*Ev$yQm{;x34*)KhT*ZRB_ z`%h14*U{IN-*GRewC@JvmcQegpO>BYQ7u0yIona_b!Y$2X;I$_zMQAB^Y>}VyxgRH z*3!N^wvp_5l+$~uWb^vPMZ)Ix_X`R1@9A9^xvHNIc~Vm zpXhHTy9xPLJl`qpJ${MO``mY91IhM#Dd;x?`fZPO_96e1yxv)Rp7MF$b@h75E8gqk zgOYuokoUuuAClhRVcrkx|7KIhqt0h!=Y2@6FH3GQUXSP}(<3Rb5DvZ}oSZD|ep~2x zSoWtVuaUlB{_{HY=tk*#Q(<<4(CbW%A4{&T7N%oi<5HpHy}OPY54Gh^!e{) z=Qz*_{JUWuPI`o#lP_`kr1yTSa=dQc`?2KYhr$4!ynvt9;ENG_w*}8_!%Ig8ksn?< zgqOCDk-iN-jo`_{v!wUB^N{uD#C-K=rH5Y=rkQX6{~f@`d(^L>zU8IZpDpad!*lXS zpOb#IE9LDAa=j(>i&?i`ou~B9NSK0k^a*xL^ucAaoAceV;=3hyfa^R`?|;0Wu=yNe zzPZrH&(ohsZ$GP){yv01 zu5ML&@7KZ+@(})PzmnzkN>8s4I^IwH6v>XalQ3?z;Z^ldDZLGU9v>vxyfQvca&(k1 zg@;xLOZK{S+Lzqny)5>TJl;=Okgs=)0uD#!oDyPrj-J+?rv|Fw8-c_ur@9cwcm_}rfb zc2mk5e_ZzVhjm;I$GNVyQ@ZC(pKIK2N$>rGp2sH4PmY7u`;zSJ=RV^-jNpqM-n--f zh7H;K+)(eonr|Szd9BZ3a@?x?O-ircB5Z-vH%s>U8Lihzo;8Kur#5@7*$^LYlyvlo*e9^p8d{;!;UMCtaY@O$ucnKFORXs-$Kis$Ec;P0sXb1KjO zTUxZM$x+h#T+xc}_5?mKVICdQE?TsgeyV(Z${o=@qFtq*)84vYkeo6Pm(;WNRp~>@ z^|?z6cymBKR`BPpdGzs=_YI--1I7o(CGWmM>5Hwg=l%Hqhu1xdcahF}x4&%nMbbNd zWA$#y?GFhZ@6U0T%?HPuDLv+U%JG>UzoNg1(jDip#`jeELiE(v=l%NJrs?OE?)L9< za2)5jwjSw^722O9c@pwdgo`H&y}xl1OLqI8wIzFB#f-?@+q`TMQW&Ql9r(ypxy8&hbC;K(gbG*>B46xa-?0-QV%cw@S`B!g5F9 zjPWZ)Ki*#Y-cG_k_c8dC^?te(UR#+DA11pxd^SFS^5N0b z!zFwDw|0``7VFh*{2=5?bk6VB*Q`IVCA@YVWl zl8gI<&4+~L--WY33ETGymkVL*0b%za!g)>nID4uve>!~m3Bu{WWY@b}IOF;Y>eHkD zcZ~FV`*UQ!Qob7XZGfFyDQ_mUpGk0)XF@GqT$334Hyq6Zdp+WvJ<6*%2SzVy=dW=H__4m3!c)QX^OX2b_!anaM zze%#sZ=F&P*S|~s&8vM5#oX-$J|Dn?TJWay3o5r{+%K395-{Ys1)q^!<8#=P-{aSrH?zpA@i|$iqBbDTOZv`cIJOW#_c4R-s}B6c$VV^ z&OfYl?~C-gvi=|4-$v>E*9fz1g|3I=BF}b^-u@|$pXPY5-iPON1np0peUS3$@Ai{) z+;IC-&fY1z2;R^`t}|XN;BCD($!_viVT1A=A0|zuPk0VB+Q$mC-&ddZkhneVuY7~A z38RCB-6Msq6NRI1k`8uGlH8;H&kmQ|q5K}@`n|>blK;y>f1fp|cbocnyvt6Ooxex> z^!I{#h4k0qDY6?gE>xFG4#vXKxxzl}W=VTY-X;B#=N!{se2$IdEUb7RK2OvBG%@4) z%SG`&|e1&jrpIsukVEk}9ji}!O zTr#fsJInq>9r7<2SK{qd-srW${EfmD{nqCn`uxHX@5k{7{U0R#u=1IoJB~!jxaWBN z{=YM#e8+oPa{nGTyL+g-!2Rg!k~8{6dA#KEBw_aqVf$>M_r2ujNDePXe+fvt?wlpL z`#s_ET4C$w!uV&x>Uv=t9R5V|@~6TO+57e*%1OZB2eNY<>hyfcE$Ur6LGs#n0rP<4 z2x4@e5`N*e{QheyvU`uzp&Sl7w1SHTqvBv z%jaXsDLgcTuMWPCJ?pzet~+Bry9L(a^DFGzH!5ETzS_S@a?bUpr$}DFqucvPPQmI3 z$t!q$3~w%pBa+{$^yt@=!*i;`*DH8+=ch{dzR>h{l1G0Ow*HL#u+aPJlc($bOcG$UQKBusvpVn`{j{F_! zAN*SS*3H7|Mxo<+v>0c6{`ll;O834Z`)iDtms?*{y8RKFJXf!i*$;hsxa_>%X8*JV z{@`<0%&!MW%YF%;@cB=@i=@vk6M7t)mXiH{tnn+!A@3{Vxpp6vKAj4erwZ-YT+by( z@MFjI_Bj;hl~e5e|FFw_C!bgT+NXv2M=6haB|vV0i%%(ixQEbwecq25!AEM?^>&tB z8`=N!Yr9BaqrE$>L+1n1FWW-%0e@$f3F*A&3HR;)GUahfw_ia44;y?|ddFk)`Eljz zrMJIk4SD)@>1!R~lKUT1U*AX0eRvCtSJVNC-p7jX6G2?xCpU2``vP(w76znj6w@#LRMZa5JD0%TC z;e0CW-6R}dgZ^CMfO^EV=PA!`vYXO_PlDSE7w-`|j$aGC5ePx^~o{ijW$#IbR)_M!KVw84TQlng-dvM zi7oVHqFVe){IlDyq)tSO3eiIdb#a;X|?9UOvmn-}jyw7mNdhCGmv)`(` z-p#@m>$^4hbPDfHiK|g#U3&Cw*%z)Cn?e((>W*WcUl=>hc_;eRsxhU`*s#yWM6 zazps{{BEwd!2T{_?N;<$KcfDVpOeo0Ey-7dH#-i?lJBFC_u&21^9^}Vn+j_$6i!|y z^f|;M#z*_H)#=aX)%`tW@9#bT_nCfQ`r;?T8U3U4M`ZX|UP)g4MOfV@ocuvp{$7}Z z3-rT#r61i-`aQzMT-c|-*@KgKRM$- zO1>`rc*T5OXT0({>x_O~KTPHO|F8WJs(q#JFy5IzI}XY?S9+iF%_BU2dw%yh;LY#I zzGA$aTq3#P{uk7@PrCO{2e-(s&GVe|d{dsg{k~TN*_n?tsh6>PkkVV+kNq`5r*{=g5zc^;jf){tDM?9gwwYPNADNf53u`j$_V>N_Maapz1Jaqe%820=Y)-2g~_LcUT3e7UV`?+_dd?G|DB%CzpVUqWcvp-kQ2&DJ|nw~=jipG z(eBdw{63$v(&f2y;VF$%WtW~T9GxWe`D59)BoAq?t@BA|p6>rZvg1s)u9RHRu3P6y zZk{2G;I|d+H%2bFuKTaQgS^jwNO{$zlt+JRFs@|qkj~XgAKV};W?c6+;p$Fd2cEFF zUb6S++TW`GHSFO5&5ubQy%YV1g_x%6ZEuNUyf8ubZZj@^rd#cPEApW^++(LT~Q z_`b1U`H*qZ=U|TMUrpL&%JXP5e>omQM*HnkZkO>Zx{&K!ChXFF^5Z18j}31D-zs8P! z(fqCC*+STUK$!d=@ zy;6Gf@4^-O;&$X;3K#I{lKR!TPoMJ}tz_pomX6D@b)rhw$wo z_dEO+`52FfM@zQf?+pI1WIS6OqVyR&tcBb;LVB;mwJ9e6!xNM~JVRJ~4|~S9_C@Hw zFB~y1)XtGSfsfQlpK;%dYq4is&F+w#@P6jl)lZbZPJPmDA*r?jg&?RiQ+Ymq-YNckJ|7w=E5?=QXi?2z}q`i1oQbwaOCcwe2* z(+WpQPiVj1KicMcj{h3aPgaccb=zO5{FUzu9@=4?u1;0D=Y{s(lD!`7?-|E08t$xg zea{Y-L${tz;MtgY8D|8?mX1Ip|FkMi{& z5U$+*?~$C{C3KvC&c7r_*mX!>zzaP8X3S4>#)Xh^Bso_3M?7zzds<_>&uD-4$M=6a zpSxAPLix>W9Us_!`Q4h*8|w+Z&o+H7awMERUpTCzf4Z>!G;l*|QKf zy+G*w#g0!DZz+8X{*t~6`<;Z*p27y>#(?#lwS5OyD?R%O`KH1p{nz_;$MlPe`Km`h zcbw%q{UxR!Pbk;%?{e%j#=-8zy3YJOq2ouikiD*Czmq=WS&Q=9l<)ly9&fx(J7t{h zU9a+MOpB@-c4Lk?sFFU|dVT zB0KXp$1xc1Dt-BJVN5&oIZ`?8c1(M#{2Kca48AUV@5_z$m7JwQ|5u*!JlfPd zp`PYX{ZGl>yg8>I#_)(G&)MHCL(2F09~tSv!CdznAoG#;#rizm^xH}=Y1ckiw;*5h z1f{o61WysxP7~&52^+MdChc)TzaG-=IzN@&>PBJvSHf^69REh>^BB^F7#KN^gEzIQkOu5yBhlNTg7@iiDz{tu!Sov0 z&1gpr@=tj_!AR*tuz9v*$K4-e-??7;73I}_AUR_`@&Cm6$FJbl>={=5m zf6C;w*gp?^sxW-AFn+o)f3~o`p)lE4*n>BZL&+uimQRtqBHv^S$v$V-|6}qOk#7^> za6MrGKlHiVj{ofS*g5>RkAK1df8YdvhB5vM{YR?2jCwd;Q}F`n=jf|-BoA2E9pEqF zb>{AaT>K>Iy>G8RhbK>jK6j-$3qAfFUZ3t(|}yD!pPpFV2!& zoFQx@j~LJT-y@xTE7F^c8{TI;`j+f6${mp3dloG!cc1mWOlp?Ov77~~U$1@qGCWXbjyZ5=OpdaTgv+Een?xR2}-rKgt(CsznP z9($kXjQjWVSzI8y_~*hF<9eHUqjr+?JtO=m<$mJ6(!CB=9VU6iIPZ07`{zyIq4qDZ zKfvmv%2&Kc*nYdvJlb)+9FI7NmEPS-IDE0taU&e})BA|xj?(QPvZDM}8~ygeDc3J( z-}bj$eM#y0zCxetSU*m(*Xa`4oq1-!JXXRtBc9uo=acNO{IgUTG2XBFA@3l4=i|cF zF2c3=6!g2=e?9jG{MdZS|2GS+=l@4z+MDCDH~y>rw3x5#FR?-{-QNDIzYfk({k%?B zTqt?;ed>L+us;#{{DdX_Y0119Fb^m9%dYjHu(uSJe-TE17Y_d+%)k~n{a@+Ff5q-z z;qq?meebzq~%}V8Hw9Qm^?hWY^%n zCye{SZ>6vQSm z20xX4%>A^vp7+mT>iR{0)`k~V2R|%(= z3jH6&{zfBsbk2KS-Y&cL?}dHd`|1|SDect%Q>G6|U(&8q`kmW*fIi_lt%yq-A}^4~ z>*#q7=&$+zsNCviq0d7rxt}@rpPouO{l$J`^Gy1JadmC~{%56MehS=4IC-CN)D-&s zsBlBcj^A%TkJ&S%_qm*%r%Rr%C!7Sr_^HCqvq+DGjuVr5GJGJogb?A6}Z{$5F7p-91~^ ztFsQB{Y-L#U$M_Cn6IyL@}~($+)qXM@dL^?W?x_lKVGo@9G|N6?n%P%o5J{9WcDjY z*GQiIMA-TTGJYIQ_A^f5-4%WwqowS6k5v5%zIz6VA#U^cVlf>wiOb@lnF^K;iIf!t7w7{UnCuUvVA(zx02!<@aPC!zV@)$qU9CuRp}U zlD|r-*N%sDw;&qbqR|%7MB7a0U{h+Y* z38Bxi@j3T%c(2!)$2=$h-^_Ure*Xj7b051F?X7aVK1kQ`c<*y#%Fjq2QjZ~6?IykV z*$MF^#>x2_{h|&A)S8it)$!uEAvu9pbbc$@{Il^_$rU_v`cKKdhlK<74=0?f)MUPmk>~K4oOyZhALWbx4N`9H zFOtg#gbn!E><^MB3*pc_4Zc*7-eO)au$w<9d#^Kl{*S2tg6nqwEW5Sq|3h+!-Hh*q z?k}Y8e@8f_-#2)lj(_C;XB9lF{X^ON|C!%Y$@?4sTyl& zPZqC9h{Hbvy^qCwy1J5bPZzF@UyO71TU#PKo_zOA*^e&~)^89l?nVDNT|eTw&Bw#D z{-pE)_g9sYhj$7mw+X#(uFJS*zuxKXO3!IO1?P07#CMu-o$kM6H-1Riev+^On{RhvNoHB3vd`6$U=k@5;6J@u=&tge@ix7T0 zX5Bf&4|>i%y#~B~0pIueUp^11PrX-$$aX#a>*6a`#)FpP08kw{vXrpqtAqn zua|s9a(aL;1Lt3oTO{twqVO0xI0bm3Rtk2X6@>D3`Z?@uh4j|S9x$#oZuD<$*U z@Y~AQ<~?|waB;Hq_A{|RyZv5j+5I%x4(z{o#B0F#dl<1@Vtw&DIa-ou4Ko7DtT`mo@cth(!JlZqMbTkhW)R- zKgj~ zz4)KP&R>Mt1HuvY>E187_h+Gbz4_t-zSDY0>HP}(e+z4mQGG{T-|Lgb|0><_hl>A5 zUV+WONp9XD%&!%8OQFAW+t*3<{;Cju)2H5bqjm#5tK>Q9spFP(3sdUxQD z73Wihuakb+5vK1G4z>W{p9#;a{cGySI641;Wc$%NUPFWN)c@nXudU?%W8T+4fvMM%1&#`v`xb>*Vm~HqWE!@%aX&_kJT>@|=2{XFGb4?kDDY9nKk8MbbAm5RSQi z+?E_}D;$yD<+)CIpB?z4_sg|tXC3Y@&5mXnsGl( zuJ7;0lK12G*hDU=SHbmC>KoIpE1qkc_R_>Iq<_une^sdauhEVc$aUUN%J~fCy0XjY zj}hf1TqmI)`n~n<(tWRJPa*Hm{+b@2<`>J({v0Xup3gP&eq{Sc#$Tu0FAICS2?O|x z*P&N$livGql5HgC@&DD&Un$w=OwHg|eRx#wSxRqhNd8TQj%QwwzkC(?hS2kq{fDQ| zm%g^K(CeA$mgrw1Y`;|KIF234^Y!A*l-{76g!=kiOk=nK_8=0_fJ!d~*!TR_F>^!7$m+;me>(B}7!im?D@#AQ~lSi5IbyMNw^TOty!gO!s z{e<}u!V-UzC4AcFsaN>Dbn%<6;kPp9zT4~QISc|}`7~kr3}J=rxb};6r4Jt~Y&=F- zf4p$@bYU+N<}Vk9?*M6sYx~7==|`svn->a8=7r&TlI@3A952~%jU6Ah`4#N;681kY z^nM!e6Y;v?>cdL+`Ms;QWczWC-zVAeaFg97x8dQP0{b(CjsxKF-+o}>LUK(0`uimhKOjt5KNx{NAHi{secrUsUud?J&*!@Jx{^cqeL?&3dE|~` zygX8N_W#Y!rX1Swl;=029Sp(nT=Iclr>@by2B#{0NV|)QJ=fQK}DV(3Q0(1CY_nAsBnZGB`l3Yh$!M}Uv5nQLub?XmN zZ}@}d9{NV5^g8zD-^2e%KVe-wgZ~WS{SEv867&P)74>PtD<;_2A69wMgTnrAg^ii8 zx?5N*Nr$hmcwRaDWCkzt_rsWV!EzHlm-+LAG0$hUwd6rl*m#++hCJ9=a&mw$-cPth zKYOL*2G4!S{jIGx^1K7T=X+HD9G*PjzVZj8_jgH~=Q4c(<-bw5Y6<(V5>~X2p5H4t z;QJ+p*ZUj-|L+Ly)AeSYE6{j_$}71}^g_vV+S|m}d#m*0?S2_;Y~>r!KB`Ak&OeoZjbHNo*8FR@pE~!upnWuWA1%tAaX(Y8 z*W&rjsK=1{y1hoo3D0RnyD2DdQdj-@lvB7}@jcP!`(#Ofjo{TG?R7zWE&1N5&vlD z^^((flMk%J|D7Ijy@Gm`o5((Tmauw`(C0Hw;m=h~`T*XW+HVA&>$u8I_UAbcUiUWf zR{I;*@Q+@BGxqTX!~tor&K9K)Y`pOsvFTG-r0INM#=`LeLa zy7h!|S{F&5;qQ@gKaS%O!s~q=&him@4ueMtoA}2xS!XxzF7aRK;}uo{ev?sPs1c#^>ET4(RNI zN*~j%m#>qY(=HpdBgflcy-DdlZ@Jn@@|wTsk&+#EXl=h8{V?J_YSceJM)s?NgiH9X z;}$y}zj=Sk{j9zsd+!f-d?xQBZ|E1%eH}ZO|<4Ux4SGwb*IG$K|82L{XhGz(y zybteN%D69|4`aW?2KU$chVq%mRq$uW;j(|qg8DixgyUg!->du``uFI~lKUQ)_zp8a zp23$FJIc=SPkj!(pGT1?JpucCm(;*)Px4bvoAEFEfb>(|yT8M{?mPXe(#L!+Mt|2G8Zs(i-@_kIJ%?MmU}G3~$cmYqz;XPglUs8`He4|ahNAQg{^^M`VJ$T=O`i;OA z`X1%Cx!)1%#M9^NIYm6Tl{z3f7G>FBkRo2)B`ACf%!B;_3}Y@9CaoF;4^ zCrow~hHnvOZxjwGH(=d(u(|Xt_*DfjYj8g^)-xOb^_&I`<(t1#Sh5Zty+?8a&mV0m zIi$UGx$hRd(CfPk-eX2PY{TOwd^ZfZPV*%yZ^`pryqfagCQNyb5$|_GJDJd)+VJTf z?Ky~)Zvgh;uS4EboBA%?p5fOnC!pO;X%Ah#qmuto`y4$Wbi1`b@sRtUZLI6}V`0U2 zQ_t(^+-J%A=}_-F?a6jM^7nb413zcqANGCUm+$w*x^DR*;fnh#dH(^=tN)*{$F>m=i+n}lR&KrcYw+hGa6xvV3euX|?s|_Fad7?f?zV<5R>w#0spEGZ+-lKHK z#R=j4PM>X~^cws*-;DA$LJxMIC%L(aFkfF-K0-K$N4MdH8T@w)?`_^CUfO^kS2s$| zuZFK)BJ5p?j9+yZ{_XvcJ=U`uSIMrjzwCD-9DhYv`>HUs-^cOj zhr%ZHNZ`@KTc!8?1oui#xZi;F^alD7`xkvKc;{ELpW=Vrx>@psb?!RfAJN~r&g1o5 zyU*qM@_qw&QvWmP_Yp?$xcX6&C!pg}B!^=MZwY9>3GH<)4*jmOt5be+XURU_A#6z= z@tu}zPWtnO!!3}v7B1n}1KMK>uX22d<$ki8z^Cm8Y(D9F&%Pu(pG#4FLbBukrk|9Y z(I1!8zm`a!?;-U0EA>>e|1&wh*#f@jIBXTqBZVh+;Mvtd%I|%N9r)4e9O*mX77o87 zOwSkAE)*`$6Z*TMI8$=tRN)vt-7X~0j}W%@6*@k!XBrF(@ zh8@X{hhOr2Q1Ct+pQL}H?3&c43wmFZ&;LpHlHHu=Klzwse>c_Ku4s3)jBFD!|CFi`4nD@}2yxi9#J-t%)$#ufP zM3_ z?GHS}e)b>bpHrUK<)+koNWJYpTX;PVJ`uoIJMf1AJkS0DGuH89(CdOB_q%|v)ZsnF zt8`z3Hwc&S5YD#~*5P@xcS}xs!qLZs=DV}^BkwL8ennUuDy+^zzDn4*Qkb7FjE@&a z`wC}Y6sDBd+(B}^EzGtRMz0aZFBh7>R>f3_vH@M#h<+gb)4S4tP zh0346*8PT~FY zEmTkQQLpEBY2QuSUGJZ2hv}b%{x30yU;4W%#E)VGzYS=2zR!sJ>!B~XzQ4chx3b`U zR6O6frF!PPpMjsRzguYU1sKzAmt3dIbu)N%gYU;VJU<1!kF$D|u4n%f`{&y)E27`} ze^A~1{c*}y@O|X}Gi}C+oPOP2=sB*Y!aCz+!8qGJS$dxvntxexaDcG!1)<|QwctH# z`_kJ=cYMc?`KAUX{j^8Z|wih;$tG7!Yz8O3Cxcv?X%#(fRr(E+duaDPXsr=m+ z3hVHo44zy*Px|ZyLZ1U#Z7kXT3$;f}uKh>+FD9OIpLN)Pb=DLfJ@~2Y0@jgJ{4u)3 zsV+DNCOJ=b1Ndy?a>)hx!tY8R;)l^V4tscXcVEfL{zCKR<}s3klY~R|A4c%!9@kx5 zrt~>}(xv^R;lmx)&6n`}6n%~FgYtUix8KQ-`ZpTSOXp9@@f{XZ@{pAXideJAvzHvP-zD(BSS z{ssllDW{yyCsp1IzTATE`CRGM&PuQG+#GMAxxe&fU)VWO7{T`fcu{YR{z_pB{rED; zj_+54_qDz!z5UFVr%PU)0_MW$zQSx*;qv{$(VK*IzOzQJkUV>hFl2o2_j;4@z|UpQ z^KWr~jx*dpR{4j=38NE`tv_6{*OPs|W=uQt_lM)e&i9nPznca}Ngkal49^q}K>IV> zpTplH8NAc+5xwq_{*v-<5Y~PqOnA;-x3+(C|0Jc?PXpoSA-p;yUv#z7hm_}X&CeaD z&~d#7*T_D_KEGbF&ksv}Avye&umA_QVE0?$3e0|u{x0G8UZMA?_5Lln$-HPkhURns zFMk*^|8`h6TftAe@RX2wH}?A4I?R_VuE)IUeTCEi_kZW%v?h7x`IY?kf2d*Kz;0rM zf0-}a@3VyW`aXv6g96^Qf^W3oBMJH%yds2OjlePds*is}22al3qI#Fx3p-umA`uSu z5T;=9Rmt6>h2asxa(|(Da_c0?jWdPI3xu>!(3Q(gk6k2f2ZuyHwu?L_XW>2r9Ca+ zz0pf#7lU2e;S}CC-%9Cq|_aA=&Y-R>w%Tzvpr<$vx(i*(W8p z;0@gmN}j@7;`d0Nyh}LTUO2$cevG4!O7C+-qwOT;@ahV1;%=#cM^@p^iGe(ovn zsqs4Lo4ofad@|)dm%Qf~dFl4SdvC*s{hxpFMwPePR@kPz0qt@@y9!^e^ymdbpBvQP zK=Kl_-_LL}=^YO(ex>Au>qV}&+d1vqeAw}WYj04#HrH>!7ble0gExBrK%M6^ZYiJp zN%&sL71yhAy|wenKBn~UC%7IwdigcU-sfij+Wz^{kAEoiIjPMXBoBWgY{93RS4-|( zDs+79@?yz8k8RF+rq|=+gO#3sURYxsv0qILkM?`?_w|JPw_V70_3A?^r+|+;UWMc3 zRbN;7@DO4D0AaZ=deCuj9bdQ2^U6OfJAc;=UGJ}u|3L5vVeNQf3{P)>-j5lwuJ3(x z<11zFb9$1gE|}Nm@Qsl9 zK4l&c%wwLTdCvZq6+Cvvyc#o~dYw7=kFGakzHP%V#_)=q{A+$4@R2_AcuxHspRA9( zWZkL>e=guhA@hA7K2}iw3A~{TKg!@SbNEOK#^^Kn$l?vU-@&#Z>#IZf;_!pgM>`3p ziLkj3dU)~jAjyjp(4Qroo+He`!3ev{h4FR5a4KBgDs28vIJ{HXzD-!WMVS3uSd4`W z%59t`d2qC_c_8wag~eXN@$SO;F2bNEOg}D+b`Vav{~YXpMEV}z5fl7R(sxO}d^7ps zt#f!@;rH@-%H_Le`2y@&k1fD*W9hwbwW8f-@G`fHRv^3PlZ6xPQogV3f8OCb@yoF1 z{d--z1OK1CRq0tvIK|F>82-)-sh`)w`_#MrCgtl=PEP(d{5WvE;Qs^Kb3%J|{rj|c z*MIy9mD{JiM#x_GAMspc(%Yol&t|!S^7nX7=C=c` z7kBB;_KTX+Z%3prcu)D0c&>~KNu}|l^Lt^*yx1uv`}`R1%XfU)>~N(!ZfN#Z$#vFY z%1=lxn8!=cYw#TN6|XZjcapu&m318TA^O>emF{)A2K=c7UkcvL^_frC_%-|`hc`7} zDm$MaQ+t+V?~|)PNpkb?!U?kDSv!tw^+Kih;Mo(_rANfKNLY9EdE5(l@bYWol>_{l z!@VUh4-}4BKaTNRUa*ebgg^IKZyxR?`}!AziTyWn$-!yD9_!dCe715tKG5g2*uSI; z-yN~h@@aUkFJQ@ol*01f?F@;Bu_zqb-R?l_*bYUkF zF5uPP&+2$EG3i4v+d}q@Erq>UINe(4xYQGPYR31K;|4pPqy6W5n=9XfcCz4o`+Ug> zdVhyy*ay_N^K#{Ha-9HPy@W4M;m6$<%Wh1&D!7lF`|50@^x6hO@7L|Z^B0uk_1f}n zva7ZedR^afjVC)uKkNzTdkg)YJo~QXB|OS;O(*ax$M5$!ZI1I4V;{h?8esSXl^0$i zY@9Fj`l$CgFTWst@G)VRabv=`;qwFQ$N^}7GTTSoUvF2g$Ni1q#T{_X-y)Np(;Y|8 z@j$1n7ZhKVozF2b`n$dgxMy-(es3}Na*=}!8|)(NBR~# z+4JZ0ao988PXDdzJC4JO^c>8{Uwb6wF`owJMXYP}SKP;=D4*-Mv9H1VyBkrCc?|1p zGx%C#{3LfeUIem_rme5!rJx1)g{6%{5^!vSBFYJ z-$&R;g)Q!9u{-+D2ovsm@iECEe7T97^F3kzl;r)gTkt$X_*@^}ytaM{zh1&C6V^}d ze=ylp<(OBl#kJ%6uM6LdXvdCY(twvHwC8|z-Ny5|ANX^d@2EO_dHHswM{Qy70ioB| zJMWS_hfjB3DY;EMTYyu(7mBwkz4snr?Y+W~`yRhYvi*jtry;{DEBZly`Qw#d zV|?kui|h1b?=xLep8qRlARm4PInWoou9xwSTZkqpJNT4kiACs_KTdpNpj;Y!WpvT z=2g#^e(((N$--zI@L_l&a^tzudmU`mk{rO(f>84O{|TG;Nl)=}DB!V${V?#q81A9# z1n}t^{CWakj?BARS58@HUYdV@R{7iD_)C(<@aP`v*wJ^S@3)LbH)$?WLMI@X5`N)-{mGxq1-13qsI$d>wy~z?XOgEU-omz zwpIG@UBWv3XugZ&3B0e9OHR)aPA?E9mkG-&g~Q8*_S3N6YaQO#{ISx*p9y`=`2_w~ zUL<|Ybw=>Z-dChwFm99|m7Mb*Yxo|?BgT!K`&lA8E=P~=0>?)j@1uO?&A#6NULCQ1 z944|W_Yg*35{~yJzxgrt-j|s(K6$*0DaYsMjxyz6eGTjjn}-S0BZS#8Lhn0Voh`XM zPdK~~JXbhj{B?ZoobpDLAAD7I9b})oU2+}A3-`G_-tU);l`p$RIJ;ZuIJ;Bki||3| zSN93Sdxgm#g|)kcW9F6G?UF0x`tK#T?h&r;7n+CKFCzN4^h4&chG706y5-06X}j{iyxlVafX+^8QQE{_ghESiDN*F4!8cE$R_iNCke z`@hosAF7|@MLIrZ^*8BTV8M7;{!aSNuY`ji3O(PonD6?9^o}b!JxcPJaoYQVYRrfI zy|CX+=y<7)2bRO1Q+Rfl`KZ`a_9N!2;in}}v0H8@dGd0h&-sX6DtZ1AVFMh!Nb+h^ zVaq(o{NypxH~&|>t&iVxhF!a<^fvQ#@dnAWSeS1loKsGAr^>1DkLbcvlW$6&9W7iQ zDlE;950@MtC9L4nW9)|eVE;Mc^3%c=@i`xXpC?`5m@(O*Ea(e^mN34HG@a#Igy>_Y6eJ=a>XOfefg!xn${Zv?j3(})or4R4} zDgP+h=hD<3Apf6*KF@OS2)&n8AguGA`Y({&da*F4ojC4`&ySf$N?*cryX23aBfaCd zjA4WwW5ntL>-!%dZO^A2|G`w1i+R}((k+eLP>p0LgLcD%FXDdU6VicG&KeFOfy0DJJ^A$&Mye9AsY zxm>Rgk1nta4rdn}|Nf)oCcNA0+CBLA%5ZQ=fm~? zCAqPV=E;=#+xrMRPmq2L`g{!Y@PPT$aS8JEWN*Jw$Ehpe%OT~A)|Fk&>tUYHStoP6 zi`5HdH`_|sh93m*nlXGQeTCA~hOmi#0G|opE`1Dta$Jnwj?yQ)2v=VaE;3>BFkuRR zE{>NxI}y9ngwff;(Rsq=l|uV9hrg7Z-YV?gDGcrrP98vB3UkYUl)Rh^E6NFeB)NN$ zusB^fJXW}Z_j~<3*iZT#UftglyWNC?U4`Ax3EMn}Vh_pr&fvR*9r$O&a}8f2ea8Bz zt-&7==_&gRWS`jz8zEckvd;l(SSzx}#~ zPgglJ`2P}~y;x8B_Tz<)x1QgxdZvtX4aU9RZPI7I5q57yhCc@r$&QC#XM9Z=|I0(j z$2!M~dB*ECUDCZiQXu=krsHgNn5Qb{$Ifml*ZbeIy(JgB3+p=~za1Ig)7e~d4NN2K zK*v=WK2Lg|lbEhAdAW`-VEuXcD9K~ez2C6)TI^mgTr`B)X2Ranh0}kD$ECj!Ht{Q- zUxtkTL&&=A0v_9dpN8=3@nN!$z9#J3e`7bvwa*CKV2oeK9Qy&~m`C>u*;lNGH}Dgg z!Iz6~D}BVea|z#{V%LU8=j88F{tW+xG zjQT{#G5#U-AILtyFQhw@JcVaRbIA!jd&YNB@HoAn0q@D@(uZ3}U%f~;Hm}}Na_M$O z`&rbbPc{<98w<^2SI?4M!KVY{8EAiu>}j%_K1DcxvTz39Up_(dl6p5ED>+_0uI(55x$GNb@H}A&@AJMp$0wW}q4eeG8t!81$4MVAmww`v_+|*S_B$a(b@vk1i4>mkZbY*nccJzfst|ML1@D zsBVy4|D`Zx{#g80a`<1oI%3|8?o)aV9$mnT1Lmm?eA?$q*w1iwkMcF{7FOi%J|sE$ zn{f6IVVC(h2OUSFc!cIhpGR0cNpchP`gHIp=?m7?YRszvc6E4p{%>8+JRxMAD`x)A z;ZaR^mDky#=c;_iPaDIp;w_|~!yCLV-GFzs;L$aBb;vs9;&sYbzEx~t?KeK}NN#*o zm^Ouu|Ivn*w%;Os#&?YUIzsqqLB0rFfCKV%+R8sSPv-qh_L6?Ew=klf8Q()=_;m@7 z?t>xajki<2^4-EF*rVPP_^`jnqOE1Oe5r6oJL`Zm+S?euoNpz&kbF5fdV%!zXR)7( zzeB6PtDj8izwNsuukq^jmEZdd{aoF?9Y@jUz5O`*rhSl@~KU`CR%CzC5~F>C34wVqRPROtSyOj?S0t_2uW>`a<+zXEVtyt{|HJ+<+(d_Eh>b6-N6A6ZmuMP|3kj!q&0E6#nad zj3Iot2VbtSjvOGDtTQ)RcOKwZGPA$Q5h}M2#*{y1UAhh*AH#w!ndNEC!~XUoHt?)`+z z!zc%I{Ob{R%VU-9_{KheFaM786L@j^1j!lWNC4o`I0MzG4FN6dn@6| z9o}aP9Nr=OKJ(-J50dkR(C1&Y=ICz|&Tbc)Z}-s`@bCt_*?tq{pJkujC-i^Rc_q32 zCy;q`0S~rchR+}D!G}AnSIvqfjE#QOZi?#pa(W7Hk ze)m-2{0#6s@G4&3>MO!oPuSi`*x5xG!&ke0p786=`;}g7 zCv5WF(qi2<;kjo#_u9v0*M}zundIOYVSJjf8VD!Uzk7(}Fcr=zr%w4^FK$x5uGf#> zCHorn55PY91@#@ineto05pwog$@ZI`!>0!?k-ma&JHFm(Q|W^Zg;U!1>RFN<=X}QZ ztoQp3=_i9{$}VI*yW;u->eYX}(rYghW}6AU4jnyK^7yan|Lvu4@-JcZIHmhPk>hiO zHR(Mb1bi2F|EYXS#-9cASmt@{W~DEt!gK<9K4iT1_+Bv&q`B<6@Y@I+f(_=O`Zr|f zeKJ$#n-$~z1RmWzLv|taVRg1-$M?4%V2g5n?u+AkbhnXx`{aC6Fuh2cwuCHd_K;&sgIu}bg$OT27V3FC)^i-pkV7N+v6bLk`EZ}bm9hF5pN34FN;F0pH~Ke5kwERF+`Qf?PsU3&eP^l(TbmR;<-9-ANF6`5u zYRHofq<1`z=5r*c&k~M8;ToT(9e3f;ttTsexW3T5+xrx9WQ!q(O38JF5zZ+3^Vy z=P=ITpB?hm7{APq`|#k1>om`!obPcx`1XKu3V3Xv@vjYkt{5lh7bst!`&;mwM?AL} zdCB{zbG?%L_WEsL}JLCS^jPG6Q-MvWZBY1Q^kv#vUa01V@AIE4e{qXm~ z;$ET83C{m2Ie`C8?~&~P6m90GCA_%}Pakl-4&~4OMEUm#?Ke_TUQBxR7q0ie!qLOR zwe$a;pm}rfB;km4tbBdRKCh#|t_>#4!#;Pdx328X&+X^o_2&lV_TkaqU)F&y7w`=8 z>CPr9Zw?=6Z!S4veXqNf?Fnuj8If4v>CMeI}<;-nqgV^`F3_$MF3Y<@6}O`AOMlUE%nH!U;UN zfZvZlEPZbWVZi;_|6`7Q`~jsm-zzNMDQxk5kiT7W$@f_semjL%4{4`8fB(_G-5&;z zRQ~RxgoDRX{!@kK-(A}C@Ga7NUuXZ#l6{V48cX*1D~_u@;5&N6I8?uz{{Mh*`cI+b z@+9zX`*Stm^FFW1eq)Y*6fke4jK2lrqT_omnWtu@uH$tQ&kH5OObEaqhBLDm|)W2frA@N2c(I`0Yyf zxi3@r@Zz=7J06(hpJi{8z6Sp&o03ELdhfZCm)}OoA zNv^~9CKpKVur8aj?%Rc*F7Rg#;K2cWdIdjjfFb-jg=aQF?@w%E=X^ut6uvzq{|sD! zzHXiM<_x}Ve!PMw*U%^M@;>~yM>*rK@*KV_?0!mEc7(;dNk@)9DLLI;I3!;}xt&7# z=yYMsa~xbFxxl|;fnUeu4(andh3VbG;6dU1Kf=)y^j`fRqOpPG-iAW^H}`30j&qkh zTj^bRv3c!`@4F$`!_M&(bL8pMmEV3vKG&zVzVx%FP`>TBes>e;$6E@guM#e3_rs4! z9(|hh&kOte2)+Ne!S``-g7o<}g)4YrNk4Yn;w8K=IG=JZ6t>}W_Wv5f!v^r->{{8C z@ITAu%`4Ko^#ABa+0TB-b-)6>d3cKbl5s5o+dopim~qDE`L)lJ-sfA#Crh3)p84GJ z|IgLA$H6nz|6dn2q@^%P3`$F?t;AN!kQnzNmlZMyzbV@Lm@}@!_$I||y^$sJl3c6!i2XNkjIS-YzBbRD%kzf)Us(NI+m|4>|r~X&o=% z_*4GhtyWju@@Y0tSN3Mbm&_-NLQ0i*giz(t0?Y5Teq$E7R6`K=I5K@L&A5m z{|&^H{M`5h(!~eG(T5>Xi38~WRoZ-ai|wXQDL#2zEFTs}cZt)R z#NY?SzbS@%o-zK}Jx%c<5u4-0)*<5jSTQ;eUMMDCgy)Dc`&pbSJtS`9O5Cq1UR@;? z-xt##iT+qjM&cOXTzy5l&G{Cem0oaOIsQF6O!4plal-c;;)jzx74PA*$9(_(L5g>H zKJd`PeH1tU9rdLPXnE|;&WfizuO;|syDy{lRNmwFG2!=R&!hG~kIj>lucZ2pE86_e zO;5VLnK=HK*qG1mNZU9LTQ@RV&_2*!OrMa>tli@II_CG^TSfcna~|burEUGwAwJwE zFEse2_GkWd$$V3^r)_KJVM@Dg`Hhf%GrLCn>0T*T{D0|wS-KdC9_6;)md#gc`Hk_f zRIkJ59nxNo9%1`iD5rn7b$+9dC~khXTvIyUSWNd4XNM8r9lg0Y+)1nt7VZ6`@e$Gv zac2){dmk%bM><_z?2&h#JS+b-e^j*fNlN^3b(`WTzIi;6_J1JSIxACrVS#VX@yk>E za7;$w90MCpj}9X8IRL*BQ0s>*wmdnd3x<3xsNm*eO7;R${?RJdvD#alY=VBL7;YrCwiAPW#QZQZip3P)-y)CgUZwc(`(iZ}2lt7y zUyCuEJuDskUd;X|CKYkM&%x6Aep`IclQ&2Q_}D4WYc@`~y`0J|k3DEhH`HG;uLgeH z^3dZ|RWG;wv0eL3ibro2OZ@Wut_)}SSI%gEY+UsW|LYd2 zSK{N$Pvs@s!{9OLhX2=c+LaV`A5?j2`@3CwPCMt~uM^H=M!RG4kfc9U{ob`=#pesS zKCO}Bqnkzhf6wLk9{#?-uiE-Evzt^u;e5Kkln(g(Q_iOYQ=TuPJ5+B>y)oPQgcIdZCBjpwS zYe_zM3Vr&s03EzW`=9?)$Ll}KdC)J0f0wp(lI?t(m#N2jO*vktt^L{juA>#CQ~J|j zEotxVV)8c8Uq@`{@26`>M=)Dcy2JLy1?9FbqW2cn8{xCfe}`;e;}3f8R=t|MTOZ$S z?}gd=+BrU>@Kt|7{&|3ZiVsvgI+*<(31cxoQJkMDj?Wgo3q+fzqq$l-!4D4bt1%Gh*cyGVSTXl^iXkp2=(yY!+oVQ{PURmCD>2#oOrpX z^b9|3njYsxhr*fMw($+^AIErV`d$Y9nR`$p5Z@!*%XIMDo_P)1!0sA>i^gk~)Xd6#xc`Tc+zw?Od6;Fu0-->hk16wz1c)sGv zp5kI7vAcoTd_)``Aet}eogqCqNGx|1y#qyiPd`3gdUgusCyMRE#Xf#y`gZARdCKuy zW5x$m~a)v*)dE*j$ukKs&YZLsRgKv(`RXoC<+Ixe8LlvLyE4qC#-dQYQ{0V7q zH!;PB`jNEx(KdPADZaLIxXQ-|h~@t1L&O+AJ;T2@`053^z=sF;<_ISEbeH2y@Xw>I zwBP2VVh3IAF71$?Zg>tTInEIO-Y^cu#&3_lqwN+y5nDX36n9CN_ljvj`6I9t2TzLy z-(wFyJ$qU4pbWPiMO){v#y8r$c6~_F@;m7{?NN(%sG;5UjFiu5KL-zKyW#z!<-1+{>jK|ivVHq0 z)$8&+FvbseeysTHMzMv@Z}U0ZoNvVEoZ097lj=K9i}t>_jXU=_&-Q)PyGyL@6vuaq zA;;_CqwRWyOQ~PV=~p`cQhi&G%leraKHK_7TQ4l3|8wz=0sZO(Up!h``*&X@+W)LG ze0TYhj#qFVt+whVD~e;ztNm|2$Nxl|kE-T>+1Be--_}h|(Vpd@hi#r-r=xiE z4$;;>nbMDs$rIap!v+4@Ut9HS`u+b~-(&kJKA^^@haAt=wX^k9BJzCUN3`F;R$^~E zjv?(Ysqr?iYhc#Qe8n z`H&d?T6BIR_Bp=+emQ45=NXl^{v>wUzP?L3or(25;+W&64@kTC`-J^YZ&BR&t{8J2 zdtZ{Cv;#K(#r$=OH_MCme&2-c zhWO+duRC8DSp=5Mdjs| z?B~PcjQs7OC+%-4j>+c^_8=aLQ^rTs0Z@aJM1J;T>0 ze^h+(dvQklHn>%KaR+gHxJUl9{TIcf--(vji1FouXYAkR)mU&IZT4&XvG)OcFK|9wPs=lxTsK>%WK6$R(*Kw*F6sAd9SL_$^^1eG zL=T@iAs)~_+C0v-UV+WSYV)!>uhsUQmBjwaVu~NO_m;Z!$0Pb$pd0M(hJbaPuInUNJ z><7Q^-YY$wh#A){$)%mE#5wW!+tThe;sEVY&%adh4t{(7W$EloYzKSiNqeV??O3#N z;Lb79wq9j*sC2@8Q*ob^`0bMV8TX0JOPy`4?OI!jl_w59AjbSY=KTI+e6aT>>c393 zc{J?*t(f1tJwLbJqIx!8pv|Y#U5a?EcFTK_c9Xoxg7!J0-CeR?D(zea$N1(9cAwRL znn%U?Lt+LU+R^+m#S=T8`B1w0j@V4Z#ZsRe>@RKk;1b_FJwkDtUv+ksbV%-*ZF`ZhmokMr-Is`~Y@ zY}XgVp4eVZ9R626%ELdme=R-7Kli^WJ!HH=2Y+nii~HnhXS^5JW!y$_mbS}I5)=Gw zxR}6X*ClV<<2+LQaT{OUI+^`a z9uqeoZN7QTe*2$M{S=)>(h2$X$nw-YH}u(mm+Lk@U-f&8w>JMgyi#$W>uvLXWcX>9 z{Pgg8)ysb-dOsJt`0C<*=`nsfd0aYuO7x!*qvyryAL8g`G5wF&G~(d3x=(E0xeorh z!52>)l`mEjGidAlwAZAZ{By~D*StmXbZs$MU##)bwl0jbrQ+T$)Z0s(?;}?G5+^U6 z9W6acM4R7zbUyX)(GI_-IX>CRRqmmSOQlEDxAn8_{bQSN&gO||vHkSh9Cs{6H;Un1 zqP15Z?UehB;+Fp`$ZOdAs~+w148LUWbpGFtf8 z0nhy*K6--AIj=GMkN=_Lbnwa9qteZTV*7E?-jj3ip|;+@oPMDFoa)*7BOZP^DHZpg z5Es^Nvt8XNZsQJHe12QE+I@|#hs_6-zO4E-zjE+j>HL49y_Yw7mA12W6Q+F50mrrc z_4xIwH{<*9VS@jy9hJA~SA(}p+q@OFUPH)v`}C*n9r z-q&lrOXd0dM0Z2#zgrxUAD-Z+^Ys+3*siAD0y^(ex%Xbt<_m6pRJzzgw0RxU?WN~C zi#G2=iZ5>U75DcPM|+E{eMOgiavz^F$LH9*b=8rommDj`_~6NL(mj08;3(-1%#M~G zP_H^cx;jM+&Jw5ivo?ON7%SepL7eGapq`ESJblcM?2!Hd$#%VPE) zF?zLpaQQlM_{pO)O3l2iy-4_rVa_eA>3|qunnV_1oMB?ui@+zdhoP`54TRf#boBm7fRreLKjUO&6>F{r& z17mz|P5W)*rY+Agpk0k=cWc_)8SGPDkoUI#FVne>WAE7yZB_1Z3{{~ew#?UN^)eo8vU&$bRln}5Gr+Qyey{~P^CaeLos z_I>FN{dLUoY+abeSt{@1CuX0Nw)LLfb);Lb6U!Inmx9N{5&6y`{>|1Ebnt!lzMY4* zd~_clUE-@3jEivalP-R9%J_}RR`|3{#1?)!CNDiDUU(`Gw-%>6iDP`U%eajce;eXs zhva|TXR3ZTWj|+#bK)?S;)Z9Ft!)f4ZQZwf1z3pR)hc7qrhsTkUQ^JDcGT zE85$b_BMqfwDmJ;{H?9$QQ;#awh!=;mM^t+?1H6r+$H_MtEI=Z-$VWV`nWb< zM4Nu1wTia0|3e4#BhH%?cPO{_*uu3HPdj4v4sndnw0YF#Ybf5lS!|i_#P8bkM~)AT zxt=a8@x3F9` zbxP=`8+>gH?fh(B-1&Ce{|p~nenQ&Tx3Kr6vdyUnlaEQej)lbCa7Rv7w!~4a~!{XvmG5UkpeNJrGqW?cJ zU0Qy%!neAs;D6sLPS+K??-s-NiR1T+5xRb_^a#D6{-C3Hm;JcwNEfS$8NN7c6Mu_X zQZIdn^k_Y?|2DBp{rUxcj-1cy|57^oxj4T=?A#|d_fUSj7*9nPpKbZ+#bt_@UlnZ} z^@8tb!1vtYdri4N9CRN}@Way+w4Wi*TOIuIg8QjXRbHPbX53$`*2T?k%f&tyha< z+G)#2_wl`LxS%~=(k|nV2jnpde0YxUcK)n>Yec@fqQ1>v-(!FFKD5n?XYaw=c*XXO z^nY+Zm7bHQnc<%+@=E5bXCu|Kbyp@wu-$%Q1)D>qZGGOv@?jir$@$RV_Bd|+3vHKk zKC>UQpRw5c4&_7iNn&e%ap;TV^+aby_+R-b|7kI}TWm3Yz}CI)enauuH^t^#V)=E^ z#}B&r>H&Uwc81FBeL$b_6hnNegP$Jks(N#DV|oY06F9>^&vqfckLZ0y^cg?V;Dbl! zDsJPByI(+)C%5yPCW?pTjc4qqJXrCR^PS_9Lws|{`IekdxTosdJRJ7^VZ`%<$91W= zPQ#0+f3cXMCts0nG0tOjmGqqFn)&yn2RDgB{BwqXp5LcIH|HnUPb|1W2 z_eFadaj?9YaKH5M$2O107$2PCiwAE~{pc;C&8OFTn{-3{@mkW;j##cQ4)D?Ohol!< zh%@fr0w3MqL-A@)G1yB?`JMIccgAyM^;wlqJ}2h*;v79VS@9P2>SLsX&xo@_#OiP{ zr#xo6`W(gmOGTU4($+(@b*AU{t2|wZwl2nu_S5D!@;YiKb9_`myFJ=e@oEDxrk(9C zCEa~V`;A`|UE2?X2Na)gCU)_6){ohIRAEo$HjZFMzNmOV+wnPV z{>wt)ing9woATCs6}R!o4%fX)-fDs` z_Bh{U6V(qsD)v4mMq7)v9`cxeJ>FaK&c33}_h$2wm4_>y;a{DBbWFT+h;;uT(fhPG z-%l*j*}>8i_G9_q;%LRwBgH9th<`~wuXu(Z>Ypc_e^HDx_+_z0KC*R{bogy?at-C* z64NWi{A-jC#U6gF^%dz3jPc8D>YH!wU8{NlzS+G^+QuvN=hDuTV)%^M|GQ{;TIW^r zooP#S@vW9G9=%!dU~MsckJxM~PPY}^9mO`Rc91S$2&3&4@4`Op`PBa~W=Dvw21uyZ_G8_ICd{+;f8d z+PFV^-`Vog9(jxr{mkSq>JR$Qiv|AM#{Z3ox5=X5AAEmf+D%)RxChuKMq-{KP>mg}>F50~R z#e>q-Oe}8|E&n~aP1@GAt;nCHhbi9LMRY$PTHbK_Dzx?|GgP*l=&X(u4 z`Q{>gs*TeQ@uhjD{kG2&3;eZnwsh}w(Z(yf9zAj_T#)b?v>h7VYDZ_Oqm&v~{dnw9gIOg_a+2w7>CNM3?hwZ74ncxR~uE z2D^#gE^s?Yz2WB4F3$y1d~OdvX?fQLKHJ9I4z|#C(TBtuUtYdT+U8r0*suNnI^=wE z{N|Ybgx0UErR{yLqwh=GJX?|ZPx{gBwkn_Edqet9o9DR8b56kLEYT(YIAps3PVn2k zZM5G}!0|cnK0dyOkL?_z@+#&$ju&nI-t=?QHlJ7zznb7D^NUsP;VVnZr=M3mX8Y_^ zX`3g`^1_Mv9kxp^RJ}R-ciF#xx#HdbrdLVV-ylwT@k5Fe~|Vnv8>UJI48e6V?0Di-gdIG ze5lX3i#g*k0{m;Xl|Nmbe?V;orJLDpN4=SJ)f1x+h`zNCv{NbVoUM~M+F13bFxW`CU^|;%&(<%p`RisY zsGf~$TP!6V{YU*wK>Kd%qT2j+1?64Fwb^?iw*F%JCXTJOG zA(jtQ@Av2j#5w)7cdoSgf`UAqhYtxmY`=myW*ltuC;6)2H)6%OT9>?Zc$?xLzIuXh z^M0y$WBO+4`On4i?cxaSlP{g#O1+9o4ob-Gb%6k6+8Ihcx&mFFOKoebH<~jn=2k~DLVM=I+Au{ zaekWE;{0tL!^zhbpOW9N$omhjQoPM`%KW?R2l`{_gzG<>NsoCRil34m{ax(;Pi$KH z{-YJe>8j%7En-Z**k4n+V;Z*c&Hg)7UT|NTPxja@!AHmFDSq14$&B8m?fc}P%dT{@ zkr;0xMw^P&X5xhWbg`9mu)Ub=D!O}%HGX=$uk>_3%JIcHKDm2{;-g3m;FS2B=i&z6 zU7n_T{V$64eqs4_>BY5TeS5KQG#Q)$>|9YOCD|$Y*#PNPFvu#hb-sWzmIm z+Bq8^kabnw^F*6x*WXEcw!JvPFWP)g-lmG%dbktX^FE9>RCxw_*6!19SpSiHNcC*K zU(46n{0q^JDmTBHZz*l(p{4ON!z-`KKpNT+#Y__{$I86#J0{s-q-fQUgCiM zZ?wO(&6n2Sm*eawhV+|b7$2(mkn^ecke=b&WBSSLor+KS9&8>rhx6=iqw>x!;sBqV z93Y(?BHH^=?q{X*Geldjt~_75hQqH&&vUW4RCh{gBB6rY*nf7@3m zo?R){S5faH=Pp#e^l;0y(g=q6qxQ|LF#z&;> z{kh=h(zA(J%sL%cu_-31zZeFY0K0coGSu(PFfwUap9OY9sZx<`olkzxX!qol`2i<9HT*$Kpt7h7yU!+$sXC|>R< zy7={ISLrAa=j5Sd^3xN>dstq*^NOxR=OwZCvN+}XlrKp4|0d>t61%?_y~l{7<6jf! zdua2$Ik!>oCt`>D(#F}0cutyeUuV$fRf+iDBKeNCw|PTs-alugc+Bs^)>n_tReYR^ zCG4Cn9r3$MPLysRAqEGC3)+=Dpd3Fv$46V9!2Y+(KCF5T?d^06X4y zzgzXX9kJ(%Gx~uVKbyWvap%A4SA1ym2DO$^dA6L`UPm0PE82YS6MTG1``@O$AHHAp zy!VLi2BN)xkvh^%qvNOMXXyvK^o#LGoEL%$jQjQ;R`vB3uqo{&zS5j*_fI{2q_ zw-N{Rvo5sxLj8ZU-QUDMd9CCxF@!~fSUe8XS|#k~)S&brX@i?5T;7!Mm(@>$-K z_^k)U9A91hO4{Zr?iJGQN5m21ZrkLyr|1H97pmtzDh}@vdv}T+?BK^;{B?tmEXl`u zaQ;ng7hEak_|foc>4})EwHz)3i32foF zGkmmjfXd5b#KoDSM}9u!{9?{`hHsvYRB!ry(dHMl>oL7vafjy-8^%4< zxex6)^Y^M=ihmC9&pG}%`KZdxR~tj(4bO@Gj;fb^65^-ldq{hIvF7=*!e=M@D_(wD z?BlOn{GOsy6d#@`w$Br7J?seoZ1XM$KcxQ6V#RZCy^!|!-KXS*GyWe-|EKcqsk+%0;2CGTixQ*Ug()K>%cy-EYS1a1@8vmT) z8-p!Xue%-GLA3eFjP9$JW!nQIh~WK_jz&t1#xFf^C^1h>+q!aen!f!h_D{g)@!tYMlpZ}Q3>!-xQLR|b=wDq%7eAW!Ql-JKt?^$vF zSFwRZXzKvRf1vy~V)B3(!q#soe_D(xG5e?J{7a1gEe4I4E-QbT;FnwEkrT!vSB!f| z$m@1LuKHbk^3cdQjma)5pOG&v4wP>2$<0X|?{qObL#$wMmh|jwF+NvJ&l5Xe5cAKA z&WWPO{>PDYgs&cuuP!%N+}}`Kyj^U+3BF3K@yi3~aQ#yJv&}b>{zKO<`8(J3|9oFH z-*cDyqWeeHv;6g#?`z8aWbZM?ck;b(UypB>Zf0U|w;02k`qiz9m)y_OpGbFpB-;Gj z#Sf)De0%vV>F`Rid$DN$!?gLm&W~1na46-p1EX!EXP#*PzlFrBofLQa;&gA(qy4k? zF`)g(Kc;faV@%#59lTYvyo$}YxmZ^5*6YOH>qUFtBv?b*-cQcgk)CcK`kRQ^_F}Y$ znArJlE8Y6A=&w)ts$%eJaX`MPcvAgZKpxoEAN221yuMp($S-&B%Q4$K^o!Nf+OG@K z|7bhQx4RtI^5+%L88**Rg0Jq}#CDg7DgAkTnzX%7*x5(AhmT%-T-x7^?KY;oBZl}Y zcX{cG|NC1n$%o~Pqpk4S2|l^^yvqBH=;6z!uhD*{PBx!{XQ%2aNBqd96o#Dc&$HWOB0fJQI8PdY|(u;o>@#SC(I%QvYZ07BRjm!PHwic(mi>;72{&jG$w2d>g@(h3N?yd6i@nZiRadr}M_7{IjdQQFK z4C);xj`kBRzdJZk+M~Z~osPahT+l!EFPEOe!BD!v&&H=n*T;y1ffyVvmVCYfy5y@y z$5QV^w&VCV&Z2vf;^WK2?3?0<{@na)d#ZQ`{}A6LJ-{cM?->40@$w0=!Kc`|dh@3h z_kS;D_-gZ=9{Zd9Qst9-#Xi2Y^N4iB_73~E^+Oi;sOZ0{XY)ZM_|k@XADk8B&jRwh zqZOqS#t{@NNqdZw=)PWh%sAadM<#p^i$>d3Xa{y+LH+n8)vKQqb9{FFr1bPLvHXp=m=k|gba|e#aqBal z!@|F)d_wtv?Uvl%`0awDB=%_h`2Y*r7el zU`l+jr|P?XvA3I8?kx7VA-;)d|9jc{B#TuQw{=!*{nUCD#fR&N^}3>s1GI4`ji-3kbh3;#{+z{tqU_hp8ol8F*{V8q1%zP zkFV&Ozy6@&?t8?XJYvz7E|(U&uN6DX!ByZI;&?T&{|3=(iPbVBA-{`!-x3u z1^#+is@#82^vHX+$cy{ru@e~mTJ;TEE^nHYRj ztTqv2^3&#*>rn9pEMR`1;v>e1q$f((7l`(LX2JQ5f1r4de;(W}UGh9(pEG$taql-` z#B<1kJb#IQw&$7A8+F|mJSX+=v6go(x+=Hv$Qk~%$NkXsR6b?A@|^plg>QE8!Isai z&7YIU?wa2wk8R^YCg?fayZG)BKc8?O3;sumJe`NTl^AX>_IDENor&`vK+65yC-3Zh zO66_*a(u9K=Sb1TH>do5CMPK#eO~OHD^9;8)|ZIsm0~p#iyw&dpNh7gUjGj120v~8 zQzd^=+{ahj`qR-1?1%Pd!gIE3?Z}F1FJhRkByICRbZ9r{Z&SRX{j~AM^Gy|Bz~P3{ z744DDe_``aI9-)58PAJfpOY_{(|^>bs9tfF*!_ao!WS2xlkOY|KO?${XybOBT-xSi zu=+iGYkrc-gR@0@zo_ImHr~PJVW_^YdX|Us?~smXV*4g>b`7N89Dhl=pNb{tIX_uC zhMm)-{c}Zozioye@3Frr`)}Vsz1zed{ki$rnEpO{Qsw1B96uvgu=7{x_<6C1kDcL5 zhA?;`MfpPDdoAr;rXKCxn;(4kI(lRqHVtF zg6E+G`mfjVr)=-PNjiqzm828O9qx~KImO-Aiur$ZKULhf@e9&6e|4{xPPy-#MtV-( z-1d_$qy5!9Pqlb17_nXcH*Gh1N({Kq<9nq;{Pg1c((ct_=VGy--KkEL?(&>IrakK% zrnpDDn4&|TuluxrF7>nhRDZUUSZ*%bd(-pxNL%|H(Vp9T%gH-c9#}h#pB%z5@o-nw zTkIkF9Cs8+PY)4WXv;_RcBKAhV)8-J-UqSwE4!Shy?<`=XWIBgn_tP^zqI(|{T!D( zQAEGxtgLu@MX~!9(c|+j=(nPGD?Y);H!rFG9RF5~Zx@IBPrUfLw5?BGUx=oE?|xa@ zLEAiDw(i7${91jO>UH;Gd;CbgrF3Uw;^Z5L_@faz#DCTJs~-L*Tu0kEtBMPJcD9=I z{EgxaUtTXI-NK)T=z{UQt*7ye`06pfG5DS0J$$y!OHs`fxAEH!<0P^#DBgUQ?G6*m zJ;ZEV$hc>hy!7-FiihNzE40nCXX`Hx4^_R{QDW<8v4>yJPm}ImA_mur^B;=^dGs;Q z1sQqf;+HCq_?-PGqz8XyyXVm4`Dd@^`f|M|Yf9UAj49vWguL+_|7!2|g~Vqtz%S3t z59517e6Y*@N2}{Nww_AFebB6{c$e)K=*im^?-94-SsuE-iOO5#n?qkZXWT}JPY&_N z>07ebNloKXZ2efr@i~SY1d7fDJf8;^@KUk-s_18;ccz#gCszB5*)F2H4RP}6{f(u)_lRSjM`mlG@zJw4 zOIzOF<9qejR=j?@7_KLJ>x;2H-%#%GyyUnl56JsBcE8}SZ61??{|#Djh~EzJ-)**= z@jTXASNrwfEl$a+*W72(I~BL*1eL8Mv52j66foSDgM#s zv9|vO7oSl10^d9drQJhC?>NyvS&V5%onxe<1I1!@(b-XS1JUM%xB1{5j_2>7@&WbY z-K3|`=HHxuMDdRKXMBD_|77pEbkHq)^K30`XY&XS-XI;lR$Snpoj=g87Gm`?ar8a< z)o+Le{rUnOUZZ%I|Ci@iOSk#oxrIL%pQZThWN}I!ZgGfox;NYHB4z=42XVHw7=4`h zreg6vvBDqOx^!cFl7|n=)=<54C2_HWI5RFIJ%3sLu==amA>V52hj@=F?mjH$hgXO;UvrU2Pw=@u`Qst^=o%kg2dcNgXSb<0WBiBBXXle|?lL~a)|u(!*B8Y7 z&uM?t^Ev*v#hURM#c!nhFusraj)Ay+IpK5%WA0 z@_pFzkJXgX#8|WJVm?zWxM6oe%O14 zHV(w+x!u~EXm!=Ib)Gx4&$donLcS!Ro%c>reQR$We6-D{Rvo4C`b;snL>zugoZv%; z^fv?g8|SMk&n^(_FN$79{35Zzw=VG0BlZ(>oCrTXB0p^F19#ZZgzZN^(*9cai1yyo z{Lj)hUeo?Jp4_c?|EFSfqv%h?@aJNDt2n$3lE;ehqqfe)lss9!ociw`{-DSBg=iJU z+pCGm8e)SF>Ec%cd_fOw@3lGjARDJJVSkn%OgO&za~mJ*KBMzqvTofUq*LhpN!tCZ zSpHL-F0Jz$m>b#_gyykI}s9@?+h7t`I)95>-STAxrnpnS&mHRG5&9LLVX=FgZOrtP9*#mOmRb&lv< zg8r76jK%VYV)uHn_<`t99$zaRkHp{`qIZQjy-1v$C+6g}qt8k^M^Mgrw|OoId0wbC zSNWLydyl-di!W{P!{$fl8>{|e6EWM2?RnmDVdN>^rrxY4?QA64_z}y4cktg6j#qMD zhn!FLer;ELSe$)~{cH`l7t26w_&$4ZN_o!nR>S8l_#Msh^)=&*Vtyy>mvo<-pSJP! zOXff1_dfXvzYp>R-q+Ezb0N?1;l+x#X!i#A>={0Leum0@+TG-E>101K+EdK&vm^X! zXM4rtt;Dtu@w*G^TOMTe8I^nFKU{pXwVw;iL*Vb1yhn+juF0>&2WvlF+JD=h^&izI zRX*BQ%sIc|cG5BDH{^W%4=X;vM+X~7Pw>tC_1MqaqRqc=?^6!`qkhn#f9yOd9sf$S zdF^8Q>p4Do{B4zo^yk_2(xabbZXukKskcB**s4blCgn4c;RP7o*f;P(E~^Swn6zuY-Qx**>?{Iqnnr|3YR?afyQ z$E$pdZ|`K%8RMX%pGr@7uhPX&C$}hGG9G%sxQ-s5Z}2yjkH|mw{wLkQ5MSMG>pIq} ziP>6W?`@(3=dSdGdL6!p!oG)BvHgE^oK7R!xRIFp3EPKnRsE9ubi((X5jQ{Wy+`$2 z?vsT3$K6u#**4<;9ltT{E1rj?b5%i-2C?VMe5Vu*t*n$oT&0H?P^B*JE#4%`C4t< zf=@p(z(1$o*Y@G}#2g>oA}>80D&COK?L!BjJpBgS(NDRsAU{37LggL$t$_U|l!w== zd~&B){6-v-Z)*KRdP#ou73sm>#Klu$h%avNm*KOD2QN_mFR@J?*ulq|&z+P1>yn3E z;44P>lNi5|(a%ru4Z}_44+i)Lo40I%U-76HvELrYaqzX4|C_x*`>F5=5q`LOPUk(s zPiL^iH+NrDx&I%rXmLJ#zMQ;c!0}5vPkc>)ANBXscJ)DGeyHd%e%JE2{!xl|j~3@J zJx00*JJjpo7d`x}f3WIJ4-hksJI8moV2$tg;oN-k{@QMGpxBDUhW$nZ>Dh^5dbSwg zYuotU?7NERKN9O3#Q0`$G!>_}iQ&)11RdWZ-M>-nvY+t#(gi-dyh?ifRWamzMxT?O zGS0)!JL2>8Kf!+RmjU-#A3B?>+@(D7+5dLL`F?GjONdV|@vRPd@ZQ#{-)6fG+qF4< z#q*4}yXx6&| z-)}@aVDGh#pVa+7dxYPCJ&*rP+8K-4Rgm^8#y8u#<}GX2E>%67k1xSz+d7)IPLO-N z>P3f$&H-YBzwYiMZR>(A_LPqI6=(R|)-lox7#&AF*gsl2!Dn|4l^)}l(}Sdk_-K0% z(*C#1BI;Am-%EPFwb=cj*e0*sd!KZ+v1sE2+r(`=VRsdkyKfNF_`lfxH;(AXQ+#v%1GXQFIsJbBJJRE;#Pn;FUnEZP5wlb}NyO2~ zVulZCPLeK;6XPSqIlekEKeHR#?I_xNUZd@$3r}plQ}oGehAT?XUnkmndd^e$Me@yk z-lKEyla2Yx->IJSTXBGowt4n!Uh5JcZS&jZ$EkjCq&UYfPw>ORzKSo<9mYH7=>Dfv z9_%Idsh=D!?U8@BbsoDT#XF4S82(gxbhGH9!yBcoe2C9(^Z5dvE866vM=z=V;1#ij z?+x(56@J>*P3dvn(^Yl77hL~rdFeji!wf&Z#GkYOG2^et|JL!W-kAN^x`yMmwZ96# zUau?N=KHsC*^7-i?q=eYytB8vbp9#P#%&C_@0!CE4~`bASnP5i*WB0rOz{-IY@B{s zar4hrE?ts$9$Y8A;P*7URyzEq7*oIE_vKNq`5EO8h}Bc#;&0;kdC}f8bn(9pMkoir+>Baq25Z0clduf=}6mpa~=Fhg^!ry zGkUwJ-i-Wch0pAeM{U8;o~q}eC$OM?xvR>P9Yu%ZJC4?ub3|mc{#}U5|SBClCK(^SQM?t@7d!aWN3+J5J^2tXlhTTm7dbC*}Qhi zAJwmo@z0%yq}_YP>`u|vSF!n~2aLBI-=Ok2{d!G5US6qqk9^wn3hDR~F(nV(yFfZR zN1Wh07Wk0hc((hj7~rcr`040a;`o^izY}e%_;?#J4aEKq)ZauLt|PYJC>G0$whoAc zKkSlkws8(U^3FN===4eXIGgV}DWq%iw-I^W{5y(IFBC_oh{I#V4n8^{FKz3tB>3h8 z-#pq!^)vF%)hDIx{lW#~ttTfcZtJ0sE|w1P(GBy8e2qB74`*Cwe+|Wb{B5whbRVCc;+t#o&2#n_ET?*{mBgI=)ojnHA5yuktJ34X>Flg{x(5u!gnaYpQ0eLjv2(OIo8{8&6A>N^W@@>VN?}@#e#r}QbtP}_M-quUf z9T?zyZC;=lUp!l=UJGsOgb)9tc!V!*zlwHe8F9{Yd;Vr=7oXhzfV8c{7mz2&$Uocv ze&Ok=H~XsS(7tz|%^PgvfAe3e-rzAYe_C|^B*uRf3v~A{(#f-8pS7cO3r&hUZFtJNQNmlK_p#dr>yX!QH$AMO3KIq?90=TSc*4_A_RtMH>C{%3%nDe>tM z{<_*q=QZC{Y&H@H?-qM}F7p#3o(pVT>=141?s@BJJO91x?}HHkZtL*1@X_{s(B(QL z=G*u@9eiC2UuC{IJVpD>;Rudlb+XFMch66dj_}JfuHym@D9`Za6Z~6ns z_fEx~Tg4n-J>)z_oYxS4U0$qu6VAWI=kd-~-2AA$r7P&b27W?5m+uxPWt`mFTq2ATvjO$%}l{kL8%l9|reC_`OA0M9u zs$YCebT<~84aDm0Vz4IVtBC%x;+W^{;qz)&eA+YbQR(4>VtT)5>z@}h>4fL{F8KrR zM#bmf6NmWeKL5)l=PMqk;@~uKcCy$zQS|V|Hon??vW>&Dan8M%?FM2S-|d9b$(~|s zcd^__tQap6Z6_UVD+XJMF21=>e!2U0#ltnkF|6>#89upOQ{|&o#nwuqv!a-`(d3;I z`nfs%WbzmFe*yo?P9BqX9}y>onA|N^zYy!G=#bxX@XsOrc7b1RhN?HfCkJ1Z?p`D& z#Jl+C0sh%PRpmaud5S*?4p+P|eT;OCe>NYJ?W_23C$W!zj&_uu;;*Y+rNb@7*89cu z9b$#A4)A%^8x+rN9KrMQlS9Ty51y3{{wUgfdDVT=Df3*6Zjzo}EB1$C!ux*J5z;Mu za*RK2c2|4=gFU2U#(RX+pB=2YI}mHeaoBo_{Vyq=d|e#j=X-WOS5tn4IKNDsepBq> ztNmX|*L?mSJ~`()&ERNRUAGwjZ0oD^)>OP+kL$X=*jh`R;*Y&$h_nAL`)gKK+~%3? zu%GD$iragNt#?WL?BC=2wfXhxcdESj0Nh+`bN_Vrkscf-dOX+JymRhZidXn#%QsKX zR($#e(bh$AFO;_5ht2cuU90%;2WNPBBK0*OMN>W&>$kH)Z%S>1YSB zy^H95Qgq306sJmu_~wZA-sTVP->mWp{X>s_B>RKnNd;dL(^sh9h~s6{KV|e&B|3hM z;@zdi_UlEP|Ez=mt=>pEIwy~mucf&8;0}H-r@!>cLnS@cD>tG3N5vdJoPAi@{}AQW ztMQ4$Z51zf7Hz&W8%Nt5sJP7s9G@s{e$D3f&CXKX{91`GuzXw}e>42N>do}Ros z%JXf+$xdRthv@Dr4kIxlFY1{O;`0oSr5^DK>=JLoDe=tW_~@GJzDTs6@J!L>!-(+5 zE%Kh`lkNS#*;iCQ!+-ktzt%O1*FO~JH^QHZHclhIQ`&rT@Js0!PVSdpJS=9vM?Wcg zPl>}PME`Md^gA(pNSw02hCFw0v*N`>^sYzaPg~|oFIRjr6zdDc@I2Ax;ahMY&bdEB zu2=IV)wAnk`S20`H{!U%n^bRntJu3kEV(`@+Tr|NuH)jzsuytHqpwSMIp2cwta$#h z=gYpSgM~Qv>bN(6W1^zjsUI*Xpd`{)Xv0`+vn1$l#Q{s3Z zvA>sCnqT@j^)?Y(Ju&HujVtEMi*w7nz92tYGCp|tjP#%shrDN4+#&7VAQs;es|%=i zqBvk2hsSt~3F9;t%ttk#y6C-Hr z5zg0Dyuv5-$w-^1L#ilRXIw;{G(jD^4<>}J-1!8iU zIJsK1@&E3a^6!ZSKH2$>wEbS}`E!JSj`=-}CaO36Df_uqoZTT-zZ9Eaqw&+7r=?wf z@8Q3sN3T}9FvT}l%hJB!kL%T?WB%u=yV5S>#p+F@{msSf<6>_su}waCzK!${?Q9|K zkuRt}BJHsKY)8szFDu&7&LN5?$BQ;!U3!sp^bOJGGj9J>y1H8oe=Ayl68%kj@}f9@ zS?o8WPybXeuYSr|QH)j=%eRQZ+eDZCF6~MW-YYJkjnAzf5|(HhyKm^|g5;`nzgBIey;b_;!6G{PpZW)w6K`{;|^b{4m8A$EPcvkoSzwk`B1; z!57#MemUiO+Prbur7G`0=VIv;pXPr}y84DV8jIbZik;iV;2yD8h|xph;K0 zUHwsP{w#XWiX+(l3*`$j_>7I???B%#jvo=T$Hcf4`*1+Knk(LVkn;P)fc^P5N!Og8 zjXR(6eYyNja=zaV-+%iQZCCMJS#jU@_?>sQRe7x^s@={+C5t z*EGgwXNls$3F7QXaX>pCepfxhX|55+hs>Rv!V)ys<=SkP+h;4j!?<>-Md`okcbiw`_ z_Se5iai2V)^I7Q}{~f{nNW~`yiv3+h`(NMQKkROxxXmw|t|D#kyLpT^NEi?7lb0^= z(Jten?R~wNama1*yEDdhc&Ey@c9@^eIY>IhPsh+>Tt|Ai%DedI;3R4Hbg?{J9P=Jw zevx!_xoGRG#Q5aa_Z80>-!a8E*Y_wscwBTD-_luH*TH?0I45u4#UC%p3%^_CJ=n(g z#&G-|m51*WqYcIGMxxCV9pZ~^y_0xLl{@(2avSO4c4D@JI1j|;6X?D;;(01KNV+~; z93Lfm_~sG!Px~~*bMDWE`?mF6#k)6)%^jkDx7fZ*tchoEai`)b^A$-lzR`9^v>;a{On-(MzJs^Y?`IBU?r7$AtgAdheEQ^@!txZC?CnQ^j-I zv*g3l4nEoQqzB}k!!4z!`0F0|1$)oi#=&`?QoVXVF^NQXAU3qa-Wk%1Omr?2vung^ zg1$p+|4OWXC))Uq^6%0e`X6U`^+%JH#r7IvXI(LUm*~DLvcKcmj`MBs4>e4VR`~!%#3%UdiqG5QdJGR$ z{mvm`Mcz0$NZRN6x%)}aJ|)^XZg)@VA)M|lUE-57_LFhE9_KUX{JrB;zvgrKe9i#> z>~g)`FQ}g7m4i$=y-@6P9o^>ld_{G8R zrHiM5PEq!-VK3CByHkS;lo=uzngpE`U{ zIxNK5z2XFx_+RJOiaQUB9@_`@Jn)#}1AM&Cd2~3h=mnLx_*`>7e@c1Hb(#K2^``jh z4#yeYr+CQqj=28Cj};$|Mf3Ls-ENiuE-Dkwb@5R<5;`9M{ubACM`7gu?d5HjD-MLor&Ns#2 z3enb!%D*L@li#p$*27DvkH45FeeAcaDzKc0q3UV+cQy6C?{tntAmd0>a@S8bv4 z(x)CicS;_(feF5Mw!P|&_#V8Sq!-ZsH;8v;zq^Pbjg0G;ETo0AnEao>c*)AJSYbDzcElb$oqsk}vc!SBKD--!FwzhC7&o>$HH zdi)M&Jl|F@wdY;fre4hNHNrPn=!V~QKz@3RkM>{CaU1@pav1LsGyZGwCbc8+TOrT) z&by?0v_n(=S8LE|SLKuUh~9?c$lA3nq@!&_Ti3O{lk{LWaj}=^?k`3Mi?%*Md7|`$ zJV$<^^qf3NLpvUmPjPQid49h*dt9{tKNqh^kCs;d(^^TKtS+|K6^nO?qYXuyzaqdl z*IN_cUJP~+ZN6X^A079phmW&$kpukV%zPt$()@FHlD6|t7c2T_TleDsvG?X*a8vdF zKLRBnmI1Lu&>C4s)&Zde5Eu|jScJ$@MwU8kWsq$IEJ39PSsb|$g)>>w(4z`>D9Bu3O>92e(B!vEJyp|)9&~_<#!VMZx?OeN}JcRzLwH6 z#<%5vRJ&J}Vg-Lad_ubQL$Oc$*&$wCqg@>nujo-ep!|sPHtw!RdAFzfiY4L%U%mSO zR59zlSPae=L)!nr8PW;;g8heac%stNW5qG!r=3Hjed0Lr{?axN$C!S~r++KAQ2vDe zueK4(J7V=!^_%0D#pWNy_<6BIf9pLb?ctwm_~+s$O3$AXyU?TmFNt4UJlp1-9kP6d z@)5o_#Rqp`&HQko`g<%l#4qG*r_IkbX8Y?es=P~F-QwrHOzEw!iNjmP!8M|@NDMwG zR!$S!$BOwOV!WT==+NITn*zZrDIi=L|7#iM6ywpv`h07UL^f9{(G0T{Lc2di4&m{zb}v4t`1uST0^H?cOMk$*)qMzeMSS zFNrbN;pBel>H}gk7ai`S<}am---_u9vCnnhdr7+fSJA!?wEuUv|E2Waf5owl?^^eN zw+G<{()k<2(I(@4Ip66ZS)(w1g1^?{tqjFRHvvZWR&7VJd zzqI|Ys(FEQ^`oNA$I&Bx;oYKi{|jQgRLs9EM#P;*#90QvQu^pc_;=BxKWV*Q{YtT^ z*m$d$ZY}!6dAd7Gm%EA6Jw<0faZG>K4y66V#X9|6PJF3)jMAfdqRo#{Jwe(%N%Wdx zyg;=7DA)0u8U8e|crdwnM)pG66i>)t;9zHrG&N;%*6)-2i-c@<~ek#3Ax^cN^ z<2Ry9q-`EE8_(gBUcoQh{1=l8Ro>##Mtk3#$xAuZ`{Uy$KWcGaUTctOMgZG}2 zu09GM6q9d>&b?yr6|v28)bumbKG#!aG37dx<9@DvlyvU*Dc5~Td$9Wdl(ZWY+LbZw zPW3=7AJR_Mc9hOM(f;EYu7@U$VE?%K?3^u*Pp8~`G;wSDKjPqM^67u7 z#Buug>k98rD|@P3eOEED{*Cvu1^r`lL*-{v`q{sW1#zm$3(^gIX|h~8#Agp-t5kaS zJ29c3uhGxjJhSCW@?j5F{;YJHFTm#2viSj;FDt(@5qtj;r>}^8d_wpS=?cC&;yIxI z1Er7e5r?;l9zG}}o@oDDjut4tcD(2xDvtJryNmT5#lhRrn~KpoV!(KZ^ac6R=sB_T zq&UFe`uN>|@f{KI>3FHixs0!fzR7am7puAG6k_LD(iv}&t&kqzi(8D_9{xk=1>?E< zj6=!S({`5|!`b3!Coy6Fee=Z)rBCp~5q`MA@f)44e3$2v;i=M&mBSy0=PA8r*irC;EzRzxN?*G&*46r;+OmXRJjqpxQ`EZ z-l+T8#(8;LNw5CD625k@o6-Z?hbg|d4K02=rTl6?OuoOPmLI@~=lH4BJ4gAIyCr*faWKT;6wDZZIq~m{x-Kp4d)L(cN zak!ai|3mY)k*>T$baoI!`kxRV-QQK|-W)OATdd)y)4H_vV=?~PJy_}WLqz+ZTY=BE z|1(sGHw{lzxu7X_PlsoT6MUr2|4_#ddi2K)`sef}m2Z7oY~LdK_(1z_UF)+-FX`v| zsdP$zpHiRA>y>^?`Ta}8$wD!^ShTov9X~Mqu+j^Bfy4H9*q_0f${(S_^Q6NI#5MhQ z2VWdf&c?s=NpG;82G1Ma%T$k#Urw);9!b{`Rg$KX#$ABrh{xwk?(8k7HTakP&7U)OvsKG>b5^Z|af|5oV=J~G@^y1;)9 z@tqDnw7I?Vd)tWtK6J3PbZ3p_$1IoZto%NVptFn8qnbF}Rc!1gy08h`yHnm5!+pj2 z0iyqI@}UdI2P)k`$LP4O^zpmI7WHQDl&-OT0sGx#KN}pk44>V^|J(CPIMsQG@z=$l zrMq^%enmddK{n2&`moYnt_S7tR*5Sz@}e*qSLeUoR#z#E3XUXA9|^^6mAc z?f>SDzo`9fy&z79V)B@1-#ONnNxOH8jXOm9&+O5XY`9 zkZztPT0dm(J#9SU@L1(fj})uKvpsxvhyJro{JKtjXQKR@+eJR=;Ov`y$qpv7J@6C;N+h zMh|}FVDhKDoBGw#(-2YZEt5 zh%XQD$*He$qXWgx5n^(j=*$jqS1cbzwf8^cv+o&T~Cx`>qr7&xoy_7~_*C_}n_rW6=*O zPyD$5sC0-AjvkjDKOx%qD8Yo-^Dj4zmsnKndK*9f?xKy?(6vF!CSb0wiP@0 z*#_gk0-mp@hbzDLUa@(M*hkyA*<^z zZU32?oF{GnBlNG7?%p6y@y*GXSZ=8}9Eg>NMDNF9@>4NhF4{bG@n58ie~KA#=i&Nl z-`!2b;hV*ZC)#&|<88^WiaGJ<5q`SdS?SH1n9v_hcayH{A!d6*`mJF8kSUXSbULcnE+Tll}NBGDPpKbFB)NfRN>n3r4 z9^N4BT`%^o7W?$)E^)IAKRsEb{1O(IN@w)c{)Q>rT`tyoY@Dk3{pBAzWh!Dsj0fL>SZ zy`u9P{6p+=Ud!K0H%rldPRyPX{U3=o4|nyu(*0$kd#~8JTMT-ljSmVwD{bHX7CaZ0 z+?V!V$lmKT7pQzZUrde{hao(a^aI7(KH~VDVodutJ%IE*#nDdatwfvex?hp5;;X0s zQF~m{K963Io<1kmpA_wVVux`d?Qbc)AdWKpigf>W(dOl||IONWjuZNq^5ZHu{+QS! zu5JJC8WP7DT%dd#M-qL2`tjY}_ep#B>jwQ~#aFtGXLNUzu5B-l-yz!kRgE2_Q_3}V zmd=P@_1-BxATHJ1OL{_l%Ap?)NH6vvpXF`7ESvW_o2~r96a+u@00cp75#n0X-%wePx>}u{x*oOP8knTI!bTi zXDe$-C$K|$ye{Qth*R`%9qH1RM_c}2edP~lirJ=Obqle9U!JnP{XLZ4!Y>D*^yFmG zW&a2G*FJu?@iFBGABR_nm8--m$FaCZdT_nyCt`A=*o4Cy{&%_YwbCK1;BP0?6Hl^4v<<9ck2$p4c#8jJ2Kaq@4`=B0C9uj@S8R7~uCs7e>Rk^U~RJXox8 zpLcn#P8v#|(hhWBdA!nF$BFLIqQmm#q0$-tdQANezPW#d@+T};Qg24QxpyY@oiBDS z7HuA+)^*Yuafav%(!;Ncqx;0pcPRI;=s%8rR*Zg2`k%zs%VO={qKl8V|9TX}RXViu z$)@xNn~8(X#pzqb{%kROn;7A{Z9cmZ{YSc;@@@W(peAkpdP09>{|B-8+Z=p%#aH>x zyTpwCDxWJ|J6tUA*B<`5e;oNIh?S=3ohkP5*ZGH}yZGu7e`@1>L;R?XZ;0{D77y#u zPscF9x7vIi`Bkj<3NgD(9L8dk{@vzzOQ@&BulMoq(?sRlqzBN(tE4w8KgCCkmq>eE zF@)XQrCWDU{;Ogie^L&lr}!85`_cuhWYP)DACzwVfO6)SpOlWC72Q&FMq+Oz=`X{7 zif#N?cOCh$0pofzd~=`i4K4g!i#Ttxm&)h(*a*Ms;dkA`l%L@jd!e+4pEMs@KSAlP z`BCym?^Sw&&&{c)YkZILoukA$_4_Q>!LN?+$Eo?=lU2TX3d@}?w$2b!ID)~MO3%&` zyXT1B`QorGmLC+u3&bfpCBHaV>0|2YQ2(T<^x8>ccb+(8zZ{O|WPhc1e9z-77ZfH|lptk3KIBKO^R! zCY^Y8m;R@AwbFyDMDKFSFA|eTY_~<5=i25G3F$xmqgd{6(SeO4qzn4h)*5lGHvMz~ z$FNSl12}>e*rngCQ?EzA+^cJSP5gbni*#csv zrr#DjUlEhfiaCBQAx>%k8Mpa6>L;q4ceLmpA=dEOoj`g79nxJ(KUnz%{3y!F@HdphA9u|sKd*Ef-_-rR zbpA(ifL|{EE?xXf3||$~wRQb^JQvn^9~1E0Xzz`jEmbb%IXC0Ewa)vd2)~A88k51F_BmDC8Y-yMFCb>x3`7q^p|K`zd)oxOH z`?I3WUuW<2if<@Adq6CHC`N@?8H)Ag=;uY7->&$BbZ4dL{Z)+qPWnXb;kSL-_vYGa z?{nfPqt{C}HxliCft5Fr?uz!GYxCI^-h0}-(F1&TzshpNxg+8^#jZ+E=ZJ&7(ff+= z{$lF@v2zeSRP^cJisPki9=Qr}D3^ZH#vex)tDH-mw~Eho@xulEZHiy6UZ?Uy;=HN( zTYPWT`e}3@IyY&#=BLHrGw9EYwJ(Yee%Iy;8K9?kDnG*?#Kh-XUsrm0zv$wNlkZ69 z_+k6sUhh%T9~a|7ES?f8KM}`h2R(!t@9ih}o9LG+U;aky{GR3iBo6-~4pxcv|A_Xz zTN~fp+Z3P0_=52^(k*;iV^`_s9%2I@UENPQAg-DoPW~}sh)=G+U)neSihr!&Ydw5) zj*l)_z79KZ41N4@4~|(b!7q34r8U-PzBO-YJBA-%`|!mRd~O5ZTfb2Gm4#w05|c~B z?89R8QPKGr{5a`Xi0v!?w;o<5U0o!OsIT!M>5%nz**+hi?{l0+>}QAPi;(zzhv%94 z-l`|ro%$F@;%_fK-CAtmx2tbPZz7iXZTpULfZw+7IY;>I;S0Ks0-o36pG#*?i~S#q z_8<3z`=ZW!mM-_3&7+ueUnjAat6e18e`9RiRXShktz*UTFwy4eo9-^%pj~Tu(&=Vm zN&7i*q@&k~-hb2%XSB=FpQVErA?E0^m;Ttl1#N_Qtw|Mn*rgUW;vHuVG zl+lY~;}_!eF){zXSSJqIG9P%m(u-Tgi1?**owWULqfT75LA*1C6KLuFWm+!3RLm|B zM~r94FOZJg;_y7Nd#*S>N35bPKVZ2w<0uO1&)KftwOY<+`{Pu)w?v$LNo?U?^RG*1 z-xSB+g_#&VEH-~2_R-mc(t#b%?@^xR+h~t^3YP0IPQw20<8xkyFoOZ?;dApJseYR$ z&gP8^9#OjgKVk^Sq*qw3^#t38Umg%=E`Fu-HvYK1Lb}WKGsPDtFOj|y{#kVYB1V4` zOXAEv&v(_S(rw&S_4T?=8ykzEE4rR&^EZ!c(yQm~sY}O)h!%e?@y$K_a>#va{{w8F ztMWGAg^$mT7b-oA#O6oDnCJ1)Wzy9v#WC%ROM5fDR_Q+NQ1eDxk7e+C>EMrIk9IqI zS-Sc!v5v2f@zoB#I^00*|MU&?2b)0pi#l-_$NG^im2cxlY~GL6etJjc_iB*-sJo|h zyq7q^S6A@W-MZ2X;zBkaBt2T`-G(?lSsb4#PR{{!{mkNrPOkMYUn%hEP}w(?); z9`Q#Tr%^EOcKk;9rh@P72AfMq_~^>prEPq3dnf719?<+VKF-6}x%k|GxM~GoJA&qy zZQMjby2XoI=q8Nd5GMHTG5*}cU)J&EF21vYU+&}NJ`!U78*73_DbPJll zZIkcgd;6Da`P${;pd6P_NL4$q5~hou91&itBm%5!XTqjbpqZttzqh17F4`NXN?H6L@wde; z?>FPGq3;l@pBKYh#rmhj;s!CLf2+{%S$|mjsPYr~&*Fp9{qw{Q{cQ!^JzwcD<=hLU zUF(No6ZXmX@#|xjFVE3(?X$!QzPq5mAL8G8#J~Ct${!;RiI4jSOWXIA+3wP<9mRYr zG1*)kRLCc8UH^~#Oz~HI%^$?@d2#eharg`@#IgA>{8<-YnBy1AZ>d~@4^6%yof7}- z;ZsZEs2$?0IdRuMtdnm4<(OLhm3lhV8xB-|@Ex)BfY`&=I&5c>E8TqR=t=1aADOYA zDe+gEUoF8`2E=1Cw9TKA;y;t0s=k!t)O%dIga2)zC#<*0dUMv>Wxai#bLy<8$9gNJ z>TCT*jPbcH=gWt6*oD2{seFVVw*Ohz@WbIt%D3-beuMkoyG%O1Qp~OvZNB{eP15aK#3?@5>q^`IV$(Y*$Me3mPflOyW7@6h zH>HQ)5o_NUCl8ACABe#t=p0RZ*nCVndP3|Fhlpu6+dox$_>5Q|iY?mL=`YDI#rE&S z=8IysQuJOHEB_>)_S|1f{la7&aZEhL{&x^>tn>!`L&KGhHy3O8YInBu5Pxmo>GY~f z@8PG5U8E=UM=|3;{5_Oj;;&1_FHZ2&>0FjOTpWayKUTE=fp_rLQ+##fEag|*VnP3z ze^lDWRR_eWTh}N(Un~wjDcX07lO@s-zS$>^?B1>PpfA?%6FbX98+YvCm%Se--64*g z;tNJkDLr^bbble*I8=+*4bA^Du3|V=x&B|o0#^Pi?fgwNUmX5JddN788u4TskKwE( zU(;SkEFE$5260H7aX3rb=BKDIe?-ioQs;j(EQ7;iDaVbe;R9`jE=medc{d+Tl63e}i=Y<6>}~XydW$yWl2% zx`&^(=X8&D#tpPwOnX%4`MHJV}c%azbN3{8D%N?cDZN%1WvALNTSHyCC(cZrg{wu#! z$4}WjyaVEs8NNK?{eJxgm2cqdMsR5Uj(Desuk-P9DL#LKpKHIYdRj1qJ=n$XdHB5{ z+t8MA*S`&Y94_8;oTuT{^0=a4$Sc>HtH(G7fZ zm-0<~afjnH9I-urg2a36JJK=7W6b`#YxvqR=ckLGZR2OBj?QCcL$Nbc>~fxyO{9}e zNuMRAu4v;c;w_{*ZxOS%!ncXjEydw>Vtr>c{ap}>FI&uY9DO$B)W^ln7GxXgT_x+KP5fBRV;{itvMfD<6h-w1JS`ZPw~y|A1S^0 zq&R$9wEtqnzm%SoV#0gw$&1p{m&6F4+$LV^;)^qUaTi}~^T*}Hk7MF~gZ1QFqV@4F zjKgs8$^DI#KE^Lc_@0dS^#MM4NSrytA9Z=J?-PG?w^luM;*t$~Rd+X~H;H3<#5Ie3 zl|I;?}O%GFk58rL$q2rKx@ZZ5Pl!I+JCcgzeXy5Z$ z`jB*6u7yu`@u35JdgCOmC&!;BXRsak*x)?r41b$lB%KmJjz26N$}DCpS?G+an+TdDnH;p$}{QuH^t`N;_wS%c8fT=L$vov zQ6k;v`8mH-y89tgf5Q}d#X`j=7sGaVQMQh({&(n_oQVi)Ae0+9?{=>0;hW;w2AG5f&i|@8^ zBfYy-pZ)i%Nq=cRymP1WV_2I0veE-9f0y(CPN9uU$tX8r`RGe3-@09#-X=!$=aZYI zlTV5@`u*ZM>F{duuM|6%QSMSP#)rojl8)c#w4~Eh#Rh(5jDLxV_tg$nzWZ)5*jF6v zDTcd=&Q7BJ$Gx(Z^k}wN;J3WZr7JKZeT4tYJ>`ciKiOKkwT;+E*T@gwuJkUxt;zZZ z)YpQ()&CZiAFWT67_CHSZ{W;GA0de5gTH3D4x@_d za9k_ftNe5qG1)_m_ZEx&#PmSXpDWf56NmWW=ve8=38KgK);vqvZ;SPX=#PjlzPIvm z>Gl<3e3h7X#PKy^_j+-_{bBE;s;Sa#99X|A?c5<&?-I+eiIu+C#TO^{OHc8~&Nrop zuse`$;+w1AmbULclJ7{{|G7K(YUg`O&tdt1bd-tq9xnd@%j2iLN2Lcp5=Z#w0sh(A zKl=|rvrxH`_R)JrdP01{T`nE`Rt#5&_P;M@rL^-`@>hxDe~HDbVuqjY;HRCLYVT{C zz*%CIc#F*|)yF>v+bQ4TG+|A;xw|;oQ}pr8!G7c)AodRuL*hWSBPdUN$o`9F{aWKh z<=glAF>$5jbfuSPie2JP<@wU~UzFh`(v6Ra&XwZu8ZoEe9o;NlC*GBRQM&yV(fPV) z|AB6QkMxH{KNo9{i|$WE?^&^lj~@O;I$|8g>i66D3x7iS|BBVu$%nLv>rL?|<%UY1 z68Gy=r1OnM_l@XHMQ1b7{IY!y7~_v~{BfK3a*R)IY@_9x+lrIzL>oWr;-Blpq3!*D zZx59V@Y9Yj?ZJ}t?izH-pTOGQS}wxZb%>8v@#V&dbf0qeU1LH0K7Ozyo;rD_>TSaS zCNQL&?MFsEJ+>zxUfVuU^_UM08SkAC?~RX9e)V`UJwYr^7Bl>9K-}2Jhqo3ezl41_ zCcijc`60_SPLUqW7wadA1-`$@c#bOD7xUbba~vD&U$iUB?@%0`d=0& zJO{fx7dLNGy3H4vTp=A^Dmn{Ao438zBK=gc#dCWNpItjz>F#^P{1DM2F5tdPx*(3w z+C_ST&+gKWw%?-kChcvzBHiCW^wt%JwAw`tcKwDSq={^Sp8-`l?z%jd-!@s|cZ zyfsvM{8KTb-w7X=4(YFk^kd`yQF=oE)_qud@{nlpron^K8U148`_diy&4B*3Pd_}O zpPtfxPw!Fr5&gUQ@&^7p|AO+J&x_U1ivBGS-(4j>?p&+%0Y0RPKe7K$dXe&Nym;eW z=?Z?ka+-8|zF5Z>+5gt2M=O1Z|90LZog4-O(LF@0%oU@9(Xe+A8hY=RE)Ed=y4b6^vA zE4rJBHlJaC6Y0rDV)YGTX9Kb2h|?Kj2ph13gY}f(r+goOZ2sQcQ2Fjm(b-rG-Xu;o z7riY-`%Z8CPU*qEVvF=FmI@x{{*E8V_F$hqE%E0tdBh|V>l zjl1%%m-e}Chc{CG)1==jc5f3s?gP6oDqo@e-QwULvHZH2-zWCD-+K6A`yQjmec9qZ zweR|D-k~1%aTV4cpnm*uo8`T4E8Y8+*cpiSKP!iHmvZK}1J>(Ozs)BaJf!6l+M6Ej zPfmN}{!sbDT&&=)%g3dwPl-A0TxTd9&<;+1EuB0s+IvCokJ61li=)4Z#RUCd(OFyV zbHx$M4aE*|X^(cjz(?DBALFf6uDQKv-?`W5FRFVhJ;gV-=vR6NQ-2`V4;Lr&LnHii z^;o6%>8~REbBlOU>on!J@XhwVHo!M~7g8_%V)0?=oOra&t7Y>r+k9K*qiwvj&4)X< zUCWpB&)!njf4|tJUoVK8jUG|@_%U&Wk1mGNHs7-UJLw*A=wc-rpHag{xBjDan+LeW zmw3dRUHnRppALxw_VF_|p4sMW_FVazDRJikKB)dyrT2+Dd!BR;U){t%**wh+d~}1j zqh_>5@(CvvVw6Sp43l>3Mn(T+?$DBV3*te++J zP8SEXPn{E_-Q&dWQDW^dadMD2-CwNlBM#<>;cnu1Coz48Sl>o0J+XuT4qWNVrlO78 z&R;LxT~BP&-dA5$`=9?yY~aUjKELQCrPp4hpLjv^ej~PiC61mGQ{p`Br^&~U$Mj>p zA5otE&ZqzD&_5RRn>J3xp?@7O({erff4?t1z+ZdB(~>)sKD}ME_tM2@q+R@V?UT|T zKE?h&X>mRezf)eSa>Gj~zfiP!1$*a9+c@v$2c+GWXy0GfPiMJP#rPDlgCEP^FYUq* zpWZlG>C+QM^X(pf&gMUj)v^+xTt;0o&lX{0rPwtV7;x^uahd_uJAsd>G$ z%XQ`^(mhziAGf+dcSmuKOQZU9^jL6d~BQh z%EntbJm+>ER{7y0V)Iea?pym_qm56kbN>bps$Bhh;^o}A5!@# z^;!L0)}O$L_1g9Yln;NP6^b)s$3Iu@mhR9`Pw2Os^y5AH_2P#rm*b;5_<+gJlcZyF>@RcLjh86NNmg`a91phz8ZzXJRop|Mx{TlyO`!V79!Xthe+VOc_ z`J-QptzU}%b7J(282nVsek==W+WC4x=`qhiDd)-N zIjOQA(Z5*!71920UaYJ0(cwIFc^;Z_ob0*C!N*T{P8z^A3}6ToXv_6j-sbbR|3wb) zzb@y~v-cRJkL|p%{Fv>s=ZwUjut*U4F9YBZLt4#UMpO`ZO*I9@pCz!UC!f( z`=$P*>M8Ki%}1qe9vcT=9ehXWtz}~Lb+L_~Zg3w5+}C!W$K3Zr+5wxdvUaVOcRv9y z7rl>()sKj^i_sU7e?B}Lo+;K&6K(v6yDZhTT7+ob6_@?@0(gXZd_)%$_*UO2dn+rwzPg{r|D=$>K zeTSK%o3OY*`Pm0Wn?G!LF8XZI!S5BPOZV~V#eC`TB+-1h%^zGnUg+^TfDuEyvA%wUJ> z&c<1^KdjUgJK?@R^eztDf*l zG587kr()%2ViVmYzfF0M`?$h=Tu}cIKWpC$I;=0V=jq2)?}YZC@wD`S^^Bnh6V{tk zK4ATwC$wA%Tjaac*L#L~e=d$_pN6zo!3w2UUle27wfH6J_MgS{FJk>=%KZcWTl8oz zgLTz@7Q9D{d9UctB7F3eWY~rXt6#| zbWae+CyO~gx`&TW@X>92bcm1kKBV$RB(^_FJ@k7``azo~x_XWB)9Xc>_pbPqbdUbE z|2b)kXL)x>M|X+&-D2flu}VMgd|SHvJ+Y*}A3iJ{JwiJE!2Pkb|G3z|KScQO-qVyf zKR%QWe@=P)hlk%w@t1>A`7!>_d|>!nrFUQko#&O_h9lS{Uf74``#to8?~wC5z=sX*QF)*38F8M6oagBS$`3fdUG{6pc^z^-TbxJp`D4yw#&L2u zj|B{VrFv6n&tDP8H{?7goM)f&Q0KgKR%rR@NR0j{<}ZoEKa0s<#Nw}F?{A{}vgpBr z^g3)(K4AHh`l|Tk%Ad4+@}g+}@$tE?BDTND^GfAe%Kt>1az9KtuHJ)6uW`I<_-AiG z`TND<>tcuNrutQBdoHeWz7wv8@#mBu-YRCF7K59_@nW%mt(bJg&Xr>Nak2X`_)#&w zM653qvkOG~AF6w{wEZtVIu%X(=e|$c#<^9GlAaza4h|B7{lz}*@93S<7S|qbC*6Cy z*rHvpy-C{LNUW_dcGecFuc*JU@7I0$lP>*?PyaKaU$TBGr{Bu0AERHZ(a&}14+Hw+ z8vSvD{=r(|exJ5`(ickCNck%7~dk+@V!0G|B&lp&{cl;1+o7{amw}6zLVv9V)H9v|Oll5dRrI&GzA++uW}u>_Z3I zJageswOqmSM)Thh^-Wl=M?APeyHNZ>%a^|t<6nt=n7{y5pbJwY?Tw9J3-Qb4?^Iv* zd(q~TF7eBwvC{LuiODLl{!elAZ!vvEY_FwuFoyp%#?Cc>HzBt{7eA;{eKvNd<*HH z5zUX+J}+(mS($!Ox_+nF?1>HhqKl8~-mUZ@z97Fxy44pmn8Pl#`9;hJHd$^&Ju$4p zA?vYut{rrX?TEjs_0`zEHrrcc``he~`PDZ5q?u~D3dhIh@Aj@$x;@`?@goK2p=IZV z^JM3(dXbhJULbnV-oH1{HZNjA`4B(TroQsST0Xs0?8IXKa?$yOX#ef;7fVlX6ifV8 zeyjB0Hp<^FhCFu_949-UF6SY`?|JvDd>wyY9Y~M9CEEOn!S|%?`&N5Cv;PVXf1v#F zBb0kowC6PEap~d-v0b2_5+^?qM^B5rpNjRLp`pc#?LCX>l>7>`IDeJ;a@JE}y)N5f z&l?tR&e(qYANllNt$)n%>T!M7IF9z;#6H(&?=F>(zAV=4JbXdAg@2xMzPg`Pdcb*f zxPR@rI=zYI60yp4VB^99+J(+l%1^j{LawI_Up?l!8*)8%+A8myBR0bOqnye~b0vXX^Oy%6&>N@Zk|Yyn+w!;lsl(tDJqmHNsy_@LN7{ z$KGu!7vjsj&q{mvHUC!Wb}9~T5i2mdS$h0wF@{w*!3P>Gy<_EAerlxN8taYOj*{&P z+1~yVt#8VH__s@&kF1-Ig!Vt@@t0Jtc86&H7cyjM+}(1YM!L5AFYXh1JJ;MsUFP6zoTh^F6{RkMYS3e6q{+V%LwqO#5&DHSKc! zrQcWj>hZrnkZ$37bFOQPABSA;Htr!uPhkB=THfNm9qyClF{O_l7cHJ#c}jY~eHP${ z`#+=nGh+FynBsqJ9-;1YO1F7CJKV?KFO+Wnxc^J(0r&e5zgsDl9{xs5eoMLM#o_Nn z`)}-Mg>?CQ@@Zd&FH-IgqC@*r$0x7;ZiM!!^%u(jRcya3PW~y3)BlKV z^V774o!6;-Eb!I-deYhYVsk^WvJvGr7CW1Y{$`^6pS(qTT+UW{K-?qUN_w;n%h8V8 z{2tRCm7eTE{%)fECvm!`w2Ke7?-kPnls-O4wC@#rhf7cBXZ)k38^?)F`lH}P>B@X@ zfFG})Cfz@S{FWHv%VYYx-gzuXKWK5LjQ+8QUyJEC>-e=2U)a1<%iH*q(Z{4m=Hu}3 zKEAR8&1c5w8thSi%JMa6|0S>DODFW__S|6GHDEiPi?tp8hr~M19qtFE3--IkaVXEC z9R2_5?>Ey;^=s>;Jl3S2O;Nc94fy&O7vil^V)#}ShsR4*LW|>Q(tzh z^mv}w;(5$tyF9itI92)f{-etN--|y_x!XnOi{ju*VuR6b?ISN2~q z2S1(?AF8d?ayjwtHvMIlesn@VYw_=bez~NdcIdZ#`t>&beji^j#xGRy4-Nc8T+nag z+xz&C9G@~Gu2;e5gv9;&4{N#FLt>eU1N@SW3!Q#X>GnO>7++=ns*Mg|eGOWAi}VB* zuuA=1X#caAJivCbJrlOiwl`(_E9_5-pR2OJef*k>KWlJYn)tIS$IIqRD9~N#!GQ8M zF2Lqru<-$Pj;oD>_1P}>L2dt-{TQ;p*|(K$Ey2_>YTy&3gvQ!-1 zEyl0~Q|M7{3TxEUqh4E2`x~mqzT>m;{t?@2+uvk=2JGL2<6hx-PdVP19q-3gZ_aV7 zaGm=2VH=lW^St?7*Dlxj1m^hTg!>@GA6K|Pa%j)DRqme>roYs7G`PP!?zbr%|62KD z?neiIZ1WAZxNrL}sGPmW3h>408os!SFK)i1^7dcC)&ETyD?P&>XZYhj?MWA(-1)o8 zwN{Ct`Q?eUi*I&lpC;B${ag9vf5g#$#qlfRl=iJ+?cM9t?%Dqk6WYTe@rWuuyW^?ir(&U zPqDJMIC__86YVvGK%ZGP-%rMt(9_8)VXel2V$y@4;Q;uCY| z(+}GBk{xsl)?h*TCLB^<0DG)wYU_pRJgwj2^_AnKeYUqwziZDE&U=+Vz<1W!-!A)K z(l1W}m7CB%mj_8_2a5I|op?X#h~u5?Ep6{1e9p^o52X({U-o}_@108T?cvV=E)k25h!cF-^kdTF%f$S0F}YFNtS`yBTQe%aoa zv@ccui1TI7rS|-6|AVpjA*~Bk-fN55xngj(IB1FXAJ_0S=}uGZpDbGYQqm5LxZfw- z-&5}E3iq{V?Ht#+&EwapQ{TQ~h5Mz&ePr{E1l)glP30Q2!;>APd+!jN+lk&b;)wP< z^Q61@bZhsc&6OUxVvKK3Hkv5KDg#YY3t@WEf ztvw}e^Afk7lpf$~Yp}rY+B|G6v^{UM(J8d@_MBn=8L@G{HXb-*eYXBVq4n32hXeLBTQd)&_!clPnk zRqp!=?ST2`9_>R5|LozPZT`EM_N0cNE@7AUrbYWx$5&gsRHdD&ucvmYMf=sKJ*&{Z zbv9IfWu`bFp3&M^y81@Z=B>_YN4vDE*3R00%RSoR5x(2T`!%;xJr3=6cU$RNRqWHw zd$jxUj!G|f5-YoiKK(?vtF(PTU#A~&@oxoebG$+HXnD7^;cofwhx*gwRyblKW!2FH(-Cq^oJe{I36vIPt5U3d5#%y9ETj&Dg9;* z+JEFT&V%)*DbGb!Sa7})*n)N*+vqMF!3N8hFkwA5Za-u@Y#v|h-yQZNVZZ9^ugmeM zm|wT^%JI+f6E=Tij^AkFKb&{#I_V!QwgS;TT+H4hHbZfOACJtBz< zunT)@=mgz@H8@_Qep_G0`pq}@*uE*pF@y>GlPzTbIPT+%q$iw@3FoKe`6}nUbHy|+O5!5L!7_0v98dWtXa@cd`*<&u+>UpZ0iypQr+r_nrV z^X-jeq;vec&G&Ebjci`PnES!v7ESJx;an{raQ|f7PxS+pKHxsH=U==38t+p6cyBS; zOZ2&4N8G7+SlT(atsDWGnU;R-w&D>u;(2?Cl&6*ylN>3KROz3H@mU_TQ@I z9N2h^bZ-lBw7F>W;Wpnaow#DQnP}rer*D#Wp|`2D_50OL(D(tjBJFG>PTnBed}7(_ zrF$EQHgB)_k8nMu`!htFH?p#h^z?P&1fMg(|5#kn!5?|}B_IFPz*j~1tRB8=$a9u` zKM>&0VxG4$e47IU{9FfrSK#+5(B`qU@7snv&v^D+!*frM=Zw)y^0PG<;WO<$j%)98 zc>XY7>J#_v<5#P2_5W7!vo@Y0Wn4uAR^b%?J6?kmv`e`k4MVoq z#&NXRADibhVLvT?opBr*92fK5HqN8Uam-~eU7qXeJTH!5hx26LiHtapUCyh` zf8=rg?Y-N8>mucPiMW1RTu*j=HSBqw>#xQ27;&8@T(^C$<9uyh&ttCd3fH}jFKIZ+ zkJlHw+&6X~4L4+Y?lX&nJ9Zy(Upm~UQ#g8~mdm-Hd)(jcSxUF@Dr4G%l=i`=y~trm zdy-kZLOT<~96Gc^_FqVQ9p!W z_4=&0fKB{l2^(xr4y$Ze40GtPopsoT3GBha|Al?hQy9Z0^r5Y1$a>8WH_;v(vb`PX z!x8({f%ct;?SI?O1GIVbYj&PEegQ1-*&!@A?g7ls)cL5vbb<7g>!Jw$K{Z*8u>WWMrO$JI|_Ij-081nH9N*v5rh+`Zs>&yJ%W?gRTzSIqs>+EVGmw~IEfLh4CR-X=C+pZ>>zP5P%k{nc~}mAC#mrN1lb7d_a- zU)X<|?D@l;rR9S+iSedl|Ba%Jvoe3<<9C`BH)5(C+7Gx^J~p@l|EQUwC5F@XS2ZX)nR`vm9w~QAAjh>9N*Z4Q~YEXhH#4CwD(9c zI)oma@cc7`HomNf?*3nB`BvVRxB9GpTc52zW4+EA+iTlDA-%!=Ww6HnccII1N};_+ z>v0@w_-FIc4UWJ0>4fuA<9yk;yNL7Xa$YmowDZ1!&X4`SAmsWO!-VUm%5{{%2G>~$ z+gyKRX#YhRaeX$qUUO*wt+Dw6N1JFne6IHxW^f99?u!;o-~bNc7&_cf9<=Z5>*x?R zVGBmE15?`!a^+r|r3;q+K!} zZE=$-?b#ICyt+BO}nReRZ?nByhi$_KD2R2{2PrqXSv$OXU z$sRiY4*i;qPqpzzDg9)Xesn;;8qnXG&u-H{PY+Uk){j>MY3uKU!=;Buh|MEKn^)5O zM2Wv>9IO2NIMF{|OdF!jI~n3@(vy^4uHnbSrqZKRSpHP8f0~$`4$lw=__FSq(ml4v zJx00%SC5ltJNwYaE4A2e^HG&~TD}Q;(8j^re^c7*XCK=5e3$(WUI;W^sI@l^14 zRal2MuB(NPU<@s;o1oXE_}FzTeBxJ($12 zXy>)T`Hf*8me8&bdym%Qdg{eK>;lzR&K1)b0bj zFSu_SFoh+oa^JP#0NVJBko&d^$1qsqzMr5&+J!!}_M=TZVt%wv`_qFi?NbL%p|x)| z-o(C(8qprMXfMYwqFtTBgm!rKxNF+&fcD(l`G|JELcg%OpP=6u!<7D|PQNpP3H_3d z_bBPV68g0|{oNSae~D~4k6x zT=E5_&wlBAAvW+1#mw&6R!Lm z<>3;z2+oId;kIxlT=iKkzXCo1AA!r@Qg|m^^8cWfv*jM3yw$%PZR@w~*_rJ+5-xxj9-o0n+WCe@+I0aJaNWEDZ|3^ikLzv) zT*7rZ@5?&gvw9qNxa=q$Naq-v1rT2=ylxcnt?&Y1MSiYs0g=l(-n z`cHA@f5e5ah|8zqk!zp(fBM~J>x#1-aq$M?stv{Y8;Or>EN;80xOkSh!WHLkAuf5V zxbkh{ep`xHZ7n{rtvKTyek(ig#Ha5 z{v+XX_HzMT!Eu-mpWyh|@mj+1TgCC53vcFlFX#BrhVwWtS8<+}a^9ZcJg(%t&VaKx z-?KUYv$-B-zfZ?)CfCU;Tt6$0Q~DEJS9fxqE#kU6^1aHR#r3%SNa-b9uk((Oo^iOi z^iXkLAg-D#F6KVi_8`g~D9+)2S;qY{XFu}aCC=hLyNdg61^40HIm%zMySQ>UaSr$I zBDC?JLqEHme)nejVe6M?(@(FW z-+qRE{1N)~W%TpQ==UGM2Rwr>ScOlR1?S=)7U3rz!C%aT^UZgdA2Fud?iII)cfxsa z)y+!33eJEFKdtmlEvbp>&1E3iL&zt7k6t-U(;1-kafU+b%et?ViPcJOl4!|E^+x z7qb5gIUZMWeD36UE$8^n=6KriUC!~I&+%Wy`B-wc_Ip0(Z4T#g+Yc&z&i_Z)nTOF+ z&GFxM%XaOPbyApY4Z^i$QW)6=(GVIG6Vh!_lNPtAhDuXfu2M}4U8R~x-B3*%w}?TQ zvfX64_Q^VkF2CpbyA~Wf z`czTRCe*)_dYK)id?odHMSTx>E}Bm$eSE6upCJxEB@TEVU7q8J=YC52u)a+BCbTod zYh>5x@(DWJ+PBg7l9n*+tg2gTW;Vs@D5=VJ3wF+N&c93y(iiR0tN*@>i2#pYz}Pm+F` zn3bY`rr4e(rk@g5pBCepSbaw9&lSDTiqZLEa)Fp$h+T={MWXvTaRq0eC*Q^5@C#xE z!%JkhFu7Fr62^1c4IEu2yM%);%1+=Mu3`8kr5A7kd+2>x=^;$u7-n~|Ej_^Rz$N=D zVFWwQBZqdr6V89dbpgT z9QhsUL4LOE74>CwhV04dVtp#{*A?MAY_>(%U{SI+$Lr}5tsA> zaVxvINsPZGu5J|b8^jU)N>4x2)biJti_I6s4jnt9pPHguUG(aL{;WWUPUz>R=V<$u z{?FpC^_lXI=^rhgXK_D^Yfk7#+fOQg2-{O+XV8cJ$?`XF4rg!*3z)+R9K#p}F#M?Y z+o1!-u*v1`j}X`Bg(Z5m_^|vgdLlnW_Tq!$>L7RkesoEJPBGoGK%WL<<(us;uHP+& z=%UH4vMcmdi{9$cWrH^<-Q7_f?ZEc05z|+Rlb4ILP;6c-4z?A;KrCJ$uAVDKBe8y_ z7(PR6eR1+sar9(yy#?t{5EqXVo6W@4rlRAD>7&KPBgOC$;&Kyl>WJyX#Q34u4-tz8 zi|vEN04^R#KIp>k0rEF@;Szfdy}N8*VXt9g$AKfxqk<#OZvj)zd&qS(u;lu3t~YK{+#Dv$#W9(T=nSh`Nx%S!*hIw?CDILUnq8$h$HlL zah>cQ9i84J+uF_aHqvQl^FPXV{~^x*BSy66E86+7qjtT2j5tOYw@;PrJxh#VKsxO?U_H_Xu!9XfT5 zJ~drB`;78O=+Gs)CPHsk=%6+F$aGYO-kPG%sw=dgx)$eGi?eIR$yda1A@?4KHgXMf_7uDyKH+8ki0{-y`Rb7D7)A}%wH`| zOlQAXb{dEgx;lK8?9tOiA06$}4hD~vKSnoC9NDIqhxeB~*;uqV^o;g4{g>KZd%qX{ zMRt0-IQyNr{*^dE9}j8I>!0BNp%~pP`ovG1@5mlBqV*4}>t(lJ5$D&4Q*`q9a@oNb z#Wnqn#djy@D4SJKMY_33)n)B?I*S$X#0;j&IDRK*KCWsh5PBa-M(TBv-iu6_7PWmi5AC; z_K@wP6PE9mouuM?SFuO;ItlsTB97h!cNBvi#PBtu>E0>2cNNMXzeHSZE0)`c`3tdM zK>G8<^ts~jIryI~cFz(Wn4+het>h2k;u+Yme!6TAj?rTUdOF{d{OGj?UF|(d{?QiV z5S>?TF57*q7^4pp)6?im=b=h(9w<)kFM9V8+ku$hLyZ3Wf4~2@&A(H0@4)`MnEX|& z{v>+0i}mlt$#2E<*Vrr4e<6;3E-r7w|5NN+Nr%l+b_H7)klw?N?fsvTpZ%x5l%4!a z%zq=UekYDQ(c?PSf04cJ@pIi7<;!equ-Y&d~Q2_rc-*thjHk-CycS zPkozGFK5(SmwG*<-pB9MaeAJgCAxaZxODt6&VzQQpgkI0ApdGE+WRo~8?vXZ*#A`Y zX@A4NVbgA}XwS0;t6gtt|JTG-x-I3eM&gLL&E#dWi`R%L{n9#-9jD@W57FXKEqd6e zKMX#i^x-k$lzw#i3E8XD#MxP*N57n)cN6+=i~ALqD&K>1f$0B89RFCH{sb=9;a{`e42E#U{tG(}>^c4%7H|v`82^75ksd$~uDQ+y%%N|7$|Hs?YdfYf_k~OdW!CD(b*yO+3I(IzFwfKlWSD2{Z-<$7K1Cr70*r1 z_|W^3{PWAi(Oj(1)fRt`7;jE4QhITrn4d4k=6U>FfpV zgMY02+0o*Jb|g7W_TUiwv^VvBvYWlc+3sRUJ2ij1?C#BC{|2#%#0-7iZ7Vx?fjCB2 zXIsinJ#nE&6vS{SLLqOZ4*c_p;Z&6ysY-zeTKW5^LId=X%+udn@87 z{blm!Ul7L^iPO92+zOp*{fg<_7M<&zqU{R$pTUXj7o9sq=N2E6e~7-#(VrG?ozS1H z4^h4eaU;!#1{-V-1%xk$=_V9C}>1Ug#GDJTQKcjT-95MQon4Kl&=;-Wp^3h%tC(E9m zBnHQeSs{*SZ;B)EA1e0fXm>yCv6#PGT)jiI`Q*VHWQVU7qfm^u5y#IJi)V=Slg0Jp z#ON_%>4^OU!~p%Ap`Q!d<@~R-+kX%n^s~E^?YE-Ek7r+%?OiDr^amaKIQf+P{U^o6 z@!}GF8`Hl82g^T02Tu2t?a&|j?~>iVT^yo+mgtueI%$ahOX=5qbYO&@S-e);XE1>& z%wY+uyKsta`R%=LjZRA70M?O?H-$6U!Hj&7?U(bc?Y!Th?blq_g6o`c-7b32^zgt} z{`P5N@eI+U|DQffcKvLzLZ`*(*cz_x!UlT=r+2Z}W}}1a=V|}Z3&a@R(V~az?c`sh zBQxT9!&l31<=k^02XBjpY6AKg2mJV#r}A8>noDe2M7;WjjN$ zyszlqTbvN5uF!=g@mLSN82wW^({yw6N7)`avqX0`#Elm}K$m`3Ous1x*F$t}ie7Fn zmB09$I6GhTJ|p^{65BJx(dpvkRI&b~=wUaf;U|C3_UU=@_ZNxd%f#|3F+y*T(Agu# z0UmMh-maH8eL(s2_fk3blyAy?nAm+{{NhosTk1hV{Vd<1?bE$PoBuQ~WH+aa(+kAa zm&NJ^aru2Q|Cu=N#K|4v`d+l>4-&ISi}@CCD=~SYINV;$b|C$&qL+%no?^YfSREp+ zbNt6(pMXvL$fZB@i8poUDm}YUY(6jcmx>)ad48qrkp8?#`If< zepsMOO!p1YgDLvCLMJZJjq{&q{}Xhjdn?C-7SA1`M_p+4l6)l$;DY`6aBRonxH0F^ zbAB;8e}aBWO&{H)^QpPskn3Mi9`OxI@4qU}(Lp8UIJ-*zhVmU=A=~B;SLmYkT>gOj zl72yU&iyJbl5IN4;*144sYE9==p>K(U!JY)LiCbzrfla7{G~WO9Y3s3lU>3J_R!`5 zhio6QzmolX9CwLcn{!?^kEi6k?K%?br^9tt=tA#eokvD_%rBAMTK%Qm*2HUVzW17X z-F=z-=un&glW{-1TIn_)DB^y#Fu7Xk9W1!7(Y5kB+;7vr4bRP#`e5@vOeYuUWyeUq z3Hyod`QyA&&bzhiqZ}N{C%8c8QShAml=F!4FS#$Kk7uWH-k%g}bn^HUvWHVKKT&Ls z7j53w6#eXcO#b9ZaZI}u9wxg#L`)AB^ACvjeyrG2cJN;KPSL*0bz|A=%gX zR^sf5V&jT~hmn3?vA>&G{zL7w&0}^}va279!|#gj*ThvVCg|nad9rPN1?NQB(<8;n zA>w*J(c43G-X%8Z8~cuFjE=Op=Y)8V|6=7Ip~G_YnTu{)qYpjw%N!j!r~ey0RojP8 z5nFUk2PgPb^4WX)xlexfXYczX^yvf!uz0%iPss1G{gnL z{5B8Q<_%0a?~wg29QOA}F?o!*MyCbnfq?j>W5;3t6VAuy{8sF@7ly`w{ zTyr1h+?NV{xkPUU=#FxGuJe^J679a*_@{h>`~&pu6gx(@B-E1);}rHcWdFfSw0-y@ zakRDQaGtAY%ARqb60WJ7luwh_+@)aLb zdT^pR<2doTvYRi61v+|Q*ZF<<+grsY^Hw&*rT;-X;|>4bx_^@giyrqq;kg(wPRv84 z4;g>O@0M-fDJDnDw(ld73uI@Pi^bQ(c`JH97oFS18r_@>)IK{8roDa)d=h-N*lsH( z^as(KWEZ=LwvK`IFY|-s4?ZleKO#EEi1o*@>F*-?!yG-cp#QY*qq6grzd@f2&>{96 zS4BVF(QjAu;~o8aML*xu?>Fe`1pQb+d#}C1zAG)gCOwB9EZFayN*za znTGS7Um<^iUb64#eA8Fxjv75WwsJtX6`$4iYjkLe4rwUI5M8)3eTfcPo}%q+9{8I3 z(Vry03lsFn>;(B+bjgzYXzvZ;W0h{-OAgT~;ZgEu9~Eo#ihG3Y3f+=YUxE+G?;k39 z=$XMpc7v`-sAu&7@~;@L_4~>0-!D4*h}mAEjqj$!7memG$ycylx39LFvH$Eq_VYn; z#rZ{?e|EV18P}O`-4W%GQZ94!Tu3>(l(UB(40tXg?wiYfv~fknI3t+pcnSC4Jy*8r z(j~Ts?zeG^OTFo#%})-gSMy5y8KHOWJJRlA`FrYR$@6IQpEK;7^a1(T)Y~!ppK#oW z^B!it7vC}qjjG49YjWbvv#SYK251d2|78T{`lPg z!Jd@o?(Ak9tC;R6u3shQFBV776Ek0|9*6%CV)_6$5Q8=CbT7_mwRn-&5%=@uz@(bc(L&&^5sy)W43=H!1T+d**9)(8F)@ zOIO%2+bv=Fd+l$|enXBk{*(M8;$ky&R)y~J=--!|cSS#+40Rm~u5XE6i^(@f&n5R! zzWRP*_yEXuYvP?5y1PVgkDj1>Yjk>rejZT%E%&2CCx_g(8r>S9Gi;u7f$ejjm*n3t z-x=Lqv;V}#Bk0C8xxebq(4L1U%5E8V`LB@eyj5K9A&w8hf1KE!A~3!{qW>AvFGc905dE-5Hx%@Drqg`- zN4L~|s-UHYbi(Rgr0*&=?+~N6iDUGGPyLvq zBb*(SUPNN}O3~IkSie-Z{}Qp^PK=;?7rVxesh2&>ZF@LkzqVeWF~A?e3XVe^w|bd4 zdAYdYd^65JeVzR28^rL9V$XG_ltY=Y{oBR$E@JjBF?zRHQr^*?_|f~x{<1^vTg&sb z{1ATbvy;nCKLV)_A@##QO8(K&;+T3>Q_t4ayTNfvub{fXU!hbFP&x`Xj#l^8=OaGDWExUWC7`<7v_+pP?>I)E4$!%)pQ)epedX?y+x2E*x!^`DwnD^M%*y}aUn+4yGi zBK8OUZDbF~SMuI_@htgmUc-Rng`7u<4sP$Ie0E(`r}C+PE~b=6`7PPeLd+<~5%UR_ z=+g$>nxJ!QbfL{Bh_EwsV}7>wH-iEGK`H<66tP7&4vCKz=tbvHr3dK39hyER{@S0U^ttI*7{CeX4f%68z@L$CNt}3in)YWp+v3SFdOTsA zkYm@Bi$i$~*pK^h&ihDlbeI@_P@I22obD$&`;rdROm;{)4JgM6Yv(=&EN28SA3p_>S?NnDdWQp^NZdhfA=0S`haNP0XHYf z4$py?iu13ENh_{bV)S=$xDoBKBgT&x=g$zsKEHT{9J$H5pg-;XY>zI@U`)F8yEXmtl>Mdj+aCSy3LR0JzCd>@ zInR`ScTGQQ^Ruf1RUT_}XGK3-XY#vnZv8H-_f`6met1G0tDryb_fUGn_`{=IN4v6L zbg4(bJbt761MbKAwXy?rT|s}n*k1lQx-g{wwsiu6=PP~vY_aFQkLlOTr^r8hl9)YF z?6weVSiuagJf-*Of;sgnew_Tn&EaNZ@mR5hK7NmUw%vsNOxUl_aWXiDE-cA6gtp$d z%YHh}r-u=K%Rgd24cE1x9M+UeOgT-T&UI`hy3Y~=%5^xBZQs+5pCfyMj&ivV$=34w z+lU$W%f=N2&td;6r4PC99pjSej`EM*B-(dv%bm&p4l#SD*zYDLyNi>t=7nLRf|TbxYA0q-qGhss{=CoXmu zE9MDiZ~E8S%#8he~(Q zrBifQfbO;Vl%tE4Z(51r1!7O!Fo7O)V1J(S&7cGAJ@W(|*P=%(e!0RwV?UFN*w0)X zUM+^``YF2K<+|23PM{nL;?f(|7o*&4{j}uaDqolQnytGwemwU9{hT~oc7hHLZM+l8 zKY%m4e_P8RqLT-Ve^!r?zemSgJbljn34W~WE59ao#Cu1?RozqN@6k`=Bguz8tI(lC zbZLuDbI@Zk`pkt5`Yk;``^hGvd$<_0fA1KMQ;0bX(aSCIQ5W6Zen|PIoKL}iXVCm> zbYX^WZn=&D`*CvZXM}E?ah&N<_&Ki$?4UE3lxIPGPSBm%CEC9I zq8Ks`Nw1MT`-(W>c`2ZM=a-RheTDL^xql9E^BK?4fOvVpd6+IwIKL43JRdIkY`dEM zbUdFC$C;sGrS#)d`e%p!&DMo&ch&w} zbc6j@V#D>kS?M9 zx#+FI)7b8*V)!J{^kKER?1d{9j}%9aIC!ua*nPc^>~e5z)bzvsUsW$U z`eTQ9R>OEJ{khVe+r*YQR}OnR-tA+28zEvd6y>GmdBf;i>*8f6M!k z(cfiH?+_Pviur%V#&iYO+22do>2dv|jb(@EkP+pxg28>2ZtLn!t^COE!3F#2VT0di zd;7mn%YB%ke=RU{W_YVC(c@pW=lK}k{KU4l-L^{v$ z7K7J{Q=Sitw+|TC<%!bme>)}5-vYh9 zhNjp?AM`vO5UyQZ9M9rgRR}N_`c24vG17& z@6~qkZesW@(bkt<+4O%J`fK%b<6g{o4?Fvr?DqR&biHUgY(+m@qQgSsWTr>v=#({#(J2`^ z#Yd;i*=`93aDA+fH-+}Txgu^jnkqdeZkCm@J>qy1bVG0Y=0c?h=$Zw3CiuGi1LChX zpVRq={66D@_*b%%Ka0h`#07C_pSXSXFqQX|a<{m%eJ5DINa^#JiZ<^eBOccfpB}M& zdSB&p|EA-4w~7_#oukj}I=j2vkLIJwZ@SV$cPE)4OH$>&>sxFBCZeW|GjGwMe{J(xlty2cZ9KGTyR@$Cim zB>%MhHg4-K;`}cayDy2h4n}*e>^VBOMMtjfy~;P0UcnAd8u>TG^}i$A?2;)wTH1#xKa398Q>t0r zfa5{?o^VPWDBMTsL-e`*$1R~Bvj3|U^w*|)yB)P%^ajzPf3MNM4c9d=9q@9_<0ayZ zc;A#bV1vG$JVWXAmZHsPnQbB4)^Y7Omu>%lv302IzlXk!Q_#H?da0y8EYVRJdf5I~ zHb!^ZdfFbkF1;tmM+e(F+%@+(>vZ1(bm@Y5k|q7C#jA4k@OY{G-jBroX81kP<$bVE zf85%l-?F+uC`c%YF2B#dYL=&~_89H$h)_ z|B~PNFZ;a*<%EuQt^Cj*%lj+c#*-zsOSvVe}>ZM$+rLWS-d+( zUk}i2<8761jGnV~*sE8`Z~qsZ^E_p694Xy@wKyQZ{g0$ZhvzVX5lmqVXRp+L8usI| z|A^y_(D5y_aeldjwp-8+_;12y{J%zbuhGBVdzC)gL!86a`(zipi&OH=pv`M?tex6R z`4)SNEsXHndYtxu%9-hM&S%c~4c@5jXLg;T?3#9|-BR}CvEt$(VoW_uXb+OVss4w* z7neNe-uGqaUlqMCi1Sj6juicUNq@UId$pJouk?s_R*#ZDy^q+^udV6tM)Z^Zm(}0Z z=uXqAHSxdV{Ysy`Ta4c!u67o^M4aLec9Xr_LtL|c^a0u30b+q&>`VT!xZ*g2cgnWo zjoE)>{`at-J;ed>QHz@voc|DAmmH&f_C9`aCfi*oF3}k=I>L0;8eL^NWBGmMw{gY< z-O&A6{^{Su;IE={yI8Hn<&VS#<)2-LP5dw9d^~jCg!pH|xS_RiMxpIiTvvkKA1nV5 zJ?We%yEsYo*iVN&gw+X3U$cLYaZbQ~?Ypz|X!ZjK#E%_2KHJ%G7aY&xxgmOX1iO>9 zzk%7XIaPie9~EcGt|^!HGqTs86^lx2FBTof7Y=&S;;12d)T8_>bm9sfJ8HH4=w>mw zMO^(rths+R`fum-GxBJ^KdvzAM^(Z9VGXm-5?p3@-IP|0mns zUG0s_xYFLw#C%VYF#l+TejcKq3*rO83EJM)ou7VLc8;#`ek^;9&T!DpDgCzn&(EcO z9`2-exTRmQI89DJ(9;jZdn(_Iext`8p|9-<3FTOA}0u}A1+n?D$Fyq37toc_+I z|FiY)tbcClSM%+)-x2zEPXF(r8)i>ediq4M;=O2telfi?9VmTG9H$_@IqWH4^jSwa z=EO_wf9AuVDqn}*YZy&u4>E!zN+TQ* z=iJ|p{ndZe_8IrN_^s?5z1|QnPqBOILH9f5YuGL#eqXY`fcmretMV295NDj<41M3< zTlLU+pg4P&IAy$L@Aad{$vE`+t0go(mY4Mms9M&1)}tUTyuICHY6_=^46s{W5LmpwDex~aBHP|oVSPW zZ+Ncf(AI%#xK0laVMxA&@j=e@W*mRRe@Wk{;|+-q574y%ab){1d~Uj$cCVs63~2W< z;tIRXaWN6chln-yl5~4-*U>KK>^I@~A#sd=^0xU{_FlpB+5cvu&6{4|NA`+w zWJ!G=QeTHZQ9YdBDAsdqp7Zu_+2wo1_;rweX|TC$7v1drQT?Fo-5yv}|{x)&M^-WUQ!5*Tszc@HtoSYzf#8nIQ=?ooe-+Q@dD4)$= zwfU{9nfx*O&gPXAj8E2|QhIT=SfUFfXm&t)1J}^D%gJx!fVkBD=IHGh{TY2y{>3R` z3oHCF`Dbiz-@Dazo}72Vb=5F~9&}+26Rv-Hu8wQ-a_aMC=NF3MMPm0kadNTfQ%}=5 z{x69ox^H@|?Dl$biSCQPBRl=RSo{EcDf;N!*>7dL=-L&!Hvbp?|A-EHa78@Tz9Y5u zj+gh<^X8xzOP;&QMm&eSr&!&o{n_`m1-jF|tF6()qhBgt{xfm-Q*r%cu|UrkH_6U! z6yvYJT1>tyR*WN7Fvg!;K|1-z=;)UH1YcA7tP#8Ki7n%Yh;exNJNbjZiOc_rwtn4o zQXLRPR)Ko6~N` z#9xN!Ku3S&y-xcni7(AwF597htLe{87nk&l zbNY*txSWr^2+$qrM%qt}9^Rmr&@nE0Y(_lO#u@cZD#zswqIZ?((696t%ATVehiA&J z(3duzDbb_d5lXjppk@cip6x4U+|TZP_}?Q2sW{$6^b)byNnE@^9K2SXyi$x`CN5tr zCfkam7l||DcCx#dio;ikW5#LO4zia!iq)G$pL%HjuL?Q8>fK6r_Ys?km=@yv4AJ?# zSW{1#>ouUIJE=XeSAFZqG|^=)GR zJFz0ZZr_i&L)G&IIy>h%u=gDSdMe&R`6f^2xj;{@7&q7GTpxWl;rVplr2H9-7+*(k zW`A&me-g_dqOYf~mEA?+lJ;iA^S);MYu|fX{5wbY=Fif09`W^*^IvT#fBPiS=EH}Z z${s#ijNtgO4~4%xb9$>Zf;({I~*{~0SQS#DutPj;>75fs@ZG-9wMKm&?x3 zB{^|qn+H4kg3>4G!71ql`6ITUu|JESCg*Fr@YCW5y>9FI8Y9jxC7wP(XQym8M9&uJ z*^cXQiQC$ISX&3fj@y#%Lz|Djz+PUU^RoF5w%&zzsr)mz;<`-_JNWHCAcL!vKVOL9 zH^upP#PYkMkA924FMD;1IJs5K(Vug4Y5#Be7Xv*Hwmx3{2-)@KV)0}#c)D0UQ=C0p z%$_5zpC=AqC`Q|e_P-nZ9@PHRxO$S(Z9dL)6SjMxxV*PG<2kiBbV|H=`X`-#jXn+0 z)r+5S-IRl^bK)_Mu=g2b#uvlul)r(NZgJ@~<)6VC9bK@$*|*vLN8}D$(Z=B z{a?%GSFD+5y#A23^A8v8|0Xt%d3>P!jm4>Vlbs}@t$SM0PdCJ&a{BKX@h^{leM)~B z5I1hEA9xV^C0@Mxm##bcli2-IToL~reqHwBOJaSlxMbYXd_;El0WsTM9KVfx=+x?! zvTJl{xwY(;df)o8lP$!2Q*rQcaq%Frxj*Um6KB{1>bdt|`RCAKyMlZ@^(MTh^4a$s zHP5eqhw54RkN;(hzy6Q>!;Q3k{Q%L{6B=>eL;6Kq*VO)d8u8pudA{?PalSi=i!u8> zT%4RD+W&dGFUt0>701_$B|3Etr_k1|ZEjG$0(!7ydk^;L(Exh^W6KZoyX>vq*MTda{qWJW8~6wi;XD3Lia7v zJ?%>Q=IEm3Z)Eqx8Et-S_!aqGbhWK7Hn~v#0Zd>4r_k1OODpB?U=Ph-lfQ)KUlA9! zb&6xkV~!pkFdj=84>X+TfN_CCxrJBg_z`i=4t++sNUOu?waSxw)M`#*UK(;7Nb-w--o@YxZFb=y+;go745%?7PngOAb;}; z(zg-UTZ#1+V*FS!dW<-{3#X5gzeJZz9ws|~h}b`v?XXwaAzYb`!OqxzM0wPY*7mLY zzwGcA&6IEX6w&^dxk9Je`?CCPN*_?}i$i7C zCy6oo*+DPPXb;1Csr__`Lsj%k!$|&)esB67*<<>HmN-j8ykoqt()+QPqK^aOA8T~@ zg!qlkvnXlDXXy1dVEd665+@napSjk*p_AA5RKD(Sy3XM*#N^xJ;0kf|8PVp0uPL7u z_0#@$UTv>@?sG(2_ov)MwtpWnTkCo8|0*`W6|37s`ySN)mTdbTJZD^GZ154Tu-`*?HUW~5P_6_uDH+s&ard@QtseHjLV)P5_+r|Fx zkn46BN0$#!d5n1uUG#Gk${$lNo&9Ccj~4C!y%G1ty-5BN9Xb4x>^1iMErS;u8p6ed`mcm7Kbi5@AYGpFWE$FxV|;xh1tX9 z&mJlE&|`d_aJ@^eb3}VJ;QAK3YP)zZvDjZ+A0)aT5{KyL@d>iK)5XC|%s(sII-AV} zvS$~HRV6mCCVhae9-gK2$;slV5QiLpzNhRZ;~ZyO+2s?(8RH3?H{|`D`t)1s#Sg?K zAJ#wJYrr;_6t@-m`batz6=N_MeCa?Vin3wf{CO z(4F&>wI9=2{*AJI-k;CWkMUCe8od~yC+&Y`>)$IqB+g~)3J-2#|6doEUu8e&u@>Ft zF%Q7zANZ#zUvPqG-=EpKW%a4@FU}Ti-Htiu=c41vTa{i>o&(}?wl2W{{k-71tM4j* z&vnmIl5O(>y5nU}P8HKq9G)(&>3`xAWQUATosY`y4ktfM zVGc9e|LQ}^H$L=#*Ny|#etAVdYUh<=mv7eg33_Cj%J#S~_Mg-V z`eexc7@-dW;&std+husZ?N6Z22VZ|kkwdhh-h1%2emlATJ)|J zhtS7gqN}^hl%8KKhU|CpY1td*d(-}mXfGn38+RAwbEp?f#!vQMtbT^l7hGrfSlRuf z#Q7t|414ex*|{rLn_{!wa5LEswD02^@=c({37XB7f9{FtQ^e8J#gg_qf3EDo*5YIv zG2*^dFO%KAO6+$K7qlx=^!Z>v(vK9YPl?G@qJwUl{(*e|5{CnxYvQ^#AKUa;%JXmk z1@Ra++xLJg+LZ=OBSa5s*}yoZM4nr>fkJr+0UQ{`Xn!+9JmmPd&8-=N?m z+1;t)@+@(MuAZW+Q}l9wzS8saMEl?6i0!=7~147m{tLKzi0t$pkn?xYwIzDFMbFv)x(nKk;KACiVSD=?v+qiniR zi}v1pLV3>6&F%h5pYJ3#&ljsli`jqmJan`VQ^xNWr!5&T+x#tyXVk}OyU|f%fu8Nq z!OaKcpY9_r_7Io5i|hA^#hzlax9CFiXJhii`ChV@5Xe0s49NNcn9Yso4W$&+aV_?n+gubqM@3efTo_||sys_~%Y2dBhQ zZT*3gIK=>6GyS{jbMOdlw|84|SaNjqoxtKTRATEZY0|@+GoU z^hSlgvG;ZBW0bzyTZ}1>{>8Ghr;5eH#3k+6kn-;t&p6m?+Knmg$m(}0f1B5l(jL{c zPqsew@)ydN(|?rc+4^$%ee|%+dz~?_#MUVrVYdtA@8JO595n3zJ7RZ}X#dBterv_? zlkY3tLnm8&+3How_{7#BX*=b&_>jfXs{5(j68b-jb1a@DfB0;%-A)X45Q|;JbRThg zsOW!8bWajz-1qbx(&-0BUy3nUTUHUZ6AKLn5HSPM4 zc?S*shCOe~`)E5`Kg;Hs+5CgzyE;#Ya;$jHW|jQyXT%u&UDIC7V2a;#OMij#C+L$Y zx@CTa{5|bV`F+{$5L|Z4or9E=EZ&TV4pMK5sv#s0aZmR3Act1Kt zkK23I73E&jAG!2TA;+DyoafbIHxtWT%n~tpCgeF-@%#roS3S@9;&Xa_=BM-A9U}(l zPy4@6iY_fPrDrhTPxg8ru|xOf@0C5=O|4z=6-=n<<$mgCZ{{lK^$gZdOxvwGZk-fi}y;A8udM|jgY|nJFHNE&#S}*@f%xj-n~rz3I5`0*)`j*xbJKFmt?7Q`){%R zw`pL{%cFJv!zYU2Q$=S>aqj8&VtKi^_^LRjomtcFEq^b+ zOTST|Yc_mu_aCJXIG=*^n?F_8V|vk;}n{G|NpUG#H!xcrk3iV-^6*5~fFlfQm~IOe)~u5;PzdM)16qYvF{ zD8DmAe}Bq_=hfcB#CMl})~g=Qc}}K0zoX}~pSO#Xqr~ML-YR4*Ir!8rfZvT_($>&3x_fwJ2 zyG8js###2?jGXp-M0;*=g*okQ@po-!?QwN4oqtYyy`bH*_`b_^+W!<+PgnlY3&bGA ze!b|wL$rBy3+jD(sQm8H;^LE{t&^30P4<*_X3X=|ql*IWcg6jmQ?HtrsD9Y`NIvx| zdWQV=+{TZTy+ThV=+B(@N~U|gyDOjRQhVRua6ZjFm7emPO&=vYf3jFouYKkrM6vwU zuHs@W+JEEhe^=>#@~`$1?f)D;+cj^LKj1lBa-5iQvG3qp)9YMc$ao>O@yE|p&i>8f z>_#!WS~Q)Vd_lG`yHxi0GO_<6{IZx|N%~b{4cE}-NrvB0dh`SMD>3=2m|OqFeag_u zHlFCMoFA|9aEU)#oZ9|F=TI)u7Roned>_*PO@FN84Y=+_DSNW7=)FXYHWBB<^(N?r z99`n0n+GTAxpF@!#^~VW{j$dg;3wVYSG4HoY%itP=;bVx?V^`^^m2#}UXVWBjs2sG zE4FXZ-*b*X_yEU0SWFKSOLTI3rtIVru|qFav_B=faB&}%NA?7<2*jS}KYf?%$@@iH zCu8vu+1at;@Dt>t+=sNw%{lVN#Glru%eHl38gzE@G5Oc%;+Xcu%j8c|_VYS%PCq)@ zg6-&E7x$Mvr5$(vqU)diQcStuGurPZde#0<~5i^0Eies&%%=QZFwhd)sIoH&d9pDbs*=Uu6E`(Lolzp?kA zwq8(wh4R_Fqm=C{)8W{2<_r2?Wxwd`DdkuHS$=Pz^ItPwu>YI+kCVTr9PB^M&UW(K zcxV1$**4$Yze)BG9Xhi18C|`k-5+kIb|8jx^hJC>`P2VsKlMNUml5qn{Ac;IpNgX! zuxTgD&&m!i5?ge1LcYbfQv~v^@Eija=)g3)AdEaO`k+LxC8 zYee}L)Q2_w>*Sp}zv8{(wY7_-BlN1v|z?0d};v@~=3){SRooll;l+#O3?M@@?Y!4Wh^O+WPG_|IsC0=We2W z@k7L#`ZwWu8}R(am#BPgy@4s^zSxWVvXki2uX^04U@Q4E?D&PUZ5^j@YuU}y*xnTj z;u163!R~goFE&rGC9Y%tVRUHE6WYlPot*tf+u8ppea2xe~JWNsJj!+PYIKuFvYb^J`s4`Ezl7tLXkntZBDw{Vj{5B(>7RFNqV{pMZYC z)(;M@P$p!qi?%IsoP|UGyesg-L{LK+!i!QcxJ>84tUoONc<8BYVSlwIK zox0-e>7vc^p1xl8;9cVA{o?Xqu{>PN3UNSxHJQn_=YCMhPH6|$=gJEq2sTPJ8t++`ihKTO1K7cr&XY~Lf>$6oI&d+{2v*+wk5FLRD#|6_}} zf8m|FzZv75nto&aL;0I;i|N-ztH<`scN;g3+1|d}FK^KPEY7`VI~V_i zc=(j~&&c{O`afI$W&Utor+rVIGJbHjkbm@CG2TI}sSnlhvYjuG{vFZQ*RE;bm+0i_ zzm?wiV)Yl%=GV2nr<(js{)qkAx`8#v@h?((0ed*6ep|e*Jx%#so{RO_vYm@Xo1gDA zvfEZPy*}f7dd|DOuiCeg@qxt)TH3u1edH2-6rBsi(fQ)A61&fdE9~+!vWpU)BrX^a<=mH{ zjg!#b;ar^jQ6D?K|QCgD1+K@*K9?vVU~*gnDV?@i11p{Rf~V zpTl_2{x`B>d@$wxO^ROjsi%|sYdqGD*uw_eZuo?^Q9B+d$H1SH_UG%F0nj7{vq!Pr#v?`I%>dk7<^B9 z!T*97pCnGvum0h(gO7+wF53KvA@N`PAMBL)_24w+8=N7Q#D#4=`w8)Gi}y{5GrE6N z{+2jua(`V%i{A4dCEMD8igsZ1LizpIiZ<`6+DmrC^X?H(a84lK8Ekj1I7csxxZe)_ zn@j!hDc|Cg%0E0#wC^Go2g+XUDcX8FJ$llCG5XU%m)5@W+jZK!vygcX72_W7-zp!M z`?z?Zw(B1wE}ts8l!wdxU%yuV$Vd|l!N~W*%8;d{;RIL|FxJApSJ&w4Q`abzDi8y zV*Yt?&A2OKK1WX6+1BZ7Z&E&6-#@=uc1OLm?~W2|)6e$(O+b8l$@s#+4V zTdvFFeyulCy8je0e7?ATjhMVobdC|Ne%g00F>!+I$E5$1?O=S1?Dht6eVOQSzXqR` zy*f`Ee@2|1g`av}oFqFwUYtSeH)lK-3H4)smGadKF>J(u{~gvD=q`WKh@&FCGplY5B4LEYq3J*LbcmiDv7gnR%GbSH z9PKL3IsTk}E!tB4^wHw@f#ULR*e47uoB#;(whueu?NlN6fYmOX@{J zeMrBm`)dD1SifI({zh?)uC?!_Q%8P(BXN0mF}=6gJ`DSDqQxmDf$V7{j@}`z_7n4? z#r{ljd8ybj9;j$foL>HLV_nbeq2iqJudO3*>-4N1rSviM$QM3b{^2HK1lQ1qHorck z+=}}v|MY%hgAQJBJ~qF#MDKQ;&ezsivv}ux$#v2`PHvKI-|5+Z5pvqC`ddmLldrs4 zcJLFiyH$)Rr_s-47rzs2KDB+1GT=F0a-O3M7wD+LQL;xL7n{?>p8g=4 z$)3^w&#*(1B)-$E~3Dz45GUFHkh|4W^7$$yp@ zoFm%2(-m<+n@2kMuhMPZ#OiT6kBsxN^%ADr%HO_1wDGUM6E@F#h@P16+&k#i=wRiG zxz8Q&dC-qs!$FzAYv^xAuR?4gWoCl^*|0wDkuzy#Knp>S_ERrAM?2F3)*?vHSt;wS9Lv z++O~COVQTL^zSBnOq|7Geqm4fROslKc(BcD9uOzC^_gbq>k`J)cbEBt8S@o$-h-l)U&zb!!uXE-sHV&mjxjv=buc`M7%I)}HdhRZ|AS1rb zdugdh+Q$`d@dwe}RM+pI|MDUB;bL`yXyaC_-?w|a{KYrKUL_8HDUSXwX8#hs|A>o~ zqqnZK(n>!KpC{I9iplfEjuHQec!5JW$M;r|U92jOpCd+p)pgpRh{;1@_&sd&eRzlL z_*-IgGyI(B@tw2NWOq*#Cw#XCU0w5@=7%VJ!TYoK7!V#r3eWft(LYJH?T6O+h-@3D zGWxje^i#2 z;Aq(`_2lw=+4f&4qI_u4W%l3PL7z0_yORFUiu7I_s{1c_UkUb#_er~@roAyDzn1UN zakf5LhR*S}mw!Mzqf7p;R*`@5tnRz>N3lkyTDv^GOa98*@04pf^|-UP`KH})@;_#jL4-jpC4$}p}9>gd8WazC0^~&gQ&cpLI=*Mht&dc$( z4_(alhWjhr_64bU&Xo5Yeui-Bi{(|a7k7xxgW?$7(I-82DKE>_Ngr#8J^mvE8_FJ$ zZc=o#mBSU~<=D~_?W|#=>)HJNkn4B8D!)g)YWv9act6Ds3J@g2Hqj|E=A1b)Ml?ocFC_LVmY(f9-$JlKeeCSn+J$xXt4T$?xrH3h#eP zEJ^>ipJ8#e{IPux?BGWEQ}WT0_p z+@GyeYWuS+H&8r(3vsZc=S@{Ok3_c=XSaycOsx2SFgsiJobMR(z0>#0-yRE35EsXZF5j_5PY2LN z7ur4!Dd(Fo4yO8qj(12Wy^qUINiVYx$)0fiW;><`J%adqi{V>D|5alC5;3Npv2h(!+8NOg^*lDNc7Cnw zn&%IBAEsvq?^L++2C>%{XPb%nhNA6160U;%T(L(v9MTUmro1nyH{AcPAI0Y7SNL(8uK*Y!Hoe?ABrV>YgU$jMEGE9+4f(^<|Rk(mVYr6JJj#lhh+~> z7MoMW*%@MWju>Ak_CF^Ej!Q{tg(hd0O`W7|G0{zzAx@qa z%ZJ4J+hTKvXgb=~Z<$a&**fm!2NciNJ1_5kZc7Atj`Ca^PcA9SJRy~uf2Lw`Mb~i z^68JR(bX;E`)yybocEldPbdG?@wU&YPkB-^zjlER_R+gF$9d@9it=T}`c)R6{{#-< z*3NXSeB(ZB{of(&g9Y(j&eOn*^97`rnXC6TB)=Ba3nlr=r5v*U=xx&Y!{|LS9l0Pf*Wy)~@*Y9$@_F)}ArQ8aBD|`4?(bh4t zaxrP;k5*H9vi)Jll#4blviAaor}+I%Wp~l1oxbc2`k>fVcJpr0r@zeR^R$eoU7)k( z=phHaHL~%x=&lLil`;9!U0a;3Atoz{%SQL>ao^srW&1x9^T)&joz}U6@JmJee^8$%+hJVC@I>PA zot*t;_xBYWbn*aw8+;f)wE3f5+Fv$awRorEm9*1bzLSmXNcdjO!HO5|BhCh5?TJB8 zwD!^Rf0f>|--*>DqDTIWzJPtXI6GGyP>(ui$(~TITD~3LE5G}MSpP|M*3$JS)CWD% zXOHJ?X(x1eD5aFy-loc6=(R{8)Y}wi=C^*3FoP4-}FZEhvbur`egVD`SVpo zn?GRtC3H{M{a4f*wqD9)Po57QXY-(XYsg=sgZ-6=hyG0Y&pUrg^@5G#vwg|u56fSE zUo4nMGbv@K_Yn@w?+|Y5f-eZ4a=h*HQ_^o)&UGH|QL(MW4)b)z^lKI~`LjF4zRiCp z{)B$FKI0T;Ust>(@k_=z#&^kIepRgD^c%9Pd&G$I+Pqb(H*I{rLp#IPrLA6~_Zw^{ z+Wh(69DT_R4t|6m9X(l1>16ss($jjPv!*zHuGmFy zJLo3+kM2IM^Ytsy_M4knJ%%2QxKEqkH9L^|fVOUCk91hPQQ_V;V#WK&>Bmk6^4t6{ zpYwP}%b$E$9MR91eq45x;J;9uXQJ)*Vf%PB*UIlxZx5)a?Z3>N`Z~Tv@q*jM;oV}& z`xx+kI#0@P<;W7dLO)NQQn=}8+y8n*`DOjt4)3$H_j#0#s}2(<*dy$4C;21Vxz?Ut zl8?KjzXYAseZJ!N-XP|@xA1GS$LNpjZ?bJY+A-zLa$TjDit@SMN_N424Cfy@uKlAp zVEk!+8^z10U*^<5wr`tvmcn!N!emF;>Fe=R{&jrW9dvj72VG}*7uUU1^gkxX2Z)X* zmgwf8^#?z$d>oRG3(B(@df8=sbcEg=qdx=uG5R-KS?AAr-!*nYdvWO~JRm&d`-H@^ z`2#jSe~G^JxK4=OqO)h{V_Qeo#(`AyThGzcLyk|mZ;$7&@hjFJu_XN@eck66{hX4& zhNMgDPqujC}*Z;_Ow}^aqFA$?m^K%(fC|#4llo ze&sIb>u#uc1Fn;!i+fzZ_^a-tS&H=&V)A{l{Ej%gTa51_yb$XziQVhO;uJALf7R$* zpZD1utMCThH|KrY`h@nq21h8KPdR7nlIOe29}L8NCvgU2IHr7SwpV!X)#4QPx05{} zJlsaM?Ms@yTz0aN*jZb2Ru#+tD1Bz=+=%ji`UCl`|DpR$+4I{(Tlcg_y_#GkzwK|E z(T-hG?nfKwdI9CP{kLgoZ}dN*@IfZ}e3y#v7JgTL=N_^7hFE=DobjFKq}LwlI605_ zd^dk@+1*!)lYi^JYwGVQ?R480aJjR>7n_OMi^OOnvA?e9(@(Obzt`b^WamNZ6ZE0! zOWWssfUXQ}J*Mv|{t%tpeMGjcw{81o*giFL^sDLO<{`z;IL`Kix8n-VyZn*jjX2&z zH&4*p9`w=0BXqRw&1j|xzk*B{AIC3|HqHX z&Uv51r)5v5uftXK{)6@S9vg_$O~n=axQDVMbYe}qwfR)eR}?;?-RNH@yGuRPeMGkH zLsQbw|Vvh>WA)c ziZhp}9nje`v>ozaddKcRS2(ouM??3m{(S5mptdlB4R z9BnB!^uI09yEdM4MZI*V;>A~q`3d6iFfsXnxHO$WKU_gM+t6QT^MwbSa30?C_$l45 z_2)b1$sQgd4t5t^^z-t?vTc0Jf_!T0&P9}aBXqR=7qk9lm+=oN{mLu)jaSim$Iln% zu9)(F%<15Nq1Ywd_FeWl-quUCeP3*TV~h^&aDCI=4m#TQIg9wuX6uVs|8w=M%AtsM zl&xZeOLFdj(g{R*a8}zbIed>K%{+4#4%@4@X%?0I^ zjV~PCs`%bb;t*QDvmI~igNDS9iPwHv$4$wvGw!3fU;Y`)z9Ty){(|x$C%?_kQg}hW z%PpT!j@f^%nsUy@;ibH%1?5Qh7M;ibo99o;?)+V}b^LqeBX>8YZ~q`MK1K}4H#6Fu z_MbmN_a$d5-t;r#@)B`Ce`<JqWsH?#9kt{7mL>3NcNYV?kdKw6{nPYbM#pBR{7^cG30v<55d2u zm|OYy2Kxq(bqHbO+x;4$#>JK;?2o-iPev;?#uQw%?_2FlWzN@(;EG| zxL@JkGh+L5vB!7qJ|=s@_nrJeb}|#4T=YIE+VyN6uI*Q1>s;A-cq3o;KiEK=(XSEG zKhmN9!bQi~y4yW;>Dc;%sXvzJ&**NIyFK)2gr2qiF=o_1A^kWxdf4`#jOZ60a{eiL zJ3*(IKg4asM9u#KG4TKDa|%qIVZJ%kJDHrs(DB z3$ktBV8bY9*lUI-WX1N2`){_c?Pa`Kt?kdAYx zC+FXgUEe9@*-G*g9do$B0jQv3=+&`cK+D^gLl82I%3%ShlTW)taArXvlFr%Fzxw+2cIbRyy9+ z1FCty<$b!JIp4{~;ic#v{|ugMKQVZ<*ng3juPer@i9_;ZLi^UIJ-(p4D=9}NLtl&d59gF{E>?R3QM#^M}?FO?m=M6~_vr)$f0U<7^c)5bA7T*qIP<5!31XB!Va z{*}s`tQNA6X6>KF>A$WR*HO{`ykMT->>s+% z#jnIJ&*3~MdtUM!-xa6d6BqPT+BoMBJw3Aa#OaC`zEfQCr_;_JqRSpOfCGf5%JN1N@dB z=Xc=0Rg5{`@;=$oBclCJ=~2!%=y$7^te?7~A1y@}$B*myjQd`Ye(UdXe(WXpUH)Bu zTi;+tyTZmV%`esah;J8%4~fq2#Azeu)^7T>?D>;o!1pa~l3k;ps{>?r>38vIzYZq4 zACLO5?#gZ{S0l?MXUBixyuTGYKS_oi=OdKHVW$qu-G(;faf@>@TA{9)NH z=_UV0QvAt3C~v3_Z2eYSztQ%oD=2q5AJlnc(t+(m zH>E!8QE%4J)~ipx%l+Ibre6{R%BkTQvcu!VhIE*`OLn#g{G$bJi8zp+{VF$mDMdU(&Ceu&zay{^k|@~^VPC&c)BV)?MRpx#?H#6ve$)QkD=NoP~%=E!yikJPG^YXm5f3@us z?XIr(F-A8m|E&1oFT@Gw>2Y4$@2JKeKFW1|2GJSwm+QRqy~WNa#2g(w^nt|>-FewUwohA(bY5VGy04C@y1G5HRW!ME~w6vf0T(0EYZ!; zS@L@qi?(jQ|9#mx`NH;PZ_&l6qjXkNPDJRp(W<0R^l{(DQFY|c=~wM{W!pTOa5KU; z5Sul{z|Q|K-A_Qd68}?ngg^ct*|u)0OFo|0^4mJJwyt0Mfc(~PGbNvPDaTye#kRh> z^&2}s(Q!WcJ|aJN(Zkax6&{e^JDhJam%sS2m~!0UH?rHm;^#fuevaj)dJhx&Rc#%V z5%r(5xx#IK<>iL5=PQXL?zbv+e%qHPrrfo8)V40l0=*KQulQZsUvtXk;&{$;q-g6h z4=<1%-6`7sZnm#NOFGE*;{GU~#`J&XACiA@sJMK$SWzyP`^z3t-`jY&3H@sRyA(bq zyrSH*^-W`RL$}iXIX82^pW}Yv>_*w)wc_$b=!>>aa<;ncigL!<|I1%1KMpBR7SG7e zux&rZ>^VB##y2n zbCXgIx_{RF`jnF$>H`NIUaYC}w%pGEz1R7;{OJwwKCvQSjQ$|o);*0Z-IG3Z^539P zyy9{(JVRVYqPwp+d#f04Cw5;Av4?Mw9Z?>R4wc=|J{lh=dqMlCf3R#@Pb)Ot&hs?f zPY?Y*f0N?Z>xh}vNA%Zp=--K`uU6D+|Eu?F>Bjae?vRca_MTmx*XKL8o5^-b7oFG2 zPSM}v-DF4mi1Wk6g#2pjQ}rqLZ68waLB;D+ZcpAuJ|bWCu9WS6RUG_K3{8hJ&u)xP ztz79?n-|zH&#(35Pv0UAcM%Kvo5T0W?heJ#!D8nS(Zya`zcl)JiVm-tXIOC`Irr5^ z*GJs1^_$1^r+3lE`Iq!u-Aqg_6nm$M1KRoC;j*2R#3k*Hn*W6J-|Kybl=s>FvI}&V z?PoQ;R(>xRbLwU1T-grgPW(aHKDM?0N3r~q1H@`q_y*C&Q6;;`Zpc5wQ)HL#7hT$q zwr+Y!{;SZ_?Ny4``@HCUNt}HPKl#_8{a~c(Vnu~SBUGI)EVVvO#kMfQhu))ZxAqU!A0kV)(`zn#q+);F6nV6g*h*d}Qs8{TN0fD~t^ZUJ zZ$P{*{ouAwf&HJI(N7$GMb8!TK5RYWDLT1JKl9>B#fz^J1N<)fc}n;gy*)J@&G{F% z>o^-%;?tg)(%)tKjg-8vIpt_TIp3M+ea)^EYx2Pqf1b!czC;Xf7bob)nD(&kzZ=tE zoYJpcVcUGv09`#nKQ}K{`diR%IzZpex};aykHyBaXXHDZpJ;k~Mt)l{zJc>Qu8!+) z-4VJm{$D*u`d>(U)q^eJ74=4oUbl8;$oWJ1O*`nng6DCd&9lhS{Wf1Y=6or7xc^Vx zNAVZ2huv_0J?^`P(>3&5w(hF!+t5cx*V`z30{irP?S6j!`|A($S{5jXBoU(Ne z0?Ma+s_@BeqKiMcN%oxd)4N`_{cpE*=4{@dM?0&aUF1_Q+q~w*M|J;$Pl~foi_JOW zl<{p#;#obGB?@0sE(S--j`(ltze%?Hda>P6obMz$v^%Tov*Wn7#m-TpK>xIzjyFk zzx0ZAn$dLu@m%aVy50IOY<{3mJKX*Yj_DUK9bMP<&slCO+txoEUoAVLo!I@eY@c*I zq)(n4)}3=0=Ul&B`gcjc^XQG}W5zezcxLBa@^|+aWBQ+m zFhyUNjNcg3?>w~eAB@+iS;u+)SKUwcOYZk^G2wpGugRWYB|2wg(~h@sE_2GQcn5_S z1Gu+n^Y;8&@5|<+bSXc}&&WUGe}Ih>8-7CmigY;RJ2=$e;9o6yw818^2`#TWwx}%_qoiR6MI6`VVs4-^2txFl8J{ z{7Su_0rgTvJ>byJuyu2--)sImoyS>-^$$dwA8+eIm!!|~LWM6c5WBQL>YHVk-xX~= zj~O~R*+=(f`@zqSlx_Ric(0Z{rraw3r1SJ z<*E6xhj4Hm=etp~{Xu+=FX_J?aozNB#j}13o9`8PdcHpS(AH(MedzK_6rP_Wjy^6{ z2nf}wk%M`CdH;>TMHcnx*iNbs6 zz8pPm>m>O2eez-X62n_p1CHIr}6u)ozXFJ)&wxa3P z3fm{#$8I@p)>nKhH%j~q%9AP2)wB15?zVMT6Uvtaf6V=kc-}GP(~S3-ZK3N;xo*t$ ztlsNzUB`~&d)YXg;P3jrbJ|HcI%Y7J-}a$*2)F%~$4`?!o)M=%6K%e!x3=!f^+b>U zvQ4NV)+Gec)d8eLX0jT{2a0Vgy>MuEc(^j}T~I<8NBHlVz*ep~C0wt0K?N{XLRK8=W9VLKZr+}Tph z(PfLC?B2Q@k522aCA)qJespxRq3jOj=&&o>j<^1WA^i(o*rOaw(f29$=W+a!ey!e7 zI-gJb!sgA7elP!$^kwPI(qBbA>XCov#EVE*<-Iz-`mESJNp!j1_%PYdL87gzU%yAT zcc^IV&)WJr?Z@Qz&n5gO(IK5r{wuqt-EQr8Ti zL;fD)H>`hpK)+PBR5@KWaB{WKe5C2vHg#i=&6KyJ={juFX@+e zUnP5vevZ)BDL_4f7wGH)bv|U?Ee?-u^4?d*h1&E@pm!zW8*aZuPA(Rw>ZB? zjK3--(5Ynml%v5vWRKASbLy+fmb@SI>(J_d>gU;ibX-gMJAX*F%XJ&>C%HlXDLQ6~ zZn5!V(UF|zgW~)oadD1l>;Bj}R|)r>Efv1B@}G1*`M&(sH^uoCVjhb2UucQ$%qhp` z^qaW+hq89^5WVZ7D@Xj78bI6s%J#7hf1>ii=I_lOlWpsC44;(U{z6=uetm)N&v}Iy zdSbnUXzPPa-!40b-JNBZlmpW@$quQ9tUWeGugCPaWVHKj{K$&=Hk4lj%DEK%Z}aTK zujsyW^sjS;>@X7}^mGT?BYXhImn&Wcd-P8a>A$vli6#Bd)4LVFM}NMJn~b;OIe8Br z`LaX4u=NPb(-m()eUifHlk!_XQboG8eGB`~QTlJtbph$WW9>-l!O;3yDNiEwUHwKK zpX@A7-z@r8KA}U~*Ahb;2f zl#~9d^%Sqea}3aHIsMM_A1VD09~LX@gmSz!-TeUZt`lv1l*IKI2SjO3CxfyaH=I_d+;mEbh)^D5EyL2>>lJ0~4D_CJa5Fny)IgF`y+Q*V}~j*BiA z>ko_7JFwAtBg*p${`q?qK0ijBQeRFe&uZ#Bcc$=?c9chYcPW30-F08?{^FAK+K0nX z{)qf->*5Y67kl^X{42(1?;+cxTu%8uCG}3if6dO*D$kRjiz)3G7hP=Y-RCdl`PLF` z9n;||vO6n_#dAdapJDpCAYJuo2Q4;Nyea7_qn;gF`sKb$bk+=iO8sm7?!BqbW9^Te zaFC%n`>8B2QE#UwDg8%DF{-@hG)hXq` zl6+ruXr3T%6ipOHO0U3A9S=$GzDcK9}Nh7L^klx^k3Y$)5My&D`Q+Y3comn+C*< z-h=6=?*8)UTNCdkqUmUl{#l27Ien?Zhdt5OQL5IE-CY&Z&Mv4oY`=gZdM~(7IK=zpO*7jjewj>_uHCat| zLcKJCww`s!^H_T#r$0ToOV3fzKU|}OXBWyJTp;%00%jA!&k!f4i}}T3=ZoUbaEuf)3}c(23T6 z-B54m^vl}%HwojKY(07B{W^brtQemlrs%Tihh+PNJCST#XQ+Lj?1=lG?JYasRjghw zPSDX2?`O1;{MOHG`zs6xpQ3MrtvKIn#1wtrL%%1~|JMK7P>;ogH#_OL6;C zkQ1+<-Z1?cp@Um=kbUwfQLBzRo+`Oq@SYoKh~wl#iyb za_V90|D0~9_+83r>o>4{pL+BgEF8|eiI}5PZT+5zay6rz&0!iVesGc4+$@Ioi7x#( z?%!ok|A%-#7i~Yn72`bjl7IF_amn-dsHd#|q&ZOGt^RjIpU-y1J zUt5XGsaRblhG&W00Fuw`|3ZbXwQ;gF`l3P)JLqGZm%OCCWt?+-Lpmx};=0%|`F+Iq zYF@5zTd&8~n;es#(%lq3e!H0PJ^fu}yX4FCAlcaoV)s03@_*+_*@L^p<{>eEM64bb z`_R^NcW#&8*0+j2Bir)Pm~y7~KKZA#LVrMxcQCVN8v@oXE}?#so|3&imnV)=Y=u^!>nM+xnL;w|#` zdESclMM^uwML!m_7uD>LPm_1Fphch^TT>j+)VoAL@`KWB$hi3K?+0Aps_TS2{w(rc+^ancI`iloI zQ~Uwtyi0lBML*Z8D%{%j{dHs~FBD_?v$~XHHgCjqbC3Hdsc%iUXO#cdJ9VBp<>``g zza7dy-dkMkBj!hoHZN^*j_mqe!m;~j%C>sf##{8?D!-(m!6BE*3ajxv;m&EFuqIaK|!Rl_=1L93TE!*bfx0E*l=MOhh zc=R`2zy6}=@ZOp?$c*UMie&NdO97l@tbi4#|>))Qk3$M395xIIrOJG+ede4h#R z!s7jUZ{5#{F70IRhxmUi&VM1MzZ0w9h_lBDzegPMy=)#udYt?@%+g^JCh- z>;Bq*irv*Y?!{tBda`|?2Dd5R@*2_RVb0J+4evX&_p-X;^;h9IbWP3wh6ep?>#cj( zee?65C?Nkvb+zy0@3;>njK}&p^X=J z(1i~Di7n-@%@gUN=X_}YZ@PSshWujtr7o`4b;g&A1$sBTDEtcOD zr}yBe{uuv3_UJF-pb?{548Dhbk=R9#+kb>9{i-qJ6e4tD_FdI8E&m}#w9i}Wp+4`U zM?NojU$*~nd6=#@KZ@%|@WW#9G12B%kBC>iLw?T_^R75pTMSkgyYwGTNY6d~lk^$) z-9bmk%>VPR)$@3a#o>_qq(aZLa7koJX*hjOWZmb4Gji*=v% z^`g)Bw|Tu4`Q7`1!iQfIy&s6(r{QnKY9*B)*#=^T&a2VO%~tZ)uM|gHh<;COw-!D6 zBOP>IfNt~A!Re`rSEE};aD2A>{Y0EiAi8OWj!n?t%L5g@L^lSMo5?ZqchI->$+COs z^WmAY3;HvM*U64<7H7AJ6?SpG><0a}JWIC!QPFf;dAMxbH`n^lZQY0(T^hYv@p{{f z74OsbNuO>g|Dq$-d=IB9d&RgE&ND?1S3LiM`o6oL;%5hm^CLv-ukB;^c#j>vR~LK4 z^UR=~XMs-kchmVyM>kw=M89405rud8uGz)1i}OVHQ(};bi)%&aQo?!Piz{XOSBvAz z#p$`?=;LDNgW}{pV$1unbZO&T=Py)v?>S;XJ#YP|!S9tHX1^5u2gTwharqH3e6u*% zQgqNasUzFk<3n^#wSoNBuWbF+?soF0lt(V*k?pHK9?L0_xB1_KG(_k5z>Cc9q|uep{d$$J@%^&|hKe zXxsnJmgg#I7g+yTO#M0HJr_4}-N(d=`lpZ1Nho)0-!Px_&?mk0?$CF3(a9M)+PPEy z8R1PXd-+MR9E;8IVxRP6>kZ8QNB7gGAHqFec0@hZ-9`3ncX5FoS^Y>oH0C`HU!{09 zKF{7`WXJRU@|_f~gf9J7qc?Cpbn=+*mXWTO_*>F#!Ts32tpkqFNH4jiE7EgsRh_@H zhUlZSO>f8Oxjy+IBpnP7QT*Z@vHYso{8Ws{hn>`eL7Bl*Z+s$MT zNC)+Qb-wvu#ro&s;32VlpXkFS{+j%6`^=^PP`sRcZ}act&&r=%Db9Ic5jv&deO0R{ ze95?}1-jW|TylUv!*A=|`1r?+ud?~P6*|P`t98-KbMk-ud|l6n*6y+L$NsMm$!8VE zP1e_O){p4%9O=gL+dRbnrm}53!ie(9A^r6BQ22uMSyCP>NS_()$;l3iS5QvGr2C5e z;_^OioWz23xa9iQpE@U>IDMVZCB1n(f64pudB01_!(uhXxA~WYx5-|9UTp3cC-;bp z+r{ZO#OP7cq5R37NBUb=tX*-wrZ}YD?!HKNNWWNbecAoh#OdQYZ=8$$gT%SDx6qkA z#t+w*Nhfv~zc9I5_5vMU^1q@ae|oeNRz(J(bFE!o1UZa_DnIm zNbF3-@m=EZM`EAvzo0(Kj?(?D`0fvK-&P(yCENDTitd$NKaBskV*77#K{{~x&I8J& z72{gzKd}G&3+xr+6E;^m==R0l4&q`DvD{a5juLGjq4Ip$KDw$wN0;yYSyD_P#4l?-N7(_19(FcmvPIAEffT z=))EJw9*giyjS66AP#mEZM<~0t!$rmNoNb$&MU>h-ZN}oA%C=~n7vF)dGF3nvK@4+ z&-LqriH{CW?K>PPzs(C8(cYLJD}PHo?}M@zCyKT{#*BDlbi2!Uo*bljU3>l`WLF$N zq8(G6BEOCIaQSZIQ{|so`nW`Pf?jU;{$tXEk6s_sj_`R8<@P$R=!qlBHQP6H@K2?G zpZa$EXW7eV#f*Bjy<4`mNB#H9w*Th~+TG=5@^`6+Y@T!Z8u>evFJ0pIsLwp=E5E0B z_J1j%{Ihw`who=uk3H%O+ux+Ol8*OYAo|pEw%%1p`M0=2;p0S{zE8|Tj-wuosrL%* zzuiRPrW0(vqmud7i+fdGMYmIa-5`3<|C;RJQPJW5p1-oro1hB<%DLsi@>iFLE7rMM zRo^q-OkDb+t!wP_KO*?F{Qb{~qZ`EFHgPr;lWW8!?esC}GAF%S`#64`;@P~y-mi6E zCG~4&=>q*QdAGt>tf#k!?BGCgNWIm(N4Bl6S09PZcj@hiZRbUAl%`M7#ipNa+)GY8 zYuDI%(>9;T);V+Dq4V21cp-McdB+4M(E7(sVYaSPl!JHaq+b5h<;roMoA+=e#o%-coK&cb9GRD3&jf-J?Eh$qy0zm;%GirD`V{DU}tuD;I@ zT|8lYK#zLIH-A_02Be1t-#4S5W&Re0+q}LMJ!13ICU4+6Zxlo7G4E}h7dEtOXo#zWh9$XGy=Z)r;O&<@XCQvHJ7dvYUs+ z@Ch+pi1pL>9}*Y$h|60Dzgo<>zXAF#rvB}s>#FxCo{cj}cs~j6cffm0=y!>?QTze# zJKaIH&1Y(P&r@jYx0Rg7Lq9ru>o{-7`OvZ9NcIB8$H{I^Cf-Ly?_*-Xd$s*)BkT$7 zlLha;M1O}|r{KHW_?F2DT*tnfU5D%1I(GIx>&p~>bg?+*{Z`ypdWihh?qbe+>TW5! zM|F5V-i`(X1uY@UkEi^@Nsa39W&l^voZXXxz$JwDk};kFKU zZTMLv)^$cnfr{hhFNC9&MjX+t({%Ju92H zI-uV*N8gyvS>iA7+r0h}{jUz^Uy>hYFV_9^(N`(=|6 zg?FwJ>j%VaCi*vsaVpyWN+Ygk^N(!3$qM~xI&zNww0VLy9?RyJX0O(H?Z0~7lWqO} zwmxC?D(-`R*7+-CFJ1xBsVU`-2L~`kf7*UaJ-*u*J!5dOgR#NsR3K>>@jRn>dBpTVxln6B#wB(>BLA3rtV8{2`+Y^! zOX0qh7xbSc)Ymq@sifR;{;TVc9^!sJC0c)f#CZ6HwF4OElYLL+XKeH9C|`Z%=Pl5U z)@~S*P91yi@6~nE!^P-0aeSueUnq7zFQ#7*%P)!c{uYE6#LrGA{?X!;{5aiAc1U_^ zT-hV)FPkqgSm?Qij9c!|?>?Ykx@DY4&3G2u$FO7LKW^3Wy}20uU37W=5#{TOefNH+ z`)JqE_X@WbXWNUmZiVTK(XR3@_Y)iX32lC!PrcEiuWaAsVlTxHsGpp7$?hB`dLMwK zug+=2M`sPK-uj&U4f?2uJ?H;@cB8^=eC!aNIwZc0gB^T^>!Dx!S8+Z1nY!ra(S7pQ zcZuUKis?=8D`EyKbhdw|{4wm_Dm(hTXybEjy)}>fiFn@ZB*k;zC(aHO%Xf>mZ)-4+ z-SU63Cf}M)4$;{a;WnX^Jg2$E>{vKOY-$IV*e-N@JC|sEpc|6X!}JwlrK5uPQ9bTN0bZJ zzmrh^1eEjEpPIi>@$-$v4)IKPC#%bE1Qa`Rs3KVar_B! zeiOV)bSMW$=+f>n_|XT;AFI4sGVUxsQugpLarAL{W z%MXb$`P7d|AN%9qR-COZMx+~u_n2SCeH||j4ig*f-p6DICyLQ&qWuRQoFd!C19>0+ zzqai=SiDF65Z!C*49wpyzmM+i?JYaqUrY`a9qLCH=10gMA1T_p1PkJKxL&=l!fkyg zn@^VSCVvk-=aTN0^f%jj68*pGd-nOy5d4wvjt+3q1-2fE`wNBltUv0fvfE#ZF8`%% zeu2M=?xQ5%SpVdh{AKGVd*nO&U+y(7(#%6QEHzhv# z-}LohNBp!qY`udq@86^RNDovzAAMia4zhJ6QuL>f-VS-+HZHm0Iqkn!iQepPqVpE$ zlo%cCbKf?^K`Q5uyLRbrkMWj@f#`rtfXO-sJU)m-5`5x5>73+0#P^f4|u0 zy}Co$G4XTGQ`2s!tQ=iW@kaDZ*g7?~o~Ml?vi(4E(qWHsv4h?WX|Ij<()rwbxxS

        g`~e~Esq85iO3{MHVw-mLS^P7sG&ub;>+&J%5)%9?x; z-6sF|n__&oSbkk}Zx*v$?0;UIpC*=+E4B|-ZyWioz1CS>_KbFr^&4kT=(&3Li&LK4 zyG3?zhd8)XTw-^5FTDrlpEGV`Ks&8-x~`Yob3G~B)*F~?sP9$NFO%#b+x{oG)F%!4 zH%2%6)F0k^h>!kRptGj@&v&SAhS28QIA`g&&Lv`w-m0*x3*}#+yMoWjj&2vTuZzi- z#Th!cpUd{p$u=&dGX2H>THnrpk>XD;7jyJj{3Y3=>&5=gaJP^kWZwTqKI` zpDIp1F18;Nd*mm}M=3hh*2}8ip?JX_qOFI~kZ*hRA7{HLyfYyFZeqNrSiMUe93YO5 zz($|;(5n^xCGDi4efPr^e@=e4`?mkrF71FZ-z`Jmy4P|Yd#@Ahv&Ee9#r7Ap^-U(c zpE)|){y!8`9k<~7Pro6%{0h8MT#{ZU^zS#k_l9)2_36h9%)VUy+2_RkIq>2d6eQ!4&%BoJy>>w4zY35^Owr+Q4iXBFBSEc^#cxmt?yW(m;31B z8r|H|ev6(`yfOVzC3?C`yDH|m5`C~BAC%-b+izw{`k1~|_ZRTqinC;AXN%SGVuJ2tS?slA0AO}ht%`-pS451V|r&ne^HDsvj4iaA5TPm zYvcDl{x7$lu9vJM+JDZ-(#=7-zwryi{9DQo#Zc^TB_=09ThC<`#jjQp7i)>OE{m;O zZ{H>Rtipp^#9=}F+r=)N;%{g24=S;EN(>$s8`>q!9kQpCpOznNzNxkE?LUN#pU(M? zbN)jmtS{2#KZ1?-=%9-ObaVPuy@xqWXiqfM7n7$IZtKn3IJcO3-OY5rwjau%lx_Qj z+4!#Vf8@{5*Io2=L;J|qbFh7v<51r>;D2a@esRx~KRjJrpf4l(cRT3cB3JkX9W*4o z_^SNg-C~Pw9uR+pu0^L+=-dK5UVK)^`GgnfygqEuzw-+e&&G9R=;ZQK^4FgfL-b;j z$nNu;b97(!QTc-t#LfrA3GE9Tx6nI8{t@}cSnVtS^6jF{yPKn%XK#`}H@&yL?BQ$0 z^!1|m2C?CP(2C>H-9G1c->rByk8`)H;)pIeu)09@?}iFb90Jpm-4wofAW(4;`Rp$PtZdh`V-qn=JWq67dZ9S`yg22*q?MPWd*q)`uf&Y2?)-uH&(-sJyyq4Ddg#psI<&f2 z@l4={T$tx?XGxpzI*Ty+1Z&~=Sp$Nd+$z(f4x|w;_NapxLd64`@DqoNBek6 zdoX>e{Lx<&fBHRfnR9$1j!qCw2ZtY(UB+UU@DV!N=GC`6hl}4oMe)N^#em~$-b?@e z@{dR29K9L69(!Za>ZzRmq=Nb{LpRS&52Ke|{G1)|nyQ2NqAH5Vm-_Q2f z>#QyR5FKsnEZVs9gmTf=9kKlwZN23h9cKGb+dhKb8+6_=<-YBsP?G=bKc~%eH=Pln zFDB@U^jykS`VGC4Wfw<__TP81tL!fQI$iYE3>`iDx9%tW3eQV^vvGed|8H{i;^6Db z4@-1&cXb_?^PO!TrmY9$y-DFQ{|Vy#We1-W!#l<44~RDx`wOvpQp_L5PrQV9Wi5Y7 z{o?&bcKn!Vx_WX8$A4A~&k&>ci8k-FBAv{wKIDH^Ouly*pE95vsUFk&$S6NT+TRoC zQ*J~YZ}WL=9sM!&YDznDX!ZR$y011BbIZp!%eMW7%3sL#SJ8KNJAD7m#2VdZ`^4Ki z2P66~9rSaODgFqZHK!kOaIgH+`^7Q3xqGwhF8#sr4YHdrhz@qid6yRxA6-|UgMGF* zKu_5^u03?`lKb>&2iU&S?oh{#(3f-5m3zw{(a+n!5Py$+mh7TjqKo+V#fQ6 zsRwPIX2$#N(f(bmruaGed9;S?&YEy-(bnI#b?T?<%kR>kmUEqC6ZuoFZ|e^_+sSX^ zL)^E?c0zGTyF253S$jL7y)mKu7+t6M-7kp|?VkEZ&ck=FXeTx3hYOrH?l$Hl=@qW3VoOSE=UML)Ey_nmF3@Wqy*?e7w7A$!dG?5s!lPnG_io5aPZ z#qM!pfS#(4mtB5HEYKY`j<`Bf{_1dXPCjhjA-hk#5mArXJ{1G%vk~>3jelOTo-gHM zy{^tPTT8U{d3xx?P9(omh@)SLi&gcU!7AdA=N(KGUUFXdew9P{U1Hzb^^`ld9(4OH z9cSwSCY-n7I@O;QZsSL0Jm1*L{d0BxigD039@_t;{LQDt_F~cYnR57l7jl0Q|0~0* z6mR@l(Pg|`{AJlC^^S+mwta9jo;#qP9&M`oc6So9UBn9gW#4&uzWk$0#V)$3$nc|w zY~AbT3-XU|7pKpN1^L~leC-^p?-L!#_c~gfy1U4V zNA|HZ`k7t(KJ+g&=;ns@+2o&`=Q*5zHF378=&U2ow-Vd8iq`(IancdrH%0ePUZZ&N zt3($)8HBQ@$HFtkhc5n_iw1f64c$u>*8%OZn6}O!qrES{(DeqgZy1J^rBV1?5dh zIXC1y?RK1}D+YWY+g~$eoQ2Kfu=N^3bWHGk9cTMXTl>g=k^D9u-qtgpZ6tq}c9YF> zE?cFShJMW1+KRW}y=H&LrvJ+J*BPS|np2hUrs(B>ejuNIqmX_*8^>4^e{h11tKTPf z4-h-=7HwSSlK!0jE94K*VeZFxo}IlRZRRzqlcPjJ78p>DBi0 z?rtQ%?GN5VfBNXJ?rRj@+fJ-GPfh=D7g~R@&FAZL-R0|aT*7(WEo2AuJK4J1&ENID zyT25BPm0c?V)L*#eMC$i7so#l2TRc>JqLf4UHw-Kp0De+8;T>|!;t4Gc9!4z%V)gT z@?-KleCOf$vJ=`#`E9ae=-w&YEyc-$*y!fbTz370I7T=7e~_KP^!FSGCr`>QNKf`3 zq}W^j+`i9dvd5H9w!iv__mKWk?_~T=gFQxTaSNy zi2Qx(qlA2C`=kV~R(L{v6YMH`v^nQnPs}JMZTwn?`ei`9Wb=iln<&2hN3AZGZTlJw zelNQueZ_y1J^i}aJ3y?tUQBruQm(|eD!flRZ;sIWwe<>Z-Cggk^4IH%1CFzOrI$~t z9IN@i=HD#ap`W?ET(*C;xVT;PzAfe)*QMWi_JI7|QcTh3BXqy>P5FD3*r&fdprx>FH>_2mQq5Rz&VJ0S|o9KMmw%-2icG=_ah_;?u&G)eUpV4k@uGD*5 z+#$|pVtbv~>?1l>zunLEz98BKUX0R3$1PR-6xJm)NqBOTA_hw2kPL0?Z#Q@jEG z0>A%Z`7`uWd$?>{C$V`g=SRo7FOVJlOYhnAv-KNA^c&@{MPG;L9_u$M_+DM~m#yCx z^4;Q{b)63R$|YaryU1_j=xuyL#r@fSZPu?^e@O8|p4ax}c6bjy-?_d(@ob%f>E}7_ zTKuqky=?2R9-k|_bGA64eChLDZ2e^0KRDZ8@#=wS<4U4cIG*-xhxhAKemIm1eV((2 zUheOx<9crq{XNCek>cP4(dN76iR^&;o^s!|uW|oy;&VP*kHcS8exLj5KCAC<->-g- z!tFU)o~NbV6|A9fTc^|ZmA3gKotG-y%E5SJ*|ttd!ui`j>AJ&}6mI#sCjWG(FFFS* zf92?kntIMdx71%&c=r~ubCWnA-*(U|IrZe?G=-PPbKEgvhE56JEZf;!9RE!B=X^#? z`QH;zJ|}z2Z|nL@_L5z^S8U1eHowKz$LMpu>`KM!d{J~C6!U+I<2AX@j%fSRP0&F` zn`al(PZ-i~H=$q3-+bLqpL*sc(G4@p1fIhxjp22 z=cKbS<$8#Y?o!@+{P$Y1A0hsLer=m?YC3$$dE9k$owhI9c&h$;WDj`XK03O*MgHlJ zM7I&EF7IJi(dHN0fBxRZ@~7yj>MG);@Dga_Xs?%T^9S2c%8pMKJ<{*;MA;4fq02*M zr|%T!JBb6+snqW-3`|dt@)#uTzejZ_RP& zQCqj)Sx^3Y4RN`e=wmmeqxmZGFIv6t?mxuh&#)Hr--))qX)~AIQVv)>9gq$){Ikat zZ}@xB+C{cc_iTM#-}V*Hd9HL9`Qv>>TiaE*8&(q*h>sOaq>3NrCbd5kUiW+Og0d0 zy=NQWY2(_)uEK2{DO+Ez*+u@zSS-FNrau<5XT(0`R`wIwEjoI3iR_5`vVNux?dR^9 zdat%FPVXAoHlK7xy)b&7{I1orly5Hm0XgH+Ob5@uL%sSvu|*$e-;nL0g9p|>&Nz|& z;|iZYBi8)S9HA#{{NtE<*k51IXS$-?RJOOZX!;_coF4B>_*vqFbh4lxnqDk_FcD+Y zK|ja-wirGsc6r}6k9A4DOQ~P8@9VwQ|KdIWMGPMkvopjY<%O+J9?f)qm-`v~Kd#O+ zjCrDL+Xz+>4Jr~rG@?Qj)QTuYwz5}1t*lW{gKS|B2og3eAX1g3$QJej0!6mUB1IM} zf>s5s3Q|S1fJ;@>zOH>;tKX07yq@EDzhCEZ-!qvclS$^vWOC2Rvgd{9bs`!ZpVyym zp#vAZ|IIni8SQ^`inedU2KU2)c0N5(=>`3qt)B^ z@;vC0@3YH=u5V>cZQrN7#kR83R9v7lgB@g#HW%AlkiLmnVtXEQdW8HL_2&8Q{=O7) z{+_?=_#7U0Ztz@aU#4<~w2uZlrFXgfZSKpQ`Yp(xU8(f6D~30T)hk4gLyr%TJ>OEy z*A}O=>uw}_@>X%t6qnS?Y=7C!!{NT-BoXU}iGJVmcwlrke%ecwP2SfQlvC7{ z-~TUq{@IB8u(pcQ)BozaW-H4M(7TQs?D*p8OO@W`d;^&9p0I!;+DA$LjQuU#-e^ao zx2U`U&%5PPc4K$$H~Kfv*XT0NSD}BK@m?E#Rrwo?7ZvDh&r_|Vt2 zz(xl&AJ%b1*NL@r#mdoQyr02JGmxTpM{=iA}=AM7N53w^cRh6YMG9P5WCZ{}>&fY$iMQ`M*i_ z41GL%t?XtbE?*@Mcn_Q6pRFUm$F)7*qNKenD@qSn7Hg}B6&T@Pt|Wi@UtOQU-^2;+ z%-?&|mz@iOhN$9Z?RkzMW~28@@DPQt!YoPR|e zJ}MUI8ddKP;Blh`oEo;zqH*k68H&+fBsE znDS|-)_;@31N5=wH8|)Gkr_(C<+^9~x&;-d$qEILGL# zvIqBw71+E*_7t7eJ4v?Vs7$tz-Q7%_Zy`EPSwX$ToX3Q6Ja5b6+)KA_u50)ym6OrV zhqS9P=M`gD?qGj+ijB*}kmHQG{=JRlZ@!v*w1Z-G*}-a}$C*9v+3PL(e`=2hS|6L$ zmuUMq5FO8G#CM8}=S7K*F4k1Oa38V4@q0Y0hYpNO-ESfKIq1oD{DIC*vKyC*<>g|E zZXTaW`ls=KLX6Qfm6yoQW;%|>1LA=Cotz?jh+eDGFNM_mHjWlOPsMR4{6APhIb+HV-pO|K+m53h zyj%Y97Gei|6)}!o{SU{_^Rn_K+2v=&IwU=1`^KA<9&JE*>tVk}9HO5auaw_`zWAlG zqZf*KMO>h3NB_|Es{Bn1{~+eiipj6U@iSudl$gRA{+M>?aqK#_=YviDsqGvuyvF%1 zHr4U;xemn#Wmi5bPA(NYL-PGdto>5VevkcUvHq+$nu-CsJGo2t@!@k(PO?13VuiKlWJKV2SxPN=@A5YbG zDfe;j2-*Ih#`B=t@08!``t>)JU2ZIPUMv>O->aaTTh`Hx*EqfTT(+-@Rmz`ySat=S zG~vA=p?J+kT-qejfXyK8ENqulEqYR_Vb8V!nwO?jg?i7bhRY&vUbZ zz77icrx%I!^TmYgZT%4Oel@;8=_B$_FJU|MQgXU%k6Sl~vdf3@KPmcqQ@$G4<@MrZ zV{yuJ#q)3`k83;Yn8jtX3)-V~O#c(|FF8*CcR#pV{s8?~yHNJsxXA1MZ$pW}>FwvvB| zj`TXuUT4v9{`{TW>rgKa(ss2&#qKep=ToGdZ=ZUdU8VFM&x`RFWRGqZ9WS@`dD;ED z#lb+Fy$;o2I z`Q+TU)@xm!Zvkw7j_qz0!`s9@$K&{4%ZJD}7X2R3rQM8a7t7t1o^2_1cwY5iCEIbT z>+8z)Jhk|hhd?L;t0;^x8g^&KlfAJ$7IL%i~i4|hi#h8=V=T#)As!x#fbMDe~%b(9Uaelx|{M%-y>GJzC+%Za;|5Ca++N4gzele{GWj1 zU34igYN}k@J&votwfuu^#0uwGqy2k6LWTF7>FUbob@jsM$sYbk*S-FCaq@f7Ksc8M;o-y^$= zy}Xs}E*7(6#cCpY-g)?Z*(Jw2K{r=^pyM2UOYHFc3Hq`F`lZ@eWc&UY^W1O119f4SiN2Gra1ze@M|@y!>ho(F%CzlKip`-bCs*7i}l z$G?L0WS47-E%a^&eeXCQj^pe9zFOpW9Im$Y)tgjK6`d7rB)hh`*ldV1xZH;Pq{o}c z&UX+enYf}pxIPo~)9_5CS8fzrw~M2m=<(X*QrR8eORPgX=$pm)Y<~_sRrG&LZFI%( z2KgNy%Ii#r56eIKx;Vz3(tj@Rmft!prd`gjU_0#YC)l2L>hZxD`NGdB-SLlSY-fGe zYcRON-aoNE~Wk*Me&BH{m2Vdj*jJZCeos{nN+T*6|(H>&|K(T@@PdSeY z*Qd??%I%eJv6)z~pI|%LUT0?UA=$~k_+9=nvZIf|GsGF^=W%4~-x}8|=DK>mOmdaB zbNm&LANL0G`?=%w?rJ}hzr%C5J(WE|2Q0oJd-$kW!r0F@^t$6Uw7;x;5&rpD_FyE= z-CnuAP4xT%U7WieUakDq>&3Q@|3TRi&y6PKE_i;_pHTXc_rT__Wc$CI;t|=^`^4f} zG2}iej+Z^-dD5VL47h(s>ngp^^R2O->_IFh&~d8$JwASk(jBMVaXVUUAJ85hH)KRT z)zD8KZ|c#%CVYP`x6|`+N&hsmj$wSKjV|di9@gi1I$KlQjsI82Rs39Zyo%sEvfD#3 z<9bi2*YV%wFX{gsAHe@-)!(l2`{-orrZ)Owf&N$=t$dERkbF}12;Js*Wod`BJWx#0V-xDp>(_X_k`TR>Z=w9Xs+d@h ztSvhTNN0R#u~5BD{vZ`!r6JKX-khlfw(-575WGn`LLW zi7`4SxI=cm55FL`t`|eft?eg!icXF=jvnE7P|Q3bpQ z^!8N#ep4*bSB)G43}y* z4cgJ*e`I?eRR3Ap75X{&hwSigV(+iwl6E)!kL(uvnQ|Om+V!04HsN{{8^?yP=bVT?`l{+y{mOVX0^g7PrJ7q7og!BvT9b^x-7Q5)hZdG;%+wopo zk^KG+-d;ntzk@DbA$vxDvV61b?mNWA&SHB%v380W)1O(FjnR$C#Y#_(6`Sas)&{Z% z>_4ZU3Iq9zRmBvBFOWT4Q_MK8&K9!!b@EdWIsICb`iXW?dbF$P_)CNRW&6LU0R3it z?06*Y6`h>jq;$tm7+xZKd9FA?UsgUL z+y7-bE?mlS47mB3QT`Uk<9SEX)$$kUXU7W} zve|WBekDJD$d_4P8#rCVsCeGNWR9=vLo&z&)e?c z&$!;f0RApIi1k2Pk0{3zg2p3H9a5QFQklL z#Pk#6qm=IN=n4Ho{UL2{ecb#O<-y7~WLuAqc@DNX?$Jc)o`)1*SN|-3@o#bYFG&Am zy_c`0<0=^kO3{~1pWjck-TYp0#X8X+ksa(TCOj`ZzuoI`w0W*N-e9&7`FY+%Zd?5%X`>@K$Bo>ZxqJ~|{ocjU)tyR0RS(fc9wl7CMA_UFaqda-tiSh+%s(Z#g~ zWp}Nd5zuo$*%0hcGOD^+uwsy?w{EA(+0}ldZU=X zL7ebD)#kk{Meh!H{yKhE%6*>wN%wIBdl0Cc_RGZVrDF0tvCng0_&aS^XWXIp3)zF2 znEYP!yyWR~wSDUa;(+}%f31A&pNTQscc!vC4~sMUrNKaU`W11>^S|{y*&gTV^So>0 zuRo&n#W%&?gJMa)m)v@^}&#}La(kEMqbNa=SdWv_If3}xs z-P}S4H4l)#eV{l-w}r>E-RYvgzjwKw@h$RuJgtg8h#r+c9*f~!;`A~x{hS!_e&O{2 zrs&J+MM|GsB03(2|I3R$F2CpPR?%_(PqR+@>Cvt{KWKEZwp(5)cCQj0x6c2mRXDEc z^-7N~7pK><9p~-!bv*7|LvOdq-{pL!*d5Nlb~fcvuj5l>N5{a!#NIxl=M_fpk)7=z z2D^y$y+zMA^m|Z>UaB0f^pN}+?Qy=n{9ez)ahWT$?`$`v_x2FIUW4b6HfSHsgGfI> zbR60``|TVn|Lh!b!1XV$mhJKA1@&ILU;fUQ#rD_8$Ma^&b133@*oFQNA>n!JbuSBa zK*jwJ{aJ(g0^^>ZpUoS29^WGl9~MWqixYH94?XVr7ZG|dS&96sh>oY)ep<(0c}yJt zQ1m>x;489|$Hib(Z67lq(ewUl^hY)Nt+1|qvxeB-R%~r9dfsK1{%SsF|6do|wATsO zWpc9o#lhl`_UHGuCG92OLg`*F-0}NTo;wBY%>PHUc`jCu({_$uSsW>Q%>7!NDZ9pf zIpDe{f0ciZZl2OVJB~&8N}ca?p?vkJ7|_3t-l25=*VsW1bPtoiijHlf`&u3OyXev( zx;DO2ey>+oMgR5CiG$0O-n$llP8^YML_YuL<~V3YTlofOu-zv`$Hi)r-ascc(eeIo zs)5c*tf$aT(?aExu!C;PkCxx#=iL)z7pIFe>cR2aW}lINO1)IOvM0BSqx;1ELt^lV z*nCusz9UZW6=&RUqZ?$`*{=0d+37Q4@5f^CZLxNznDj-j8`r*6_TmE3ydJOy435EdUU(; zyp+yGDlg$Y3ffEXlVx zSay?qp4Z|yZJvMJ+)4R5+l%oQVz`MocnjpdZLTl7_6jj#9H6s??8bA%nCE)*bKTF5 z`?36w?Dne4SLeAKJ}ZCvEwRBkjK^Hj3J}Eorc|TxWr(*rid4!bPra$vKZ|?6BAI}XcZ%#kiWSq(4&hcm1{~2P`68#@~ zp0hprV7!;?(YwX)U84VcpP&;vHTkpGisicE5<9BOwk|GLligoitiC~Xytv9nvK>D( zWB>g<Id9hsYj&RLo8i^S0>m+5YEckI^^9Says)$Z5Y`hs*zo zMfBJ6Ta|x-K3$+Mtz$h7Il4gk=CqR)^HkB#(?aPj&L^SYkD=Eq@qaOnYgRp1+a+Dm z>*W@=$nJ1_gD=STy1HJ^Wk$R9aXa3F+j)ia9KaBI{JHTdmFxBPD%5juxcmjztwuYW zZYTeg>l<_3+tBk*8}Cy-|8G{KT{xcf=#5Ix&^gx0A$lm_{cOnlXeCkpHtl-jl& zp6Gb=gAK5^5|^imj?2=U%AWlU{#wlcBMx4kZ@bb;D?KxPg;+jcbUY)+dmW&In}5^s zbm<48byQAmQ!&9`aNGsY&mPay?z7r{{Iocni&b>GfFbL`wRM=Hup_~=XA;a*XKRW@sb+62Npa>+NbDz zl242NKh*yj`2K6&r}X@1VrMNKU!^8C-z-+E;(R+X;XM4lGG0&q&Sr2oG5EANy-=*6 zW9Apjj?rOWeoK=amfeIC^qIep^tjF`y10Lm@=qvdNPe$l=lHqR&nRCCjab@X?@IJVhlC%j*g?XouBvRZhhFea`hsJ|%xjyP2b-N2kbN5c zJuG_uT!ZI+^o0D$Gh&tJc8BL^@N4-iq&I#fyYp=^_!{%WiMYZ zh8v6VTgexT9n$^%JV3ux(KWN(m2dJ+ak_)pK%aO$<4INi7(FxFfczZq5Z%<}=Unu7l&J%($-Q-AeCq z{l_pz?|6Na#kI;8-6R%whz)de?;6?ZjiTpEPrKy5NNl2`Cmc_e<7=X;W8S~A6WQ)q zF{JN9^n*_GxEb+Eog}&6U1jJGbAy+Z(KIrhJa0 zGTc{o_h7McwHWhU@%wW|{VXq2y5my${cLua{Mk`r%Jm9vksYF!6F9j~{wmKE$2qDz zEr0M&ak{#mufq++F@{&dwA)?pQxv_LO?}you$W z^3Qe?OU5-TT<1CGF@ga)r^$6)pxZ{2n;b?tY;WD|`4t_GV|lLf`Twdhx^Bw(CU+}+ za=+L>KiAREjtdq(t@Ie(TtyEjaQ-KyM{x2x+4VWw{YDI*5r@3j2I%g9;~1iw=l3aJ zF%Ww_ae0wA<$8y_Kcwiz8uj7%4^8T^OZ^p@wjZJ!t4GTod_;7+nqp7cuKsbQ`#R4q zkUgVaRCwR&mh!hR79D4ANjs^bljmnC-Q)fBb7U8!S2=E*P;Eaa0kP|IqWJ{U73(vx zgem)rd0zW}+Z=!YugV|68PB!ock(Zu6r0Sei`oC|8}hrK8=@}?bVv`~Ft|YZ{9jq` zld>!5xDeguI8Ywfbex;$eD+g{(Fx)x5r+qeo~IieD?6vZ_WyDH4dq|1NB)>!3)Vxv#2Q-ZquL-cln9_pi$0_-m3 zPS7*$L$zK1NO5_z*gR1z(8Yb~HAHW=E>ybXZhM~a;BvM{H#)vb6FuWN1`X^n^f;~m zpYl3bCAxTaoyzT^w-fYpAAf^(lHt$Mv2%{c|9Q7AQaPSCJ3dc#1-58kWk>!g`mFs) z*&c7Mqs!Bq<)7Ut&TnVC+r$p`nBy+)BOTlG+B-MMpIiYsuO8=7AwBz?(p#Sqy>4Nj z>$EsQ{`?Sew3}GlU2LY};Dh3HPjSV6e;dhe!5FMQ4YQ(Z;Rx8aLKKVPQgbKH>{=eMNYHn=Wz^ma)8WT^eb4~eyh#U}b| z`iyL^r%<3X=j&_#HO3PE612iE`lWb{MsuY2gU-lfVvL-$lK zlbxcAYUpeKZ)QEwLl+eEfBtTteNx+x(HZU+N7SFk@BIH1JXbU0dMK zww6ENMQrbe{XVe=Tj-bpx*)es?y-`y>zp-cQq&WDozXd`s@1l5*l7%Rj?z|4erBU9m9`hhK*Gimfk-i!X_u z58dN@7U<2|c}n-Ve?q?$~U83Iv%;NcX5f*z2Ai6 z7*M{yA56HOGumr|a!Xh{UgZqPx8OaXa+v(_pIC;fwBM!qrI#~+ZtafmqMIQ)O4IobY_CMzZT` ziLIB4!3)La^Tc>%G5n|c1^+){eLeV<{43(fVK@IM|9mBFUr^5MIkKy(iv2)rt}c2# z^XU2H`?t!;(D&hAD3|>tj4yb-l!$SLDg9bRe>Xx`jL;p{MH9xW{J)^r0SQmje!M>6 z5S`b(ME?Bi;(&g%g6yY23?Rx0<9(G7O_IpDGyCmNjJzVy*z2j~~>_4ZT{a>NuipFNRLr|kKZo$mfhN3^gQ=E?{9T<^5DHn&v%0F5XYN{1^T-6PT6hR>HOWY8@V`T z{{`pWd{TbLQApR*bEM1juJT;j(?^tVOg$B!mhHH2Iqx_1v*j<)(KW6^!u{X=rqb&Z zvGOaiJr|dM6-%Cbj%%83tm7zl5^L`f6Z#43h=hJPc#3>~6=QUAgf6Ji-$#!sy+uFn z^;-uQ%OB96hV(17y~)3Ym~SZ-+ligc#h@ux>7V?cT5yj1lTV2uy199w><;?5e!XnR z^YVXc+2!(kT&{6G+np)a&JY*qiGcDZ>^D7I>EluyeuDgrZ^hQD2gqNw?oDOa$d{uV z{9U_)4vx_y9>@23$sP|bZ&x|9J1Fl;am=`1&h_l=CcnS4`@g6$x@1ZH&CXIj&qt1^ zxB6}JTQ`qykv(A?(ciZ_2g{#*SackP@(9_2>ry>g`KKSHoLqFg>E>~=t<(DKcSiedQ_r0rvfVGm!5_u= zpW=e=H*MxORo9k2uB|CXtBM)-QM$71B|5tIca_uPzMDP4ets+FzZR2`7~CmN9~3LdNE{BA!@+HL1t{9SQ)h1lgf zXIu}z$4t16{-4m#q5cQ7-RynhXfH8GuTFNA9nii<*v;MlufKS&Z2!+#A$`bp)~y-a z`~56pe*^E2{PDY0-gp-=Zi?PdgK|=~8*%(z_b1y&`P+;)XOx#v-u#_PZ|opew-r4< zt@Ae7$p+$lT`{DenXOIw%f$SpVit&LMfAK6uk(O3g{~4g)lRwC={#0~)%;X2MlQH>6;sX7gqB92ce=+@L1Kr@b&K>&A795F zb;nc47{~K@Iu2T&dUd?5@>*@*yj;xCq1Khf{qoPy%Q-qarJg5uD80vZ$ZnJ!aGg_F z;P*Tp#~*0XKKz}&#&zu8qH-E+=l}7>SIQr8ye(|U7tPRf3v}^>?OXW$ziNf!w*Jp~ zPw@J%jt5-h_*@U8yR`oy=ey+mtk13MyZeD-7MLVsY zq;$_`svR%8NxSiXS#8?Ia6hHT=<2~cv9}dNbn}FEIz~79Kd=eyEJbH~U9bxGlh@Vt zI)TOGD!09+o-27>j5ZasQ0)9h`2yabJl}h8p8Sr(QRO`+De<2p`g+&&(YU)+{mMbE|^*~x`siantG)_L;h7mHJlYlco3(~oz0N+06) z_*k3$4LFYJ8Oj%)E(Yk#8oDoLysL&@^?2DlSN;fHY+c<&zd7!~fPCd=ls`w82h{Tv z9g=arOLV$*{s8^DAiw9A%(qv0?RSYDC+i+0+w1!+sQ>oP@>l7vD|^Zwpul%o;hgkIqH-Otp~C(>Z??I=(qr1)koxhwo2yjy{`S@HA? z&6S_Yp8Q1ge=d%wZ6pmSBW{gsfs@Hynr_2;Un})@-gM_9>w+ti0KE#AQ8tqi`}~D zbttmoIncPn4#0WtW7*rHxb=(x$nNa-VVbqAf^m-C4?gPiIYoD!h9FHcV+#dIX=i5{Y z8g63B>$4#`Gq)tRBY1@C%(VAuAUFSykGemCf8wzo$)@`L_aUTN4Y;2>;J@l znU15e9>?=Wu~HS6JddM|WRJEGb97j9AMzh0Cg_YV`lQ*Bzqn59Tp)HoDmKtRWBSwH z+46_+Yx7p7J8fZ==5pba#dFW*lFD4sBnp?T0srKK@oN zdv=64I#gUS-g%1bl>JygJ3d5;j<0e4Ima=uZa|lfvGX%jUK_3$FFjR$>pRC~^|)My zj_~(rkCTNd<#GJcezHsa{*LYM*Yzg**->==?|8RUu79+r(i6tz`fy6W-{yE~dnljB z?;LMABE5n>sG=)^g#CU%9DGCr|-6qe43inCObD+)j_4+Jcf5q=(*2^uo6ZC2q{aCGQzwIr> zCVFxR`%r7ElAVyhxv}gJ z#vIpRGx-;rizzI9KHPuxot56+L7bAFvHg_uDXL1Jy-xIcM&|NW@&~Vl>x;d0u}Sy3 zip{m;FX1R8-x}gF5Z#|uR+ioPkNTGudO7;L?7?rv2K`+Kmp_r;{~s_r%SRB%Ccd_F~*e`m{^F};= z*tf2OO~w-)w{?i#c3f)Dzn*?VZ^lW<{*)8ZeU)lTRuN)~B=v&84cH9dy zJV^PL?-9E@LCUS8xBZ{{@?%QxyWCGT^qdCt{W*K=?93Nc1c`+v9^&*ve}_kid3l>Wx+ za(R7&+DBDRfPNi(LUxP()A0+ueq2dE8(yn?OZ2Aao0jO8!MRG$&_Auu$Sx?qdYJ6= za4|kkTyQ+r>DH$nuMV$NzVh?%deQS_#~+dH_1>cWW%oZQ4)+x&>?b`{_7u)Jj_gGF zJ$@fB{^|d$$`h2{r=DhP*Wr8?>}URA<@5VXw6*Ml>r-KzEZ9r_F}ktdksVzqjy@&M zNcT8iyr=x_T}97J_q>k=y4UNvwdv=(^z%*jpVHrZ{pQKLRG!zf^LX8u?eg7}p6@M2 z=-%$`vb{cZo%A{H0ga~8+izg|*NW3kM8`MC4wRj?;Q8YG0`grddc4~6ex~H>(@uh$ zl`p%G?H_@Ui}k0)>a$|^x8ew9=;{0q^2ZCYn3MlEVhjD6WNaYb;b9CgXDMIY{yS_yIE|f^d9Xz+*G#XQ^x4p>@D)Qs$%7hViopZFS{9w z8PB`=2G|>kvGp$HF3`y-?aXoIyslrmuC|**;t;l8jSai#)Z&%$SI8HU?(yIe`)Q-M zt+T6~e~dowbKJ@LD$nb)3^~6B=Q|_4!TsTRgr4Wos1;@~MU`LWoah%u~xM|Md+=>Piacgi23XU2>Zj&G9Rqny689&CHl679v_~i^alF3K{;NR*X#O) zA5p%De0A%!Ps_hRhpkwr?{@i@4~nD5#n#Wnaw;~T7OiV?u4|X{IrZA-y(-1;c|2a% ztHXA6^iL1YVgGyDkK;4syyuL#&VIkC&|Vz>BI3Fwv>*Rh=J`4+)@9~B%kyiSePeVgSVfelgBVX?+@56LBChH-op!Y9@F#16#eXZ7}=Tf`@hBf9NFP{VzYc4$!lXTi>LeIDWI&Tbl8liP6im7wLJGzCv8kFO)pz zJwL?%*L8XBhdkd$e24RMvEgwAp5tSlyNeA~evkfW@^;ycI^0q8yugakE_A?jt^x&?6-ZS>^XMz7}R(6y8mHlP+b{A*ciXQj%_W{oV&!6S%zwWP z@^uy}r+ic#JSo=D@vWcBZaf9QCngVz>0M&;a?x@9a@v>YYjw_0dV~9SL3?lV-0=F3 zBd&Xe>+AIkJDY0z3fI}XcKUkxgV#|$derj~JYTN=Ql&fI<>bY(7x*VHBYhpQpqvQZ z+2A=kB)u6bU%rOu^*_x7zvIeRU#NVe)!++6&wucI;*#wqYbkxnaSUH0y90|2WG~(< z25^Mmy1Gh!>*f~vy~%kDU#{&N)JL|e?E3S>2|Bs*9N9I-ZNh)3pBpd43gb3S#(7Hg z@|f|X2)1DRN7~N%Dtt(G4}I!*dX=xq@AYkK-;(Y1S-j3}Nk7^|SB;vjC!Ky z*S4>e?f4H(bd2Xwcpm2*9p!O$k1zJoNsZ5`9M4OxqpK$9r-gME^!j&>w^qGh+t;YC z0prD9SE5Zl1plLaA@3cIt6D=BN6`Oajo7YFJ8Au|wx3b|19VRteeO6gA@!Y5o{!6P z9GS{U<#`@};~Wmr&3@0SQUA?b*+1!y>yYqX_OWvDCT#v?Q2={`$e<430m7{V{R$QE_mfm>wr~ zc@K1aofYpxPbz)-s2I{tR*WzIO8(Bz#ggY?XB$1g+6~chylT72cAPSQpKt6Zzvsg` z?r8iW`TgB=wufxTKWlC$+u!Ho50n3JF)y%B6N^uaHFW9Z3fc2pM90Tn-Yh%)9O>7H z?VgyxD*k}}cUmgFf3es>7cM%o^V7xo$Hh@g^n8jI$Jrvk|AT7ZsC=H^*+*AeZ+iZw z3?-D{m7fBI2zbcnd( z`}f|mJwBVZWe=|tGZ=DyU0AtO>0aNXd93VoXE8v>6E?BOG%e;fO|VvY{2 z-Y?s61Dou3_$B$9Ulj+G6Fn%~s^WZgvGx+t`Zz#uI*w*< zWu>?OtLL`Ysj~hI@YnvO^kON-D`~qH`)zVO@eAco*#BrP*^BkX2K6$2lkCxk;(+&w z2JaIdU!Jb1^d-6 zGxS&U`^q=?hFC}MbQnKuyI(|K57>UrIOhW0<#k|6^jLz<%{iVP`K!OxesYdCMdx+N zUs}JdqWWl1-*v9{ly)?JnbJqpqvHl<=*Q^aoEO)5@h90S{rDIi+J8{~0G(A~T(g6| zs-Rc0id()WuZBh>_*7Kp93F%%ZxcWEkKcT&iX#X{?L!WvJe@Q;Bmvwr9j;^4itiv<> zE9QBiiwD$8a5LxK6TPn6@bj|0j)~U+uH7zwc9%FDiXMM&a~-1xgd;`}hBA1^PMvg!0YNmFY>c1MDuW!sryGFHRL3*!7cTd;X38_w2RgU-5q{df4+q z=I1NDcDY!;T68-dbG{AkTgT;gT=@1EDc|kT=X;I()w9GtdbxTO<$qkPA20g*OF{n8 z74k1AKYCbp?^|Mx_FVo<_UvC`UeWz(-4La+J@3=;`MrMfdyJ{hv@cJUv{12joIIl^y~ z{ltWFI@H$!JyW3`E7be^Hs!B$t; z`~TD#`q}YRYMU!xh<}Wp4!4!RzJ*xZQC#jS`oAj2KNxZTOX{Q3RK6kYyUF#y)gf^UY`{{{OK}J8+!89`)<`TQOgT=bfKVwJlX% z!SiVHR@uEbi=DN_nD?pHIiTY*sgxJ(mk%-Mz4F_@McHp zUMFyVg6z(5@K`a(#pDRFf4JB>MvU3cabg^=Zh|g%Jh%89aj#W z2jAs*o)Bw)6I-v){nkZ~IPQV<@ZuPyhsSbXepIX% z?V~r+kINsPO@8#K<3Dst`CC_rCH?0Vz1c)hdp&QDa~3x%zvH2`$=656P0_PnhogRt z^3T}c?0ohMJulkvXL}bZy>g*Ax>)qQkOckMK_`1&>-@9I=kc@R2H6Yt>-F~Ll-utp z-RpI>>Tp za%r6+rc_4kSe_1b&4?B$0=x6cvnD!*C&8M?HJ zKc;>vmnl7^9nG$n-5ZKi>MNvvYG0GT`(<%Nz54yDa;yCFf!Mznn|ytaqls>|9o(*b z@ttDIanw2f5IrBFtCt+d@>%7d5ci|_uk0RloQ-lSzt>+GKPh|sUA7;Kv)_uIPrcxH z2b@=*`>1;^+ZSSZq*y&rTyh_H9$1TZ<9RpT*C}5G-BHG}JFgd0baA$Z>|RCeqBk9v zbMylFJIDX&t4)fRuh-c6({b;(UmigyZuwoW5-=v{u>*e;c@1fZS+FH_MX>J zqL+vC_ns$^q7xcC_vai>H`H+juMvlDfNv4&8^Je=OV`({WH;Bu&w0+Mrw%&B<9kcS z5hKR=y6B(~F40{h^h!=Y>UkF(`cJPDn0{OJ<9W>fe|`9f{GPwqcwBbCeg^2UIrVLQ z<@t)i>N=n5i$u>qtkF*{UXGvZ9N{0*&iZepK6ox=Jja^vl)vD);kfb@o-dwH^}=;-{9>Pqw<%(5c|BhRcNmj>tF7hDY`gZmE)#fz0TSK+wUO>`6jfZ3GXo-_T%@!;IG>M zgzMO0e;xMk?=iNB_@hzd7yC>##&$RK7}| zdVxK3p2z9u>Bz#y;pXE9*v%q?YI`> zU&#(&!TWN|bHM9LkG`*bbB_z7r|Z<8zwiC z-j9?%`hnP^ourHtROvT-|1OVGdvn~|5`CMWAb&>s{2af0+fyDoF{;ZR^W64#RzH8U50JjQ=hYoW2gCimOWW~BET>mb*Cg6I6Ur_#x zdi8aQ(1Gd0O3!~NF3`_jce?Tr+mqkxYfmqc-|_l-Tge`-Cw3xn{ARIF|5Ez=_L4t% zuNY#NyU9+PVnMrHoGN>8m{{3GoW6&AyONIGpnprL*O>Q{=qlx_-zt{Zi!0(Ao-ez& zQtVTY-J4~5e7b(S?2PRz*T{B#=UfNJ$1b@J)|(^t-}$1pTfv)T`+Lmb^Rl~L(Q&5- zv`f!lkG`Vx8f<@CcJynp_aCwTPjUH#=(rutUt&K-I@i1Pplrv#n|@dJ^lEX%cPH)_ zzqg0zj_#JqH$wmQR+n8zpDuo{=UxS!*?Ec5TWgEqTH<^i(cd{Lta)6}o&a4u=DtfQ ze?&PY=>_*mgZnq;z0&i|`?Q-0Iypcu6|^J!W7=DYe#>Z|oqKhB){7x}IQpvm6&Ry$ zE9Ccld&e~_(9c!cv*+#S>@WU~%JaN}A^Q)$BERF6bkXOIGrc%p=>zm`3;nx5KSzu& zM~5k2if;D2;?a@vTQ_?i#_$ID9Uo@KagKi||CD-d@Lcoz>w@QC4m(_zI`?Uh=eOsp zSAL=LJpX^lcyI%He>I*r%bD^wo)Z0EuIH2c|69LrcfB3$zr}sg;W(;msGatBK6u_~ zdVu`VNn!Z?&7i#z21l8fO#Die;4n5N%?x#XLrg@?-qkcNJj_FACp}hiIw}r z(F5dz(Lna}4l$xU&&OS$r#wHVIF)iZ{_vf$m-J6P*x6Hl&uf|NCVO#&*yFt?dr)@T z7rpNG_-NTV?R-T0_PQ{0%BdZxeC3&J?{;#L>?w9hyGm$p3-;%ENS=@E^Y^@;lJ~^& z9?ECC>GiVflwVvfyFt6H)9&4VXV)sd!f}kq?|6&;|2DOs{rJ5z6~vi%9SK_+d_Zo%3nY&&EI2`CC79=#K-& zho+1-`TxD-;DR+up*-ZHY@;Tm=;|_(ibL;6P`Td-4pzpoTy8rLY)>pZn zZ?t?4`=R}N{=@9=s<#FDxJEvY3;X-RjCvYwqH?+%*O=$2pRfMk$^S?BzxBcP+HU$* zF+qPc-XMFpuIPB*P1@O%c9x-k{r^CVbiW_CeYa`f{%@casNBY?;*$HJ&VAzd(hhpL z&HG$QJ8p2lkGMalw4(<1WBF^83eSfI{YjnUtoXj-J}ma8T^%B}j}v>Ri1W7S`LQ0a zbR4i1aYO0X9H&1+*L3&N_T`7g{9w`ZIC|)GuVa#&q4e%&!~$JeqNBs>(tYN`cA072>lMrwHDQ|nacNnv31(plJ=Eh=T|77=b=nFzLa_&Kc@8MPsHMBaSUhZ==OKy zkJxTVJ$J8`KmDRu`HJZHbZySVadpb~DSff6xZFncxM;o#Hu}r|L-!f)^ndhC`o}8$ z<%IDGk1JJq9(T~69uM*ObAis7FpkorpB^a`#ImAGoIUZ_M7v3 zZ;&3)Z?Aa%qbJ-?g^ZIV^auX#Ji(68w=K%?dLYi*M7d4s zVZw2H-fExx)~nN%Rlfg&^Zzz6dTq>k#ng}EqGpUY#ay>G<5`Jy3EyWOH=&@M2JZuo zm*RO}F}k(-4$k+@V!EN2Z6uCKZ_wUaJIcS<1-?u4|IZWBXWPl2Y$f`?<#t_mWeYLb zRIF_#x;;JCJ9Yf- zCHb4^^OWP7zF*}G4i+6>yQLysw0mmScK9OrYn zzWhln7UZka?uvEgcO0MK6|(*Pu+Q@~UsL`%?ZD65GLYYK<*m;=*JvaH|PFuaX-g!%>6b?w7u`A zekQxjMX$RyJYKfr=1xwR?fJDO{dx+!=PSK?mgxV57Hl`=_-n9wp7K>L7wcDv{vWA& zlkC>5V)sVTA{!ELKkxJwLR@^)1kM{S%a4o+|dJx1=R|3H=`8|1rIubo!w3 z6<-&p_d)Ad>L;f@W9rZGM`G$Ny+Pa6dX#sEX#H46SM}lWA*I*ZZ$6PddPBYM5O z=xNy*48KeM?}(lc6rn4}9A};L39eQ?&*Kk2BD;H(*f~<1r(*p;vCnmg&XMi+Cyx(% z{T%-vn^8{-^t9WR<4t%zzvIU^Zd)JS+(mB&v}2EN=htfge!uhk+=zDLIOQ4bV1Bmp zJFZRKm)*TnoZlWsH_(aZi0=>Lvp!;;ouZp7Kv!{YrSiopK&}r_UHL30s9$Ij^}NJ^hcwY=z5GJF@x>ZWrx&DM!6M^ zqei(s&NE{isYZWYd5r7v1F>R1??)NuSEc?ue&l%6<;L3o5Oy|{U9Kk*=k$~1yJh#9;sRE7lU-mp$v59o ze(QDr2R+za{to*cZYkU2+#a9ydW|E-VMl8yU-??m@i|SOkLRm-JYmTAf&X`E9iZ(8 z9}ulOJkFMLTr2*QtSeuQdT(+aiWkf8dC^Vlnit7GeSz2x#183;wPi=>s)TaL9??#lJYPoW+TmB! zu4@m8{@=C9`(cir4j3<8a(`F2Pb%E^E!*tJ{|B_We+tU0^tg{MWWSe-@wH-u`4~&) zn+(zGGoD+1kMZ}q@YOnR&mZ#t#g1o`Y(%|q-}!yj-yz1n57DdR4U~U|KVMgNm*>6b zai-{Qf5&iKddJW2v%mT4w0*>N&1f%6I9NyN-o8t@E%a`i{@(Lo9Vgg2V2GX?eO%@A zPZ4W}i!1)m*+q7X=SG|7OJw3-(9bpAMR`029N(jMp#0IHqSx=J9WA?dvY2ojjw9jq zQo@szo_|bSU{5&y>?utWVJe`6cpuUTN!g+2w8G5*;)DqHODy09{l6n*5Wmhz<0g zbSNmAyPmdSdEwO%@*h2qSE|Bebww{OL_;Ab1mG1w~n&-=I`#d@Sm~uUS z7jZl}{yF)*-bwvTm9soo^#7F08)bVObU-~d?v_7A?^-7}zaYQYgLGWBW}p0Q?|BR@ z&d1*YJPw=RtNdPnu6dvA@Bwl9usC^4>^>n5pA<{%@&~fp=z@-Bw1din zvX?_~da>xZgrnnRdmhq){$oWvlEakVq}?VR*6x{j2`Bk(c5UwnV!+fJbXW&|2gfadv5J@>(;GXw{BGhR__e-pTGSj!H38} z^|Hl_5?)77t+SrY(GPkrCLi*@uinf$Q(~v_eI);<7~m&RuzrnMN2b`9nv_4Ke)aeh zeH8n29XnAUyYPYhGwsmmlO1s1Kbx=~PDt;4rVZ!E+Npgv;7I@X^ix0Tf_nG#*Y)g>c1&I#vd&oz)_ZIcn_TJ?3%%p2TpEdnHpucF}bDf`lAnB(c3iN){;pc+;FVU3tSLyE& zy5imZyguo?&#V9c;$;c%(C;qe z?fdI>>wiVk?JI#*^x{79ME@xD^XUtcZp{AHediRubbk8|pYNl1Kd@x~uK$05-TBCT z@c*4He!1Qg*3Vx*aqm$K{*E4P5M3aTRVA&`8&Fw_y+=aK;P3SKb!E*6M;?EefzGeO`J{Ejm2F_?_?~&jm^pq*_%ZCzPrQI#` z)HeEI@onPKn_K8X{Xa;!c0T=Z`{+y61@XZ39|xcRW#D2JxclqC72#Xf{So!mzd<_M zRXi2E1V20zy#Cd|#y10t?*z7g8rVVKQvaC#3h90^(D(H`C-C2L_e1SxlWs|Sj=%!g zq`loAB;ARiO51?e<&psehlm>wuo8pTPQ;QjYnWe;T~~ z7nJ|!fg{FeiazH%6@B#G(K_jt{~=I+g38|puM@ul4u3P@-V$`r(-%fZ5z0@D|Z`cs;`Njl(*#0p2TE7t3 zr+oeL-7kAiv7x^+=7D> zu`Bf2ChgR3Z>rvkoppyF#g6p;H|siDMW3Ex=UtMoB)#u~b*X31x;a2!_g?%0{ab&L z5$kIE{Lr)C3!J;}d1vtIs{*|Tx%-cy?-={r0sX-J$$|6j%_`}9xB2k5!8`bYF3gV| zdJSC%?2Dv}_Q2_j(~c58@qG>T$3Fa||H=Tp%Jboxdc(OX$9231e`htaU60YC#_I<%SK=t^;+Y_!HFozzKYZAVFbKvo; zz{v%H2in&{kE#>iLf<-|=lXA(?VG}vtqUn1+;jY{`6$13Wzvma7r1~PRp%S_>9Uge z-l>85Yxypo{zyCI&-NI;os(aCca3@0<26VPw5cyrb zIO*J%ZQb7hy~kW(98UfzW&E0q)Bfs|GoaqZjls*?0!P5sTZ2z-3H1EPbD9%>iB{s< zw+9yQ4qSXVu!SDndLa1W!N6%B{BwaP=ldTE?mx#v=EKSU`7Md}f7b)^!T)dlm!QWy z_dk{i?VBSHh96Bi-iK>5|98Lx?O!8Dn#|YL$CGdIP@w<*?a_0_-%Pmo%~t4n4fL_v zzf61&y=?Pm!SzE}{8jMEUj}Z-w>2Mn+u)xh{_wkj)vpB(zCyk)2YMgVdr;kP5dW>f z@pl9DgKqtD@cOR@9{*n82z^687XMr8eLwLl%4<`vcIPAEhaV@M_r$b|dcN;Fd+pz# zzTXLK{92&z6_0;4_!hdBzaM;u-gIJj{LO^VCV>s~r^RmvU;jzq;2#H$pmYCc!6)d^ zb>b_3n(#j1)Bi5`5WTMcKLua@o4^L)Bgcz<(Gq&iXpi^zs?c};?d11-p!rnr_9KLU zKCtp=VDafd{Q?&c2j4NT+@~y{e;4|Wq2B>|ObA~<@1FEy{Cl*o{!7$PKX&wE@(T&~ zK5h-Z^j#4BMto0i4LuvsbId&0FfMh%`~M>4&i++k6TWv}rJu=&`urEB!8}+$n|xLI z=9%Er0p-G<>-&T6ZwfqK6u5hB;N}H^{g(yK&JG;BBJlXCz&-e)9=uI@@1Hc#AGfSu zOV*PK>zMw7EA-qh_8#xY9a+!3ccuSui}v~d*%13}7d?80eWz_b{|UX2b!>cA1}w)SNGEPCkCz6<92B-)#HtjBZU0{Tp7e*-<+_ri`% z=>9?I{?S0~Dh=A7j4;Z74TCZKC8Vc=>}H>mTw6>v;&uS29Dnv=sm*u zZNWRl_un3T_};+ky@Bly1TF~gy)*dsZGn68P0@?{?@D;@=K?#7!}z}7W6CKAFG;7q zd-A{R8Cy|oR!cF5-$_!j!@FG%_kbobxiIrGJL zM4RxDejIJazaW2?c|zH?!LN7y$$4)?-#3gdw;9)ndD!6HgNF8z|q$OeLrlEe%D?ky!{V} zS6}!?!Iy+@{wTQb8L!E&9@qZk#FzgdaQ3~x!!YoO9$T?JPbR$hQsDACfz2NW`fl6y zmxF5`Rc}6^fB0^~$-4_bO!||1VZRXE_dX`y4?dj)?uf7cS5}C zv)@ks+V2D|!RzRM1Nx<%Ts>uBj;hrn{e?@Ud(jQI_EMFG5d~slpa(1j+NAzdk?b@==XqO#uCn>W~*kDN0%pp*X!&M41!V=L&%9ojiTk65zLSkhko)aNfsd)LtI zj-S;HE`o2K% z73l`7>x+96-$oA}+!x&Uv#PAyvkxbH^`XG|2LhYmYx4I$l5pQE(!WJNh{0HWW0(Wl+9MuE$!`A-XEE2v)&)VG({BV7s_ai#D z1=qiNbW3pm$J&5vpWM-oHhS9_dE$RZE96BNIDvokcR9Q=<ivWY{`^bMSNxaWcd7mNWk`PgzdT3s9`6AC*?KnYx4n;1t)@MlTHpry zdau)e#`cWQ>_+-^YhcfLaCz`CazOiXoqbX3>cr0|N4$c(s8Npp4DT*Y`mXyM@~=pz ze^kl1ZD`N-&g9d6>${J$yAr-d@AMw4{OS7BhM$M5M=R!4r%e9MLxICb1Ixz1?%xDf{}XT>xcOIsi@ylm|50F{@jTLx z&UX?%|7qa*N2GruaQbB6hWW7|e9pK{8PED7Nw@qU`5p}P9hM3Fq95}XzSEDx{|6g{ zd;hQg2b3e7p?mGu60X07=LnrC^;2K{FM}WdZQ$f@1APah13mobNB`*~^)-Gs>GkL7 zGQPgcScQLP(4+mOq+g38cV;E^v(GI*PrA1U&RNIX?+o6%K5&m*ZoDD*f%UEPyx{dy z0;jJeUU_kT@Nq4$tOjn#KL-xc8+|Xd$$HlMf1}@7PmT3w%(}I}p4mW8^FH2@@Cxa) zgO;p^zBlDLY85|b{eoxO!?8bm?&|$G<7e2J#{V_#9HJNR&PqQQ&~3sxwreHa_tSb; z2Jf96=zncv%H69!qmTM7!4$eIsn7Qh7SMmhenLO%DtdG6FVfEWp9k)jfiqwY|CphA z^EUBE?Dd6u1^zB|+r@sy`H44eonM!}kQ&p4~%{~rDx-5k6_xdY&laq8TW_}MLi zYoPj_|JASQXYUnBw|ZIN7+AiR{AUFEpT-it^PLCn(^KY)cHZ{$lW&53*nQs$dE|TC zee~ci@??vAnIexoS6U#4=E#E@^R)eUnMc~kmoH7d`s0k)kIbO!@an|RrSq-9+l*_A z@CE7ocW;V3Xx1(eDy?N%l1LH5$zdL|6-DK-b33#$MH`Reo_zhdk(Ps9`We^{oe~d`IEru zp9RkTJh1u4fxX`j^c}$i<1_xNgiqFi)&EHP{|o%T1a5v7xck#U{ok#B0Db)juz*fY z=E)K|>8DYDHsu`PgC_LpL%+eji7y`v^nI8CblU$;!guhS?=jcu=Z^UGuO;1N8aM`* z-`t06p~vK>N!MYV3eqp3>u#C&**^?y65sl9@DjKk2VXOu-cxNeZ@iBypY6Yz^zzSu zdDr=L!Z#)5Js#NkSfJ;}zIR(N|ChHU-g9sN|M7o@#Wjf^Ul=$=|M5QI@wJ4XN4g6F ztH9$MgD=ks^!`wRJ==d0Jm=ScclpYsZ@xUR^5VeS^8(d7$J%lAzre2CLhtLNpL)Kl zAHmx7(EPwX=ev8#)8E4P$6B;|c}m(*r=8x1>RplW7VA&-?%?hB2KL_T-E#YhQ=Nj(=_)p*%e~r~2Wj(I}`-BhKUo5dNm-u7oKT|+I z&(qz{sE6qPe)8_dE7G18{IIVFmoAkec%A;XFA6>a`mbN(%?V$j9~{sh+?RNMJ-j*T zydPJ&EBN6~!db7j(0%{@gx8T5#k+!^yjRf;-v4M|h4tBYvz9&LKNL6v7R;~J{R!W( z?yP~c&m{an`X=S~nSX2g*}p95O7yGx*}+?k|NbSx^-t}-HMsw{j^7i!2duznGobc# z&)wHoC4F&uVCCAt8hUTtc@I6^Z;a44O88nk`1X$EFX8JIR-QyZu-^x-d=_IwP7Al(0e`aS}>n{UvSPm ztf42bxo6=%e}){WQlIxeJZCw)F74``A2?*3cl7gkBke|St1zy<7c&4~LEr67Nna!1 z7FZJBXCAD`cf6JKtw8tlQ_>IMmkD@>@pIofdVBKup5y49!CT}TFmHzP1^niHfD!4c z%)c@EqyEj_U#dNja`ne-Fn{`wB;5Z`v`_awO!^N5I=`IXE9z?iSF}^VjS=DQFL&_c zUOuHi)1OQEedNZR@FDX;|Lv;d2OJ?^2GFksUQ)03F$&`A_oW{92gApLZ@(7k|J;pV z4X*yHe$x7tgs*-fu>IXY-}~^rw+{I`KS})Hhkb`6kQC2~&vLVtAc-_*a9 ze9do>|J#A1X9InQr2W<4`n#5--=I%dz-y$delh7=PX(4w1}@-_7P#-)`G3mt2T3PA z)CctkS=e7-@25$BpdE)F1t0x#;PN+!|HDB4(Wv}(aQ#7wY49WY^dHbZU9J+p1y=rD z@WsCmoc^=G)*^8Ddx2}U?Bb~mSaL;oNtXt}nQ^svU z|Eu(S{o~}*UhlhYzGuEdztx}Q06qP;aQ5rTf1o_ygVX=HLHX_9N;=<-JN#ns`p*Ye z;ny8-M);QY&f)vo*OR_B3><$YP=A&!{M`9?!iNt9&L0i*zj*iMP2{KV%Fb_0x-If@ zjoj_OHQ}C1?U1WoQ$olHLwfgP)zHN{7 zyiPxNSEe5SC3XGMF6#PLe|yp?U&r?Zudt8tUi%LE%&$xQ`s%+cG>4WNs9#0-1> z?B7LiUj0?z>}P>X!kg&LzVFp#->}3!ubr-f-q3q~>Mz;HG*1t{e+}(AH_-oe_1o>B z2dN*gp_lj4HpFk}S9wj!Sp)rVZwMV0Hz$6_`qhP=CHm-sbxM7Cc3;xhJ`m`CsiXG> zKfEt+%DPq~z3cpj^l&rh{A5&>3 zU7va2I|=@`Jz)Hgw4?H#q*qTlLYH|b;VWQ=a> z-m8;ta#o=F^pX6&4(hkpS4$PxH&~;9I+jncdC)j0P>nEXH z)lT7mLVMl=Z^mjjp22A06(Aovhie!K_-~7x@m~o4KllEo^>4nC{DY?h8`P^F*G0cm&)ZS2=jyw!CEtd2_UPC4iwPe; z9$2D3kI@r-zeIhx|4T_%{4`Mgc=`*$eOE#KtoxIMH>tn)Zt(p$(D&17KMvmhWx|2p zPh64Sf6&|Ly~{sJ`rV%gR{nM1>Td$4>p=Y%4u2M0f1T;C1a}|hd*Qaf`mMyz;FkmR zuR-4_c>kM8rytGk+rjIM`x^f8-dq#<`LCw$ws;P5m?ppPlIV9dkbXZ({202aH_xEk zhVVV<+Vr!*I5}Q3@CEdB|KNFp_fEI)P4kJ=TRa-Lfp4~-3hsT0-G_qL2;Y-V`Qp6| z@1J;|!hejlAFPy%=pj3B?FSv^dG{LXyD89nCDqG=H?9ucUlr(o%kIN54r8Rspqb9=zU@z1Ye_X zy5A^RuX`^`c{}XzUF^)hzp=qT!*}}n_?i3e!3O{38T$$U!5F?YbH)j27elWOpEcJo|>xus?=>P1$S*_0`-}IrtZ9lLFtUez6!2CXb zn)pu!dS2{)w%tnj;L5=5Re{rw2F__us|?=!NT7DQ`X_?7-WfQ6Up-&mK@a~M^?cs@ zm!9)=C`UcSbMYPJX~%3bFGg+JL;HOXP=Alwg^AxX&kOcP1NdWf9`P>;9KIlM@ch8K z_F(wc{iJ&N_Uxoc{#mRFQ8Z=7saaec+1l6?|Di4tC(jE&S79|KVB`l%C5&BJ-Kla1^ z51E&?Z+1hLIUumwQh8`pCHha8CPrUrc$6uLNp$9)Bx% z`Srl&Gl4tw=LP-ge=gznuSWZaKTP-*J!=o#{(Qn4B}MIJ{DN}9`TO{4xr~0Iyb(PaP7K1>GHb??*q%<3*M!kIqCM)f6^|>-2+?DTfd&# zPg2elIE4O(XA@o_U!Q(^PN1E-3cV-5CHT9y#8)HRW}$4{Tf+ zSh+lK3_M;84qX=dnQ&jTjX#F(lGODpC*9(d`LE$+K3-rt&>lXSkLH@zZw{kp&b z{LpFySAX{0x=FnElIrkH0rVbP4f+?XH`2j#&&s_iU%S~6dil=A;O@jX7%%;vUGFxe z*DtzGy2iVcugZ8#S%(kAuRFxEzO`t_jPy-#?-%SpO*@&l`+jim-Rs}s`C0$b#QVQ$ zmwW~5Ugws?_Zf$}^tqpK^bhT573P(G+XLc#5AR4nI_NJ=;tS?$0i9g`5BH^>IegoJ zE+x43(FN_CU7PfW%K|&_aR)va!ax4AQ(T&KzMomp&*o_fpPU-les$pH^uWbS0=LZn zS`qwkQK0Ws9N^0e^QHF2#8+P*I6`keoEyBX1-7YQKWzU8>0Uy9=Oz8s@51|bp5J-? z)Plashdp%lJY|cVT)=Nj)QW4&H}Y(BC8d95H{^q<0={p|AUlj^oX|=wFli zv>$EY8`qs3a$md4f_5CC#|C&{ov$J%Jb$h|$v8biztC$>)+^-2;A@HBJQcVlU+*#U zza?;pTy&q^q5d`FTmM+nsh5nAd+KxAJ&SK8T}i!zuLqw#OZb-q^{>{hZ8_?#=GWd{ zjFL~karXgh%HLDp@Eb{|9l87S!F{)*OFMj*x&l44e;?uF3iRARL;i0DjwyfnUBZ7M za5M=V{4~&it%vBRlRrrK`Zof#3pXgIcsk*YF9fRJuYVlee_uRDs6CkQJ#_JZ$L?1W zKKgcGgLY4T61*G-cD@v-KSZDS*$)!#{=@s4>fh?YlVQ@SM{nuJ_B#n5K=&cx^Uo)| z&;G-AM%uKeNgbf%09Co7W`%a6w?3_4k1OcJhAKRf%6*8K~cb_ipq<(XL*5d(vrt^Za@D9`Yj( zJIG`8n`TCi`yJrUu&I>Fr3_M;PxMy74PjzV5l6c?c z(vCX6HTjzGQ8dvcE|_21-AnjQ|C2fGoTAUT&boeU5A%LxNxy4A+oM0n zfO*}zA@%Rzj~e`N0Qa9f|FauhLi&pXy~n(MeQ@<$-=pcjF5&K<8?OZ~0(+MS_8WoD z7x}U{KjGVR1NAfS*Mg7F3anAT?^Wp6J-(j&HwHG8kMPZk`Pu+i&+0J$YtXv~K4V@e z_q129kx$xPy+2pLSL(a!#mi5oJr%~a%et`pc)~Z}Gx(^0e|N~YG3h+#)Gni5)cSPF z@jtT(>(G{ZkJM}ZZR#6+B>B{%<*PpPX3VgW6EA1IG^tuLeQ$2i6eJ$j# za(4!uwNI~+4^7sk@@;9~k#>~STc?}_<5g!JmEW!3^POcU7(mhz6s*}nZG-2WQ&Tk*da{m^UQPyX`f zDd$Il^B)K5CsL&y#TOFZcrcnd&*Kb&SgE0dy3qJg!o4r1d>F&$JLXs8%Sl%S z4jH$;@>e;>I;DNOypQss^ICa+Pr}#08FXKOZ&_CcwF%D`PMuySf(s^|&sW4!-=Vn1%BobD}w4ftSxL+}pxn(=nrd(Y|T z=H8@lzcX+oeHhm&^~~Rr_$lElaPJ4r3HN{R4R{y+s>2sE=(?dDJNUE!9?(0q->N?s zwA1;de?^^jsRuudz$dH&t*@uuyKe;!kbC~Su!X-?4<%l|#y#@F`#<_m?&(kMvZUVt zca8(leZ>g=-$GyQk-l%OzgLy`D)UA^B<~^jq2~eEX8k=j(+>T8dT$P1rCr`D_1)re zk@(&Df%QgUWkL4JAO@?3pfKaL)9q=Q_V|6JOuU(uL#LAf>l zP~wLl4y?kTYvs+y5qG%>7uO z_N;oz=Xh(M8ZuADcM<=YKe%IOQCWe{=8(a! z*MpC0@coo^`+ywQ4&6boZGAcQ%)b`c{z2gWmjh?hz~Q$8tIr1Z$iI6kxb*CT4`|&UH=aT+;J$e|YFRlx5@ z;FR&-vmTFyjKBLO;q0SnkLPMl(p7-UHQ%{iAwRXZ>fc*Zj{cu(+BqP6i@cdL&)avW zUibG4@Fw!GkKCG~pKQtJ{gpoH)gxQ&l-EKo&04{0zzy87KY8x{R~-f6s}gKTJCY-wE6^K10TJ_gKOwz%KEg*Vo~TF5~UFz#M+iZ&3T7 zetN@qrQF%=fz1Z>yfLu;`oJFg$o5UaeJ{;_=IZB?uLxXF&hd)i>dPzSe)D?5fpz4+ z`tpJC7@{w0kFGLqo@cafOF0E_#&`|hm+%$q*$O^rm>&I1`}~1=+*j#O)Vnq1tf5cq z&ft5(x4tL-woPe(Gy7u1Dle1$m->Ul;jf z_yRdI93_7pzR?fl2*0?muE3XV_;rq+ufK%*j4|WlK19CXLTC523-m9~k9WkYPq^=! zL)RmG(Y}WEG9F`~`~dgB>Co72l}2xECs@n0!|Tu4$k5dOaVSz^7yQX8n$&UqSai{OdkfKVIp&C7pJO z-Mf=tKMwto2JM8aziMAu!e>?B4n5ZMvN7fD;nxZL*&)5>7FEVs|K~3AY=WM(CZGCp zkM*hz^d64kt^<9_od8=OOh3lR{U-G5A;0R#-wt$iA2=g?%lc5N*L*VN4VZtP549-I z{osszE9%|QzaHf_p_AaFS%p0~JPTT-t3#4h9Cqg|U%q<`-BET=*J zZPFiYA5gpd6nQ>`zB~A(0-p}yv-Sh2r}eo&^}PM(q3;)H$JYZ_KMeFgLG7~BZza4! zIo|(Mzn?vxc>PGKtOx3=zAw@JcGA`8XPhPIn?^ew|X*AKgS08>=AyPGmh?8wv2Bdy07FL_)z=6 z2z>Fel;4*xDF5WWAJ)k(blF0;8RdJ9wu6ov;yqV$J{-_@l|RZ?=cDIX+C3`tYeGAh z$Yt$g%1`|zr=(Mk)|uzZrP|%;r~CLe<+TV`kM6?9o?GijQH8IyOEi%K>fM$%x(|A? zUYSn6%_ZemXz!YJp$}iwA58uNy7%A@-^DBjiQmCj3-S*bpDui~VV*QhH%vbNOZEO} zhjH{=ZO6QCL7xWlT7A#^CoR^U=FKTr{iJ(Y@Xed459oV?t@9GzIzP~RliKlpA45OA z_EnT~WnirtShNDQyG+qbPxNTwecxgBmZV=2u6{ga-P*AZZWz}wxO{FdZ*otV+@ z1?9SKHQ}cf<+?voPmm9^8wxXn-r1nNL+1UYmvYn>>_<;Mi+Q7;(U@|Z z$T{cVgmKo+?E7ky>uBc{f&EJZeJAtCxK|lR{o=h>+oW9Ym#X*bAE8}ucSFiOz?T)^ z{`!P(sKoTfeIY=_}ApxwnQMd*re9;im1rBjq;f zr|Zy!c2wBs^pO+3W3ooBY>^v1_^}|p`)K_tmZYCj?}qXY@T+$21M*`_KlKmu+-r>7 zl#ksndd}f}TkX{ggE+VpQg`u6uzUj5sF+RHq%opWvA9UCb|r#h3)@JEMvNE0$m{A`6Yl>BzU$q*BH_);0w-?{EH4S1qc`||T#NN# zjNC4-O}ZoL)RUSwC47PW*#Y&VShIf4knh@U^p|j-@d18m0F{>==;!`wPyct!TkS_<`mg=U^Y8}x zQipi&3ojT?-L_tU~t@^PsB!fgIH@ zZ%BBDa+ko8@EY@D@Ay%k^!EJ6`v(L1c_d#KIkrcB*wU^#}NAdR^$VW;{K|w4Lsk2Jo?VU+?d%(6jxArAxW$e>K@TKy93jcZ^Wz0A#=Qn30|M8`Pt5X6O^}rGQJY!zEFZJBkeXQf; zxnlPU%DX1eceJ&iD9?BBukzmeDF?>O{e53O3Hdo@9xQrl^rJz0_1hgF2h@Mpwv+MdQLp>(9^+S`eeQQx$f+)RXo)`8hwgjklXjaf@@vd` zrXJU(J?_8MZ`}uu7(e&r9qQ|{&JF2b6}qYKFNt5#e$Q){w7Y^FG~Ruh`!3HzTJXE_ z{P<|-t$sg%pO4USi=Nq}T`Ssqq`n6IpCe!N>(K8{|BCwEsiy+e|7$}2t@8@J$~;&x zj&=H9I6l_PI2G_+WsrLG%jv`K+VeeE*Z;?N27UM6dj-COc`^?e5BX0&ANBC^i>cT1 ze*FvTt%Ns#OZ0>W^0Em%wBNK@50oG3z5N?fj(!*o)(`JjX_xRH+8*hB�sx*MSl3 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%0DLld~>1wZl}8v|8U`$?Y zUvJ2G36B-u`f}%cqJ4inVqQt%+kgM+D8;j1RQK;G^V4ji@R{IWzui&OB-R!}@88*F+u;2>1Jf zJ>;_Qy$>1pJ?2T@_X&QedZ{xi~DD-4i# zQ7XDcyVkZBz4)lm>%f41>U$dr3hSKu)#cUKd_Da#gA_%{2%^%!aUjFe?s(1+qEuf z|AKxP?4^9_dyp^k*!D`(t;HWQ{$@Sme^TiEh&JCUp1e-< zKDhl5w<(9?+3v~fPV0aEuY&#>o~``-PKND<8YhWw{m}c9UHb9xYK3Rl3)?>scE>`` zH@3f6lQ+97-0xxd{+{p6)DKg5iToLZUe|XSr}pP$KXL)_+NAe>RLMB@xQ$}vpTV~u z$|Z7Zc(lUpm#l)HpD2FwWYV81te-B7&lK9-oPZhF`la}tdx?Luuz!(o#{Z;==r-Xi^yJk&;-~0| ztA|7nek-(I)U-TceAZbXr`&%S@Xl$3{_J&g!nj`$Ua&rH@a}00*3p;e$e988bm51T z&+@WCeHLJo|Lri|y>FUbssC8<-;29NdtGijuwo^?{c850GcbBY;T83hpf4^;@tg3w zlrz6c{0{xcc4B?TN%j?mcfTqOkvmQ1uk0Z4J>O;9LL+}_UlQ&0tNk+6J|w>VZ(8nK zf9UV1@Y=4z{?~;*r}6$m5Bbrezqjb`%ZthXI^lr&w4apm@5EpHUfBDSaQL{e2Hm1R zwF>duw+ZV@q4#Z8o*${l&P?F}a;%43D0UHl{zakvum=ag-&5H7tkCw1CH1=I&*Bpb z54RV3KRQINd;h;qJrCcmc=mJZ_sP2(!T+={p*_2_+jwKbKP86z1;|TCcY~pUZ8(1%Cf$^%ljq|Kj|GqWfU-8uBCmfO=Z<7xI0D zCr1f0`fWoack-{`zkE zabYbIj<*!r-r4T~x!v1Sg;&fgUHX~#Uq;_ic>5Tk@0G7k5pDZ}<;kLZ)Q|1^Y^Sg~ zR^i?s%a0W8bwI#(R)>l|W}fWQpT-A@?|mY_TM$mjhwugC!1BfCI19o{;&;G!U!`9m zm!h%gjB*smiMCyHgx=8yeGk#?GoxM>w3F}Yd*8Wvq4KLEU%Za)ULt<~GGXgdVFYde zOOq?aA6_LKT`erYG4goD{OWfNa_E%#bB6r!J0yb}mCuy7ikH*A3&ur4|FoZmigCYY2f+9n(679IIvFaz z#dgA8U)cS$(0-HrzO3zpQ{?=VerY>@+wt`Y4|Y&Kvu%X7>+tzXM!7uCP7hbS=vblm zms`j)-_uzz-lsoMyy9HaokzN#2>q^Rb47SA^!uB=BSg3Up}gIl;eS;a?jy9m98=#- zLS!1KTrH{Aa{?^?q$VRXUH$0sUzX z-~KQP#&eJHYdtt+oKCM%J~`M#&zSsJ{MGeB+Yv`U6+OO1IJ`r+yi>R;g!x18JwERi z-Qqj;13hG%HyQV{ACb>oXgloH4WfIrYw@7yito)I79F7Pbnr(%!p~%%bEY=qwTW5)G_|EMzY7u0WXt>}pVThb17{?GdjedO(e@GkY+yhrJ~d?%zl z_KO)(pS}AP&+GAub;W}4#v=+}{z}-Sej3zQjd=545D)p=y-u|Inb&bE#;xzEg}W-A z&tq&i;C;|^TZQMJ75e^db0^V`Z}~F%i1^FT5RRPhAg|W^wJ}bI2P>Za%(NLlozul% zK>MD&{Ur_=Ki;P(X|Mk6N;h&n(T_ZD*e<%yJQA=@OG>3{62G8cZBLXlPTGvi!D)Qw zyF%;9(SD-sAAW@V3HKG>ei(eOWBF?Ft7i&}=L?%}6V|pAx;_`^VSc|P>MDE)`n|2y zd&MvLZp!>xP@epw3a@Ba`cs?t$4PpwV#d>ew-+LjGXs=vh6i;kALPh&%d4riyM^Q?|&`OXIe|~XSWHX zJA{7Ec94s1g3G%^XXw>E(vK)#$vVdViu&}&I{QoMM$&^r?3Q!<*440Q9{GHgd85XD zk>mNjm6UmQ%sy0xpN-V-7ZTq2H+^qHzP7s#AJBh{?g#n5A@$^Ue8ZnB-1eP*58UgT z@tF!=TL;nZi*Jh`FptF0_9yK71HKP#IowB1mt&<5cNba@E_M<<-(J}KvT%i*@V@to zaq9j$AfC^)mb)ljM!M+%q8s$z1>?%=*Nk!P@jPc-kNMw(c3xhnd|SVJEf(*HyBi7x+Vf6?~CQTv1P%__>pIIUkU z+V77{Xy4YK#Bcmn=yh)&eR;w8(2DhN^*6=yzN63WZRcfshwd*GufzBpQct#1_IhJ@ ziQ;*m!E$kQrTCMpgdyz~Wug#XR6wm9E1@%2dPLA#(U*xO( zV|#ye0KY>%?hkGH&4Ti^FH%0?8A97X+MaTO{OIhWaF2W6Z?nJOYG;MpKGg5?c|Uo= zc=Nkm_Qy~s-*BY#<&Hw<>vu$auWId{&{2wKxspSB9*+)J_?-DNXPny4_?Y&H?<5{_ zWAAPYdVtL!U?beA|98eBX199#-2|>9So(zn9QQ$iSUXnne14cPzLq}_ z-*&e?KTJ;&-{&+VzSpPUj0pERdr}jRS{cZZ)xEBA{KZO6M-rfGoeZ)^_2frhg^PSa^ z3LlYAF%|9ivqsGOZQ3Q|ze>vOb%y_^Lp@ZdC?D(DuD1npq<+4_eIFu1jxLzzeE#Kk zK5YN&`+!sC^PG96`E%tryp{6bE{qCc?S5hVK4A$RKPWnfZXkz7PX8l?+uml3-dHft zPG61wjNaVAPjmSK@q^zfz31;1>#$@lzVFv0FIN06`DEB{bkV0L*n6z7=kR%M_&4QK ze?U07O*p+p*t%JmUMp<#Kl6)4Cl?Br7YJ>KZaan*<*bfYxckNQ2+}id2C?Wme9tSk zzY6F_UiW3hAH!d>!y-Sgi)}yT{cqblMf>P`lRbrf`ghIao&00^a|ype{pXCofbV(U zYg3*U<29$gQuMqg{lfN&-d9`FA4YeoJhp30Sm!Jr6@Quteb1rryuFwBG3$i>_e2Mj z!~0v++2ZHq6Pzcy#XM>M2vg_`9HxqwUMB2ZLAoo2K95*H+pc(y-rM-8;)OpGPHz?F z{P*Nnq9=?u-)F7Euic|?-?wW+`@Ou_`TSDxY=|Ph!?xRco6XeH)_D(>r&jaFlJ-pyPLdN-1z&Kr?m)f2={fo-w_d@-@4eGHE zTHX}UbNZY8Puu?3c4>X|P}{S#kb`yFDbMxY*`I_%ue;d?xBmz4E7z&_3^`awPS)Kn z$P>S7xV%pJrau-guNK;0w8u+%gZNYaCq!=h9ofdYq-TCM^AcSzb_6up)o-|3Ow_K6eZ;(+z7?VdcZ+I}iN zN%;-YH*DuMze@bl^7_}Jqe_?{*O%r-PQ~3KVrNQ@z)pDoCKKCcfWQU2P_MM0?mj$Z!ww?T^U! zIIGRYkHFSPNWX>9{+K$n$Nbyk+dej&injfBzLV(kD?*QOIJ)f-k>x;x6Y#{VId)|K!cN4!p7W%$Qjqli>XdAg-(qFv)>USqH{?Gbh z^H}9qohtOXvF#zcr-<+K#tQvw2%7HkJ)eKp`OonQN-CKKH|GkLcXByquH;i{S>FiDPDY}Fk&9JKZAKJeu><$9dt%}6^HO0!aY8lM~FW- zT$oU=wL?YMp;v_4-;MPeuSYBL@qNK5deZn9@Bw!c#EZ&`0#+@bWIrzgl0&l9!Z5Y9YXm7**7 zOE4l`2ee<0rsXB|JH1)yTQ5cb{g|+WpSlTp@C^AlTJrsgaM>5;=t)iXr^md*vLJm6 z`;h6=lz#)c+IU>)I~Doa|Ziub*o48{gyidvx}v=JP50 zPxXGS*SiJv99TXfUrPFChkk5(XZJ(jf1lF7Z09*gKb+mG{}|;$+Xc<8q#iP1#`yBR z=N04JcF^tp70-6dUgxLOZ!=MNi}BLCK(z1W)h`jw5_${bznF<>o(Zzvlh>;(mqO4kW^!I{aVp zZNKexO&7V8QhzSD*F{VI-}-&?7V@Frbm?baZ`9~t-5V7zM&8-4c67P;UHYxx6KNeN z{)~Cf^Rdr07kewb{1W-@EcAUi+wo4>XPkUh;l*ym-%Hs48tI0@=GWoxD=fb$w7qq{ zqv!?swf7S}-A6d0T()al9xA@~uY8{CeU}7%%=>=*RPl4_HF!*PlYTYk93$qOpoZLU za?UYf{_?(p-~Wm~uYBqs6xu#FdV=WkS;EoVg;7r!Y$wdN7y3Q}2Xe-fvm!)=y=;evR0(~W;eVT;N zk5_mTJ==EDoq_mc+I2|$JQjb>ytrU|&grk#^Q?c_4mhU%x*u2iQJ3#-D~#yhwy*Gc z>YV;Irr+DnDnM@8Z|DL&d2*8So6f*fg`O8@%#Yq@3C>iwn9#Z;s7wnec&Zqg4C`^0s}2X#3x=9boVi z@$Hx1dQ69TA^W|;JD~lh_WmsX{BdC$dF6MwbLPS2eF~r6F7$o=`kkWf?{q-FoZTgU z4S#dCPLP8M`3Cf_fchC-uk;o7g@)K|_#V-~_YSe|Xpvv=ze+d$qp(H!t+y9< zh~K*jq&_{arj%oTslv;vg|-{-|5S8Jd)ThkcBAtv72ZZq7+(v0gV6Sp%fE=WzpnJJ zqDSa4&0mUcGB30X(Tf}5Un89UNN73GVjP#qxdORh{V_-X@O`mHOKC|S%hRkAJK$bZbZim{`rv430Vd%o}GcT5JmqP;IWV!kL&5WmfQ*dzB`^TxAQ_8!R|C!YLS;F!M!i@GD z&_3yT;x~zxy1i-72Ks~THtZ+J`&l#QxdD1wpZ#6SpB3x*0s88K`+LdX%@?Neg+kkUS*N0qnZMYQX)d6($c zox(Zuxb0JF$e$_wF{8hw=;JBl-}-8{P(Cy2WyO5Agg?DX;VJosjJv7FHCShyxg5T4 zG-4cdeyDtG=W0JQmA}XT_L*n9h2nSa7fv1$4yd02^-!lDtmt=j(q+F={5I%)<#tKF zzY&gU&lTwRFQ@cZuTO{c?>^&b369~175Ra_KUXkL2k@J$bNi1ge()Dz=JscN*R5Yu z&V=#=(0%H~b_u-)l}|xEd7pcN99YpmXRKGfUvB+ArhhiTG4(jUTKU?~UI#g4e{DWD zZ8J|Sm``SBD4qLb_agG4zxsTjqWucm-RC;?pV6lr_H*a;P09Ey2p>={4f63myY0=J zxxPPOJgvPO%j)k_vu6`+G{}j$H>nL{m2@7^s8B-cp34W&il$^%G*YMl@}}ifO0h8 z&%xDo3U8ywRM(1LP`{o>`;^oE;Jr^UMxRcYH@$DZoGYIOXnP0yuV}$f_)ptaO`(0C zx5j@@$$x$ZQLfRi$9eGfYZuYp++a9H&UZ&Xdb+B70(5G|S#rtXY zbJ67gN91R{ETA9wzcTCNtZRnMLlyJ(nE&=X-a`IZP6b!0yb1cknm zyNEgcr1OZv`_OgkpT8%cKY{466ELCvtuNbtXiEQF&@Lf#mvYUZYyYc!1NwE!zSFbUhZ67G!o?xNf^gp# zt{)@*fPB{M6v?lBgu>_K*WX9>x%R(;@jU#gZZy@k>dN_ zXpeDUAio0iff#+R&%EXRAh(zINz$(?zxYMM>S5`@@l!=-l;8T^XnXOk-}crOJ^iE7 zB{vAeYlXG@h2tkFUTr<{{jhNP31Md&VfZQGWK&_XfiQZn(0)+sl%w|z@tfZg`kcN& zyV>8D?cJgi6|ckks`1Ugr)@{*_lMdKDSXWQXuHh8Pxv0=uS@^-zC=#HA0w|@%!f<* zvF}sZPRD-JnmZ`p5&g0EQ_>UIlDmN-jANK4)Z>6 zj(oBn?R7xL__RE$F>XWhulPTolh?1+ca|Q{cZ*(_23?=t|Ecl6_P-Qds&w8L_x@Ak zO!248o3;b?zVi4ah1acLpCP&;U4*`DKOZap+w$3dGZ&Y*Kcsv< zXDCah_qqS#x1#Omr~Oya3+9CcJ)*_F(#ZQu%$sxO%{Ka4;d$sanvZ-xV}w1%jQGA6 z6p>$#{i@XZ^rlK*3xyN*pX*zSp7!A5zoSe30s3_Hfc~RP|Fhoi`-5Zt%lCo?=$~uv zt*oQ`z0cRYPx*OYwtk!F5$OH0fchRH$Ag;{FGg+`jGwjh{a-3Px)yb>;cCA2+hNdA55t$CQj6Xxj=^Qp&qPW|{j=@fb5eSF)i zR14)ZrhctICl86A@!!esMEgCB7X5TiKk<68_?zMlss91>6GP9zDf+M1YkpV0#<;RR zo06aPT%YeW|DXEb%JvTEn@jZL0pWGpy-vSx(!LFkTlCyH{dtPM?ehuS`BuNyf8~z~ z*Zk`8KQ52`+zjbYL;KBOosrOA?H|wQ8ExugMSrax(RV7wkN2f)XXf(@-zzDVPR#HW6AMK*JZvNGA{+pOJi_>Ufw5vpDVA~cb%ksD(2NC`S{#-2A!P6 zfAGCI|dj~ zwdno_h51LI2hd*;CSMYEb{E=Cr!f(2KMIQ@M0*`nquuSdceJ0v-A-%oBp^?^jE@EL zo$U7keXo9WBl*(qb=t{xJeK<{`uCFZ zFN@sh_KI^mOCh=?3i|?IH;jb9i zE9S)#x{E&T^Wl!m&416YRlY0AJ)s=q3&r<7*78iz6OUuYqxWa+FWPosG2_wt_bO5P z2KhEG5M4hHJQqA)Xunhe^pbcZ(#7y=p!2ugkoSXYsq*tZr7quD%a3yTys7^K#qYy! z^IgBA&}N;nxKi=F&tI|5X)VMbAXl5Tr_U99Up@Mh;?0?#J#XjC?|t-#n0a{wX6VTY zbl>m)SwCxO-e0~^7`26dS37vUXzy1|ey?&&-YI_T1mWTf!odc@^sB=9k;3kX@V+qL zSlFi=-WRf;feJl!>2X58E6|_(?!pi~uTMRUkPl7wZ|c2&y~-WaUu*O?pKE0FGuwIh zOU3s(xXn2ByA9T>rp%wQ{fAJ`C3@44^^M<+D5!tu<9)>(y{zGVKJ+cm&%RHVK1e@U z32Vr)l>hBf?)jYx@1QS7%-_BrWqD=$)agBnAMrna7c!u~dEa!7J~QTf4dk!iS+m@T zmdYQ+wbLw|W{rmn=StH zLdx4?{AG{nf66~oFSOeneX{owjj#E0g|;X4{el+Z^_MB!?;!PQm*%6&*Y7Yz7l>XW z4{iVFbKrb`g=d=y8)IST5Mg)p5BwjB_J7zO%XTyc?dAPv`{&Cj*Uanxx2XI>{?qpX zhwPhsKiT`@UWdhmuaFnDHz=QCGhxU+K#Y9st|xwn@a)r~+aD4(*@v*7>wtEd{YL+} z08{ir-!Jt!Rls;zG9T3F_dd5s*>7mGFHycm-<{A8econ!>=F8Rc#gjB{U48auYi|9^a20A}9K+zpb~I=!4mJ_1)Qa!p?fa+G~aLU4^4vgv$s%dUm#v==g=g zK6cUZ6GboHBn&nd&OacWf#oL&|1#k_3GL_Db~42Q;`jF!rh5tN-xqqnZV4TOlkX_J zI83-^=S#mEvhH@hwy5XjFBN}*K3g#F`aZDVtto$^c)llVzcLfnS+ipmZvVjESFt@_ zbicxTlw(D?+VDf>m+E1~E1`X_yOoRI1sAu7_I=&%k3`##bC@;`y99^gKzuj@(aK2Q(R1 z_G7a`pZ5L#=84L03E%qj_qC_t}y^s$5;#-+D(I`RaRX z^P2w0_e_`QE3I|KkLjmv`o#!+s>ykN!oIK90X4o?^8GRUTNCuyH9H5dhp5*P?bq?T z53HfLhS=}7;rso~0qHBotJk?D`7hxwDCZKrZc6=IzqNm5mow!Yrov9D^J>*c!uNZW zD@Xq-3HLij74_C-JbRzpenFb_iv{DSb*S2Fd7RMa!uFRH>>~bvdaQfA@LxU3+kd;t zS!3NDzgcvLe$~2G`Lu5oj_F6a_0lIO{*?O!75yQG_IkzZjTY&=j$NY1wS8Y>E9Ez^ z{Q8vWcw=Fge23Iu@E-9;l)FGKm&oNV{jScqkLhOtT}6JN&%Nj8i|_MtpDVbW#qShuzb3v19W!r*=ut6pqxLh!w;#U@ zeh&J6d6#)}&U{xPzin6JeNO9174v8OHRYcK!r427_VZjv4%!Ynr+ynN#TzrO8??uQ z_OPG4g8Hu0uWUzSe*m^O?rcvvwi3=MhwYvHZq4w^3io@oA^LHO-ktUpUL(KScA~pO za5tg-3WgKW^}~d=$BFk59mVjE6x#1b^I-UU3wDyuEB+^-ycOlo(a-EJ+%$UPtKnCG%Z}a?Y9OJCxJw zkTLVF{RntpXh8m6H)r>$yiqBf@txr>LewMQoQ7cLa%!R^U=cx$kRIQ zX}eRS_16aDFa=}Kc4=&mpF?oA-^|H!C0S zqk7%Zxl4TCk11*Y75wM{g|FyG5%XY$eo(zga1S8q{xew?tot1$SyumRnFx9B?az~p11C$AU&f3D6v z{9&p}|1KHVjx(cmuZU3hxYrE}$`Dbsib}*SY*J*g$W}lgY*Ila>|xU&AQeT6s02_6 zC{p*j*S$JA6P;1(Hpac<{GR9ce%|l%jDNk)x%cEIx%ZwW=bn4h-&Qz4-=)0wjDD+c zQa?C(`3H{MmOQ`PO&O0h?=eL0 zjA$?Ay&C+h9D5kuNBuOzAMMhAefn?7_g+E&kD0%1`XxXPMqHQDj`Nq&JFER*qxW(i zNQ7Tf(2qVxX7M2LmyZypjKdl~eS=>;W?X0RkMM^={HX-&!&kz$;JqF1cE0iEp1R)< zKf7Q)^^oHpaz4Qip71;!p3nMVg5T#jYsfqv;~(~S(|rp1-QT4x)>T@>St9Jyiuh26 z{_3D7y`EYlALG}l-8T2%Fy2G-$>u=S*GCI;p2z0^dcV+CyaK&D$8MF#W#;}w&kXjW z-JOI1^Tyw;KA*1>tA2X0aKd-~Xe_!oROoo~1Uf>$wU6ccBZR?=g*A58>#shaYKXoW z{8jU=V0_2ufrN4F(0>tnxB(qkpAsK(yvO^Nh96VAK99%$k6181J^HQJ)^iTf2LazF zA%1-STWTkPcD&blUJ-hDg1uW-8!`8l;4~oy{sihZ+9-hj5 zPoo|DUi-7XlT;q?oMSMC-+355U!lkIL|4)terO3MXQ+I3kvKhS&Jp@QQw{Gk zWga@N8sqOIjL+72uZ&yCJZbJwdyd!oKNSV@x2C?Pe@0h}-}?ofmt(se{*UTc=vA+S z)y)6yf2h9CbL77kZ9CLMPy1XW@BhfqJu*zhM5) zXpUd(eJnm7rbdrBpLD|eMc6sVp@!V2#q;;EdxhTzJuu)sw(<|}BKchT`S81)mpa0) z-uzhavB2M-p`Su2zFXxIL&*8_acvHf$OH&Aik zKKjG!$o8ue{ErszwSsTJed{0U`RCl%afXC)uYY@<+i&#vw&=etJNRt%XS{>30ekon zF?OPPhU(||5eamH{++%=^|qH|?9G_^4LHXxFNq(O`0aiCqvq9WC;X6bdXO+UTo|1o z?7UGJ7Q){3!rFFyd!KHqy_ zy$3ef<1um8sjp{TyLVT6KJOvLkM#dITKKn>zZ16?f6n}kcNM*Qkucg*H~^hb)ZJ0# z9r}OHc%_e1c})9`2M_UEhdf^l{rCF^HuPV>c=(){HP3DTe8D&c#90@<-y?K?=kpKn zhimTFr@t2Xg9(0jOh2rU$1(C=Bmb+%sNFt(R{~veUCsMf@MrYj`sKQAnFuGZ76$&# zKu_CQy|ag|Yk@QT%jr=n-=xCjS;7)MwfU3gnZFO0=(lttz8HNnrQL%0 z6;`@#gPrw0%$RzA*QNAFir?<_0LLAMFV=l5zmr#qj`kK#_Wi$@Lib;z@)7-(fvuBN zKD$y_o+_-7@gZzLSOS=c^N=<~Bv-gAs!>~ol-%fwgW z50B3iJ$(!1#|yhh3#&tf^9w=7qvv?wT;=wUGRC!FyffxSeY5y-zGGIP_Xlsjta|T% zXt+MY@3Eg&*5Yg3L;ddWe(S>?aWmVA3O~~Ob-b^_`IB?()C4=@@9#0!bwI~wa{S;a z-&@mP>UoCPbw6K({B-e8*VsMBuX@-`=k0Z|w=?X7^Wm1*(*bsF0bd5%eonC;1MI*O zIi3;6DA3O#@t_&@ZtxuSuoOWhBUk=)zukRwh&foOjK0nFvZJ%%IID3fvJCECW zE8bt);2(|YPy4&xhhV=w#Sa;xze2u$rubDcsu>B@sbdE4MQ<%S97@jX|y#*RO6TcOj_|y0h(cMQ0 z`^<0W)pbKcW_WDmMUzx#X+`)T8@u8(-H5Ig8R*&gKq z`fCb*{1jd1ca~cRTTqwiR~31!(`j$Mr+nb^es~-Wb2R#6QlrQF{T``TKFqytAFRKDFOG#ttnW z%k|8cn)X-dEuTLUu|DW^h%R<11Fio<_&Us+61(F#V`jNz9Oeh>{_}l=y~Bm!YlS)e z9WYMC$tt&BvqpX$H>r>l`?Z}@#J^&^2aIpTyx&@nV!p2bB)d`lM7X$*u8*)kmgfS! z*Bqq!U_W7bh_L+%VZ}U|(Z31vvc>!LkoyAvd2phx8(t*LFBNWf5>D_p*4OFzqFb?Z z_>slSM0+38>_A-?@tlK~iw@~0ukZN(OU|>jpW}TbUU%|-gVO5<*vApi)dCm(e)^7{ z$M(zX0u$n!6?QT_PJH>Dd7ozr8)GPX@_b>qyRc7v$$4|dLVoaweR-3+iEn+7aCxfG z=Tq5F&i_&U;<$k0JafLIM(8*1lUXBgQ{=irpOt(EOz?+O?l-?u_YJNQ`oDR>6_n?~ z*4u>jMZyXGaQ{rvvs4(JAoPC&2ZxJp9RuQD`#-Z&t`Ck?efLmd1i$mT6a4<*tEw-t zhcn`n@sjJm2i_u#-zUsJAl%r0zgTpHJgxA{qQ9!Vyc6>iKW2@8Ie4(joo89#Cwkqx z#7;P$Ysz>m@c+E-oc?C&ung(Ps{7ofqXi z$bfm_c*_KP8Ss8J`hN*uh#j0gQ0+NSZi4>l5*KWCReg$|HjYIPUnh*vujT7S*Lw={ zmkGzVXSPrGReAMKLg%kJUoGH$y-3q*m^(FE3Pl`>jw0H>xJ;YNEq~m<+Hes`Ru&E@&PJu@mIJE{+{vv zBgZ|R2bVGLbLM^e7~N-sJzDQ9+TS0c`v)wT&n0%fb-MWL!-eyGg?;*Y4m#hXk3Zpc zf+ce0JPhZHPLT`yX>Ih)>Y-}iayrFscweaHcE!9(vHQ-8ZPTAa=9~Lrjz8ykS;hGG zw$c53Uf7mDPCE(h#G&|>PZT=to8Z6tTo&i^#EkF!)#4xQBdqCPuctddwsoxP7bgq- z9X7;Y8R1{F&_fyXJ%6S66KH>5I!-;nuc^^T-6x6Pc}v}=h~D_Uc+ZIPoPOwo&W~Nv z@6N*x7`HX{JfOV>Ts)ok;(1!kw;uh}M_wm8h_B@Sp1&FG7R+a#PtoGO?T)USGS1%T zxcnc^rd6>$=uue>}_&)a>6(ED!I=+!oH6vwL_XO57QKK-1bX9DzC z!+mPLcN|9=VV_3m$vJ#JCm`kfrNEC~5$8$qiwE#~-&XWRJ$FrF*M#1emolIH-E9A)#-AR2T>SIvg+4d0 z9EtY1a3%g>ie2epcNPy+e|vqm#9m~KLxMk%MB>ZwGkji7aSxRbwi6EVGaR4p-cRKX zZb;m6W%A5Q0 zp7>`G^UCvUjXzXk4;C*Fzx{><_9R6=uIS$wzhVqsQ15(+;YjUdhYQz-3VVkLyYN?g zimvJJ_CWOF`IMvgZI9>7;|RG~@;(*%D1N!Fn|u>o3X}H=S786+l;12&OX2)DVReeI z`w`*tT9A3wwf<&4tX`}7=mMO`q|^q zFyCAIseU*SPTnr;ohq!46^;)UcHbaeF%Es6JKtO7{;r(Tj|0Y`jr_NtBfi*v7V_yh za{NfuJ1^b)8He~Q740mb2k4U(?;jy&-p4t5iQ02Me0MkQ&vSI1DLSN`KJI1k=$WC%iGE+cQP=g5 zgW0P^k6$Q^ccI-Kg=^-;0D15_Oi20aDO`_#ly*hW(6{~$UZQ7v*2C^U^xTYbiJ`mb zSH~BsSE=2}D}^=vx_F-G=`)1(qg#w;!t-^Wp!&gM!EJTiQRKBL) z8{%N~?UMW8E~<}SENt;y^K(Scxu4f1yx!rwv3xvt z$5cMPP?-GP_s-;2l{YsE{ok~b_nvaydZK#&=W(2ib{@6QnOhU*bv|>O`O~>n{QeJj zbdhMEqu}#+yk9aQ&RqS2#o_mTuEz$dZ^pf){suzgAiyu|-9o~Pn%Iz6t?N8SPYbLYyMux{BxS9Hja+xEhMy;BWZ7Hj&D^*tHFQ!02%* z_x_my8e-bX#}PItP~Db0h0#fQ}H^rOP%PleU(-0uV6 z#lkuLP@f}uMty>P$gmF~axl)sw?YnM^nlM@3GlZUjAsY=i+0d;!3%{wp5J+oYb(X`fTBlc|K!4JKr<1U1MBg;-n?-xA8n@TtoPiSE*f($7m|HT z^!5^8&Ajt`PRBeK{ni85^wS7GYEFO0ZxjFeH12z@aP)SeW8(g8E8s^v9^6K~UI5NJoi_~s#rEqb%a6@_aAkp40>22 zeZ*feo^AAChx-MWsXjbJ==QAV9H;dEpt=tgU!Ug)TB1955jtORfd9TAzUjD0a(D6h z91H(XZ${kG>;L`_<<@^Eh^N=Ye>aS4g`I65!2OYr33@5RuExk~@FMY*=sC-!^+@t? z)em{k!Cggf@Lzpiz}ETLynppU>Hl(nVe?Yq<_XYu7X}w8uG~3PxOlJ7=YWs#n^V?v zx6VtzzjfTi`4%hseF^`Zyh)#H<#V~`57T@2yUqK;6a4jVqUT%j+_M*puAV0>9x7ZD z9}hX7Zo>apCflk$puN$%M7PcqI-l8b+)1YL#reYS1;WwE!uUvG@^)bcpa0|N|44T5 z>wONC*SEXOyW)O&?-2X3Wc-)V+4ic>8TaO~qMfJabts=RIPR$4b|%2zDVUFro2;KK zzGO$C^FP&#>HXR*KPH%AMbb7=29!q$6*U(BoG^?;{-SCya)|7(0`_iF)L5aiZw_G@<>8 z9(uHkU5hSIeQ=?01)aecpUL%S2+YfQiS@+` zM0lDl;c24+U?VCOZ3o&e$B88t-W-=G5y*(P_*@ThM!WOtn!9_ zog60G`Ey;$Gv-Tils6i}!gbtl#`_JJhZQ)cf9K4<7V~I?9`XDfBX>T3uza1`Uvt0uP|+RcYw~yP_vzOf zJrFaFA^mKWdycLpa0_PtZpb=0k_~U-5qHr_tU&2$v5R#^(uhU^ z6WwLrFPH~Y^izT!$hj_K{3^Y@ z^SL-hbas`n%RKBKCVE6arVkSBeGtI|L=R}c*an(-XLV=M_J4!ti(U+bj+bY)}Cv37E_j#*uM!&Ys6`j%l3+%?idg)oJp9jJ<`Z^hk9vvz4 zdftfdt??67UTrJ%d4RL~z<*z%l7ELHFStER-C2cYvb+g}%7Kpa2&i|#Z1zA*h~+IhUN!EYYzE_(P{VVnHy z_^zVMJ5m2zwG;hRxaK{V%So>K9{zMYh5r=c3ctA^uVY9Ydv>+z zQ-3eqN&WBq#N}N@`y8D5>7qBW(D8uvPNKaZA=+Maa6e&qe_;YW#jkbzDP$fG@t<0z zxlf0A@A&QFX=-nV9t-fF?2o66_w+I1s}tcI{n37>=*~65=2~I?KH=zU;R2j|2)>UB zySE6dj|hty_3ssKXs2I_?o&T|hv**qsX*RV*cI!w9KU#oo$I4#w(QacYG;0_u)IQ; zg44@I$L|sbU=Q^B*Vw%V{o5e-(_GiJp#$`B2mMwYNBvR4KK8#lLUeqX(CfaAH#zP) zLoavt72kRv;R64ugs%2ex&0~o=P~1GJ2x1KZ-_tA;&}@6bbW&A?VpTJ743Cq$0KLQ zsC>)6db8-5>od@P%^JO#Gd}i1#*FKjaUAm;eQ?Zk&i#J$M~C-zUT(RI?%#f@(ECKa zpMSND%6lDQ=Rv~OZzb3E>pBmU{~Yfo958P}+V}kK+@b5|pAgRG!qxkQ8^(XRv*`5= z!t7RIoA-&(BcreBIYvC!>e=FR9IS<(;yi(d{vR`s)?@JxneVFt8f<@1^a6RB?k~E7 z9dErsbi_FH85i5N9^>iwbI$X$7$3*KyR)p@!uMQ`}KK7NbJxAKDM|CI6e_dx`mAm_zFx~^e< zjVw2yzvt$!6`%V(M4s%Id);n^pORZ&pohBXpNjI$0cx+uyb50>di-LczmLZMDtfTf z|Hb%)qF1{L{XOh_r2cDEzLm#?9%y*~)$>&E{W=rgXTW&0&R2c;c43Tsmdt}8?fCo9 z^DyT9tZ#DqaZNiB^PzVf_uozEb2D3>Ux%nXLH~N)WX3pW*cY!8_puk_59zw#D%wYm zXUwO9`Q>$$VteuV+>P!NMK|{lW)Bx8M+yt(wa;f>TK}G^`Zo5-`$YUbSG_{@-Ny*) zhYEdOVMZSE;yco7~mHqy^iLYS2z97$exKex0H}5k4Tg$=P<$ESQAO3l2>5}u!Yh&FNP^k(^)&F;dgD-0hXTpcDXzbOnJsOPGW75YC- z-X~O$KhpV%>X+ohtRF5qCXc#vx!PNPQkWA*9^P4e8Rv8?wiDgM?{%I{@&T2%Zx;Hz zm+Vyd_W<{&erI9BdoNxldUlx5c{@Y=GFhriNw(>rTC8vNn*!$i***XAjrybo}!+cyZaj|(Tr@feK3<|gEYYJ=ceZ&+Gj@7rDdp*M4r= zskm;*bxY_G^(oJhoTPT=V2S=7f{ufi*zMI`;tyWKbEC)8=ZmhNDonNmA0^BlFZ4NF z$wNeU9w=P?QF2@G-sR5npYy)Z@vhY4vaQN{|EcTa7WBP@8{{TJZi=souVEg}KPGy? z_$;>(T|7bjx_)WHF&P(0wqWTp6`H<@l5;|^P(oW4hm?1~@GuKyeALOnD zu8_y-64htt3i}rd9Vc$nUiSi(`y7?w`Jz*uL5geV$vJ`*{4EPqKNPuJgVE=hY=IQ296#Cd}(0<=!WmG0(kjw&XdS z-!(a0*ZUlqiQ;?55NU>GA~u$`GPRVPLA#nJqAnc zTlpQ8uWu19bK#VB@=tRe^5%RAucNk)SH0~_ikxiFNIM^N6_%dNYJa`HmWqKN+wNG9ixJ zxf|nqXQB7g=GgDSb5-7dzHreOW;?)-K1lvaw9lJ}nLjDtN$H`gpB*NQ&@=HXC}%!9 z577C-UbikDAijd@*6$ZR{Dg4wIpOkl;pmgX0=vIPP80lt!ADe|-YU%TpS#cn*!!sJ z+xXKxPNKO0ZT9dWA3-cE=A~>7V;dzH=|we>sq6C0{nH$e+PXq#J_R7A^yi2 zyBC2o?BDPmdY|et;S~EEp9_7q(ECk#XNn%6N5^MSk3MZCqC2Mv7pDqqaDAfa5Wbr0 z*U)3yFVT1QD;7ML^K(b|6AjNdMK8ADOL+c<_PY4Tjwf%p?~?kQ_MBHZ;Ci2z>bPgh zd;2{dkM8nb1MHIHBW>*7>>$0j*OzB67VWr6wX5j-cb&`IaJ|(;tXG{g!Zr|GfE<=n?X2f1-Dc%7d}cc^ug(qI-;E$#>P}P?fJ3 z2k&=qKH}go)yL?yjPDlj`*Ys3^FQooO%Bj?&SUoegU+QYUtc3^-YuM8B}~D9@(g+O z`q6^^ahx}TZwOy-x!S4V>%CL-jCR|g{q;WlZqITbA^&sQ-O4{hU&Qa_xzQ`@_lTbI zUMbk6oq+c)>3{n>>x*<<>tdn(e&>^o-lp>YsY2(I*?;r=T2kKw1LV!?Pt}3CzF<7- zH;eYTIKJw2rG)vjmAA8>_=o!lm$7iZhtPTX>8t*4eP>VVUoG^yOnC(5M+v=O#qmj> z+u(S^96jdq*{yFJPxp6V4?WW1d7a?CZjs+sy;?ZgUKl@C*gQixz`x6g*Uo>T z^6buPufUHS!=K=1rzQUCn}xHsFx^c!IbPU#9heGh{N}I_J%a9&FVeqJ1g#3~G z^D19|Rv3N_{G~AcM?H7MKF6Hr?B7%6qmFRW7H*y+%%3S-@_jHS9^Tqb<%2_n{lkT$ z6NTezh0}$w_d{X$A42bQOz6kpZ`2cSUi`OcpA)vGzPP*kz0W+F?_C+5^|$t&fq z4`^oy--dPu_|NvI&7XZl_p8x2j(aO|zM<=5=3jG%=;gPC(R*nBbm8PWVft?25{$54^9xlTB0s~QLH|UU zeO4I%T)6nLu>PX3c%N{>xb&E3730#rMD^bPHat$W%5Nr;6GOA_gmm6jF4l0H%~qwKCct`T$C1msn0pd-YY))8#Cm$2IpYHbq(@g zen{74^uO1eoL4sIx%}NeM_(*HsOuJ7H^5JEynKXT?)dba@$`FyyjPp@5bWWv7w=H} zbM!@ye8^bdg15@q2oRy{QUk&DtDf-^Vha;CIsM`|N65I9%)1u$Yr;5t+(P8f@-tx`jhG*f=Xl@Gl=1Yu>|M=s!e1~S z3tx{tD?cf|^i#s_Lb&*@u=%PmMxV5>qux){Le70YP@nf&dA>348}2*aP3`%7#y;Z| zBBze~7wG8)dcKQ&pM6i)Z+;}~T93Uz^mG@Y&&L`*OLT)i=^QHB=MFd@ZMdh(gOlM$ zU(6mQ+Utj2$0!CW_xVy0`N-v)Z?S=Nui5)LeNL{=(~Vf?@&8;q_oDy*SM6;cE!z79yg#O4-u7Oh`UXAXyeXfP zku#6-5q#*E_;s{Pxxd?eeyihrEBvzo_BudLH_ZRZ*VRt=Eny3Ln}0@hj9;80*D)B} zuKGFc*pHr|e`4x$t{>q?N4My@1#(|~OmrX2P2a@*ZxCiPt^=KqJ$WAwG-P|5k?OR4XI^*dBvVXqy(>s_L9=kG2r72WZ5+;@f@UQnO%oRf>iU)x@T z&i9+~Ue5dU{<%5NX@5Duey`rH_U6pT(P^}ge)Ks6(QzvG{=**g+j&S{f7zhteQx*q z`CRuLVfjeme0$;M$wL1x+VKnjZ^GvzdH;L)SIKYtZn|#vbm4$;>3m;w`gHlr_0hu7 zk;3i(bX@uy+@F4R9;^4e)(h2-FBh(t!YOuXj@-2WUFH2h3Wt9IDUbdjdi_)3nEQI3 zdws@syJX&Wkdun}?{f`}ncbG1uWgPw*>N_*>JxRo{T^eMLJi?fsh5 z*Tctra=vjxyVe_R?(6gKIgdf(^jB#evwo3)D`rqcGh? z=>HJ+@y8|s<(vbt{-&O1{T<=_A=G29oPTI}@V@-b9^&hhM?8O-{Mhj^__JRUMt>DH z__@))=spGU-5K%l)&o=?JVcn1hunhh+(YG?|5kgg-w12s${pHkJxP3X;^a&A7Y_DT zdB%Ai=}xoN^S27atGR9_T)ay-p}c>SXz!2o|JuU;f}gm)|F4%p z$K**ZTI$z)8=?RE;r)YC^hNVR)q9^saFA%9hqy-n3=dZM^a!EPPfYrvy`Ep>q7&?4 zft(I*Q~Bmb5IOFn-xKso@^#gBKPybM zhcF>8D{mz4{tsYG-d68#Dj%cI=X>HOpCAm#_ZZ_(4^L8gKN2>7)P4FZq5lKEx+~W+ zUip_*zsCPw{{otG_M-cXKl~?Q{WsNz|05jyT)6qMaPn-)k0dXD@RH>=$F4$imj zovZSK@o60^I>rz4`gwJ<%AG&iV1H(3tK4}K1LR_JiOS3Kg(K$Al=&RLTjkbcmd74` zM+#1m?-_a~1jp!^26~8IX?V{zda=X%C-^G?Sl^`kFFz{uy4CDP(Hq+9fhE_isZV%5 ze}50r#}#^}g6^U(oF_fuyP*$G-=+Ii^oQf2Q{=GoPSt0~zw@~L-?)hWv^+b{q09Jr z|HbThwUZtrbl$N2*NXA?zP9yY;_JLY=sfslD0;k~uy>$vxxcW#w=g|GIO6)zNc4jF z6;Zx?9_5M9`@d$75MAJRd7Z4weBFw#;McXk0YBrpX5790ntes}*{6lx@8fgtmh|KF zRMqF)w|6f1%C6)c8vMyeMU>9;;3iJxPT=f5LWZ!2FJon*x6@Uxve0#sTSz3E_$s?dn5SUpySUu{;}g*jx%|^eL#B) z_MA||1V4NHKG7rS>D8iJ*uh>Qx^KLk>!Aa1fL=|Yoo`pr&iqQ+VP332+h_ah zbJ{O25x?^ToNwZ|*9^Pu{I{C>)|cwK)`h|$`Xoo6ROm79FZVeIX)6AZc|JH!babT9 z``JSDq3x*uTj)5&);^_I>N@W`D*K|BPZ7pX5RO7&0@ldm>|rXe?<;KXCiMSvH>@vB zkn5HG=tqmMgWuafS$=HmaN*=&;dB?_lKqDL-|4#PJyo9kRdjkk(fO~b$N#M#s`B_D z!WsJ%H*L`a{O9#wbY1X2!UgRX{~*5gZ&kkfim){oE-T?0J&`cpW3XnPPA(9i^S?X~ z9Z#N2RKH;!tgt`c|FmFU&X{){=1oMqDf7C`{k-m7BcC;LZGX8$Po&8G{O|Nk{Rur! zgdQ7%)om(Isqfz++UKG;U%ZQ6DyfgT&U$Z7zu7OJ!C#=K{M?TJS--52{|NoFWNnEDoS;dM^yOP~7@qJKuO*L6WE zOivT`=lzobc2KWF~<|83z8Dj(fl*y214uR9hm zSGoO$)l9VYUxZvazux(@3(r%|q458@^H0lP?%yI@vhT0QKEVa&GWYJSe&}elbqlu=YLRn<#t#<@OTXG&$v8Dm_1#%c$RR)JRQG5 z^niKVJw~+il|4U#GgR)lf&G>8Je7N2T!fqtzM%5#%fj}jK=lQ=WOqM?uhSOWA~Pz<4xoD z>Uk>r)fbCiqcYzmckFBKN}JuB?)20ytxUG;P50rq%&ips|)2-7zUd&dfW9z+lO*3fUr z-%B{hznGIB9W3GBPJZj^HNpvb)4ji`KKzp~!jEo0T6|?7?7-Llt@zf&omc;?`XTp= z+%9?7+1*s1<2U#2Av*Yl+G%6=D)c}fz0to$_48|mqmKy3jQ@~%=5z5T*hS|jug(>J zeyT8`J^zO$Wd3)-4f5%H$u{>}SihLQS?x{GGxc?%?VmbM=yk0=&lP-z=ioitw~OwA z1N7poQn~$M@6$-oOH(k!-_GH;Kka;3$D_UfBEc`(pg)Xb`Xxm#S#LDFm-{0_Pete* zf2W6B@A$msJ4Nni=n?A!=WRLPDm_Q<8)d@L*}@+3>~nV3mT%-ZO2y~%DxDuaJYMBX z(EC%%vC3y7VReXb@dlyeKLg4mN_tI`ahJTJw!X7ZTV}_-Jc4B-wBI{YrePs zBD#@Ds2WPQEV;zbKr4O}Jp*v>1o!`IOU7UPqfBM>%$V#(QS& zFXSp>+`Vp?qPKJO?T~Q|uoFIK&w0UH=i}lB`+RNZO-=XGbF^MA>^@%Ta}A>xh~B(X z*m;w%<@tc0+TuBe?^pc{JyL&DbkF0^P`?sxj6V}S_@yvFp1e;pd8*3&|Fekk_kWGM zcjbEY(1`1OE<&6Bx1JjBF8(|gu4u2IeEJBL&-WGfo+9-BqrBgte7DLMy!Z4<(H-n} zf;>&=r{YA_`~Mv456WMRi4%9o=U9G9{&d259Ifx+U;jZ^ldsWcA7Ip0JL9_wBjVC) z{Nx^S>Gn>l-y9{(cY!7^qeFR0-uLn~st=%x{Y0-nE^Hp4_u1etx9%&t{$JHEzb%}= z9};&S5^rt=;;+ct@%K{oS6w%~zv}%zfjDD?d5xu@c7-2W;r%peka_2V>@k_lfnR0!7oA_4vv++koH`ui? zcC3%wThIGkivqh>VfUP;wW!q2zqS}B??0@rPC zB4Hank>DS%Po*BcH91YR;~mL_>#!dk?CI(Rl~3`b^P@yN@6rBpc(BU-|6HHrzj~$0 zhp!b*_7+ZGCG5XUxZX|J+g0fQeEB=J`#6=iwigBu6K)#D5Kcpz^^Uvgh*`3dhe8Mt@U%pYbeyE872US=~u|y|2QD-I;Mdb@Eu%ukIq8 zfx#bW2mg8bKcW}k5^l*0`oVs%_s{3IiO=g#&WBi1o}owlKbZo3lVi_(zJ=q(8Rd@i z+TZnltqyv~`Pbp~JTF+FhZ6LY{rwz$KGj!<&)?n4^F_DM5)RK6reG@*oxfc;#~(;e7d=AGvlB%RPoW$=;B(<~ zK)JY`5rz;dQE-2xA-dLy|=UI2K(sqK*!%x`TVcK;h%*u-=9;~cP95iZt#ao z-rJeX8oqBZM*j^Xz2Ni(EJ(uVS{Xp1*xh;p&H~Z+~96BClik z1JPa9Y4iJte|lHpnt1h+c(l)LT|HX$bzA8FN_OunI(@LPvxjhuKM~TuK5w^ond*DU zM~z%L|3Bb6XfqR^;~MriEA)JWovXnO^6xlIjlQ45-}{u>%PL_Ty)e5;^yEWA|3Afg z+^RXB3Ip4+W!z=t~>qW=;xAZ3db;EnEKd9&0T*vca=W689|6{SgHd5NCioF)DR z_B6F0&HOE~qyA4taFY0aewqE}UP?Ph32Wq_Mh~{%L_K=acGY>$-fusQ#n*qS(Elxt zULv{#Tf2$Qb`-`>5w4#obo_a|4SWw2rVkK~p-0GX{s@&Xo+J#n6Ry$o_JiBRgH!eq zX1VP4dT-$ZJ0Ie&Sl-ibs=a``koF%$XT+s@KNdafshz}e>up4@h)Y-SdwsiL-q$zl z`tA)v=PS)9_c_uvc4dNpJpY{d^REb}Uls;m5?0?9_R%Ab2j|e1{}g%jzKWRpHptTq zz2^N~y&KhTjGPWC?t^@W=$8t8wm^?8{|>|3bzRAO&3Ud3@8|CT`^k=D579Rz`ex1Z zJMYDDH0vq*&k_34{_)m%pOo95c7Cek@7~|hfzRLZZThFYR`22XiNBARSF61DZlU*+ zMVE_CE*5%Ua)JC;$hXh6Y*RisAO5!qeV)gX@8Saa_kXYbzsBNF@jG85JW%u$xeoAW z%0pB>r@Y)<^kyevM!!$UQ)-j%-!QLdtnc(6ta(4;`?2ly7X0NAe)Y5?z9s88>%Zzg z(Vv9<-w5Y_69)Lr;lES=BjMm1!ukusih1PyL1X5t$II(_WiI~CWkTn3cpr_=gUT7d z^;^Ve{ZKMa?K4&G^QZlt(mz_|EBL$*ee+V4uNhbGZwkMwa{mXw=YR)8m2dVH*82$U zU*^oS74q2QJG@7KmGsMs@7EML9sfe@tjSX=@2v5d*WB-Y!iIkGzM?+!evV%7{>e4t zFtq)BxvrlupAw!kV4lw2%zd6JbY76{yZ2%E{U+$;d@6pQ>zSV;x_g4KjXiX}X7qlQ zJFc~5N6%Ba_sM6k7w!LZ_WoIPdWif_pO?}4v;64|=Q;=Y)irq>ea@o`&e3)GGt`dH z1=x&4&+*%f8^yP|N*G@%99$26K{&fuIJ|*!u5a*@m+ZT2-LCrRi^6U#Tz*+tuPA3< zQAQlPy1$;Q|48BVABEYyDTm+t38R;(yhfjF<$*HaxAYhK&g(-X=mmb(fO+9K>zMg9 z12^dR5q6@*d=5UR`#WEwhrQ|IKPT9w5_=Y5Z!_BMT*rG^e>2~=;^E92+cW1mbZ9T( zxi;v{MMee?nMwg2pWKt6xk zc5*;JOt^jkcCJ@{cwNW&&0ha@zMS`mY_1W%&o_$SBYJR^um#-8bxTVh|wp#S&f|9ts>cC&+N7i{k@I@nK`fzE@@Uas?G{ygn{NjUt9u>VzI0%qS9UBKV)ygBp&eH4C1d?WONT|n0R7_g{Q~TS_c>(fkK`h~XA8YB z2kl=?>}OFv!C&xxvlVjheZZ^Z)SmxO={zj&8yxSg`tUGeg50-XE!y$G=&7RfqlMnj z7xEpM5@$~AHzQ9u-=Piu^M?3x55Ifz7|BJii=42ZAmMv+gFn3>532iQ@wM1*kpDN& zwH8*)=Ztw=GLQY;IsT6L{GGP74+lN%bqd?BjPJja@ms%3*ZW-l$yuTU^u*Ra!!uQ$ zG9E6UoXq_%6DIWM^c2xc{DARqMGtv?|F3HOI+ce<3T-#09}yihU+2hW>suSHk|`>{BZ5BG-R!{~W)uzrFIj z{}>fW%(ia(BC!sdx_jv@HsCrqJ8I4IIq$98Zq`QK(5-@N5^?qx9ffd za_DoYz0N#<-*M$BeuCFmW9mCRm+hqEVD{@n^ulna`#GLmAXfwWqfLK|u%FJ)9^b6% ze9rHJ_v!Hd<%d;2W8Ca#uP;}**TbAwmD8Vt_p5$zt#AxB*h|~b82*5A=ZE-vt3fWk zpJ?kGCggm0G3}#gtOr{7(anXbciv=yKCe$#dG%Idg1mOX>G3LGgFV~NH>lkIf$kyq zZS1Po71M*nw>m&L1)F_E578@=Jw@9dm(V^Jy|=sSeZH0VB?V7Vd5XLy52c;9(CbQZ zD0=o-Ve}+nh91hECAvNizHfuilU-<@DlD-t(?^P)?kKF`59!B{`I`Kj+R1+>%zi8^ zzbuT2yM_1>=?=8_3)T0&BJ6)!=WP zpXV|CchwJk9d>T=L$3R-(D@bqKK1!IOWr@cUVJ(7HAlYveeH8KI-e0=8~@+yTh;^i zcT429eT(=T<@P5G|?^EI@SzmYIpV5x@ zNsr)ftT)jAwgYYG2tDlYamO+JUycfWP$K`%^O#J-o>w{={OkpO`utD2Z~PPPzY_L-DV%;!xJ1uSk*^Lo zL~h&6d)t{6xU z&fX(>fgJmMZpX=2hg1JDVa6h%F5^%$&ok_bn6_6^SKxHo2NYIfajhghb!!Y?TFVYd%REn2|Y)B8}Bg}j?k+WcGCWU<=p!g zC)hW)?>LqJ|FWR{7X7rg{^Nct-gn6Jxc?l#>(Eb*b4_Wlz}`A8H9)_5|I~zNJw@pAVv^%TN1*eRvcpxL94wsd1%05<|F@gqH_s?<4p4n}Ut#eo zq4&MlFA?3mNa%cxDe~9ssPgGEg;7uF{I}7gL?@3Bj=?qM^Czf$NjnYKPq=Tw^Axf8 zw)}}JMcbY`9v1va~mzvEp$K#u*t39qAjU$Nuc3*V7eD;dRb}{#;$8`W5}y{(|TMdd~V7ZJ2FFFhPR79V7#r*y$^K2cgy@@ z@nz?M=L;v?cXPJr<{0pe!uk}U&*$j!ygskl`N7VkaNb`J`JVolu3vpuIKbXc?+~3q z*T{SN8sZd`ijmin=Xade=U6U~pC#WdGro6X)(cj@P`lHA<9`1s9CE+# zbClmIT>5^@Bj;n5)Q>^`zrz01)_(X*?Rekka4dSvd~WS4x;RAW^_D5}t@MVCMSH7vtA2)j`#-D6l`3DHL;dN(F7nvfO|<{t==`kF+f?rO z(W)cbaii*=MX%e!oV@2D=gdXqWz6oP`hs|}&z)Pd-!Hhk>ihWLBhKXr$a`+xPxbY^ zg{y6a6Q0NCY<1|zHsiTCUVQ#8>SO=>9p!vm>tlcK*{;}cYtX;WZH~*c->K?cX-cd+UJ+JJF|I;{t!s@!b)Aq340uYp2+W zhWfhF{Wq3l^qT1mJ7@V0;fv{q75c40UTVuJ`fGq*XwY+xLq*)jd5@NFzqi*{eGdPG z{vG-L=t=MIcOFZKTqlg1<5e@>+wmmtCrYgc=+~`v2>P?<@w-O-3ptFiU*5;kI#2ap_e#+#8S*y(gSUvUeS*;E(K+7i^JIMf(dJ0;%?}W6 z_7VoK7OoTF;Pt{Teq=`Z2HO8mSiM|)%iV>JH*cM9KTvrHj$bUgeu2>cCmKIVbQB65 zZyr8fbhx8%_8j5X|Fvm1;rTM&%lV@vb}Ya?4~UzU|E+fN-w3@f-TRK{*1F#f!-4fel8`B#K}?7Z`&+h14thU-1g=kV8*_rDDv z_N{~8oPJ;BJ)Xnswazc?Qog_*_mM}hgWJwm%xC*2-oG=Ps{JjwK#mLKuZP?h=!u4M ze=mDotNlr}(**;bW5abF-jyfURfR>-~A1qbMd1@i87Wyfna*lq8(@&5z-pT77!-6uO&IM0PX z_bI15Vg3zIQGI-zFbC%&(M#ldcBW|O6&8OG-RB&}i1_1zb(Jak8WZv|Ojl2kzr1+7 z(B(_=YTLx4y$?6>egpD0ypJvVvF=~e&)zp@zr*VZ-FJ#_gP-HP#(;jDU!i)BhvQ(5 zOAQ(Kx$QUlKQ45g^Z9y=Z^(Gsj}P9?bG}08bK6q~N@xwRB!3_Q!JM8;a6Y=}J@$7QZ8G5h#UD4ei zf%q%Qe~6wiPE+*E>RT%Bd=C7O(0;SOV=ZrvxAm~wzAnF3*X3smqmzWTZ)?hZ9+c0a zabC>g1o3Yehvi#n?{s0zeD}Ux&nuq?VLhL`8Gh_*i2V7yfQI=pd9U~up!cEqyzbs1 zs`q!)h<3cLG<~7!{lD1WBSmLV7Us{QzAYRPpPqpAKdF51P~jARcme;0_M&Z6@Bfl5 zpD4P(u67p5RhJ0;T|PZWw9iqToFaOd3jH1K^{(l$ z@E-%BSNz{D`_18As_*OxzFL^#C#U<0_WywW|N1mmx%Uq`4&30+rY})_01kG8e`jHD zN8#j|!sgk++0%qR-);lnfOcmuSAD&QFxXpIzERj5CG4R$eZHXkzxzwo53uh(=Xv!5 zl@EU>^nR?~D@FVKg3W%S{XG)#{Hq;Q-un^!KM^_()c%s__?yD)tKc_;t*;6FU*P!{ zMSFi>^jXo1FAJAk=leyq%6(3i&(odqUJcKa{z`l?<;7C;-~02U+f?rT6J9^wpm!`6 zUT5)om;LALR$af9e~SEjpO^O?&ye4_{buy7JaUyR&$Okb(;HR$v0oL{@RT=m}1 z7F{HIbD=Q7FZ6!o)w@(4Qr=u3dUS>`J5AU=TG%~II6$u3@Oyn?{yWusziWdZ+&qoA zGI>rb;>A7UlF1WQpFCd?DPlY~ja>{$Rj!?PxQ8)CH z*Mqm>U-Yx%#?i&P&imLWjHlNHogXp9-?Kg+V1HZ8C$B$rnFkw>U1D(s#w z^!Y2{)uR1<6{7c(53Ah%*Va1b_f_uyo=owdt&hgkx4$hupFcN6kBoVr4s`Gx@i~vm za@M_6kd3=;`#QX|r$LFqiJ#K>CYwztqD^E~{&D1To$-_ZNwormuKbNG zO1MF;$Bb*qcvkqCbKW~b&cdOt^LKI&x!k-#<&!^@YOVt3ll6WxBAaJ{3j*B55kG5-%f524d``W zqy6ZH`CFhLEFb1`{z1e1oqkm94*Xq#-dQs*{9Vvv-ZwmNf?U`iwj3J`CH%ko&m*ZAZ&H^!{G&bv{f? zKaO~xA^lTaDgFrTl|F%1`1$?x( zW!L^q<&z%>H??rJ6i&Y(jPaLypAlU{kGL+uFAl$@`oZ_X&kH^OZD(WJ^||yd`l0)E z@sB?%tmZ=dllCtMpH_K7KXyI;OO@Nd9wYbu9`4ibocA#8xP#9p>SIrR{zik`ThDgr zU+ZPdUB`L|edhdX>l5pTHP;W&n<4V=_(FyLSlNE?Ue?bW?vr8XE$1W3{Xh2Z2h<-O zKM!_k_70T?V0D@3;X8#T*t?W+_{QiV`{B!rY3DrQ@(iK(4bPGPsqOVq@G-h$!`+MJP2ij=AFsC1rmF{c5XF3%<8Vid|IK4o)yaJ?M+ezEKKK<79-@dZ%qkrerP8@)E`??Zh$TY;;nmOlJQ0em*~-{_Eh}clUd?d+xdS>8Fss2J7VS zvtASAxqjsZdT#QGKkH*AE58v`;y*4?l#Fc zhp&v!Xwx74yhFyJ{nyaGC7=CL@9dT1?@xPm@D6&fP5N2<@`sae@{vIOHbT!^SA5^U zEBW@ypC8kA1LmpD_-l_Qzj2udN$(c zr2QrRc6=T19`n9peh&Afo!)x`^+Pn7w*lkTPu-&Yn)&QNm+r$ith0Wy1$;M$zdYA9 zj-v-(uaFm`tJ9B38Can=_iqe-oCbRCb$U&3?a}o)b8NpVyBMUOhRm z`E+pL`l-R)w@#lFTz_zv@{8X|`ke1)@2&rK(s#%W?<23^|Mlfrs00_W!idS2#zmL}^uV|_O0o5>$1{}{bhem8jYZv%}pG7i;ySDaoh5 zWI{d7A0&Mzoqj8L`%8h_ZvuCL+R^uS514`wZ>`t&c~GT7>6>G?%zT`uoI`t;05!o{+=PHjN@2h4`^4r z@2-%u-Z%7I>+r$Ut334Gpb_IUPPU%w}C#d!T+q5f&(pZ%Yt_mfArQSRoz;-*03qCHpFZuUNVc}wywkprVEg7;n* z=>3QK^Mf~^88}D3cZhFY={Lqc9`g>(l6d7d@5vPZE_UyMxTGfW(A!@j9Xq<>U5y6z z^@RB6CGpaSzoQ?2AK3a%;OLRS5`Oeux&?f2gkQ$c?GpVr`h3dmzZd9#SDNry2mT%X zL%xsUhv932Pey_ISts`gcVFiH#65J-fDW`bitCbpIScGvA6VWP==T$PpvJm+4(>jo zj{b5V*ZykC8&5X+QSc$-YQSgi=cbg`pL=+W@?Qy5{!|YHZ$aNv=(pG=eGNa<{xJ9y zc~g+ygg&Pi=lcqI>wkazU;XK>eD~e5ChgSFqn?v5;G2o_DnGKm8|1a`F&4-b=hyq2 z{%>>qD#mdk?aLSNm+x&fugQ1c1^2!|ae30mR|fj7q<+X9bTFpB75(fWKhN$H(!T%W z8#8Y$=%o1d)IWLx@F{_N@FRNA`#inh&-dxC26mnt*nfH8f%Vv59eh;=Ho(Ws+v3)w z5244C>k9qoPxc&Ph@2f^r}p5#8TpOJ^W1-pK5_r1-W(%`^=Gs{ntpgL*!fWK4Rp6e z4$qLwQ{=aPDeX7?&J*ZMJ59aNp+7D9t=+C((XZsW$Cmus=L7I1{L+Dbwfma%?*tv_ zpJ{%I@iA`uu_pZhG)`hcy~dTaSQq^~CG%A=PXpxM7CZXv|E<`|74+!(u4vD909VRU z>e&ICly5L@-v`+<|EJGnT#nCk2jfC|tb_67E%eQj^bPZhQQ*Dfi2`_!9Hk;yzWAW?zd`>B>(A~f%9(#8s~6!UkSOX zKj#R(yD0e=zd^a@0in0W_k&ko3Y>o}&^WIS`pb7T>brce!yl{1g8Sa;iu4h7`ht2J z4=0~?Lh;4mo9_gA|FP0eKn|*3OZ4jw`8r{qM(~sJr^UGR4=>55A8r4(w5Ob@;2Y)B zobqe>ak?-057^P3&#kC;h8&k)2FNA-2=;RcKMD7rO1=6kx5$+l<#*(tBLC#;4*c2$ zj^CGh=I^4P%#ZtK?c>tAP#pQhM%S2k*7}$XEO@`G=Gr9D=v@ zft{}h*1sF5+&6xsMt#~vd-RFxIA`7bPlxe#y_-^BlXcTSd3G)WpRJ(dCH&j@a>||H zTkqlOPpVvpe@wn3{(IjO@jdGLwTuUPs{`dj_rIHOC0`pp_kF)Macoocs{0c4_y#-l zG)ei*YXgnP@7xyLxN+l)YSKS^b9!g;P2sx@{AC=7_ZB+Llm7Vu_QM!`yLnma>HJRM z=6Tfn!a(1f>R!b68w35H7I^>jIb04?NqqvYuV|eTbc-U4KN*o#@{dIkATS zckrSAMQom*`u*=>=Q+W9{lF&n@DTmye|}rPk?)6J39SEap!bHS%u9*=sh`jDZvDvf zPp8}tx;8#=dT-LTU+0Y1^O_msa(olkvGtym^L?@n^W*uuaY+^ZGA>}o`X8}Bx6I!j zxvbr%UuGv=QcgdRa(7R=P2~8BdfeC4Dc2*tsXa)$mh)bJhxus0xBA!Xj9dNEL!az{ z#)&CE+&9$FceT&6Zomp?oP~br1^wNi|2B+kK)>Z5<2=>dJ^DKWR^)FZ*LKKF`F}{i zEH`1?3*^Je{y{e<`ZH!djaRNo4?yGN&iqODWZcHFNtbizRzJV~tAcipw4+>{L2vH2 z^aC`QFW+r+;>+tuzdmqyW#DEOIJqQHf5GXz;JzDF*>&XB;Wd;z|ER&eVXgYT$kOTOaVk1%VUn zhmy+Lmfz59QU;kO);ZFir)Z3Fk zznJv;R|3cAPwyS<9!YwMTxq;3_+c67{@8dY<2RoAJ(PaWd3blHd4N{ar2Q ze@lOj-x#t!bNIgn|0;(TpGyCX>paqb?fVgO@kqHTa7exl^=ps!Kb-nJhca%X4S(ww z@SJeTxO~UQdqc}b>M;)b%OH{Q?c&=2i^75(o4OV+(bzq{n`Gami* zl70`cTUCJqfNj~jL&v)E^OqjRc$C7VH zf7aCJx#y7i)PHOF9qqLkSD$|F$#0zWSw6-+`Xv1)zi}4jmh}4rTa3f_n$4q0pD1s! z3yfcFV*eBmCSRBG`gz^=ZdvCx>pTQ@;Nvde3+Ql;Tqy2Jy~d5Nv8R`BPWsvX2*!V4 z{oO}b)N4HZ3VI)-huxnY(1+TCo(C<^m%SU(-tOwaA+WqE_-q#F{fYghO4DUzYS4^0s<8IC5(A(%`;FG zM(0zG{-4DeUY2yvtEcneo!bMutdo9$*?W`TfUdoNS3y5L=%)VVze{6&|g^wZ{12d<9ou7?;?7JDI@BH#kMxA#z4%pQt z?`HU)?m7PGHvZ8q@6k<&3z-u4QTw~J?|sGLH-jH5Aarr~cJR|Nu)+UW>h!;%{`yhA zub^x1w{3rr^pf&x__sy-bNbn%pFP`wf4ay4{ZKvlRl8xyIyF9kpK1N|@i06OvgoPzfBKYMOelCO?_ z7?i0;`)_k)@X0uEe12dDx$AvQ|LZ#>eFPnz?xa5KoGpCNVSH;~g`6<1Lpx6Yo#$7c z19h%Ry|dp4^#3J?-w)n>MPTPVzQbRmcLtxqhvg*r4!Jf#E^3eHFVqisu)n|_<7&%a z$e%iNpj%|ERxb&Nzq23ID@+{A}tmK3M)TF2Z$Qqc4Z@Gwrv4 zee}?b`aH*MlYfLgc>;QlHDNuBKj}d)Yvw`!s`kD1`G$ENF>m_I+vv#|?Y8OP8huz& zzy9qN?bN8xcJx!L=Y5|_x{x2e*VJYlE9ncmYcbv#bkReP`95!+=6yC@5%Qibm#f*{@qERza>yV$Ntvf`mF}w{>N;1TfXnntH#~!uS&ZA3GQDV ze1u%=zcF}uVc-xsy1O8F^cskIje$krp7kIiQ?X1Y>x#pVm@yGIgPyc<#ssrC{ng7)n zlTSap_r12v|MAg$*PdU&-wWjLo_-II3&z`=`8SZa-fx=HpCkOOf6a9L6#9+!kVBjo!T-`|~aPTw5pJH-?Dy@R~*zQ6wI?VZWLp`8C? zGOnWy|IetWM!#3kz3;!A{)Tq3gIB~|RK!8Ih+8i47aP|x@_r%jZ7j&&#QtpHhwc&= zeZt<}QO}wbrDUf>Krx$jUyURo|?cZ{w~?_{{es+qA!=Ka2mG z`s+aN4SP;=fDd#)-4Of${~Axw`t77^e@|Z) zeD`Y7kz>9KRY0f4VV`bFzO(=E-Vyw8SDA9{C(!xdxaz9jD9KO zDfGwopOSKerw1C3F*`r_kp9-GX8~X8xAMO;<)4xtxqEsD9QmVN)I@(5zyuZFZ|yEF2w(62M<)9&{CKtI$G{@B7Fu2YxwSW@4DdfaD?pd;6@ z%RJUeucMzQ)O%w6jOVHD2|aXxP2|o7zSo~MK_4r(PG!o~Zw&PRh5qlT{f4C1fWu3J z?=KA8y)MxACg!gXKC&G4wsx@f)!83+u1$X5=`;?zqP*u<{VS8NM*B6&Z;%WANA)mI zz8>~Nd28@F6=Si7%(V33ju7r?N`A{^;@x!AIn)qi4_J zk6G8<<;my0$4w`A?UesNb^b;0F7xcY@=-tO{of3n+z_a})PPRLhorBugY@UMzL)gs zo0R`*;QZ@A#_73jpK)ks48M|mea8tsPvOTU`b0mn{%Q4EhxyWPUw$q14S=J^f{$sZ zL4M=3w~yw#@A7$%#r=EZefh4R!}EIIwLOyy$UFPFmcOBk@;>^-xC*{2_b12;`F#)G zdUwi|$^-f{1@B^~G|*T2E491Z=&#w^Qcvq0f%~@xdY)B*n{Q0M{_T`Q9=Kmzyd~)i z>hB|0+Q`!l>(+ZP`L@`nqkp7b;sEOSV~uYviO*R5oA{->+z;IFpP@be=LUY~I`7hr zv7d+7&voLV{jbmld%Z{e^AvinL8tv6q+ciatM~2Tb<)@5A3#q>=)PV{KimH``5S)~ z=($Yuhrvh0aqsEJ0er^z56sJmxbMYZq@4a7?WYs#-e!FctgHFf(7k-%dpkAyd-z7` zt%JAq_x~B~{kOmc^6&(`u8HHAk+04;jSt`bddiKl7k!UzfW2n?ulGV`7bXAU<$=3d zVC$wpaqj3@5OKT&qhqt7B=gz| z^P_G z+mWxudg)iI!Jh-!2FGe2$Ql5wV< zdr#@N|Me?BmHHN+32d@HC&oEK{(0YYb2<6>USKDC-abaIdf#wI{cGAipwFB)?Q`vB z@4-yy&+PMQuR@RSfS!+P4>q8mBmLPSk3BEyV@GN4x9Gp+n(CQ*)1LR~huh%V0UO#s z+qXWN@5X7Z>@WS7e`nOYVk;wP2q2l=HmabyzU(J@VCo z+Rxq(Ey#CdT{p;I-$U^|yBd1YII<=5JBO~1Z_T(G%=h;0;4S2p@8I>3gUZbk-2aBp z;Y0tQR9%{SM#xdmwOUsteFvNYjl=XEYvt_fy5yf-5vc#TUIy>q71+5W(0l2-+ev49 z#>;rGRzIHcPSU%6i=*oUzv{1)51PowKK!tS4>k{`UH>QI{|QcCOS=CdS!4h09!R?T z_a*oWJ9P=&y57wfCV%&wz$S8Sihi8FI_Zo5D{%I_z!vk(K_P*S4&Waai4trQHScW=X%i@6}?x-9PD<9)2L@y71lEc@=VPMZFbrO1-l}erT_6 zkSiwoS>Ur)O4uWi7~L((^tGfrds_eozJDfg%Uefib5gAe{8 zu!+6h#~z(ie*QQ4euO_7%$Mh^u48?XeC}JO$Q}JvbNFunT`!<_>Aw0_%8%e9??arm z3qAPmTJf97U$Ji0-_g&%rk+!v|8wpAV(|4O(DS|4v%y~xsQld{ca7&Q?#y@JQPqy0 z&6B>pC2)xxA5h+N6YD*pmzr-&e&4^|Y1g6uD)^!a-4CJnDfUhaePH~?h<&np!~YSM z&rdtkmjwEMNA1Tc>(cp?d~ZS*1?$v6z7@!aI{fZ^CI4SB!2Z!MIzc|_w`(ImI`E@* zr03Bc#_f6U5P9#uXNn$fzcKynydHRE;NY@A<7s@~z4f%DYeyJAF?@H@4?ykI61%8E zU!Cahp8mH#oO0dw2hKkjxX12TvJPYPXA4~WTsw0@J6q)0f%cqF>*-V8`13JxYyP>k z+W|k3&-F1*p-%nUYYWHWxRINE=ubPMhP*s7KJ7s7$=8^d0rKGNycK#mp|3no9YY@r zzPG`Lz&i6axHsckLvIb*-`P*v8-A7XqxS}s?=vq=>X|VwHRg8#U7qbHz$bjyzHTx; z*Uj_rHu<~EYa6{LJ#~>&XZM7VgJ*tZ`agh=8qm|0aT>Sde2>XLA)o*C9>D*;x6)%h z^>26Rhw+s?aQ$uv`h7s}c9A#3w`E>uZw{P7*YmrA&u?SivBOR`2OpMvzbUYBW1#OZ z6;}i=$fqB>ygupWb%9;*;|;-$C+Q+*^&eN{tKFJ>WBTViUwh<<`|}C(?f%hy&hW?9 zrvPt4e@kE+I%Fy3WwY_GipDs|C@o^KMpLu9O!?$*Zbf- z?2^g1gKwxu|4a$rd#*KP{7d-Sc9~zBeBZ z^gZnsc8BK(#gAe~au>7mQ#*YHK z$3XuFA|3jk+yVNNUbI8!(l2!0L|+Qr zGQQs)sJ(P#p4XpFy7rX*vjOz#f4Mi%^BCwkhWqN)#i^%yR$#jxxV$>>@PokNHv;=V z8UOndIWhW$q>nBNT%jjw=vnQ1|F2|x+aCI=kT3e5x5#h(Fut?cL!KL_@BPXN^1Y9q z)9=?IzxP$tR~_cN2mSY;=hiCy9|PCW?Fl;foOk%_)9=ToG8i zhH{q%uAoEjJxMRU=jHp^yC}#B{g2)&X)=FH=Cy&G8DUopKA3v6_nWQ@a?AUZOYCCh zWdpg>1x|rO=1IS(aT!OxdrzZ|zP8+wdG4Wi`|z3f`Se#7$n69D(VwFKWAc%VM}Ovw zah@2DesI6*k0_BFUFK;>|Ay#|2DtIm^~cgq30-+#Z-`#=+_bA)elYnP$fGm{!#wW5Tfo`<$!}bApMF=Yhx*NNESNv-l`(p8&3sLvi_u$BuW_H7 zyMwz=ULZ$y(A9=|+LZTvcgi@2tiu|*oKQ~x*M@x3rS!N#PE^pj=e`x?SERS7-}7Yc zZO>=6$RF+X@*NqE|A9H(0e*X6fjp^zYxINf2W*jZGx94Z%LV00H=ft`E>_H=@tVF% zP%_`%H}O1sjy&-^OZ&n7MFHKmn1AJx`)1=a+_y*{1J0S8mh<#i9Y0|wnS;3b(?5HXEn_o}9n)?d!b-qG6-_2k9 zQqq^mkrn-_z?an9BA@Zn74_H1=l{e9w5NTpKU;fTJ7kG`)&DwzUev=|?A-NT^pAO- zAZOfn70`?4Jq7yA_`ojs5WZ;w^}h+-mv`xh{;V!^rrcUWH_H1J@?eI%=mPbFR?waD zdxJdeQIGmeJ#u#L{PB$2^Y#Puwnx6Km8*>3xO>knkKasr-*+rsU)KK!J)ORve2u>j z9Q`nGa|k>@4~MS?pMNi~{7#^Btbc3?-)`TM@6|G}&AfIQ_l$gN=1c$PfOW6Ihilf) zI1J;Nca$rTqsKeb&iLxU5<6xB|CP!)_AvHme}4gA?r+QY*^Pl+ z^nm`6{SBmJ-+7sQj(a_gl)>&I0ELyqV_q5c5lvD?(+Ji0F$Gme7w(JwvtOxhbF=asW7@Dc0bK5^r`Y0u76zJokG z+#KBhe@&qa<=_c<=sCej`e%KbthaX9nI0p(M}H>popI9Y#TMxW`an6pVm=J)pen!`~(L zsdkY6yV`v%^K+nl4Y_|pZtG|A+^CLx@jXiKEpM+)J=(Y3w*=qb71-nZlyMsW+r=)` zk2ky_`HMFN8Yktu#rj$OUsXlw`Z^`iA|A@mm|y_xbL1qupa8c7IMS$ywOMKCvsxSJebdU8#>?jC%^mP4)jqW&)3Ka<1Mwz+pMSU zX&=asN5-jrJ7d1j>}=$w=SD5$Zj1SEu#N}#b&Opi-TI!J>)ZHx#y~*K z-III=_;`UnY$6X5u!J8uQvk?`@&O4)m}WQf^0n^@H?!ln&`% z-E~3_85icc^YQ%|PaA!;d|&Vm`fmcgEa<=a+=n?2P59UMbv&0YNFM_G*aIW%JoT3M zL|WIUedo2q{H^GZ{8}K7X4F?Q|HjGH=#^D{!9pXr^ulYZj+6nuDB z(i^P5^S5FgedN*q=$H_k;pYMJc7oz>#K)wvgr+;~d94Wt)di0Mw4)^A!})*Dt8wS-P*_E6aKQ>UZOkThcG|qF-_XeNE*%=*<4=|5za> zJP*}BB0UcHuHN&ULqFM`dZ*;`Ja5lByAN2siTS)G(ECaLcgTIP@vJSzZydS%!sfLp z--e&((mV8Ahn}^kx6ttzKGY96Kwr9l_Px;R!qk6yZea0>z{UlEUF?p=rQ~~E;Nkp0 z|6k$%jl6H=yYa0zBwy$9z|GZxzAs!|6})y?V4Lw4w+7dLyoJ99%xA;=z#8K)9F8FhTZ~iuL|Bb-2|2_REc>nu>2mT}Jy$<)0?!%8a zC7*G4`ZY#xPWlRZ_Pq|F@fQu&xs4s&erw7NSm!4CY6Wbe@04RT)?NPSBUdZv!*brU zol<`ne%;f*4RU&ZaoV3TPt)sy``^L|^2`5C7!RTxFKBl_f7?LMm*@1~{jTu@z5CLR zc1S@xzI&tHH>RH*>J>k}DdpV{jL`4OfBjBV=&uF69ZSYX`U<)l(@*1I=h!F8LC90FEKjhzF&uze0=#e@3hK#rK zVEViIdf);5SUnc}_-Nqvp};wU2!V#QE1Q8o`%G z^w9|Wq09PBnWx!3X~*|s#?a>q``LF^yYOQZIlp>K%ITMAx-QJm!g*)Dr_j@Y^d@|> zdSB{se`5T7MgLlFqkp#rde6f5=eOvgitj!8H$rYKX zQ84~Ba;Svvv_B{Gb9F1@p}vy*zT-4`W4;$x1^WI+$$Gg@ozbs_@`HZp2V6pr#(^~W zuHT}|x_b^#W1jcQUDiwcSbw_v65km!&acjRq#OMt@?(eg2CSR=u{z^7zxMxvb#lFq z=%F6-?D^)2c^#pD^oNcpuRS)Wy!Rvv`lH-lAy)?E+k86nKlq!#5?7agqnY#nCE7tA7-wjlbp`*o_`W57g&dgD&*>wn$9q-A zc^r^GQ|j>^=NNgS9cui+fpIEVn(%4s&eY$-F7(`9ejh=1#xEVOPyRXfQH^zTpQQb_ zl0Kn(=gWPK@mG7+zfevwpPqM=$YIN^;Pg}<(mStA`t+i}-gSZ6;Wg&#cq93wckC?RPj8dY_xGmc)4$<= zVAiilJyc_6$=vwCouU;FteSVtc*w2es1@~NL zh+Ovn)${k|`vUqMLLWQy-r!uyzaemNO`!L*y}zbkeFz=v=Xak!hJSn?$a9@J>*qeP zj$Amilj)E8OTUEQ^>5VSixd2*Uue(xCJV-i{;$J#8~RoKLB9Lm^634+y{BCNZ1B#f z0=Lp9eAc2q?aey;=svxLyz)L+>;BZUM*q)|%lZZD;KmcGpGW8g{rGkIqrKk24pv_o zw|i9oN^i*j68%@le>i_<`qg0GSICDwdP09?iJX{YUlin5t}EY+f9!2iZ$Ujx=;Z7k zj&hdq9GSl{^FF40NjvHj{R3O(OMi~->c?K9pL(p56d`I=}A4Oe2|}wBV9m0o@+Fad&Xr|@M9ak)2~orFCVd6)Mvi4=04l_ zh9P#;3Hi7LZjnz@=B)-@d;ZlVUjsSn`QHM(p!^A_{X7NVA9B69%;J z`>+l4UyuA9_^tt+$S-~9ML*|~d;{jKj~(y5Y~v98ZXCu2`ZZ4Uh@CNG-UfVMLAUxR z+R$@>oHO1-xhMVa;I}dP_tev;+y?pDg@5*pt7P4mtapR)9sLgdtm$7tJ^JhQe`x0( zk+<3*6XwZv6}pbn&kQW>3{a!z}g`6VgB)-2cJ9| zxOgzoc&Gz>TEN%F1NWJ~CG)X3C*^8?6nI45o?aGw3w`gg5BBFJUH{eQk>JLIdYxPSMtE7qf@{DJNl;CrC& z5>4oj@fF5P=r<|&?!K}%%Y5{(r_bUlS=ZU6`R;qcvzG?1E(ly9$2!O<&y@$r;SJxX zmnZ-3C4s*4uAg~#S<*}RM7`WZ?ya$tyV!vX=&X2k${nzu{U2!cx};an3_Lz3(EnBR zUlrW{RGh92KBu3)kFa`v(#sbIHfh&)?)@LEa({G3@{Ml_tRX*_;78OZeOS>&uTPpMKZ* z{lVQA%WrMu?F>2XJ)ACf*ogkRU)eDaE$5MSR`0F(uHV)7gWB{*d9iVxU8nb@e@)hN z|KZ>b#x-Xij?7z+e(f2T=e;A!t+1bml%JA+sJ=!1by&y!hti(oUNIj-+BFWWU>u$Y zcNs^8eKUq0>WpKJ+^iul^-HS7>v~{aJ^zqy4xdQ*G2ct(XZAqSSI|uZd2jqp!Ti@Lx1b*1bt|u- zUhI+)a=>}1F;4x>%C{AAt$BUQAFc{CZczE-dv4o{`TmMP|2Hywb@17(f!e{xTY`^n z3q1Qz6zi^i==l1Kv(IYu2? zANrr??ys2lA>;5pY5iRX#$CY2ojWr>C*T78Q9(bh@BHTE+X46FAJT50a#O~qpT>QR z@nlEV`vAWhkL5fpm`D9L9mZLaUb`s$sPzLq2WY|P8{~-l2kkcZy|y=}-okZUq`v8+ zfrnoV)PJ}_j_UWV$lqi9(ueVJtM8zksa|Jos!(zUKm87g)kK z#+AGOTwkB>zR$LQGWnkw*tOr!3a)A;-KQ)5D%AfgNBAdC)}Ak7 zO}+*5av;Bch_m^+HT4@`p&wa0`}C=N z_df9yxw82j;{w*m*Tde~tn+>1IDTyW#-sKhNk0AH?mxHCg?`0?c3YoL{s!aSGjHy< zJB)MZx-kAFa@c**nt9h>rXPFcdeh$}^FIJ@u%0uZa<0dC$F%SJUb{*9+ebbvXm^6V zX}mYz543B4+=p%G|D5`#w7aLC7V^#b)jo7-ysG|x{c1btV@JIw+ST4Z(2j8}bK2{` zA9L+k+TA>s{x2BMjP+i#E^X#-4d3*bN8>^^=pXf_`z+JF=Ql+^Y_JE^BPIPCxNfx5 zXI^*YAD|E1cNFx)IKd-yJSBgFaSR!UcFB@@OQ7_m-q4@udHNJOZeEpn^8Mn&)xo#G z1^G^INV@+wK0Pn^5V^L4j%xQO-TNBG15MS#pUHRk$$fFgxnaHP$i)TxF~KhM-p5LP z$UJnQ59ONYL;3>-(BBrQ9b2$2b?8TVrXRG$xc0ymaDcwsLbuwTo(Ip$jB^KE-Voe( zLB{mspd6q+{eNrlG4!MT=(%N|@70@A?}B|x9k@Y$PHxP1?=u%y2Dd-PXS?6nQs0UB z_Wgz8=9D|S4y@0b@fXmi`)c10Xp>$;{^(CBq2oS$Qc>R)elD2j^&RvVI-IiJP1dVV zy64Li_}cf%=8RuHtRa6rXPaG~`uk5096UF0j2*TAi{Lxxvw@Zle4f(I^bO48Wr5>Y1$zE4IXAffQz~B{~>VuuLB$Zci`?< z1KZCI+`lkzOgr;w@a2Sb>Oa0Dct!s5Wx*Hn!3DvMpI#te`tziF53^t}f4`jPc_|L?mP`Uf_wkM|!N$OX^ey2zgzbf?@}Azy3n zNI#^L+Pi{l2T8|A=&TPP>Hm`d)_gZEU<^N;$lv`~>h*kWz_{FR>VI28uWS0ZfS#Ms z{}_3(h3`H09z#Ee7pI*C{JDew*T{qU=kxt|e_)&XJU7yAYJM=^Pwz_GbM>u~2=%9f;YFxbjnlpI?Jyz%m_56u` z)tRR@z89>EdcV#5)PV=qam9T0tF-U`p1q&dBA@dmy$`8hIkREh1@vd!N$<|oTiz3> zAK3l$1bO8?v3Ps(t&nFE_}6oc6?A%_onn#v{(pNt58k>Xa0B0U$>+Oy`oWd!`m_72 zZ=3%1DCha8_OkJ-L)K4!SUF3(>bKc7!Kdgy?RfoP-sA9pkHZ_1f6w?1@VWY^joi|Y zso$ibUUL4(r=NewxU{p3Lz+T&#xwR^FZ5X#{ZP^W68+RizBl2I5&S%YPiEI=9IIbo zK7Kb)xn29I;D_G`9Q8~*AIGFF)#9wabvy5 zQmz60cODHse=yMhKb7>SLVk_mizWQD`)u+nA4}vyLH;dxO}i9+u8_m+ucZ9pi-Eoy zvZr0|FS-vXnSbYf!MInMx2FCha!ET&zl!IB`fo?ji*W-R=uf-Sed*-> z)N5R(`|?VC1gz-y5vab>uAU&b)ceX+-^hRPQHeZld?NMfr_~P8k91V7Gak>gW|Y@|y?`#~moN_a+V>i?XZpx1 z?>FtC3(uuI-*R6wWqm!5?cAOE*R3< zKMmTgK?lxnk9DXqPXp%J{ha=m<2%xS_jCHowF^gh2fQzW=i~9>n;M3H0f{r~~dj1?{pEdS1KA z_(;ziM#!Z)^J|<_mws#CjyLJg8n{$$kZ+EjpD<42WqhyK{gL-8+mzGq)caWKpTOrw z?0V0$^xqEdPCnxl>URa-k*;0ZLcXr~u76QJ@m`&NTIa$0RlD11=gon$w*(Gpr@Ae8 zV;7cF)N^BC?YhABm4U{$udWF`pq=e4!Hq*7)9*d~ z^SuS@H_myrOga6-#%UPGu%utwiT>}#_=YC!&l#tFef`|p?_KISVefj6Z9+f$$j=%0 z1idzfo|RYb-%IGDM1D;E_l%?Y+`!2N%*QrJAq!C=$Di9k6pAtFL}RX^{UiYe|2Dc7TCEs@bvn?{iS@r zFi?MU3;VQAKMG*$ZOONzKkh%Lw7POyOmGt&6ksm&3(T@HaccIQ_H_gqash;l}{(;w}5zWPFY zea$+}p_4lD!+l}{KHYyJ?YXa(Ka3OB{!~x-ZdDKYF$d15XQ_RF9-BhnP4X$nX5`b} z^ZaS?+4M(TxJQ0?UaowZGmf*k0r;(;J^QbJ&V7gHR{A;hqkFH>_w?G&Pk%;?&vQHd zx;yq~)8{4M9R8V*-*Y45qZ{*w0iKi>_|53YUgJe>K# zx9N}PIbG%CvsgRk`88mGO1zjoNG+S|r~wkfAQ zTiu*__PsX$H{tsQ#%C{YNxt4Zuz!1CgMG-BcI(vN1vbfN|GRHaxh3`Z-&x=LncSN1 zwQB>%WuWJ*WBRd2zfI6zp0|##PyR0TpS>SMdX4hl=PaEk+MP0<&P}Pu_#n?WjHA{c z=YGR}AF;Fa6KU_O*XsAA-X`!sdt>-%kDOBOpOC9t>h-*0{gbK3_|EBH#BT2WR?>U> zz&dhsh5V?n`}BAAf13V0F0lH=z}8E^v1i7>-hWPd<0*lg^MK5^{&)9V#`_J?qxy*_ z*ump3r~C|DzxCv?q_4jc*aRx?J@08D?>dyggWq=y|dG(Gzs&ey#`KYZuGs6Zl8ET`I?D z&-%)X)34ea0=3IV@IfCws6*%dYm%=7cfZ+!K9}f$3FF?rBl*2oq&#giKF=#X53EBU z`iUpcP5I@yfvsoI{*!>e9auauaQTA3?FE7B3j^!V4{VMCy)U_WdGOjffsGdjPM#CE zd1l~{_Kwhh&+o&0@Bdz4>(zlP^xOKr;LeBf+%x#3{i=L-zde&Ku1k9V@sx*uyjSV} z4l3m*>+5~32J^0evOr$+SQqzkJLtjvnSQ4odP}=?2mNdJG`8uN_E&w)I4D;WG7kgz zs3y)h+qAEKo6}FvU$k%g@*nd#pnd(f^6>U|^Qi6+ol?cwB8?)Z+2=NRr!d(7L6dC_hgAwO!!jp8%(AEY?X$%>Uq_)YE~! zhR~7kF0Y_p{Uy$q{+pBQ2%W8<|EcuGJj~G3UFcW)QG2n&dLJ3bk$ML7xAq|Yq#f_y ztZ08r{c~`~v4n1Vtm6dy!2GT$*J3@p%-7O&qaQ2!*9Px8Uiidw6z$oPe(O))(a!9F zj6=I+L^~VmbDhWNH|sdoWf z-kN-iI|H@beUD|fNVWZc^;{8Hfg8`RUG2MGr>m3i?7w8>KN~Og z?(axG?-8|b4BnXsPHzaDF#aaxl%FfUpX@*NDYxs$L-$2Buer}xf9N0Ru#QdE&GXEYavnWh!p9YK(tG#bz0KP)F5|UN^ruPwG2aWuqa9MGy!E;t9@F17 z<<8_E^sOJscQ3}!m43a(i_)Ls9N-{u1wEdg9=tyati2+z3EV-yvlk}44&1*y_~zMx z6X<1q_KCpp2F)nHN$)tNyqBQB+z@Fr&k9* zof|lw2G%bP^gX5)_MYe874y6yeb0Ki4>RuIMEaV11L&g;9j-r|b`~F{J@~|XX1=H8 zep5X-MgMBQ7L0oj|90Ug|0lHJyZ7$2UuN*J_l0ZVGx)iKJ)^(3N4+ELh8A)|d(Qo8 z4ZbVTmu=+s2DpbFYkW7(#djXG3zy8Z_lZxo2i-`IrSgP+sULms+<3gH{bt@*$fqsi zJ~DrvOHbh=?gZZwrUNi6^ z>#cpNpHq9*^9|$MeNV->mI`_5If3U2E&8SZp|AW{(l6$zK+d}_S01?@`ojE;gjkDd#=z8RZAJrylJ=ar?WwGT#SR1Zrm*S9O3djkg`ir#B}5 z;rhU78Q8xzu!}u4hVT27(|*@)KA_*8QyU-Ly@mR24%Gkby`}|vY5JOcU!q4(!1)FA zsLj-}`!G~$Vqfb3AFiuB5@dmrsc+cVu zDR;zvDb5SNW}NO5*R1n^d0bqcd<*40(D(Y*(DMpD*}_-yoBtJCeJ1rNKl}FvA2BZD zH1+?ee~qJVQC>S*J+McvZjldD zuJzp5bE-aa;LKiToxPtrLw-mPlXs?HHRMK*{N4-ciYp(O?*?+<0G&0M|0Q(M1kT@< z`s=_M`B#)*LAN#P?;w9F^ppFdA^mV%1^xDa#l=g~&gn&glUD`$K3wmm!Dpkum5}`7 zank*d+vdf==ak#MEcg+)J2&{`se#_F9sQT!%YPp@|GB{4GXskk1oj^nczR0UaS-S| z5#`S8wxm06`X`R?f%0oGNxl*Cs6d_?XE$KJwyeML?hWY0eQ29}UF_o?P`&K=YX?2% zdk8h`<_>V9JqMp1fW!OK&pG(yv%wqi;hBB?xuolF+>^igg`^vorQU7vT|3%%T>WUC z2d&{R&$W#kkWU-z2lQhb$LxK2&uR7dOzxrocLxs9KS$_YyL`|14$QavWA}x#$EUn{ zN&lAdyQ6u&5AFzTGXD$YiFWdYc~=f?>6iVUO;f)1y1){;nLjzW=QV5e(G+@c-?4ot z`P#d{)i(l{Uko%pcZmF|BlnbdZN{%%HDnwm^1^-HnsGIuKjUJI&n-xwAa6Z~?;tny zm(`Gy()oz?)qflKp@SS6d?4fKBA3_DLq$JFeAlngpdYnQq+FkMZdJk0>|E%+3x70_ zx7t?&+VOt}`){ZGhIt-+C3x}mz&h!^?`qt$@$lVk@-67sQ9frqr;NK`TK#F;MEmLufRu_1~1VEzH`-`kbZgKiuUX1 znIq#U80X;Tr`}eJ9~S`ign$pOf#}IWyK*f6kQo zDlSgGlKsR6ys}@cqj7}|)^`HE*5Ir9gQ=$h9HE!>TP!}4@9Ih}qHNPZr@ zE&22p8|T!9Pqbgp?s2>&`5S!SLO;GswYfgueQ#d5FoX_gcjmitO#e}r`aDnCVP_aO zqJPi*xbc{4^xA=Ojlc`*drsQhpA*=Ge=7K=3!J|;-$(FmeH?rW-|b%&-1nW=qu`6@ z1@6diyhV%e8|B3BCtv-kfrnn;?6(37@~?h1c=^kG?*z7Z-?@5x@Xfyt9KlZu`D>o^ zCF#mf_nRZ+fc`blFXqtEXqEEfJ@pFuTz|9Y>nFaqp?B%N`SH{wD5zwTk54YiZE$!EOO=JUZl7xKJ$d|%QVs9zOQ`xdXp9;Aj2b z+aKdw{fh2a&-i4ScBar@2YsoYoZm+Opwl7ze|%Tc>$Km3|9AAebyL1ezcut%adpzy z@8rAtAI3Fe9FAB2V3Yit%TjIw{WOrD<5|*cFAhAsJg{?NV3TpJ81I61TJ(2#OY-fI z51v1?u|t%1ZRo@}i6eH2@~*}FxKFQ;dwb|n|L+Dlt3B0Z{u<1y_poZnMd@3=tNXwm za%78~b6>w>_zwy5-!>{Ih`BeCVB+O)T0{kz!9o|_sMWZbcS;X3Q79&{hSe;eb1uDj634t~)8bE3TZqNJR9 z&~pjT5ti_&aSRjac_)3N*Nh83fOpVyJ@{ly{yFlwe*^0UziAKcuv0qlWB01$^ZobQ zC5#j3J)^}NlJ5V32UiF0T^cyUzFfaFxaX?nODOl6K;LuNUl6=Wy$kwvpx?$(tgc8t z?Xn5-VM~4bt#&U+zT-0kz5i1_4;(quqJOJbCVg~%;OxA>7PxkD^|GY%Odw*va8$hRb){_rF8;=RYoIQ6cP&o$O*#5(D3*;4Q5%H-D%*k=9u>?4fBt!f5#rO9Ip0G34 zw6FhU1HbFKgcdur}8 z)c4+p?cGK{*mn+Cuj2Bg*IADV^X+@lv+MHRchrqH@LX!h`g%Xucrf|3P5&$MX;1gn zbLgoZ@@}LaM$X6wUHa*NSXM7gzfP|WTtJ5vbUAz(-$`G+DENeOU7-JasrWuWH~EAs z9+zKebQeY==r4oyP3exo;S^* ztLk0Je}H~Guc-Jwh2ErJ{h)Q|)bi>t_oF@Neve-CJhlVgg`c!reZOahT~J^T81FlJ zF#R7M&{(Z|L=&1tWIZ`bgt{$%3=dXzf|;cNSOay-D1-~TZESi?tk_-zdR z>95p3b$T=XCSQyB*X}K`3wQKWIkcv|339`8lJSM9uM7XJuMIv!uIR_BKA&{sQvDyR z_R13ZID@Y|&u%GCFQeXD1Eq_W>xew+e1Y%uv%xry%&YRzI1%?(Gv=`mU3p$uhyKQ- zFYzDf-`!B}_A6<3&O9Ax-+0B{?fLHcm-eajr+<3FdQ6xH?Pkxc zJCJV-K7(%DpXqn$GhfXwr+>yT>2DvuC+Uv6gpSYrz7OU5jC!=2TaP5&`0GPOKGJ8v z`WKUKe2wpDc&}p3e6$&#ern@l=Jcn@_)hSfaVFjaHqQRc-u?{zfj;)kXTd&cM13vR z@$|mrub7Vk{h9;4N3a2x|K`ZG73EsUwGnz^jJ~XHN&Q>=3cVYGA8(_dcLsVtZ3KP* zuA#3kbTg!$Hn4^rQo*O*`>x8=y9XB6fL|B5yDCtBXn`J^zAow0*9ZE})et*Z|EzI* z!`CL?XcAbwBGCT>^uQbElka7L#>W=lfTXAA56&y?lIm(q};T-y7`Y_S5+O z2Z5cZ2YRn!{G#A<`r-eB=PyWlfnMD{H~8r}feYYf7<~Fv;FAOAzZdBHTlPzRt^Z2B z?*Av|FQNPefhS-ay;@C^K1BZdZh8GbC4Kdg=;=Q6<%_%XjJ3 z^NAC5tA9*;X9K;Bfrl$oPak@kLnm$Iy8m}OA@9%PS)kWBdTUF2EAllzlzR1BtT(iS z9`|0v0X?yTzbD8=_1TQ{^~Y1*IE*dzdk?%suJ+JxelOmeavk_vKgR?<-@Yy1wOiWc zQ}4FX*WN#J{%4H04}Tl~GQK1At>Nzu&~uo|bmWNNcdUo@bpyVyvp${&t>EkWrD>0DCviD0{8X{KKK9g zYve^A`f?v$e`(5X;bY%P&>vmCkapq!v-l18+V}AGzmj~zp9$=?srO$7Zn}XDfSj=lSrTlis#}%=?aY(NCzodxDBe&$skflr#k=y|`-~-ecS1kh z*Sdf0z_(}i)JIc(^r^rW_Ly-3#!pq$r+ll!U&a&F|1jlC_*B2D=fvileLDFDjAH=a zrhV-b@B57y-wwS!cw)-?PPq5{^q)?#KPu`UGru$DU%zj0Tk7$?Z|m~lJ>+c-d9c4H z>2u_}^L9iY8t*oN&$f*J03TJzodP+ieSBbC$}!Kuw(1Y+slcb$@jb@B#;zEACjD!( zZcFCVeVuVDL)KX+KMbJj5`DEoej3-}eq#*XY@`q1*?KX*J?48NT|+lV=-9aY;UnpH z>mlZy{OYF#<%~b}ytIB_^7~&g-_x5v$~;i->5IYV;L|SzuaU1yyC?ABXY;)W9lEZ* z>!BaIWWJ4KpMiT0J7S#8&!xT%_zc{3`mB@oc@KIm8MpiREK3S2!Koc{XGRgH1X zDZfXajs7xrbM>RZ6Z<&N3zc`9+o+dv`l-g~k;%vNee}V=3G|}hQTcCth4CN8jSR@| zeyw>$>M7q4=)J-5wZY|wG5pbl?%j7z;2+}|jhoc&)$i1Qf9e~eA6i1>@09P&_a$E& zJ7UW?)hqhLjHBC;uk(SF6Q1plok#RVfqi4VmiCTz%-|mS2~;U-^E+VgFXD+pXGZ6U;E!x_h&oOjc4y%PJe(U_O<^lG>*&v zxbCTc3+%c7yC(G*pX9mP2)VaJ-t1nPe5=O?j(;z(_u|0KvjUH=4eSGzFa8(1_WXSJ zd}wfP@DB2*dQNcfB_5s^ybWKjemVHyX9Byx<1Yjs{aT>=;vMo}`m;%&BQIt@9sJY| z954?36m8c3cu&52f5r1)`QgmZ_V(nPL2oO{`EE}geYE6z7g(adeCMkH{i_e>>S6R` zCA>fF88@k(Ufi4XC3cAVv;WDY%SRP_yrbWJ_|SNh?t7Bo`?=n0Tq6&5$|w3e_)zjM z;PcKZcn3b*!?!i$ihO1~r02mca@c7SmY1ImrbXS~;zaZm3`fA;k2 zggoCrBk4`}whuoUKf7M$yYp;3jqMu;+`wnM>>HTKo+&riA{e&Uwx5V!8oiXoqZ$Fp$>0`gh zH%<6w1Rofu-eKKFpGdjQXDLs50sU-QPvyJu+@4>Yus3~2b%P!2e>>VghIhW1c6{gg zEFKAayM152Yv(Si;1%`w9+rOR$(Qnd#P`}G!JEJd=?9?ufD?S{dC{77rE}x>rSl>4 zJBIF!e>sv~V;;KDz5DAG^SgxpJzpr9-x>VaL|>ku6ZiGL_onC)4qQY3%Fz+@v_PKpC};fP{7sb8E&-}nJGbZi;4Oho>gz&x9rW?8%y-|Z z=%D}n?_&E6`ELA#uyJwHC+7wF&Qjww!TUh}YcM@O>Alwlb}tHSUl_Q$AaH>_-2i&O zxJG^RS0`VMc6}$_ILP(O^4<4l`^bsqbCW&?4o1Oy;G=VbH=Z82enw#N2Z6_@2F{)k z*!``*?c;#x{T6of2G~cxcEE?0`<;{<|EIvyuLUmtLty!D`Tm=M`(F-R!5_swcJuN7 zOuBLLedua~T`LE!H$ML? z&h3Ge?|mn5_gJ8Dkp<(M+?Vtz`3A_7F7jje$$YPC=e|35Zyh-PIQWMHJ%5@q{>l52 zK4rX3^g$1Owo?zo_XYKz=?U^3f!(*JzRlf%#t)b9ulws0`mMn{P3OsfV7`p!*x!_N z_a$@qRNQw=jOX#3>BPDl7qGoN^-O`~8-ouo3DlpvnFe0~hp!LrJH*BvcrRdo@qhol zOa8^BN$+B}53dM5fPU)O0mh?rZ_RiAC+B~;XD>?n6h3r+yT%UH?lG zHu!uK=)D2$mj?WJg71d#T}6MquhD|8kGE4F<50gDk2av3{=zo=*k(Kp_{w_(TiVn9 zK9XO%dkcRK;J+jN&|li8-rdL2uf?b7ALD5;A3NlSe#P;pl5fX%{ioW~+U@#l7xa6= zxck!Yd8uawzps(U#uF@%R}@ww#h(LeVSb-oXQ2kaF0>Be2xS?@Eu27a8QhkVC; z1s~6uKk4qk{O%aXo_ReW7xlB~FPLJFu9)`)^R|a>OXTYjI;~xl@g0#z%DwJKlD>UC z-){??LoaRQp!>@P{qlUJ^~L1hLB|K^*6|qk*u+lr9-eU!J?NvjH}&j4AK0hf#g~H@ z!1=d=&%Y7a{AS<)z2>=03wkpiY5p+f$X8PT|IgKVhEGsb>E1AgUE4gYt~P6G^Qfq; zD73j1kroBV0FIKHBn=1-AUfoc*h(6d&??}7sTGA*QO7)B8pSXMbk?wryX$Ump1pg$ zckbT%;r+e;=ed4*pK~g7b@e%?PF0<%_W47vLp$zc_G9JGD7X2(Xs?S;;1{&FMW6eO zw|<`m{EhXT@8r1WhV&AC2>Sk(4th`^uT#Ez%Q(9QXMAt(qj?|K{p|H9uNO}kKO5xE z`V>J=kY}%Jk3XyTcf4f4_Y9CvuWJX$M~NIQ7-t>V=<{^`uSjr(>UF$S{vpwhqnzMh zjjj@ZgFHGept^*1T`KgsK*yz~7m7b%JYHWQ+Huf5(tTe~_gtkW9NJ%qD8h22*Q%Wuhl zUgKx@T(JJLPN4pX%K7|8!8lQ2ryURF^#R*E$15y8pz`sR!Xe{;{l*UZVn5UI z6pn}VJU9E2%4aL#=9j|7QdnXq#=j6f`7dGhcf#bag`TIU*ozf*()+;HH{Ubl_2&{j zwO)E%E=NySjDJ2?v-r54H%2cz)>Fott@ZxH%Gal#J#XmTD1JK?`ku(~wW7Ta9iZ1n z@5@fCpXhagUV8rQ{{=d3%W=&-1 zi?ccy`4T$Io1Bwp}%6rZSQaG?Ay~{Q`+S?Gw%;} zcb$p+5?|ne|z2D$CJI{AIU*S1(;R1OIu%ipU--h=s(GTDI-20)*1wRn>ej(iP zYwsW(J?j2cbnz=;m;5dD?W%W*eh=uEHScZv;PqwiPj!)}0QsAde+=L2RuOtO{G6UMvi$-3=vPL1hw*cY zT+Xde*n$e0yEN=LL)Rt6llkLdPl2kca7e#CM$a8b3L} zuFNPu#GdWMQ%+RQ=N&A!{$Gio(_Er_JM#NJo=5r4WunKlqXoS`?0IE$w(@!Y>wDy) z^Tqc%)_{D2v&47&b?+R?pDxVbA?%VbJ41AFE_~AKk?8D1VLB9UpnWe^=Lqo=##`Sz z5x+(J$&tby>615$wm@7p4uGwhkqkL-+3*lEwR zSJXfLw(4oD@4pbe`WNBm--VMu2>ZVmHqiM$hz@@voPmp#=;}X&y*~==cMt!MXx|^? z^`02HZ5q;V5w6h74E-HmCw|5IdS9|6zsFCn`}G-TM)cDhOwi{NJ@ozOef(zom5y_F ze5~iK(dBAK7xcZ!3Hms^Sm_Js_FbZV|6qt-)%efdvC>=g%lBRR97BNq_`hlXFSh?v zlAfmWy>|+S;OI=zDf$`H4(oGxq0$51qvboq9}qvJeI@$jbG;+lvpHV*TJ&|obA6t0 zgx?&#P5HLuUmQ%iBZW(_#x4vm5Wh#ic>bASUwj`(b+z(&{?hQA?sLW8`G3)_qPx!) z&gn1jPk6n}euekT#~)Sx2EWATxl+c59lx1z!}}qgAA3E}`3LB`*PqvO)xSbdn=gtk zZxwnU%Hv>7`Qgn<_x@{6JF9EOAA-sIMbFWr^z)+a$2aIhAH5o&7a{NGcn|wQGxVio z-rl=Z^{uWFj_4=P+bjG>$Dz!zKLhMp^;wl$GR{Zvy&tv4-c8BpeW`}`@jBNCKXIo& zc(3j)s=vWrWc1SndH4O{KL699U%j5~|0;PMw7O08wY*1<@3!W<&FSBzza#CoKjU}{ zuMc|v+56)O@8x~BG5z8F@-=ed^^v~kA;?9;ceDS}#cqbY|8UB8g5Rfq{C*x!BEDnx zYUN+;DXd>E9KTYS=0cydaU9|B%i?>US7X=nuZbVqzn_TqzEAQc(Vnk3t~jBeN8eMr z*LhbzC;v}`UI$LeA1}oBz0c!ci>`hrTtiP7|N1`_e@K1yr%UJ#ST2<>0`nh=E`9*s zA@u!`7443`EB@eHq~9)Vkf-*mqU{fFz9HIriIAWt5b*W@eEyN>PB2UX5~aE%=wU`K*V={xI< z*NBcm&(jj>as0@dack>(E>pQB`tJLlgZGNR<42Rf#jbf@-}@^bA01DHtInW@Zx=s*n=m^`7`|25 zJw{j*!ulwo|1aD>T6BAeurm;5ZxRj;6eh0|ZtSkfOV zT)$Wt9U#meA@qD^ggk8do8J-U-} z;Oc*gp3H?C`k~J_GyRVE9=}%f-{=#RLtm<^M0oXr0?Rjs&xYWH-{Omem zJr#D*Yu`h%#I8r+82$75au3?)_~R>7kJon>=-2jA@x5;}g+E8`{lD&JtbEh6sONN{ z_jT+ad*5euhSEpxpd9+s3`I}C7(I%>^c1B#4$J#O*5CCdN)Ksgfc>e^yXZ8f|LJ+& zCH0QbGv5;vj+B2*dW)WRj}X60J6(QAKL+-H-miR~fB2sB6o1?MX^v+a?5F(WgM^+J zHxC!R#x8VtPsdp;kc*x55uP6-Cn4!I{2c7vqI$RZCsX9k>o_}dhkVXIqx}7uu*E-G zf%b15$JE82OQ|{d%VdeAH0uRt$n)a&_#*C*HXXH2^j`p0nu z9nx2{-}b}jf;S&hJG>4bU{4~R>-dbw?ZUt4V5c2t=lcpq?nmUIi#;2ELC;xGe$031 z(Y_x2J>$Jw_&%?>{iMo|8)4t?Oa8>qLw@Y1gp^x>_E)FwH~5ZQ-eS+@_!a)YT6I0` ze~-}rcdYL%diz`LyN(_vdY*tM2z$tj?iA5@k2pRvyjtHO#~vi_743T#dgy`Ip&j>8PLywS ziEu)`&3U5JbA{atg^t&9oc0WU?|h~EKIkRoy!%3^j}~SR5w?#K z_V*zDDZ&On+xHK69j}j^czjJ6S3FNH&<~#@@VM*s7|XNI*DuI#dG&nN`%?*aBL2PF zmH&s({_FHVMJM-u+Y9eR<$Vf;(@cM5$D z!uwkZ?QxuB4?Swh@3^+|BPyR9C5+I6DSBBT=iZlTKdgMCPYUfP+kftmK0pt>Pd~m! z`Tbu??;{mgiodgdT#BBf7a8M?^`$^>=I>TMr)T7^D8ELJrteZd$5lA)!hWsKPre)jF##h;!obo^FByHo7KjQYBVDc|^b zq0c2(mx*4!Mc99{a6r9|#}0U2aGcUZ^xf~-KTrJ5XF=qAe3odhw+FP#^Lx(=mitnU z=lJ|X`*iVFhYPbag&XEgw%7Kj=J@TN|Axq81&)#1*(X)cn(<)`-MLBp7TV_x7M4HC z7hwEpR8!iwr2QUeYWmIludSa$eJOsH{qi2qUHN^`uZVUpOw;Z) z&+~n(5p?r;wR?zN>)>~K{0$h7eLi}?c<*(DjPhIimpp$;e|tUE@dyd+%|EW^*0j@c z$G-n!gWdIhQ;Z$RXt&Ra`2MW;4As{`&clO6SB!7jyG6H@-_j2MkFDgrYy8^Tt(2$V zea>Y>zbCYNK|NdE+vU9;?sZ~+mo@M0c%h1Ug5&e&JU`~S5%Ssc+zPtK^HSv1?MV0z zuD5@^-lOEb>q|wi-5=v7nE;_ zy%_PmXUKu)tDd*?$d@6{KL6nTk+@NP33|K+9q(a(+WT@opSYv9e`0T(-}9{*^6v9r zn;Y~zpA+6fFFz!{{pm4wG6o~&bBp&WpVzs4{%~-m_%%4g&+vL$dx_FhfvdkT}?g_Ea1_k_(Oz()$(uCUxi znA}5{|4Q@moc{EEEuPmoKB&w5&+AYd=nnEZ_xOYV;C0y!<4y^!5y4=QN?u{rZ0I2tD!t zI|t}X2)4(lT=z(!@3-;!+Tu;(7mRO?n^@vcd;hu}DPM4oFr(d`e=p#7sb}?C6N@wC~@XAP*J&)*h?${Efoq1;QGA z-OvvW{Z@>XULgn5>!3dDWT`I z!#E)S!u}uiWgn-V@IB6WU2;IaA?WqYK7Nz^v*9OH&x+@Sj6VVIwf>OO=lHK)UtT~v zE;_nd`MTc{mR}J%ZrAIJDdX?XxZNn9?cExG&wi-mVm7>o{YLwh?su=l`#fFA`*{7j zp?^Kz`n`7M*SvSlciyoNm#ck_lk$4d82RyiR9*D5h3|7jQ^rxBr)%A>?oYns0>2@% z|L`e2*R=g)$D?oYZ$`YQ*JV5}7*cOeJ!|};0pEYkcQ47;(4K(ry&zw5tJ;zCeJ8hz zuD&Q7&|a@|1nAF<_xAZBx7U7g_X{dN;rnl?e~jD|=zacm<%{Pa<3~ULl3?u{`}iQ-`A0TNAwuTQroX@@bJcj-5C3?HG+#q*b=nUHTj4hG79&$GZm&ntS{En-(eQ`UzuQow%9e?L@ ziMG=v^6YhL$4TcOP`{;D3mrEyxk9w#Fzfe;c3hg{IyRSz@AYWki)BB#!5_#kp#JlP zj*|}06WyF6OfD3L;H(rqF^)wq>>prn{GXM@$x8Qs7*^P!_(bu2-<8h^B}a(AJcRUv zg}%=&e!b{qKVkYxq3^j`yjXPk9AW2~V2^ye3CB+mhL06aBVoF$aQg`1w7mk*ozSPiLirRkPlPe?R%jeb$v5 z{OR@gpLQcyjR%ko%oJRly8Im_WrEz#qfI5@Ji*2tv?gdt~abi zTaU_%L@&+-k#o!U8rtznURU-xf)V;sp$F@;RFC~W|EF(yJoTR-G~Iuz=)`>J{5bK$ zT-ZNISR5c6?JsQh6HY_wT<;e8=_Acuvc6eUC-(DdqEh zJ6^~3{NCpb{l6r~XW9NNzoYWDdt=_$=Qtz!JHrl)kelT|<$UkP1i!h5-Ps(i^cDWK z{~)Rmb^zzdHaQ)cLeag-oCC?PfmON{5kFNI;rOi9$&pqRpSp7Za3)p z+0HzM{_#F=ihVG89QAy<#=dy}wRt!F!g$v~Z@kazI7#b`*K2)lV#_$azz+F7uOZ|7 znD66#GyAK4zxjvhCve30;`!`~@36XA`BtA6PUzne-=$AE`{N1Ex4rE19lMm<^1U2y zZ~Y1Aci-bNxlqsZJrU!ti}t?1@2m6qcFR-qCFL7`Lufy7{!P(6#=qemqKmn3cAK#J zjxhhOFuh&4_@U6};paaS?f(l^lrN~){&RJw^3CzH9e3?}J?uw24%+Qne^2G6KM=;y zG3|HzGTv)TJJ;V*{*d;Mpw~_(e~0(>x#P*VRc_3C_mRq^Xvg^oW;p+o%T_2-oC zbB0s&xdVE?JD}X0@!a?FY>=-QdCRd6DSl1TsD7XOFOV1OZ)G_H6Xdca-yC_Jf-!pS za~ZZLJ{R6%&%9sPze>-agZ^(u7rH?Y?N1lzyVsG*OH_V?zV|K`J-AHhdjNt9MEm|c zV|0=DJ{LGUOSJD57*X#Gy|KR?kZ=4BuAU+E`f~7i(Y?nC%f|`3_{ni7I%YhcJwo&vy1c*W>|w&$ zLjH5ee^lI0TkJuM9C%+YMh-IM%ln?&uc$t+D>vx5<0G1%D!l}gJ4LtuNICrG*`RRla$Wu>TzB%fTyzK5w|GM0@=2lP|kceETgMj|b?9$JP4%%9m4*@7dTn zr;9#qdG7i=cv$on%XcCflg`8M=-d%ozB@9Os~Un_pYdktPDx_+Cm!+ZI@ zz3vmq55GsdXV||2d9hsie(VCdaQt2UVbv3XIrh1S9CeU0#~a0z_kKsfd$yqC^|n{5 zUi+(FSB`EFzsGa>pyT$2Q>ACL$9|XR0rrD;&dHL0cAd&OPH;lKDgN4s?=y!#;XT%r z_ju>|lF$1^ALTvh2aiJ~{kytG=_&Q}UGKHx4=Cq-qc!Kpled9K^B;`^?6j|t;ym+>^cK<)1%zbW$C@_rtt`+R5bPkMZI zT#Wn2{%ik}s<*gF=yhes>v;WTiofFZ_}<5re`}eluPJm7Ijh08R((D%V!zn)ZLdqu$=7~F z`RzA5zxBDnu8q*wG5T7fhmLFZ{j=@ms;`TD`hOiODgk5m+GSS05gn3WsIOWBoMf?8@-A9S;K7@P^6&AY)w+|P_4}jkl zR`(G`|0VyqI+i$&UkX>qkL`JRqw?3F=X)jc8h%0P)1L@i(DUZWuf&gkD_q=N{_*CI zq6hfTIsS469e0$^_hZEOg#IU$^FG()Z$(%CChYxOIQeJc{MW+e@4&AMBjkJiQPF=Y zpI)b!zFFzPkwUK{&iGyx-*1b&*?(Ojmo4(WdXLKcT<#V<>EQP|zN2K^njz<2?{VBk zh@J$7l|E=zAP}4$kY$+gB-HySK29e;d%Bqg4FSUc$~kApPulOMZy>lS1foygl@Gd7$`H z^khoC8TuL>t91VdaPSV%qjw5dmkO(sg%Rbt)IXuWJP-1@%Rc=%r+k-u*}l|s0QF-B zHng*%-=fzjeUuA>fpCNT4Y7+J|LxzDS5WRl!p>Ca{X?HG>>+mveuvjNR`_Ex(Edqw zo$4v@+q%&9j}zo|Lc1E;(Za8xx9?RwWB3ivvEMnnO6kjMgx+VdpXzG?AOTG>I?e+7F=jQmi-fvjZ{waDpNB?}z+V|M3(N~{e>!FV`(C5{+&=vJnd>8*O z((&4B?5gJpk^7(a4|pHPN2cyKzK7@ep~qqJr=)j4?^AewP$8e8`-JeV9 z@jT4)C&#rrPG(Ghd)+v=neTavum|Sw9WUd4S>xYKKCJxS_x8NX>)e}Bcld7J z$LR5$!*i9t<@-&*F7oL0?e+D_H{(6L-*3Na^GT&U4%=}A{!c*jWu^Q7E5n6opU+!< zU-af{!sSdCXho60gdPw)VLEpEL&6Pg=y08KxuzQ>Mj&JcjK3<0((O;v_E8pyk!uB&l#~nAw zgU>O?R zJ3^ku=yQa=d%ouR>I6HMf@}2B{=^#pVSKUL?YL&&OB-Qt60imr7tt^1h5cdQ!;y`Z z?*I6D{n+=``ThW}KM&7S{@J^P(OJ-E2#a?JSEs_qkC>kzdUB|+Ib7)fd`}J%y?m`O zWqjpg|(Q-yIPoQ5EN@(f%(Nc`-6!Y~ll4}=Cc4-lQ+ z6+V7<{B`-w?UBOHYn1MIIP161cZA5P&(ZXe{|I}q_=(C}|9#&@@@w(?|0yi+lf(ZO zJ^3TJ6((Kz%X8?>zlcBmJ7IjMaQO#e`y0}!Kl>k|H@_DKE1~r@y$qUhr$jF%9}wSu z)%uyDSDA3SkFfVV;rvXY{n`q-ol$><+~=V8Ne5S`T=z<0cDb+t1JL8M$Ki;29QW^g zY8} zr~8WE!#~bmAv!_seUEwfIpS~k5Jun>e)4?rn-_w63wv)6R_J3%dnYdtzj&fBMekDD z>;H1*v~!HUJ07few#wzF3CC{-Un7ipuY~s=+CH43bl)?!K1g(aq|osvi#Lh3{YiQL z6#L`ziyhvppDTX{x$%5&fxIoStG36T8@eI{(bBXnFu34ik~@t2J-xJhXLW^=P> ze;>!UPidFq)28&Jzk7YX%B{fU!=fE`?fYhy)Ng-za*OiSp#3?oe@6Ii^RJTc>%#S| z!r;q7ue=z#w8|GnowQn}>ELZ1h$Zx`L2!@o`F zI7a)wJKu};j(Cp^@8!7V$=6hVKs{ckj^Qu9t@MWHE#ZgM>w6;opVL0yIi`OH?l;~u zg73JR{^wQyhV+*F}neAG1ndO^=Lzkv_?(aL z$6CCT`cEhSIl?~kPM-(zdfVhIrTg54_j`@`NlN$q8Ixl~*GCE`hY20enZHT&a6e&+ zzg07id)yE9RJ#A0(C$vT=YY==Zl55WKTha-t)_n^dhtME_!q+R-onv6g`K+!S9cfA z?k4Qr1OES!zdR+q`$o~jqwu3&qP9=`B!1@55nNzgfr^v|3>uc7sBDMh4~+a!M_XrpB3*{O}-$0 z!+17k{ECs^#YpMfU4#|irT1LXHT^O?Ky-PIaQQCsUntDsZ;{)0Og`k<$8v1Hxj0$;>8V2hzuNc3`MwyR*Bc+De4Zz!2a8_t z-u>5!uJ#uWUm*-%Cfw3bSt@$|Y~f}PVF2AeLv#dYyNS-9Caj+-T*D8ZE;@alaJ-kW zLpwab2}vJ5Ug_Pvg|oxJ!-f8jb~X^5oF?==cJ_N6m$f)S>06$+rXPYs#Gm9s|BtkD zoM^B2ZC)$7ezS0Pgs{YZ_^6W z$IIF8F5gdm__ytqq64tc^X!*)FIIX9wwH(=K_{TsO%}9&bCvQrp2YFH_Umfi&+~-^ zbbP7G*{>b(ypnn&{K6^ijCsEIH7mD=bl(%zp?q_;>JQP^2EB{WFTeK|{q%mO^>RWv z$3^*^f%l`jJf}}Pa<`lIEby1Nyyu$tOUXZk_Ir9g)$7Ln_p1Hg=MAWL#B)4vpLqP{ zJ1i*YI3?S~9RIkyS@rsyWobY57V&HH)gKb={RhjVK`+%PRQ@}c>UA&7!S#x(T_WE{Ct<~T=mBE zqyG~)y=_2~}nSo1x{$j@@BdK{m&!fs~hSyCxINA8TC_gn9+*CF=6^X57JfY19^*rgG6 z$LAWR=jl0vcL{s=1-@6-`=a4HmF{zW-f#7PyBo&CE#t+S{5}^|ovQN9$-@3gLjPyM z>uwGH#5PxY{YGK@24TcF7lYls#2>#zINL)w#9ywTA$qc#(D%^gPZpg&Uby}%q5r!y zf(~|pe?Q^i&xBrIp8qfWVEp9m{}w&?Z(%|D0KYr?f%w55!r`65!r;xq0(%@$KEF_W#}9RpTknf> z&r!PlmzH$LX#_mq^Gl!Oaa_LdRSYQSc#*|fs&`2J%QHm#{y4`UMaPRDo+xaN6LyY< zJ`BX4b3AT)p!jWHIDD;e^Gac{x6t=U#Ct+NQ@DJV&~g056GSIZ5>6i{ERpx*QKB8U zKigHb&%@Ra7u}(J$@lU8&bCMTvxVb*g%jRuH55HMTn|J9)H8S#A@0sXbv zU-?7I`JSDEdi(e*n=6!W%X4Rxi*xbUd^exF^!z8My^d39u{Sg7v)?@AIqMIqz9HCW z9QJrTq+I!E<%nG% zaT9)C55D(nJg==8H@v>D_O4cW_vdIL+V@aIhXK|4Fw zD*y00VUPD-@Vwy-q<>QA^NA6DuJ`d<>e=wTA^ll>fO@H~rat>!K2Nszu=1_ww?5yY zg7*2!>}KVw8lmq;@%pR%(FOjf*Jo4wTCXEHF4*g_*-fg?^O212x&m9iLjhe)Z~`g^uqmzb(4?ny|+>Jo~EX+Gp6VP_Sb|8MQp1XaYutY!Y z2c+1W4tCM&5sp`$V#m7Jy)OQU&ofQ2cT4Qp^qur0{_f;$qSq$~TWH^p;s0-E^zKl4 zpL)D6HU1s^zZb?UVe>zQKKH!1O|;{j3-rSK4*4lc_xg_SQ}w+h<(^7kghKy+eQ|;4 z?dd|t6*cFO5A;0_BgW|zzUOaqXz#B?=c|10T%qGHJpc2(6TXMIMQ+P8l)py4eQ(U* zSn)?k3ERVkog;^0m3=_4SLcCo2M$>|Fci98#DYbpO1{+PQH^s z^u2tC=<)HwDc`riKH2Y{9;);m{~NkSE;hF)-F~jmci2Dd9HR8}EMaz<(Dz+Cj>_xX zgEuPO`+N=dw)=kZ$Cc3I>>U4MhP=BSJ>=Nun0we?ujksYbsVtgmG+AVyx$tMU+H<{ z1UdITYVNmy=QzL5ciZpvJhEo|@H(^4x7gpU(Tnk!dS8zd3*>*y_|W=0f*sItN)x_+ zi@r=wRed$(?RRH<_l)=Ipr4M<@Ve0Oy(;fGM(@{l@fRz;gX49_@cn->`Vi$Z*WnlY2{|@M%4*p<4 z|K^nQdcWgSHauta4caji#-A5DZer)W6!Nk&-}yma}V^V zm4EF10eydq<+i{cd);qDz5uydQt#p;s?YNw$7QVOmmU9`{#jh5{GJDI(A&k8;s?lA z!gnsvTaO0={9><9ikgE`D-f((fgl2EyVV!Xf!L?5o(H9zR>@op%Yl zR|uE%cb|T>U8%7X>oNJ>A@uj{*skQ_J098h?({4VA6B~W8yGV#3>m*1w`cpjvrggf zj+~U(J*eD~qi)L#j`j^Vgu`$h2wly3iQh&>A*E&hi0onWW87mM$>gyKD-y|3bX z^{3eFG4eUYPW!y-2tRFjrplM3x8x7(|DLCG-g)5J zh96S8`>DV#ZLup6{poWNDSV%o^}2d`gX-Bbz6M_qJ>vOe>h-?B|%VPB(4=|jH1{bHYkDodq%zsUMqn-BWjQihyt;5X=XAG@*y3+(C)jIpa7+eOBc z0DCnXsU6d|3;o{``^&x;qb!u}dsL@~i>?n9ZW%|)qeU0k%h^$)=ee+V2M(F=NMZXoj`W^TOq5n7N_$#m9__7YbV@ALFe(?_W+i`albVGXvU<(Fk>3NQCvY!`>#b1%` zb^6}Px*gc6FC07|2CCR(er}mhrGY{ zqay4>ik#Kp7{2EfL*9Qw`}?$afV}njE`8+2>-moVYUvm6r^d7^qF&!e-$mY1+Bu>< zJ8}8Q*Z3;EpW`*xH;QgQAq>DR{G^6|i_rH=c-_(W{`$V?;;YJ6eN@Q2sp4A^0y(WDLuCEo}_ci3u-tX`| z5RO~1|LgOV`PC}lA_rdQTwNyq4D`Ih`x$fW!jg8EeE;^dDwj1v%Si`0@xDuiKbzwx z``lyvC6!BOLdS=UkT;*_^n79k-}j>=H>=#%&!^ue9>e}T4Bd`&f#G{7s$sNJ#Ubc74tg#*9GNQHFk#BLmK`K|b-2*~I~l%N zwBwr>uM*v4!r5y`hwpQP&CA43QsI1eVg3|h))P8@Gk=2U_L0K*UkRg7IK{u1K1}rZ zLBjOD!s6cGy@dJyl^;94tLT_G=LWx{#BW})4jn@G|A)#szGL_Y{Nle8w)aj{queMF?tjHwekml5Dx!A82?)6{k<5wnSNLN z`45Es+l1anw4ae8H{np}@rA+_av1C@I(Z@K;QR%mm%G7#i_rgfcO1Z)am)K9ea0#8 z6HiW5xfOCd0zH50QSS)3ZH`uc|F18FUmq|20^A-W+W$xNJu$v#t~f;Ln>Ps8ePO%5 zaQSMX@5PwBT=W9@9lr>gerTRAI(VM2^K4;B|E!)SIzrC3PZYg+l(61a==)^W4}lME zk+TkR9^Oako)`95XI|Y!{1x#>={?EEds?sK1IUMc@H%{k{&x>mdVG{{hCkF`hkTwe z9A0tnmclaEm{|DDa4r}}uucsB)tKP-6!amROxon@i zE6=AL*t6b#qNn#0mgsx7hiI=mhi8fIVek9cZ>Lx1DLo$x?LXV^3(pkaer`y=dB0~& ze+Jf%)0BS>+8?$*Jv~F|o?k2(9|q`?_hGzmGa`TbPL(SdCp=G%juSsYPkc{c&37E2 z9~p8pd!6!^Zxk-U?Lc$}U08l7zeaw1Ps{x6%J2PykbWqQCn??YZ`%*=kA(F1(sqJ! ze*YEq&!}g_dwbsCdAjHAG2eMczdQcLaWmduj;>U@<{uC?$X|1#==chu<3)G;CFF91 zK6sye{aNL=zgd4w^!x&$<$Cje(FxNgR(}6iseyL9x%Y4EM>+ny!r%9N+w*9j z-<{LWRi*kD&^{;Yc5i8?;}2)NhtKIIypR3%%>9a9d%o#;pZ8ZB7qxajoJ;@U$9Z00 z`{Vrw-^=3rO#Hu8&kHu6P(7<#g^sIFzbx9{)%O@S$dlu|M~(8io~Ra`gTs%D9zsu$ zTi>f#k)DH|XKZdzxpXS@eM4LHz~>tp%8CO|9bhHQjA?J(ZAm5dd`;q zw4Ke6NAL4(kh>xMKjeFK(C0q&*&j(yQN2s#I{_o?#|Zz&_d$$~RsIn4I^F<(V}7X8 zea~EQu;}@lg#Lf_3j5f3v-qYr_LKJ#KVlq=ULm@Ak&$Et7gO6tWA z4^9xBBA45fMbDAfihMQCnc?pi$0?uv=!kKB^%n8R$gTfRvOY}w<`7|o+~$Xio*pgi zgG=fgQ{RYkGsb=YN3q;b<+4mz>;t|6e3`I%v2gGr;pDl(ba&F93LkVF|Mbb?d)>MJ zNXqRhTs};=L9Y8?i{HGuuhJLyAwP0g;XlurCr*+3(XS+DCG)-L<6(Erx| zDYWn1TOOc%_OC*|tNoGT5lRoJFQ(r^<`=zZD!oHLMZDK=H}U7s5;n+#zq8|A`yW!e z_X)RGiOv~6M^}n=ywQ3hdULTb%!M7kU-S3$3-jQzuXM-T1=#2ET=8wkYwUW4f9mly z!0uOPDgXLRq5ZKg>BT$6cie;5r?>dQ)|=tmm9J$Sa9on@enWagy5lLl?_z&4V%(Uc zZzU~ z;1{$jgD&5y^a+?@KfJHx`M<}vhzt_a1LSI8xu!oR^v{a#vH-h$XUEG_?@>Ko z-|+hC7&#eW-#pK>f9ZIUE%|&eT#h`?->-Td#~#p5uhUkg(({XWK5`WC-NOsTcbv=Y zI?>h5Lf;>^`LgH?9Iix{pBDBm6M9|G````oTwb8`(0V~Tyk8S~zJ~wVqBj}-k=Jn> z`qh3;i=KFYXMBmC(|`l|eFe_YXRl+H^pDpet!F*HV?+I(-wtSx=l}MvCX9at@>4U8 zCCHEeBRfED{2#3?&vD$;2tCf}x9R12pT!MAfB)bb(T)eHKO%baIbo+3`hO?BuOngn z_y3SvzO&Cs`oHnr8&y7~p5aGDN8pzB43NWKrS#d=JQw@Aq`#;1e+N0-fL^Efxd`7o zQ6nG2Kfx{E!}~+lw>f$^01NbKevaC+v+ss{^^rsCiQ_{9@-N3KH{d(0Xh(;79rtH@ zIpTYFk5jo2`?J6v&A|}6V!zq{H>t6c{vVmoOXb+h`TnZc``iQQ>C42=UL^E=SoW8F zPeVUd`e=9IoN;vfWYPK4h3m%)!zT#+AK&34Meq0(yNDilg~K_ zevOsy-Qa&IBi5Oxzt^}rV_aRVL^pLjoU{ce>XVi&u}=@5D7yqEfK6*j*Y`hVd09ipor!H4#}lAD{vA5VlnXBQnP zdVPq{_CDW7^ysNV$NS{FiB4ZA?Afjqq8(Q;gTFv8BIpKt)tspOC47(bKEJwx@A_Bd zk9p4UFqO}d-#O!a^=9!y-p6qZ*-_$0IqBpZ^hNvLxdHQnfcN+MbM$iMTfS7d#gCpM z&lCK_>C=?%{goIw?>&xkkGu$B z$Tvi8tNV*Td$h1myT`nT@5}4HQR&rdg;UGLzLclGeeX^{e~t%A_dV_*`s{V^Df*b* zQ~4IV3WupM#V>T+TYatgK7Zo3 zSxS%ICA5EJKge+h^Rdz^#^dZ%(LU$cGQUWWd#`tn8DH%`k9c3NvwGjAi+*^Wb%5VE z1t-}1E%|czTkQYzc-nKUaE;yfJjeIQtdak@^##liR=Efa`QEdG#INbc3cc}vBwNM< z-#^nukCywXT#tGN$kXUh@wbNy1F(cYK(2f))%TNkX@~XNcFX%w{;!ku-2Vltj?iTrujyZ}XZPq&+o#0^%5Oi(=P5HMcYZwjyD{TT-w-@9|plKj5!V1bjedmqn-%?9lJ5DT_g%ct?)cR;ep3P#_)qq)?8nd1yMX%bk0sCn z=_T(|9;xv@;E(4=?VGQ_)%kU&G*R}rv`pMzDpl@vK{ihF2jlH^?#J6mFUq& zz)$ep&k7xv;kf#o?^k|O>5D({le^c8@Bh7xKP=jD-aZE#zaRcp!Y$u_eYt4gkF&l^ z^x|Ujy+=6UJ9vKNa~~D*yg@Ew?9%`_9>EXjrx|pHownWUA|DgvYK&afpx3b-$F`)u zvoqB``|%BY+gtBCG0#*SUprY#GjZw zP;`19Ve;p~8o#+uoW_vxa>}{EkoDvq>vJW3@B)7$`fH7|)9(w%q}M+YJz<@C@Ke$G zU+TH}yP?k&`u>h-DSCLZa74R1w#(S#74n>2r24kl4WH|99MbA`r8};9{&~@xzY#V+ z7tU@Y-=~GEYlYDVgg);zKpr~S5yvIWpQ(J|?!tn0PmmYK*-wx!kKZltH9~*Z%{v^C9fvqYy&iI(%? z73AMrxWs?%>?PW99R5%FI2M2X459DY823caB4G(G9wXZGL*EZrAV(u`^C0Exf{S~K z?%!XyzN@f@Kb_u7bch}d*jK53Cb=Zpi6x3HhQJzMEsU-7)s_j<1E=V1T0$ajCJa$}ym6K{O7_>NoX zF+R*sCI35x3H;3oF<3;dlwb$c9g`W6-^p1;i{t&(M|Fs+^GJl=wiAir>BijF=-0++Ve#7%S zpf3`AG4n%L~O%z;GY!*dhrEs(E1^07u--6|{L^p{rdb+T`n{XWo$Bz+uUwaaY_I+Oc zT}1mng5jTup5i~u@t>EhH+S)$JO2|ug7}OXSh4;*Vc&a%{~Y2k&wj3Q>9>R(#^KR- zMK=%8^T(_^S3~hP*9f;~3DYZu{;x)X9Lz3I`R>I+$6rRJ=nZn(Vpm3t`;G@&-lBZX zFNL$82)ADs#vc}8si5wFH-*TQ-$pw!qM@) zk1R;HUf8a<46Jeo&?LS=Y_>#dY;F-dH{{xvs|xUFTU^Da2#iY+)v)1bjNXo zuMpjWlb4AeFmCl;Dti3_;bu?r?=B3$IdVPkiNAV+aQb**gPeDe^W@Rur^xy8FGbHD zEX=#Y0QueoqC58yruP8vE%bkbCg{b;_m*=mw!EM61)QUuQm%VX@jH(cjvp%=(Ej2P zqKEet_IUn+xTr345B(faPw-IX51%Mpq5lQ)<~SbvpUbP1Z+)rI=UyFW;rr#9i>Md7 zK09A@kMC>$ymY%eO5eOu=zVLiCvQgLd*9dl&;|B6Aiaa1yE2}jazoJjD-HT;e|n1@ z4=EQyZ%#PwzVk})gG}i8S9f30lf8rmSc6N(7spN6 zKM!A{{QcJoTWGhdi@)Uib%uQRF7KVt{tkNF!M=6(p*^JMhluum@A4GUJ>I;&^zkFFOt; zx<>i>mC*Cg0e+qL!vor#+v-^Hd-Rjn zVHVa4`0FEi4sz`N_WhH=eoD7IEj`~yzUO@R4fGN@A0amb(&xxceK76i{b%;4$meqc zG4eknpY=KCy&BqGVGkVl6Y$;bUprpL=Qqns_52}ru6wm;pP%&o;*QU^KM=o9`5aF^ zzCv_!mC*k|on0_yi9bT=lQ&4K)sIRaU9a* z?aE)BEKKN+;+>*9=F@LpR~z7eB=B8+ajMGAsMqV@A^B_<{lBh+@0Qq3@LhdAYKxqB zUC#c3aDbkQ~6se`<9uvazqq6NJ_ zSz)iN-xKW5;xxT)i@tbY$M+p=Z&SMOSMohQEA(ZGes~?Xx4-h&&k_2+H^W%8_pv4? zi0)(83fdPQDSmtm%CKLbm~krI069!2Ee z`p~tU)BiKZNB<8cMve!2tNlJVm_WD4@%BYZ_k9~4cW2KM-}6Do_xpaC{IN=3?kbFt z>*TMf4}Y`s7ox-a3s(;mE|K>&a_0Hs61qYDle<#x9>OVpa=^Zc*SA;bLrK1Zd1vR| zlw-c>`)3-S6H$MU`KjgJ>)s3WGe-Zm`0bM?son~CD)|of-!^=o3HCY0KJT1Ig6}vB z-wzVQZ_ZKu>)AePZ-X3r ze{lIc@zduDJJ{*?nef4obpOxN=Op^r`3C**{zU(kDsO+L^IFjx+Ed}*cwE_#e}lj5 z_SK9R{@<4EZOC)IZ#3$we#c|`zw%qgv+jOMuh3_&JI>I%JW~1$IraZQbIQfoi{$mn z*J7vEFA=?j@ADOtf%p-2$@BRZJLh9J7;yHc~ucuV>TWb5wclCFky;|k{pQr%&iotcJ^!gR#gWt1WK)XLDe76qm z+@gnb-oy9MxA;+gE|3 zAwHX_XK3;Q|?`)^L>3kY423=?ca8xJues>r*y|bd7rI!viM$4E+{u+ zp6UCBM#z=X=l+bFcTx}KU0(-z_I_U%JK2JcW6w@e`QYue6MNmK-7~(6$8=wc{KGLC>#^tF}_^+y$&@y8yb7Nv;N6A zH)CA#{^gwS>GM4?@==_tdU{t1eSfsig*dKk^d6-r$f@T$8`|&rwBy9QZ@b|+G4eV^ z-yKKh|EXk*D<$@DfW7qjzmoT?EU(C2AKL4O_G=T5tGst;JBb{w@RPUpkEzG|!?uTG z?A((4US|uaH%4CjFH`>n^!wzcqDPEp+eCEvT;cke&`%LoPZD~)x%+6*!^a5weA zklQZ&%^BivFAzq2f7`hM->c7es!Q^nFU-#qdjD_2a}(-a;5YY9Qa^`0a2 z|B#xei{8>N1@_k%!k@tRf8%{_C3+h5?Is*PmHNQwS)z05X+L>mmZ%F&%-9=Z=7A~J4+(L(xo9r*X<89XXbqR7| zf5Z2mSdQC~%K7}2*AG2@_h1@?Qmhw`r|w?>|F$5ll5mnrtDOM8-omCxsiy3k&a_j*>&dpp17Z^it<|0k~L z7ta$4-gki=Y>(0NBHq*f%uc-Y$x62z4v@z!^0;}c(!CC`Q_qRwkI8Spe}r7xe%j71 z==bmqDz^YveCOV4#P@nc0ll$Z!G0z94^#AXj2t!CHQS*+`ny4X*U;Yo@;R(2uXz-U4{NBy4 z<=0N|m-}Ev+=kB^mBc|e-^4E_?s?5RwC_V65O3Y%zlF0`DgP)FZiqj1{CkDG_*}-4 z{+-be{_kS%$$CGJYx(n_nfKIuNAE)v)U(E)Z1}#8+jTu2Kemh`UJtY$Z;-P&I679( zog@D}^xga9jyv?a@D{!C{>Bn{wBNc$Zias{eniNf=M4koaYjDBUl)1vdQ%AVNl!?#_l7}ql7KG<9D7a^~6`CD!ymyywn8 zoi6O2CXB)CEYbF-^D{+9j05#cM0b#j0prp1Qp%kNUL^EBrTzA7EWXcu+3#4LD*gn! z9Umv!|9hRH*P|oEPY)HY-$Xg|BBq_5UwWMNc;j)(=e!H_d5s)zZMVS~J?_6)&vBfb za;^L`FPrwCoTR&d>>63&5Fh{-%@`t-Ay?%;tO+L>XSC13FeeC~_0nb@HO?>}n z$m`1`?e;x41@E(Zx$=kTr|rcAJGa0Vd&IJ3pRxSopf#_>a5H%K0-@>}*(hS=#b z{V_*QGwgup0k%^S_GwAJ;uWgT{(JRO(H-n`2m7|9A2a&3_WR;LFKMs$xhm4LzUu3t zH{M?!y`96|7JSDs-=pSz95-Y?d&W5J@p3{xI)2T5=z#uO)9;RNA2N>h z`7Qy zD?dM0boXeX`_<>+%h!p&<@>I9Z~q@+f}XGWz9VpsTzJ2uL|#_BxBZv}`RpHiKKQ5Q z9mlo8&Xg}yyW-~wXUMDXF{qy|em@fWzukEN|31R#o(fj0u6v~NtqNg$v~X~e(Ee%%xhVOrA^MQK zNbggk|Bi}-shu$ag zIi(POdzkVs@dKv3kN>aSN8bnNhwXivsoW5`Nsy}=tdNhv3zX0IxYW=c#xJi&CCG0= zeM{<3_f`23b|7V3v7g*^I^%T0Ly7ec66=^XK9(?<$NsLf>oW`^{UQi)CGSN?cNj zAG~0lc|d%B*XzsZLq=Rv@<~CvC`Q_(DuNvV1dUS*6DYX9^<9NsHT(vhrzPi}8 z-ZAj8Z>Ag4vlErxGCugck?++Xy-Vrg`NHx&!V3NXzufm~d3`1wDWBK1z5ng=QQlwl zI`qJLfgXE*aD_fOZq)WZ9jN{}=zZb_J&Mtv0R8d0hu1qiPaL8*A^Kb+pN_vTcGGiw zU+5J1^nZMMk5Rh+la@et9g#NT2s0>+;O{gyvY=`-e;zRz@k zUKRLdj?dcct^7ITYWYghee6?-on1Xg{0(+w&GS8zwyW_-=jP-*GM8uUarJOp)^q^0a+~o*!UW7ua3z`wh^8 zK5|-6&gVSxC#k&e)iut^KYWVPy{?_}oif_9M*h5x-o+pE{%Cx#$~%6gk9}*=|2h5C zr`!~I>%U0lCOpsgr+WWmgS>g1Dv-M>QMoDd?zmi!llfjskLl+Da=fIx=e1kXGv`Cj z6Wg60T#voKVgCMbuaRiM?w0 z-m90Yy=!oT-SdAqLcVJbI=-%cs>=C)gkHC69w5H|x7M)E<^Q3?cTsvs+~xv5!S`%T z@so4-j@MXmFI|hDT;Nwn-`2Pvv3}P3n&`rQ$ep5V^s3oUbb5qv@)F^S_-Dtp4AGO` zk-QIj5h1Vjqs8A@#|%Y}@W(t~=>CQHzJFnh{g3`h&-FTr|GS+(P5EQKo9F$}q2dR~ znf(~gkIO>o339uo{eBPcW3903J>oi`Ear~mkhXwk-M9+5Ccd-{v@5EdHpRz9z9R=|1+$YEqdBVZ+GT*FV}m{uro8#TiP|mP7iv@xAUL*T}99NKK{>7 z|H0z>yk7VIqV4Z)?ATpxcp zyk7Fr{hY8xu514DBD1$NiIClt^xGDKtDe| zMEPdezZvbRX?I3Dy+7ml-Uj>Fkv>1M6}Y{!(#tFT zZ!Aa;uBP7&l?l6G|JvUL^7)J$J>YXI_G>Hjo%geP>{CPfNV#+NSw{9{YUC%O zosRE}zoK^KjBke@P=F!&Yj+Lh^S$ed`B|X9>@OT{pnS;JA{CQyhWB8}QK1{UFeoeqQdwt-21CK+8{wkR#$D4eQXU4cB z=!FUYcCsCWUq)~Ve=cd?ns)h~YW;Ljy~Zh(F8{<7o08^+JiL-=?F|N2}< zb3gSzU>>}F@jCMeA18NKKF6J>JBW7NzN0-$>h*K$@zHt*f5UNl?{}}@m+&SkcR{~H z@I<=T>AUMuKl8U@+$ZK^f^T=$=lB;D=OuFV-gd%%LnoZuSQB^lcQsn#X*2xf1iG<5 zOdPuSq{_=3cP7pjaV|RU^t}FgwLiRq==M6o<#{~6Sm^V(BX-wz*5CUpuoL5zRNj*Q z2H2tE$CU2xU9bLA6*e8e(-sj2z{|Y{!6ff zzr3!VXxHjiDrXPfTvxQuh3ywdjwx1mQfbyL{>+_@S z^5yk>2F~GUpTqF~^~>K~FyDsw4?d@Vg0DmTbe~J|{cL}Sw|bDu8Oo_zVuls>?x3;Mf3Uf0kq`4aSM4&T}?`TWoc zed7D7{vOH-e$9SZ^|e1LJb-I3yQ0!p=okM-{sez@VDdxCm%xAiK2pr{ocD8{`(8_l zUsF0xfWG&CI;ShE-0|mxLqt86L*&xuL8fc#x%El05`AXBZYersylt0H#AA|=!ndp+ zBg-B2&VE7f+wZOLV{Gpt=B-CR?P;Iy6CWvOj=u5z><)eC`>z4>?RApl9= z56)??}a=ht?+{f^J_KRwV_eBr*6?^Qy&-42}i1&e7_|o6!_xH~Bj6;YX36N8N z_tbi2LO$o@+g*+EWWEB%$>(Qm&y8#Hx!nW(InnOqS5=+l~t?m^Yy3j1FZZ}a!N68z;J z|F>2rkf?KN)O z2Qa?q3IE69L_bg1HQOtHU%J3P`QD`OyL6-K8(9Zzh_kQp_g8YkAAcNIYa-hna>2A&?DaW+Q9!M^1VQQ4#?*LyP1J& z^qBXZOZ3Eqd@a!wgnnz~2YT$>6sXd*Qh90ej$hcKL&9kI#vu z-!Izt48!jeJzh#Z@M}l>xZ}LV8oxJtpYmHDv% z`|7>jy@ifjEXWsFU*ey5zjcotJd^X=&_4LC1ik+f(%u^VxJExZ{%C)&u%5)9v0ojK zzA(STr;aNhe^T}Pd{A};(HrL9_f!2}`0Wqrx%G#C^{^yPV4Py_*UBb8>y?4gWvL`&%9Q#^($o`scV_NjrR=B!=&I zw`M%xqh-Q)K&R+!$J>v{PsMv%?9HBhex9PoWAylhTtx8a5&d1GPaO|AA~y%d)88TT zKDOiIUOy!C+vi#e+TrswUJu*fi79_c|4-+rzZ>LaL3{e2VO+jn==&D-19s@w0sWb< zFI&RL9sD@|QN3TIzgPc9bdG)WdC3+1O|Giv{yu&{dUXw@C-8yqEBPGu3O{ClZRM-r z!xp*knJ1rX>`C|f>PY{O@X3kiM%!8Ifem_~Mt){jSG^tl+R<+RS0kn0>nkeXiE$Yi z7k@|9`%WWrYPs58jqx;jjHl?@zxi?C&h>?k+6Q_ueOrpd0czUXoGn`nGy6^L#OX zKCk8V`~rFN`hCy54%gTF_M6W3wXR1x&pq$%x6iu;$jJsi8{p3+{2MX9YviECf1Klw z?D3n^ugPvV*lnLz-s4x+d~aigzTAP8{pT;}{Vo2(jB*^OEAf}=+bG}oBw>xbI(|OS z)b9wr<#Ri0^py8GZ14Pkj1u|J&<8vCJGz3(>+!o<`s?rRwfHd`;(!I`Q1(Bj_jd4i z#yt3*mF>RuTyYoW@6gw?wP^o$a*Z8Y(vJcA@B7UI^SwfEc%R2|?C(lvmUrx*?b8;y z_I{kd@6h2FSPv|avl@BYqpy5FYWvG-_u)E1ugkn1pHu(*ntEPC+h6XjAFz7?`rGG; z_A|XVdH>@-#0S>rDf3kSlhT*}APoLdID#d7yy5*3K3agjpSr%h>YL%W*snJ2|DDv)^oebf-imEAcF5V z#C=xCwZHFqKtEOB7VPi?8~Dfj9p;}6{&4{x+8;T>w=w&A1K$Om;M;-ne9ma`UFy%4 z^bYx$SYHm7n;%rZ(+>;%okss3D+x*eap8pgb=cJmxeVuezWOQQ9(&<)fcAfUKBU6# z`aW2Q{x}Wd+x4Ho*ThXK;t#%mut6W^_!Hj8-@tck{KqqU$oy{MgA;ZxMt|1m)9p>w zey{V)M=f%ZASc0P_^d~t$LK%vwfFgQ_|5Cr4SuS>J7In8^C&*2;{Q9Xzenv_V0YKF z-*JnYex+_de!1g=5%$1w?u7n0zOiL}csNJ(gwXy^)tTRf9?5<{`DWIS=-0;flKadl z{F%Ui>38eBj`!!55Bk+HuU=2h;47a4so}=}Y{11&s9c{*vVHP-OzWQ|b|!^C1Lnp1 z2)2*@o`T~&zQ-8BFJ4#A;ai_0t;nI4Bz?jT=e!>= z{xj^b@AddU(F6LZMm`VdCHvVCdaPm`D)gAom!;(QzS#-C;7GYXe^xMl_TvlsJpxk8^a z^7+K#N=o;>`wV+B!(REjdkf@0M!z5MyYjzLy%qM%_a-C8At%50`D5&h^<9JBGhg_B zyx!lm+{W;k;}IM9tis-VzjApk^~dY%9rAG|*U;YgI`ij|*EROl=W~3X-Eq_M`&E97 z-D+%4DYvG6kM9D0Tams21NhJX>+!mHfFE=0a*o`V=*Iy&KiZx!FH6>M)wkde>}>~z zo=^5iX5<^t`wRHVezX5ek`m{Ou@ighSu@|h_vH0fi~kdX5$~n=F&@`?rg1!S{&`-h z-N_Td3xv)2!VT-g!y`qvnQ(fjaCS#wc0XbGGU0~talC(r-W||?{YvdPp_d#V2ydx$ z$8CN8c8NX;(MPTQ2JExfMKknp#yrpMS3o;H(=xw>`I7aXKgu^BhN?dn!jrpTwe8!jDPr_ znvVj1qVe|#S>ILo%SZU7CVx%-9(}X=Ta{D8#|eB~z{e}{MWm1L{T_Njc` z*dpI2^x*yn)DM4`CdIzn&UerWe04w{RG{P1d*pf!Uqtvx6Z2l82Yp|+`kMNA`hw7U z*8jD&Kk0U#sJ}yR%+NEAQ_SF3pI`I7qvPQneC_=fe>dcaAHK%Up2# z3BRqeFCl#2+E2Ky#O0bdPQP`)|q?IZK&_`AP*;duKDf6nn%`{ga|aXl6N zsq9zqe2#zN{b-M)?;ZObei^7;Eq=1~>j^%y-<-nNjz5Ix!Oi9L{tW$Ee3$4D{oZ;$ zsb~LvdhR&Z>4!vj`1w`iwn08Ig7Ce6>=6KS0(6us1yB|kiQOkiG9wH8;?Va-tjtOXFCaQyuM&OYToyG z!3JvEmTFyK7_!ANDZ8-ms zgX8D)zP~RJUP*LL`-6LH9GW`{R}U6$e@U3r->viCa`L=)Wb4EV@@AdErdEGG23(B!R9VmZ| zJe$uq@b?zG7Lu=-s~sitI7c7)JcHx2OZ4_=zY#sqA%B)z{|A1JylgJRUk&Y;(Y}^; z1n^yi+~w%cBYNP#I=p5a{XOP@_O58x8owk0{lE8!`D=*Z?a05OUzz=4=52%jvZwqK zyRgGg*^;jUbNr-={1x)x@myV=aVFj07g&4$;?3fl=>lPJA7PK5JU&Ep{UBkr;rZQ! z-2;X3i-cSJGV7-vzca)?9T?vdeR*R16ZArdz2BnG=J=bHY5Y*%*9sQupZ76~UlDx- zQ~1{Qy?{=r$8pUR{>({FY404|P+o&PZ_$6d8>v3~M3dQGd|6>%W?%$=E|HJma_%p>1Hb(f* zJ?r-c{-)RM_LuEHuaJiv{I>L4?oY*TfQ&8{2ukAq(7(c7QMvZ_Wv`_?%|?O zQv4h5M{gK6-(x+nZr$6TA^(DY?Y<#?-t|I%$0Kw&*2@BpPF{~e-0gX#P-l}m=-xZP>#>p`hQ5?->Bis3O(j^ zTLV9J@OgsXtB?cx)l29T`qAejeNMlH-;T_)&wC`$J^pD%Iqi3eFL&_e9DZ`#&vI;k z(Ce=)cB)6tt)F`IOKbgu-l?yqddz3`8!RtJ+LgQg^v~$j{M#~+9Kb!QwjdL?MDwkXUyXX zv>evRwa#+IrJ`<+w|V9Y~o^-$Up~&yCoZkbM1*GSBq$h+W?@pNZpG&@Hsj2|FGX zG7n4Ysj!PV{XUZJ|A_b;#soj@(RUf`iLk@oFZ4Yl|KDH&YcW*kE7KuJ0FzxVJ#hM!YIPhih`5q`oFzcxjm&S}SvIP>fY zYWMIM;qisS{gdd=vxKMD3fIpUwp*Sv9`*}H=6Q#I;rlpq?1k@d zN1o7MmZw7`zS$#3u6Mxh?(i4ve|UfI$U3TpA5z|*A%|PqyWn|GdrRbZkH0$MuWsSv zCGyjwKf_;B`|Kz9{;U1!jCH^ce`=(k){hJH-96a{X=ls$Sg-p1 z1@p3iZ}#v-5AA*EJ$zEbSB@tw;78x5bX?B*tU!PH{Pzhy@pswQ@PXqOuJ6QqzBg)p z?enbW_c{8&{>=QVny0P(Q|yEH(bv@PILQKe^ZDd0&kO8Girnt6DS61T+co}Ii9d04 z9FF>0#-&G(SU=CP69s%Tp?44PMSvaj|4&=^U{8N~(Cb6TqnFs-9qY^h{TuQAh~Me` zy#c*j!Z#JPzn^p6~%{ z%JcVEcgSOneewRg$G@hYiF%f_x5UqGY|kx^jGxz+74u>F+QYZj*Zy9u*QYz%0sLC) zZ+|an$GolK`-*%cIAFIj*TekI(F@iS=9dxuQqqqtwD;kBKhEbEj@Z*9{Jdp-wDe~o9^c~^HSgi)gcEV**`=cU7JQG;-xIL^9KKKKGyLb|E28(G6z*6D^*<%L z#jnXNNKj!aq zbnwX%zj6+pGmh4~CG+h2IzDe~z1W~18`^n*50>b)1AN)KeCF4DJ3w#Y(-Ca(SG*7F zIMayyY><}$ec1ASsR%teU{@_SGxG!ejX<9Zjp3^T`_{r&d-Rz1_twxG>lgIF3B9y+ zd;|Txqg^Hb=)v(T^t8W=b@;OQB>+SCD#PC{n7_>H2FiC_JEWc+?+y4Zz8~8%E;HJ< zK|lH2M~dFcF4Hf6w|Q}a+Lyf%K1W{mmxwNqqoEf)+TXxG8SR%auU_w_%>Rjewi`3% zV`QEV_yPW&LrgiX=aKwA2X8&)^A{`p;5itfmwZmc`wCu9W$^FFI%^3Z&*6_HxS$;~ zw}W)wM<|d_-}CqPCsveSURm-!fIjDVcHSBP`M~p>_Ly(Y$6nWYzt#K78|wG>4Fkq` zg`RXg(f^g~{$2Cu|GPU5oxv|D{A)bfpG40c@mDtZl_&J=2wxOn`X{Pq;`#A2qF2uM z1<^VD+#wec^p<=v=_|@vTn0Ph2zKgnE#|#OPoA)sEqd19;qW@Yz^`7A-+bG_ci#V6QJ>F`ZIPEb@-<=C z6Zm+CJ}xQ8{NwLXcpWgH7h-Vs0gXfUr;HnZtohpd|3JHazHNoP)%3sjx|VTih$A_E z;eCXf_J;O5us0*)=I=sy|Ig>%y05E!)_-&KXMsLVZ71O87Ctav?|AO>Nz48S-a-o8!++=nwC+Y}wCPGLJqN+%umu^nur74Ss?5m%R_^ z_1#E2qJPo&l%Uszj?)D6=Y$>~z`f<1@!BHiIrb;R9+&8a85n^Hc6pEe^1joG@tT1F zo&5PxQd9rgTroqj-`XYl2mai8d)&p&RF*AxCg%6O&37d-wOQ{WdlPFNv#33AX@w~2d%g$m{`Bbi0=^ndV-L)C zj;99rJ63jHVQOHito+$MH7S{I^z1|3Yo+cwcX1&y-=Mv&YA%2_prBF z`46;X#r!YK@9@9RG1$KE(2E1(y<|Qb?D>Sh?RZ;AzZ2?RQD2RJoTImTFu|`}A&(LE zHljU_V~qH>1NEo0XN%o!LI00ujb1o?PV?t|41Xui-y^Tl3k&p0j6Im+Pt?qFj=o8- z9}C*kqBoc5m5BFK%A2F#8uY*SXT49kXC1$$zn-5Bd^5tAd!CoyQGY7N&Gw+dKKMLc z@L$U3`i_(6f$`n`hiKn_G=KQ~TnazhKM&D+jvoxz8SA?P_NGFAt$2S9U(WFJ1D6B; zE_vS4{sjK%pdA-nlRm(&YcK?JaKe7h;k$xybU9o6CEru^zL4W>HG0+e7gFjyJHL1t zy}75}0==rTDpP{9^yVb^b}s z@2V5}`#}CLmCx5L{z%V*4+`V=2n+Oa=Jby#eFK&s7d=u>g`BNv&+OBb_f=tyUtoWy zWE_2ts^WP9pEmGM#e6vaGob%gU_rh!Jx=->J?j4*ZlELURohYcaztM`?lDnr0Uw(0 zY(G=@%KrQcKG}i|`frY3=lyQ)XJytC2aV715~26266D0?6v&I?NRHEl$f4JbzHigf z&x!Fk(*Gm<3D6@0`5bTe_ggdU(uw{o@%w7@YJ?uNzH?kUC0~fYmcp+y_+aGy0lv4t zwu5gX_}|}QIYDp18FDaC&H=yE`qAeR*67^=xvS6%C3-VN54P4%j6-L>W86lM7kb$1 z2=5DdU#3R?C!qI>9H)u zabzBP`!&qR5jizK=H&Cbc7Q*9p3LjR5r3n#{zu=~jx?m(zjYix#?BVt0XyRR;EoqA zc^*@b_r>f#9_hd1uRj0TjvB`~e#4ISPKi9F=uw~J*rSI}7c(Dk6$YdqnYWtfJ^piv z-tHLp9yuJ=dcS2JqWjA~KAta3&J_l?C;bjW{}0;dJni2e8AtDX*ly4Mn|fIH)wV~( z9}nbO!!GvUVEoXhGsbcE&r0vmGbj4%c;$-u@qUKS4erS2^@Z2}4f42w z4|C);#7_7ex9zs$A3gQQv@0NgNBt3e?DK-wPdoU^{ObD<6MD|~$P>qF;BVXg539 zbUR|?cwoG|@9BB={%C|h;dysltz%csu@WqUI?a}A%*8#iZ^HB-@ZpAoFwA0^D@b}0{`d9G0fc8F*_d8dNtJe#`S2Z5? zKSKQH61lJOhe!P0k?~#Q7oYtvV5f4t@4rPq?C_h@_v?A^0pSKc;_nT69lgem*4WRO z{>QA3d@rLyu4n(H@@!XZPfm>Y2D$9vbNgeCPuA!I$DMqizs8=Oor|L$$9)6z^bWbS zy>+mga_tni5{_@S|TrwYucZhun!%4R>Q9c=4ry7THgGD5U!f0LFaS^J)yB`!9|!ob12g8$ z-+P&(x9o@e|Cb|nzXK!mRt*kc*0>(f@5$Fh`@cYI>Y*`1goE?0e;o7x;YCfc*LXPlCU&p?t?DWBV!OH=kS1BII|*xY_@jvo5e+?BQ?Y z40;3`-uJr0>z5k&aa^LIzq{{fzEhr$w8QI?lyaAhv)3;fa&cf@OZda*guKraz)xHF ztA`Jd$Xovf)j!~el=ds&^WFROe0hm5d5`e;PGS8PVRn&l`x;^MYVbng2pzs&w7;{s zeS_%rn}jLlxA^A={OA@rnS;?$`G>Dl-rosx?2hmMj>wPWo_pqhPaMJPuNC~#nQxe% zIr&edZ?T^hxMbe8;D-4;fgAj#2DHDmzf3)jV>OiP?_zqtyF%Z1KP-NU`kOtAad?L? z!cXdvqb2<7?`Lk21KWuPc{z*w@O+0{wzSiHTOyB3`zh8l)HmQidjBS+Ki(%?pm%(J zarOqiqPZcj|@7&&fCtGq&rSpVFza9tKhG&SG_a%BtYLezERV@ z#Byf4gIq4?x8*p7_P9FkH79=npE{0be}9g@lj8r!@O^|ldLL*{KN_BgpH%y|$m^2) z%daTi-vjnO=Irvo*a-CkH^!i=GO+GmG8hf`M%-i zzi2P>xPfmRxAgaj`+rluoN|2LH~x2}A8GFfeKyBF=|^F8S&u=%i_ADGAOCqyT_m+;<1{)v3YKUTgJdf$mY zyEjXJeP1g?E)x1%(BCcTDe|{EshmCh)Ip!1Q^wQr#)5i$F4ca@2L0NBOZ1oXd4E4} zJHMiO=U)>pXwUYqM4#|)ywB|OcLjRE=X-L?DgCrwDB!0ZeCqqOXZv-;7rg&dV)t#w zy#Hpu{9t)8Z7Tf)Dg`S@L`KWT;0n}z*r zg-bAcqv#BJdZp;{#lqDqzzc=LON8Ugh0#le`&SEV^m~jxKYmK-8~8E9&+vZmnZNLt z%I9&(;d{s5Hs~SiE3a>?fBWxH5Bkz^3;UPe-}3w%{z>^`_`>m^ntAnoV&jqdoKepa zeeH8tBmC+8+XTJl`*kt=QCZH=yDR+K75+j``xo%dfS)`QGZT*7s$i(CmOHxPlZSHwd1C%&nms|g(34EG4K99Kmi{*F0w$+ z`oB@L_wxRGgadSWv1p$w^7p=M$Cu2b{WG6)NYSSi{BuA)H;jwF+uuQ3ZhbyK;Jxsx zs^9mq{ND=y2iEbO?WM}+?;xDTf00YCBW!1O$gjWqdxSoHLgkbn13w~+J`7?PJI3Yk zCZ+G+A}o-@*3aL{dzT1(|16=rBjY?c|2veg1b66@lJ|G`&l~#Xb{{^j_hz&|vEG6& zykF*Z$BJ=v+^1l?eZJd%$_l>SnIAo$=ufYgcGyj?qeAlA?^^zq+Lxhcy?^3!aa-%D zuP{#Vd5oPLdA{R)+i#z*@p&fud)D`R>dnE1_kEw`hom-lC4{Ea18y9WqSucX4xHcccP>))^K$f~&! z&G|=w!iaYGoK}Dzvj#V`%lj!?#-roChW2D zX#W=UdZQ%2;|4x&Y(LNZvVu>>oyxU6UZ6Kho=2DJd9fEJ&|Bm?`H<2}^hAli-jg1a zZoM>vwx3<0A13se{dDV%iRT%5BSXHtzVLe3E0i$KdW-Kl((dP)@u!VZ3i~kxh3ySpV#{h^a?pVfqUfJdL+i4I?fP#{r>;x z5B%f)PsqoJKJ+=KlK6u6^?Y8@=gjI! z=r!**6!^gtSo7T9AMw6z#C#p$-w=LU|GV0I0_}hK-20YwUHxtPMLiY#(EL5=@J)%n z%)hR5?+4f4A)opE-$Ywa&uQ0@a%@*ByE*AA^r_FmCD1F%_x{D=OKN8iKgZ~$mi~C3BxIgX@OgxNKEVeA`OD9! zyan|*{^k1u_TPPuEk&-5*j2AT2gb?gnS1K@_c(kXFM;3O?udChn;+=x5o%WgzxRp! zn2C<~Xa*_j`ZV>s0$Y1M)Yc9}RqKeV6~W+P{Slhkp?5??o7` z*U$Dj(DQrj)DgWDvVPj5zs~k!;Y0631)pNvI_iV3&h#$)UV{_zb430!#(ROhub7_= za^D+CpTAf2_}u)7@piuY5!Cd@_h*J^L>we7 zH!l%pFBCS<6YkFgpDtWLS5Fc>7Q*Vu!suzjp8V1IqV0b-FBQFblQ2PUeQvse?Vb`d48>`kZ!~&(7jF)}LQi z{tkW$85f_!@;R{;^5OHsj{gM6W5f7)U#mb~8~D-xK{)eg(I<{Gtlpq@4De5aJsm%y zbnD&vb)x$Q{6k^+a^d_H!r?-Y`L|!+pkD&yY55n*w}STmnfvGY8W@+&pDVxb%lLdm zMmrbSA^Qhw`1kmBz1QHM1{aIAeaWylC-PPJoelCCVsDPn2hioOEGLvRP)>l`B}Y(_A>5E`n{mP>-Xw;%X9O^miKnpOP?Fx;zu-}rJc09fcAc}<8k&U{C>wc zE&o{W*T~&SJG?$xd`-^-+Pi@-w*Sd{BlUAGcy>Ga$@6>RFW*PlUPm}!j~ePf(hq;1 zdV;Se_~(S&=IH;Bb_~4deMsx|?$c_|0{xO-W}bXbfAbFd#rUT1S;ROWkk=M@szJxW zt#{7u|L}bIZk20(&XGII{RF)|D4*AVK3|aiozjngEA%?AL?0!8sr1F)2ruh5A3R_5 z-}^T{@3Ns@pNsc+tr({af57`-8GJF(ulSv+_kbQ*FdsSTOUARXz9GG}{$kvH-aaLL zM!p*Un<%HG-koXY#d4AI{75@3C-y(RemEf)KL4?%9dqW*e!lMqtVrJ=k2USf=&#q8 z)}wpck(1x?`ZevX@rynFGy1uM-_Opmq95ZoYn&74HTv>M{`?Jk-fe|G54%T?Hnb;2 z|0M8rO}g!h^?<(vX?s@w3+4Wg@Zf#x?}%Q0o9F)_^ttUBdLcqD6NVu(vgQenfx!K9J+_>#wT3^e8O9A@u&u@y|q$e@Z&~-v4in z(5K~>^*pA$+2=*~oiK3y=>Ph|l*jyb%;VvuO1Iyx>hpIsE9yBR7Yo{-(vF7w zUbnRHU-A`|8=_x*PGAea1;}@9z50jBAAm9MS#PFq)$2qh9MF$G7d1Mabz+PB zok;il?ss-E{lX6$7@rY6-+|3L=`Z6|QQq_hrEeI&Bj|Hf3FE%QkKXe+bkLWv} zlXN_5kG#)5sC*Otlh@%Pe&s}cYv(85$a@|3Y0kJiuD)ixmmYWK$??>Z`8_c%4fC{S zep2Q=W1eO_cf3EKKF8_WkEkDBPpm&dztHdQkNv~xpyxI1Khnz)| z1$=+}YthYr3;kX5n(z56iBJ3gPuXXcZ_W56)IU()8h#m{uYAJ=!UTGRKfJCQ->2t$ z#@XYZL7(xt$C>g6_||^;vQ{}E{5zmW)~`|e=0ahPKH0rcbowIU8vfss&vMekm#3Zb zMa=Kg{YCz_jI-m6hs)|C>_+@`l~a9LSYpp|aDd-^4$kB4_?Y8G19Gy1&kOA1g7g4> zPZ-~t_Idr1BbW9o56~6%cm!9xcY>c=`kTW49r>*PoUbRp?^mVBPe46u#x+1bwxn;+ zvm<<5(hvLJ8TriDC)$_5FZP4Iezc$IefT-^IH#U1dN;+txBtY(YCl z`q?ucj#Hjqsrfa370(mx|Bctr5nW#(44`B3rTA-m(B}cVXDj~}KAzC)zQ0z|kNKyS z&wl3io7DGT!X5kLzF*aSOX=A^2pw-M2hrZ=PX12x>?^`GdTaWm=n6l<`)a{oDE;^i z;br#$_g_$Y^ckV`^b&s}!EQKiF#nwL?U9os@0Xuddd>5I@`g_70r?$w?mne-$893> z8S`G+pFv*@&sTomTZ>;HdigZrq7Y7x7WQEFNYTmtg~$5}+jE8W1B4TpJW%xd;le%_ zHjfep=<$+z^GfM4c72XqjTbB3ev9LDA^ohGw-DSo4ujqCKHZw}D;ci|zDgN)`<=cA z?furX`_SmQs#kj!@Q3$-?WYZYuIFBl?XXL}KYW6Jd**kCzD{Uw#JOpo%k}yF`TtY7 zA?4S9D%$qX@vGCvm7Y>wfSaRv(a~!}*Vu>XYog093BB*{dF_y= zi1GG1;6T3;_@H9ke2&C=*Y?Hnh2$dDlf$RcYelbU?*Y3W@!aA2OziYSR zds;q+7Na-q$2W}kk@1+pKmD^*pY2Nt-(~Q@jQZSv?@L9N3;2ACd^L>oL^<{IRDSXY z!rill+h+)UUMwJeBHxyF6;DyV`fXV{Y%J#@l;Ilh{HRQ32gg5yYDM;$+?=RWVA!!I%X5WiQ?d-&h$JKNVSd@(Q| zB^V-q6Z~mD^*)u?izD-7IjNA3(Rv;%(GM+hl%WT$?*`JXM`Fe;u>M0%m$c9OYDuI1 zh49B3xk_ArtLNUI+tRNL|KdRTJ^CX8cRcqxV+CzJk<*`=d0wF>SIGb2`Ks6c@aCDK zw@((1j}h80nn8~_>5mZZ9wtn|hV;{;lx}`K!N=S4lzxK$v*(E}XlDpN?7ymX@1y(s zus&bD`X=uULf?1xdE|!lW3T7tuNC^&=X305ncrjbZ@#4WX4vKMW1=(o-{)pp>m%kp zgHI07Bl^8!u9&av0p!1zaC>jz4m!S@==D8>)!l_5>6`nBK0Qd-K17&O&*`zy==Uvhv4u~) zj@={Ao%=;U{avRF+V{$q*qIVNbHomLeY0mAYsS^sqPKjW&*zbbPteZK2xsU$pGP{u zAND)fUspc+pX;M&qy4m)bbn97=RfklQ-1rsE9_PU+W*UF?}~MWzfTdwj zi@u@qPt@=855B)Leo4>mhaM^4=Wxwe4fbjEOyyrZO*p`3G4r^1ozlI3yknj#>`#25 zo}bW%it`jPUyqnsV%5n*>q^g~7Zn(;`{&j)bMxE&ea)AQB7E&98D zk?7GnfY@<;INz_^|m=MFl?ZXBMhdd4SEKlKj3FM7uF)00G>uzLk| z?(`6)hYuDG=L+W!{NL%(gGA>%cN{6;{Stquc&hRh@PYlSoO$a!{vT1k2y{H(=T4TF z==qBAUh|&g7RjZ0zJ0%N|6XDJE}{3aywBx$@2S=E0l6?g&Cx$C{MLab{GTEpPVbPP z5bV(pJ$&kQrq|2%cVqb5_Q3aIe2&libusM>C^tcWB*@Deeb*y53)*==PAxBc+C3rH z)=TEMBhOFtccgtIddcO*yl?rnyf5KP-~XCFN#mQtkKVs8Go`oiReL|tbFjX@==1@? zJ$%;l+W{9Dk@1ALsrPZ4%+I#2mW^urQ9 zF7`_AJ}BJ%k#LTl>yZ=hOElJ#=*<@Ya`z^^*E9d~=ZUs|6CvO8$18n>{MXFymU*l0 zLH&0TZouh|qPMpePQN2e?krs0PFRs%-<5p#5iZRa4;3Bf!o^d_$2gUY+wpZuU!iBa zH;C@vBAheM{$5vR8uWN=&_9lE`Fz-kc^tqk^WgLU9pgWKO!YOO_Z60(P`dq9uY0_Y z;Qfi<3(B|utg!qV^hr4ThH(8AVL-m+XGFK37W&?V&-ESQgPi`3Z{>aZv!mYA7nMHy zlCbWD6?93y{PRlpdDWV6K4G_(@Jmrp9{O#1iRkrngiGide%yxi7(b$aq4FJhUO>;$ ze_P6(VP_pz4=*zwj^p^d(Ff+I#4dTCyhl!ZR$o9d%5Vn^)UM0_T=o`G5M_D=alRHy#?d7Lyk-2COBW^$LNz|VUVt??!53bSB<2_NMalcSm#SQ^%j|!b%Mh{w~prj>CtPm)=zQ z*1sq0C};IK(c{m^Z{G18Am5{%zOLs!U*hl31=cUG(({o1Cyy1q$BxXNAi85bcJM(5 z-*54IR*e6OcG)j(o~-wcF|={<`+B~1J=DK_xYCn{3fo+`dW^6jU;il4Ir)l*iS8aO zT;S)d?@v18m)}cth`lRsFM7Bm`8L7`KWOtv(rIt;OwkAWUof5}`n!6ko^SCB=J2cc zxlZtT&GYS!`gq^|jN{6OxAD9c`kcWIxmjD!zE00Ahg;;bd9KpEUN6muw0}-MpTDb+ zmpy#31ikNV`8vHwfJt7 zn8TmeYu4X6?OIVz9*ih2gwHbQt>q7XpV8j}eGoF={;!Aq&kFvTKC1dUu>64N1U~BEn-o2`Wt<$x z@&2g&fg1U)sn_>Md>*H{MCIE*JG@2o8a;7<|9lR3_Xs`jA1EBLJ7@g*dZq8)D0JN9 zME|_M;Qio%c6opBK)pNq<^8Jt<5iybr(A!4UTE&C=fPct+usomV0v58?Jb4b&4tx1 zpwZL&8^XRm+(G><3W|@o$-m@K)DwQ9k2HJ%lfTK_df3u zJ+pX^(v2Z>&HBXae8=^d?^FIG`NB&@`@YwX_r?z?eg8+o-N%G$_^>&MZaz-F&j@|a zJ^8%o_#?t2*!;2RJ9FOR*p9y+pc%t6(zUqWNY)Yl?LGP!Y*;DfQoLBN{_s);D57>kLxq5#*Uub%ZJz3BX`$aqSb;Wx# z^v#GJ*t}5XEU+UZ&zHz;iQiN`Mfn2I`_Nu*+Mg(&seCE(k@Nl*{TYCc=PjS1{5AUL z;PRiU^bPIwe>Z%eVFw?0|H$#Y;Bk8Ih(FU}mmHTlFdjMOub>aKyP~~5*Oj||#&-th zj9bEZIj+6Oj-N;mz!pArT+QF-tY4w_&Y9mC^R#FDRMAs7-yarjGO(=ihL1vdc(Li%$Mz5k_t-Y(j4d&mC*#w&P)o*(Wn458=vtJV+hcVNGlaVy}5IsI&T zzJcEo#$(2~`CPZ-d>*%e`jUsM9VzWdzzUq!~^cYFBfNWBq!Q{GqQu8_M0^WNWH>APD9C-|jbi|%hHEbb_5;J4M?M3;9JR(BT0 z(EEFe4yZSz-@c!g(O;kc*f7r>{NsIJ$14)^3;NM~F){wW=QbfX@k3O9OFbFm)H9#a zALzN`OfmfK^|bdrOZd8jzf$W<=6S>T?(d=U66CU@{un)y+HSz_UU&N3Q2ScFpCexx zCH)DQ_RPRm9Q-539aU0?B#=_H$gxi}5>zk1No6zLzc^+Sn=hqR=uP>~w zD-6hgytU{f^>^^e0H2J^e+7Tq{$|X#<5vOwc0AAfLq3OU{j+(q>RY}=IDeZk2DhZ| zpu@N8c?tR+iO*$6@6_}CPB^?HRbuf zhtGw^7b*V?+`LA#_vP2<-@~O!_jjBQ2WZg#`GWd=p3dvU+VB6R-dlf4==fIzfBPJk z$=TaIt8g zr(3;|=b-mF)~`~!@6|aTV!2w`F9IF+wSQ>2tI;zfdc)s&v>sW)&tB)+Pn#&$@!s?T zwa4*~?bAdDPZoMzexM%PvjO|mJzn{|pIwmdb@duOQ9nufGV-sUCAy&>_Dh0?E4_LM z9E&GuR z^mGY-Igaf3_y8X!lzRe8k0;|``#r$FInS-H3&zjmwW1%6M_CWA7?+&!i=dDAQzPSB zT;}~6Y_rGy)}Gkzjnp*fae~UE&Q^F z@4UV!8P6^AHF{p)|C08!%!ALF`@IQ1Si`>y(0VYn?%XpF~4i_Pv!&0&3ruDsQ%O4g}tMO!NWo^e=LqJ3Z0_t4g_SNiOY!sIfzdXv(9?)GqzXzvGv1 zuSI@0FHye5Ysmj*q3{3uo|VtP5A9^yQEqvCYS5j~|PwywZ7t(LXRjrRg@*SR|{QU*O5zOG{J3FOu$ZmXz;yri@?B zxI0dKKz{5`H^|Sz?e_RHZzt^d;_+(Ngg#l`kM`aRv_3mmbj|Y!z3qF(C30&!YJY0= zXuY?EA0q5_2VFz2Y2S(Vdi>UmkH;Z-p2}Nz94!xwbHh9yo~3*l@B93TzsqU+KTu!A zclx!!VsGk4=(+jN z@rgQ8`hcD38P6X6n2?9f$CWSppm6^>q0cM%9Qf>oO0QoaEa1BXew5?2YxrVE|BQS1 zq@&%(ho~IesU7_3b0AyB@8o$08^%9poLBH`M>|@^CwiR9KQb>%-Z!5ec+cye;o-`k z(9Z4ML|1ne+8=3tNA&V$!rgBQqw5KaUn3p+cl<@sE7BwKud#o@t@YgJBD=ebUS`6K z{42O%K5PCuk$g|J<$U=-A8l@-*jLP{~qq7=NrZ+A$@TNr8l=1ZlSlg6CJIEIrBEV zqv$RX#=pyR%Jsdil5rZ5%Zhw4^)AWp`(Df2Qtmn6O1OtlX3TeZeWkBrVGez|uIMe; zz)$gSD80XtZ~=}t7VYw5>I~(v<8fvl*3dh~aUkE!@`c|Yg9GVv^x=X0BmI~t$MRXZ{kA)x*IhgGz`jyH zE9^v%9cZ7Z^a*}Usi&ph5-Or0YT}imUsxXY8 zdA_=u=oYN6E;^^Y*{_Hme@(cBFADgg{SBoj@P+w3WIQv*XPzlvhW@ZV$*n&gr|0V@ z2~+f@?Qw-(O-nuBFs{K%M0=m%_)^i?D}>8e3Qrdb{e1?Xv-G_U$BiBL4lh>z1}xqp z+Hr8x$BUHiduF?>=o9rWXNw~6*W=iwcqkM9!t9QpC>yoY`D zKDW;UG^$DO>-YW|$VhdcD^_R-33|6;~GrOeyFbAR`xd5rS+*yr{I(2a0KdmUHz zdcgN`EBfX0T{YwAcy|AKmE(IQE9S59JYJyZ_Je1Y=oY?6pDub$JMGU5@L7t#>3Emd z^{eyrUj8)U0Sulg+UHvAN6(S#HRaXFzvG|w8yE1czeBltipr~aFMPP@8oL-gO0>T> zSv^+t0u1O!#k_bwu3)}=e`1y!Tf(l?ztiU@ysp?Xey1m>9}!s7zMAoJ`UbxDe(w4K zdN1~PV6ThYDm}P^aB(Nf#}0X%d=F)gyyRemzM8`iJNq-VXHI?n4ODK8Uvb3VHEz#_ z`k{R;bH;p@57KkTE4==3yf=maE$0i$_kQByxAgvIDcqeyee`#8SJ6Hvyo4_!^mYp$ zIu2cuo`N&@qNM*B{8>W>Ja-)GNPCae)6l>C9%{$-w`u21gu!nL3+zxxdPaYazpm$d z=qVQ6TthgEgd6PMh&|27x8?or`pOq$|C(EiKEWR;e6e|$(tUorqaS_&i!PDV6YqJw+&oavy?dj)*hP;Us` zA`c_}Z2*1bc}9A3E0q&7PusQVko4kaJZGL_aD8K?S3D0^qBH0kI-*?1j}Nz0z76Fx z@bl@WN?%cK0Nvb>dfe_=w9nNx@WE+AKKO45cFb#m-iVps9pw+V(0g9DOpL4j zPshzu=C`^X^)t^$^4H97Px?f=L*!z9XT5iXpGMHBKx)@6F(cIeIx{{+G=2?%ry@*G=9(wcc?&%yv7(UfRDd zpQ`u$AKb-rM2EF-c!kjS&4Sm74&E&E{ho9yx_yJNfc8Bge-A3ZP|tmzu6(6vpYL@2 zL8bKL`NGxHcn`XLnP`9aVg5#F(BJ)BT&(m>D|DPYd$DNmgDjpT`fQ&Sz8oH_bnoNZ zj-Q?Pv)nNcOZ?|TpSm#Yubu1kc?+lBtVLi;As?M1?g@%H`j zBjf4&yh4LwD47x~KBh%>SP8Tk^io^{p94-@Ed8MV|v$^WK8?`+Tv-qdJdvGOpfF z_PM{5@fn#9pC^b(KauWr$Keqw&;IM2c`d+!aht&hGy3aziT&3Nev$8!oX}Sp`l>=t z6^ze`akgC8Z;X+@BUn;zk*J+}^zZcF55LLfE_b=7tbUsGUlMN7yUCSBdw+3uXVC@x zy9Yba_m!&4%xm;}dhbX-e6DkI9qPN5Fh`#|zBWHc=`-HH4w=^&`EAhSjtighG5&|od-uOh`x$rhMS!SG$RNiFG)IrQ$AMLXVD<5vZw zch}VOHS=7+7ZJF)lAhOdVf=H#=qkeUs=^7JT|@MWau1Z-!Y>o`Z`@w`>v34nzvFMJ zoS5+%zzx_lA4lYJekjImetvXc`hniHA2~z5PssHO{%9CSpR;hhd0_sIKcVuH z9~0)t`|z`(XUw<#=7{GZ`Da(8J>ZDmSVA{HqUT5G{-;F8l)nN;>PaI#uW8@n>Y``x zWr#k@>2G>{%7dQY5Sno>n8!KuJ7at^)+q&gV+qdgq4(3@6IS;T&ar2<^D*`^e6pVR zf53Y$5Za%%-&wy(>BAp_jd1sB;q)3|`*LCRB4Gqh&ll}|exFO3JzMGan|+=jcn0r- z-p?*+hvV2Y>h<^Knu~aED_mYEJiS=BIbZ1WQN9l}%ay);q|o*^#U2Of{fcq#8DF1| z_4&r&se1qLTw(Q6Vfiv)&A53z;`1-bJM=t#qtM?2bwB-`2Ja(8FI2vqe)(Q^|0Jc4 zj~4pgQjLG&eUBb~sNs(ozVZEy$aWvTa=QJ__Ms|21&7Co4&b9xA^LPb;gR-?%;yrm z+dM(fr^gE&M|NDaqTChyI;XtDxyrwPgwXz|?d9?QN)JJwBRJ7t$0vKriyxr;b8vj1 z=);4BHT3MBqJ3V?`*~;kZ;YG!?R~eBdS+k)rr;XB>ll|k==)_pU(h~E^*fH;@SgW4 z8|K-5NR1!d)322Nob``%pNDMkrSj)@5c(dO?^m0i-&W64#$VRm(4b4}stmxcC2_cs-Nus;4B(fKWeZcjtIR@l>;=NZ^jPR#QRKQn?}V-M!n zRk`!)36Ibvey{gM$19WXD#Fz-2$$H^J^d)KQ|XoT-21S5>}mNUN)N%2@vnYH=`+gT zg5I}nnYa0`P%ieZ$DR*2R(i^~^>-89p^xJG@EkdtqkjVC$(X{Qj_(f88~mX?IP%`y z^}!D-p11fj%13h=~y*bga~Z~MK6x$CQ`$LFzV`=4^ww&v zcE;xjeZSBAZN400`a`*M>P^56>09_^jl7S{_vuIVe)@yL1iE5ALNK|ao*&_ZJ$w;@ zE8ZW$OcIn=;SAb6Ybr>#}Rzt_5K=poFS(jdM3Jo z-d`}zUN<%9g97<)&>I={%XXr&-ng^MDefuUVK1vkk&fR|K325PEtJn7|8s?l7YHM8 zRg0cALZ1f-FA&{6TWG&Ge4gl$bbl8hf%f;wj?YrQ_9yp4m9T%Qu%%rQ{W^=!K2guT&+l`d{!XROTUEcUeDm8;F8;y%VWI=Z(f(`g_P>zl zV9)sZ9&L27o`-K1P8SMSFBkUUKtEQz@9)X^drUqz+|iExBlW)h%pH8-{YCqK-Upko zBPqB94~e$m(`~1 z80k;Wk?rqy;<$TXWPx&wQI1XLXG`%?lw+6j>u~=u^5ybK;$FbLMgD8p9T>yi-znwD zPdBIQ`Msk1Z=X-(b)4Pro4MaE{f_HbfqGWM-|w|2lv9&&V&r=CEL}HCI$keG(Qk&< z#`)WcO*W1FqZRdP%M~qMyv+?ta$iG|h>ZCmrjt0na~x zd;b_+FGf4@_joJD)dj4e9~Vi5ufuqP_=kv{xHvpmTs=Y@JW^~vN~|0p79T8n-0R+5 zcHy34=e~rypIC>3b=hV7n|sP`QttUX%3cM;=v_tYpB6eQ!t<(Q*Y;Dm0r}3yWY5WW zi2Dv4C-*Mp@A+t*=NiYo>G6*8PEnrM&!b3x=KTQW!*xB6yDRduc(~jP z8)6w&Y?J>kI&RK$@&3&z;rcv}6kP4E^cGQZ2m`ohVHtMt_xtYrLlv)y?)7_s;=XeC z`+yeyBkDm6{}AaFuv=lp3k1Z`ZF;|xgscC`p6(@o*NfJJWc&R@YaiJat{Wqt5jY}z znff)kkHWX8KdxsXu4A2^ryhn#H%UE;QNCH8SBK{{zrU<x@%@kiKk-X}&0*M}9t&C%&8>dSzBs<4mp;rAG|1FdV z{T);Kg$ez!b@l+=JwHP62giyY$5Qn7^XJRm>v@B-WqTjI_c@kdB6q)M_4i1ti{39eZE4oEZgt-3zy68UMUW1qV;u`bcR>Ry@l;_YHM$myZ3W@e@DJa zdJQpB$G%GRxkH6l%Z|Q6jB&qSZ}j&eKHoC>bcGAie|vwN_ume;ZLo$zUL_dbWn$+8F3JL@{@($S0LpL?n3eZ$eB zY|l^T)YH&ea$meatZ_Z>YigZ}e@={Y{qQNWy&ul&@G-)BeLeF$;^#%L;}*DHk^Aub zWbZeyp5Fc4HrMq$!|(Mc#4mDPucz11zh$m7<-S6vD<4hVt#|)7KYjdLgzv-o8H#V+ z93kAC^j9ty^oh^)EYlCUzwtR{?uTMeQ@UaLnI!e0LjCgh(|-TzeU+7@;>`~iGmHzP zBe1DwNp#ol_k9uh=N>FZ9!Pk`i~8}hhqTYgk+NG{ugkcWp}(zI4;@H2bjB3jGd)P| z5yrdDVX_CX^;p?{PwM{K`zg$@+Z*LH&Gk4JS>(qzvLeD+*FERR`|630t%&YRW z{}D_Qzx5A=&*C1rRrZj275ba(`d`EX{t@a~l;<8}-TSLwL%NrUQSuph3GvPrt@DN_$!=!E^6{eA>mujN4wGKx3fcZ& zgwNac_jKNWF?z4U`P_e>R~dPy-2LA|uQwN7D|hSiEam6#(iiBxB>F6xBm4t{B)7y?z@xMRwu2Vhp>*^}OD=d!3T!>3O2pf4z?~bfVI!oD5$e*2$Om zCCpvETrc!Ig$tb_*0>+)%HVC-1sGj_B%q@So`dmn<|XU3nRaJ$!|9q%Z)dp*W_#pi$)(4ld3UkH0d z{~u$VXwh%Q>G%A7NhYB5^YquDJIn4f4lnK_+v|s^!(fPRoz365=c0=5 zbxW^LcF|P@${~3#!eLh!pE@gzTV8MKGCpR|OHszn8slI9J4U=DcAoJs0K1I41HuIu z@4WBB@Bgib<{{Pc+;Q4HX@^pLhexL~DI;0*n_aJ@hX$U59?{eJ{@%)}6zOUlVA4>dvM9)v=*x`ra zPP>}JzWW91DHx}o#c7Y>$0&aGP_a&ZOJWzWhp>6D!g)Wp_wo9@fcGKf=!bUKbM7a) zpW^#_-2wUE-7mObi78wNdqn>bbN@s=$kR`j??8Ck`|8g;XP$TAPqG(0_X^?4=;0LM z!+%t`KJk*oE8;(AUY7c;!eyy{O*r_q++8o5#OqUE!*^6ZbM#LI*rFaLxgXC5liX(q zHmNUeZ(djMI=0`tH0d|zFhaTceT|=6_&}Zq^`gu3jiQe{zLqagxcMof--{KWBirj| zA#}(5S#l4ZCf3dq^XH0Pbi;sg-8$6kgZ?hf@A*5gRy?0;;qS@=FOvJBAWq<-B)jqk zaqxDr`xY_qCUK6x&pTdRC3l~jp1oLh=0Y(=zMH4Z9&mr&cjWyG{vI}SqQY69b_dOQStx3ZBz3=b@#g7~>#?zwTfBAc>Ci(C_s2KUl5P$eg@v#W5xqCnHz|V(zW&K=uzQTEZI)8?2@5gXEjh-X-DDA-K ziF%*Dzb78#6>d(xy#L7azh+AQt)s-+k)q#!`F&Ru_X%9_9K+D-eBOu9I#lW8>2Li0 z(CbC@{pD|6G^L*8_LckY_rSPksaM54^0&@i#AJKjC_sBkGCs%fuQQHk84taF z=k?t3eUwh&u40z_E?D1*u}%~X$iGZJw^}Yc4EZ_I(~|tb$!jFTk5yyc{RVwbNikczgdio#LoA{>5s)C&$G*OiBrEO zw3jBF;y%RgQXWzAmqX8FU^1lppHf~$!WXbx(Cg4K((yd3#dEce_Pis`b8X#M>9_7D z&YADV7>}&0SM(=w+EQ> zXT90`!o3gN^YJ+OE0Dh=@h9kQhtJ^d_Yq<0Qw7xW7q z_rLTPee4naafEOVZ~dL6UyRZIGnAL-`F@X9qh773Pu}0={b}=q^nCqaMxSe%f0o>% zPZj;WXcrw5I7;sIBgE9vqWxRP%J%x5&l~r7Kz<*cJ44~DkHasOT|f_dojZB9+`W!B zK@UXC^NCj#JLqTscVd8U_4kU?s}yd21@yY}1+ueein-H7>yG?!xKl2EZyh*6?mqX? z-(~rGFQ5M$zeM4D&Y;)3^OwmzemVZzVuyTXq5s=4w_YZ{K6fdHo~)ynC(L_BJkJSw zG0F4t`>h4_pie(AL{Iy>e9zZC4~y)t{CS^cl={`DpY(pY75!fa{~_`6hb#UhEzYSg z^{2_MpD4!3e=aNAx;f5$jHrk6!{i?!-+tdxL;u&fp7ou-4=O)J@pgX?hh3zeyIsuD z=c^Ye{Ob8!k8+NaU+<6czK;swQ-lvtUp)`?{%N!9`bIprm$>U=Uf1>c4u#WYcL`r3 z{Q>LWW$MF_{Pi>Bn{rD&Nw)U~`a6~t?%qc+KT_dVaPmainM1`gy3hMXy9daPEY&}@4!6f5b7QI=d-x^S#%mq3jhK`srE-V=T17B0W-v0*uJvw1UKOUlg&UpPA zJy}Gz)#-;@j5~eSVFGZ$^-|F9G2^Vy40unOA-r{k*IT{c#N+Fba*8r8x*Zj0FEQ@F zMZUZqxcfaQ`44kH3+}JXI^qDX81K61r|h>VA9PhK)@|mg`0+pAfpgPCg^Bj(d@LMvQm`^ri2!j=$5HQXeurx7r@Mer8Xx0wd_{ z8Vup?d0v)$*GR|vQ(N3ei*#$e7g+pE<&dNPkG>>3^i?tYb+JY}i4(5;ZMlzlu1%if zfOSUCQ{5g$luwazb~~uy?)DHNUq$lo`Nov?n?+B@splDN?}PTf4u7APXI>E|Tmg3A z5dSXecbLa?=r^Wem46*wou|La-Cyo;+^6VUuLp(qm4Arw%N#vK?qT{dpa0|UGQA(j z`)9l!-?_Kq`TI-Hi)&oBL%$j0dIQ`?_f@<;Ec?DF-~X+*1L|ds`dX%4<>?PSFK&9? zjDHcm+hIO68mWF1VcGSA`WD8nj}>n9Lor6b&?jC2=5f!G{?PMq+Og}`f_`mIJ&L2N zlhnHo{aulGE!uMjyF&f-dor&tOi9=K(K_@Ksg?3=R+tw~XrE!mr5N=nK>aB{LeC|Z z6#d@a`Z(}pxlb84lL^@a#?S0yWc$3E!sBH7JE0=$blw-+K@WvdN-vW`TInFr&Xa`1KdZEdf0ue@)dfNn1TL&J%+uC$=~PP_O-1`Tn+-IJ4-F>{SQzU%L@o;y$FH>)F^z${w zlgxt@-{VIdeOREssoh`x1&<@tpAq$EM16^&AG+vU>&Gbi#Qk8M{xr0ppNDny+XP)Z z$GuPgY2E4mbH1j0b?{H3&qjg<5 z40Ofh^ zVVusO2co1qv0gww)EP%>*qx6neh!W(ryTbe=Kh9o^;v~qP_EO@%g&=ui|En$H|3sT zUQ#6Ap&!Y;LOse*4xX0{sc&7L{{qIT7qO+{XQ`ic>Q(m6s!w(16LIp9`l7<8zAWZ$ z6sMmPldun4JjW*Svy|(UeD-;MIm$1G`-u1VVdgDU+F6-)H>ACJf9xEcvf@4}w1YDD z5k{vhg1WCP`q$%1*z*SZ1;6+4ex%7A6>mbg5a~@w&wAYZuHFB5KhNCrcK1uzUdIm8 zuX+3$+?Vpdm+1YwQSN(0xfHqYDf#n#*U8s{bz|={$dPV=>w8~No$~Pabp!gn70)F^ zdkfPJ7Sz8i^JCAKBDB-gO{x!N=G9&7I(CJ6Jls*ZI`gd%>4s^almBU#S=^_z(=PFg z^b--%$&rsa>3Ls==dD@vaT7h9q@GvM-F4DW`ugPC`H#>)j%a^j`iTPljpyM>$}K`a zk)a-ssK=p|?%(y(?}@x`EA{|Af4?_~Jy>>y`r`G*)T8B|M_;6%_hAjDV^Ge zILE*IaM@n>^Z!H#xUUG`A-umQ@OcJ4H^A@dd~TBUcYypYj?i@i$BO>$a&#m%^|OeM z_Bwh8on7I%d0&ao=daLS=FsPCg_u8jUYjQ$8QP`i5dq&9_nUj9^5gxv74AQSyZ05W zm}hj+*VD%+-iUJc_d5PAYQX#|1CxvcKKCeccf}tDMelE%GahDdS3l)-tQ!4Ug>ibp zxSeEt@cZT|<9(U_GC=>DC0vJocVwN*ddGnUl{h^n1%F{k!#M4&4&|jMB-FZnus75w7zwae!Sw-?rW@_x#mjttzfA6u6;?2enD(<{S?n>@qW1vDYqK#1M=;BjlQpN1=>pvz2SD!q@H`- zFwcAY!P&ZIqi9fu1uj*R@l?ODSrG`u8(dH5O0E>niD=x`1#)zez6qG z=pFB)uF$`P?xcRl`>nk{rb&O4-%I}8d(cnOe|dlYg!pCWoBN&oQrGQJ-&53Y&%3+i zyTX&v)oUH=e+wn1>#i*?|nJ}o==7AwrGDX>QjOKX+{0$z>4c1^=-ub z$?xy7=-d?Zufb<^pA&5B@jBPZ)Bfi$Pq+^4dPsj-z(0c>qWyQNcYXA(b^U^TbO<*k zpK~}N|6%Sk<@?0FMf~EomH*K#qIGzL=N9{!+^4@4W7IRxXBYpLdy4wx`O=Dd6QaI! z(9c8GlUnF&e_v5VS0|&YXLa=dFAF z+54ai=%&aqitl~9N%ZRi-96lt|LQc+=TC%QNWABZyVvbcmR*3^=g9WH2LI2Zi@s_y zU-7;h?{D>YT>kFY=Q|eYKL*r`soSmlA^N2b{Z*I#ut|IOd+QkeN)lFR?-SDLkbeGd z%D>-NhwjDwu&y$p9{RkdDD^B$y<9y|;r-oh zg^RI1nt|ST>hEI0#P9B>@U;U(zlRSqA6cO@eZEkL`q`zPFA|EkK$mtrU!dO4pDh0( z^*(c?>^S=>{Qk%P!*#l`xWaiKp1(Wse+;a1>%3R+e@If?fA^t^KR|C+(Az$LwLm%h z`?V0|S7H5R!a9=on}r!~JkJ_YuNJqdAM*H-VLXU4-uio{1>1i`VO{`zD`Iyy-RK1ich^qwLY^MBAyi$nK!)Cg_vMwQ^se zPmle}DZ0o@zEQg-S!;_6l6=%wPY0ADChw!{GL71()^+~Y417Z+e(C`K<9 zv#*D57ISYEE8LHDYZo0^C*PgR6mCU+Lxf*kFZT)KoY$MW=-0`6ld;*|1QP)=d;=jWdy z-3;}jd9~s#s1IfIcZKrIQN9z$BOklVk$R9LpIOQ?hQ8?jQt21}CVJoKWJh-Mqhg-t z)F=Hc^QBc;{$1)*9Of&;qh5}BvZLsZsCCb0Z)zC}X?-8GN>U}r$ z*0_(%uVlx6BZhx1`aMMC=dxFD@C(@~Xxsa=S9AG?{v!JO);{A<7(MQF;mN-gF1Dur zuEsi1f%jeo)_W>{Cp~o4YA8ES`Sj7B{Tt<;VcueWIiMZ5-zj`o;YRd7VfwKY&#^%G z5!acF6+ZGi(d+*!%CYl9xp(N-VqcaWq8-jZF1w3e>C0}>U;6ra;!nRJ{~Gr-gF|0LnLZukb- zp6|s!CwoD--S5o^-{tvuzL4bpij;fcX2lOtkG&5nOFi|x(ECD?3x)SNd|q$N+(q?i zioThko4r5X`>OqYgx@RVSZ_+*U-8R~$KIbmVI20kgnibpQn(kO*R`^&gPGRZadd~z ziAWtve$gdS*2@a$4WE-=&ncYGJ1d_fyK}Y}z>YxgCvKi9fA8b)`DbzTdG2ZQ&m1QX zpw}I}PrONfCaf0@(9@&i70>&U=O@bce$LB-(J3r4;a+H(5_nV{V z%ILia&nbs)ZlZJiU6uC*`Tfb9er`oS=k=roc8>NvfVG+GSL;t=iuzVZH~IUU8oD{d zeBb9ObjZ(u`~~i<`w!et3}ctk+ePC0`)=<$>7WyRPF98b9O1eH>UorPQSY;hp#!`0 zs{!oHUb=qlK4OvdJ>T>`IqzHZI{AqDU7_Cl93!uT`&Jno7=#jEl$B3Ct>@&se*<$#t|7&MnCcAc}m_zSnu9iLFzEkL` z*2QvUN9#pG+n=$pjQTgAZJ#PU_*;N@a+OU$DCbL6iMqp(Q0MPA`E&l7Xp-zY14 zLHP}imtCa%Vw7JB|7J%1_2a}OOvPkRAMt+~f0XRnpH?FbvilOu`|TM zx#ILfadD9tp&o^C51k|T756!%T;ea5dz5$?>XY9C%y~X7!iBm2;Ug8Vwk{6tEyng1 za|eof?k|!c9QAQ}x$IR-oYO8wJl{U`qx@dteU$L%ChwoG{YdT=bcc0b6!*zZ@-IX0 zZyA1H?tNGr%Z^P%@8fCGKY0I+-!m1^w_*B`I1Ee`zxI1^@kepaxHQ5&Li`x{vOW%R zf5lHIUhz87dT@dM3%BJS`=A)b?qjd6m3si&?@gv3ARgsje4p$U?lt;1&-0Vtk$-ka zY<^x0p*Nc!kv;gZnEAMv`;6#*bAa8Xe~fY;`D+wz$n^u{+wYrVxG!+e`+lh}fj29D zochvl%C3;E>Gw7{=83-V7UdSAe))Y-m-3%{Na+ozhZU}yr2Go7_I`zHl3t$soO&GK z{=<~taG>ycSYUq98Ops({qX+kI`ziyQKJ7=IImBK{v|uY{LJU^_#B!R>rLJV;&FL` zE@`1J7L3P9^z_v0eT>WAH_&8#vBUV^f(vwl&qZ&cA677i&K@2jUEzJ##mAyE&>n^Vf+blFIwNTKIr^q z$k!^VZ~@jEeXfDe2lGBu|7XbG$qjs;tYi9|_91%N`Yb|uhtQp?J$1ba&o{8r^Y%Wq z*q>#Oel6CiKTZ0<&PeWo?}-EK?hkRN-y0II_)EEGNiRzO<^6C?^l2Y`I)`!S`C1CS z>~jZ-=xgr_^S;2$U3Gso;!muTski5N!+aK1+WRK7b4G4?lcaI3hYoecgX z+j_gnb^U#P5#67s9TaE>L)Ov5tarBv*Q6c!yZk8mpZI=we*PY(yoc_0z`P@j?fqJF z&yz^U`akP=FZH5>?S0B|^5yxK*X2XZ8@yky;QF*wIfVZz7Uqk;)QMZGD0SN?hW zsltu2V?8naS#flOSfT&R(w{cb%NfRvBK>FR9SUD~n^>ct_WSEF{p$$b*Fir_FH-o) z1!DIsF}x|}Gh!U(Pn12%iGx!JcY+u=0{?@=@;+j0U7W*CRCeUiqIF#U0NG9a^BaVF zxVXZO9wNKT^;%Dr9XeLDo-Ai&_sMsX`|9N7K1G)mULrelo>(i0vGc_w{w;K1^i;Xm zpDix9PU<_)&6i z#>DJiV)?FOjrAS5mV;(Sf4z``A6_xBJ-q#q)F(}DO_r&y9u)itp{1pCW7q^?_GtPbGAE)c( z&lKa-|IX`V7cUbl%%56U$WGCox*w9A?c=^9_P;IqJ$ZA8`!~froD#nBRk;t*D~m76 z&R`GmPmxZI^lR8<(rbNJ@x1RgkAC(!edQm@zkIV;A->m%qu0xQ(h;XEaYR27s>=?) zL9EvZ_Zl(zYB5(9L$46)FNZG`D=_vl*#p=lT)ZUr9CiTz4DQoQd$xn*(oBxxa3H@OfR>)U~c%H|#&Q^NUEz#=@MZzb^ccd!+ zB1}>5ykE@o@DTcV3bQ3}*#*0!FBXi?);BeDjn5VGcp788_kUk~o=}GI zy25yEec}Ii`a9Do>tf!gUt|3+$M_vZk9hqr#rtKS8=GO>&g*~Km~=)Qy}3a5c321A zeLh`Q;mWN0`h1NX;d~B<|8wPa;2e55N%~>*Z4G_z^Gm(n?*F@beLaKD_WyVXtUm@k zPayv-^l_2-fxqAE^WJ^95BJIZrNeUw+(GU>uWNXlp0EFhQ2&$c%5TN+&&1U&Vu=1L z`!(59`nv%AXcPMV&w}v&emD7j#S4r@pNmueo$UIpVwd_h;C)C4-RF7~KnMF=BH}W^R2hgW2+ylh(`Bl5;y_92_d6K_3s!$%@kL+{6T6b6d z@Oc+=<`;RwCz%%yXovm|-0Sv5?kh!k`2DN*UktvX{4c&B&Oa;GJ}s6%DrT+~y&h6; z%l5wDF#Z$9x#augAA6TrroZemzKpJtdl7ov$FN?%l-bUBpRHjD*F)-eMB=;gs}>`^vw*kC@s|T#&!` z{<59FA$IK`xt9+X>v6Glm{@z97(QIg9wBy*7Kcv}i`a4Oz%g>~V^@xpok@tRM~ZXu zQ6~R!?q^7O4k)MAeH1pd~}X)*m-aq|W-@iB4M z5KEVdU)wIfF9Uq%Dj zlh26}`We4}id`r7)O*Fb^GE*>yG-t}SBW|9zjMCq&N*WK3~_WS_9hxAXaC&&)b{%Vhx-K5=(!m{)C69=@9 z5&c*ldfpy?1o2~phXwkPAsjtg{uA1J_GsCGr;F1~{9h<8UMv>R6SHTDbILVKeXPA& z?zxM^A?06#Bc4mSg#QJEFNhP;ZxJr^O2Uy|=R(2}FH5?4+Cdk)OuRnz*Y!Sro#JP1 z5c6LbN8c0u-EiyYvWqj(=V@oq)7B+P#@iU{QE}G8{C#X5d%=36*A0E{zxPpA7^l52 zq>Rq?ca9m}AN#zRq1U%rFZ2G+Dd95cNi(vqbb|kznna)W(ZBwlaq={U^Y?eLr^@#K ztaB;!2J6jX){%XlatPh*^CFYzU+?SPeeMnU>F=-f{J+=8ezJW|oc{;kg0DZmAk+9$^BNgzaO6dQFfSe&%iS2`TO_$<9%ayiU-4huq6=7b9;GqgRWgH;T>I ziHpm{IQ?&k{y0iM>UHK0cJmB{4?kT@GJY)>hoXndeRcm`T zUF9DmJ;$Gim4A3W`7b{!@ zyP20AAidl(WfzYn+%aMoHlITHqr}Y7;)wiqo-aFpfmqlUy&t{#CfTjGiX-}mF#Sgk zJ64x}^GY#(iP%RM6-u%r+)s%6sGlPD%yYy#_tVM9E~10Y2zG`0^8TyA6BNGnII&58 zQj5!u91I^R7Gh!s4jv{u_F&QNF-NQ7Dm({`BllTka}?(U)ZQLeN5y7!fPmiAuUU-tYEv2&zYrXB=fANL{UWB=Oe3Lm&o zj9(x|sek#?WJjpabLw%JdK%+-rKpFkvlPBxARg&=pCvoP^GY2qyYLt>$^4=9aM`(o z#6JGb$IH%gKP|4;JzMVimxzI~n5>E`>Sg~r+0ieF`I|-Suh<`C`+c|9-F&Wpm+?5_ z^-=Urg!RTe<8zkvM!yeFVs}}`_Bjqw)};r~|KW-AzI=d=_IG4iboUB98fKrvbVIt; z-(yW!PtLNQ?Db-QznDcQhgcW(|J8gBuJ@~&Npx`xeed&e{65|5^mXpj{}WsJy*~4c zF!PEO<&dTPe9lqi?<)WDA4Q*&>T{f0JRhG&G@mM5^e6D!V(WUbNxzh$9<=Ds7O#?j z2liq2V!4+IU!xx@zFY2*4-)UAV!S7gz9KHDPk~>`j{HST-7Z=OTTlC(kSw~mg%0+< zk1+MBi|!6!7tn)A>YMi^)rjwNNL;R6u0LHVA3lf7|E=g#?yJAbKSRFDeVjJ$nP; z(Zju0$!=KxTJK&U_w?D~#`DGYbHyzfJX!YoiQ+6Pj!zPUIk9)D*f>)xk#0JVKj|c% zhy7A<{oREB&Mt1R&^f6Gsh$lVD`t-uGdXebJh4x^h@(&YjQjIrYJ*R(E+lLE*E9 ziLnF4W>_o)c5$slKj8K>{+XVy--FD4AbaOq;`*n>1oNi$HL|PpLuuMi>C19Y4~fTn zllD(!kLeed^cy|$vBi6tb@Gw;DdFiqX0+=~!a3gw&2zU?chvoL(e2^8%AVXu%sf~u zL`A)=?)% zf0TOL-CuSnB1WjMQJ$acZ4~zo^)&Bz2P@v)ajAK^?7~%I|E*&28Zr85arJevJi#3uQei!?i(ZVOA5-Yb1v;~jKFXq(Qs~i+ z*K5(QE7pHA50!5A|3Lj8`tGCTK8TAs^l~2eJnPp!U(NJ?C29{-JfGX(^AP+Umj6fU zd}Ywbb99~8RsH|lB>K?bdsbK{ZQibO%Kb^4{sewktWciaFUua?DEb`J$d_>ctmyNp z{JnYh6>|4HJ%(QK`dyiRxl zRlZ_8kJL)G_erJxBYT2>|2Ek}bZZx#oJY@A7V@`#_J107|M!$|sedS(_iI;+0kX`P_ zxMzsoZ(O*;E_*HU35_R>SBlFDnnxtp-&T2*+H28rR<%F zxXHc&?K&lor}cY%f!+vurC(dSBRVF z;LW$lUcxjwxq*MMC2Yu|3>a9J4O5J?XUfhzUMy-oVlDl3T_;U`669k?^Z#vs zZ%}!l;svOm3-s;uPP^RKyiQQk{9(JMdbHi#SMlcLD?mG{p?CANmzC>3dfDHv^ttXF z7HAiNsM1Z*t`^J#a&fsQNjH3??AnvW5c7ip;cIY3JIx%Ta1-1sjDLCDleF{cF$!0H zwzxP;>|7#7-Y-tSiu>&LdW}ivJmqC>$f4guzb7jFVDJQ3*F-P z`aVC?=g%gYcldh?pa0*wPU#HZC(avU_)Vg}rwUypJ9Dn+{a*FcWRFe~SI3D{>R*xP zUpP$eP5SA6Qg(`VlYP4E{3&AcOfm3c(eKr2Jnv{t?!~u>%@2w`SE)6W9p}DNGuhUm z@!Mouzt%htL-&T+k7Rnib%Gx5{73Qo*hRuucs^m$@p|m)-wNM^VXp7*bNzpW8t%1~ z!u!9aU2LZlCESYV9)krKg5iHCoe8?v`#-$z%H?5Q?ei|nKUTcZcSZjXqjR(D)mZd7 zunym)yrVymzrP2HT_ZdCMzMc|IK3Em^lKPPg% zwXNG_H~uRI|0AZ+3*L|5^`PC~f!(BV8#jxkZ;LzR%j4pV`x}2x{?%_0j`6&4y=?ER z-C}&N!VSj%*=H24NB9Kef9V5qFTIO&85h%a?5o7|<)YVZOXtfDo-Q^v#dXT9gwEW8 zy_4lXqda>T$lf5GMxOX5iS1{Ky%WSVEImv17CLviCA;ww+>7EEUAm5bogGKGr{RCR zSjBE1i+zkZd#c!gW9mf^ZXJz(N-RN#Up|9$Sieq`v0LzGySN>=kLq{wG2-+HaY%jb zBxRQqqW75>u^05Wbr^wt_s5Li-UlClw9@GwBt~Om1bQDq4IL1G9ax6N0~K#hJIlk} z?e3xS52J6Ugb#2({iEbxmR?`m`7Pywu3R#I+C(p=zc2qW>!gYQX$R>W@&Bs0VWR(* z)c?(o$$yJ_-*|`Y^|y%2H;Cy=#m3pVQy?d(`!>h`}4g_V>iC zKZ(76i_1GGUN9_fJyvWmzucrB+*J8)Pw%Pcm_^5VpUzazeXTT6`~>}G<1f4HZNI0> z-Emj^wKVgA^$OR0k68V=!snSMg_x&>@2u-q0%8}Iarbv7MaF{w@jGh@pY(hW{Trq| z%vB$^!x4oG-Cy*6@fhtXhW<@akGoG%xJp{g9W6#_rz6tO!oXwY@AaLz^)&6a{&4xb zT@@Jz{ryXBU-_qKUjzKRZl~mPb-2Q{QeyL2qR&6|_o<`nB9++j;^Dl`{?K#`$;P3 zeeV;mqtCMc(tY`VwZq@bj{Zhm{9GLTNc4ZZ{GWnc4|nuusv*1oIRs!2xpz+% z!_Lq7vdgc){c>0rG^be=2)06$3LdK8Jr6eLi*z z{Tf2=hW;)8>{9f4ZIN(gm_+X;Z&kP`?Bbs1xi?{fcp1Va|Dt&RyI-gOTe%8Dt-VtJxib_K*NTm|iDPsK{rFmSvCDls5LS9I>YH^z_};tR*LJ+F z!g#iEIO)Ptn)K0Y!Bb^dUnOoZp8Gqp#!YhH9Em$WBHUE$p$pc3DZ4!u$LN6u;k~}R zbBp{p2V(FO;#OO1bi`^`?4b*Gu9qET9NHk>3|cRz-%q$V5&vRwSro^N$0hE2o$v4+yHplqda(YpvKfrc>9L7!^Ab<4gc7bs= zOFBvN(>VmQ{U~wg5n`44l%}5UybO2R?H28D<5IbgA1iL$ru$5f#VvI1PDl3m^KVWW#ZP`#o6n`aZPN$5C6WH;CUr@o~5hh?)gcY z`9$yxxi_xG|5u{>*DC$q2JJi@l>hingb#@u_r(4Fa6?ScAMDWYjNKnp<)8kNxO;u& zkFvLZA#TXtUfe_NBF8wmLjQ!(LwVX$U~h#>(vJN7bqn_n{ff{1@xG}Qy36lt2h3YD z$0)tg(?owS5l3frigFL5qf+Q2e}^?eH~T!0BxaZ%UD=Pv)W&N{lk=gR*__p|$bKl*JlRCeq8Drp`=Pk}3r`S3PZj6KL-O09UQAAtd+JQl=jL{} z&(wu-pE8dKTrN9~9xT3Hw$ID-f7n(%xfj1A`kbZ7NVeB&TfZRORP_I(hJTRl{Sd>y z5$~^Jgy(IYTt~+znMZYht#EPDpP>J}pJ()A`PW%59^E86hHh@UexR2NpThrR;T zPh5UW?4gf)KagEz9VYl2*}<9U{fEnM%l3OypX0EDUMN`~cN8wcb$2MAoonP?{jfNO zY23ZOTxI^zX8hT?QsFntV*6ZimKRH`JIyv_Z!u1#(XolA$UT9cwY`aMUT3^XKT+Wt z*d=sGkaBPAC;y$OxIB>XJdYC3X$PiZ1OMPb3SWJ+IDU*cTNk$;jLmi02gnY>t^H*u z7$=u;*~_%pJ5$`cOsu+Iep+_ptK#M@;%q9G{wlWrDOPXW#qG?R>i=X9(dX;s?k>9s zeSV9%!hLlwg=?LBLOj=F+ClaCa^Iq!G{{Gfe68P^cux_7#M@&2xx@9h zzNvgBE)>@v1^**`TKc(|xCy=bHF5T7arri}^dfQNc=!}?CoA?&7ptd=v*X0X6UD~S z_@5%S&&56;7R2<~5clOJvfJ+w6W_ppiM^lhXPFXbFBCWHV(CV4{YUuU0>28GH&k&S z|4i;n*2#mPlAU;~*nXwBb1LDUC^jA`ZeTB8fIszY=VIB3a|oXntNUXI;GcD0>wgj( zD{j(+jLG=dJ6ZR8r2hcm7mqrexT{Ew(F;12bkb8*v zaFKbgzdJ~wkN9q9yG45)qSHeMD}L<-V&w`k|0XfY_#HSK`&6-Zu2{cXj19!lpTw~D z$+9oD&-?i~@B97VVV}>NWB*5&{T|lUaqDN+rz>#6J`n#;x`loYpr2E$Kl{7L5a$AW zze%5cy7B*#-@l7VbX3@SY$A7`Qy=(_?9|u9XkU!69y@=B?8s|zM>lrSJ*_RdSDq(M zj~DBQi*ue|jQ*K@pW9Q73v2$)sqtIYmjv^`>aS(*{9bJTQQVq~LENiw{ZDdlFb=IR zWcQZ4xShO{@{>h}cf#b8d70;FEp-0w_a4;8F7-6>NW~jHM(px_C1Smomb?Fd;qQK1 z&y{-yUG8%-2N%gbUJ=W$69bg{;DfR!U2*z3G4vJD=Ol;G;Q{7H8J=_N#|qcMJ&aw0 zJ|DHud@A=Xh4=qT{2x{S54DDlj(%R@`kxjv=xCoKH)zT|Nqh2t=?WLiz5Eif@_aG& zbTPvGdip5Y$p?#FjmK;LZf^EHp7+;8ufs0CBs+n7;wO6k^8nZ3`PTQ7ol*a>w*Fqy zW4);Q5Bf*?w=MM7>`4mOJ4~FR$E*W;XUKj1Vln+1v4lOY$_~C;Y=0b^^KId$sB75UP++QNLUoMVe1OH9z(xviWzE(_M zCax21$M^eu{7)CXzSFk8hMV}8&`pVFDSX@d^U1P%3DM=AM%V73UrOlaokJBa{Wx*v z^}YRMuM=+!8xN6t@Ihh^-Q3-oVi5O0TY zw}`v3l9l5XVs9)W#aNXwKO0R#AnA=C`df!p{6y48qj$U9Lvv-E< zjRR;`tY23Dg09+I?m_hN_&Dqbi0e0_Q?5myG{x$>#1gu(ca`h}EWKU!)&~jqVTj$k zPImgM;&>)*+)LM;9WItw$L+ma_VSBja3D55A#Q$HT>plc4yio64!QFT%IClG-#JTM z-l*#~QetmUap#|fUF*E#4G(;_VO2E`)A_T55yqp zm2Q?@`mMOUU7X!n`5FIL_U7Nk;6LD9S%>z2;wD}P=X=OF-^I1i(e-~QpL29{`B$>L=&9WIWXE>ICi-l0 zo$SRsMW2&9c(v@zg`&^BY@I4Qj}96gF5BPJ4$!NdFSWMG_|f=2&mUcoV7y6xSML4} zYGW*WiF@$NvbR1ZdL3=^8ri+~i<>R6(I(s{#nO#p&)4~dY}doG#*yt9eQ^K5*cuJ^IHTzoEP{t1eog3Tw%E~MbGV)+CyPW|=yn1h$f-T#4W zT_wBrR^q)+%y)4AxR`~hkIIg~0y?;WJ#Q19bSCIx|Bs~dcKQ213N7^VfPBm^lmF8G*VTqpfX`ER1@d+6cu zMRKA$0)qhOaF}Le5<&zkNmf|@A2!n&Zos5^S9uy zWC!Wb+8W2!8vowqzTHIkcK1|$jG|*Vq?gw={y=*4KRxQT>#Oy3@9zrd^A7yolfMgX z4CL?czINUrd+YVY<2i3!BHPb@{07;Hw~F3ZI)0|?>Vx22MX&d7QZL%9!*2YQ@?$+Q z@f+!dMqOOr61R>Ld-oN`f0q8LPT^c^{2pEQ4Y7B%*nYma{$$)A4)+p+zdlF%3T_eG zOL6N2`8Rsv&K~4rf6=-qK|VLoUCXn%ub+xNbnn(k_RgEcQc>Kz0{4%I=}(K}*NN?< zI2-A@%QGnlbn5s6%HP)6V(&Qe{RDCI5OMhkaqCfH^$2l%qF8!?xN*7|JWbqj`EALr zUV#6r#mze5J}E9oxbs|g(90X>^BLv1!}DAop!=z!GiOhc-Pq(l&k_^oU_TGCPCh$U zcJCx{opto!t7QjS-(G(e;mWvgi;0WH(#yroGa%{r9xuCkkeDF98~e!)?kg_W#UAs5 z8TB+cQF)YpB=#tmH07`vR=l12iR%x5)U)xEWN$uS?7c=TeL}3Vp1ow=)~KnzB&csy z+To1;YnE2KEIo&IdaAgS|G(Veea<@VcI(;l-();!d~uh(9a&R9)nYy#mL6Z5{Yc@r zSQi-gN&ib?!ZzzRTl6Pm`XQft#J7!TkE7?AmIl}s~ z*O{m6r(UpMB!(VO;qL#Y`@H8S;ZmF{l4G5Gdb_S;{oMVN?CGz?0_&4?^s~=h_J8Ed zA67V@<6OH!_NpYd&J!!lKPKp)xb+KTjc-}9!@fG=dKds-hZvI^E9@o+u z|8}2$8KS-wnZNn_;?%ynZ-1v-+>qUZG3J4_nA}s368q5K5%|2x4&lB26F6Amr-zAk z_9cXllU+O+f98d?7t3ycfO|hv&#YcdqDj z?ae&?ixy?9Ymux9;M$&jCpC9;>c? zVXcIo@ONg`uhpUAkI^Z?&&f_7C$|5ser)rO*iRO>UMiN*r|oCS-m$JGzSpHo=-J)t zvnLWCz3P1so9D-f)z7o;8dJd4>!6~6ZgF~K}@2mQW5 z{(7Wi9USC7H@6k9dNHKEjZ3m;uNH%}yVBca?Bwf70>6&dH=`; zIwoZr*zXb3a7OtD zUn%#Uj97huSYls8;>Rk7^)HCks_6CC9oC6^1C8_Rea8DQh(X5x*%h)APZyWyi5}~n z!H=NFUM0>>5!cgVJ0X_V;V-0rgDr9A)#&0&aeuEk`>Z(rGW@1k{iA4|x$$zP+qg!o zeoEZ>nwSnM-@VJk(z?o_bQ$Hre&elo$R593Y@aMv4;9xJiof$#as3J6=6`gZ+4seb z4~nIn7`%hHb%XM~^8s<=GvfM4-29ce^*b^6H*vg&;`b=O&3&;SBrf+B*AEnf%tNZ^ z>*_1yo_?d4ct8BOSY`fE?aQ8hPF&tdIL~)(k=_0k?zdv!LFKTdoM-6M9o$RIBNBH~ zxW>K2-b2JTI<$@6?d^j<>%WZyWhY|d4BPQHJa1#&*w<+M54;(5c;F5F zt!*(b&;F%!-7hZD)r}9yeWSy5dt#e@EJ**jLBHwqUklQS+adH(l6Bh2+oTsl-w`MO z61(hcF0jrVM>jXU-C9s9kQm zygMqFwT++2f46=+QTA3%4E_KT&g+ijhsr(uNA*)Xca`mPeH)j{Zd31Or^y~4B`%*N zHqwO4;GPnz=nDp|&uv#_Z@ooazEj+|M(llDY%YD5mws9X{EqjTsOEh{3LyZi!WYA9bnhSw&o4EjF$bOSgzY_BXauvNxX~?i?g; zp`&^s+3WWfgX~9G9!B^>#Pr@`;=daIHvb_8_mcaV{g+$E%bsnD>nDos6R=Mcw=NM& z>ZLef>Mq z2jdoc;k9C~C~mO+x$#KZ={?2eRQfJ45PRZwu!+p-) zfK9mZM`f>nO-z4FTvG0hFUl@`SM+t;=9I)36sq{nkBF%R3oZZjXOa$oJwD176mVvv0= zOV*>ukEUK6M}6VF$Icb9H``)qN1RP@XI_?|ey;yc?g{*7^fT)ZR(;%}ey(R}_w+Zt zXUX2VT=e$=iGups9{qEoBfHJ`)B6kYc(1ZCkUitQOqFqIdAj0NSs!VfCA-0U(T!Kj z_IWn`?!AZZYJ5)qKL09lGxqOyaogvjbPtd|C}tr0BBJk*-TI8!9EzhKiqoHoMfPJv zr`W%Q_^*B}d-4OZbCc+Ot&tmKw>pG-7xtUP)n#JpBC*T*VK^syK)zGVQ+)nlVISh% zQ!Hvf#9Di`S<*3@ld5Zd5pMt zyy*W5WLd8t>Am;b7(MIrFiKxkzWqJ?4(oJVFPD3j=kEU&`@Kf`Px9aTsJQbSvGgc$ z<5ZDz;C7e8g#7k>p9A8tzPdv{P-ULxb6jVv%LZSl@V?#_y4c@=uRm4(!NbM%gW+Su z&BI_)^#1GWk+K`;^C0PrkCXcj*Qq{N_PYDUi)3$JDkfm#RkF?WmBf3GxOKfa{*t%} z6F0~XenxD6L9{MTP|y6o7VnewcaDkk6~1?Garq(j$7%Za9^c=T_LqC_SaI`0F~~Y; zqb$4nTyf(l{CQuVK3ewp8Mrf^Y&;#Cb*aXk8Lt@c(tp?ZmuCI6@g>H^j##=@Y@>^I z7_XO%-;J-xe}{NM+&9sor5}(E{D17d3A`WE{r^8%EJJXSVyrJpRA`ND^6Idf(^bI$9$=gj%|=6^{3fHf+go-#Ladh;1N5E$yvmCn5sQ077hUI_LwY1O8;Ip6 z(!Dvl*#E8U_+GKTU2J|VRzD;idN-5r5i$6O=&efm+kJJv0dZ>gPWhAf#c(H`Px2ix zV%|tHTKB!YNp$;DU$zvpZ6M>O_yzL)RE)kW2FHuVcrigQW!%>q-QIWK7SnN*+_#4K zd2p+ax42jg=8Enl(cec*vC9)=7wGByQrX#=Vm?i5_7;=zqJNkeoFeAm6YJ~6G2Abvy|u$5{niwT1kx862r~l7%?E8->{#? z#+g@n&Ap>Vw6M@tmJhuWY^t@#^ew@-rW#WS(|%y8QY1V#s#s39@Z| zOK=6-zapmFs-D+vVoAKanIt=~_H;Yh`7|*l9?^Uz+rIyfc~2VBAI8MJJXoEoc0ZdV z+WW(Du58N}(a+nwgXk*yi!0dTfGwc(Pc~@7sKy2;FS!WEL|i_XN>96E38igB#_ybv>=W zw{;9W^ltNp@+F`2vVD}!qx~V?{|8^l-}k)@?>pW??|zD2e3|q2r6Zl}BW?E-acTQK zResmQ@ug!OTemm8Ovh187i}GbXh+!%`YAy##pChsE~eXw-g;v4jjz(%Kz2wuC2>Am zm)GK&wvIvWk$-uySWXO<5#1%kyg&BRV!EMd>-ySw)8d@&i)_a@Do3Zqm&;$FQ*AxE z@&@t~NA>1WKF^=ccd+NRrXJKhuQk`Hu=iIl>3OdPs+@%SmcQ9+x1Y7H>a)#je_3&U zr+82KQ{uPwyUF%kyBvRZ7UdoRxnFjFvaRJ0xL*xAISJ&Chl?TiD;+Ak8YY(8h|y^L zdtpz2`-$-Zq#q(Sv1q?X5?mzPe&?V<7YFF!=nkd(=xK{Xr;K+C>Ew2M-?I8Lz1Pi2 z886#>4*L$TxJ}nRV18+UzP0z?G3yQ##D87lwcapo=dUb=Z>!yp?t;vVY>1mC6Xf@p zf0@H3q`%lyEPVB2#dcyjo_>ygFqumFequUW^vLgTExRUu7ZZPt(G?bl4d3~y9tj?m zouO0w+hhmKONh`ye_nqv!`>wWXM% zf0LzT*MF97ZGIx==ZfWVVs#8`6N@=w03-7GFrTaRq+N`@EmoI`-nIDe7Sm_N(&2b~ zG1`;kJxUDE74us}pLrl9`YxQS`{n;mj8;=UC?`SmMuje}&@n0X$>z-z$-A=M zPsIqG8Z*zNTvyjE94fj)#Des2RoOMRi=NHbmOolYG@Vij4TaKat~SJX@f%{h!HS{6!3xp7>sT?R&-?+q3T*nLnQM{bb7cFd}Xd%~E?C7h*;nIwbCq zuBHCL9Rjf%`YU$}`RiRpTff}q%h~#+CHc^seZ}0s^w)bc95$C&QDfRPjtt>u8zkdtgvrR+q4r*1ptxLc9uCncS-UksEe3^Np z_B)ifFt2wo`}rAqvXRbkY<&RlUL99@9lTIU9C$jTFIN;*jLZI?|J zZGLi!&Q5<*|M9;|e{`UjZ6ih-h#|TqVZLdNehqGk?hFk>9)!C&_Uk8Y(HMCwkI7O6TdHg7(9wzyaoP1^wE{I@e=u?3*lK}af;}k zDthPOzgVoV6w9k&2GPUO4B5$exVhL27K1P1-uV^DKg8-iG5bV}mQucS^{;Lp>@K@J zT#Py1`U=?vy4?La`OwYb1K5v?^*dtf>H4MU#%zvk7kv}{R(8Ss;1GQkjnjSih!0jj z!oF9GpAz#|u-_5=zl+fuqWip9&WAr1Q|2{njtN9V~m$O8B&a)Ih=jr~C^jr+@ z7X$Ql@iysSh_TfN;@vrM?v(LDwWI2f#o_%+sAms~`I}<2qS`%odoi3QdbE!XaR&c6 z`HN4;$9#{9I7U8O?QM3Q=sqbn^s^29Zn&b_`EX^?Uqg(Do8{;r7yTQX-rHXJY<;DO z_?*AA{6&8;`CR)AJ{3dy|A07mGk|==^K4xu5B=kgP

      2. s^mEAJIeAfr3dtX?z!0X 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� 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
        $qdUzG~^l$%o>NfkGWGgGRSI|5`hw9%K@w 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 literal 0 HcmV?d00001 diff --git a/iris_grib/tests/testdata/INCLDTURB_T+24_0600.grib2 b/iris_grib/tests/testdata/INCLDTURB_T+24_0600.grib2 new file mode 100644 index 0000000000000000000000000000000000000000..c77f709836dd65733c5fd157c6107257aea2336a GIT binary patch literal 97393 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 bLQ?ffG}XA#>gEByH0^g}X0rcVNYQ@)v^UP* literal 0 HcmV?d00001 diff --git a/setup.py b/setup.py index d0f30250..b08231c7 100644 --- a/setup.py +++ b/setup.py @@ -84,7 +84,7 @@ def file_walk_relative(top, remove=''): # so 'iris_grib._confirm_iris_mercator_support' performs a runtime version # check instead + raises an error if required. # TODO: update Iris version and remove runtime checking, in future release. - install_requires = ['scitools-iris>=2.0.*', 'eccodes'], + install_requires = ['scitools-iris>=2.0.*'],# 'eccodes'], extras_require = { 'test:python_version=="2.7"': ['mock'], }, From 3d9b8e630e906d5396fa497da25dc8a460474061 Mon Sep 17 00:00:00 2001 From: Corinne Bosley Date: Tue, 6 Nov 2018 10:42:19 +0000 Subject: [PATCH 117/583] whatever --- iris_grib/_save_rules.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index 25d007b3..73a3036e 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -1139,7 +1139,7 @@ def get_spatial_process_code(spatial_processing_type): if spatial_processing_code is None: msg = ('Product definition section 4 contains an unsupported ' - 'spacial processing or interpolation type: {} ') + 'spatial processing or interpolation type: {} ') raise TranslationError(msg.format(spatial_processing_type)) return spatial_processing_code @@ -1337,8 +1337,8 @@ def product_definition_template_15(cube, grib, full3d_cube=None): """ # Encode type of spatial processing (see code table 4.15) - spacial_processing_type = cube.attributes['spatial_processing_type'] - spatial_processing = get_spatial_process_code(spacial_processing_type) + spatial_processing_type = cube.attributes['spatial_processing_type'] + spatial_processing = get_spatial_process_code(spatial_processing_type) # Encode statistical process and number of points # (see template definition 4.15) From 57635fbf8d13ccd2a3bc587807797e3b6fbda300 Mon Sep 17 00:00:00 2001 From: Corinne Bosley Date: Tue, 6 Nov 2018 11:10:02 +0000 Subject: [PATCH 118/583] changed tests to check metadata only --- iris_grib/_grib_cf_map.py | 2 +- .../round_trip/test_WAFC_mapping_round_trip.py | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/iris_grib/_grib_cf_map.py b/iris_grib/_grib_cf_map.py index b128a22f..72c53a76 100644 --- a/iris_grib/_grib_cf_map.py +++ b/iris_grib/_grib_cf_map.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2013 - 2016, Met Office +# (C) British Crown Copyright 2013 - 2018, Met Office # # This file is part of iris-grib. # diff --git a/iris_grib/tests/integration/round_trip/test_WAFC_mapping_round_trip.py b/iris_grib/tests/integration/round_trip/test_WAFC_mapping_round_trip.py index dad4580c..c91cd1b4 100644 --- a/iris_grib/tests/integration/round_trip/test_WAFC_mapping_round_trip.py +++ b/iris_grib/tests/integration/round_trip/test_WAFC_mapping_round_trip.py @@ -46,7 +46,7 @@ def test_WAFC_CAT_round_trip(self): with self.temp_filename() as tmp_save_path: save(cube, tmp_save_path, saver='grib2') saved_cube = load_cube(tmp_save_path) - self.assertTrue(saved_cube == cube) + self.assertEqual(saved_cube.metadata, cube.metadata) def test_WAFC_CB_round_trip(self): cubelist = load(self.cb) @@ -56,7 +56,7 @@ def test_WAFC_CB_round_trip(self): with self.temp_filename() as tmp_save_path: save(cube, tmp_save_path, saver='grib2') saved_cube = load_cube(tmp_save_path) - self.assertTrue(saved_cube == cube) + self.assertEqual(saved_cube.metadata, cube.metadata) def test_WAFC_icing_round_trip(self): cubelist = load(self.icing) @@ -66,7 +66,7 @@ def test_WAFC_icing_round_trip(self): with self.temp_filename() as tmp_save_path: save(cube, tmp_save_path, saver='grib2') saved_cube = load_cube(tmp_save_path) - self.assertTrue(saved_cube == cube) + self.assertEqual(saved_cube.metadata, cube.metadata) def test_WAFC_turb_round_trip(self): cubelist = load(self.turb) @@ -76,7 +76,7 @@ def test_WAFC_turb_round_trip(self): with self.temp_filename() as tmp_save_path: save(cube, tmp_save_path, saver='grib2') saved_cube = load_cube(tmp_save_path) - self.assertTrue(saved_cube == cube) + self.assertEqual(saved_cube.metadata, cube.metadata) if __name__ == '__main__': From a6bb77ff98b94e16d66865578a68ce9ff831c615 Mon Sep 17 00:00:00 2001 From: Corinne Bosley Date: Tue, 6 Nov 2018 13:03:42 +0000 Subject: [PATCH 119/583] put eccodes back in setup --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index b08231c7..d0f30250 100644 --- a/setup.py +++ b/setup.py @@ -84,7 +84,7 @@ def file_walk_relative(top, remove=''): # so 'iris_grib._confirm_iris_mercator_support' performs a runtime version # check instead + raises an error if required. # TODO: update Iris version and remove runtime checking, in future release. - install_requires = ['scitools-iris>=2.0.*'],# 'eccodes'], + install_requires = ['scitools-iris>=2.0.*', 'eccodes'], extras_require = { 'test:python_version=="2.7"': ['mock'], }, From 784a4d0ca5263b50267430f3bc2409287838a95a Mon Sep 17 00:00:00 2001 From: Corinne Bosley Date: Tue, 5 Mar 2019 11:30:54 +0000 Subject: [PATCH 120/583] corrected python-eccodes requirement in install_requires --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index d0f30250..b4a04531 100644 --- a/setup.py +++ b/setup.py @@ -84,7 +84,7 @@ def file_walk_relative(top, remove=''): # so 'iris_grib._confirm_iris_mercator_support' performs a runtime version # check instead + raises an error if required. # TODO: update Iris version and remove runtime checking, in future release. - install_requires = ['scitools-iris>=2.0.*', 'eccodes'], + install_requires = ['scitools-iris>=2.0.*', 'python-eccodes'], extras_require = { 'test:python_version=="2.7"': ['mock'], }, From 9d591030d300233fb3253f96ec8e9f55f61fc25a Mon Sep 17 00:00:00 2001 From: Corinne Bosley Date: Tue, 5 Mar 2019 16:25:58 +0000 Subject: [PATCH 121/583] amended python-eccodes dependency check in install_requires --- setup.py | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/setup.py b/setup.py index b4a04531..a8496299 100644 --- a/setup.py +++ b/setup.py @@ -3,6 +3,7 @@ import os import os.path +import sys from setuptools import setup import textwrap @@ -71,22 +72,19 @@ def file_walk_relative(top, remove=''): license = 'LGPL', platforms = "Linux, Mac OS X, Windows", keywords = ['iris', 'GRIB'], - classifiers = [ + classifiers=[ 'Programming Language :: Python', 'Programming Language :: Python :: 2.7', - 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.3', - 'Programming Language :: Python :: 3.4', - 'Programming Language :: Python :: 3.5', ], - # NOTE: This Iris version requirement is a purely temporary measure : - # Iris>=2.1 is needed for Mercator support, but this is not yet available, - # so 'iris_grib._confirm_iris_mercator_support' performs a runtime version - # check instead + raises an error if required. - # TODO: update Iris version and remove runtime checking, in future release. - install_requires = ['scitools-iris>=2.0.*', 'python-eccodes'], - extras_require = { - 'test:python_version=="2.7"': ['mock'], + # XXX: This is a royal dependency mess at the moment. The PyPI eccodes + # package 2.10.0 is a wheel for win_amd64 only, so we'll only add that as + # a dependence for the relevant platform, otherwise unfortunately it's up + # to the user to provision themselves until ECMWF and PyPI provide the + # suitable package platform coverage. + install_requires=['scitools-iris>=2.0.*'] + [ + 'eccodes'] if 'win' in sys.platform else [], + extras_require={ + 'test:python_version=="2.7"': ['mock'] }, test_suite = 'iris_grib.tests', ) From aa57dabbfede298d50b2f4dfebdef7fe544816a0 Mon Sep 17 00:00:00 2001 From: Bill Little Date: Wed, 6 Mar 2019 16:04:35 +0000 Subject: [PATCH 122/583] Bump version to 0.14.0 --- iris_grib/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index c1c50460..b41ff2fa 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -47,7 +47,7 @@ from .message import GribMessage -__version__ = '0.13.0' +__version__ = '0.14.0' __all__ = ['load_cubes', 'save_grib2', 'load_pairs_from_fields', 'save_pairs_from_cube', 'save_messages'] From dca5d8a753b55039b1a63bca4b4de81705e3508a Mon Sep 17 00:00:00 2001 From: Bill Little Date: Wed, 6 Mar 2019 16:10:38 +0000 Subject: [PATCH 123/583] Bump master to 0.15.0dev0 --- iris_grib/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index b41ff2fa..48592cd4 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -47,7 +47,7 @@ from .message import GribMessage -__version__ = '0.14.0' +__version__ = '0.15.0dev0' __all__ = ['load_cubes', 'save_grib2', 'load_pairs_from_fields', 'save_pairs_from_cube', 'save_messages'] From 2ac81d1e8a09cf1354769e3862882998ee81c5d1 Mon Sep 17 00:00:00 2001 From: Bill Little Date: Thu, 7 Mar 2019 22:27:18 +0000 Subject: [PATCH 124/583] Update index.rst --- docs/index.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index c9bdeac4..2147ee17 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -3,7 +3,7 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -Iris-grib v0.13 +Iris-grib v0.14 =============== The library ``iris-grib`` provides functionality for converting between weather and @@ -103,7 +103,7 @@ The simplest way to install is with using the `conda-forge channel `_ , with the command - $ conda install iris-grib -c conda-forge + $ conda install -c conda-forge iris-grib Development sources are hosted at ``_ . From 8e0f6c20aca6a2015799dd1f8b76d3a60b5f87f1 Mon Sep 17 00:00:00 2001 From: Bill Little Date: Thu, 7 Mar 2019 23:10:27 +0000 Subject: [PATCH 125/583] Update release_notes.rst --- docs/ref/release_notes.rst | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/docs/ref/release_notes.rst b/docs/ref/release_notes.rst index df0ea8af..c51097ad 100644 --- a/docs/ref/release_notes.rst +++ b/docs/ref/release_notes.rst @@ -1,6 +1,22 @@ Release Notes ============= +What's new in iris-grib v0.14 +----------------------------- + +:Release: 0.14.0 +:Date: 6 Mar 2019 + +Features +^^^^^^^^ + +* Added support for WAFC aviation codes. + +* Added loading and saving of statistically processed values over a spatial + area at a horizontal level or in a horizontal layer at a point in time + (product definition template 15 in code table 4.0) + + What's new in iris-grib v0.13 ----------------------------- From 8344a572fef38715ae98211fbf5f3ebc2652a9c4 Mon Sep 17 00:00:00 2001 From: Bill Little Date: Thu, 7 Mar 2019 23:32:06 +0000 Subject: [PATCH 126/583] Update __init__.py Update license header year --- iris_grib/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index 48592cd4..9805e344 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2010 - 2018, Met Office +# (C) British Crown Copyright 2010 - 2019, Met Office # # This file is part of iris-grib. # From ac4350dc2d6df143b3be33800e8a2f85c57cc0b5 Mon Sep 17 00:00:00 2001 From: marqh Date: Wed, 22 May 2019 12:46:11 +0000 Subject: [PATCH 127/583] metadata translations may 2019 --- iris_grib/_grib_cf_map.py | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/iris_grib/_grib_cf_map.py b/iris_grib/_grib_cf_map.py index 72c53a76..4f262c8e 100644 --- a/iris_grib/_grib_cf_map.py +++ b/iris_grib/_grib_cf_map.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2013 - 2018, Met Office +# (C) British Crown Copyright 2013 - 2019, Met Office # # This file is part of iris-grib. # @@ -16,11 +16,11 @@ # along with iris-grib. If not, see . # # DO NOT EDIT: AUTO-GENERATED -# Created on 14 October 2016 15:10 from +# Created on 22 May 2019 13:05 from # http://www.metarelate.net/metOcean -# at commit 3cde018acc4303203ff006a26f7b96a64e6ed3fb +# at commit a3649e942198f014f0258d926678dbbff616feae -# https://github.com/metarelate/metOcean/commit/3cde018acc4303203ff006a26f7b96a64e6ed3fb +# https://github.com/metarelate/metOcean/commit/a3649e942198f014f0258d926678dbbff616feae """ Provides GRIB/CF phenomenon translations. @@ -34,7 +34,6 @@ CFName = namedtuple('CFName', 'standard_name long_name units') - DimensionCoordinate = namedtuple('DimensionCoordinate', 'standard_name units points') @@ -116,8 +115,8 @@ G2Param(2, 0, 6, 6): CFName('atmosphere_mass_content_of_cloud_liquid_water', None, 'kg m-2'), G2Param(2, 0, 6, 7): CFName('cloud_area_fraction_in_atmosphere_layer', None, '%'), G2Param(2, 0, 6, 25): CFName(None, 'WAFC_CB_horizontal_extent', '1'), - G2Param(2, 0, 6, 26): CFName(None, 'WAFC_ICAO_height_at_CB_base', 'm'), - G2Param(2, 0, 6, 27): CFName(None, 'WAFC_ICAO_height_at_CB_top', 'm'), + G2Param(2, 0, 6, 26): CFName(None, 'WAFC_ICAO_height_at_cloud_base', 'm'), + G2Param(2, 0, 6, 27): CFName(None, 'WAFC_ICAO_height_at_cloud_top', 'm'), G2Param(2, 0, 7, 6): CFName('atmosphere_specific_convective_available_potential_energy', None, 'J kg-1'), G2Param(2, 0, 7, 7): CFName(None, 'convective_inhibition', 'J kg-1'), G2Param(2, 0, 7, 8): CFName(None, 'storm_relative_helicity', 'J kg-1'), @@ -168,6 +167,12 @@ } CF_TO_GRIB2 = { + CFName(None, 'WAFC_CAT_potential', '1'): G2Param(2, 0, 19, 22), + CFName(None, 'WAFC_CB_horizontal_extent', '1'): G2Param(2, 0, 6, 25), + CFName(None, 'WAFC_ICAO_height_at_cloud_base', 'm'): G2Param(2, 0, 6, 26), + CFName(None, 'WAFC_ICAO_height_at_cloud_top', 'm'): G2Param(2, 0, 6, 27), + CFName(None, 'WAFC_icing_potential', '1'): G2Param(2, 0, 19, 20), + CFName(None, 'WAFC_in-cloud_turb_potential', '1'): G2Param(2, 0, 19, 21), CFName(None, 'cloud_area_fraction_assuming_maximum_random_overlap', '1'): G2Param(2, 0, 6, 1), CFName(None, 'cloud_mixing_ratio', 'kg kg-1'): G2Param(2, 0, 1, 22), CFName(None, 'convective_inhibition', 'J kg-1'): G2Param(2, 0, 7, 7), @@ -218,7 +223,6 @@ CFName('surface_downwelling_longwave_flux_in_air', None, 'W m-2'): G2Param(2, 0, 5, 3), CFName('surface_downwelling_shortwave_flux_in_air', None, 'W m-2'): G2Param(2, 0, 4, 7), CFName('surface_net_downward_longwave_flux', None, 'W m-2'): G2Param(2, 0, 5, 5), - CFName('surface_net_downward_longwave_flux', None, 'W m-2'): G2Param(2, 0, 5, 5), CFName('surface_net_downward_shortwave_flux', None, 'W m-2'): G2Param(2, 0, 4, 9), CFName('surface_roughness_length', None, 'm'): G2Param(2, 2, 0, 1), CFName('surface_runoff_flux', None, 'kg m-2 s-1'): G2Param(2, 2, 0, 34), @@ -226,12 +230,6 @@ CFName('surface_upward_latent_heat_flux', None, 'W m-2'): G2Param(2, 0, 0, 10), CFName('surface_upward_sensible_heat_flux', None, 'W m-2'): G2Param(2, 0, 0, 11), CFName('thickness_of_snowfall_amount', None, 'm'): G2Param(2, 0, 1, 11), - CFName(None, 'WAFC_CAT_potential', '1'): G2Param(2, 0, 19, 22), - CFName(None, 'WAFC_CB_horizontal_extent', '1'): G2Param(2, 0, 6, 25), - CFName(None, 'WAFC_ICAO_height_at_cloud_base', 'm'): G2Param(2, 0, 6, 26), - CFName(None, 'WAFC_ICAO_height_at_cloud_top', 'm'): G2Param(2, 0, 6, 27), - CFName(None, 'WAFC_icing_potential', '1'): G2Param(2, 0, 19, 20), - CFName(None, 'WAFC_in-cloud_turb_potential', '1'): G2Param(2, 0, 19, 21), CFName('wind_from_direction', None, 'degrees'): G2Param(2, 0, 2, 0), CFName('wind_speed', None, 'm s-1'): G2Param(2, 0, 2, 1), CFName('wind_speed_of_gust', None, 'm s-1'): G2Param(2, 0, 2, 22), From ac0d447bd0501a265cf52f8cadf345de5f024cb6 Mon Sep 17 00:00:00 2001 From: Laura Date: Thu, 6 Jun 2019 10:05:34 +0200 Subject: [PATCH 128/583] Use eccodes-python for Python 3 --- .travis.yml | 22 ++++++++++++++++++++-- iris_grib/__init__.py | 2 +- iris_grib/_save_rules.py | 5 +++-- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 3c2c60ec..e8b871ec 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,6 +2,7 @@ language: python sudo: false env: - python=2.7 + - python=3.6 install: # Fetch and install conda @@ -16,7 +17,24 @@ install: # Install iris-grib's dependencies # -------------------------------- - - conda install --quiet --yes python=${python} iris python-eccodes numpy cartopy mock filelock pep8; + # If running in Python 2, install Python2-only python-eccodes. + - if [[ "$python" == "2.7" ]]; then + export ECCODES_DEPS="python-eccodes"; + fi + + # If running in Python 3, we will install Python3-only eccodes-python via pip. + - if [[ "$python" == "3.6" ]]; then + export ECCODES_DEPS="eccodes pip"; + fi + + - conda install --quiet --yes python=${python} iris numpy cartopy mock filelock pep8 $ECCODES_DEPS; + + # If running in Python 3, install eccodes-python and check the installation. + - if [[ "$python" == "3.6" ]]; then + pip install eccodes-python; + python -m eccodes selfcheck; + fi + - conda list --explicit # Download iris-test-data @@ -29,7 +47,7 @@ install: # Locate iris installation # ------------------------ - - export IRIS_DIR=$(python -c "import iris; import os.path; print os.path.dirname(iris.__file__)") + - export IRIS_DIR=$(python -c "import iris; import os.path; print(os.path.dirname(iris.__file__))") # Poke site.cfg to reference iris-test-data - SITE_CFG=$IRIS_DIR/etc/site.cfg diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index 9805e344..8e84ccf2 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -225,7 +225,7 @@ def __getattr__(self, key): else: emsg = "Unknown type for {} : {}" raise ValueError(emsg.format(key, str(key_type))) - except gribapi.GribInternalError: + except gribapi.errors.GribInternalError: res = None # ...or is it in our list of extras? diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index 73a3036e..9df64975 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2010 - 2018, Met Office +# (C) British Crown Copyright 2010 - 2019, Met Office # # This file is part of iris-grib. # @@ -976,7 +976,8 @@ def set_fixed_surfaces(cube, grib, full3d_cube=None): coeffs_array[n_lev - 1] = height coeffs_array[n_coeffs + n_lev - 1] = sigma pv_values = [float(el) for el in coeffs_array] - gribapi.grib_set(grib, "NV", n_coeffs * 2) + # eccodes does not support writing numpy.it64, cast to python int + gribapi.grib_set(grib, "NV", int(n_coeffs * 2)) gribapi.grib_set_array(grib, "pv", pv_values) From ae4871a04ddfc102a20b61929fcfa8acc2df6c92 Mon Sep 17 00:00:00 2001 From: Laura Date: Thu, 6 Jun 2019 20:06:36 +0200 Subject: [PATCH 129/583] Add *temporary* wrapper to gribapi.grib_get_*array calls. --- iris_grib/__init__.py | 13 ++++++++----- iris_grib/message.py | 26 ++++++++++++++++++++++---- 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index 8e84ccf2..3d209f78 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -44,7 +44,7 @@ from . import grib_phenom_translation as gptx from . import _save_rules from ._load_convert import convert as load_convert -from .message import GribMessage +from .message import GribMessage, grib_get_array_wrapper __version__ = '0.15.0dev0' @@ -205,7 +205,8 @@ def __getattr__(self, key): # we just get as the type of the "values" # array...special case here... if key in ["values", "pv", "latitudes", "longitudes"]: - res = gribapi.grib_get_double_array(self.grib_message, key) + res = grib_get_array_wrapper( + gribapi.grib_get_double_array(self.grib_message, key)) elif key in ('typeOfFirstFixedSurface', 'typeOfSecondFixedSurface'): res = np.int32(gribapi.grib_get_long(self.grib_message, key)) @@ -471,8 +472,9 @@ def _compute_extra_keys(self): # get the distinct latitudes, and make sure they are sorted # (south-to-north) and then put them in the right direction # depending on the scan direction - latitude_points = gribapi.grib_get_double_array( - self.grib_message, 'distinctLatitudes').astype(np.float64) + latitude_points = grib_get_array_wrapper( + gribapi.grib_get_double_array( + self.grib_message, 'distinctLatitudes')).astype(np.float64) latitude_points.sort() if not self.jScansPositively: # we require latitudes north-to-south @@ -691,7 +693,8 @@ def _longitude_is_cyclic(points): def _message_values(grib_message, shape): gribapi.grib_set_double(grib_message, 'missingValue', np.nan) - data = gribapi.grib_get_double_array(grib_message, 'values') + data = grib_get_array_wrapper( + gribapi.grib_get_double_array(grib_message, 'values')) data = data.reshape(shape) # Handle missing values in a sensible way. diff --git a/iris_grib/message.py b/iris_grib/message.py index c751f4e9..1bb9c798 100644 --- a/iris_grib/message.py +++ b/iris_grib/message.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2014 - 2018, Met Office +# (C) British Crown Copyright 2014 - 2019, Met Office # # This file is part of iris-grib. # @@ -33,9 +33,24 @@ from iris._lazy_data import as_lazy_data from iris.exceptions import TranslationError + _SUPPORTED_GRID_DEFINITIONS = (0, 1, 5, 10, 12, 20, 30, 40, 90) +def grib_get_array_wrapper(f): + """ + Converts what f returns into an array. + + When using eccodes-python, gribapi.grib_get_*array returns a list rather + than an array as expected. + + This is intended as a *temporary* fix that wil be moved once eccodes-python + is fixed. + + """ + return np.array(f) + + class _OpenFileRef(object): """ A reference to an open file that ensures that the file is closed @@ -446,12 +461,14 @@ def _get_key_value(self, key): 'scaledValueOfCentralWaveNumber', 'longitudes', 'latitudes') if key in vector_keys: - res = gribapi.grib_get_array(self._message_id, key) + res = grib_get_array_wrapper( + gribapi.grib_get_array(self._message_id, key)) elif key == 'bitmap': # The bitmap is stored as contiguous boolean bits, one bit for each # data point. GRIBAPI returns these as strings, so it must be # type-cast to return an array of ints (0, 1). - res = gribapi.grib_get_array(self._message_id, key, int) + res = grib_get_array_wrapper( + gribapi.grib_get_array(self._message_id, key, int)) elif key in ('typeOfFirstFixedSurface', 'typeOfSecondFixedSurface'): # By default these values are returned as unhelpful strings but # we can use int representation to compare against instead. @@ -476,7 +493,8 @@ def get_computed_key(self, key): """ vector_keys = ('longitudes', 'latitudes', 'distinctLatitudes') if key in vector_keys: - res = gribapi.grib_get_array(self._message_id, key) + res = grib_get_array_wrapper( + gribapi.grib_get_array(self._message_id, key)) else: res = self._get_value_or_missing(key) return res From ca34b879b4b5de49624495cc434e60968f8f2bbd Mon Sep 17 00:00:00 2001 From: lbdreyer Date: Tue, 11 Jun 2019 14:31:42 +0100 Subject: [PATCH 130/583] Review actions --- .travis.yml | 14 ++++++-------- iris_grib/__init__.py | 8 ++++---- iris_grib/_save_rules.py | 2 +- iris_grib/message.py | 13 +++++++------ 4 files changed, 18 insertions(+), 19 deletions(-) diff --git a/.travis.yml b/.travis.yml index e8b871ec..7268bad9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,20 +17,18 @@ install: # Install iris-grib's dependencies # -------------------------------- - # If running in Python 2, install Python2-only python-eccodes. - - if [[ "$python" == "2.7" ]]; then + # If running in Python 2, install Python2-only python-eccodes, otherwise we + # install the Python3-only eccodes-python via pip. + - if [[ "${python}" == "2.7" ]]; then export ECCODES_DEPS="python-eccodes"; - fi - - # If running in Python 3, we will install Python3-only eccodes-python via pip. - - if [[ "$python" == "3.6" ]]; then + else export ECCODES_DEPS="eccodes pip"; fi - - conda install --quiet --yes python=${python} iris numpy cartopy mock filelock pep8 $ECCODES_DEPS; + - conda install --quiet --yes python=${python} iris numpy cartopy mock filelock pep8 ${ECCODES_DEPS}; # If running in Python 3, install eccodes-python and check the installation. - - if [[ "$python" == "3.6" ]]; then + - if [[ "${python}" != "2.7" ]]; then pip install eccodes-python; python -m eccodes selfcheck; fi diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index 3d209f78..50c3be43 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -44,7 +44,7 @@ from . import grib_phenom_translation as gptx from . import _save_rules from ._load_convert import convert as load_convert -from .message import GribMessage, grib_get_array_wrapper +from .message import GribMessage, _grib_get_array_wrapper __version__ = '0.15.0dev0' @@ -205,7 +205,7 @@ def __getattr__(self, key): # we just get as the type of the "values" # array...special case here... if key in ["values", "pv", "latitudes", "longitudes"]: - res = grib_get_array_wrapper( + res = _grib_get_array_wrapper( gribapi.grib_get_double_array(self.grib_message, key)) elif key in ('typeOfFirstFixedSurface', 'typeOfSecondFixedSurface'): @@ -472,7 +472,7 @@ def _compute_extra_keys(self): # get the distinct latitudes, and make sure they are sorted # (south-to-north) and then put them in the right direction # depending on the scan direction - latitude_points = grib_get_array_wrapper( + latitude_points = _grib_get_array_wrapper( gribapi.grib_get_double_array( self.grib_message, 'distinctLatitudes')).astype(np.float64) latitude_points.sort() @@ -693,7 +693,7 @@ def _longitude_is_cyclic(points): def _message_values(grib_message, shape): gribapi.grib_set_double(grib_message, 'missingValue', np.nan) - data = grib_get_array_wrapper( + data = _grib_get_array_wrapper( gribapi.grib_get_double_array(grib_message, 'values')) data = data.reshape(shape) diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index 9df64975..29178b2d 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -976,7 +976,7 @@ def set_fixed_surfaces(cube, grib, full3d_cube=None): coeffs_array[n_lev - 1] = height coeffs_array[n_coeffs + n_lev - 1] = sigma pv_values = [float(el) for el in coeffs_array] - # eccodes does not support writing numpy.it64, cast to python int + # eccodes does not support writing numpy.int64, cast to python int gribapi.grib_set(grib, "NV", int(n_coeffs * 2)) gribapi.grib_set_array(grib, "pv", pv_values) diff --git a/iris_grib/message.py b/iris_grib/message.py index 1bb9c798..eca42223 100644 --- a/iris_grib/message.py +++ b/iris_grib/message.py @@ -33,11 +33,10 @@ from iris._lazy_data import as_lazy_data from iris.exceptions import TranslationError - _SUPPORTED_GRID_DEFINITIONS = (0, 1, 5, 10, 12, 20, 30, 40, 90) -def grib_get_array_wrapper(f): +def _grib_get_array_wrapper(f): """ Converts what f returns into an array. @@ -48,7 +47,9 @@ def grib_get_array_wrapper(f): is fixed. """ - return np.array(f) + if not isinstance(f, np.ndarray): + f = np.asarray(f) + return f class _OpenFileRef(object): @@ -461,13 +462,13 @@ def _get_key_value(self, key): 'scaledValueOfCentralWaveNumber', 'longitudes', 'latitudes') if key in vector_keys: - res = grib_get_array_wrapper( + res = _grib_get_array_wrapper( gribapi.grib_get_array(self._message_id, key)) elif key == 'bitmap': # The bitmap is stored as contiguous boolean bits, one bit for each # data point. GRIBAPI returns these as strings, so it must be # type-cast to return an array of ints (0, 1). - res = grib_get_array_wrapper( + res = _grib_get_array_wrapper( gribapi.grib_get_array(self._message_id, key, int)) elif key in ('typeOfFirstFixedSurface', 'typeOfSecondFixedSurface'): # By default these values are returned as unhelpful strings but @@ -493,7 +494,7 @@ def get_computed_key(self, key): """ vector_keys = ('longitudes', 'latitudes', 'distinctLatitudes') if key in vector_keys: - res = grib_get_array_wrapper( + res = _grib_get_array_wrapper( gribapi.grib_get_array(self._message_id, key)) else: res = self._get_value_or_missing(key) From 77c2330ca73f6092cfd70d448e260a6847afe7b9 Mon Sep 17 00:00:00 2001 From: Bill Little Date: Fri, 12 Jul 2019 09:55:06 +0100 Subject: [PATCH 131/583] update travis --- .travis.yml | 99 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 58 insertions(+), 41 deletions(-) diff --git a/.travis.yml b/.travis.yml index 7268bad9..24d789dd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,56 +1,70 @@ -language: python -sudo: false +language: minimal +dist: xenial + env: - - python=2.7 - - python=3.6 + matrix: + - PYTHON_VERSION=2.7 + - PYTHON_VERSION=3.6 + - PYTHON_VERSION=3.7 install: - # Fetch and install conda - # ----------------------- - - export CONDA_BASE=http://repo.continuum.io/miniconda/Miniconda3 - - wget ${CONDA_BASE}-latest-Linux-x86_64.sh -O miniconda.sh; - - bash miniconda.sh -b -p $HOME/miniconda - - export PATH="$HOME/miniconda/bin:$PATH" - - conda config --set show_channel_urls True - - conda config --add channels conda-forge - - conda config --add channels defaults - - # Install iris-grib's dependencies - # -------------------------------- - # If running in Python 2, install Python2-only python-eccodes, otherwise we - # install the Python3-only eccodes-python via pip. - - if [[ "${python}" == "2.7" ]]; then - export ECCODES_DEPS="python-eccodes"; + # Install miniconda + # ----------------- + - > + echo "Installing miniconda"; + export CONDA_BASE="https://repo.continuum.io/miniconda/Miniconda"; + if [[ "${PYTHON_VERSION}" == 2* ]]; then + wget --quiet ${CONDA_BASE}2-latest-Linux-x86_64.sh -O miniconda.sh; else - export ECCODES_DEPS="eccodes pip"; - fi + wget --quiet ${CONDA_BASE}3-latest-Linux-x86_64.sh -O miniconda.sh; + fi; + bash miniconda.sh -b -p ${HOME}/miniconda; + export PATH="${HOME}/miniconda/bin:${PATH}"; - - conda install --quiet --yes python=${python} iris numpy cartopy mock filelock pep8 ${ECCODES_DEPS}; - - # If running in Python 3, install eccodes-python and check the installation. - - if [[ "${python}" != "2.7" ]]; then - pip install eccodes-python; - python -m eccodes selfcheck; - fi + # Configure the test environment + # ------------------------------ + - > + echo "Configuring testing environment"; + conda config --set always_yes yes --set changeps1 no; + conda config --set show_channel_urls True; + conda config --add channels conda-forge; + conda update --quiet conda; + ENV_NAME='test-environment'; + conda create --quiet -n ${ENV_NAME} python=${PYTHON_VERSION}; + source activate ${ENV_NAME}; - - conda list --explicit + # Customise the test environment + # ------------------------------ + - > + if [[ "${PYTHON_VERSION}" == 2* ]]; then + export ECCODES_DEPS="python-eccodes"; + else + export ECCODES_DEPS="eccodes pip"; + fi; + conda install -n ${ENV_NAME} --quiet iris mock filelock pep8 ${ECCODES_DEPS}; + if [[ "${PYTHON_VERSION}" == 3* ]]; then + pip install eccodes-python; + python -m eccodes selfcheck; + fi; - # Download iris-test-data - # -------------------------------- - - export IRIS_TEST_DATA_REF=https://github.com/SciTools/iris-test-data/archive/master.zip - - export IRIS_TEST_DATA_LOCATION=$HOME/iris-test-data - - mkdir $IRIS_TEST_DATA_LOCATION - - wget -O $IRIS_TEST_DATA_LOCATION/iris-test-data.zip ${IRIS_TEST_DATA_REF} - - unzip -q $IRIS_TEST_DATA_LOCATION/iris-test-data.zip -d $IRIS_TEST_DATA_LOCATION + # Download and install iris-test-data + # ----------------------------------- + - > + export IRIS_TEST_DATA_REF="https://github.com/SciTools/iris-test-data/archive/master.zip"; + export IRIS_TEST_DATA_LOCATION="${HOME}/iris-test-data"; + mkdir ${IRIS_TEST_DATA_LOCATION}; + wget -O ${IRIS_TEST_DATA_LOCATION}/iris-test-data.zip ${IRIS_TEST_DATA_REF}; + unzip -q ${IRIS_TEST_DATA_LOCATION}/iris-test-data.zip -d ${IRIS_TEST_DATA_LOCATION}; # Locate iris installation # ------------------------ - export IRIS_DIR=$(python -c "import iris; import os.path; print(os.path.dirname(iris.__file__))") # Poke site.cfg to reference iris-test-data - - SITE_CFG=$IRIS_DIR/etc/site.cfg - - echo "[Resources]" > $SITE_CFG - - echo "test_data_dir = ${IRIS_TEST_DATA_LOCATION}/iris-test-data-master/test_data" >> $SITE_CFG + - > + SITE_CFG="${IRIS_DIR}/etc/site.cfg"; + echo "[Resources]" > ${SITE_CFG}; + echo "test_data_dir = ${IRIS_TEST_DATA_LOCATION}/iris-test-data-master/test_data" >> ${SITE_CFG}; # Install iris-grib itself # ------------------------ @@ -62,7 +76,10 @@ install: # Summarise the environment # ------------------------- - - conda list + - > + conda list -n ${ENV_NAME}; + conda list -n ${ENV_NAME} --explicit; + conda info -a; script: # Ensure we can import iris_grib and that the tests pass From 00a72eb547f6635dc4449eefe2e3bf618e012c2f Mon Sep 17 00:00:00 2001 From: Martin Yeo <40734014+trexfeathers@users.noreply.github.com> Date: Tue, 23 Jul 2019 15:43:11 +0100 Subject: [PATCH 132/583] Granularity for fixed surface arguments (#146) product_definition_section will no longer try to populate the fixed surface arguments for translate_phenomenon - not available in some templates, in which case populate with None --- iris_grib/_load_convert.py | 33 ++++- .../test_product_definition_section.py | 138 ++++++++++++++++++ .../test_product_definition_template_31.py | 25 ++-- 3 files changed, 178 insertions(+), 18 deletions(-) create mode 100644 iris_grib/tests/unit/load_convert/test_product_definition_section.py diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index f164529d..a87fdfbb 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2014 - 2018, Met Office +# (C) British Crown Copyright 2014 - 2019, Met Office # # This file is part of iris-grib. # @@ -2354,6 +2354,7 @@ def product_definition_section(section, metadata, discipline, tablesVersion, template = section['productDefinitionTemplateNumber'] probability = None + includes_fixed_surface_keys = True if template == 0: # Process analysis or forecast at a horizontal level or # in a horizontal layer at a point in time. @@ -2377,8 +2378,10 @@ def product_definition_section(section, metadata, discipline, tablesVersion, product_definition_template_15(section, metadata, rt_coord) elif template == 31: # Process satellite product. + includes_fixed_surface_keys = False product_definition_template_31(section, metadata, rt_coord) elif template == 32: + includes_fixed_surface_keys = False product_definition_template_32(section, metadata, rt_coord) elif template == 40: product_definition_template_40(section, metadata, rt_coord) @@ -2389,13 +2392,27 @@ def product_definition_section(section, metadata, discipline, tablesVersion, # Translate GRIB2 phenomenon to CF phenomenon. if tablesVersion != _CODE_TABLES_MISSING: - translate_phenomenon(metadata, discipline, - section['parameterCategory'], - section['parameterNumber'], - section['typeOfFirstFixedSurface'], - section['scaledValueOfFirstFixedSurface'], - section['typeOfSecondFixedSurface'], - probability=probability) + translation_kwargs = { + 'metadata': metadata, + 'discipline': discipline, + 'parameterCategory': section['parameterCategory'], + 'parameterNumber': section['parameterNumber'], + 'probability': probability + } + + # Won't always be able to populate the below arguments - + # missing from some template definitions. + fixed_surface_keys = [ + 'typeOfFirstFixedSurface', + 'scaledValueOfFirstFixedSurface', + 'typeOfSecondFixedSurface' + ] + + for section_key in fixed_surface_keys: + translation_kwargs[section_key] = \ + section[section_key] if includes_fixed_surface_keys else None + + translate_phenomenon(**translation_kwargs) ############################################################################### diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_section.py b/iris_grib/tests/unit/load_convert/test_product_definition_section.py new file mode 100644 index 00000000..6dec6803 --- /dev/null +++ b/iris_grib/tests/unit/load_convert/test_product_definition_section.py @@ -0,0 +1,138 @@ +# (C) British Crown Copyright 2014 - 2019, Met Office +# +# This file is part of iris-grib. +# +# iris-grib is free software: you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the +# Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# iris-grib is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with iris-grib. If not, see . +""" +Tests for `iris_grib._load_convert.product_definition_section`. + +""" + +from __future__ import (absolute_import, division, print_function) + +# import iris_grib.tests first so that some things can be initialised +# before importing anything else. +import iris_grib.tests as tests + +from iris.coords import DimCoord +import mock +import six + +from itertools import product + +from iris_grib._load_convert import product_definition_section +from iris_grib.tests.unit.load_convert import empty_metadata +from iris_grib.tests.unit.load_convert.test_product_definition_template_0 \ + import section_4 as pdt_0_section_4 +from iris_grib.tests.unit.load_convert.test_product_definition_template_31 \ + import section_4 as pdt_31_section_4 + + +class TestFixedSurfaces(tests.IrisGribTest): + """ + Tests focussing on the handling of fixed surface elements in section 4. + Expects/ignores depending on the template number. + """ + def setUp(self): + self.patch('warnings.warn') + self.translate_phenomenon_patch = self.patch( + 'iris_grib._load_convert.translate_phenomenon' + ) + + # Prep placeholder variables for product_definition_section. + self.discipline = mock.sentinel.discipline + self.tablesVersion = mock.sentinel.tablesVersion + self.rt_coord = DimCoord(24, 'forecast_reference_time', + units='hours since epoch') + self.metadata = empty_metadata() + + self.templates = {0: pdt_0_section_4(), 31: pdt_31_section_4()} + self.fixed_surface_keys = [ + 'typeOfFirstFixedSurface', + 'scaledValueOfFirstFixedSurface', + 'typeOfSecondFixedSurface' + ] + + def _check_fixed_surface(self, fs_is_expected, fs_is_present): + """ + Whether or not fixed surface elements are expected/present in the + section 4 keys, most of the code is shared so we are using a single + function with parameters. + """ + + # Use the section 4 from either product_definition_section #1 or #31. + # #0 contains fixed surface elements, #31 does not. + template_number = 0 if fs_is_expected else 31 + section_4 = self.templates[template_number] + section_4.update({ + 'productDefinitionTemplateNumber': template_number, + 'parameterCategory': None, + 'parameterNumber': None + }) + + for key in self.fixed_surface_keys: + # Force the presence or absence of the fixed surface elements even + # when they're respectively ignored or expected. + if fs_is_present and key not in section_4: + section_4[key] = pdt_0_section_4()[key] + elif (not fs_is_present) and key in section_4: + del section_4[key] + + def run_function(): + # For re-use in every type of test below. + product_definition_section( + section_4, self.metadata, self.discipline, self.tablesVersion, + self.rt_coord) + + if fs_is_expected and not fs_is_present: + # Should error since the expected keys are missing. + error_message = 'FixedSurface' + with six.assertRaisesRegex(self, KeyError, error_message): + run_function() + else: + # Should have a successful run for all other circumstances. + + # Translate_phenomenon_patch is the end of the function, + # and should be able to accept None for the fixed surface + # arguments. So should always have run. + previous_call_count = self.translate_phenomenon_patch.call_count + run_function() + self.assertEqual(self.translate_phenomenon_patch.call_count, + previous_call_count + 1) + phenom_call_args = self.translate_phenomenon_patch.call_args[1] + for key in self.fixed_surface_keys: + # Check whether None or actual values have been passed for + # the fixed surface arguments. + if fs_is_expected: + self.assertEqual(phenom_call_args[key], section_4[key]) + else: + self.assertIsNone(phenom_call_args[key]) + + def test_all_combinations(self): + """ + Test all combinations of fixed surface being expected/present + + a. Expected and Present - standard behaviour for most templates + b. Expected and Absent - unplanned combination, should error + c. Unexpected and Present - unplanned combination, should be handled + identically to (d) + d. Unexpected and Absent - standard behaviour for a few templates + e.g. #31 + """ + for pair in product([True, False], repeat=2): + self._check_fixed_surface(*pair) + + +if __name__ == '__main__': + tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_31.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_31.py index 10af448d..c11bb8c3 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_31.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_31.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2014 - 2017, Met Office +# (C) British Crown Copyright 2014 - 2019, Met Office # # This file is part of iris-grib. # @@ -37,6 +37,19 @@ from iris_grib._load_convert import product_definition_template_31 +def section_4(): + # Also needed for test_product_definition_section.py. + series = mock.sentinel.satelliteSeries + number = mock.sentinel.satelliteNumber + instrument = mock.sentinel.instrumentType + return {'NB': 1, + 'satelliteSeries': series, + 'satelliteNumber': number, + 'instrumentType': instrument, + 'scaleFactorOfCentralWaveNumber': 1, + 'scaledValueOfCentralWaveNumber': 12} + + class Test(tests.IrisGribTest): def setUp(self): self.patch('warnings.warn') @@ -47,16 +60,8 @@ def setUp(self): def test(self): # Prepare the arguments. - series = mock.sentinel.satelliteSeries - number = mock.sentinel.satelliteNumber - instrument = mock.sentinel.instrumentType rt_coord = mock.sentinel.observation_time - section = {'NB': 1, - 'satelliteSeries': series, - 'satelliteNumber': number, - 'instrumentType': instrument, - 'scaleFactorOfCentralWaveNumber': 1, - 'scaledValueOfCentralWaveNumber': 12} + section = section_4() # Call the function. metadata = empty_metadata() From 8126afc0a610ea4822c67beb45870be33e034939 Mon Sep 17 00:00:00 2001 From: Mike Stucka Date: Mon, 2 Sep 2019 11:08:08 -0400 Subject: [PATCH 133/583] Try running with eccodes-python dependency instead of eccodes --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index a8496299..b779222b 100644 --- a/setup.py +++ b/setup.py @@ -82,7 +82,7 @@ def file_walk_relative(top, remove=''): # to the user to provision themselves until ECMWF and PyPI provide the # suitable package platform coverage. install_requires=['scitools-iris>=2.0.*'] + [ - 'eccodes'] if 'win' in sys.platform else [], + 'eccodes-python'] if 'win' in sys.platform else [], extras_require={ 'test:python_version=="2.7"': ['mock'] }, From d8a99f33e0c6db68c73c0feb0f3dd2bc7b701ed0 Mon Sep 17 00:00:00 2001 From: BHFock Date: Tue, 26 Nov 2019 12:11:49 +0000 Subject: [PATCH 134/583] Depth coordinate (#161) * Add depth as coordinate in _save_rules.py, see also http://codes.wmo.int/grib2/codeflag/4.5/_106 * Add test for depth in fixed_surfaces * minor layout change * Correct SyntaxError in test_set_fixed_surfaces.py * Correct SyntaxError in test_set_fixed_surfaces.py * Minor layout change * Remove white space --- iris_grib/_save_rules.py | 6 +++++ .../save_rules/test_set_fixed_surfaces.py | 22 ++++++++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index 29178b2d..8cc506f4 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -881,6 +881,12 @@ def set_fixed_surfaces(cube, grib, full3d_cube=None): output_unit = cf_units.Unit("m") v_coord = cube.coord("height") + # depth + elif cube.coords("depth"): + grib_v_code = 106 + output_unit = cf_units.Unit('m') + v_coord = cube.coord("depth") + elif cube.coords("air_potential_temperature"): grib_v_code = 107 output_unit = cf_units.Unit('K') diff --git a/iris_grib/tests/unit/save_rules/test_set_fixed_surfaces.py b/iris_grib/tests/unit/save_rules/test_set_fixed_surfaces.py index 77544acf..1cdd1b32 100644 --- a/iris_grib/tests/unit/save_rules/test_set_fixed_surfaces.py +++ b/iris_grib/tests/unit/save_rules/test_set_fixed_surfaces.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2013 - 2016, Met Office +# (C) British Crown Copyright 2013 - 2019, Met Office # # This file is part of iris-grib. # @@ -77,6 +77,26 @@ def test_theta_level(self): gribapi.grib_get_long(grib, "typeOfSecondFixedSurface"), 107) + def test_depth(self): + cube = iris.cube.Cube([0]) + cube.add_aux_coord(iris.coords.AuxCoord( + 1, long_name='depth', units='m', + bounds=np.array([0., 2]), attributes={'positive': 'down'})) + grib = gribapi.grib_new_from_samples("GRIB2") + set_fixed_surfaces(cube, grib) + self.assertEqual( + gribapi.grib_get_double(grib, "scaledValueOfFirstFixedSurface"), + 0.) + self.assertEqual( + gribapi.grib_get_double(grib, "scaledValueOfSecondFixedSurface"), + 2) + self.assertEqual( + gribapi.grib_get_long(grib, "typeOfFirstFixedSurface"), + 106) + self.assertEqual( + gribapi.grib_get_long(grib, "typeOfSecondFixedSurface"), + 106) + if __name__ == "__main__": tests.main() From ddb580bb304e4f4f6e1bcf92fe2fae4c5177e35e Mon Sep 17 00:00:00 2001 From: Thomas Powell Date: Wed, 27 Nov 2019 11:09:27 +0000 Subject: [PATCH 135/583] Fix to read grib files obeying 'resolutionAndComponentFlags' (#148) * Fix iris-grib to read grib files and obey 'resolutionAndComponentFlags' property * Update iris_grib/tests/unit/load_convert/test_calculate_increment.py Co-Authored-By: lbdreyer * Update iris_grib/tests/unit/load_convert/test_grid_definition_template_0_and_1.py Co-Authored-By: lbdreyer --- iris_grib/_load_convert.py | 35 ++++++- .../load_convert/test_calculate_increment.py | 43 ++++++++ .../test_grid_definition_template_0_and_1.py | 99 ++++++++++++++++++- .../test_grid_definition_template_40.py | 3 +- 4 files changed, 175 insertions(+), 5 deletions(-) create mode 100644 iris_grib/tests/unit/load_convert/test_calculate_increment.py diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index a87fdfbb..cfeffa52 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -498,6 +498,14 @@ def ellipsoid_geometry(section): return major, minor, radius +def _calculate_increment(first_grid_point, last_grid_point, num_intervals): + # Calculates the directional increment from the difference between + # the grid point values divided by the total number of intervals. + # Required by template 0 & 40 when no increment values are provided. + + return math.fabs(last_grid_point - first_grid_point) / num_intervals + + def grid_definition_template_0_and_1(section, metadata, y_name, x_name, cs): """ Translate templates representing regularly spaced latitude/longitude @@ -533,8 +541,16 @@ def grid_definition_template_0_and_1(section, metadata, y_name, x_name, cs): scan = scanning_mode(section['scanningMode']) + # Set resoultion flags + res_flags = resolution_flags(section['resolutionAndComponentFlags']) + # Calculate longitude points. - x_inc = section['iDirectionIncrement'] * _GRID_ACCURACY_IN_DEGREES + x_inc = (section['iDirectionIncrement'] + if res_flags.i_increments_given + else _calculate_increment(section['longitudeOfFirstGridPoint'], + section['longitudeOfLastGridPoint'], + section['Ni'] - 1)) + x_inc *= _GRID_ACCURACY_IN_DEGREES x_offset = section['longitudeOfFirstGridPoint'] * _GRID_ACCURACY_IN_DEGREES x_direction = -1 if scan.i_negative else 1 Ni = section['Ni'] @@ -544,7 +560,12 @@ def grid_definition_template_0_and_1(section, metadata, y_name, x_name, cs): circular = _is_circular(x_points, 360.0) # Calculate latitude points. - y_inc = section['jDirectionIncrement'] * _GRID_ACCURACY_IN_DEGREES + y_inc = (section['jDirectionIncrement'] + if res_flags.j_increments_given + else _calculate_increment(section['latitudeOfFirstGridPoint'], + section['latitudeOfLastGridPoint'], + section['Nj'] - 1)) + y_inc *= _GRID_ACCURACY_IN_DEGREES y_offset = section['latitudeOfFirstGridPoint'] * _GRID_ACCURACY_IN_DEGREES y_direction = 1 if scan.j_positive else -1 Nj = section['Nj'] @@ -1047,8 +1068,16 @@ def grid_definition_template_40_regular(section, metadata, cs): """ scan = scanning_mode(section['scanningMode']) + # Set resolution flags + res_flags = resolution_flags(section['resolutionAndComponentFlags']) + # Calculate longitude points. - x_inc = section['iDirectionIncrement'] * _GRID_ACCURACY_IN_DEGREES + x_inc = (section['iDirectionIncrement'] + if res_flags.i_increments_given + else _calculate_increment(section['longitudeOfFirstGridPoint'], + section['longitudeOfLastGridPoint'], + section['Ni'] - 1)) + x_inc *= _GRID_ACCURACY_IN_DEGREES x_offset = section['longitudeOfFirstGridPoint'] * _GRID_ACCURACY_IN_DEGREES x_direction = -1 if scan.i_negative else 1 Ni = section['Ni'] diff --git a/iris_grib/tests/unit/load_convert/test_calculate_increment.py b/iris_grib/tests/unit/load_convert/test_calculate_increment.py new file mode 100644 index 00000000..85888156 --- /dev/null +++ b/iris_grib/tests/unit/load_convert/test_calculate_increment.py @@ -0,0 +1,43 @@ +# (C) British Crown Copyright 2019, Met Office +# +# This file is part of iris-grib. +# +# iris-grib is free software: you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the +# Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# iris-grib is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with iris-grib. If not, see . +""" +Unit tests for `iris_grib._load_convert._calculate_increment`. + +""" + +from __future__ import (absolute_import, division, print_function) +from six.moves import (filter, input, map, range, zip) # noqa + +# Import iris_grib.tests first so that some things can be initialised before +# importing anything else. +import iris_grib.tests as tests + +from iris_grib._load_convert import _calculate_increment + + +class Test(tests.IrisGribTest): + def test_negative(self): + result = _calculate_increment(-15, -5, 10) + self.assertEqual(result, 1) + + def test_positive(self): + result = _calculate_increment(-5, 5, 10) + self.assertEqual(result, 1) + + +if __name__ == '__main__': + tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_0_and_1.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_0_and_1.py index 5a866caf..27f8a9b8 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_0_and_1.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_0_and_1.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2016, Met Office +# (C) British Crown Copyright 2016 - 2019, Met Office # # This file is part of iris-grib. # @@ -27,11 +27,108 @@ # before importing anything else. import iris_grib.tests as tests +import numpy as np + +import iris.coord_systems +import iris.coords + from iris.exceptions import TranslationError +from iris_grib.tests.unit.load_convert import empty_metadata + from iris_grib._load_convert import grid_definition_template_0_and_1 +class _Section(dict): + def get_computed_key(self, key): + return self.get(key) + + +class Test_resolution_flags(tests.IrisGribTest): + + def section_3(self): + section = _Section({ + 'Ni': 6, + 'Nj': 6, + 'latitudeOfFirstGridPoint': 0, + 'longitudeOfFirstGridPoint': 0, + 'resolutionAndComponentFlags': 0, + 'latitudeOfLastGridPoint': 5000000, + 'longitudeOfLastGridPoint': 5000000, + 'iDirectionIncrement': 0, + 'jDirectionIncrement': 0, + 'scanningMode': 0b01000000, + 'numberOfOctectsForNumberOfPoints': 0, + 'interpretationOfNumberOfPoints': 0, + }) + return section + + def expected(self, x_dim, y_dim, x_neg=True, y_neg=True): + # Prepare the expectation. + expected = empty_metadata() + cs = iris.coord_systems.GeogCS(6367470) + x_points = np.array([0., 1., 2., 3., 4., 5.]) + if x_neg: + x_points = x_points[::-1] + x = iris.coords.DimCoord(x_points, + standard_name='longitude', + units='degrees', + coord_system=cs) + y_points = np.array([0., 1., 2., 3., 4., 5.]) + if y_neg: + y_points = y_points[::-1] + y = iris.coords.DimCoord(y_points, + standard_name='latitude', + units='degrees', + coord_system=cs) + expected['dim_coords_and_dims'].append((y, y_dim)) + expected['dim_coords_and_dims'].append((x, x_dim)) + return expected + + def test_without_increments(self): + section = self.section_3() + metadata = empty_metadata() + cs = iris.coord_systems.GeogCS(6367470) + grid_definition_template_0_and_1(section, metadata, 'latitude', + 'longitude', cs) + expected = self.expected(1, 0, x_neg=False, y_neg=False) + self.assertEqual(metadata, expected) + + def test_with_increments(self): + section = self.section_3() + section['resolutionAndComponentFlags'] = 48 + section['iDirectionIncrement'] = 1000000 + section['jDirectionIncrement'] = 1000000 + metadata = empty_metadata() + cs = iris.coord_systems.GeogCS(6367470) + grid_definition_template_0_and_1(section, metadata, 'latitude', + 'longitude', cs) + expected = self.expected(1, 0, x_neg=False, y_neg=False) + self.assertEqual(metadata, expected) + + def test_with_i_not_j_increment(self): + section = self.section_3() + section['resolutionAndComponentFlags'] = 32 + section['iDirectionIncrement'] = 1000000 + metadata = empty_metadata() + cs = iris.coord_systems.GeogCS(6367470) + grid_definition_template_0_and_1(section, metadata, 'latitude', + 'longitude', cs) + expected = self.expected(1, 0, x_neg=False, y_neg=False) + self.assertEqual(metadata, expected) + + def test_with_j_not_i_increment(self): + section = self.section_3() + section['resolutionAndComponentFlags'] = 16 + section['jDirectionIncrement'] = 1000000 + metadata = empty_metadata() + cs = iris.coord_systems.GeogCS(6367470) + grid_definition_template_0_and_1(section, metadata, 'latitude', + 'longitude', cs) + expected = self.expected(1, 0, x_neg=False, y_neg=False) + self.assertEqual(metadata, expected) + + class Test(tests.IrisGribTest): def test_unsupported_quasi_regular__number_of_octets(self): diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_40.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_40.py index 4f8106c5..11590425 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_40.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_40.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2015 - 2017, Met Office +# (C) British Crown Copyright 2015 - 2019, Met Office # # This file is part of iris-grib. # @@ -56,6 +56,7 @@ def section_3(self): 'scaledValueOfEarthMinorAxis': MDI, 'iDirectionIncrement': 22500000, 'longitudeOfFirstGridPoint': 0, + 'resolutionAndComponentFlags': 32, 'Ni': 16, 'scanningMode': 0b01000000, 'distinctLatitudes': np.array([-73.79921363, -52.81294319, From e96949dc99f79db9ea12d93ff5a054f5c180e2c2 Mon Sep 17 00:00:00 2001 From: lbdreyer Date: Wed, 27 Nov 2019 16:24:47 +0000 Subject: [PATCH 136/583] Update license headers (#167) --- README.rst | 19 +--- iris_grib/__init__.py | 19 +--- iris_grib/_grib1_load_rules.py | 19 +--- iris_grib/_grib_cf_map.py | 19 +--- iris_grib/_iris_mercator_support.py | 19 +--- iris_grib/_load_convert.py | 19 +--- iris_grib/_save_rules.py | 19 +--- iris_grib/grib_phenom_translation.py | 19 +--- iris_grib/message.py | 19 +--- iris_grib/tests/__init__.py | 19 +--- iris_grib/tests/integration/__init__.py | 19 +--- .../integration/load_convert/__init__.py | 19 +--- .../load_convert/test_load_hybrid_coords.py | 19 +--- .../tests/integration/round_trip/__init__.py | 19 +--- .../test_WAFC_mapping_round_trip.py | 19 +--- .../test_hybrid_coords_round_trip.py | 19 +--- .../tests/integration/save_rules/__init__.py | 19 +--- .../test_grid_definition_section.py | 19 +--- .../save_rules/test_save_hybrid_coords.py | 19 +--- iris_grib/tests/test_license_headers.py | 89 +++---------------- iris_grib/tests/test_pep8.py | 19 +--- iris_grib/tests/unit/__init__.py | 19 +--- .../tests/unit/grib1_load_rules/__init__.py | 19 +--- .../grib1_load_rules/test_grib1_convert.py | 19 +--- .../unit/grib_phenom_translation/__init__.py | 19 +--- .../test_grib_phenom_translation.py | 19 +--- iris_grib/tests/unit/load_convert/__init__.py | 19 +--- .../unit/load_convert/test__hindcast_fix.py | 19 +--- .../unit/load_convert/test_bitmap_section.py | 19 +--- .../load_convert/test_calculate_increment.py | 19 +--- .../tests/unit/load_convert/test_convert.py | 19 +--- .../unit/load_convert/test_data_cutoff.py | 19 +--- .../tests/unit/load_convert/test_ellipsoid.py | 19 +--- .../load_convert/test_ellipsoid_geometry.py | 19 +--- .../load_convert/test_ensemble_identifier.py | 19 +--- .../test_fixup_float32_from_int32.py | 19 +--- .../test_fixup_int32_from_uint32.py | 19 +--- .../test_forecast_period_coord.py | 19 +--- .../load_convert/test_generating_process.py | 19 +--- .../unit/load_convert/test_grib2_convert.py | 19 +--- .../test_grid_definition_template_0_and_1.py | 19 +--- .../test_grid_definition_template_10.py | 19 +--- .../test_grid_definition_template_12.py | 19 +--- .../test_grid_definition_template_20.py | 19 +--- .../test_grid_definition_template_30.py | 19 +--- .../test_grid_definition_template_40.py | 19 +--- .../test_grid_definition_template_4_and_5.py | 19 +--- .../test_grid_definition_template_5.py | 19 +--- .../test_grid_definition_template_90.py | 19 +--- .../load_convert/test_other_time_coord.py | 19 +--- .../test_product_definition_section.py | 19 +--- .../test_product_definition_template_0.py | 19 +--- .../test_product_definition_template_1.py | 19 +--- .../test_product_definition_template_10.py | 19 +--- .../test_product_definition_template_11.py | 19 +--- .../test_product_definition_template_15.py | 19 +--- .../test_product_definition_template_31.py | 19 +--- .../test_product_definition_template_32.py | 19 +--- .../test_product_definition_template_40.py | 19 +--- .../test_product_definition_template_8.py | 19 +--- .../test_product_definition_template_9.py | 19 +--- .../load_convert/test_projection_centre.py | 19 +--- .../load_convert/test_reference_time_coord.py | 19 +--- .../load_convert/test_resolution_flags.py | 19 +--- .../load_convert/test_satellite_common.py | 19 +--- .../unit/load_convert/test_scanning_mode.py | 19 +--- .../test_statistical_cell_method.py | 19 +--- .../test_statistical_forecast_period_coord.py | 19 +--- .../unit/load_convert/test_time_range_unit.py | 19 +--- .../load_convert/test_translate_phenomenon.py | 19 +--- .../tests/unit/load_convert/test_unscale.py | 19 +--- .../load_convert/test_validity_time_coord.py | 19 +--- .../unit/load_convert/test_vertical_coords.py | 19 +--- iris_grib/tests/unit/message/__init__.py | 19 +--- .../tests/unit/message/test_GribMessage.py | 19 +--- iris_grib/tests/unit/message/test_Section.py | 19 +--- .../tests/unit/message/test__DataProxy.py | 19 +--- .../unit/message/test__MessageLocation.py | 19 +--- .../unit/message/test__RawGribMessage.py | 19 +--- iris_grib/tests/unit/save_rules/__init__.py | 19 +--- .../test__missing_forecast_period.py | 19 +--- .../test__non_missing_forecast_period.py | 19 +--- ...product_definition_template_8_10_and_11.py | 19 +--- .../unit/save_rules/test_data_section.py | 19 +--- .../save_rules/test_fixup_float32_as_int32.py | 19 +--- .../save_rules/test_fixup_int32_as_uint32.py | 19 +--- .../test_grid_definition_template_0.py | 19 +--- .../test_grid_definition_template_1.py | 19 +--- .../test_grid_definition_template_10.py | 19 +--- .../test_grid_definition_template_12.py | 19 +--- .../test_grid_definition_template_30.py | 19 +--- .../test_grid_definition_template_4.py | 19 +--- .../test_grid_definition_template_5.py | 19 +--- .../unit/save_rules/test_identification.py | 19 +--- .../test_product_definition_template_1.py | 19 +--- .../test_product_definition_template_10.py | 19 +--- .../test_product_definition_template_11.py | 19 +--- .../test_product_definition_template_15.py | 19 +--- .../test_product_definition_template_40.py | 19 +--- .../test_product_definition_template_8.py | 19 +--- .../unit/save_rules/test_reference_time.py | 19 +--- .../save_rules/test_set_fixed_surfaces.py | 19 +--- .../save_rules/test_set_time_increment.py | 19 +--- .../unit/save_rules/test_set_time_range.py | 19 +--- iris_grib/tests/unit/test_GribWrapper.py | 19 +--- iris_grib/tests/unit/test__load_generate.py | 19 +--- iris_grib/tests/unit/test_load_cubes.py | 19 +--- iris_grib/tests/unit/test_save_grib2.py | 19 +--- iris_grib/tests/unit/test_save_messages.py | 19 +--- 109 files changed, 445 insertions(+), 1696 deletions(-) diff --git a/README.rst b/README.rst index ff31cc6b..e573a6a5 100644 --- a/README.rst +++ b/README.rst @@ -14,23 +14,10 @@ files. Copyright and licence --------------------- +iris-grib may be freely distributed, modified and used commercially under the +terms of its `GNU LGPLv3 license `_. -\(C) British Crown Copyright 2010 - 2016, Met Office - -This file is part of iris-grib. - -iris-grib is free software: you can redistribute it and/or modify it under -the terms of the GNU Lesser General Public License as published by the -Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -iris-grib is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with iris-grib. If not, see ``_. +\(C) British Crown Copyright 2010 - 2019, Met Office .. |Travis| image:: https://travis-ci.org/SciTools/iris-grib.svg?branch=master .. _Travis: https://travis-ci.org/SciTools/iris-grib diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index 50c3be43..0566ce8e 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2010 - 2019, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """ Conversion of cubes to/from GRIB. diff --git a/iris_grib/_grib1_load_rules.py b/iris_grib/_grib1_load_rules.py index 2b7748b0..9059860f 100644 --- a/iris_grib/_grib1_load_rules.py +++ b/iris_grib/_grib1_load_rules.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2013 - 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. from __future__ import (absolute_import, division, print_function) from six.moves import (filter, input, map, range, zip) # noqa diff --git a/iris_grib/_grib_cf_map.py b/iris_grib/_grib_cf_map.py index 4f262c8e..1c6275b1 100644 --- a/iris_grib/_grib_cf_map.py +++ b/iris_grib/_grib_cf_map.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2013 - 2019, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. # # DO NOT EDIT: AUTO-GENERATED # Created on 22 May 2019 13:05 from diff --git a/iris_grib/_iris_mercator_support.py b/iris_grib/_iris_mercator_support.py index d60fdeff..2b7ffece 100644 --- a/iris_grib/_iris_mercator_support.py +++ b/iris_grib/_iris_mercator_support.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2018, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """ Temporary module to check for the extended Mercator class in Iris, which iris-grib requires for its Mercator support. diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index cfeffa52..2dc35415 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2019, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """ Module to support the loading and convertion of a GRIB2 message into cube metadata. diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index 8cc506f4..ab8a3a67 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2010 - 2019, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """ Grib save implementation. diff --git a/iris_grib/grib_phenom_translation.py b/iris_grib/grib_phenom_translation.py index 743ece8c..73e3091e 100644 --- a/iris_grib/grib_phenom_translation.py +++ b/iris_grib/grib_phenom_translation.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2013 - 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. ''' Provide grib 1 and 2 phenomenon translations to + from CF terms. diff --git a/iris_grib/message.py b/iris_grib/message.py index eca42223..23362676 100644 --- a/iris_grib/message.py +++ b/iris_grib/message.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2019, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """ Defines a lightweight wrapper class to wrap a single GRIB message. diff --git a/iris_grib/tests/__init__.py b/iris_grib/tests/__init__.py index d8e2ef0a..50735937 100644 --- a/iris_grib/tests/__init__.py +++ b/iris_grib/tests/__init__.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2010 - 2018, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """ Provides testing capabilities and customisations specific to iris-grib. diff --git a/iris_grib/tests/integration/__init__.py b/iris_grib/tests/integration/__init__.py index dcaa2b72..c610fb77 100644 --- a/iris_grib/tests/integration/__init__.py +++ b/iris_grib/tests/integration/__init__.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2018, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """Integration tests for the :mod:`iris_grib` package.""" from __future__ import (absolute_import, division, print_function) diff --git a/iris_grib/tests/integration/load_convert/__init__.py b/iris_grib/tests/integration/load_convert/__init__.py index 768f6918..85000b06 100644 --- a/iris_grib/tests/integration/load_convert/__init__.py +++ b/iris_grib/tests/integration/load_convert/__init__.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2018, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """Integration tests for the :mod:`iris_grib._load_convert` package.""" from __future__ import (absolute_import, division, print_function) diff --git a/iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py b/iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py index 1040a814..36201940 100644 --- a/iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py +++ b/iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2018, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """ Integration test for loading hybrid height data. diff --git a/iris_grib/tests/integration/round_trip/__init__.py b/iris_grib/tests/integration/round_trip/__init__.py index feb16d2a..eb405acc 100644 --- a/iris_grib/tests/integration/round_trip/__init__.py +++ b/iris_grib/tests/integration/round_trip/__init__.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2018, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """Round-trip integration tests for the :mod:`iris-grib` package.""" from __future__ import (absolute_import, division, print_function) diff --git a/iris_grib/tests/integration/round_trip/test_WAFC_mapping_round_trip.py b/iris_grib/tests/integration/round_trip/test_WAFC_mapping_round_trip.py index c91cd1b4..f21f17d0 100644 --- a/iris_grib/tests/integration/round_trip/test_WAFC_mapping_round_trip.py +++ b/iris_grib/tests/integration/round_trip/test_WAFC_mapping_round_trip.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2018, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """ Integration test for round-trip loading and saving of hybrid height and hybrid pressure cubes. diff --git a/iris_grib/tests/integration/round_trip/test_hybrid_coords_round_trip.py b/iris_grib/tests/integration/round_trip/test_hybrid_coords_round_trip.py index 817304b7..d15afa0e 100644 --- a/iris_grib/tests/integration/round_trip/test_hybrid_coords_round_trip.py +++ b/iris_grib/tests/integration/round_trip/test_hybrid_coords_round_trip.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2018, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """ Integration test for round-trip loading and saving of hybrid height and hybrid pressure cubes. diff --git a/iris_grib/tests/integration/save_rules/__init__.py b/iris_grib/tests/integration/save_rules/__init__.py index e017b7c0..ac8b2425 100644 --- a/iris_grib/tests/integration/save_rules/__init__.py +++ b/iris_grib/tests/integration/save_rules/__init__.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2018, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 :mod:`iris_grib._save_rules` package.""" from __future__ import (absolute_import, division, print_function) diff --git a/iris_grib/tests/integration/save_rules/test_grid_definition_section.py b/iris_grib/tests/integration/save_rules/test_grid_definition_section.py index bcfb6246..f3fd605e 100644 --- a/iris_grib/tests/integration/save_rules/test_grid_definition_section.py +++ b/iris_grib/tests/integration/save_rules/test_grid_definition_section.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2018, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """ Integration tests for :func:`iris_grib._save_rules.grid_definition_section` to confirm that the correct grid_definition_template is being selected. diff --git a/iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py b/iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py index 902c3cf9..161e3022 100644 --- a/iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py +++ b/iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2018, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 :func:`iris_grib._save_rules.data_section`. diff --git a/iris_grib/tests/test_license_headers.py b/iris_grib/tests/test_license_headers.py index 08781e30..8af960b4 100644 --- a/iris_grib/tests/test_license_headers.py +++ b/iris_grib/tests/test_license_headers.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 iris-grib license header conformance. @@ -32,62 +21,19 @@ import iris_grib -LICENSE_TEMPLATE = """ -# (C) British Crown Copyright {YEARS}, Met Office -# -# This file is part of iris-grib. +LICENSE_TEMPLATE = """# Copyright iris-grib contributors # -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see .""".strip() - -LICENSE_RE_PATTERN = re.escape(LICENSE_TEMPLATE).replace('\{YEARS\}', '(.*?)') -# Add shebang possibility to the LICENSE_RE_PATTERN -LICENSE_RE_PATTERN = r'(\#\!.*\n)?' + LICENSE_RE_PATTERN -LICENSE_RE = re.compile(LICENSE_RE_PATTERN, re.MULTILINE) +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details.""" -# Guess iris repo directory of Iris - realpath is used to mitigate against -# Python finding the iris package via a symlink. +# Guess iris-grib repo directory of Iris-grib - realpath is used to mitigate +# against Python finding the iris-grib package via a symlink. IRIS_GRIB_DIR = os.path.realpath(os.path.dirname(iris_grib.__file__)) REPO_DIR = os.path.dirname(IRIS_GRIB_DIR) class TestLicenseHeaders(unittest.TestCase): - @staticmethod - def years_of_license_in_file(fh): - """ - Using :data:`LICENSE_RE` look for the years defined in the license - header of the given file handle. - - If the license cannot be found in the given fh, None will be returned, - else a tuple of (start_year, end_year) will be returned. - - """ - license_matches = LICENSE_RE.match(fh.read()) - if not license_matches: - # no license found in file. - return None - - years = license_matches.groups()[-1] - if len(years) == 4: - start_year = end_year = int(years) - elif len(years) == 11: - start_year, end_year = int(years[:4]), int(years[7:]) - else: - fname = getattr(fh, 'name', 'unknown filename') - raise ValueError("Unexpected year(s) string in {}'s copyright " - "notice: {!r}".format(fname, years)) - return (start_year, end_year) - @staticmethod def whatchanged_parse(whatchanged_output): """ @@ -164,17 +110,10 @@ def test_license_headers(self): if full_fname.endswith('.py') and os.path.isfile(full_fname) and \ not any(fnmatch(fname, pat) for pat in exclude_patterns): with open(full_fname) as fh: - years = TestLicenseHeaders.years_of_license_in_file(fh) - if years is None: - print('The file {} has no valid header license and ' - 'has not been excluded from the license header ' - 'test.'.format(fname)) - failed = True - elif last_change.year > years[1]: - print('The file header at {} is out of date. The last' - ' commit was in {}, but the copyright states it' - ' was {}.'.format(fname, last_change.year, - years[1])) + content = fh.read() + if not content.startswith(LICENSE_TEMPLATE): + print('The file {} does not start with the required ' + 'license header.'.format(fname)) failed = True if failed: diff --git a/iris_grib/tests/test_pep8.py b/iris_grib/tests/test_pep8.py index e6180bb5..13bafb1b 100644 --- a/iris_grib/tests/test_pep8.py +++ b/iris_grib/tests/test_pep8.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2013 - 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 iris-grib pep8 conformance. diff --git a/iris_grib/tests/unit/__init__.py b/iris_grib/tests/unit/__init__.py index 3fe0103d..54eb86f0 100644 --- a/iris_grib/tests/unit/__init__.py +++ b/iris_grib/tests/unit/__init__.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2013 - 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 :mod:`iris_grib` package.""" from __future__ import (absolute_import, division, print_function) diff --git a/iris_grib/tests/unit/grib1_load_rules/__init__.py b/iris_grib/tests/unit/grib1_load_rules/__init__.py index 3e5a47cd..ae53ab2d 100644 --- a/iris_grib/tests/unit/grib1_load_rules/__init__.py +++ b/iris_grib/tests/unit/grib1_load_rules/__init__.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2013 - 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 :mod:`iris_grib._grib1_load_rules` module.""" from __future__ import (absolute_import, division, print_function) diff --git a/iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py b/iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py index 9224b176..2ff01c22 100644 --- a/iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py +++ b/iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2013 - 2017, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 :func:`iris_grib._grib1_load_rules.grib1_convert`.""" from __future__ import (absolute_import, division, print_function) diff --git a/iris_grib/tests/unit/grib_phenom_translation/__init__.py b/iris_grib/tests/unit/grib_phenom_translation/__init__.py index 6e899f95..1b7780d7 100644 --- a/iris_grib/tests/unit/grib_phenom_translation/__init__.py +++ b/iris_grib/tests/unit/grib_phenom_translation/__init__.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 :mod:`iris_grib.grib_phenom_translation` package.""" from __future__ import (absolute_import, division, print_function) diff --git a/iris_grib/tests/unit/grib_phenom_translation/test_grib_phenom_translation.py b/iris_grib/tests/unit/grib_phenom_translation/test_grib_phenom_translation.py index 0b897469..296e4589 100644 --- a/iris_grib/tests/unit/grib_phenom_translation/test_grib_phenom_translation.py +++ b/iris_grib/tests/unit/grib_phenom_translation/test_grib_phenom_translation.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 mod:`iris_grib.grib_phenom_translation` module. diff --git a/iris_grib/tests/unit/load_convert/__init__.py b/iris_grib/tests/unit/load_convert/__init__.py index 99f46f25..154f7499 100644 --- a/iris_grib/tests/unit/load_convert/__init__.py +++ b/iris_grib/tests/unit/load_convert/__init__.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 :mod:`iris_grib._load_convert` package.""" from __future__ import (absolute_import, division, print_function) diff --git a/iris_grib/tests/unit/load_convert/test__hindcast_fix.py b/iris_grib/tests/unit/load_convert/test__hindcast_fix.py index 8021119c..baa5e710 100644 --- a/iris_grib/tests/unit/load_convert/test__hindcast_fix.py +++ b/iris_grib/tests/unit/load_convert/test__hindcast_fix.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """ Tests for function :func:`iris_grib._load_convert._hindcast_fix`. diff --git a/iris_grib/tests/unit/load_convert/test_bitmap_section.py b/iris_grib/tests/unit/load_convert/test_bitmap_section.py index ddf424d5..9576c2b1 100644 --- a/iris_grib/tests/unit/load_convert/test_bitmap_section.py +++ b/iris_grib/tests/unit/load_convert/test_bitmap_section.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """ Test function :func:`iris_grib._load_convert.bitmap_section.` diff --git a/iris_grib/tests/unit/load_convert/test_calculate_increment.py b/iris_grib/tests/unit/load_convert/test_calculate_increment.py index 85888156..fe5eaa6e 100644 --- a/iris_grib/tests/unit/load_convert/test_calculate_increment.py +++ b/iris_grib/tests/unit/load_convert/test_calculate_increment.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2019, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 `iris_grib._load_convert._calculate_increment`. diff --git a/iris_grib/tests/unit/load_convert/test_convert.py b/iris_grib/tests/unit/load_convert/test_convert.py index 23090980..013eda59 100644 --- a/iris_grib/tests/unit/load_convert/test_convert.py +++ b/iris_grib/tests/unit/load_convert/test_convert.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """Test function :func:`iris_grib._load_convert.convert`.""" from __future__ import (absolute_import, division, print_function) diff --git a/iris_grib/tests/unit/load_convert/test_data_cutoff.py b/iris_grib/tests/unit/load_convert/test_data_cutoff.py index 3ddb1c05..f3560c15 100644 --- a/iris_grib/tests/unit/load_convert/test_data_cutoff.py +++ b/iris_grib/tests/unit/load_convert/test_data_cutoff.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """ Tests for function :func:`iris_grib._load_convert.data_cutoff`. diff --git a/iris_grib/tests/unit/load_convert/test_ellipsoid.py b/iris_grib/tests/unit/load_convert/test_ellipsoid.py index ed1d0eba..d6b43d91 100644 --- a/iris_grib/tests/unit/load_convert/test_ellipsoid.py +++ b/iris_grib/tests/unit/load_convert/test_ellipsoid.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2017, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """ Test function :func:`iris_grib._load_convert.ellipsoid. diff --git a/iris_grib/tests/unit/load_convert/test_ellipsoid_geometry.py b/iris_grib/tests/unit/load_convert/test_ellipsoid_geometry.py index 90a12a5b..f7bc3ecc 100644 --- a/iris_grib/tests/unit/load_convert/test_ellipsoid_geometry.py +++ b/iris_grib/tests/unit/load_convert/test_ellipsoid_geometry.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """ Test function :func:`iris_grib._load_convert.ellipsoid_geometry. diff --git a/iris_grib/tests/unit/load_convert/test_ensemble_identifier.py b/iris_grib/tests/unit/load_convert/test_ensemble_identifier.py index 0e7b3d57..1116b073 100644 --- a/iris_grib/tests/unit/load_convert/test_ensemble_identifier.py +++ b/iris_grib/tests/unit/load_convert/test_ensemble_identifier.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """ Test function :func:`iris_grib._load_convert.ensemble_identifier`. diff --git a/iris_grib/tests/unit/load_convert/test_fixup_float32_from_int32.py b/iris_grib/tests/unit/load_convert/test_fixup_float32_from_int32.py index cb30b872..698eca3e 100644 --- a/iris_grib/tests/unit/load_convert/test_fixup_float32_from_int32.py +++ b/iris_grib/tests/unit/load_convert/test_fixup_float32_from_int32.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 `iris_grib._load_convert.fixup_float32_from_int32`. diff --git a/iris_grib/tests/unit/load_convert/test_fixup_int32_from_uint32.py b/iris_grib/tests/unit/load_convert/test_fixup_int32_from_uint32.py index 4024b9d6..76e93ac5 100644 --- a/iris_grib/tests/unit/load_convert/test_fixup_int32_from_uint32.py +++ b/iris_grib/tests/unit/load_convert/test_fixup_int32_from_uint32.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 `iris_grib._load_convert.fixup_int32_from_uint32`. diff --git a/iris_grib/tests/unit/load_convert/test_forecast_period_coord.py b/iris_grib/tests/unit/load_convert/test_forecast_period_coord.py index fefa8ddf..3adcb10a 100644 --- a/iris_grib/tests/unit/load_convert/test_forecast_period_coord.py +++ b/iris_grib/tests/unit/load_convert/test_forecast_period_coord.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """ Test function :func:`iris_grib._load_convert.forecast_period_coord. diff --git a/iris_grib/tests/unit/load_convert/test_generating_process.py b/iris_grib/tests/unit/load_convert/test_generating_process.py index 97fac5ac..12dc294b 100644 --- a/iris_grib/tests/unit/load_convert/test_generating_process.py +++ b/iris_grib/tests/unit/load_convert/test_generating_process.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2017, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """ Tests for function :func:`iris_grib._load_convert.generating_process`. diff --git a/iris_grib/tests/unit/load_convert/test_grib2_convert.py b/iris_grib/tests/unit/load_convert/test_grib2_convert.py index fdd8ae32..fe0d63a6 100644 --- a/iris_grib/tests/unit/load_convert/test_grib2_convert.py +++ b/iris_grib/tests/unit/load_convert/test_grib2_convert.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """Test function :func:`iris_grib._load_convert.grib2_convert`.""" from __future__ import (absolute_import, division, print_function) diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_0_and_1.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_0_and_1.py index 27f8a9b8..276e09f9 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_0_and_1.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_0_and_1.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2016 - 2019, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """ Test function :func:`iris_grib._load_convert.grid_definition_template_0_and_1`. diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_10.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_10.py index 873c6324..59acd657 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_10.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_10.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2018, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 :func:`iris_grib._load_convert.grid_definition_template_10`. diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_12.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_12.py index c77b54f4..09f2a6e2 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_12.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_12.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2017, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 :func:`iris_grib._load_convert.grid_definition_template_12`. diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_20.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_20.py index 8339c875..789063cc 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_20.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_20.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2016 - 2018, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 :func:`iris_grib._load_convert.grid_definition_template_20`. diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_30.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_30.py index 89ceab75..5e51e981 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_30.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_30.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2016 - 2018, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 :func:`iris_grib._load_convert.grid_definition_template_30`. diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_40.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_40.py index 11590425..cca82ad6 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_40.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_40.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2015 - 2019, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 :func:`iris_grib._load_convert.grid_definition_template_40`. diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_4_and_5.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_4_and_5.py index 0f293623..3d5cfc0e 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_4_and_5.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_4_and_5.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """ Test function :func:`iris_grib._load_convert.grid_definition_template_4_and_5`. diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_5.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_5.py index b5d8e010..46ccf6ae 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_5.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_5.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """ Test function :func:`iris_grib._load_convert.grid_definition_template_5`. diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_90.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_90.py index 5dc992b9..1b35c380 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_90.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_90.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2017, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 :func:`iris_grib._load_convert.grid_definition_template_90`. diff --git a/iris_grib/tests/unit/load_convert/test_other_time_coord.py b/iris_grib/tests/unit/load_convert/test_other_time_coord.py index e6b210f8..13fa41da 100644 --- a/iris_grib/tests/unit/load_convert/test_other_time_coord.py +++ b/iris_grib/tests/unit/load_convert/test_other_time_coord.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """ Test function :func:`iris_grib._load_convert.other_time_coord. diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_section.py b/iris_grib/tests/unit/load_convert/test_product_definition_section.py index 6dec6803..96ab478d 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_section.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_section.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2019, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """ Tests for `iris_grib._load_convert.product_definition_section`. diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_0.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_0.py index 2c8d2d36..88121153 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_0.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_0.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2017, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """ Test function :func:`iris_grib._load_convert.product_definition_template_0`. diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_1.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_1.py index 06135931..b508a5b1 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_1.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_1.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """ Test function :func:`iris_grib._load_convert.product_definition_template_1`. diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_10.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_10.py index 0e4de1af..4af7b6a6 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_10.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_10.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2016 - 2017, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """ Test function :func:`iris_grib._load_convert.product_definition_template_10`. diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_11.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_11.py index a97b7ad9..ee726d64 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_11.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_11.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2016 - 2017, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """ Test function :func:`iris_grib._load_convert.product_definition_template_11`. diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py index 951e8f41..009f1e53 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2018, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """ Test function :func:`iris_grib._load_convert.product_definition_template_15`. diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_31.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_31.py index c11bb8c3..2012a878 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_31.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_31.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2019, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """ Tests for `iris_grib._load_convert.product_definition_template_31`. diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_32.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_32.py index b8b3193c..715e9d8a 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_32.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_32.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2017, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """ Tests for `iris_grib._load_convert.product_definition_template_32`. diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_40.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_40.py index d8f784fe..ca14c8d3 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_40.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_40.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """ Test function :func:`iris_grib._load_convert.product_definition_template_40`. diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_8.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_8.py index 13a6db80..1422b4d1 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_8.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_8.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """ Tests for function :func:`iris_grib._load_convert.product_definition_template_8`. diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_9.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_9.py index acbb49b0..d6b56be9 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_9.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_9.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """ Tests for function :func:`iris_grib._load_convert.product_definition_template_9`. diff --git a/iris_grib/tests/unit/load_convert/test_projection_centre.py b/iris_grib/tests/unit/load_convert/test_projection_centre.py index 618419fd..a6df7546 100644 --- a/iris_grib/tests/unit/load_convert/test_projection_centre.py +++ b/iris_grib/tests/unit/load_convert/test_projection_centre.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """ Test function :func:`iris_grib._load_convert.projection centre. diff --git a/iris_grib/tests/unit/load_convert/test_reference_time_coord.py b/iris_grib/tests/unit/load_convert/test_reference_time_coord.py index af5d17d6..4558f7ec 100644 --- a/iris_grib/tests/unit/load_convert/test_reference_time_coord.py +++ b/iris_grib/tests/unit/load_convert/test_reference_time_coord.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2017, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """ Test function :func:`iris_grib._load_convert.reference_time_coord. diff --git a/iris_grib/tests/unit/load_convert/test_resolution_flags.py b/iris_grib/tests/unit/load_convert/test_resolution_flags.py index 7384dce0..84e10688 100644 --- a/iris_grib/tests/unit/load_convert/test_resolution_flags.py +++ b/iris_grib/tests/unit/load_convert/test_resolution_flags.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """ Test function :func:`iris_grib._load_convert.resolution_flags.` diff --git a/iris_grib/tests/unit/load_convert/test_satellite_common.py b/iris_grib/tests/unit/load_convert/test_satellite_common.py index bb82c94a..790e3853 100644 --- a/iris_grib/tests/unit/load_convert/test_satellite_common.py +++ b/iris_grib/tests/unit/load_convert/test_satellite_common.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2017, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """ Tests for `iris_grib._load_convert.satellite_common`. diff --git a/iris_grib/tests/unit/load_convert/test_scanning_mode.py b/iris_grib/tests/unit/load_convert/test_scanning_mode.py index be2afcf6..1d00a061 100644 --- a/iris_grib/tests/unit/load_convert/test_scanning_mode.py +++ b/iris_grib/tests/unit/load_convert/test_scanning_mode.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """ Test function :func:`iris_grib._load_convert.scanning_mode. diff --git a/iris_grib/tests/unit/load_convert/test_statistical_cell_method.py b/iris_grib/tests/unit/load_convert/test_statistical_cell_method.py index 69d7f1f7..29389fd0 100644 --- a/iris_grib/tests/unit/load_convert/test_statistical_cell_method.py +++ b/iris_grib/tests/unit/load_convert/test_statistical_cell_method.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2017, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """ Tests for function :func:`iris_grib._load_convert.statistical_cell_method`. diff --git a/iris_grib/tests/unit/load_convert/test_statistical_forecast_period_coord.py b/iris_grib/tests/unit/load_convert/test_statistical_forecast_period_coord.py index 7a6593bd..9fec8303 100644 --- a/iris_grib/tests/unit/load_convert/test_statistical_forecast_period_coord.py +++ b/iris_grib/tests/unit/load_convert/test_statistical_forecast_period_coord.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """ Tests for function :func:`iris_grib._load_convert.statistical_forecast_period`. diff --git a/iris_grib/tests/unit/load_convert/test_time_range_unit.py b/iris_grib/tests/unit/load_convert/test_time_range_unit.py index 6a1a0d34..33ddcb9f 100644 --- a/iris_grib/tests/unit/load_convert/test_time_range_unit.py +++ b/iris_grib/tests/unit/load_convert/test_time_range_unit.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """ Test function :func:`iris_grib._load_convert.time_range_unit. diff --git a/iris_grib/tests/unit/load_convert/test_translate_phenomenon.py b/iris_grib/tests/unit/load_convert/test_translate_phenomenon.py index dbb6f90a..10bd30fd 100644 --- a/iris_grib/tests/unit/load_convert/test_translate_phenomenon.py +++ b/iris_grib/tests/unit/load_convert/test_translate_phenomenon.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2018, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """ Tests for function :func:`iris_grib._load_convert.translate_phenomenon`. diff --git a/iris_grib/tests/unit/load_convert/test_unscale.py b/iris_grib/tests/unit/load_convert/test_unscale.py index bce5d8f5..3d879494 100644 --- a/iris_grib/tests/unit/load_convert/test_unscale.py +++ b/iris_grib/tests/unit/load_convert/test_unscale.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2017, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """ Test function :func:`iris_grib._load_convert.unscale. diff --git a/iris_grib/tests/unit/load_convert/test_validity_time_coord.py b/iris_grib/tests/unit/load_convert/test_validity_time_coord.py index 9af4841b..3a9b049e 100644 --- a/iris_grib/tests/unit/load_convert/test_validity_time_coord.py +++ b/iris_grib/tests/unit/load_convert/test_validity_time_coord.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """ Test function :func:`iris_grib._load_convert.validity_time_coord. diff --git a/iris_grib/tests/unit/load_convert/test_vertical_coords.py b/iris_grib/tests/unit/load_convert/test_vertical_coords.py index ae66d4d7..5edf96f3 100644 --- a/iris_grib/tests/unit/load_convert/test_vertical_coords.py +++ b/iris_grib/tests/unit/load_convert/test_vertical_coords.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2018, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. """ Test function :func:`iris_grib._load_convert.vertical_coords`. diff --git a/iris_grib/tests/unit/message/__init__.py b/iris_grib/tests/unit/message/__init__.py index c3a2c938..9f5fa1be 100644 --- a/iris_grib/tests/unit/message/__init__.py +++ b/iris_grib/tests/unit/message/__init__.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 :mod:`iris_grib.message` package.""" from __future__ import (absolute_import, division, print_function) diff --git a/iris_grib/tests/unit/message/test_GribMessage.py b/iris_grib/tests/unit/message/test_GribMessage.py index 9b49932a..535f4f8a 100644 --- a/iris_grib/tests/unit/message/test_GribMessage.py +++ b/iris_grib/tests/unit/message/test_GribMessage.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2017, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 `iris_grib.message.GribMessage` class. diff --git a/iris_grib/tests/unit/message/test_Section.py b/iris_grib/tests/unit/message/test_Section.py index 98e81511..aa6a59e8 100644 --- a/iris_grib/tests/unit/message/test_Section.py +++ b/iris_grib/tests/unit/message/test_Section.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 `iris_grib.message.Section`. diff --git a/iris_grib/tests/unit/message/test__DataProxy.py b/iris_grib/tests/unit/message/test__DataProxy.py index 313c326b..069ddda7 100644 --- a/iris_grib/tests/unit/message/test__DataProxy.py +++ b/iris_grib/tests/unit/message/test__DataProxy.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2017, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 `iris.message._DataProxy` class. diff --git a/iris_grib/tests/unit/message/test__MessageLocation.py b/iris_grib/tests/unit/message/test__MessageLocation.py index cc6b9147..9ab925a7 100644 --- a/iris_grib/tests/unit/message/test__MessageLocation.py +++ b/iris_grib/tests/unit/message/test__MessageLocation.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 `iris.message._MessageLocation` class. diff --git a/iris_grib/tests/unit/message/test__RawGribMessage.py b/iris_grib/tests/unit/message/test__RawGribMessage.py index fae0a652..0adf9152 100644 --- a/iris_grib/tests/unit/message/test__RawGribMessage.py +++ b/iris_grib/tests/unit/message/test__RawGribMessage.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 `iris_grib.message._RawGribMessage` class. diff --git a/iris_grib/tests/unit/save_rules/__init__.py b/iris_grib/tests/unit/save_rules/__init__.py index 988f1ba9..27d78847 100644 --- a/iris_grib/tests/unit/save_rules/__init__.py +++ b/iris_grib/tests/unit/save_rules/__init__.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2013 - 2018, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 :mod:`iris_grib.grib_save_rules` module.""" from __future__ import (absolute_import, division, print_function) diff --git a/iris_grib/tests/unit/save_rules/test__missing_forecast_period.py b/iris_grib/tests/unit/save_rules/test__missing_forecast_period.py index b7932e88..e46d1356 100644 --- a/iris_grib/tests/unit/save_rules/test__missing_forecast_period.py +++ b/iris_grib/tests/unit/save_rules/test__missing_forecast_period.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2013 - 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 :func:`iris_grib._save_rules._missing_forecast_period.` diff --git a/iris_grib/tests/unit/save_rules/test__non_missing_forecast_period.py b/iris_grib/tests/unit/save_rules/test__non_missing_forecast_period.py index f302bb67..6d40f369 100644 --- a/iris_grib/tests/unit/save_rules/test__non_missing_forecast_period.py +++ b/iris_grib/tests/unit/save_rules/test__non_missing_forecast_period.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2013 - 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 module-level functions.""" from __future__ import (absolute_import, division, print_function) diff --git a/iris_grib/tests/unit/save_rules/test__product_definition_template_8_10_and_11.py b/iris_grib/tests/unit/save_rules/test__product_definition_template_8_10_and_11.py index f0b00dfc..7de3fe52 100644 --- a/iris_grib/tests/unit/save_rules/test__product_definition_template_8_10_and_11.py +++ b/iris_grib/tests/unit/save_rules/test__product_definition_template_8_10_and_11.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2013 - 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 :func:`iris_grib._save_rules._product_definition_template_8_10_and_11` diff --git a/iris_grib/tests/unit/save_rules/test_data_section.py b/iris_grib/tests/unit/save_rules/test_data_section.py index d37e727a..a286fcdd 100644 --- a/iris_grib/tests/unit/save_rules/test_data_section.py +++ b/iris_grib/tests/unit/save_rules/test_data_section.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2017, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 :func:`iris_grib._save_rules.data_section`. diff --git a/iris_grib/tests/unit/save_rules/test_fixup_float32_as_int32.py b/iris_grib/tests/unit/save_rules/test_fixup_float32_as_int32.py index 6a857911..a39a186f 100644 --- a/iris_grib/tests/unit/save_rules/test_fixup_float32_as_int32.py +++ b/iris_grib/tests/unit/save_rules/test_fixup_float32_as_int32.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 `iris_grib._save_rules.fixup_float32_as_int32`. diff --git a/iris_grib/tests/unit/save_rules/test_fixup_int32_as_uint32.py b/iris_grib/tests/unit/save_rules/test_fixup_int32_as_uint32.py index fd37daf5..a07a3d88 100644 --- a/iris_grib/tests/unit/save_rules/test_fixup_int32_as_uint32.py +++ b/iris_grib/tests/unit/save_rules/test_fixup_int32_as_uint32.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 `iris_grib._save_rules.fixup_int32_as_uint32`. diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_0.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_0.py index d2cf4b75..855c36f5 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_template_0.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_0.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2017, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 :meth:`iris_grib._save_rules.grid_definition_template_0`. diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_1.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_1.py index b8281d92..b3bdb20a 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_template_1.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_1.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2017, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 :meth:`iris_grib._save_rules.grid_definition_template_1`. diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py index ee639a1f..28014ba1 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2018, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 :meth:`iris_grib._save_rules.grid_definition_template_10`. diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_12.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_12.py index 0e191272..5d4d5796 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_template_12.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_12.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 :meth:`iris_grib._save_rules.grid_definition_template_12`. diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_30.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_30.py index 9cd6aaa7..0f8801d0 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_template_30.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_30.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2017, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 :meth:`iris_grib._save_rules.grid_definition_template_30`. diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_4.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_4.py index 0d2a32b1..4dd4fbc0 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_template_4.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_4.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2018, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 :func:`iris_grib._save_rules.grid_definition_template_4`. diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_5.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_5.py index b9ccf8e5..d750e988 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_template_5.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_5.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 :meth:`iris_grib._save_rules.grid_definition_template_5`. diff --git a/iris_grib/tests/unit/save_rules/test_identification.py b/iris_grib/tests/unit/save_rules/test_identification.py index 6903800f..4089f270 100644 --- a/iris_grib/tests/unit/save_rules/test_identification.py +++ b/iris_grib/tests/unit/save_rules/test_identification.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 `iris_grib.grib_save_rules.identification`.""" from __future__ import (absolute_import, division, print_function) diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_1.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_1.py index d951e9fe..f3543375 100644 --- a/iris_grib/tests/unit/save_rules/test_product_definition_template_1.py +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_1.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 :func:`iris_grib._save_rules.product_definition_template_1` diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_10.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_10.py index ad824af8..20174acd 100644 --- a/iris_grib/tests/unit/save_rules/test_product_definition_template_10.py +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_10.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2013 - 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 :func:`iris_grib._save_rules.product_definition_template_10` diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_11.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_11.py index dc15de16..62e28ece 100644 --- a/iris_grib/tests/unit/save_rules/test_product_definition_template_11.py +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_11.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2013 - 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 :func:`iris_grib._save_rules.product_definition_template_11` diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py index db902116..c552f560 100644 --- a/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2018, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 :func:`iris_grib._save_rules.product_definition_template_15` diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_40.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_40.py index 2aafa2da..bbe55470 100644 --- a/iris_grib/tests/unit/save_rules/test_product_definition_template_40.py +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_40.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 :func:`iris_grib._save_rules.product_definition_template_40` diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_8.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_8.py index eefad842..853b8b72 100644 --- a/iris_grib/tests/unit/save_rules/test_product_definition_template_8.py +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_8.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2013 - 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 :func:`iris_grib._save_rules.product_definition_template_8` diff --git a/iris_grib/tests/unit/save_rules/test_reference_time.py b/iris_grib/tests/unit/save_rules/test_reference_time.py index 9b777133..3dad0f2c 100644 --- a/iris_grib/tests/unit/save_rules/test_reference_time.py +++ b/iris_grib/tests/unit/save_rules/test_reference_time.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2013 - 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 `iris_grib.grib_save_rules.reference_time`.""" from __future__ import (absolute_import, division, print_function) diff --git a/iris_grib/tests/unit/save_rules/test_set_fixed_surfaces.py b/iris_grib/tests/unit/save_rules/test_set_fixed_surfaces.py index 1cdd1b32..a1b7d53d 100644 --- a/iris_grib/tests/unit/save_rules/test_set_fixed_surfaces.py +++ b/iris_grib/tests/unit/save_rules/test_set_fixed_surfaces.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2013 - 2019, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 :func:`iris_grib._save_rules.set_fixed_surfaces`. diff --git a/iris_grib/tests/unit/save_rules/test_set_time_increment.py b/iris_grib/tests/unit/save_rules/test_set_time_increment.py index ea108cd0..703399fc 100644 --- a/iris_grib/tests/unit/save_rules/test_set_time_increment.py +++ b/iris_grib/tests/unit/save_rules/test_set_time_increment.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 :func:`iris_grib._save_rules.set_time_increment` diff --git a/iris_grib/tests/unit/save_rules/test_set_time_range.py b/iris_grib/tests/unit/save_rules/test_set_time_range.py index cbb7fdc4..d90fe904 100644 --- a/iris_grib/tests/unit/save_rules/test_set_time_range.py +++ b/iris_grib/tests/unit/save_rules/test_set_time_range.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 :func:`iris_grib._save_rules.set_time_range` diff --git a/iris_grib/tests/unit/test_GribWrapper.py b/iris_grib/tests/unit/test_GribWrapper.py index 7c0546a3..4e97ddc6 100644 --- a/iris_grib/tests/unit/test_GribWrapper.py +++ b/iris_grib/tests/unit/test_GribWrapper.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2017, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 `iris_grib.GribWrapper` class. diff --git a/iris_grib/tests/unit/test__load_generate.py b/iris_grib/tests/unit/test__load_generate.py index 0e1d9146..119dd511 100644 --- a/iris_grib/tests/unit/test__load_generate.py +++ b/iris_grib/tests/unit/test__load_generate.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 `iris_grib._load_generate` function.""" from __future__ import (absolute_import, division, print_function) diff --git a/iris_grib/tests/unit/test_load_cubes.py b/iris_grib/tests/unit/test_load_cubes.py index 36c8599c..a1528952 100644 --- a/iris_grib/tests/unit/test_load_cubes.py +++ b/iris_grib/tests/unit/test_load_cubes.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2014 - 2017, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 `iris_grib.load_cubes` function.""" from __future__ import (absolute_import, division, print_function) diff --git a/iris_grib/tests/unit/test_save_grib2.py b/iris_grib/tests/unit/test_save_grib2.py index 5fc382fc..710a6ab0 100644 --- a/iris_grib/tests/unit/test_save_grib2.py +++ b/iris_grib/tests/unit/test_save_grib2.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 `iris_grib.save_grib2` function.""" from __future__ import (absolute_import, division, print_function) diff --git a/iris_grib/tests/unit/test_save_messages.py b/iris_grib/tests/unit/test_save_messages.py index eb666eed..4ce02b68 100644 --- a/iris_grib/tests/unit/test_save_messages.py +++ b/iris_grib/tests/unit/test_save_messages.py @@ -1,19 +1,8 @@ -# (C) British Crown Copyright 2016, Met Office +# Copyright iris-grib contributors # -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . +# This file is part of iris-grib 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 `iris_grib.save_messages` function.""" from __future__ import (absolute_import, division, print_function) From e7001d86865bc455fd1e8ea674137c9427a1c85b Mon Sep 17 00:00:00 2001 From: lbdreyer Date: Thu, 28 Nov 2019 12:43:41 +0000 Subject: [PATCH 137/583] Drop Python 2 Testing (#166) --- .travis.yml | 16 ++++------------ environment.yml | 2 +- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/.travis.yml b/.travis.yml index 24d789dd..dffed78d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,7 +3,6 @@ dist: xenial env: matrix: - - PYTHON_VERSION=2.7 - PYTHON_VERSION=3.6 - PYTHON_VERSION=3.7 @@ -30,22 +29,15 @@ install: conda config --add channels conda-forge; conda update --quiet conda; ENV_NAME='test-environment'; - conda create --quiet -n ${ENV_NAME} python=${PYTHON_VERSION}; + conda create --quiet -n ${ENV_NAME} python=${PYTHON_VERSION} mock filelock pep8; source activate ${ENV_NAME}; # Customise the test environment # ------------------------------ - > - if [[ "${PYTHON_VERSION}" == 2* ]]; then - export ECCODES_DEPS="python-eccodes"; - else - export ECCODES_DEPS="eccodes pip"; - fi; - conda install -n ${ENV_NAME} --quiet iris mock filelock pep8 ${ECCODES_DEPS}; - if [[ "${PYTHON_VERSION}" == 3* ]]; then - pip install eccodes-python; - python -m eccodes selfcheck; - fi; + conda env update -n ${ENV_NAME} --quiet --file environment.yml; + # Check installation of eccodes. + python -m eccodes selfcheck; # Download and install iris-test-data # ----------------------------------- diff --git a/environment.yml b/environment.yml index 9556d35b..86d2ed55 100644 --- a/environment.yml +++ b/environment.yml @@ -2,4 +2,4 @@ channels: - conda-forge dependencies: - iris=2.* - - python-eccodes + - python-eccodes>=0.9.1,<2 From 675b8a31125cc9a1c054fa049d9efcfbdae30e43 Mon Sep 17 00:00:00 2001 From: lbdreyer Date: Thu, 28 Nov 2019 12:51:30 +0000 Subject: [PATCH 138/583] Drop Python 2 support (#170) --- iris_grib/__init__.py | 14 +++----- iris_grib/_grib1_load_rules.py | 3 -- iris_grib/_iris_mercator_support.py | 3 -- iris_grib/_load_convert.py | 6 ++-- iris_grib/_save_rules.py | 3 -- iris_grib/grib_phenom_translation.py | 14 +++----- iris_grib/message.py | 16 ++++----- iris_grib/tests/__init__.py | 7 ++-- iris_grib/tests/integration/__init__.py | 3 -- .../integration/load_convert/__init__.py | 3 -- .../load_convert/test_load_hybrid_coords.py | 3 -- .../tests/integration/round_trip/__init__.py | 3 -- .../test_WAFC_mapping_round_trip.py | 3 -- .../test_hybrid_coords_round_trip.py | 3 -- .../tests/integration/save_rules/__init__.py | 3 -- .../test_grid_definition_section.py | 5 +-- .../save_rules/test_save_hybrid_coords.py | 2 -- iris_grib/tests/test_license_headers.py | 3 -- iris_grib/tests/test_pep8.py | 3 -- iris_grib/tests/unit/__init__.py | 5 +-- .../tests/unit/grib1_load_rules/__init__.py | 3 -- .../grib1_load_rules/test_grib1_convert.py | 7 ++-- .../unit/grib_phenom_translation/__init__.py | 3 -- .../test_grib_phenom_translation.py | 2 -- iris_grib/tests/unit/load_convert/__init__.py | 3 -- .../unit/load_convert/test__hindcast_fix.py | 3 -- .../unit/load_convert/test_bitmap_section.py | 5 +-- .../load_convert/test_calculate_increment.py | 3 -- .../tests/unit/load_convert/test_convert.py | 9 ++--- .../unit/load_convert/test_data_cutoff.py | 5 +-- .../tests/unit/load_convert/test_ellipsoid.py | 13 +++---- .../load_convert/test_ellipsoid_geometry.py | 3 -- .../load_convert/test_ensemble_identifier.py | 5 +-- .../test_fixup_float32_from_int32.py | 3 -- .../test_fixup_int32_from_uint32.py | 3 -- .../test_forecast_period_coord.py | 3 -- .../load_convert/test_generating_process.py | 3 -- .../unit/load_convert/test_grib2_convert.py | 5 +-- .../test_grid_definition_template_0_and_1.py | 7 ++-- .../test_grid_definition_template_10.py | 3 -- .../test_grid_definition_template_12.py | 15 ++++---- .../test_grid_definition_template_20.py | 3 -- .../test_grid_definition_template_30.py | 3 -- .../test_grid_definition_template_40.py | 3 -- .../test_grid_definition_template_4_and_5.py | 7 ++-- .../test_grid_definition_template_5.py | 5 +-- .../test_grid_definition_template_90.py | 26 ++++++-------- .../load_convert/test_other_time_coord.py | 23 ++++++------- .../test_product_definition_section.py | 11 +++--- .../test_product_definition_template_0.py | 5 +-- .../test_product_definition_template_1.py | 5 +-- .../test_product_definition_template_10.py | 5 +-- .../test_product_definition_template_11.py | 5 +-- .../test_product_definition_template_15.py | 9 ++--- .../test_product_definition_template_31.py | 8 ++--- .../test_product_definition_template_32.py | 8 ++--- .../test_product_definition_template_40.py | 3 -- .../test_product_definition_template_8.py | 14 +++----- .../test_product_definition_template_9.py | 17 ++++------ .../load_convert/test_projection_centre.py | 3 -- .../load_convert/test_reference_time_coord.py | 5 +-- .../load_convert/test_resolution_flags.py | 3 -- .../load_convert/test_satellite_common.py | 8 ++--- .../unit/load_convert/test_scanning_mode.py | 3 -- .../test_statistical_cell_method.py | 17 ++++------ .../test_statistical_forecast_period_coord.py | 5 +-- .../unit/load_convert/test_time_range_unit.py | 5 +-- .../load_convert/test_translate_phenomenon.py | 3 -- .../tests/unit/load_convert/test_unscale.py | 3 -- .../load_convert/test_validity_time_coord.py | 13 +++---- .../unit/load_convert/test_vertical_coords.py | 9 ++--- iris_grib/tests/unit/message/__init__.py | 3 -- .../tests/unit/message/test_GribMessage.py | 34 ++++++++----------- iris_grib/tests/unit/message/test_Section.py | 5 +-- .../tests/unit/message/test__DataProxy.py | 5 +-- .../unit/message/test__MessageLocation.py | 5 +-- .../unit/message/test__RawGribMessage.py | 3 -- iris_grib/tests/unit/save_rules/__init__.py | 8 ++--- .../test__missing_forecast_period.py | 3 -- .../test__non_missing_forecast_period.py | 3 -- ...product_definition_template_8_10_and_11.py | 18 +++++----- .../unit/save_rules/test_data_section.py | 7 ++-- .../save_rules/test_fixup_float32_as_int32.py | 3 -- .../save_rules/test_fixup_int32_as_uint32.py | 3 -- .../test_grid_definition_template_0.py | 3 -- .../test_grid_definition_template_1.py | 5 +-- .../test_grid_definition_template_10.py | 3 -- .../test_grid_definition_template_12.py | 3 -- .../test_grid_definition_template_30.py | 3 -- .../test_grid_definition_template_4.py | 3 -- .../test_grid_definition_template_5.py | 5 +-- .../unit/save_rules/test_identification.py | 6 ++-- .../test_product_definition_template_1.py | 8 ++--- .../test_product_definition_template_10.py | 8 ++--- .../test_product_definition_template_11.py | 6 ++-- .../test_product_definition_template_15.py | 6 ++-- .../test_product_definition_template_40.py | 6 ++-- .../test_product_definition_template_8.py | 6 ++-- .../unit/save_rules/test_reference_time.py | 6 ++-- .../save_rules/test_set_fixed_surfaces.py | 3 -- .../save_rules/test_set_time_increment.py | 6 ++-- .../unit/save_rules/test_set_time_range.py | 20 +++++------ iris_grib/tests/unit/test_GribWrapper.py | 7 ++-- iris_grib/tests/unit/test__load_generate.py | 7 ++-- iris_grib/tests/unit/test_load_cubes.py | 5 +-- iris_grib/tests/unit/test_save_grib2.py | 6 +--- iris_grib/tests/unit/test_save_messages.py | 18 ++-------- setup.py | 1 - 108 files changed, 187 insertions(+), 511 deletions(-) diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index 0566ce8e..2cc40204 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -10,10 +10,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa -import six - import datetime import math # for fmod import warnings @@ -85,7 +81,7 @@ unknown_string = "???" -class GribDataProxy(object): +class GribDataProxy: """A reference to the data payload of a single Grib message.""" __slots__ = ('shape', 'dtype', 'path', 'offset') @@ -119,11 +115,11 @@ def __getstate__(self): return {attr: getattr(self, attr) for attr in self.__slots__} def __setstate__(self, state): - for key, value in six.iteritems(state): + for key, value in state.items(): setattr(self, key, value) -class GribWrapper(object): +class GribWrapper: """ Contains a pygrib object plus some extra keys of our own. @@ -856,7 +852,7 @@ def save_messages(messages, target, append=False): """ # grib file (this bit is common to the pp and grib savers...) - if isinstance(target, six.string_types): + if isinstance(target, str): grib_file = open(target, "ab" if append else "wb") elif hasattr(target, "write"): if hasattr(target, "mode") and "b" not in target.mode: @@ -871,5 +867,5 @@ def save_messages(messages, target, append=False): gribapi.grib_release(message) finally: # (this bit is common to the pp and grib savers...) - if isinstance(target, six.string_types): + if isinstance(target, str): grib_file.close() diff --git a/iris_grib/_grib1_load_rules.py b/iris_grib/_grib1_load_rules.py index 9059860f..30d36655 100644 --- a/iris_grib/_grib1_load_rules.py +++ b/iris_grib/_grib1_load_rules.py @@ -4,9 +4,6 @@ # See COPYING and COPYING.LESSER in the root of the repository for full # licensing details. -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # Historically this was auto-generated from # SciTools/iris-code-generators:tools/gen_rules.py diff --git a/iris_grib/_iris_mercator_support.py b/iris_grib/_iris_mercator_support.py index 2b7ffece..1e25758e 100644 --- a/iris_grib/_iris_mercator_support.py +++ b/iris_grib/_iris_mercator_support.py @@ -8,9 +8,6 @@ which iris-grib requires for its Mercator support. """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa -import six import distutils.version diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index 2dc35415..60d2c96a 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -9,11 +9,9 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - from argparse import Namespace -from collections import namedtuple, Iterable, OrderedDict +from collections import namedtuple, OrderedDict +from collections.abc import Iterable from datetime import datetime, timedelta import math import warnings diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index ab8a3a67..e5892516 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -11,9 +11,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - import warnings import cf_units diff --git a/iris_grib/grib_phenom_translation.py b/iris_grib/grib_phenom_translation.py index 73e3091e..cee9cb29 100644 --- a/iris_grib/grib_phenom_translation.py +++ b/iris_grib/grib_phenom_translation.py @@ -17,10 +17,6 @@ ''' -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa -import six - import collections import warnings @@ -40,7 +36,7 @@ class _LookupTable(dict): """ def __init__(self, *args, **kwargs): - self._super = super(_LookupTable, self) + self._super = super() self._super.__init__(*args, **kwargs) def __getitem__(self, key): @@ -101,7 +97,7 @@ def _make_grib1_cf_entry(table2_version, centre_number, param_number, return (grib1_key, cf_data) # Interpret the imported Grib1-to-CF table. - for (grib1data, cfdata) in six.iteritems(grcf.GRIB1_LOCAL_TO_CF): + for (grib1data, cfdata) in grcf.GRIB1_LOCAL_TO_CF.items(): assert grib1data.edition == 1 association_entry = _make_grib1_cf_entry( table2_version=grib1data.t2version, @@ -116,7 +112,7 @@ def _make_grib1_cf_entry(table2_version, centre_number, param_number, # Do the same for special Grib1 codes that include an implied height level. for (grib1data, (cfdata, extra_dimcoord)) \ - in six.iteritems(grcf.GRIB1_LOCAL_TO_CF_CONSTRAINED): + in grcf.GRIB1_LOCAL_TO_CF_CONSTRAINED.items(): assert grib1data.edition == 1 if extra_dimcoord.standard_name != 'height': raise ValueError('Got implied dimension coord of "{}", ' @@ -188,7 +184,7 @@ def _make_grib2_cf_entry(param_discipline, param_category, param_number, return (grib2_key, cf_data) # Interpret the grib2 info from grib_cf_map - for grib2data, cfdata in six.iteritems(grcf.GRIB2_TO_CF): + for grib2data, cfdata in grcf.GRIB2_TO_CF.items(): assert grib2data.edition == 2 association_entry = _make_grib2_cf_entry( param_discipline=grib2data.discipline, @@ -248,7 +244,7 @@ def _make_cf_grib2_entry(standard_name, long_name, return (cf_key, grib2_data) # Interpret the imported CF-to-Grib2 table into a lookup table - for cfdata, grib2data in six.iteritems(grcf.CF_TO_GRIB2): + for cfdata, grib2data in grcf.CF_TO_GRIB2.items(): assert grib2data.edition == 2 a_cf_unit = cf_units.Unit(cfdata.units) association_entry = _make_cf_grib2_entry( diff --git a/iris_grib/message.py b/iris_grib/message.py index 23362676..76cba2eb 100644 --- a/iris_grib/message.py +++ b/iris_grib/message.py @@ -8,10 +8,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa -import six - from collections import namedtuple import re @@ -41,7 +37,7 @@ def _grib_get_array_wrapper(f): return f -class _OpenFileRef(object): +class _OpenFileRef: """ A reference to an open file that ensures that the file is closed when the object is garbage collected. @@ -54,7 +50,7 @@ def __del__(self): self.open_file.close() -class GribMessage(object): +class GribMessage: """ An in-memory representation of a GribMessage, providing access to the :meth:`~GribMessage.data` payload and the metadata @@ -193,7 +189,7 @@ def __call__(self): return _RawGribMessage.from_file_offset(self.filename, self.offset) -class _DataProxy(object): +class _DataProxy: """A reference to the data payload of a single GRIB message.""" __slots__ = ('shape', 'dtype', 'recreate_raw') @@ -281,11 +277,11 @@ def __getstate__(self): return {attr: getattr(self, attr) for attr in self.__slots__} def __setstate__(self, state): - for key, value in six.iteritems(state): + for key, value in state.items(): setattr(self, key, value) -class _RawGribMessage(object): +class _RawGribMessage: """ Lightweight GRIB message wrapper, containing **only** the coded keys of the input GRIB message. @@ -386,7 +382,7 @@ def _get_message_sections(self): return sections -class Section(object): +class Section: """ A Section of a GRIB message, supporting dictionary like access to attributes using gribapi key strings. diff --git a/iris_grib/tests/__init__.py b/iris_grib/tests/__init__.py index 50735937..897feaf5 100644 --- a/iris_grib/tests/__init__.py +++ b/iris_grib/tests/__init__.py @@ -10,9 +10,6 @@ plot control reasons : see documentation there. """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa -import six import iris.tests @@ -46,7 +43,7 @@ def get_result_path(relative_path): as a string, or sequence of strings. """ - if not isinstance(relative_path, six.string_types): + if not isinstance(relative_path, str): relative_path = os.path.join(*relative_path) return os.path.abspath(os.path.join(_RESULT_PATH, relative_path)) @@ -92,6 +89,6 @@ def get_testdata_path(relative_path): relative path as a string, or sequence of strings. """ - if not isinstance(relative_path, six.string_types): + if not isinstance(relative_path, str): relative_path = os.path.join(*relative_path) return os.path.abspath(os.path.join(_TESTDATA_PATH, relative_path)) diff --git a/iris_grib/tests/integration/__init__.py b/iris_grib/tests/integration/__init__.py index c610fb77..bd0dcb75 100644 --- a/iris_grib/tests/integration/__init__.py +++ b/iris_grib/tests/integration/__init__.py @@ -4,6 +4,3 @@ # See COPYING and COPYING.LESSER in the root of the repository for full # licensing details. """Integration tests for the :mod:`iris_grib` package.""" - -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa diff --git a/iris_grib/tests/integration/load_convert/__init__.py b/iris_grib/tests/integration/load_convert/__init__.py index 85000b06..a64cb041 100644 --- a/iris_grib/tests/integration/load_convert/__init__.py +++ b/iris_grib/tests/integration/load_convert/__init__.py @@ -4,6 +4,3 @@ # See COPYING and COPYING.LESSER in the root of the repository for full # licensing details. """Integration tests for the :mod:`iris_grib._load_convert` package.""" - -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa diff --git a/iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py b/iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py index 36201940..75eed648 100644 --- a/iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py +++ b/iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py @@ -8,9 +8,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests diff --git a/iris_grib/tests/integration/round_trip/__init__.py b/iris_grib/tests/integration/round_trip/__init__.py index eb405acc..9339eb23 100644 --- a/iris_grib/tests/integration/round_trip/__init__.py +++ b/iris_grib/tests/integration/round_trip/__init__.py @@ -4,6 +4,3 @@ # See COPYING and COPYING.LESSER in the root of the repository for full # licensing details. """Round-trip integration tests for the :mod:`iris-grib` package.""" - -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa diff --git a/iris_grib/tests/integration/round_trip/test_WAFC_mapping_round_trip.py b/iris_grib/tests/integration/round_trip/test_WAFC_mapping_round_trip.py index f21f17d0..57b01943 100644 --- a/iris_grib/tests/integration/round_trip/test_WAFC_mapping_round_trip.py +++ b/iris_grib/tests/integration/round_trip/test_WAFC_mapping_round_trip.py @@ -9,9 +9,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests diff --git a/iris_grib/tests/integration/round_trip/test_hybrid_coords_round_trip.py b/iris_grib/tests/integration/round_trip/test_hybrid_coords_round_trip.py index d15afa0e..cb94671f 100644 --- a/iris_grib/tests/integration/round_trip/test_hybrid_coords_round_trip.py +++ b/iris_grib/tests/integration/round_trip/test_hybrid_coords_round_trip.py @@ -9,9 +9,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests diff --git a/iris_grib/tests/integration/save_rules/__init__.py b/iris_grib/tests/integration/save_rules/__init__.py index ac8b2425..fdaf4485 100644 --- a/iris_grib/tests/integration/save_rules/__init__.py +++ b/iris_grib/tests/integration/save_rules/__init__.py @@ -4,6 +4,3 @@ # See COPYING and COPYING.LESSER in the root of the repository for full # licensing details. """Unit tests for the :mod:`iris_grib._save_rules` package.""" - -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa diff --git a/iris_grib/tests/integration/save_rules/test_grid_definition_section.py b/iris_grib/tests/integration/save_rules/test_grid_definition_section.py index f3fd605e..64b94510 100644 --- a/iris_grib/tests/integration/save_rules/test_grid_definition_section.py +++ b/iris_grib/tests/integration/save_rules/test_grid_definition_section.py @@ -9,9 +9,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # Import iris_grib.tests first so that some things can be initialised before # importing anything else. import iris_grib.tests as tests @@ -115,7 +112,7 @@ def test_coord_system_not_supported(self): exp_name = cs.grid_mapping_name.replace('_', ' ').title() exp_emsg = 'not supported for coordinate system {!r}'.format(exp_name) - with self.assertRaisesRegexp(ValueError, exp_emsg): + with self.assertRaisesRegex(ValueError, exp_emsg): grid_definition_section(test_cube, self.mock_grib) diff --git a/iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py b/iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py index 161e3022..d0a0e317 100644 --- a/iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py +++ b/iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py @@ -7,8 +7,6 @@ Unit tests for :func:`iris_grib._save_rules.data_section`. """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa # import iris_grib.tests first so that some things can be initialised before # importing anything else diff --git a/iris_grib/tests/test_license_headers.py b/iris_grib/tests/test_license_headers.py index 8af960b4..7c874b85 100644 --- a/iris_grib/tests/test_license_headers.py +++ b/iris_grib/tests/test_license_headers.py @@ -8,9 +8,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - from datetime import datetime from fnmatch import fnmatch import os diff --git a/iris_grib/tests/test_pep8.py b/iris_grib/tests/test_pep8.py index 13bafb1b..05ef4a39 100644 --- a/iris_grib/tests/test_pep8.py +++ b/iris_grib/tests/test_pep8.py @@ -8,9 +8,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - import os import unittest diff --git a/iris_grib/tests/unit/__init__.py b/iris_grib/tests/unit/__init__.py index 54eb86f0..258224bf 100644 --- a/iris_grib/tests/unit/__init__.py +++ b/iris_grib/tests/unit/__init__.py @@ -5,16 +5,13 @@ # licensing details. """Unit tests for the :mod:`iris_grib` package.""" -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests import gribapi -import mock import numpy as np +from unittest import mock import iris diff --git a/iris_grib/tests/unit/grib1_load_rules/__init__.py b/iris_grib/tests/unit/grib1_load_rules/__init__.py index ae53ab2d..310c6b68 100644 --- a/iris_grib/tests/unit/grib1_load_rules/__init__.py +++ b/iris_grib/tests/unit/grib1_load_rules/__init__.py @@ -4,6 +4,3 @@ # See COPYING and COPYING.LESSER in the root of the repository for full # licensing details. """Unit tests for the :mod:`iris_grib._grib1_load_rules` module.""" - -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa diff --git a/iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py b/iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py index 2ff01c22..05d3df1b 100644 --- a/iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py +++ b/iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py @@ -5,16 +5,13 @@ # licensing details. """Unit tests for :func:`iris_grib._grib1_load_rules.grib1_convert`.""" -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # Import iris_grib.tests first so that some things can be initialised before # importing anything else import iris_grib.tests as tests import cf_units import gribapi -import mock +from unittest import mock import iris from iris.exceptions import TranslationError @@ -29,7 +26,7 @@ class TestBadEdition(tests.IrisGribTest): def test(self): message = mock.Mock(edition=2) emsg = 'GRIB edition 2 is not supported' - with self.assertRaisesRegexp(TranslationError, emsg): + with self.assertRaisesRegex(TranslationError, emsg): grib1_convert(message) diff --git a/iris_grib/tests/unit/grib_phenom_translation/__init__.py b/iris_grib/tests/unit/grib_phenom_translation/__init__.py index 1b7780d7..049526a1 100644 --- a/iris_grib/tests/unit/grib_phenom_translation/__init__.py +++ b/iris_grib/tests/unit/grib_phenom_translation/__init__.py @@ -4,6 +4,3 @@ # See COPYING and COPYING.LESSER in the root of the repository for full # licensing details. """Unit tests for the :mod:`iris_grib.grib_phenom_translation` package.""" - -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa diff --git a/iris_grib/tests/unit/grib_phenom_translation/test_grib_phenom_translation.py b/iris_grib/tests/unit/grib_phenom_translation/test_grib_phenom_translation.py index 296e4589..ae3cb715 100644 --- a/iris_grib/tests/unit/grib_phenom_translation/test_grib_phenom_translation.py +++ b/iris_grib/tests/unit/grib_phenom_translation/test_grib_phenom_translation.py @@ -10,8 +10,6 @@ Code is out of step with current test conventions and standards. ''' -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa # Import iris_grib.tests first so that some things can be initialised before # importing anything else. diff --git a/iris_grib/tests/unit/load_convert/__init__.py b/iris_grib/tests/unit/load_convert/__init__.py index 154f7499..782689ab 100644 --- a/iris_grib/tests/unit/load_convert/__init__.py +++ b/iris_grib/tests/unit/load_convert/__init__.py @@ -5,9 +5,6 @@ # licensing details. """Unit tests for the :mod:`iris_grib._load_convert` package.""" -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests diff --git a/iris_grib/tests/unit/load_convert/test__hindcast_fix.py b/iris_grib/tests/unit/load_convert/test__hindcast_fix.py index baa5e710..3bfbc533 100644 --- a/iris_grib/tests/unit/load_convert/test__hindcast_fix.py +++ b/iris_grib/tests/unit/load_convert/test__hindcast_fix.py @@ -8,9 +8,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests diff --git a/iris_grib/tests/unit/load_convert/test_bitmap_section.py b/iris_grib/tests/unit/load_convert/test_bitmap_section.py index 9576c2b1..2656d5f9 100644 --- a/iris_grib/tests/unit/load_convert/test_bitmap_section.py +++ b/iris_grib/tests/unit/load_convert/test_bitmap_section.py @@ -8,9 +8,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests @@ -28,7 +25,7 @@ def test_bitmap_unsupported(self): # different things, but load_convert treats them identically. message = _make_test_message({6: {'bitMapIndicator': 100, 'bitmap': None}}) - with self.assertRaisesRegexp(TranslationError, 'unsupported bitmap'): + with self.assertRaisesRegex(TranslationError, 'unsupported bitmap'): bitmap_section(message.sections[6]) diff --git a/iris_grib/tests/unit/load_convert/test_calculate_increment.py b/iris_grib/tests/unit/load_convert/test_calculate_increment.py index fe5eaa6e..3b959a01 100644 --- a/iris_grib/tests/unit/load_convert/test_calculate_increment.py +++ b/iris_grib/tests/unit/load_convert/test_calculate_increment.py @@ -8,9 +8,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # Import iris_grib.tests first so that some things can be initialised before # importing anything else. import iris_grib.tests as tests diff --git a/iris_grib/tests/unit/load_convert/test_convert.py b/iris_grib/tests/unit/load_convert/test_convert.py index 013eda59..3a507152 100644 --- a/iris_grib/tests/unit/load_convert/test_convert.py +++ b/iris_grib/tests/unit/load_convert/test_convert.py @@ -5,14 +5,11 @@ # licensing details. """Test function :func:`iris_grib._load_convert.convert`.""" -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests -import mock +from unittest import mock from iris.exceptions import TranslationError @@ -40,7 +37,7 @@ def test_edition_1_bad(self): sections = [{'editionNumber': 1}] field = _make_test_message(sections) emsg = 'edition 1 is not supported' - with self.assertRaisesRegexp(TranslationError, emsg): + with self.assertRaisesRegex(TranslationError, emsg): convert(field) @@ -49,7 +46,7 @@ def test_edition_2_bad(self): # Test object with no '.sections', and '.edition' ==2. field = mock.Mock(edition=2, spec=('edition')) emsg = 'edition 2 is not supported' - with self.assertRaisesRegexp(TranslationError, emsg): + with self.assertRaisesRegex(TranslationError, emsg): convert(field) def test_edition_1(self): diff --git a/iris_grib/tests/unit/load_convert/test_data_cutoff.py b/iris_grib/tests/unit/load_convert/test_data_cutoff.py index f3560c15..be166c43 100644 --- a/iris_grib/tests/unit/load_convert/test_data_cutoff.py +++ b/iris_grib/tests/unit/load_convert/test_data_cutoff.py @@ -8,14 +8,11 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests -import mock +from unittest import mock from iris_grib._load_convert import _MDI as MDI from iris_grib._load_convert import data_cutoff diff --git a/iris_grib/tests/unit/load_convert/test_ellipsoid.py b/iris_grib/tests/unit/load_convert/test_ellipsoid.py index d6b43d91..222e706e 100644 --- a/iris_grib/tests/unit/load_convert/test_ellipsoid.py +++ b/iris_grib/tests/unit/load_convert/test_ellipsoid.py @@ -8,9 +8,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests @@ -34,7 +31,7 @@ def test_shape_unsupported(self): unsupported = [8, 9, 10, MDI] emsg = 'unsupported shape of the earth' for shape in unsupported: - with self.assertRaisesRegexp(TranslationError, emsg): + with self.assertRaisesRegex(TranslationError, emsg): ellipsoid(shape, MDI, MDI, MDI) def test_spherical_default_supported(self): @@ -47,7 +44,7 @@ def test_spherical_default_supported(self): def test_spherical_shape_1_no_radius(self): shape = 1 emsg = 'radius to be specified' - with self.assertRaisesRegexp(ValueError, emsg): + with self.assertRaisesRegex(ValueError, emsg): ellipsoid(shape, MDI, MDI, MDI) def test_spherical_shape_1(self): @@ -60,19 +57,19 @@ def test_spherical_shape_1(self): def test_oblate_shape_3_7_no_axes(self): for shape in [3, 7]: emsg = 'axis to be specified' - with self.assertRaisesRegexp(ValueError, emsg): + with self.assertRaisesRegex(ValueError, emsg): ellipsoid(shape, MDI, MDI, MDI) def test_oblate_shape_3_7_no_major(self): for shape in [3, 7]: emsg = 'major axis to be specified' - with self.assertRaisesRegexp(ValueError, emsg): + with self.assertRaisesRegex(ValueError, emsg): ellipsoid(shape, MDI, 1, MDI) def test_oblate_shape_3_7_no_minor(self): for shape in [3, 7]: emsg = 'minor axis to be specified' - with self.assertRaisesRegexp(ValueError, emsg): + with self.assertRaisesRegex(ValueError, emsg): ellipsoid(shape, 1, MDI, MDI) def test_oblate_shape_3_7(self): diff --git a/iris_grib/tests/unit/load_convert/test_ellipsoid_geometry.py b/iris_grib/tests/unit/load_convert/test_ellipsoid_geometry.py index f7bc3ecc..f755022b 100644 --- a/iris_grib/tests/unit/load_convert/test_ellipsoid_geometry.py +++ b/iris_grib/tests/unit/load_convert/test_ellipsoid_geometry.py @@ -8,9 +8,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests diff --git a/iris_grib/tests/unit/load_convert/test_ensemble_identifier.py b/iris_grib/tests/unit/load_convert/test_ensemble_identifier.py index 1116b073..0157547d 100644 --- a/iris_grib/tests/unit/load_convert/test_ensemble_identifier.py +++ b/iris_grib/tests/unit/load_convert/test_ensemble_identifier.py @@ -9,15 +9,12 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests from copy import deepcopy -import mock +from unittest import mock import warnings from iris.coords import DimCoord diff --git a/iris_grib/tests/unit/load_convert/test_fixup_float32_from_int32.py b/iris_grib/tests/unit/load_convert/test_fixup_float32_from_int32.py index 698eca3e..422a32c8 100644 --- a/iris_grib/tests/unit/load_convert/test_fixup_float32_from_int32.py +++ b/iris_grib/tests/unit/load_convert/test_fixup_float32_from_int32.py @@ -8,9 +8,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # Import iris_grib.tests first so that some things can be initialised before # importing anything else. import iris_grib.tests as tests diff --git a/iris_grib/tests/unit/load_convert/test_fixup_int32_from_uint32.py b/iris_grib/tests/unit/load_convert/test_fixup_int32_from_uint32.py index 76e93ac5..898e2350 100644 --- a/iris_grib/tests/unit/load_convert/test_fixup_int32_from_uint32.py +++ b/iris_grib/tests/unit/load_convert/test_fixup_int32_from_uint32.py @@ -8,9 +8,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # Import iris_grib.tests first so that some things can be initialised before # importing anything else. import iris_grib.tests as tests diff --git a/iris_grib/tests/unit/load_convert/test_forecast_period_coord.py b/iris_grib/tests/unit/load_convert/test_forecast_period_coord.py index 3adcb10a..2c76c7b3 100644 --- a/iris_grib/tests/unit/load_convert/test_forecast_period_coord.py +++ b/iris_grib/tests/unit/load_convert/test_forecast_period_coord.py @@ -8,9 +8,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests diff --git a/iris_grib/tests/unit/load_convert/test_generating_process.py b/iris_grib/tests/unit/load_convert/test_generating_process.py index 12dc294b..701c48e0 100644 --- a/iris_grib/tests/unit/load_convert/test_generating_process.py +++ b/iris_grib/tests/unit/load_convert/test_generating_process.py @@ -9,9 +9,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests diff --git a/iris_grib/tests/unit/load_convert/test_grib2_convert.py b/iris_grib/tests/unit/load_convert/test_grib2_convert.py index fe0d63a6..0c115273 100644 --- a/iris_grib/tests/unit/load_convert/test_grib2_convert.py +++ b/iris_grib/tests/unit/load_convert/test_grib2_convert.py @@ -5,15 +5,12 @@ # licensing details. """Test function :func:`iris_grib._load_convert.grib2_convert`.""" -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests import copy -import mock +from unittest import mock import iris_grib from iris_grib._load_convert import grib2_convert diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_0_and_1.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_0_and_1.py index 276e09f9..f11d1269 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_0_and_1.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_0_and_1.py @@ -9,9 +9,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # Import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests @@ -124,7 +121,7 @@ def test_unsupported_quasi_regular__number_of_octets(self): section = {'numberOfOctectsForNumberOfPoints': 1} cs = None metadata = None - with self.assertRaisesRegexp(TranslationError, 'quasi-regular'): + with self.assertRaisesRegex(TranslationError, 'quasi-regular'): grid_definition_template_0_and_1(section, metadata, 'latitude', @@ -136,7 +133,7 @@ def test_unsupported_quasi_regular__interpretation(self): 'interpretationOfNumberOfPoints': 1} cs = None metadata = None - with self.assertRaisesRegexp(TranslationError, 'quasi-regular'): + with self.assertRaisesRegex(TranslationError, 'quasi-regular'): grid_definition_template_0_and_1(section, metadata, 'latitude', diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_10.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_10.py index 59acd657..670e7cd0 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_10.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_10.py @@ -9,9 +9,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_12.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_12.py index 09f2a6e2..b5833334 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_12.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_12.py @@ -9,9 +9,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests @@ -99,16 +96,16 @@ def test_negative_x(self): section = self.section_3() section['scanningMode'] = 0b11000000 metadata = empty_metadata() - with self.assertRaisesRegexp(iris.exceptions.TranslationError, - '-x scanning'): + with self.assertRaisesRegex(iris.exceptions.TranslationError, + '-x scanning'): grid_definition_template_12(section, metadata) def test_negative_y(self): section = self.section_3() section['scanningMode'] = 0b00000000 metadata = empty_metadata() - with self.assertRaisesRegexp(iris.exceptions.TranslationError, - '-y scanning'): + with self.assertRaisesRegex(iris.exceptions.TranslationError, + '-y scanning'): grid_definition_template_12(section, metadata) def test_transposed(self): @@ -135,8 +132,8 @@ def test_incompatible_grid_extent(self): section = self.section_3() section['X2'] += 100 metadata = empty_metadata() - with self.assertRaisesRegexp(iris.exceptions.TranslationError, - 'grid'): + with self.assertRaisesRegex(iris.exceptions.TranslationError, + 'grid'): grid_definition_template_12(section, metadata) def test_scale_workaround(self): diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_20.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_20.py index 789063cc..2cfb62be 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_20.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_20.py @@ -8,9 +8,6 @@ :func:`iris_grib._load_convert.grid_definition_template_20`. """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_30.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_30.py index 5e51e981..e42a41d9 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_30.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_30.py @@ -8,9 +8,6 @@ :func:`iris_grib._load_convert.grid_definition_template_30`. """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_40.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_40.py index cca82ad6..441d01e3 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_40.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_40.py @@ -9,9 +9,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_4_and_5.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_4_and_5.py index 3d5cfc0e..913e1d1f 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_4_and_5.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_4_and_5.py @@ -9,19 +9,16 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests from copy import deepcopy -import mock -import numpy as np +from unittest import mock import warnings from iris.coords import DimCoord +import numpy as np from iris_grib._load_convert import (grid_definition_template_4_and_5, _MDI as MDI) diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_5.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_5.py index 46ccf6ae..059c8e24 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_5.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_5.py @@ -9,15 +9,12 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests from copy import deepcopy -import mock +from unittest import mock from iris_grib._load_convert import grid_definition_template_5 diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_90.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_90.py index 1b35c380..8e9047da 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_90.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_90.py @@ -9,10 +9,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa -import six - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests @@ -117,7 +113,7 @@ def compare(self, metadata, expected): self.assertEqual(result_coord, expected_coord) # Ensure no other metadata was created. - for name in six.iterkeys(expected): + for name in expected.keys(): if name == 'dim_coords_and_dims': continue self.assertEqual(metadata[name], expected[name]) @@ -141,46 +137,46 @@ def test_non_zero_latitude(self): section = self.uk() section['latitudeOfSubSatellitePoint'] = 1 metadata = empty_metadata() - with self.assertRaisesRegexp(iris.exceptions.TranslationError, - 'non-zero latitude'): + with self.assertRaisesRegex(iris.exceptions.TranslationError, + 'non-zero latitude'): grid_definition_template_90(section, metadata) def test_rotated_meridian(self): section = self.uk() section['orientationOfTheGrid'] = 1 metadata = empty_metadata() - with self.assertRaisesRegexp(iris.exceptions.TranslationError, - 'orientation'): + with self.assertRaisesRegex(iris.exceptions.TranslationError, + 'orientation'): grid_definition_template_90(section, metadata) def test_zero_height(self): section = self.uk() section['Nr'] = 0 metadata = empty_metadata() - with self.assertRaisesRegexp(iris.exceptions.TranslationError, - 'zero'): + with self.assertRaisesRegex(iris.exceptions.TranslationError, + 'zero'): grid_definition_template_90(section, metadata) def test_orthographic(self): section = self.uk() section['Nr'] = MDI metadata = empty_metadata() - with self.assertRaisesRegexp(iris.exceptions.TranslationError, - 'orthographic'): + with self.assertRaisesRegex(iris.exceptions.TranslationError, + 'orthographic'): grid_definition_template_90(section, metadata) def test_scanning_mode_positive_x(self): section = self.uk() section['scanningMode'] = 0b01000000 metadata = empty_metadata() - with self.assertRaisesRegexp(iris.exceptions.TranslationError, r'\+x'): + with self.assertRaisesRegex(iris.exceptions.TranslationError, r'\+x'): grid_definition_template_90(section, metadata) def test_scanning_mode_negative_y(self): section = self.uk() section['scanningMode'] = 0b10000000 metadata = empty_metadata() - with self.assertRaisesRegexp(iris.exceptions.TranslationError, '-y'): + with self.assertRaisesRegex(iris.exceptions.TranslationError, '-y'): grid_definition_template_90(section, metadata) diff --git a/iris_grib/tests/unit/load_convert/test_other_time_coord.py b/iris_grib/tests/unit/load_convert/test_other_time_coord.py index 13fa41da..0e5ccc70 100644 --- a/iris_grib/tests/unit/load_convert/test_other_time_coord.py +++ b/iris_grib/tests/unit/load_convert/test_other_time_coord.py @@ -8,9 +8,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests @@ -43,7 +40,7 @@ def test_t_with_bounds(self): rt = iris.coords.DimCoord(48, 'time', units='hours since epoch', bounds=[36, 60]) fp = iris.coords.DimCoord(6, 'forecast_period', units='hours') - with self.assertRaisesRegexp(ValueError, 'bounds'): + with self.assertRaisesRegex(ValueError, 'bounds'): other_time_coord(rt, fp) def test_frt_with_bounds(self): @@ -51,58 +48,58 @@ def test_frt_with_bounds(self): units='hours since epoch', bounds=[42, 54]) fp = iris.coords.DimCoord(6, 'forecast_period', units='hours') - with self.assertRaisesRegexp(ValueError, 'bounds'): + with self.assertRaisesRegex(ValueError, 'bounds'): other_time_coord(rt, fp) def test_fp_with_bounds(self): rt = iris.coords.DimCoord(48, 'time', units='hours since epoch') fp = iris.coords.DimCoord(6, 'forecast_period', units='hours', bounds=[3, 9]) - with self.assertRaisesRegexp(ValueError, 'bounds'): + with self.assertRaisesRegex(ValueError, 'bounds'): other_time_coord(rt, fp) def test_vector_t(self): rt = iris.coords.DimCoord([0, 3], 'time', units='hours since epoch') fp = iris.coords.DimCoord(6, 'forecast_period', units='hours') - with self.assertRaisesRegexp(ValueError, 'Vector'): + with self.assertRaisesRegex(ValueError, 'Vector'): other_time_coord(rt, fp) def test_vector_frt(self): rt = iris.coords.DimCoord([0, 3], 'forecast_reference_time', units='hours since epoch') fp = iris.coords.DimCoord(6, 'forecast_period', units='hours') - with self.assertRaisesRegexp(ValueError, 'Vector'): + with self.assertRaisesRegex(ValueError, 'Vector'): other_time_coord(rt, fp) def test_vector_fp(self): rt = iris.coords.DimCoord(48, 'time', units='hours since epoch') fp = iris.coords.DimCoord([6, 12], 'forecast_period', units='hours') - with self.assertRaisesRegexp(ValueError, 'Vector'): + with self.assertRaisesRegex(ValueError, 'Vector'): other_time_coord(rt, fp) def test_invalid_rt_name(self): rt = iris.coords.DimCoord(1, 'height') fp = iris.coords.DimCoord(6, 'forecast_period', units='hours') - with self.assertRaisesRegexp(ValueError, 'reference time'): + with self.assertRaisesRegex(ValueError, 'reference time'): other_time_coord(rt, fp) def test_invalid_t_unit(self): rt = iris.coords.DimCoord(1, 'time', units='Pa') fp = iris.coords.DimCoord(6, 'forecast_period', units='hours') - with self.assertRaisesRegexp(ValueError, 'unit.*Pa'): + with self.assertRaisesRegex(ValueError, 'unit.*Pa'): other_time_coord(rt, fp) def test_invalid_frt_unit(self): rt = iris.coords.DimCoord(1, 'forecast_reference_time', units='km') fp = iris.coords.DimCoord(6, 'forecast_period', units='hours') - with self.assertRaisesRegexp(ValueError, 'unit.*km'): + with self.assertRaisesRegex(ValueError, 'unit.*km'): other_time_coord(rt, fp) def test_invalid_fp_unit(self): rt = iris.coords.DimCoord(48, 'forecast_reference_time', units='hours since epoch') fp = iris.coords.DimCoord(6, 'forecast_period', units='kg') - with self.assertRaisesRegexp(ValueError, 'unit.*kg'): + with self.assertRaisesRegex(ValueError, 'unit.*kg'): other_time_coord(rt, fp) diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_section.py b/iris_grib/tests/unit/load_convert/test_product_definition_section.py index 96ab478d..a1b3ea93 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_section.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_section.py @@ -8,17 +8,14 @@ """ -from __future__ import (absolute_import, division, print_function) - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests -from iris.coords import DimCoord -import mock -import six - from itertools import product +from unittest import mock + +from iris.coords import DimCoord from iris_grib._load_convert import product_definition_section from iris_grib.tests.unit.load_convert import empty_metadata @@ -87,7 +84,7 @@ def run_function(): if fs_is_expected and not fs_is_present: # Should error since the expected keys are missing. error_message = 'FixedSurface' - with six.assertRaisesRegex(self, KeyError, error_message): + with self.assertRaisesRegex(KeyError, error_message): run_function() else: # Should have a successful run for all other circumstances. diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_0.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_0.py index 88121153..ca0e3ca9 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_0.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_0.py @@ -9,14 +9,11 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests -import mock +from unittest import mock import iris.coords diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_1.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_1.py index b508a5b1..b0dc55ad 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_1.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_1.py @@ -9,15 +9,12 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests from copy import deepcopy -import mock +from unittest import mock import warnings from iris.coords import DimCoord diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_10.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_10.py index 4af7b6a6..a43f4f42 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_10.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_10.py @@ -8,15 +8,12 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests from copy import deepcopy -import mock +from unittest import mock from iris.coords import DimCoord from iris_grib._load_convert import product_definition_template_10 diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_11.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_11.py index ee726d64..f35f30ef 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_11.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_11.py @@ -8,15 +8,12 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests from copy import deepcopy -import mock +from unittest import mock import warnings from iris.coords import DimCoord, CellMethod diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py index 009f1e53..0cc245ec 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py @@ -12,14 +12,11 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests -import mock +from unittest import mock import iris.coords from iris.exceptions import TranslationError @@ -94,14 +91,14 @@ def test_bad_statistic_method(self): section = section_4_sample() section['statisticalProcess'] = 999 msg = 'unsupported statistical process type \[999\]' - with self.assertRaisesRegexp(TranslationError, msg): + with self.assertRaisesRegex(TranslationError, msg): self._translate(section) def test_bad_spatial_processing_code(self): section = section_4_sample() section['spatialProcessing'] = 999 msg = 'unsupported spatial processing type \[999\]' - with self.assertRaisesRegexp(TranslationError, msg): + with self.assertRaisesRegex(TranslationError, msg): self._translate(section) diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_31.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_31.py index 2012a878..03fdfd9a 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_31.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_31.py @@ -8,19 +8,17 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests from copy import deepcopy -import mock -import numpy as np +from unittest import mock import warnings from iris.coords import AuxCoord +import numpy as np + from iris_grib.tests.unit.load_convert import empty_metadata from iris_grib._load_convert import product_definition_template_31 diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_32.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_32.py index 715e9d8a..8a94d0db 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_32.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_32.py @@ -8,19 +8,17 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests from copy import deepcopy -import mock -import numpy as np +from unittest import mock import warnings from iris.coords import AuxCoord, DimCoord +import numpy as np + from iris_grib.tests.unit.load_convert import empty_metadata from iris_grib._load_convert import _MDI as MDI diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_40.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_40.py index ca14c8d3..f436e741 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_40.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_40.py @@ -8,9 +8,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_8.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_8.py index 1422b4d1..311c9c0c 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_8.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_8.py @@ -9,15 +9,11 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa -import six - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests -import mock +from unittest import mock from iris_grib._load_convert import product_definition_template_8 @@ -62,10 +58,10 @@ def test_basic(self): ['aux_coords_and_dims', 'cell_methods']) self.assertEqual(self.metadata['cell_methods'], [mock.sentinel.dummy_cell_method]) - six.assertCountEqual(self, self.metadata['aux_coords_and_dims'], - [(self.frt_coord, None), - (mock.sentinel.dummy_fp_coord, None), - (mock.sentinel.dummy_time_coord, None)]) + self.assertCountEqual(self.metadata['aux_coords_and_dims'], + [(self.frt_coord, None), + (mock.sentinel.dummy_fp_coord, None), + (mock.sentinel.dummy_time_coord, None)]) if __name__ == '__main__': diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_9.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_9.py index d6b56be9..1254e72d 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_9.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_9.py @@ -9,14 +9,11 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests -import mock +from unittest import mock from iris.exceptions import TranslationError @@ -54,22 +51,22 @@ def test_basic(self): def test_fail_bad_probability_type(self): self.section['probabilityType'] = 17 - with self.assertRaisesRegexp(TranslationError, - 'unsupported probability type'): + with self.assertRaisesRegex(TranslationError, + 'unsupported probability type'): product_definition_template_9( self.section, self.metadata, self.frt_coord) def test_fail_bad_threshold_value(self): self.section['scaledValueOfUpperLimit'] = _MDI - with self.assertRaisesRegexp(TranslationError, - 'missing scaled value'): + with self.assertRaisesRegex(TranslationError, + 'missing scaled value'): product_definition_template_9( self.section, self.metadata, self.frt_coord) def test_fail_bad_threshold_scalefactor(self): self.section['scaleFactorOfUpperLimit'] = _MDI - with self.assertRaisesRegexp(TranslationError, - 'missing scale factor'): + with self.assertRaisesRegex(TranslationError, + 'missing scale factor'): product_definition_template_9( self.section, self.metadata, self.frt_coord) diff --git a/iris_grib/tests/unit/load_convert/test_projection_centre.py b/iris_grib/tests/unit/load_convert/test_projection_centre.py index a6df7546..41dddeb4 100644 --- a/iris_grib/tests/unit/load_convert/test_projection_centre.py +++ b/iris_grib/tests/unit/load_convert/test_projection_centre.py @@ -8,9 +8,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests diff --git a/iris_grib/tests/unit/load_convert/test_reference_time_coord.py b/iris_grib/tests/unit/load_convert/test_reference_time_coord.py index 4558f7ec..813ce367 100644 --- a/iris_grib/tests/unit/load_convert/test_reference_time_coord.py +++ b/iris_grib/tests/unit/load_convert/test_reference_time_coord.py @@ -10,9 +10,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests @@ -68,7 +65,7 @@ def test_unknown_significance(self): section = deepcopy(self.section) section['significanceOfReferenceTime'] = 5 emsg = 'unsupported significance' - with self.assertRaisesRegexp(TranslationError, emsg): + with self.assertRaisesRegex(TranslationError, emsg): self._check(section) diff --git a/iris_grib/tests/unit/load_convert/test_resolution_flags.py b/iris_grib/tests/unit/load_convert/test_resolution_flags.py index 84e10688..c409b5bb 100644 --- a/iris_grib/tests/unit/load_convert/test_resolution_flags.py +++ b/iris_grib/tests/unit/load_convert/test_resolution_flags.py @@ -8,9 +8,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests diff --git a/iris_grib/tests/unit/load_convert/test_satellite_common.py b/iris_grib/tests/unit/load_convert/test_satellite_common.py index 790e3853..edcdd2e2 100644 --- a/iris_grib/tests/unit/load_convert/test_satellite_common.py +++ b/iris_grib/tests/unit/load_convert/test_satellite_common.py @@ -8,19 +8,17 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests from copy import deepcopy -import mock -import numpy as np +from unittest import mock import warnings from iris.coords import AuxCoord +import numpy as np + from iris_grib.tests.unit.load_convert import empty_metadata from iris_grib._load_convert import satellite_common diff --git a/iris_grib/tests/unit/load_convert/test_scanning_mode.py b/iris_grib/tests/unit/load_convert/test_scanning_mode.py index 1d00a061..add0c839 100644 --- a/iris_grib/tests/unit/load_convert/test_scanning_mode.py +++ b/iris_grib/tests/unit/load_convert/test_scanning_mode.py @@ -8,9 +8,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests diff --git a/iris_grib/tests/unit/load_convert/test_statistical_cell_method.py b/iris_grib/tests/unit/load_convert/test_statistical_cell_method.py index 29389fd0..d4437e82 100644 --- a/iris_grib/tests/unit/load_convert/test_statistical_cell_method.py +++ b/iris_grib/tests/unit/load_convert/test_statistical_cell_method.py @@ -9,9 +9,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests @@ -57,26 +54,26 @@ def test_different_statistic(self): def test_fail_bad_ranges(self): self.section['numberOfTimeRange'] = 0 - with self.assertRaisesRegexp(TranslationError, - 'aggregation over "0 time ranges"'): + with self.assertRaisesRegex(TranslationError, + 'aggregation over "0 time ranges"'): statistical_cell_method(self.section) def test_fail_multiple_ranges(self): self.section['numberOfTimeRange'] = 2 - with self.assertRaisesRegexp(TranslationError, - 'multiple time ranges \[2\]'): + with self.assertRaisesRegex(TranslationError, + 'multiple time ranges \[2\]'): statistical_cell_method(self.section) def test_fail_unknown_statistic(self): self.section['typeOfStatisticalProcessing'] = 17 - with self.assertRaisesRegexp( + with self.assertRaisesRegex( TranslationError, 'contains an unsupported statistical process type \[17\]'): statistical_cell_method(self.section) def test_fail_bad_increment_type(self): self.section['typeOfTimeIncrement'] = 7 - with self.assertRaisesRegexp( + with self.assertRaisesRegex( TranslationError, 'time-increment type \[7\] is not supported'): statistical_cell_method(self.section) @@ -112,7 +109,7 @@ def test_fail_unsupported_pdt(self): # Rejects PDTs other than the ones tested above. self.section['productDefinitionTemplateNumber'] = 101 msg = "can't get statistical method for unsupported pdt : 4.101" - with self.assertRaisesRegexp(ValueError, msg): + with self.assertRaisesRegex(ValueError, msg): statistical_cell_method(self.section) diff --git a/iris_grib/tests/unit/load_convert/test_statistical_forecast_period_coord.py b/iris_grib/tests/unit/load_convert/test_statistical_forecast_period_coord.py index 9fec8303..3b941f1d 100644 --- a/iris_grib/tests/unit/load_convert/test_statistical_forecast_period_coord.py +++ b/iris_grib/tests/unit/load_convert/test_statistical_forecast_period_coord.py @@ -8,15 +8,12 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests import datetime -import mock +from unittest import mock from iris_grib._load_convert import statistical_forecast_period_coord diff --git a/iris_grib/tests/unit/load_convert/test_time_range_unit.py b/iris_grib/tests/unit/load_convert/test_time_range_unit.py index 33ddcb9f..a87de483 100644 --- a/iris_grib/tests/unit/load_convert/test_time_range_unit.py +++ b/iris_grib/tests/unit/load_convert/test_time_range_unit.py @@ -8,9 +8,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests @@ -38,7 +35,7 @@ def test_units(self): def test_bad_indicator(self): emsg = 'unsupported time range' - with self.assertRaisesRegexp(TranslationError, emsg): + with self.assertRaisesRegex(TranslationError, emsg): time_range_unit(-1) diff --git a/iris_grib/tests/unit/load_convert/test_translate_phenomenon.py b/iris_grib/tests/unit/load_convert/test_translate_phenomenon.py index 10bd30fd..dd1f22c1 100644 --- a/iris_grib/tests/unit/load_convert/test_translate_phenomenon.py +++ b/iris_grib/tests/unit/load_convert/test_translate_phenomenon.py @@ -8,9 +8,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests diff --git a/iris_grib/tests/unit/load_convert/test_unscale.py b/iris_grib/tests/unit/load_convert/test_unscale.py index 3d879494..c7098b17 100644 --- a/iris_grib/tests/unit/load_convert/test_unscale.py +++ b/iris_grib/tests/unit/load_convert/test_unscale.py @@ -8,9 +8,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests diff --git a/iris_grib/tests/unit/load_convert/test_validity_time_coord.py b/iris_grib/tests/unit/load_convert/test_validity_time_coord.py index 3a9b049e..e6aa84aa 100644 --- a/iris_grib/tests/unit/load_convert/test_validity_time_coord.py +++ b/iris_grib/tests/unit/load_convert/test_validity_time_coord.py @@ -8,18 +8,15 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests -from cf_units import Unit -import mock -import numpy as np +from unittest import mock +from cf_units import Unit from iris.coords import DimCoord +import numpy as np from iris_grib._load_convert import validity_time_coord @@ -36,14 +33,14 @@ def test_frt_shape(self): frt = mock.Mock(shape=(2,)) fp = mock.Mock(shape=(1,)) emsg = 'scalar forecast reference time' - with self.assertRaisesRegexp(ValueError, emsg): + with self.assertRaisesRegex(ValueError, emsg): validity_time_coord(frt, fp) def test_fp_shape(self): frt = mock.Mock(shape=(1,)) fp = mock.Mock(shape=(2,)) emsg = 'scalar forecast period' - with self.assertRaisesRegexp(ValueError, emsg): + with self.assertRaisesRegex(ValueError, emsg): validity_time_coord(frt, fp) def test(self): diff --git a/iris_grib/tests/unit/load_convert/test_vertical_coords.py b/iris_grib/tests/unit/load_convert/test_vertical_coords.py index 5edf96f3..8de79f4e 100644 --- a/iris_grib/tests/unit/load_convert/test_vertical_coords.py +++ b/iris_grib/tests/unit/load_convert/test_vertical_coords.py @@ -8,15 +8,12 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests from copy import deepcopy -import mock +from unittest import mock from iris.coords import DimCoord from iris.exceptions import TranslationError @@ -115,7 +112,7 @@ def test_different_fixed_surfaces(self): 'scaleFactorOfFirstFixedSurface': None, 'typeOfSecondFixedSurface': 0} emsg = 'different types of first and second fixed surface' - with self.assertRaisesRegexp(TranslationError, emsg): + with self.assertRaisesRegex(TranslationError, emsg): vertical_coords(section, None) def test_same_fixed_surfaces_missing_second_scaled_value(self): @@ -126,7 +123,7 @@ def test_same_fixed_surfaces_missing_second_scaled_value(self): 'typeOfSecondFixedSurface': 100, 'scaledValueOfSecondFixedSurface': MISSING_LEVEL} emsg = 'missing scaled value of second fixed surface' - with self.assertRaisesRegexp(TranslationError, emsg): + with self.assertRaisesRegex(TranslationError, emsg): vertical_coords(section, None) def test_pressure_with_second_fixed_surface(self): diff --git a/iris_grib/tests/unit/message/__init__.py b/iris_grib/tests/unit/message/__init__.py index 9f5fa1be..3903dabb 100644 --- a/iris_grib/tests/unit/message/__init__.py +++ b/iris_grib/tests/unit/message/__init__.py @@ -4,6 +4,3 @@ # See COPYING and COPYING.LESSER in the root of the repository for full # licensing details. """Unit tests for the :mod:`iris_grib.message` package.""" - -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa diff --git a/iris_grib/tests/unit/message/test_GribMessage.py b/iris_grib/tests/unit/message/test_GribMessage.py index 535f4f8a..bdfea0c4 100644 --- a/iris_grib/tests/unit/message/test_GribMessage.py +++ b/iris_grib/tests/unit/message/test_GribMessage.py @@ -8,17 +8,13 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa -import six - # Import iris_grib.tests first so that some things can be initialised before # importing anything else. import iris_grib.tests as tests from abc import ABCMeta, abstractmethod +from unittest import mock -import mock import numpy as np import numpy.ma as ma @@ -44,11 +40,9 @@ def test_release_file(self): filename = tests.get_data_path(('GRIB', '3_layer_viz', '3_layer.grib2')) my_file = open(filename) - if six.PY2: - self.patch('__builtin__.open', mock.Mock(return_value=my_file)) - else: - import builtins - self.patch('builtins.open', mock.Mock(return_value=my_file)) + + import builtins + self.patch('builtins.open', mock.Mock(return_value=my_file)) messages = list(GribMessage.messages_from_filename(filename)) self.assertFalse(my_file.closed) @@ -109,7 +103,7 @@ def test_bitmap__shapes_mismatch(self): 6: {'bitMapIndicator': 0, 'bitmap': self.bitmap}, 7: {'codedValues': values}}) - with self.assertRaisesRegexp(TranslationError, 'do not match'): + with self.assertRaisesRegex(TranslationError, 'do not match'): as_concrete_data(message.data) def test_bitmap__invalid_indicator(self): @@ -118,7 +112,7 @@ def test_bitmap__invalid_indicator(self): 6: {'bitMapIndicator': 100, 'bitmap': None}, 7: {'codedValues': values}}) - with self.assertRaisesRegexp(TranslationError, 'unsupported bitmap'): + with self.assertRaisesRegex(TranslationError, 'unsupported bitmap'): as_concrete_data(message.data) @@ -126,7 +120,7 @@ class Test_data__unsupported(tests.IrisGribTest): def test_unsupported_grid_definition(self): message = _make_test_message({3: {'sourceOfGridDefinition': 1}, 6: SECTION_6_NO_BITMAP}) - with self.assertRaisesRegexp(TranslationError, 'source'): + with self.assertRaisesRegex(TranslationError, 'source'): message.data def test_unsupported_quasi_regular__number_of_octets(self): @@ -135,7 +129,7 @@ def test_unsupported_quasi_regular__number_of_octets(self): 'numberOfOctectsForNumberOfPoints': 1, 'gridDefinitionTemplateNumber': 0}, 6: SECTION_6_NO_BITMAP}) - with self.assertRaisesRegexp(TranslationError, 'quasi-regular'): + with self.assertRaisesRegex(TranslationError, 'quasi-regular'): message.data def test_unsupported_quasi_regular__interpretation(self): @@ -145,7 +139,7 @@ def test_unsupported_quasi_regular__interpretation(self): 'interpretationOfNumberOfPoints': 1, 'gridDefinitionTemplateNumber': 0}, 6: SECTION_6_NO_BITMAP}) - with self.assertRaisesRegexp(TranslationError, 'quasi-regular'): + with self.assertRaisesRegex(TranslationError, 'quasi-regular'): message.data def test_unsupported_template(self): @@ -154,13 +148,13 @@ def test_unsupported_template(self): 'numberOfOctectsForNumberOfPoints': 0, 'interpretationOfNumberOfPoints': 0, 'gridDefinitionTemplateNumber': 2}}) - with self.assertRaisesRegexp(TranslationError, 'template'): + with self.assertRaisesRegex(TranslationError, 'template'): message.data # Abstract, mix-in class for testing the `data` attribute for various # grid definition templates. -class Mixin_data__grid_template(six.with_metaclass(ABCMeta, object)): +class Mixin_data__grid_template(metaclass=ABCMeta): @abstractmethod def section_3(self, scanning_mode): raise NotImplementedError() @@ -169,7 +163,7 @@ def test_unsupported_scanning_mode(self): message = _make_test_message( {3: self.section_3(1), 6: SECTION_6_NO_BITMAP}) - with self.assertRaisesRegexp(TranslationError, 'scanning mode'): + with self.assertRaisesRegex(TranslationError, 'scanning mode'): message.data def _test(self, scanning_mode): @@ -267,8 +261,8 @@ def test(self): {3: _example_section_3(999, 0), 6: SECTION_6_NO_BITMAP, 7: {'codedValues': np.arange(12)}}) - with self.assertRaisesRegexp(TranslationError, - 'template 999 is not supported'): + with self.assertRaisesRegex(TranslationError, + 'template 999 is not supported'): data = message.data diff --git a/iris_grib/tests/unit/message/test_Section.py b/iris_grib/tests/unit/message/test_Section.py index aa6a59e8..fca3815d 100644 --- a/iris_grib/tests/unit/message/test_Section.py +++ b/iris_grib/tests/unit/message/test_Section.py @@ -8,9 +8,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # Import iris_grib.tests first so that some things can be initialised before # importing anything else. import iris_grib.tests as tests @@ -50,7 +47,7 @@ def test_numberOfSection(self): def test_invalid(self): section = Section(self.grib_id, None, ['Ni']) - with self.assertRaisesRegexp(KeyError, 'Nii'): + with self.assertRaisesRegex(KeyError, 'Nii'): section['Nii'] diff --git a/iris_grib/tests/unit/message/test__DataProxy.py b/iris_grib/tests/unit/message/test__DataProxy.py index 069ddda7..3b6dc6a3 100644 --- a/iris_grib/tests/unit/message/test__DataProxy.py +++ b/iris_grib/tests/unit/message/test__DataProxy.py @@ -8,9 +8,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # Import iris_grib.tests first so that some things can be initialised before # importing anything else. import iris_grib.tests as tests @@ -40,7 +37,7 @@ def test_bitmap_present(self): def test_bitmap__invalid_indicator(self): section_6 = {'bitMapIndicator': 100, 'bitmap': None} data_proxy = _DataProxy(0, 0, 0) - with self.assertRaisesRegexp(TranslationError, 'unsupported bitmap'): + with self.assertRaisesRegex(TranslationError, 'unsupported bitmap'): data_proxy._bitmap(section_6) diff --git a/iris_grib/tests/unit/message/test__MessageLocation.py b/iris_grib/tests/unit/message/test__MessageLocation.py index 9ab925a7..420de95a 100644 --- a/iris_grib/tests/unit/message/test__MessageLocation.py +++ b/iris_grib/tests/unit/message/test__MessageLocation.py @@ -8,14 +8,11 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # Import iris_grib.tests first so that some things can be initialised before # importing anything else. import iris_grib.tests as tests -import mock +from unittest import mock from iris_grib.message import _MessageLocation diff --git a/iris_grib/tests/unit/message/test__RawGribMessage.py b/iris_grib/tests/unit/message/test__RawGribMessage.py index 0adf9152..67156e50 100644 --- a/iris_grib/tests/unit/message/test__RawGribMessage.py +++ b/iris_grib/tests/unit/message/test__RawGribMessage.py @@ -8,9 +8,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # Import iris_grib.tests first so that some things can be initialised before # importing anything else. import iris_grib.tests as tests diff --git a/iris_grib/tests/unit/save_rules/__init__.py b/iris_grib/tests/unit/save_rules/__init__.py index 27d78847..3779aea0 100644 --- a/iris_grib/tests/unit/save_rules/__init__.py +++ b/iris_grib/tests/unit/save_rules/__init__.py @@ -5,14 +5,12 @@ # licensing details. """Unit tests for the :mod:`iris_grib.grib_save_rules` module.""" -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # Import iris_grib.tests first so that some things can be initialised before # importing anything else. import iris_grib.tests as tests -import mock +from unittest import mock + import numpy as np from iris.coords import DimCoord @@ -21,7 +19,7 @@ from iris.fileformats.pp import EARTH_RADIUS as PP_DEFAULT_EARTH_RADIUS -class GdtTestMixin(object): +class GdtTestMixin: """Some handy common test capabilities for grib grid-definition tests.""" TARGET_MODULE = 'iris_grib._save_rules' diff --git a/iris_grib/tests/unit/save_rules/test__missing_forecast_period.py b/iris_grib/tests/unit/save_rules/test__missing_forecast_period.py index e46d1356..b525b652 100644 --- a/iris_grib/tests/unit/save_rules/test__missing_forecast_period.py +++ b/iris_grib/tests/unit/save_rules/test__missing_forecast_period.py @@ -8,9 +8,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # Import iris_grib.tests first so that some things can be initialised before # importing anything else. import iris_grib.tests as tests diff --git a/iris_grib/tests/unit/save_rules/test__non_missing_forecast_period.py b/iris_grib/tests/unit/save_rules/test__non_missing_forecast_period.py index 6d40f369..e558650d 100644 --- a/iris_grib/tests/unit/save_rules/test__non_missing_forecast_period.py +++ b/iris_grib/tests/unit/save_rules/test__non_missing_forecast_period.py @@ -5,9 +5,6 @@ # licensing details. """Unit tests for module-level functions.""" -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # Import iris_grib.tests first so that some things can be initialised before # importing anything else. import iris_grib.tests as tests diff --git a/iris_grib/tests/unit/save_rules/test__product_definition_template_8_10_and_11.py b/iris_grib/tests/unit/save_rules/test__product_definition_template_8_10_and_11.py index 7de3fe52..f2e9762e 100644 --- a/iris_grib/tests/unit/save_rules/test__product_definition_template_8_10_and_11.py +++ b/iris_grib/tests/unit/save_rules/test__product_definition_template_8_10_and_11.py @@ -9,16 +9,14 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # Import iris_grib.tests first so that some things can be initialised before # importing anything else. import iris_grib.tests as tests +from unittest import mock + from cf_units import Unit import gribapi -import mock from iris.coords import CellMethod, DimCoord import iris.tests.stock as stock @@ -61,8 +59,8 @@ def test_multiple_cell_method_coords(self, mock_set): cell_method = CellMethod(method='sum', coords=['time', 'forecast_period']) cube.add_cell_method(cell_method) - with self.assertRaisesRegexp(ValueError, - 'Cannot handle multiple coordinate name'): + with self.assertRaisesRegex(ValueError, + 'Cannot handle multiple coordinate name'): _product_definition_template_8_10_and_11(cube, mock.sentinel.grib) @mock.patch.object(gribapi, 'grib_set') @@ -70,7 +68,7 @@ def test_cell_method_coord_name_fail(self, mock_set): cube = self.cube cell_method = CellMethod(method='mean', coords=['season']) cube.add_cell_method(cell_method) - with self.assertRaisesRegexp( + with self.assertRaisesRegex( ValueError, "Expected a cell method with a coordinate " "name of 'time'"): _product_definition_template_8_10_and_11(cube, mock.sentinel.grib) @@ -89,7 +87,7 @@ def test_multiple_points(self, mock_set): bounds=[[22, 23], [23, 24], [24, 25]], units=Unit('days since epoch', calendar='standard')) self.cube.add_aux_coord(coord, 0) - with self.assertRaisesRegexp( + with self.assertRaisesRegex( ValueError, 'Expected length one time coordinate'): _product_definition_template_8_10_and_11(self.cube, mock.sentinel.grib) @@ -100,7 +98,7 @@ def test_no_bounds(self, mock_set): coord = DimCoord(23, 'time', units=Unit('days since epoch', calendar='standard')) self.cube.add_aux_coord(coord) - with self.assertRaisesRegexp( + with self.assertRaisesRegex( ValueError, 'Expected time coordinate with two bounds, ' 'got 0 bounds'): _product_definition_template_8_10_and_11(self.cube, @@ -112,7 +110,7 @@ def test_more_than_two_bounds(self, mock_set): coord = DimCoord(23, 'time', bounds=[21, 22, 23], units=Unit('days since epoch', calendar='standard')) self.cube.add_aux_coord(coord) - with self.assertRaisesRegexp( + with self.assertRaisesRegex( ValueError, 'Expected time coordinate with two bounds, ' 'got 3 bounds'): _product_definition_template_8_10_and_11(self.cube, diff --git a/iris_grib/tests/unit/save_rules/test_data_section.py b/iris_grib/tests/unit/save_rules/test_data_section.py index a286fcdd..c309ec20 100644 --- a/iris_grib/tests/unit/save_rules/test_data_section.py +++ b/iris_grib/tests/unit/save_rules/test_data_section.py @@ -8,17 +8,14 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # import iris_grib.tests first so that some things can be initialised before # importing anything else import iris_grib.tests as tests -import mock -import numpy as np +from unittest import mock import iris.cube +import numpy as np from iris_grib._save_rules import data_section diff --git a/iris_grib/tests/unit/save_rules/test_fixup_float32_as_int32.py b/iris_grib/tests/unit/save_rules/test_fixup_float32_as_int32.py index a39a186f..0357e6f4 100644 --- a/iris_grib/tests/unit/save_rules/test_fixup_float32_as_int32.py +++ b/iris_grib/tests/unit/save_rules/test_fixup_float32_as_int32.py @@ -8,9 +8,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # Import iris_grib.tests first so that some things can be initialised before # importing anything else. import iris_grib.tests as tests diff --git a/iris_grib/tests/unit/save_rules/test_fixup_int32_as_uint32.py b/iris_grib/tests/unit/save_rules/test_fixup_int32_as_uint32.py index a07a3d88..b885be15 100644 --- a/iris_grib/tests/unit/save_rules/test_fixup_int32_as_uint32.py +++ b/iris_grib/tests/unit/save_rules/test_fixup_int32_as_uint32.py @@ -8,9 +8,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # Import iris.tests first so that some things can be initialised before # importing anything else. import iris_grib.tests as tests diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_0.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_0.py index 855c36f5..4784cfa3 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_template_0.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_0.py @@ -8,9 +8,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # Import iris_grib.tests first so that some things can be initialised before # importing anything else. import iris_grib.tests as tests diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_1.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_1.py index b3bdb20a..f1ce1215 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_template_1.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_1.py @@ -8,9 +8,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # Import iris_grib.tests first so that some things can be initialised before # importing anything else. import iris_grib.tests as tests @@ -110,7 +107,7 @@ def test__fail_rotated_pole_nonstandard_meridian(self): north_pole_grid_longitude=22.5, ellipsoid=self.default_ellipsoid) test_cube = self._make_test_cube(cs=cs) - with self.assertRaisesRegexp( + with self.assertRaisesRegex( TranslationError, 'not yet support .* rotated prime meridian.'): grid_definition_template_1(test_cube, self.mock_grib) diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py index 28014ba1..5410b186 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py @@ -8,9 +8,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # Import iris_grib.tests first so that some things can be initialised before # importing anything else. import iris_grib.tests as tests diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_12.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_12.py index 5d4d5796..2efcecb9 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_template_12.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_12.py @@ -8,9 +8,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # Import iris_grib.tests first so that some things can be initialised before # importing anything else. import iris_grib.tests as tests diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_30.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_30.py index 0f8801d0..9622e5f0 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_template_30.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_30.py @@ -8,9 +8,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # Import iris_grib.tests first so that some things can be initialised before # importing anything else. import iris_grib.tests as tests diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_4.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_4.py index 4dd4fbc0..ebb707fe 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_template_4.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_4.py @@ -8,9 +8,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # Import iris_grib.tests first so that some things can be initialised before # importing anything else. import iris_grib.tests as tests diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_5.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_5.py index d750e988..a47e3100 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_template_5.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_5.py @@ -8,9 +8,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # Import iris_grib.tests first so that some things can be initialised before # importing anything else. import iris_grib.tests as tests @@ -102,7 +99,7 @@ def test__fail_rotated_pole_nonstandard_meridian(self): north_pole_grid_longitude=22.5, ellipsoid=self.default_ellipsoid) test_cube = self._make_test_cube(cs=cs) - with self.assertRaisesRegexp( + with self.assertRaisesRegex( TranslationError, 'not yet support .* rotated prime meridian.'): grid_definition_template_5(test_cube, self.mock_grib) diff --git a/iris_grib/tests/unit/save_rules/test_identification.py b/iris_grib/tests/unit/save_rules/test_identification.py index 4089f270..a49ee4ad 100644 --- a/iris_grib/tests/unit/save_rules/test_identification.py +++ b/iris_grib/tests/unit/save_rules/test_identification.py @@ -5,15 +5,13 @@ # licensing details. """Unit tests for `iris_grib.grib_save_rules.identification`.""" -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # Import iris_grib.tests first so that some things can be initialised before # importing anything else. import iris_grib.tests as tests +from unittest import mock + import gribapi -import mock import iris import iris.tests.stock as stock diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_1.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_1.py index f3543375..2543aaac 100644 --- a/iris_grib/tests/unit/save_rules/test_product_definition_template_1.py +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_1.py @@ -8,16 +8,14 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # Import iris_grib.tests first so that some things can be initialised before # importing anything else. import iris_grib.tests as tests +from unittest import mock + from cf_units import Unit import gribapi -import mock from iris.coords import CellMethod, DimCoord import iris.tests.stock as stock @@ -57,7 +55,7 @@ def test_multiple_realization_values(self, mock_set): cube.add_aux_coord(coord, 0) msg = "'realization' coordinate with one point is required" - with self.assertRaisesRegexp(ValueError, msg): + with self.assertRaisesRegex(ValueError, msg): product_definition_template_1(cube, mock.sentinel.grib) diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_10.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_10.py index 20174acd..0c6c2fba 100644 --- a/iris_grib/tests/unit/save_rules/test_product_definition_template_10.py +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_10.py @@ -8,16 +8,14 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # Import iris_grib.tests first so that some things can be initialised before # importing anything else. import iris_grib.tests as tests +from unittest import mock + from cf_units import Unit import gribapi -import mock from iris.coords import DimCoord import iris.tests.stock as stock @@ -55,7 +53,7 @@ def test_multiple_percentile_value(self, mock_set): cube.add_aux_coord(percentile_coord, 0) err_msg = "A cube 'percentile_over_time' coordinate with one point "\ "is required" - with self.assertRaisesRegexp(ValueError, err_msg): + with self.assertRaisesRegex(ValueError, err_msg): product_definition_template_10(cube, mock.sentinel.grib) diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_11.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_11.py index 62e28ece..d3aca8d3 100644 --- a/iris_grib/tests/unit/save_rules/test_product_definition_template_11.py +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_11.py @@ -8,16 +8,14 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # Import iris_grib.tests first so that some things can be initialised before # importing anything else. import iris_grib.tests as tests +from unittest import mock + from cf_units import Unit import gribapi -import mock from iris.coords import CellMethod, DimCoord import iris.tests.stock as stock diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py index c552f560..5461e93e 100644 --- a/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py @@ -8,16 +8,14 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # Import iris_grib.tests first so that some things can be initialised before # importing anything else. import iris_grib.tests as tests +from unittest import mock + from cf_units import Unit import gribapi -import mock from iris.coords import CellMethod, DimCoord import iris.tests.stock as stock diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_40.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_40.py index bbe55470..b6a9f81f 100644 --- a/iris_grib/tests/unit/save_rules/test_product_definition_template_40.py +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_40.py @@ -8,16 +8,14 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # Import iris_grib.tests first so that some things can be initialised before # importing anything else. import iris_grib.tests as tests +from unittest import mock + from cf_units import Unit import gribapi -import mock from iris.coords import DimCoord import iris.tests.stock as stock diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_8.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_8.py index 853b8b72..5d47aec9 100644 --- a/iris_grib/tests/unit/save_rules/test_product_definition_template_8.py +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_8.py @@ -8,16 +8,14 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # Import iris_grib.tests first so that some things can be initialised before # importing anything else. import iris_grib.tests as tests +from unittest import mock + from cf_units import Unit import gribapi -import mock from iris.coords import CellMethod, DimCoord import iris.tests.stock as stock diff --git a/iris_grib/tests/unit/save_rules/test_reference_time.py b/iris_grib/tests/unit/save_rules/test_reference_time.py index 3dad0f2c..6998abcc 100644 --- a/iris_grib/tests/unit/save_rules/test_reference_time.py +++ b/iris_grib/tests/unit/save_rules/test_reference_time.py @@ -5,15 +5,13 @@ # licensing details. """Unit tests for `iris_grib.grib_save_rules.reference_time`.""" -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # Import iris_grib.tests first so that some things can be initialised before # importing anything else. import iris_grib.tests as tests +from unittest import mock + import gribapi -import mock from iris_grib import load_cubes from iris_grib._save_rules import reference_time diff --git a/iris_grib/tests/unit/save_rules/test_set_fixed_surfaces.py b/iris_grib/tests/unit/save_rules/test_set_fixed_surfaces.py index a1b7d53d..280c39cf 100644 --- a/iris_grib/tests/unit/save_rules/test_set_fixed_surfaces.py +++ b/iris_grib/tests/unit/save_rules/test_set_fixed_surfaces.py @@ -8,9 +8,6 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # Import iris_grib.tests first so that some things can be initialised before # importing anything else. import iris_grib.tests as tests diff --git a/iris_grib/tests/unit/save_rules/test_set_time_increment.py b/iris_grib/tests/unit/save_rules/test_set_time_increment.py index 703399fc..a6bf57b7 100644 --- a/iris_grib/tests/unit/save_rules/test_set_time_increment.py +++ b/iris_grib/tests/unit/save_rules/test_set_time_increment.py @@ -8,15 +8,13 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # Import iris_grib.tests first so that some things can be initialised before # importing anything else. import iris_grib.tests as tests +from unittest import mock + import gribapi -import mock from iris.coords import CellMethod diff --git a/iris_grib/tests/unit/save_rules/test_set_time_range.py b/iris_grib/tests/unit/save_rules/test_set_time_range.py index d90fe904..ac823707 100644 --- a/iris_grib/tests/unit/save_rules/test_set_time_range.py +++ b/iris_grib/tests/unit/save_rules/test_set_time_range.py @@ -8,19 +8,15 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa -import six - # Import iris_grib.tests first so that some things can be initialised before # importing anything else. import iris_grib.tests as tests +from unittest import mock import warnings from cf_units import Unit import gribapi -import mock from iris.coords import DimCoord @@ -34,21 +30,21 @@ def setUp(self): calendar='standard')) def test_no_bounds(self): - with self.assertRaisesRegexp(ValueError, 'Expected time coordinate ' - 'with two bounds, got 0 bounds'): + with self.assertRaisesRegex(ValueError, 'Expected time coordinate ' + 'with two bounds, got 0 bounds'): set_time_range(self.coord, mock.sentinel.grib) def test_three_bounds(self): self.coord.bounds = [0, 1, 2] - with self.assertRaisesRegexp(ValueError, 'Expected time coordinate ' - 'with two bounds, got 3 bounds'): + with self.assertRaisesRegex(ValueError, 'Expected time coordinate ' + 'with two bounds, got 3 bounds'): set_time_range(self.coord, mock.sentinel.grib) def test_non_scalar(self): coord = DimCoord([0, 1], 'time', bounds=[[0, 1], [1, 2]], units=Unit('hours since epoch', calendar='standard')) - with self.assertRaisesRegexp(ValueError, 'Expected length one time ' - 'coordinate, got 2 points'): + with self.assertRaisesRegex(ValueError, 'Expected length one time ' + 'coordinate, got 2 points'): set_time_range(coord, mock.sentinel.grib) @mock.patch.object(gribapi, 'grib_set') @@ -86,7 +82,7 @@ def test_fractional_hours(self, mock_set_long): self.assertEqual(len(warn), 1) msg = 'Truncating floating point lengthOfTimeRange 10\.8?9+ ' \ 'to integer value 10' - six.assertRegex(self, str(warn[0].message), msg) + self.assertRegex(str(warn[0].message), msg) mock_set_long.assert_any_call(mock.sentinel.grib, 'indicatorOfUnitForTimeRange', 1) mock_set_long.assert_any_call(mock.sentinel.grib, diff --git a/iris_grib/tests/unit/test_GribWrapper.py b/iris_grib/tests/unit/test_GribWrapper.py index 4e97ddc6..45a402c6 100644 --- a/iris_grib/tests/unit/test_GribWrapper.py +++ b/iris_grib/tests/unit/test_GribWrapper.py @@ -8,15 +8,12 @@ """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - # Import iris_grib.tests first so that some things can be initialised before # importing anything else. import iris_grib.tests as tests -import mock import numpy as np +from unittest import mock from iris._lazy_data import as_concrete_data, is_lazy_data from iris.exceptions import TranslationError @@ -68,7 +65,7 @@ def func(grib_message, key): emsg = "GRIB edition 2 is not supported by 'GribWrapper'" with mock.patch('gribapi.grib_get_long', func): - with self.assertRaisesRegexp(TranslationError, emsg): + with self.assertRaisesRegex(TranslationError, emsg): GribWrapper(None) def test_edition_1(self): diff --git a/iris_grib/tests/unit/test__load_generate.py b/iris_grib/tests/unit/test__load_generate.py index 119dd511..049a98b4 100644 --- a/iris_grib/tests/unit/test__load_generate.py +++ b/iris_grib/tests/unit/test__load_generate.py @@ -5,12 +5,9 @@ # licensing details. """Unit tests for the `iris_grib._load_generate` function.""" -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - import iris_grib.tests as tests -import mock +from unittest import mock import iris from iris.exceptions import TranslationError @@ -61,7 +58,7 @@ def test_grib_unknown(self): mfunc = 'iris_grib.GribMessage.messages_from_filename' emsg = 'GRIB edition 0 is not supported' with mock.patch(mfunc, return_value=[message]): - with self.assertRaisesRegexp(TranslationError, emsg): + with self.assertRaisesRegex(TranslationError, emsg): next(_load_generate(self.fname)) diff --git a/iris_grib/tests/unit/test_load_cubes.py b/iris_grib/tests/unit/test_load_cubes.py index a1528952..ea3ed0b1 100644 --- a/iris_grib/tests/unit/test_load_cubes.py +++ b/iris_grib/tests/unit/test_load_cubes.py @@ -5,12 +5,9 @@ # licensing details. """Unit tests for the `iris_grib.load_cubes` function.""" -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - import iris_grib.tests as tests -import mock +from unittest import mock import iris from iris.fileformats.rules import Loader diff --git a/iris_grib/tests/unit/test_save_grib2.py b/iris_grib/tests/unit/test_save_grib2.py index 710a6ab0..9b449c0b 100644 --- a/iris_grib/tests/unit/test_save_grib2.py +++ b/iris_grib/tests/unit/test_save_grib2.py @@ -5,15 +5,11 @@ # licensing details. """Unit tests for the `iris_grib.save_grib2` function.""" -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa -import six - # Import iris_grib.tests first so that some things can be initialised before # importing anything else. import iris_grib.tests as tests -import mock +from unittest import mock import iris_grib diff --git a/iris_grib/tests/unit/test_save_messages.py b/iris_grib/tests/unit/test_save_messages.py index 4ce02b68..5715cf1a 100644 --- a/iris_grib/tests/unit/test_save_messages.py +++ b/iris_grib/tests/unit/test_save_messages.py @@ -5,17 +5,13 @@ # licensing details. """Unit tests for the `iris_grib.save_messages` function.""" -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa -import six - # Import iris_grib.tests first so that some things can be initialised before # importing anything else. import iris_grib.tests as tests import gribapi -import mock import numpy as np +from unittest import mock import iris_grib @@ -26,12 +22,8 @@ def setUp(self): self.grib_message = gribapi.grib_new_from_samples("GRIB2") def test_save(self): - if six.PY3: - open_func = 'builtins.open' - else: - open_func = '__builtin__.open' m = mock.mock_open() - with mock.patch(open_func, m, create=True): + with mock.patch('builtins.open', m, create=True): # sending a MagicMock object to gribapi raises an AssertionError # as the gribapi code does a type check # this is deemed acceptable within the scope of this unit test @@ -40,12 +32,8 @@ def test_save(self): self.assertTrue(mock.call('foo.grib2', 'wb') in m.mock_calls) def test_save_append(self): - if six.PY3: - open_func = 'builtins.open' - else: - open_func = '__builtin__.open' m = mock.mock_open() - with mock.patch(open_func, m, create=True): + with mock.patch('builtins.open', m, create=True): # sending a MagicMock object to gribapi raises an AssertionError # as the gribapi code does a type check # this is deemed acceptable within the scope of this unit test diff --git a/setup.py b/setup.py index a8496299..e91563af 100644 --- a/setup.py +++ b/setup.py @@ -1,5 +1,4 @@ #!/usr/bin/env python -from __future__ import print_function import os import os.path From 2f9f373973cb75b573299d56d94858fb4db72576 Mon Sep 17 00:00:00 2001 From: lbdreyer Date: Thu, 28 Nov 2019 14:03:41 +0000 Subject: [PATCH 139/583] Remove eccodes py3 workarounds (#169) --- iris_grib/__init__.py | 13 +++++-------- iris_grib/message.py | 25 +++---------------------- 2 files changed, 8 insertions(+), 30 deletions(-) diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index 2cc40204..45da764e 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -29,7 +29,7 @@ from . import grib_phenom_translation as gptx from . import _save_rules from ._load_convert import convert as load_convert -from .message import GribMessage, _grib_get_array_wrapper +from .message import GribMessage __version__ = '0.15.0dev0' @@ -190,8 +190,7 @@ def __getattr__(self, key): # we just get as the type of the "values" # array...special case here... if key in ["values", "pv", "latitudes", "longitudes"]: - res = _grib_get_array_wrapper( - gribapi.grib_get_double_array(self.grib_message, key)) + res = gribapi.grib_get_double_array(self.grib_message, key) elif key in ('typeOfFirstFixedSurface', 'typeOfSecondFixedSurface'): res = np.int32(gribapi.grib_get_long(self.grib_message, key)) @@ -457,9 +456,8 @@ def _compute_extra_keys(self): # get the distinct latitudes, and make sure they are sorted # (south-to-north) and then put them in the right direction # depending on the scan direction - latitude_points = _grib_get_array_wrapper( - gribapi.grib_get_double_array( - self.grib_message, 'distinctLatitudes')).astype(np.float64) + latitude_points = gribapi.grib_get_double_array( + self.grib_message, 'distinctLatitudes').astype(np.float64) latitude_points.sort() if not self.jScansPositively: # we require latitudes north-to-south @@ -678,8 +676,7 @@ def _longitude_is_cyclic(points): def _message_values(grib_message, shape): gribapi.grib_set_double(grib_message, 'missingValue', np.nan) - data = _grib_get_array_wrapper( - gribapi.grib_get_double_array(grib_message, 'values')) + data = gribapi.grib_get_double_array(grib_message, 'values') data = data.reshape(shape) # Handle missing values in a sensible way. diff --git a/iris_grib/message.py b/iris_grib/message.py index 76cba2eb..7f2b8598 100644 --- a/iris_grib/message.py +++ b/iris_grib/message.py @@ -21,22 +21,6 @@ _SUPPORTED_GRID_DEFINITIONS = (0, 1, 5, 10, 12, 20, 30, 40, 90) -def _grib_get_array_wrapper(f): - """ - Converts what f returns into an array. - - When using eccodes-python, gribapi.grib_get_*array returns a list rather - than an array as expected. - - This is intended as a *temporary* fix that wil be moved once eccodes-python - is fixed. - - """ - if not isinstance(f, np.ndarray): - f = np.asarray(f) - return f - - class _OpenFileRef: """ A reference to an open file that ensures that the file is closed @@ -447,14 +431,12 @@ def _get_key_value(self, key): 'scaledValueOfCentralWaveNumber', 'longitudes', 'latitudes') if key in vector_keys: - res = _grib_get_array_wrapper( - gribapi.grib_get_array(self._message_id, key)) + res = gribapi.grib_get_array(self._message_id, key) elif key == 'bitmap': # The bitmap is stored as contiguous boolean bits, one bit for each # data point. GRIBAPI returns these as strings, so it must be # type-cast to return an array of ints (0, 1). - res = _grib_get_array_wrapper( - gribapi.grib_get_array(self._message_id, key, int)) + res = gribapi.grib_get_array(self._message_id, key, int) elif key in ('typeOfFirstFixedSurface', 'typeOfSecondFixedSurface'): # By default these values are returned as unhelpful strings but # we can use int representation to compare against instead. @@ -479,8 +461,7 @@ def get_computed_key(self, key): """ vector_keys = ('longitudes', 'latitudes', 'distinctLatitudes') if key in vector_keys: - res = _grib_get_array_wrapper( - gribapi.grib_get_array(self._message_id, key)) + res = gribapi.grib_get_array(self._message_id, key) else: res = self._get_value_or_missing(key) return res From 6c8f7dc7cd210433637ae8f7239f9ab58c15c07a Mon Sep 17 00:00:00 2001 From: marqh Date: Fri, 29 Nov 2019 11:24:46 +0000 Subject: [PATCH 140/583] https://github.com/metarelate/metOcean/issues/95 (#172) * https://github.com/metarelate/metOcean/issues/95 * updated header --- iris_grib/_grib_cf_map.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/iris_grib/_grib_cf_map.py b/iris_grib/_grib_cf_map.py index 1c6275b1..7d79b41a 100644 --- a/iris_grib/_grib_cf_map.py +++ b/iris_grib/_grib_cf_map.py @@ -5,24 +5,22 @@ # licensing details. # # DO NOT EDIT: AUTO-GENERATED -# Created on 22 May 2019 13:05 from +# Created on 29 November 2019 10:11 from # http://www.metarelate.net/metOcean -# at commit a3649e942198f014f0258d926678dbbff616feae +# at commit 36da82fe65a1a37e6cf1fa49899107fc6dc908ed -# https://github.com/metarelate/metOcean/commit/a3649e942198f014f0258d926678dbbff616feae +# https://github.com/metarelate/metOcean/commit/36da82fe65a1a37e6cf1fa49899107fc6dc908ed """ Provides GRIB/CF phenomenon translations. """ -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - from collections import namedtuple CFName = namedtuple('CFName', 'standard_name long_name units') + DimensionCoordinate = namedtuple('DimensionCoordinate', 'standard_name units points') @@ -78,6 +76,8 @@ G2Param(2, 0, 1, 53): CFName('snowfall_flux', None, 'kg m-2 s-1'), G2Param(2, 0, 1, 60): CFName('snowfall_amount', None, 'kg m-2'), G2Param(2, 0, 1, 64): CFName('atmosphere_mass_content_of_water_vapor', None, 'kg m-2'), + G2Param(2, 0, 1, 83): CFName('mass_fraction_of_cloud_liquid_water_in_air', None, 'kg kg-1'), + G2Param(2, 0, 1, 84): CFName('mass_fraction_of_cloud_ice_in_air', None, 'kg kg-1'), G2Param(2, 0, 2, 0): CFName('wind_from_direction', None, 'degrees'), G2Param(2, 0, 2, 1): CFName('wind_speed', None, 'm s-1'), G2Param(2, 0, 2, 2): CFName('x_wind', None, 'm s-1'), @@ -194,6 +194,8 @@ CFName('land_binary_mask', None, '1'): G2Param(2, 2, 0, 0), CFName('liquid_water_content_of_surface_snow', None, 'kg m-2'): G2Param(2, 0, 1, 13), CFName('low_type_cloud_area_fraction', None, '%'): G2Param(2, 0, 6, 3), + CFName('mass_fraction_of_cloud_ice_in_air', None, 'kg kg-1'): G2Param(2, 0, 1, 84), + CFName('mass_fraction_of_cloud_liquid_water_in_air', None, 'kg kg-1'): G2Param(2, 0, 1, 83), CFName('medium_type_cloud_area_fraction', None, '%'): G2Param(2, 0, 6, 4), CFName('moisture_content_of_soil_layer', None, 'kg m-2'): G2Param(2, 2, 0, 22), CFName('precipitation_amount', None, 'kg m-2'): G2Param(2, 0, 1, 49), From 2cf099a7b90d413b5a1fb976b4f9234f73c3ff1d Mon Sep 17 00:00:00 2001 From: lbdreyer Date: Mon, 2 Dec 2019 10:46:46 +0000 Subject: [PATCH 141/583] Revert pv level indexing change (#165) --- iris_grib/_load_convert.py | 9 ++++++--- iris_grib/_save_rules.py | 13 ++++++------- .../load_convert/test_load_hybrid_coords.py | 15 +++++++-------- .../save_rules/test_save_hybrid_coords.py | 7 +++---- .../unit/load_cubes/load_cubes/reduced_raw.cml | 2 +- 5 files changed, 23 insertions(+), 23 deletions(-) diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index 60d2c96a..1185f222 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -1508,14 +1508,17 @@ def hybrid_factories(section, metadata): {'long_name': 'sigma'}, Reference('ref_surface_pressure')] - # Create the level pressure scalar coordinate. + # Create the level height/pressure scalar coordinate. + # scaledValue represents the level number, which is used to select + # the sigma and delta values as follows: + # sigma, delta = PV[i], PV[NV/2+i] : where i=1..level_number pv = section['pv'] - offset = scaledValue - 1 + offset = scaledValue coord = DimCoord(pv[offset], long_name=level_value_name, units=level_value_units) metadata['aux_coords_and_dims'].append((coord, None)) # Create the sigma scalar coordinate. - offset = NV // 2 + scaledValue - 1 + offset = NV // 2 + scaledValue coord = AuxCoord(pv[offset], long_name='sigma') metadata['aux_coords_and_dims'].append((coord, None)) # Create the associated factory reference. diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index e5892516..563c8f8c 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -950,10 +950,9 @@ def set_fixed_surfaces(cube, grib, full3d_cube=None): 'maximum value = {}.') raise ValueError(msg.format(max_valid_nlevels, n_levels)) # In sample data we have seen, there seems to be an extra missing data - # value after each set of n-levels coefficients. - # For now, we retain that encoding. This should not cause problems as - # values are indexed according to model-level-number, - # I.E. sigma, delta = PV[i], PV[NV/2+i] + # value *before* each set of n-levels coefficients. + # Note: values are indexed according to model_level_number, + # I.E. sigma, delta = PV[i], PV[NV/2+i] : where i=1..n_levels n_coeffs = n_levels + 1 coeffs_array = np.zeros(n_coeffs * 2, dtype=np.float32) for n_lev, height, sigma in zip(model_levels, @@ -962,11 +961,11 @@ def set_fixed_surfaces(cube, grib, full3d_cube=None): # Record all the level coefficients coming from the 'full' cube. # Note: if some model levels are missing, we must still have the # coeffs at the correct index according to the model_level_number - # value, i.e. at [level - 1] and [NV // 2 + level - 1]. + # value, i.e. at [level] and [NV // 2 + level]. # Thus, we can *not* paste the values in a block: each one needs to # go in the index corresponding to its 'model_level_number' value. - coeffs_array[n_lev - 1] = height - coeffs_array[n_coeffs + n_lev - 1] = sigma + coeffs_array[n_lev] = height + coeffs_array[n_coeffs + n_lev] = sigma pv_values = [float(el) for el in coeffs_array] # eccodes does not support writing numpy.int64, cast to python int gribapi.grib_set(grib, "NV", int(n_coeffs * 2)) diff --git a/iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py b/iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py index 75eed648..e254effe 100644 --- a/iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py +++ b/iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py @@ -35,14 +35,13 @@ def test_hybrid_height_coords_values(self): [1, 11, 21]) # check sigma values correctly loaded from indices 1, 11, 21. - # NOTE: level[0] == 1, so sigma[0] == 1.0 : This makes sense ! self.assertArrayAllClose(cube.coord('sigma').points, - [1.0, 0.911, 0.694], + [0.998, 0.894, 0.667], atol=0.001) # check height values too. self.assertArrayAllClose(cube.coord('level_height').points, - [0., 800., 2933.], + [20., 953.3, 3220.], atol=0.5) @@ -63,9 +62,9 @@ def test_hybrid_pressure_coords_values(self): self.assertArrayEqual(cube.coord('model_level_number').points, [1, 51, 91]) self.assertArrayAllClose(cube.coord('sigma').points, - [0., 0.036, 0.998], atol=0.001) + [0., 0.045, 1.], atol=0.001) self.assertArrayAllClose(cube.coord('level_pressure').points, - [0., 18191.0, 0.00316], rtol=0.001) + [2.00004, 18716.9688, 0.], rtol=0.0001) self.assertArrayAllClose( cube.coord('surface_air_pressure')[:2, :3].points, [[103493.8, 103493.8, 103493.8], @@ -74,9 +73,9 @@ def test_hybrid_pressure_coords_values(self): # Also check a few values from the derived coord. self.assertArrayAllClose( cube.coord('air_pressure')[:, :3, 0].points, - [[0., 0., 0.], - [21940.3, 21936.9, 21932.8], - [103248.5, 103156.0, 103041.0]], atol=0.1) + [[2., 2., 2.], + [23389.3, 23385.1, 23379.9], + [103493.8, 103401.0, 103285.8]], atol=0.1) if __name__ == '__main__': diff --git a/iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py b/iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py index d0a0e317..cd1ab0de 100644 --- a/iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py +++ b/iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py @@ -57,8 +57,7 @@ def test_save(self): # Note: gaps here are because we took model levels = (1, 3, 5). self.assertArrayAllClose( msgs[0].sections[4]['pv'], - [5., 0, 45., 0, 111.667, 0, - 0.999, 0, 0.995, 0, 0.987, 0], + [0, 5., 0, 45., 0, 111.667, 0, 0.999, 0, 0.995, 0, 0.987], atol=0.0015) # Check message #2-of-3 has the correctly encoded hybrid height. @@ -114,8 +113,8 @@ def test_save(self): # Note: HUGE gaps here because we took model levels = (1, 51, 91). self.assertEqual(msgs[0].sections[4]['NV'], 184) pv_expected = np.zeros(184, dtype=np.float64) - pv_expected[[0, 50, 90]] = [0., 18191.03, 0.003] - pv_expected[[92, 142, 182]] = [0., 0.036, 0.998] + pv_expected[[1, 51, 91]] = [0., 18191.03, 0.003] + pv_expected[[93, 143, 183]] = [0., 0.036, 0.998] self.assertArrayAllClose( msgs[0].sections[4]['pv'], pv_expected, atol=0.001) diff --git a/iris_grib/tests/results/unit/load_cubes/load_cubes/reduced_raw.cml b/iris_grib/tests/results/unit/load_cubes/load_cubes/reduced_raw.cml index 46e25cd7..b4f27991 100644 --- a/iris_grib/tests/results/unit/load_cubes/load_cubes/reduced_raw.cml +++ b/iris_grib/tests/results/unit/load_cubes/load_cubes/reduced_raw.cml @@ -18,7 +18,7 @@ - + From ddcac751bbf3a7f53524885e89e79d1ae6761b9f Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Wed, 4 Dec 2019 11:36:33 +0000 Subject: [PATCH 142/583] Label unknown phenomena with a 'GRIB_CODING' attribute (#156) * Support unknown phenomena with a 'GRIB_CODING' attribute; tests passing. * Tests for save behaviour and GribCode api; revised coding and error messages. * Make load-unknown test more sensible. * Style fixes. * Make GRIB_CODING usage more stable, and more like STASH. * Fix oldstyle header. * Tidy testcube usage + add extra test. * Python 3 : import mock from unittest Co-Authored-By: lbdreyer * Purge Python2 legacy. * Review changes: revised classname, attribute name and print format. * Test a round-trip: gribcode -- string -- gribcode. * Remove six; fix class name. * Remove rogue import of 'six'. --- iris_grib/_load_convert.py | 9 +- iris_grib/_save_rules.py | 48 ++++++-- iris_grib/grib_phenom_translation.py | 81 +++++++++++-- .../load_cubes/load_cubes/reduced_raw.cml | 1 + .../test_grib_phenom_translation.py | 109 ++++++++++++++++++ .../load_convert/test_translate_phenomenon.py | 27 +++-- .../test_set_discipline_and_parameter.py | 80 +++++++++++++ 7 files changed, 326 insertions(+), 29 deletions(-) create mode 100644 iris_grib/tests/unit/save_rules/test_set_discipline_and_parameter.py diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index 1185f222..b99546a0 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -26,13 +26,13 @@ from iris.coords import AuxCoord, DimCoord, CellMethod from iris.exceptions import TranslationError from . import grib_phenom_translation as itranslation +from .grib_phenom_translation import GRIBCode from iris.fileformats.rules import ConversionMetadata, Factory, Reference, \ ReferenceTarget from iris.util import _is_circular from ._iris_mercator_support import confirm_extended_mercator_supported from ._grib1_load_rules import grib1_convert -from .message import GribMessage # Restrict the names imported from this namespace. @@ -1378,6 +1378,13 @@ def translate_phenomenon(metadata, discipline, parameterCategory, metadata['long_name'] = long_name metadata['units'] = Unit(1) + # Add a standard attribute recording the grib phenomenon identity. + metadata['attributes']['GRIB_PARAM'] = GRIBCode( + edition_or_string=2, + discipline=discipline, + category=parameterCategory, + number=parameterNumber) + # Identify hybrid height and pressure reference fields. # Look for fields at surface level first. if (typeOfFirstFixedSurface == 1 and diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index 563c8f8c..e3c35293 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -30,6 +30,7 @@ from . import grib_phenom_translation as gptx from ._load_convert import (_STATISTIC_TYPE_NAMES, _TIME_RANGE_UNITS, _SPATIAL_PROCESSING_TYPES) +from .grib_phenom_translation import GRIBCode from iris.util import is_regular, regular_step @@ -690,22 +691,45 @@ def grid_definition_section(cube, grib): ############################################################################### def set_discipline_and_parameter(cube, grib): - # NOTE: for now, can match by *either* standard_name or long_name. - # This allows workarounds for data with no identified standard_name. - grib2_info = gptx.cf_phenom_to_grib2_info(cube.standard_name, - cube.long_name) - if grib2_info is not None: - gribapi.grib_set(grib, "discipline", grib2_info.discipline) - gribapi.grib_set(grib, "parameterCategory", grib2_info.category) - gribapi.grib_set(grib, "parameterNumber", grib2_info.number) - else: - gribapi.grib_set(grib, "discipline", 255) - gribapi.grib_set(grib, "parameterCategory", 255) - gribapi.grib_set(grib, "parameterNumber", 255) + # Default values for parameter identity keys = effectively "MISSING". + discipline, category, number = 255, 255, 255 + identity_found = False + + # First, see if we can find and interpret a 'GRIB_PARAM' attribute. + attr = cube.attributes.get('GRIB_PARAM', None) + if attr: + try: + # Convert to standard tuple-derived form. + gc = GRIBCode(attr) + if gc.edition == 2: + discipline = gc.discipline + category = gc.category + number = gc.number + identity_found = True + except: + pass + + if not identity_found: + # Else, translate a cube phenomenon, if possible. + # NOTE: for now, can match by *either* standard_name or long_name. + # This allows workarounds for data with no identified standard_name. + grib2_info = gptx.cf_phenom_to_grib2_info(cube.standard_name, + cube.long_name) + if grib2_info is not None: + discipline = grib2_info.discipline + category = grib2_info.category + number = grib2_info.number + identity_found = True + + if not identity_found: warnings.warn('Unable to determine Grib2 parameter code for cube.\n' 'discipline, parameterCategory and parameterNumber ' 'have been set to "missing".') + gribapi.grib_set(grib, "discipline", discipline) + gribapi.grib_set(grib, "parameterCategory", category) + gribapi.grib_set(grib, "parameterNumber", number) + def _non_missing_forecast_period(cube): # Calculate "model start time" to use as the reference time. diff --git a/iris_grib/grib_phenom_translation.py b/iris_grib/grib_phenom_translation.py index cee9cb29..988a1464 100644 --- a/iris_grib/grib_phenom_translation.py +++ b/iris_grib/grib_phenom_translation.py @@ -16,8 +16,8 @@ * cf --> grib2 ''' - -import collections +from collections import namedtuple +import re import warnings import cf_units @@ -54,12 +54,12 @@ def __setitem__(self, key, value): # Define namedtuples for keys+values of the Grib1 lookup table. -_Grib1ToCfKeyClass = collections.namedtuple( +_Grib1ToCfKeyClass = namedtuple( 'Grib1CfKey', ('table2_version', 'centre_number', 'param_number')) # NOTE: this form is currently used for both Grib1 *and* Grib2 -_GribToCfDataClass = collections.namedtuple( +_GribToCfDataClass = namedtuple( 'Grib1CfData', ('standard_name', 'long_name', 'units', 'set_height')) @@ -146,7 +146,7 @@ def _make_grib1_cf_entry(table2_version, centre_number, param_number, # Define a namedtuple for the keys of the Grib2 lookup table. -_Grib2ToCfKeyClass = collections.namedtuple( +_Grib2ToCfKeyClass = namedtuple( 'Grib2CfKey', ('param_discipline', 'param_category', 'param_number')) @@ -205,11 +205,11 @@ def _make_grib2_cf_entry(param_discipline, param_category, param_number, # Define namedtuples for key+values of the cf-to-grib2 lookup table. -_CfToGrib2KeyClass = collections.namedtuple( +_CfToGrib2KeyClass = namedtuple( 'CfGrib2Key', ('standard_name', 'long_name')) -_CfToGrib2DataClass = collections.namedtuple( +_CfToGrib2DataClass = namedtuple( 'CfGrib2Data', ('discipline', 'category', 'number', 'units')) @@ -316,3 +316,70 @@ def cf_phenom_to_grib2_info(standard_name, long_name=None): if standard_name is not None: long_name = None return _CF_GRIB2_TABLE[(standard_name, long_name)] + + +class GRIBCode(namedtuple('GRIBCode', + 'edition discipline category number')): + """ + An object representing a specific Grib phenomenon identity. + + Basically a namedtuple of (edition, discipline, category, number). + + Also provides a string representation, and supports creation from: another + similar object; a tuple of numbers; or any string with 4 separate decimal + numbers in it. + + """ + __slots__ = () + + def __new__(cls, edition_or_string, + discipline=None, category=None, number=None): + args = (edition_or_string, discipline, category, number) + nargs = sum(arg is not None for arg in args) + if nargs == 1: + # Single argument: convert to a string and extract 4 integers. + # NOTE: this also allows input from a GRIBCode, or a plain tuple. + edition_or_string = str(edition_or_string) + edition, discipline, category, number = \ + cls._fournums_from_gribcode_string(edition_or_string) + elif nargs == 4: + edition = edition_or_string + edition, discipline, category, number = [ + int(arg) + for arg in (edition, discipline, category, number)] + else: + msg = ('Cannot create GRIBCode from {} arguments, ' + '"GRIBCode{!r}" : ' + 'expected either 1 or 4 non-None arguments.') + raise ValueError(msg.format(nargs, args)) + + return super(GRIBCode, cls).__new__( + cls, edition, discipline, category, number) + + RE_PARSE_FOURNUMS = re.compile(4 * r'[^\d]*(\d*)') + + @classmethod + def _fournums_from_gribcode_string(cls, edcn_string): + parsed_ok = False + nums_match = cls.RE_PARSE_FOURNUMS.match(edcn_string).groups() + if nums_match is not None: + try: + nums = [int(grp) for grp in nums_match] + parsed_ok = True + except ValueError: + pass + + if not parsed_ok: + msg = ('Invalid argument for GRIBCode creation, ' + '"GRIBCode({!r})" : ' + 'requires 4 numbers, separated by non-numerals.') + raise ValueError(msg.format(edcn_string)) + + return nums + + PRINT_FORMAT = 'GRIB{:1d}:d{:03d}c{:03d}n{:03d}' + + def __str__(self): + result = self.PRINT_FORMAT.format( + self.edition, self.discipline, self.category, self.number) + return result diff --git a/iris_grib/tests/results/unit/load_cubes/load_cubes/reduced_raw.cml b/iris_grib/tests/results/unit/load_cubes/load_cubes/reduced_raw.cml index b4f27991..6846382f 100644 --- a/iris_grib/tests/results/unit/load_cubes/load_cubes/reduced_raw.cml +++ b/iris_grib/tests/results/unit/load_cubes/load_cubes/reduced_raw.cml @@ -2,6 +2,7 @@ + diff --git a/iris_grib/tests/unit/grib_phenom_translation/test_grib_phenom_translation.py b/iris_grib/tests/unit/grib_phenom_translation/test_grib_phenom_translation.py index ae3cb715..88a6e627 100644 --- a/iris_grib/tests/unit/grib_phenom_translation/test_grib_phenom_translation.py +++ b/iris_grib/tests/unit/grib_phenom_translation/test_grib_phenom_translation.py @@ -18,6 +18,7 @@ import cf_units import iris_grib.grib_phenom_translation as gptx +from iris_grib.grib_phenom_translation import GRIBCode class TestGribLookupTableType(tests.IrisTest): @@ -151,5 +152,113 @@ def check_cf_grib2(standard_name, long_name, expect_none=True) +class TestGRIBcode(tests.IrisTest): + # GRIBCode is basically a namedtuple, so not all behaviour needs testing. + # However, creation is a bit special so exercise all those cases. + def test_create_from_keys(self): + gribcode = GRIBCode( + edition_or_string=5, + discipline=7, + category=4, + number=199) + self.assertEqual(gribcode.edition, 5) + self.assertEqual(gribcode.discipline, 7) + self.assertEqual(gribcode.category, 4) + self.assertEqual(gribcode.number, 199) + + def test_create_from_args(self): + gribcode = GRIBCode(7, 3, 12, 99) + self.assertEqual(gribcode.edition, 7) + self.assertEqual(gribcode.discipline, 3) + self.assertEqual(gribcode.category, 12) + self.assertEqual(gribcode.number, 99) + + def test_create_is_copy(self): + gribcode1 = GRIBCode(7, 3, 12, 99) + gribcode2 = GRIBCode(7, 3, 12, 99) + self.assertEqual(gribcode1, gribcode2) + self.assertIsNot(gribcode1, gribcode2) + + def test_create_from_gribcode(self): + gribcode1 = GRIBCode((4, 3, 2, 1)) + gribcode2 = GRIBCode(gribcode1) + self.assertEqual(gribcode1, gribcode2) + # NOTE: *not* passthrough : it creates a copy + # (though maybe not too significant, as it is immutable anyway?) + self.assertIsNot(gribcode1, gribcode2) + + def test_create_from_string(self): + gribcode = GRIBCode('xxx12xs-34 -5,678qqqq') + # NOTE: args 2 and 3 are *not* negative. + self.assertEqual(gribcode, GRIBCode(12, 34, 5, 678)) + + def test_create_from_own_string(self): + # Check that GRIBCode string reprs are valid as create arguments. + gribcode = GRIBCode( + edition_or_string=2, + discipline=17, + category=94, + number=231) + grib_param_string = str(gribcode) + newcode = GRIBCode(grib_param_string) + self.assertEqual(newcode, gribcode) + + def test_create_from_tuple(self): + gribcode = GRIBCode((4, 3, 2, 1)) + self.assertEqual(gribcode, GRIBCode(4, 3, 2, 1)) + + def test_create_bad_nargs(self): + # Between 1 and 4 args is not invalid call syntax, but it should fail. + with self.assertRaisesRegex( + ValueError, + 'Cannot create GRIBCode from 2 arguments'): + GRIBCode(1, 2) + + def test_create_bad_single_arg_None(self): + with self.assertRaisesRegex( + ValueError, + 'Cannot create GRIBCode from 0 arguments'): + GRIBCode(None) + + def test_create_bad_single_arg_empty_string(self): + with self.assertRaisesRegex( + ValueError, + 'Invalid argument for GRIBCode creation'): + GRIBCode('') + + def test_create_bad_single_arg_nonums(self): + with self.assertRaisesRegex( + ValueError, + 'Invalid argument for GRIBCode creation'): + GRIBCode('saas- dsa- ') + + def test_create_bad_single_arg_less_than_4_nums(self): + with self.assertRaisesRegex( + ValueError, + 'Invalid argument for GRIBCode creation'): + GRIBCode('1,2,3') + + def test_create_bad_single_arg_number(self): + with self.assertRaisesRegex( + ValueError, + 'Invalid argument for GRIBCode creation'): + GRIBCode(4) + + def test_create_bad_single_arg_single_numeric(self): + with self.assertRaisesRegex( + ValueError, + 'Invalid argument for GRIBCode creation'): + GRIBCode('44') + + def test_create_string_more_than_4_nums(self): + # Note: does not error, just discards the extra. + gribcode = GRIBCode('1,2,3,4,5,6,7,8') + self.assertEqual(gribcode, GRIBCode(1, 2, 3, 4)) + + def test__str__(self): + result = str(GRIBCode(2, 17, 3, 123)) + self.assertEqual(result, 'GRIB2:d017c003n123') + + if __name__ == '__main__': tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_translate_phenomenon.py b/iris_grib/tests/unit/load_convert/test_translate_phenomenon.py index dd1f22c1..6f79474f 100644 --- a/iris_grib/tests/unit/load_convert/test_translate_phenomenon.py +++ b/iris_grib/tests/unit/load_convert/test_translate_phenomenon.py @@ -18,7 +18,7 @@ from iris.coords import DimCoord from iris_grib._load_convert import Probability, translate_phenomenon -from iris_grib.grib_phenom_translation import _GribToCfDataClass +from iris_grib.grib_phenom_translation import _GribToCfDataClass, GRIBCode class Test_probability(tests.IrisGribTest): @@ -30,11 +30,11 @@ def setUp(self): return_value=_GribToCfDataClass('air_temperature', '', 'K', None)) # Construct dummy call arguments self.probability = Probability('', 22.0) - self.metadata = {'aux_coords_and_dims': []} + self.metadata = {'aux_coords_and_dims': [], 'attributes': {}} def test_basic(self): - result = translate_phenomenon(self.metadata, None, None, None, None, - None, None, probability=self.probability) + translate_phenomenon(self.metadata, 7, 8, 9, None, + None, None, probability=self.probability) # Check metadata. thresh_coord = DimCoord([22.0], standard_name='air_temperature', @@ -43,14 +43,23 @@ def test_basic(self): 'standard_name': None, 'long_name': 'probability_of_air_temperature_', 'units': Unit(1), - 'aux_coords_and_dims': [(thresh_coord, None)]}) + 'aux_coords_and_dims': [(thresh_coord, None)], + 'attributes': {'GRIB_PARAM': GRIBCode(2, 7, 8, 9)}}) def test_no_phenomenon(self): - original_metadata = deepcopy(self.metadata) self.phenom_lookup_patch.return_value = None - result = translate_phenomenon(self.metadata, None, None, None, None, - None, None, probability=self.probability) - self.assertEqual(self.metadata, original_metadata) + expected_metadata = self.metadata.copy() + translate_phenomenon(self.metadata, + discipline=7, + parameterCategory=77, + parameterNumber=777, + typeOfFirstFixedSurface=None, + scaledValueOfFirstFixedSurface=None, + typeOfSecondFixedSurface=None, + probability=self.probability) + expected_metadata['attributes']['GRIB_PARAM'] = \ + GRIBCode(2, 7, 77, 777) + self.assertEqual(self.metadata, expected_metadata) if __name__ == '__main__': diff --git a/iris_grib/tests/unit/save_rules/test_set_discipline_and_parameter.py b/iris_grib/tests/unit/save_rules/test_set_discipline_and_parameter.py new file mode 100644 index 00000000..b8071254 --- /dev/null +++ b/iris_grib/tests/unit/save_rules/test_set_discipline_and_parameter.py @@ -0,0 +1,80 @@ +# Copyright iris-grib contributors +# +# This file is part of iris-grib 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 `iris_grib.grib_save_rules.set_discipline_and_parameter`.""" +# Import iris_grib.tests first so that some things can be initialised before +# importing anything else. +import iris_grib.tests as tests +from unittest import mock + +from iris.cube import Cube + +from iris_grib.grib_phenom_translation import GRIBCode + +from iris_grib._save_rules import set_discipline_and_parameter + + +class TestPhenomenonCoding(tests.IrisGribTest): + def setUp(self): + # A mock cube with empty phenomenon-specifying metadata. + self.mock_cube = mock.Mock( + spec=Cube, + standard_name=None, + long_name=None, + attributes={}) + + def _check_coding(self, cube, discipline, paramCategory, paramNumber): + # Check that encoding 'cube' writes the expected phenomenon keys. + grib_set_patch = self.patch( + 'iris_grib._save_rules.gribapi.grib_set') + mock_message = mock.sentinel.grib2_message + + set_discipline_and_parameter(cube, mock_message) + + expected_calls = [ + mock.call(mock_message, "discipline", discipline), + mock.call(mock_message, "parameterCategory", paramCategory), + mock.call(mock_message, "parameterNumber", paramNumber)] + + self.assertEqual(grib_set_patch.call_args_list, expected_calls) + + def test_unknown_phenomenon(self): + cube = self.mock_cube + self._check_coding(cube, 255, 255, 255) + + def test_known_standard_name(self): + cube = self.mock_cube + cube.standard_name = 'sea_water_y_velocity' + self._check_coding(cube, 10, 1, 3) # as seen in _grib_cf_map.py + + def test_gribcode_attribute_object(self): + cube = self.mock_cube + cube.attributes = {'GRIB_PARAM': GRIBCode(2, 7, 12, 99)} + self._check_coding(cube, 7, 12, 99) + + def test_gribcode_attribute_string(self): + cube = self.mock_cube + cube.attributes = {'GRIB_PARAM': '2, 9, 33, 177'} + self._check_coding(cube, 9, 33, 177) + + def test_gribcode_attribute_tuple(self): + cube = self.mock_cube + cube.attributes = {'GRIB_PARAM': (2, 33, 4, 12)} + self._check_coding(cube, 33, 4, 12) + + def test_gribcode_attribute_not_edition_2(self): + cube = self.mock_cube + cube.attributes = {'GRIB_PARAM': GRIBCode(1, 7, 12, 99)} + self._check_coding(cube, 255, 255, 255) + + def test_gribcode_attribute_overrides_phenomenon(self): + cube = self.mock_cube + cube.standard_name = 'sea_water_y_velocity' + cube.attributes = {'GRIB_PARAM': '2, 9, 33, 177'} + self._check_coding(cube, 9, 33, 177) + + +if __name__ == "__main__": + tests.main() From de6b691682168976e7830c0051607ed92b592f9e Mon Sep 17 00:00:00 2001 From: lbdreyer Date: Wed, 4 Dec 2019 16:59:45 +0000 Subject: [PATCH 143/583] Modify setup.py to drop Py 2 support (#180) --- setup.py | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/setup.py b/setup.py index 7d3cc16b..88d6e03f 100644 --- a/setup.py +++ b/setup.py @@ -73,18 +73,14 @@ def file_walk_relative(top, remove=''): keywords = ['iris', 'GRIB'], classifiers=[ 'Programming Language :: Python', - 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3.6', + 'Programming Language :: Python :: 3.7', + 'Programming Language :: Python :: 3 :: only', ], - # XXX: This is a royal dependency mess at the moment. The PyPI eccodes - # package 2.10.0 is a wheel for win_amd64 only, so we'll only add that as - # a dependence for the relevant platform, otherwise unfortunately it's up - # to the user to provision themselves until ECMWF and PyPI provide the - # suitable package platform coverage. - install_requires=['scitools-iris>=2.0.*'] + [ - 'eccodes-python'] if 'win' in sys.platform else [], - extras_require={ - 'test:python_version=="2.7"': ['mock'] - }, + # NOTE: The Python 3 bindings to eccodes (eccodes-python) is available on + # PyPI, but the user is required to install eccodes itself manually. See + # ECMWF ecCodes installation documentation for more information. + install_requires=['scitools-iris>=2.0.*'] + ['eccodes-python'], test_suite = 'iris_grib.tests', ) From 8ddc8d748720827aee07d03c095ed2244b703978 Mon Sep 17 00:00:00 2001 From: lbdreyer Date: Wed, 4 Dec 2019 17:11:21 +0000 Subject: [PATCH 144/583] Update version number for 0.15 release (#177) --- iris_grib/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index 45da764e..d6d12bcf 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -32,7 +32,7 @@ from .message import GribMessage -__version__ = '0.15.0dev0' +__version__ = '0.15.0' __all__ = ['load_cubes', 'save_grib2', 'load_pairs_from_fields', 'save_pairs_from_cube', 'save_messages'] From 5c314e35495f334846720041927f7939a649526b Mon Sep 17 00:00:00 2001 From: lbdreyer Date: Wed, 4 Dec 2019 17:23:56 +0000 Subject: [PATCH 145/583] Add release notes for 0.14.1 release (GH-162) (#171) (#179) --- docs/ref/release_notes.rst | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/docs/ref/release_notes.rst b/docs/ref/release_notes.rst index c51097ad..951a33b7 100644 --- a/docs/ref/release_notes.rst +++ b/docs/ref/release_notes.rst @@ -16,6 +16,16 @@ Features area at a horizontal level or in a horizontal layer at a point in time (product definition template 15 in code table 4.0) +:Release: 0.14.1 +:Date: 12 Jun 2019 + +Bug Fixes +^^^^^^^^^ + +* Added fixes to get iris-grib working with the Python 3 compatible release of + eccodes. This included workarounds such that lists that are returned by + eccodes are converted to NumPy arrays as expected. + What's new in iris-grib v0.13 ----------------------------- @@ -91,4 +101,3 @@ What's new in iris-grib v0.9 :Date: 25 Jul 2016 Stable release of iris-grib to support iris v1.10 - From d5da26ca1325ec3411b16996bb5fb4ccfeb6eedf Mon Sep 17 00:00:00 2001 From: lbdreyer Date: Thu, 5 Dec 2019 11:21:41 +0000 Subject: [PATCH 146/583] Add release notes for 0.15 release (#178) --- docs/ref/release_notes.rst | 41 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/docs/ref/release_notes.rst b/docs/ref/release_notes.rst index 951a33b7..bb5a286b 100644 --- a/docs/ref/release_notes.rst +++ b/docs/ref/release_notes.rst @@ -1,6 +1,47 @@ Release Notes ============= +What's new in iris-grib v0.15 +----------------------------- + +:Release: 0.15.0 +:Date: 5 Dec 2019 + +Features +^^^^^^^^ + +* Updated translations between GRIB parameter code and CF standard_name or + long_name : + * additional WAFC codes, both to and from CF + * 'mass_fraction_of_cloud_liquid_water_in_air' and 'mass_fraction_of_cloud_ice_in_air', both to and from CF + * 'surface_downwelling_longwave_flux_in_air', now translates to GRIBcode(2, 0, 5, 3) (but not the reverse). + * for full details, see : https://github.com/Scitools/iris-grib/compare/c4243ae..5c314e3#diff-cf46b46880cae59e82a91c7ab6bb81ba + +* Added support for loading GRIB messages with no fixed surface set in the + product definition section + +* Added support for loading GRIB messages where i or j increment are not set + +* Added support for saving cubes that have a "depth" coordinate + +* Cubes loaded from GRIB files now contain a new GRIB_PARAM attribute, the + value of which is an instance of + iris_grib.grib_phenom_translation.GRIBCode and represents the parameter code. + When saving, if a cube has a GRIBCode attribute, this determines the parameter code + in the created message(s): This will _override_ any translation from the CF names. + +Bug Fixes +^^^^^^^^^ + +* Reverted a bug that was fixed in v0.13 related to loading hybrid pressure + levels. It was agreed that the initial behaviour was correct + +Dependencies +^^^^^^^^^^^^ + +* Python 2 is no longer supported + + What's new in iris-grib v0.14 ----------------------------- From 2206a46e64250a0a5e1ae4ec63075b5b558d03bb Mon Sep 17 00:00:00 2001 From: lbdreyer Date: Thu, 19 Dec 2019 17:53:28 +0100 Subject: [PATCH 147/583] Bump version to 0.16.0dev0 (#182) --- iris_grib/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index d6d12bcf..dcc32799 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -32,7 +32,7 @@ from .message import GribMessage -__version__ = '0.15.0' +__version__ = '0.16.0dev0' __all__ = ['load_cubes', 'save_grib2', 'load_pairs_from_fields', 'save_pairs_from_cube', 'save_messages'] From 55441a0ee9799213e39882a34017ade17aa9e9e0 Mon Sep 17 00:00:00 2001 From: lbdreyer Date: Mon, 13 Jan 2020 12:23:12 +0100 Subject: [PATCH 148/583] Fix typo in setup.py classifiers (#183) --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 88d6e03f..b36ed2a9 100644 --- a/setup.py +++ b/setup.py @@ -75,7 +75,7 @@ def file_walk_relative(top, remove=''): 'Programming Language :: Python', 'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.7', - 'Programming Language :: Python :: 3 :: only', + 'Programming Language :: Python :: 3 :: Only', ], # NOTE: The Python 3 bindings to eccodes (eccodes-python) is available on # PyPI, but the user is required to install eccodes itself manually. See From dc8de527b8d46752a0b2b8e120e12f916ac2f557 Mon Sep 17 00:00:00 2001 From: Bill Little Date: Mon, 13 Jan 2020 11:28:42 +0000 Subject: [PATCH 149/583] Update README.rst --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index e573a6a5..3448e508 100644 --- a/README.rst +++ b/README.rst @@ -17,7 +17,7 @@ Copyright and licence iris-grib may be freely distributed, modified and used commercially under the terms of its `GNU LGPLv3 license `_. -\(C) British Crown Copyright 2010 - 2019, Met Office +\(C) British Crown Copyright 2010 - 2020, Met Office .. |Travis| image:: https://travis-ci.org/SciTools/iris-grib.svg?branch=master .. _Travis: https://travis-ci.org/SciTools/iris-grib From f61d5bc58b2526eb9bd4b807f50999f43058270b Mon Sep 17 00:00:00 2001 From: Martin Yeo <40734014+trexfeathers@users.noreply.github.com> Date: Mon, 13 Jan 2020 11:41:40 +0000 Subject: [PATCH 150/583] Latest Iris Compatibility (#184) * New import for relocated equalise_attributes. * Include climatological=False in all uses of iris.coords.CoordDefn. * Allow for Iris v2, v3 and beyond * Added pep8 to dependencies. --- environment.yml | 3 ++- .../integration/round_trip/test_hybrid_coords_round_trip.py | 2 +- iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py | 6 +++--- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/environment.yml b/environment.yml index 86d2ed55..361dacb2 100644 --- a/environment.yml +++ b/environment.yml @@ -1,5 +1,6 @@ channels: - conda-forge dependencies: - - iris=2.* + - iris>=2 - python-eccodes>=0.9.1,<2 + - pep8 diff --git a/iris_grib/tests/integration/round_trip/test_hybrid_coords_round_trip.py b/iris_grib/tests/integration/round_trip/test_hybrid_coords_round_trip.py index cb94671f..facdc6ce 100644 --- a/iris_grib/tests/integration/round_trip/test_hybrid_coords_round_trip.py +++ b/iris_grib/tests/integration/round_trip/test_hybrid_coords_round_trip.py @@ -14,7 +14,7 @@ import iris_grib.tests as tests from iris import load_cube, load_cubes, save -from iris.experimental.equalise_cubes import equalise_attributes +from iris.util import equalise_attributes class TestHybridHeightRoundTrip(tests.IrisGribTest): diff --git a/iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py b/iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py index 05d3df1b..b8e990bb 100644 --- a/iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py +++ b/iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py @@ -118,13 +118,13 @@ def test_grib1_hybrid_height(self): ml_ref = iris.coords.CoordDefn('model_level_number', None, None, cf_units.Unit('1'), - {'positive': 'up'}, None) + {'positive': 'up'}, None, False) lp_ref = iris.coords.CoordDefn(None, 'level_pressure', None, cf_units.Unit('Pa'), - {}, None) + {}, None, False) s_ref = iris.coords.CoordDefn(None, 'sigma', None, cf_units.Unit('1'), - {}, None) + {}, None, False) aux_coord_defns = [coord._as_defn() for coord, dim in results[8]] self.assertIn(ml_ref, aux_coord_defns) From 1f859fce304cabd1d9f510252b12d9c206b5c17a Mon Sep 17 00:00:00 2001 From: Martin Yeo <40734014+trexfeathers@users.noreply.github.com> Date: Thu, 16 Jan 2020 12:02:05 +0000 Subject: [PATCH 151/583] equalise_attributes compatibility for Iris 2.4 and also master. (#185) --- .../round_trip/test_hybrid_coords_round_trip.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/iris_grib/tests/integration/round_trip/test_hybrid_coords_round_trip.py b/iris_grib/tests/integration/round_trip/test_hybrid_coords_round_trip.py index facdc6ce..d922963b 100644 --- a/iris_grib/tests/integration/round_trip/test_hybrid_coords_round_trip.py +++ b/iris_grib/tests/integration/round_trip/test_hybrid_coords_round_trip.py @@ -14,7 +14,13 @@ import iris_grib.tests as tests from iris import load_cube, load_cubes, save -from iris.util import equalise_attributes +# Try except allows compatibility with current Iris (2.4) and also master. +# TODO: simplify to just the iris.util import once we drop support for any +# Iris versions with iris.experimental.equalise_cubes import +try: + from iris.util import equalise_attributes +except ImportError: + from iris.experimental.equalise_cubes import equalise_attributes class TestHybridHeightRoundTrip(tests.IrisGribTest): From a09fb02ec21422530af029b098427e630cf3fd16 Mon Sep 17 00:00:00 2001 From: lbdreyer Date: Wed, 19 Feb 2020 15:28:26 +0100 Subject: [PATCH 152/583] Get iris-grib tests passing with the latest version of eccodes (#189) --- environment.yml | 2 +- iris_grib/tests/unit/test_save_messages.py | 15 +++------------ 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/environment.yml b/environment.yml index 361dacb2..5bce04e0 100644 --- a/environment.yml +++ b/environment.yml @@ -2,5 +2,5 @@ channels: - conda-forge dependencies: - iris>=2 - - python-eccodes>=0.9.1,<2 + - python-eccodes - pep8 diff --git a/iris_grib/tests/unit/test_save_messages.py b/iris_grib/tests/unit/test_save_messages.py index 5715cf1a..974647f2 100644 --- a/iris_grib/tests/unit/test_save_messages.py +++ b/iris_grib/tests/unit/test_save_messages.py @@ -10,7 +10,6 @@ import iris_grib.tests as tests import gribapi -import numpy as np from unittest import mock import iris_grib @@ -24,22 +23,14 @@ def setUp(self): def test_save(self): m = mock.mock_open() with mock.patch('builtins.open', m, create=True): - # sending a MagicMock object to gribapi raises an AssertionError - # as the gribapi code does a type check - # this is deemed acceptable within the scope of this unit test - with self.assertRaises((AssertionError, TypeError)): - iris_grib.save_messages([self.grib_message], 'foo.grib2') + iris_grib.save_messages([self.grib_message], 'foo.grib2') self.assertTrue(mock.call('foo.grib2', 'wb') in m.mock_calls) def test_save_append(self): m = mock.mock_open() with mock.patch('builtins.open', m, create=True): - # sending a MagicMock object to gribapi raises an AssertionError - # as the gribapi code does a type check - # this is deemed acceptable within the scope of this unit test - with self.assertRaises((AssertionError, TypeError)): - iris_grib.save_messages([self.grib_message], 'foo.grib2', - append=True) + iris_grib.save_messages([self.grib_message], 'foo.grib2', + append=True) self.assertTrue(mock.call('foo.grib2', 'ab') in m.mock_calls) From c7ee03856c365b4db3a3318f8128c83e28c3b35b Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Thu, 20 Feb 2020 13:19:43 +0000 Subject: [PATCH 153/583] Port test_grib_load_translations from iris (#191) * Imported test; initial working with minimal changes. * Remove some redundant parts, as we now test only GRIB-1. * Code style fixes. --- .../test_grib1_load_translations.py | 384 ++++++++++++++++++ 1 file changed, 384 insertions(+) create mode 100644 iris_grib/tests/unit/grib1_load_rules/test_grib1_load_translations.py diff --git a/iris_grib/tests/unit/grib1_load_rules/test_grib1_load_translations.py b/iris_grib/tests/unit/grib1_load_rules/test_grib1_load_translations.py new file mode 100644 index 00000000..8087b1c1 --- /dev/null +++ b/iris_grib/tests/unit/grib1_load_rules/test_grib1_load_translations.py @@ -0,0 +1,384 @@ +# Copyright iris-grib contributors +# +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. +""" +Tests for specific implementation aspects of the grib loaders. +Old, and GRIB-1 specific. +Ported here from 'iris.tests.test_grib_load_translations'. + +""" + +# Import iris_grib.tests first so that some things can be initialised before +# importing anything else +import iris_grib.tests as tests + +import datetime +from unittest import mock + +import cf_units +import numpy as np + +import iris +import iris.exceptions + +import gribapi +import iris.fileformats +import iris_grib + + +def _mock_gribapi_fetch(message, key): + """ + Fake the gribapi key-fetch. + + Fetch key-value from the fake message (dictionary). + If the key is not present, raise the diagnostic exception. + + """ + if key in message: + return message[key] + else: + raise _mock_gribapi.errors.GribInternalError + + +def _mock_gribapi__grib_is_missing(grib_message, keyname): + """ + Fake the gribapi key-existence enquiry. + + Return whether the key exists in the fake message (dictionary). + + """ + return keyname not in grib_message + + +def _mock_gribapi__grib_get_native_type(grib_message, keyname): + """ + Fake the gribapi type-discovery operation. + + Return type of key-value in the fake message (dictionary). + If the key is not present, raise the diagnostic exception. + + """ + if keyname in grib_message: + return type(grib_message[keyname]) + raise _mock_gribapi.errors.GribInternalError(keyname) + + +# Construct a mock object to mimic the gribapi for GribWrapper testing. +_mock_gribapi = mock.Mock(spec=gribapi) +_mock_gribapi.errors.GribInternalError = Exception + +_mock_gribapi.grib_get_long = mock.Mock(side_effect=_mock_gribapi_fetch) +_mock_gribapi.grib_get_string = mock.Mock(side_effect=_mock_gribapi_fetch) +_mock_gribapi.grib_get_double = mock.Mock(side_effect=_mock_gribapi_fetch) +_mock_gribapi.grib_get_double_array = mock.Mock( + side_effect=_mock_gribapi_fetch +) +_mock_gribapi.grib_is_missing = mock.Mock( + side_effect=_mock_gribapi__grib_is_missing +) +_mock_gribapi.grib_get_native_type = mock.Mock( + side_effect=_mock_gribapi__grib_get_native_type +) + +# define seconds in an hour, for general test usage +_hour_secs = 3600.0 + + +class FakeGribMessage(dict): + """ + A 'fake grib message' object, for testing GribWrapper construction. + + Behaves as a dictionary, containing key-values for message keys. + + """ + + def __init__(self, **kwargs): + """ + Create a fake message object. + + General keys can be set/add as required via **kwargs. + The keys 'edition' and 'time_code' are specially managed. + + """ + # Start with a bare dictionary + dict.__init__(self) + # Extract specially-recognised keys. + edition = kwargs.pop("edition", 1) + # This testing is only for old-style Grib-1 code. + assert edition == 1 + time_code = kwargs.pop("time_code", None) + # Set the minimally required keys. + self._init_minimal_message(edition=edition) + # Also set a time-code, if given. + if time_code is not None: + self.set_timeunit_code(time_code) + # Finally, add any remaining passed key-values. + self.update(**kwargs) + + def _init_minimal_message(self, edition=1): + # Set values for all the required keys. + # 'edition' controls the edition-specific keys. + self.update( + { + "Ni": 1, + "Nj": 1, + "numberOfValues": 1, + "alternativeRowScanning": 0, + "centre": "ecmf", + "year": 2007, + "month": 3, + "day": 23, + "hour": 12, + "minute": 0, + "indicatorOfUnitOfTimeRange": 1, + "shapeOfTheEarth": 6, + "gridType": "rotated_ll", + "angleOfRotation": 0.0, + "iDirectionIncrementInDegrees": 0.036, + "jDirectionIncrementInDegrees": 0.036, + "iScansNegatively": 0, + "jScansPositively": 1, + "longitudeOfFirstGridPointInDegrees": -5.70, + "latitudeOfFirstGridPointInDegrees": -4.452, + "jPointsAreConsecutive": 0, + "values": np.array([[1.0]]), + "indicatorOfParameter": 9999, + "parameterNumber": 9999, + "startStep": 24, + "timeRangeIndicator": 1, + "P1": 2, + "P2": 0, + # time unit - needed AS WELL as 'indicatorOfUnitOfTimeRange' + "unitOfTime": 1, + "table2Version": 9999, + } + ) + # Add edition-dependent settings. + self["edition"] = edition + + def set_timeunit_code(self, timecode): + # Do timecode setting (somewhat edition-dependent). + self["indicatorOfUnitOfTimeRange"] = timecode + # for some odd reason, GRIB1 code uses *both* of these + # NOTE kludge -- the 2 keys are really the same thing + self["unitOfTime"] = timecode + + +class TestGribTimecodes(tests.IrisTest): + def _run_timetests(self, test_set): + # Check the unit-handling for given units-codes and editions. + + # Operates on lists of cases for various time-units and grib-editions. + # Format: (edition, code, expected-exception, + # equivalent-seconds, description-string) + with mock.patch("iris_grib.gribapi", _mock_gribapi): + for test_controls in test_set: + ( + grib_edition, + timeunit_codenum, + expected_error, + timeunit_secs, + timeunit_str, + ) = test_controls + + # Construct a suitable fake test message. + message = FakeGribMessage( + edition=grib_edition, time_code=timeunit_codenum + ) + + if expected_error: + # Expect GribWrapper construction to fail. + with self.assertRaises(type(expected_error)) as ar_context: + _ = iris_grib.GribWrapper(message) + self.assertEqual( + ar_context.exception.args, expected_error.args + ) + continue + + # 'ELSE'... + # Expect the wrapper construction to work. + # Make a GribWrapper object and test it. + wrapped_msg = iris_grib.GribWrapper(message) + + # Check the units string. + forecast_timeunit = wrapped_msg._forecastTimeUnit + self.assertEqual( + forecast_timeunit, + timeunit_str, + "Bad unit string for edition={ed:01d}, " + "unitcode={code:01d} : " + 'expected="{wanted}" GOT="{got}"'.format( + ed=grib_edition, + code=timeunit_codenum, + wanted=timeunit_str, + got=forecast_timeunit, + ), + ) + + # Check the data-starttime calculation. + interval_start_to_end = ( + wrapped_msg._phenomenonDateTime - + wrapped_msg._referenceDateTime + ) + if grib_edition == 1: + interval_from_units = wrapped_msg.P1 + else: + interval_from_units = wrapped_msg.forecastTime + interval_from_units *= datetime.timedelta(0, timeunit_secs) + self.assertEqual( + interval_start_to_end, + interval_from_units, + "Inconsistent start time offset for edition={ed:01d}, " + "unitcode={code:01d} : " + 'from-unit="{unit_str}" ' + 'from-phenom-minus-ref="{e2e_str}"'.format( + ed=grib_edition, + code=timeunit_codenum, + unit_str=interval_from_units, + e2e_str=interval_start_to_end, + ), + ) + + # Test groups of testcases for various time-units and grib-editions. + # Format: (edition, code, expected-exception, + # equivalent-seconds, description-string) + def test_timeunits_common(self): + tests = ( + (1, 0, None, 60.0, "minutes"), + (1, 1, None, _hour_secs, "hours"), + (1, 2, None, 24.0 * _hour_secs, "days"), + (1, 10, None, 3.0 * _hour_secs, "3 hours"), + (1, 11, None, 6.0 * _hour_secs, "6 hours"), + (1, 12, None, 12.0 * _hour_secs, "12 hours"), + ) + TestGribTimecodes._run_timetests(self, tests) + + @staticmethod + def _err_bad_timeunit(code): + return iris.exceptions.NotYetImplementedError( + "Unhandled time unit for forecast " + "indicatorOfUnitOfTimeRange : {code}".format(code=code) + ) + + def test_timeunits_grib1_specific(self): + tests = ( + (1, 13, None, 0.25 * _hour_secs, "15 minutes"), + (1, 14, None, 0.5 * _hour_secs, "30 minutes"), + (1, 254, None, 1.0, "seconds"), + (1, 111, TestGribTimecodes._err_bad_timeunit(111), 1.0, "??"), + ) + TestGribTimecodes._run_timetests(self, tests) + + def test_timeunits_calendar(self): + tests = ( + (1, 3, TestGribTimecodes._err_bad_timeunit(3), 0.0, "months"), + (1, 4, TestGribTimecodes._err_bad_timeunit(4), 0.0, "years"), + (1, 5, TestGribTimecodes._err_bad_timeunit(5), 0.0, "decades"), + (1, 6, TestGribTimecodes._err_bad_timeunit(6), 0.0, "30 years"), + (1, 7, TestGribTimecodes._err_bad_timeunit(7), 0.0, "centuries"), + ) + TestGribTimecodes._run_timetests(self, tests) + + def test_timeunits_invalid(self): + tests = ( + (1, 111, TestGribTimecodes._err_bad_timeunit(111), 1.0, "??"), + ) + TestGribTimecodes._run_timetests(self, tests) + + def test_warn_unknown_pdts(self): + # Test loading of an unrecognised GRIB Product Definition Template. + + # Get a temporary file by name (deleted afterward by context). + with self.temp_filename() as temp_gribfile_path: + # Write a test grib message to the temporary file. + with open(temp_gribfile_path, "wb") as temp_gribfile: + grib_message = gribapi.grib_new_from_samples("GRIB2") + # Set the PDT to something unexpected. + gribapi.grib_set_long( + grib_message, "productDefinitionTemplateNumber", 5 + ) + gribapi.grib_write(grib_message, temp_gribfile) + + # Load the message from the file as a cube. + cube_generator = iris_grib.load_cubes(temp_gribfile_path) + with self.assertRaises(iris.exceptions.TranslationError) as te: + _ = next(cube_generator) + self.assertEqual( + "Product definition template [5]" " is not supported", + str(te.exception), + ) + + +class TestGrib1LoadPhenomenon(tests.IrisTest): + # Test recognition of grib phenomenon types. + def mock_grib(self): + grib = mock.Mock() + grib.edition = 1 + grib.startStep = 0 + grib.phenomenon_points = lambda unit: 3 + grib._forecastTimeUnit = "hours" + grib.productDefinitionTemplateNumber = 0 + # define a level type (NB these 2 are effectively the same) + grib.levelType = 1 + grib.typeOfFirstFixedSurface = 1 + grib.typeOfSecondFixedSurface = 1 + return grib + + def cube_from_message(self, grib): + # Parameter translation now uses the GribWrapper, so we must convert + # the Mock-based fake message to a FakeGribMessage. + with mock.patch("iris_grib.gribapi", _mock_gribapi): + grib_message = FakeGribMessage(**grib.__dict__) + wrapped_msg = iris_grib.GribWrapper(grib_message) + cube, _, _ = iris.fileformats.rules._make_cube( + wrapped_msg, iris_grib._grib1_load_rules.grib1_convert + ) + return cube + + def test_grib1_unknownparam(self): + grib = self.mock_grib() + grib.table2Version = 0 + grib.indicatorOfParameter = 9999 + cube = self.cube_from_message(grib) + self.assertEqual(cube.standard_name, None) + self.assertEqual(cube.long_name, None) + self.assertEqual(cube.units, cf_units.Unit("???")) + + def test_grib1_unknown_local_param(self): + grib = self.mock_grib() + grib.table2Version = 128 + grib.indicatorOfParameter = 999 + cube = self.cube_from_message(grib) + self.assertEqual(cube.standard_name, None) + self.assertEqual(cube.long_name, "UNKNOWN LOCAL PARAM 999.128") + self.assertEqual(cube.units, cf_units.Unit("???")) + + def test_grib1_unknown_standard_param(self): + grib = self.mock_grib() + grib.table2Version = 1 + grib.indicatorOfParameter = 975 + cube = self.cube_from_message(grib) + self.assertEqual(cube.standard_name, None) + self.assertEqual(cube.long_name, "UNKNOWN LOCAL PARAM 975.1") + self.assertEqual(cube.units, cf_units.Unit("???")) + + def known_grib1(self, param, standard_str, units_str): + grib = self.mock_grib() + grib.table2Version = 1 + grib.indicatorOfParameter = param + cube = self.cube_from_message(grib) + self.assertEqual(cube.standard_name, standard_str) + self.assertEqual(cube.long_name, None) + self.assertEqual(cube.units, cf_units.Unit(units_str)) + + def test_grib1_known_standard_params(self): + # at present, there are just a very few of these + self.known_grib1(11, "air_temperature", "kelvin") + self.known_grib1(33, "x_wind", "m s-1") + self.known_grib1(34, "y_wind", "m s-1") + + +if __name__ == "__main__": + tests.main() From 0335a4bcf6132be9dfdbb922de188649d625ac94 Mon Sep 17 00:00:00 2001 From: lbdreyer Date: Fri, 21 Feb 2020 14:43:21 +0100 Subject: [PATCH 154/583] Port tests from iris/tests/test_grib_save_rules.py from iris (#195) --- .../test_product_definition_template_8.py | 30 ++++++++++++ .../test_set_discipline_and_parameter.py | 5 ++ .../save_rules/test_set_fixed_surfaces.py | 49 +++++++++++++++++++ 3 files changed, 84 insertions(+) diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_8.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_8.py index 5d47aec9..5b82a80c 100644 --- a/iris_grib/tests/unit/save_rules/test_product_definition_template_8.py +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_8.py @@ -16,8 +16,10 @@ from cf_units import Unit import gribapi +import numpy as np from iris.coords import CellMethod, DimCoord +import iris.cube import iris.tests.stock as stock from iris_grib._save_rules import product_definition_template_8 @@ -43,5 +45,33 @@ def test_product_definition(self, mock_set): "productDefinitionTemplateNumber", 8) +class Test_type_of_statistical_processing(tests.IrisTest): + @mock.patch.object(gribapi, "grib_set") + def test_stats_type_min(self, mock_set): + grib = None + cube = iris.cube.Cube(np.array([1.0])) + time_unit = Unit("hours since 1970-01-01 00:00:00") + time_coord = iris.coords.DimCoord( + [0.0], bounds=[0.0, 1], standard_name="time", units=time_unit + ) + cube.add_aux_coord(time_coord, ()) + cube.add_cell_method(iris.coords.CellMethod("maximum", time_coord)) + product_definition_template_8(cube, grib) + mock_set.assert_any_call(grib, "typeOfStatisticalProcessing", 2) + + @mock.patch.object(gribapi, "grib_set") + def test_stats_type_max(self, mock_set): + grib = None + cube = iris.cube.Cube(np.array([1.0])) + time_unit = Unit("hours since 1970-01-01 00:00:00") + time_coord = iris.coords.DimCoord( + [0.0], bounds=[0.0, 1], standard_name="time", units=time_unit + ) + cube.add_aux_coord(time_coord, ()) + cube.add_cell_method(iris.coords.CellMethod("minimum", time_coord)) + product_definition_template_8(cube, grib) + mock_set.assert_any_call(grib, "typeOfStatisticalProcessing", 3) + + if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/save_rules/test_set_discipline_and_parameter.py b/iris_grib/tests/unit/save_rules/test_set_discipline_and_parameter.py index b8071254..31d41a7e 100644 --- a/iris_grib/tests/unit/save_rules/test_set_discipline_and_parameter.py +++ b/iris_grib/tests/unit/save_rules/test_set_discipline_and_parameter.py @@ -49,6 +49,11 @@ def test_known_standard_name(self): cube.standard_name = 'sea_water_y_velocity' self._check_coding(cube, 10, 1, 3) # as seen in _grib_cf_map.py + def test_known_long_name(self): + cube = self.mock_cube + cube.long_name = 'cloud_mixing_ratio' + self._check_coding(cube, 0, 1, 22) + def test_gribcode_attribute_object(self): cube = self.mock_cube cube.attributes = {'GRIB_PARAM': GRIBCode(2, 7, 12, 99)} diff --git a/iris_grib/tests/unit/save_rules/test_set_fixed_surfaces.py b/iris_grib/tests/unit/save_rules/test_set_fixed_surfaces.py index 280c39cf..3731e8d5 100644 --- a/iris_grib/tests/unit/save_rules/test_set_fixed_surfaces.py +++ b/iris_grib/tests/unit/save_rules/test_set_fixed_surfaces.py @@ -12,6 +12,8 @@ # importing anything else. import iris_grib.tests as tests +from unittest import mock + import gribapi import numpy as np @@ -83,6 +85,53 @@ def test_depth(self): gribapi.grib_get_long(grib, "typeOfSecondFixedSurface"), 106) + @mock.patch.object(gribapi, "grib_set") + def test_altitude_point(self, mock_set): + grib = None + cube = iris.cube.Cube([1, 2, 3, 4, 5]) + cube.add_aux_coord( + iris.coords.AuxCoord([12345], "altitude", units="m") + ) + + set_fixed_surfaces(cube, grib) + + mock_set.assert_any_call(grib, "typeOfFirstFixedSurface", 102) + mock_set.assert_any_call(grib, "scaleFactorOfFirstFixedSurface", 0) + mock_set.assert_any_call(grib, "scaledValueOfFirstFixedSurface", + 12345) + mock_set.assert_any_call(grib, "typeOfSecondFixedSurface", -1) + mock_set.assert_any_call(grib, "scaleFactorOfSecondFixedSurface", + 255) + mock_set.assert_any_call(grib, "scaledValueOfSecondFixedSurface", + -1) + + @mock.patch.object(gribapi, "grib_set") + def test_height_point(self, mock_set): + grib = None + cube = iris.cube.Cube([1, 2, 3, 4, 5]) + cube.add_aux_coord(iris.coords.AuxCoord([12345], "height", units="m")) + + set_fixed_surfaces(cube, grib) + + mock_set.assert_any_call(grib, "typeOfFirstFixedSurface", 103) + mock_set.assert_any_call(grib, "scaleFactorOfFirstFixedSurface", 0) + mock_set.assert_any_call(grib, "scaledValueOfFirstFixedSurface", 12345) + mock_set.assert_any_call(grib, "typeOfSecondFixedSurface", -1) + mock_set.assert_any_call(grib, "scaleFactorOfSecondFixedSurface", 255) + mock_set.assert_any_call(grib, "scaledValueOfSecondFixedSurface", -1) + + @mock.patch.object(gribapi, "grib_set") + def test_no_vertical(self, mock_set): + grib = None + cube = iris.cube.Cube([1, 2, 3, 4, 5]) + set_fixed_surfaces(cube, grib) + mock_set.assert_any_call(grib, "typeOfFirstFixedSurface", 1) + mock_set.assert_any_call(grib, "scaleFactorOfFirstFixedSurface", 0) + mock_set.assert_any_call(grib, "scaledValueOfFirstFixedSurface", 0) + mock_set.assert_any_call(grib, "typeOfSecondFixedSurface", -1) + mock_set.assert_any_call(grib, "scaleFactorOfSecondFixedSurface", 255) + mock_set.assert_any_call(grib, "scaledValueOfSecondFixedSurface", -1) + if __name__ == "__main__": tests.main() From ae8662713c3d3f5f1ed3690c7bd1bf0cdbbb5281 Mon Sep 17 00:00:00 2001 From: lbdreyer Date: Fri, 21 Feb 2020 15:23:39 +0100 Subject: [PATCH 155/583] Port tests from iris/tests/test_uri_ccallback.py (#194) --- .../integration/iris_integration/__init__.py | 50 ++++++++++++++++ .../__init__/TestCallbacks/grib_callback.cml | 60 +++++++++++++++++++ 2 files changed, 110 insertions(+) create mode 100644 iris_grib/tests/integration/iris_integration/__init__.py create mode 100644 iris_grib/tests/results/integration/iris_integration/__init__/TestCallbacks/grib_callback.cml diff --git a/iris_grib/tests/integration/iris_integration/__init__.py b/iris_grib/tests/integration/iris_integration/__init__.py new file mode 100644 index 00000000..8c25377f --- /dev/null +++ b/iris_grib/tests/integration/iris_integration/__init__.py @@ -0,0 +1,50 @@ +# Copyright iris-grib contributors +# +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. +""" +Integration tests confirming that iris functionality is working with GRIB +files. + +""" + +# Import iris_grib.tests first so that some things can be initialised before +# importing anything else. +import iris_grib.tests as tests + + +import iris +import iris.coords + + +class TestCallbacks(tests.IrisGribTest): + def test_grib_callback(self): + def grib_thing_getter(cube, field, filename): + if hasattr(field, "sections"): + # New-style loader callback : 'field' is a GribMessage, which + # has 'sections'. + cube.add_aux_coord( + iris.coords.AuxCoord( + field.sections[1]["year"], + long_name="extra_year_number_coord", + units="no_unit", + ) + ) + else: + # Old-style loader provides 'GribWrapper' type field. + cube.add_aux_coord( + iris.coords.AuxCoord( + field.extra_keys["_periodStartDateTime"], + long_name="random element", + units="no_unit", + ) + ) + + fname = tests.get_data_path(("GRIB", "global_t", "global.grib2")) + cube = iris.load_cube(fname, callback=grib_thing_getter) + self.assertCML(cube) + + +if __name__ == "__main__": + tests.main() diff --git a/iris_grib/tests/results/integration/iris_integration/__init__/TestCallbacks/grib_callback.cml b/iris_grib/tests/results/integration/iris_integration/__init__/TestCallbacks/grib_callback.cml new file mode 100644 index 00000000..aef0310a --- /dev/null +++ b/iris_grib/tests/results/integration/iris_integration/__init__/TestCallbacks/grib_callback.cml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 5e19ec2847bedcf7d3f4b8a0c05713a5938cae85 Mon Sep 17 00:00:00 2001 From: lbdreyer Date: Fri, 21 Feb 2020 19:36:45 +0100 Subject: [PATCH 156/583] Pin eccodes to avoid bad version (#193) --- environment.yml | 2 +- iris_grib/tests/unit/test_save_messages.py | 14 +++++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/environment.yml b/environment.yml index 5bce04e0..361dacb2 100644 --- a/environment.yml +++ b/environment.yml @@ -2,5 +2,5 @@ channels: - conda-forge dependencies: - iris>=2 - - python-eccodes + - python-eccodes>=0.9.1,<2 - pep8 diff --git a/iris_grib/tests/unit/test_save_messages.py b/iris_grib/tests/unit/test_save_messages.py index 974647f2..f0c6e115 100644 --- a/iris_grib/tests/unit/test_save_messages.py +++ b/iris_grib/tests/unit/test_save_messages.py @@ -23,14 +23,22 @@ def setUp(self): def test_save(self): m = mock.mock_open() with mock.patch('builtins.open', m, create=True): - iris_grib.save_messages([self.grib_message], 'foo.grib2') + # sending a MagicMock object to gribapi raises an AssertionError + # as the gribapi code does a type check + # this is deemed acceptable within the scope of this unit test + with self.assertRaises((AssertionError, TypeError)): + iris_grib.save_messages([self.grib_message], 'foo.grib2') self.assertTrue(mock.call('foo.grib2', 'wb') in m.mock_calls) def test_save_append(self): m = mock.mock_open() with mock.patch('builtins.open', m, create=True): - iris_grib.save_messages([self.grib_message], 'foo.grib2', - append=True) + # sending a MagicMock object to gribapi raises an AssertionError + # as the gribapi code does a type check + # this is deemed acceptable within the scope of this unit test + with self.assertRaises((AssertionError, TypeError)): + iris_grib.save_messages([self.grib_message], 'foo.grib2', + append=True) self.assertTrue(mock.call('foo.grib2', 'ab') in m.mock_calls) From c4d152ca6271a4600c01901b82e76cf39efe3b4c Mon Sep 17 00:00:00 2001 From: lbdreyer Date: Fri, 21 Feb 2020 19:45:55 +0100 Subject: [PATCH 157/583] Port tests from iris/tests/integration/test_grib2.py (#192) --- .../load_convert/test_data_section.py | 73 +++++++++ .../test_product_definition_section.py | 74 +++++++++ .../test_grid_definition_section.py | 140 ++++++++++++++++++ .../test_product_definition_section.py | 81 ++++++++++ .../grid_complex_spatial_differencing.cml | 40 +++++ ...d_complex_spatial_differencing.data.0.json | 1 + .../data_section/TestGDT30/lambert.cml | 37 +++++ .../TestGDT30/lambert.data.0.json | 1 + .../data_section/TestGDT40/reduced.cml | 46 ++++++ .../TestGDT40/reduced.data.0.json | 1 + .../data_section/TestGDT40/regular.cml | 35 +++++ .../TestGDT40/regular.data.0.json | 1 + .../data_section/TestImport/gdt1.cml | 36 +++++ .../data_section/TestImport/gdt1.data.0.json | 1 + .../TestImport/gdt90_with_bitmap.cml | 40 +++++ .../TestImport/gdt90_with_bitmap.data.0.json | 1 + .../tests/unit/test_load_pairs_from_fields.py | 52 +++++++ 17 files changed, 660 insertions(+) create mode 100644 iris_grib/tests/integration/load_convert/test_data_section.py create mode 100644 iris_grib/tests/integration/load_convert/test_product_definition_section.py create mode 100644 iris_grib/tests/integration/round_trip/test_grid_definition_section.py create mode 100644 iris_grib/tests/integration/round_trip/test_product_definition_section.py create mode 100644 iris_grib/tests/results/integration/load_convert/data_section/TestDRT3/grid_complex_spatial_differencing.cml create mode 100644 iris_grib/tests/results/integration/load_convert/data_section/TestDRT3/grid_complex_spatial_differencing.data.0.json create mode 100644 iris_grib/tests/results/integration/load_convert/data_section/TestGDT30/lambert.cml create mode 100644 iris_grib/tests/results/integration/load_convert/data_section/TestGDT30/lambert.data.0.json create mode 100644 iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/reduced.cml create mode 100644 iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/reduced.data.0.json create mode 100644 iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/regular.cml create mode 100644 iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/regular.data.0.json create mode 100644 iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt1.cml create mode 100644 iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt1.data.0.json create mode 100644 iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt90_with_bitmap.cml create mode 100644 iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt90_with_bitmap.data.0.json create mode 100644 iris_grib/tests/unit/test_load_pairs_from_fields.py diff --git a/iris_grib/tests/integration/load_convert/test_data_section.py b/iris_grib/tests/integration/load_convert/test_data_section.py new file mode 100644 index 00000000..9aa8583e --- /dev/null +++ b/iris_grib/tests/integration/load_convert/test_data_section.py @@ -0,0 +1,73 @@ +# Copyright iris-grib contributors +# +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. +""" +Integration tests to confirm data is loaded correctly. + +""" + +# import iris_grib.tests first so that some things can be initialised +# before importing anything else. +import iris_grib.tests as tests + +import numpy.ma as ma + +from iris import load_cube + + +class TestImport(tests.IrisGribTest): + def test_gdt1(self): + path = tests.get_data_path( + ("GRIB", "rotated_nae_t", "sensible_pole.grib2") + ) + cube = load_cube(path) + self.assertCMLApproxData(cube) + + def test_gdt90_with_bitmap(self): + path = tests.get_data_path(("GRIB", "umukv", "ukv_chan9.grib2")) + cube = load_cube(path) + # Pay particular attention to the orientation. + self.assertIsNot(cube.data[0, 0], ma.masked) + self.assertIs(cube.data[-1, 0], ma.masked) + self.assertIs(cube.data[0, -1], ma.masked) + self.assertIs(cube.data[-1, -1], ma.masked) + x = cube.coord("projection_x_coordinate").points + y = cube.coord("projection_y_coordinate").points + self.assertGreater(x[0], x[-1]) # Decreasing X coordinate + self.assertLess(y[0], y[-1]) # Increasing Y coordinate + # Check everything else. + self.assertCMLApproxData(cube) + + +class TestGDT30(tests.IrisGribTest): + def test_lambert(self): + path = tests.get_data_path(("GRIB", "lambert", "lambert.grib2")) + cube = load_cube(path) + self.assertCMLApproxData(cube) + + +class TestGDT40(tests.IrisGribTest): + def test_regular(self): + path = tests.get_data_path(("GRIB", "gaussian", "regular_gg.grib2")) + cube = load_cube(path) + self.assertCMLApproxData(cube) + + def test_reduced(self): + path = tests.get_data_path(("GRIB", "reduced", "reduced_gg.grib2")) + cube = load_cube(path) + self.assertCMLApproxData(cube) + + +class TestDRT3(tests.IrisGribTest): + def test_grid_complex_spatial_differencing(self): + path = tests.get_data_path( + ("GRIB", "missing_values", "missing_values.grib2") + ) + cube = load_cube(path) + self.assertCMLApproxData(cube) + + +if __name__ == '__main__': + tests.main() diff --git a/iris_grib/tests/integration/load_convert/test_product_definition_section.py b/iris_grib/tests/integration/load_convert/test_product_definition_section.py new file mode 100644 index 00000000..741a4d63 --- /dev/null +++ b/iris_grib/tests/integration/load_convert/test_product_definition_section.py @@ -0,0 +1,74 @@ +# Copyright iris-grib contributors +# +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. +""" +Integration tests for loading various production definitions. + +""" + +# Import iris_grib.tests first so that some things can be initialised before +# importing anything else. +import iris_grib.tests as tests + + +from iris import load_cube + + +class TestPDT8(tests.IrisGribTest): + def setUp(self): + # Load from the test file. + file_path = tests.get_data_path( + ("GRIB", "time_processed", "time_bound.grib2") + ) + self.cube = load_cube(file_path) + + def test_coords(self): + # Check the result has main coordinates as expected. + for name, shape, is_bounded in [ + ("forecast_reference_time", (1,), False), + ("time", (1,), True), + ("forecast_period", (1,), True), + ("pressure", (1,), False), + ("latitude", (73,), False), + ("longitude", (96,), False), + ]: + coords = self.cube.coords(name) + self.assertEqual( + len(coords), + 1, + "expected one {!r} coord, found {}".format(name, len(coords)), + ) + (coord,) = coords + self.assertEqual( + coord.shape, + shape, + "coord {!r} shape is {} instead of {!r}.".format( + name, coord.shape, shape + ), + ) + self.assertEqual( + coord.has_bounds(), + is_bounded, + "coord {!r} has_bounds={}, expected {}.".format( + name, coord.has_bounds(), is_bounded + ), + ) + + def test_cell_method(self): + # Check the result has the expected cell method. + cell_methods = self.cube.cell_methods + self.assertEqual( + len(cell_methods), + 1, + "result has {} cell methods, expected one.".format( + len(cell_methods) + ), + ) + (cell_method,) = cell_methods + self.assertEqual(cell_method.coord_names, ("time",)) + + +if __name__ == "__main__": + tests.main() diff --git a/iris_grib/tests/integration/round_trip/test_grid_definition_section.py b/iris_grib/tests/integration/round_trip/test_grid_definition_section.py new file mode 100644 index 00000000..a7bcc122 --- /dev/null +++ b/iris_grib/tests/integration/round_trip/test_grid_definition_section.py @@ -0,0 +1,140 @@ +# Copyright iris-grib contributors +# +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. +""" +Integration test for round-trip loading and saving of various grids. + +""" + +# import iris_grib.tests first so that some things can be initialised +# before importing anything else. +import iris_grib.tests as tests + +from iris import load_cube, save +from iris.coord_systems import RotatedGeogCS +from iris.fileformats.pp import EARTH_RADIUS as UM_DEFAULT_EARTH_RADIUS +from iris.util import is_regular + +from iris.tests import TestGribMessage + +from iris_grib.grib_phenom_translation import GRIBCode + + +class TestGDT5(TestGribMessage): + def test_save_load(self): + # Load sample UKV data (variable-resolution rotated grid). + path = tests.get_data_path(("PP", "ukV1", "ukVpmslont.pp")) + cube = load_cube(path) + + # Extract a single 2D field, for simplicity. + self.assertEqual(cube.ndim, 3) + self.assertEqual(cube.coord_dims("time"), (0,)) + cube = cube[0] + + # Check that it has a rotated-pole variable-spaced grid, as expected. + x_coord = cube.coord(axis="x") + self.assertIsInstance(x_coord.coord_system, RotatedGeogCS) + self.assertFalse(is_regular(x_coord)) + + # Write to temporary file, check that key contents are in the file, + # then load back in. + with self.temp_filename("ukv_sample.grib2") as temp_file_path: + save(cube, temp_file_path) + + # Check that various aspects of the saved file are as expected. + expect_values = ( + (0, "editionNumber", 2), + (3, "gridDefinitionTemplateNumber", 5), + (3, "Ni", cube.shape[-1]), + (3, "Nj", cube.shape[-2]), + (3, "shapeOfTheEarth", 1), + ( + 3, + "scaledValueOfRadiusOfSphericalEarth", + int(UM_DEFAULT_EARTH_RADIUS), + ), + (3, "resolutionAndComponentFlags", 0), + (3, "latitudeOfSouthernPole", -37500000), + (3, "longitudeOfSouthernPole", 357500000), + (3, "angleOfRotation", 0), + ) + self.assertGribMessageContents(temp_file_path, expect_values) + + # Load the Grib file back into a new cube. + cube_loaded_from_saved = load_cube(temp_file_path) + # Also load data, before the temporary file gets deleted. + cube_loaded_from_saved.data + + # The re-loaded result will not match the original in every respect: + # * cube attributes are discarded + # * horizontal coordinates are rounded to an integer representation + # * bounds on horizontal coords are lost + # Thus the following "equivalence tests" are rather piecemeal.. + + # Check those re-loaded properties which should match the original. + for test_cube in (cube, cube_loaded_from_saved): + self.assertEqual( + test_cube.standard_name, "air_pressure_at_sea_level" + ) + self.assertEqual(test_cube.units, "Pa") + self.assertEqual(test_cube.shape, (928, 744)) + self.assertEqual(test_cube.cell_methods, ()) + + # Check only the GRIB_PARAM attribute exists on the re-loaded cube. + # Note: this does *not* match the original, but is as expected. + self.assertEqual( + cube_loaded_from_saved.attributes, + {"GRIB_PARAM": GRIBCode("GRIB2:d000c003n001")}, + ) + + # Now remaining to check: coordinates + data... + + # Check they have all the same coordinates. + co_names = [coord.name() for coord in cube.coords()] + co_names_reload = [ + coord.name() for coord in cube_loaded_from_saved.coords() + ] + self.assertEqual(sorted(co_names_reload), sorted(co_names)) + + # Check all the coordinates. + for coord_name in co_names: + try: + co_orig = cube.coord(coord_name) + co_load = cube_loaded_from_saved.coord(coord_name) + + # Check shape. + self.assertEqual( + co_load.shape, + co_orig.shape, + 'Shape of re-loaded "{}" coord is {} ' + "instead of {}".format( + coord_name, co_load.shape, co_orig.shape + ), + ) + + # Check coordinate points equal, within a tolerance. + self.assertArrayAllClose( + co_load.points, co_orig.points, rtol=1.0e-6 + ) + + # Check all coords are unbounded. + # (NOTE: this is not so for the original X and Y coordinates, + # but Grib does not store those bounds). + self.assertIsNone(co_load.bounds) + + except AssertionError as err: + self.assertTrue( + False, + 'Failed on coordinate "{}" : {}'.format( + coord_name, str(err) + ), + ) + + # Check that main data array also matches. + self.assertArrayAllClose(cube.data, cube_loaded_from_saved.data) + + +if __name__ == "__main__": + tests.main() diff --git a/iris_grib/tests/integration/round_trip/test_product_definition_section.py b/iris_grib/tests/integration/round_trip/test_product_definition_section.py new file mode 100644 index 00000000..b0fed1cc --- /dev/null +++ b/iris_grib/tests/integration/round_trip/test_product_definition_section.py @@ -0,0 +1,81 @@ +# Copyright iris-grib contributors +# +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. +""" +Integration tests for round-trip loading and saving various product +definitions. + +""" + +# Import iris_grib.tests first so that some things can be initialised before +# importing anything else. +import iris_grib.tests as tests + +from cf_units import Unit +from iris import load_cube, save +import iris.coords +import iris.coord_systems + +from iris.tests import TestGribMessage +import iris.tests.stock as stock + +from iris_grib.grib_phenom_translation import GRIBCode + + +class TestPDT11(TestGribMessage): + def test_perturbation(self): + path = tests.get_data_path( + ("NetCDF", "global", "xyt", "SMALL_hires_wind_u_for_ipcc4.nc") + ) + cube = load_cube(path) + # trim to 1 time and regular lats + cube = cube[0, 12:144, :] + crs = iris.coord_systems.GeogCS(6371229) + cube.coord("latitude").coord_system = crs + cube.coord("longitude").coord_system = crs + # add a realization coordinate + cube.add_aux_coord( + iris.coords.DimCoord( + points=1, standard_name="realization", units="1" + ) + ) + with self.temp_filename("testPDT11.GRIB2") as temp_file_path: + iris.save(cube, temp_file_path) + + # Check that various aspects of the saved file are as expected. + expect_values = ( + (0, "editionNumber", 2), + (3, "gridDefinitionTemplateNumber", 0), + (4, "productDefinitionTemplateNumber", 11), + (4, "perturbationNumber", 1), + (4, "typeOfStatisticalProcessing", 0), + (4, "numberOfForecastsInEnsemble", 255), + ) + self.assertGribMessageContents(temp_file_path, expect_values) + + +class TestPDT40(tests.IrisTest): + def test_save_load(self): + cube = stock.lat_lon_cube() + cube.rename("atmosphere_mole_content_of_ozone") + cube.units = Unit("Dobson") + tcoord = iris.coords.DimCoord( + 23, "time", units=Unit("days since epoch", calendar="standard") + ) + fpcoord = iris.coords.DimCoord(24, "forecast_period", + units=Unit("hours")) + cube.add_aux_coord(tcoord) + cube.add_aux_coord(fpcoord) + cube.attributes["WMO_constituent_type"] = 0 + cube.attributes["GRIB_PARAM"] = GRIBCode("GRIB2:d000c014n000") + + with self.temp_filename("test_grib_pdt40.grib2") as temp_file_path: + save(cube, temp_file_path) + loaded = load_cube(temp_file_path) + self.assertEqual(loaded.attributes, cube.attributes) + + +if __name__ == "__main__": + tests.main() diff --git a/iris_grib/tests/results/integration/load_convert/data_section/TestDRT3/grid_complex_spatial_differencing.cml b/iris_grib/tests/results/integration/load_convert/data_section/TestDRT3/grid_complex_spatial_differencing.cml new file mode 100644 index 00000000..2cfe06f8 --- /dev/null +++ b/iris_grib/tests/results/integration/load_convert/data_section/TestDRT3/grid_complex_spatial_differencing.cml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iris_grib/tests/results/integration/load_convert/data_section/TestDRT3/grid_complex_spatial_differencing.data.0.json b/iris_grib/tests/results/integration/load_convert/data_section/TestDRT3/grid_complex_spatial_differencing.data.0.json new file mode 100644 index 00000000..f42d355d --- /dev/null +++ b/iris_grib/tests/results/integration/load_convert/data_section/TestDRT3/grid_complex_spatial_differencing.data.0.json @@ -0,0 +1 @@ +{"std": 7.798695691713748, "min": -34.43, "max": 33.009999999999998, "shape": [73, 144], "masked": true, "mean": 2.3147813807531383} \ No newline at end of file diff --git a/iris_grib/tests/results/integration/load_convert/data_section/TestGDT30/lambert.cml b/iris_grib/tests/results/integration/load_convert/data_section/TestGDT30/lambert.cml new file mode 100644 index 00000000..215a0de8 --- /dev/null +++ b/iris_grib/tests/results/integration/load_convert/data_section/TestGDT30/lambert.cml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iris_grib/tests/results/integration/load_convert/data_section/TestGDT30/lambert.data.0.json b/iris_grib/tests/results/integration/load_convert/data_section/TestGDT30/lambert.data.0.json new file mode 100644 index 00000000..99d58c5e --- /dev/null +++ b/iris_grib/tests/results/integration/load_convert/data_section/TestGDT30/lambert.data.0.json @@ -0,0 +1 @@ +{"std": 5.3916288115779398, "min": 265.550048828125, "max": 300.862548828125, "shape": [799, 1199], "masked": false, "mean": 287.6306666328037} \ No newline at end of file diff --git a/iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/reduced.cml b/iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/reduced.cml new file mode 100644 index 00000000..3a963b32 --- /dev/null +++ b/iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/reduced.cml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/reduced.data.0.json b/iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/reduced.data.0.json new file mode 100644 index 00000000..4cd44b53 --- /dev/null +++ b/iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/reduced.data.0.json @@ -0,0 +1 @@ +{"std": 6295.5250434859099, "min": -6419.0146484375, "max": 55403.9853515625, "shape": [13280], "masked": false, "mean": 2446.3044780685241} \ No newline at end of file diff --git a/iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/regular.cml b/iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/regular.cml new file mode 100644 index 00000000..e5eea0fc --- /dev/null +++ b/iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/regular.cml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/regular.data.0.json b/iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/regular.data.0.json new file mode 100644 index 00000000..9595f90e --- /dev/null +++ b/iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/regular.data.0.json @@ -0,0 +1 @@ +{"std": 290.49181302067751, "min": 4388.16162109375, "max": 5576.53662109375, "shape": [96, 192], "masked": false, "mean": 5210.564598931207} \ No newline at end of file diff --git a/iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt1.cml b/iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt1.cml new file mode 100644 index 00000000..d304d8a8 --- /dev/null +++ b/iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt1.cml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt1.data.0.json b/iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt1.data.0.json new file mode 100644 index 00000000..2b416f6a --- /dev/null +++ b/iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt1.data.0.json @@ -0,0 +1 @@ +{"std": 6.1629553729365423, "min": 266.625, "max": 302.25, "shape": [360, 600], "masked": false, "mean": 284.43164236111113} \ No newline at end of file diff --git a/iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt90_with_bitmap.cml b/iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt90_with_bitmap.cml new file mode 100644 index 00000000..3118f868 --- /dev/null +++ b/iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt90_with_bitmap.cml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt90_with_bitmap.data.0.json b/iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt90_with_bitmap.data.0.json new file mode 100644 index 00000000..08c3cb82 --- /dev/null +++ b/iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt90_with_bitmap.data.0.json @@ -0,0 +1 @@ +{"std": 13.780125280995835, "min": 208.90541992187502, "max": 287.25541992187499, "shape": [227, 390], "masked": true, "mean": 266.3984425053925} \ No newline at end of file diff --git a/iris_grib/tests/unit/test_load_pairs_from_fields.py b/iris_grib/tests/unit/test_load_pairs_from_fields.py new file mode 100644 index 00000000..9f429154 --- /dev/null +++ b/iris_grib/tests/unit/test_load_pairs_from_fields.py @@ -0,0 +1,52 @@ +# Copyright iris-grib contributors +# +# This file is part of iris-grib 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 `iris_grib.load_pairs_from_fields` function.""" + +import iris_grib.tests as tests + +from iris_grib import load_pairs_from_fields +from iris_grib.message import GribMessage + + +class TestAsCubes(tests.IrisTest): + def setUp(self): + # Load from the test file. + self.file_path = tests.get_data_path( + ("GRIB", "time_processed", "time_bound.grib2") + ) + + def test_year_filter(self): + msgs = GribMessage.messages_from_filename(self.file_path) + chosen_messages = [] + for gmsg in msgs: + if gmsg.sections[1]["year"] == 1998: + chosen_messages.append(gmsg) + cubes_msgs = list(load_pairs_from_fields(chosen_messages)) + self.assertEqual(len(cubes_msgs), 1) + + def test_year_filter_none(self): + msgs = GribMessage.messages_from_filename(self.file_path) + chosen_messages = [] + for gmsg in msgs: + if gmsg.sections[1]["year"] == 1958: + chosen_messages.append(gmsg) + cubes_msgs = list(load_pairs_from_fields(chosen_messages)) + self.assertEqual(len(cubes_msgs), 0) + + def test_as_pairs(self): + messages = GribMessage.messages_from_filename(self.file_path) + cubes = [] + cube_msg_pairs = load_pairs_from_fields(messages) + for cube, gmsg in cube_msg_pairs: + if gmsg.sections[1]["year"] == 1998: + cube.attributes["the year is"] = gmsg.sections[1]["year"] + cubes.append(cube) + self.assertEqual(len(cubes), 1) + self.assertEqual(cubes[0].attributes["the year is"], 1998) + + +if __name__ == "__main__": + tests.main() From cd5d581d1039762ff323c21bbb3a8c860937e46b Mon Sep 17 00:00:00 2001 From: lbdreyer Date: Fri, 21 Feb 2020 21:10:57 +0100 Subject: [PATCH 158/583] Port tests from iris/tests/integration/test_grib_save.py (#198) --- .../integration/save_rules/test_grib_save.py | 315 ++++++++++++++++++ 1 file changed, 315 insertions(+) create mode 100644 iris_grib/tests/integration/save_rules/test_grib_save.py diff --git a/iris_grib/tests/integration/save_rules/test_grib_save.py b/iris_grib/tests/integration/save_rules/test_grib_save.py new file mode 100644 index 00000000..9cbb7177 --- /dev/null +++ b/iris_grib/tests/integration/save_rules/test_grib_save.py @@ -0,0 +1,315 @@ +# Copyright iris-grib contributors +# +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. +""" +Tests for specific implementation aspects of the grib saver. +Ported here from 'iris.tests.integration.test_grib_save'. + +""" + +# Import iris_grib.tests first so that some things can be initialised before +# importing anything else +import iris_grib.tests as tests + +import os +import datetime + +import cf_units +import numpy as np + +import iris +import iris.cube +import iris.coord_systems +import iris.coords +import iris.exceptions +import iris.util + +from iris.tests import TestGribMessage + +import gribapi +from iris_grib._load_convert import _MDI as MDI + + +class TestLoadSave(TestGribMessage): + def setUp(self): + self.skip_keys = [] + + def test_latlon_forecast_plev(self): + source_grib = tests.get_data_path(("GRIB", "uk_t", "uk_t.grib2")) + cubes = iris.load(source_grib) + with self.temp_filename(suffix=".grib2") as temp_file_path: + iris.save(cubes, temp_file_path) + expect_diffs = { + "totalLength": (4837, 4832), + "productionStatusOfProcessedData": (0, 255), + "scaleFactorOfRadiusOfSphericalEarth": (MDI, 0), + "shapeOfTheEarth": (0, 1), + "scaledValueOfRadiusOfSphericalEarth": (MDI, 6367470), + "scaledValueOfEarthMajorAxis": (MDI, 0), + "scaleFactorOfEarthMajorAxis": (MDI, 0), + "scaledValueOfEarthMinorAxis": (MDI, 0), + "scaleFactorOfEarthMinorAxis": (MDI, 0), + "typeOfGeneratingProcess": (0, 255), + "generatingProcessIdentifier": (128, 255), + } + self.assertGribMessageDifference( + source_grib, + temp_file_path, + expect_diffs, + self.skip_keys, + skip_sections=[2], + ) + + def test_rotated_latlon(self): + source_grib = tests.get_data_path( + ("GRIB", "rotated_nae_t", "sensible_pole.grib2") + ) + cubes = iris.load(source_grib) + with self.temp_filename(suffix=".grib2") as temp_file_path: + iris.save(cubes, temp_file_path) + expect_diffs = { + "totalLength": (648196, 648191), + "productionStatusOfProcessedData": (0, 255), + "scaleFactorOfRadiusOfSphericalEarth": (MDI, 0), + "shapeOfTheEarth": (0, 1), + "scaledValueOfRadiusOfSphericalEarth": (MDI, 6367470), + "scaledValueOfEarthMajorAxis": (MDI, 0), + "scaleFactorOfEarthMajorAxis": (MDI, 0), + "scaledValueOfEarthMinorAxis": (MDI, 0), + "scaleFactorOfEarthMinorAxis": (MDI, 0), + "longitudeOfLastGridPoint": (392109982, 32106370), + "latitudeOfLastGridPoint": (19419996, 19419285), + "typeOfGeneratingProcess": (0, 255), + "generatingProcessIdentifier": (128, 255), + } + self.assertGribMessageDifference( + source_grib, + temp_file_path, + expect_diffs, + self.skip_keys, + skip_sections=[2], + ) + + def test_time_mean(self): + # This test for time-mean fields also tests negative forecast time. + source_grib = tests.get_data_path( + ("GRIB", "time_processed", "time_bound.grib2") + ) + cubes = iris.load(source_grib) + expect_diffs = { + "totalLength": (21232, 21227), + "productionStatusOfProcessedData": (0, 255), + "scaleFactorOfRadiusOfSphericalEarth": (MDI, 0), + "shapeOfTheEarth": (0, 1), + "scaledValueOfRadiusOfSphericalEarth": (MDI, 6367470), + "scaledValueOfEarthMajorAxis": (MDI, 0), + "scaleFactorOfEarthMajorAxis": (MDI, 0), + "scaledValueOfEarthMinorAxis": (MDI, 0), + "scaleFactorOfEarthMinorAxis": (MDI, 0), + "longitudeOfLastGridPoint": (356249908, 356249809), + "latitudeOfLastGridPoint": (-89999938, -89999944), + "typeOfGeneratingProcess": (0, 255), + "generatingProcessIdentifier": (128, 255), + "typeOfTimeIncrement": (2, 255), + } + self.skip_keys.append("stepType") + self.skip_keys.append("stepTypeInternal") + with self.temp_filename(suffix=".grib2") as temp_file_path: + iris.save(cubes, temp_file_path) + self.assertGribMessageDifference( + source_grib, + temp_file_path, + expect_diffs, + self.skip_keys, + skip_sections=[2], + ) + + +class TestCubeSave(tests.IrisGribTest): + # save fabricated cubes + + def _load_basic(self): + path = tests.get_data_path(("GRIB", "uk_t", "uk_t.grib2")) + return iris.load_cube(path) + + def test_params(self): + # TODO + pass + + def test_originating_centre(self): + # TODO + pass + + def test_irregular(self): + cube = self._load_basic() + lat_coord = cube.coord("latitude") + cube.remove_coord("latitude") + + new_lats = np.append( + lat_coord.points[:-1], lat_coord.points[0] + ) # Irregular + cube.add_aux_coord( + iris.coords.AuxCoord( + new_lats, + "latitude", + units="degrees", + coord_system=lat_coord.coord_system, + ), + 0, + ) + + saved_grib = iris.util.create_temp_filename(suffix=".grib2") + self.assertRaises( + iris.exceptions.TranslationError, iris.save, cube, saved_grib + ) + os.remove(saved_grib) + + def test_non_latlon(self): + cube = self._load_basic() + cube.coord(dimensions=[0]).coord_system = None + saved_grib = iris.util.create_temp_filename(suffix=".grib2") + self.assertRaises( + iris.exceptions.TranslationError, iris.save, cube, saved_grib + ) + os.remove(saved_grib) + + def test_forecast_period(self): + # unhandled unit + cube = self._load_basic() + cube.coord("forecast_period").units = cf_units.Unit("years") + saved_grib = iris.util.create_temp_filename(suffix=".grib2") + self.assertRaises( + iris.exceptions.TranslationError, iris.save, cube, saved_grib + ) + os.remove(saved_grib) + + def test_unhandled_vertical(self): + # unhandled level type + cube = self._load_basic() + # Adjust the 'pressure' coord to make it into an "unrecognised Z coord" + p_coord = cube.coord("pressure") + p_coord.rename("not the messiah") + p_coord.units = "K" + p_coord.attributes["positive"] = "up" + saved_grib = iris.util.create_temp_filename(suffix=".grib2") + with self.assertRaises(iris.exceptions.TranslationError): + iris.save(cube, saved_grib) + os.remove(saved_grib) + + def test_scalar_int32_pressure(self): + # Make sure we can save a scalar int32 coordinate with unit conversion. + cube = self._load_basic() + cube.coord("pressure").points = np.array([200], dtype=np.int32) + cube.coord("pressure").units = "hPa" + with self.temp_filename(".grib2") as testfile: + iris.save(cube, testfile) + + def test_bounded_level(self): + cube = iris.load_cube( + tests.get_data_path(("GRIB", "uk_t", "uk_t.grib2")) + ) + with self.temp_filename(".grib2") as testfile: + iris.save(cube, testfile) + with open(testfile, "rb") as saved_file: + g = gribapi.grib_new_from_file(saved_file) + self.assertEqual( + gribapi.grib_get_double( + g, "scaledValueOfFirstFixedSurface" + ), + 0.0, + ) + self.assertEqual( + gribapi.grib_get_double( + g, "scaledValueOfSecondFixedSurface" + ), + 2147483647.0, + ) + + +class TestHandmade(tests.IrisGribTest): + def _lat_lon_cube_no_time(self): + """ + Returns a cube with a latitude and longitude suitable for testing + saving to GRIB. + + """ + cube = iris.cube.Cube(np.arange(12, dtype=np.int32).reshape((3, 4))) + cs = iris.coord_systems.GeogCS(6371229) + cube.add_dim_coord( + iris.coords.DimCoord( + np.arange(4) * 90 + -180, + "longitude", + units="degrees", + coord_system=cs, + ), + 1, + ) + cube.add_dim_coord( + iris.coords.DimCoord( + np.arange(3) * 45 + -90, + "latitude", + units="degrees", + coord_system=cs, + ), + 0, + ) + + return cube + + def _cube_time_no_forecast(self): + cube = self._lat_lon_cube_no_time() + unit = cf_units.Unit( + "hours since epoch", calendar=cf_units.CALENDAR_GREGORIAN + ) + dt = datetime.datetime(2010, 12, 31, 12, 0) + cube.add_aux_coord( + iris.coords.AuxCoord( + np.array([unit.date2num(dt)], dtype=np.float64), + "time", + units=unit, + ) + ) + return cube + + def _cube_with_forecast(self): + cube = self._cube_time_no_forecast() + cube.add_aux_coord( + iris.coords.AuxCoord( + np.array([6], dtype=np.int32), "forecast_period", units="hours" + ) + ) + return cube + + def _cube_with_pressure(self): + cube = self._cube_with_forecast() + cube.add_aux_coord( + iris.coords.DimCoord(np.int32(10), "air_pressure", units="Pa") + ) + return cube + + def _cube_with_time_bounds(self): + cube = self._cube_with_pressure() + cube.coord("time").bounds = np.array([[0, 100]]) + return cube + + def test_no_time_cube(self): + cube = self._lat_lon_cube_no_time() + saved_grib = iris.util.create_temp_filename(suffix=".grib2") + self.assertRaises( + iris.exceptions.TranslationError, iris.save, cube, saved_grib + ) + os.remove(saved_grib) + + def test_cube_with_time_bounds(self): + cube = self._cube_with_time_bounds() + saved_grib = iris.util.create_temp_filename(suffix=".grib2") + self.assertRaises( + iris.exceptions.TranslationError, iris.save, cube, saved_grib + ) + os.remove(saved_grib) + + +if __name__ == "__main__": + tests.main() From ab9bc7d7db1efd5087f96a3202861ba2837fe84b Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Mon, 24 Feb 2020 12:27:23 +0000 Subject: [PATCH 159/583] Fix dask2 proxies (#190) * First version dask-proxy shortcut code. * Replace routine with iris version and add a no-fetch test. * Code style fix. * Code style fix. * Rely on iris.util for _array_slice_ifempty; require iris>=2.4 --- environment.yml | 2 +- iris_grib/__init__.py | 23 ++++++--- iris_grib/message.py | 49 +++++++++++-------- .../tests/unit/message/test__DataProxy.py | 28 +++++++++++ setup.py | 2 +- 5 files changed, 73 insertions(+), 31 deletions(-) diff --git a/environment.yml b/environment.yml index 361dacb2..cf1cb7b9 100644 --- a/environment.yml +++ b/environment.yml @@ -1,6 +1,6 @@ channels: - conda-forge dependencies: - - iris>=2 + - iris>=2.4 - python-eccodes>=0.9.1,<2 - pep8 diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index dcc32799..9e4a6e6b 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -20,12 +20,13 @@ import numpy as np import numpy.ma as ma +# NOTE: careful here, to avoid circular imports (as iris imports grib) import iris from iris._lazy_data import as_lazy_data import iris.coord_systems as coord_systems from iris.exceptions import TranslationError, NotYetImplementedError +from iris.util import _array_slice_ifempty -# NOTE: careful here, to avoid circular imports (as iris imports grib) from . import grib_phenom_translation as gptx from . import _save_rules from ._load_convert import convert as load_convert @@ -97,13 +98,19 @@ def ndim(self): return len(self.shape) def __getitem__(self, keys): - with open(self.path, 'rb') as grib_fh: - grib_fh.seek(self.offset) - grib_message = gribapi.grib_new_from_file(grib_fh) - data = _message_values(grib_message, self.shape) - gribapi.grib_release(grib_message) - - return data.__getitem__(keys) + # Avoid fetching file data just to return an 'empty' result. + # Needed because of how dask.array.from_array behaves since Dask v2.0. + result = _array_slice_ifempty(keys, self.shape, self.dtype) + if result is None: + with open(self.path, 'rb') as grib_fh: + grib_fh.seek(self.offset) + grib_message = gribapi.grib_new_from_file(grib_fh) + data = _message_values(grib_message, self.shape) + gribapi.grib_release(grib_message) + + result = data.__getitem__(keys) + + return result def __repr__(self): msg = '<{self.__class__.__name__} shape={self.shape} ' \ diff --git a/iris_grib/message.py b/iris_grib/message.py index 7f2b8598..06642f24 100644 --- a/iris_grib/message.py +++ b/iris_grib/message.py @@ -12,6 +12,7 @@ import re import gribapi +from iris_grib import _array_slice_ifempty import numpy as np import numpy.ma as ma @@ -228,29 +229,35 @@ def _bitmap(self, bitmap_section): def __getitem__(self, keys): # NB. Currently assumes that the validity of this interpretation # is checked before this proxy is created. - message = self.recreate_raw() - sections = message.sections - bitmap_section = sections[6] - bitmap = self._bitmap(bitmap_section) - data = sections[7]['codedValues'] - - if bitmap is not None: - # Note that bitmap and data are both 1D arrays at this point. - if np.count_nonzero(bitmap) == data.shape[0]: - # Only the non-masked values are included in codedValues. - _data = np.empty(shape=bitmap.shape) - _data[bitmap.astype(bool)] = data - # `ma.masked_array` masks where input = 1, the opposite of - # the behaviour specified by the GRIB spec. - data = ma.masked_array(_data, mask=np.logical_not(bitmap), - fill_value=np.nan) - else: - msg = 'Shapes of data and bitmap do not match.' - raise TranslationError(msg) - data = data.reshape(self.shape) + # Avoid fetching file data just to return an 'empty' result. + # Needed because of how dask.array.from_array behaves since Dask v2.0. + result = _array_slice_ifempty(keys, self.shape, self.dtype) + if result is None: + message = self.recreate_raw() + sections = message.sections + bitmap_section = sections[6] + bitmap = self._bitmap(bitmap_section) + data = sections[7]['codedValues'] + + if bitmap is not None: + # Note that bitmap and data are both 1D arrays at this point. + if np.count_nonzero(bitmap) == data.shape[0]: + # Only the non-masked values are included in codedValues. + _data = np.empty(shape=bitmap.shape) + _data[bitmap.astype(bool)] = data + # `ma.masked_array` masks where input = 1, the opposite of + # the behaviour specified by the GRIB spec. + data = ma.masked_array(_data, mask=np.logical_not(bitmap), + fill_value=np.nan) + else: + msg = 'Shapes of data and bitmap do not match.' + raise TranslationError(msg) + + data = data.reshape(self.shape) + result = data.__getitem__(keys) - return data.__getitem__(keys) + return result def __repr__(self): msg = '<{self.__class__.__name__} shape={self.shape} ' \ diff --git a/iris_grib/tests/unit/message/test__DataProxy.py b/iris_grib/tests/unit/message/test__DataProxy.py index 3b6dc6a3..d7494d5e 100644 --- a/iris_grib/tests/unit/message/test__DataProxy.py +++ b/iris_grib/tests/unit/message/test__DataProxy.py @@ -12,6 +12,8 @@ # importing anything else. import iris_grib.tests as tests +from unittest import mock + import numpy as np from numpy.random import randint @@ -41,5 +43,31 @@ def test_bitmap__invalid_indicator(self): data_proxy._bitmap(section_6) +class Test_emptyfetch(tests.IrisGribTest): + # See : + # iris.tests.unit.fileformats.pp.test_PPDataProxy.Test__getitem__slicing + # In this case, test *only* the no-data-read effect, not the method which + # is part of Iris. + def test_empty_slice(self): + # Check behaviour of the getitem call with an 'empty' slicing. + # This is necessary because, since Dask 2.0, the "from_array" function + # takes a zero-length slice of its array argument, to capture array + # metadata, and in those cases we want to avoid file access. + test_dtype = np.dtype(np.float32) + mock_datafetch = mock.MagicMock() + proxy = _DataProxy(shape=(3, 4), + dtype=np.dtype(np.float32), + recreate_raw=mock_datafetch) + + # Test the special no-data indexing operation. + result = proxy[0:0, 0:0] + + # Check the behaviour and results were as expected. + self.assertEqual(mock_datafetch.call_count, 0) + self.assertIsInstance(result, np.ndarray) + self.assertEqual(result.dtype, test_dtype) + self.assertEqual(result.shape, (0, 0)) + + if __name__ == '__main__': tests.main() diff --git a/setup.py b/setup.py index b36ed2a9..5db3255b 100644 --- a/setup.py +++ b/setup.py @@ -80,7 +80,7 @@ def file_walk_relative(top, remove=''): # NOTE: The Python 3 bindings to eccodes (eccodes-python) is available on # PyPI, but the user is required to install eccodes itself manually. See # ECMWF ecCodes installation documentation for more information. - install_requires=['scitools-iris>=2.0.*'] + ['eccodes-python'], + install_requires=['scitools-iris>=2.4.*'] + ['eccodes-python'], test_suite = 'iris_grib.tests', ) From d76c22814cb503e3ee55af9a465c233c45b81337 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Mon, 24 Feb 2020 12:32:23 +0000 Subject: [PATCH 160/583] Ditch redundant test code + clarify purpose. (#199) * Ditch redundant test code + clarify purpose. * Some moves and renames. --- .../integration/iris_integration/__init__.py | 40 ----------------- .../iris_integration/test_callback.py | 43 +++++++++++++++++++ .../TestCallbacks/load_callback.cml} | 0 3 files changed, 43 insertions(+), 40 deletions(-) create mode 100644 iris_grib/tests/integration/iris_integration/test_callback.py rename iris_grib/tests/results/integration/iris_integration/{__init__/TestCallbacks/grib_callback.cml => callback/TestCallbacks/load_callback.cml} (100%) diff --git a/iris_grib/tests/integration/iris_integration/__init__.py b/iris_grib/tests/integration/iris_integration/__init__.py index 8c25377f..c565a437 100644 --- a/iris_grib/tests/integration/iris_integration/__init__.py +++ b/iris_grib/tests/integration/iris_integration/__init__.py @@ -8,43 +8,3 @@ files. """ - -# Import iris_grib.tests first so that some things can be initialised before -# importing anything else. -import iris_grib.tests as tests - - -import iris -import iris.coords - - -class TestCallbacks(tests.IrisGribTest): - def test_grib_callback(self): - def grib_thing_getter(cube, field, filename): - if hasattr(field, "sections"): - # New-style loader callback : 'field' is a GribMessage, which - # has 'sections'. - cube.add_aux_coord( - iris.coords.AuxCoord( - field.sections[1]["year"], - long_name="extra_year_number_coord", - units="no_unit", - ) - ) - else: - # Old-style loader provides 'GribWrapper' type field. - cube.add_aux_coord( - iris.coords.AuxCoord( - field.extra_keys["_periodStartDateTime"], - long_name="random element", - units="no_unit", - ) - ) - - fname = tests.get_data_path(("GRIB", "global_t", "global.grib2")) - cube = iris.load_cube(fname, callback=grib_thing_getter) - self.assertCML(cube) - - -if __name__ == "__main__": - tests.main() diff --git a/iris_grib/tests/integration/iris_integration/test_callback.py b/iris_grib/tests/integration/iris_integration/test_callback.py new file mode 100644 index 00000000..ca2d739c --- /dev/null +++ b/iris_grib/tests/integration/iris_integration/test_callback.py @@ -0,0 +1,43 @@ +# Copyright iris-grib contributors +# +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. +""" +Test that iris load callbacks work with iris-grib. + +""" + +# Import iris_grib.tests first so that some things can be initialised before +# importing anything else. +import iris_grib.tests as tests + + +import iris +import iris.coords + + +class TestCallbacks(tests.IrisGribTest): + def test_load_callback(self): + # What this actually tests: + # 1. iris.load works with grib (though the GRIB picker is in Iris) + # 2. callbacks work with the grib loader + # 3. grib loaded result matches a cube snapshot + def load_callback(cube, field, filename): + # GRIB2 loader callback : 'field' is a GribMessage, which + # has 'sections'. + cube.add_aux_coord( + iris.coords.AuxCoord( + field.sections[1]["year"], + long_name="extra_year_number_coord", + units="no_unit", + ) + ) + + fname = tests.get_data_path(("GRIB", "global_t", "global.grib2")) + cube = iris.load_cube(fname, callback=load_callback) + self.assertCML(cube) + + +if __name__ == "__main__": + tests.main() diff --git a/iris_grib/tests/results/integration/iris_integration/__init__/TestCallbacks/grib_callback.cml b/iris_grib/tests/results/integration/iris_integration/callback/TestCallbacks/load_callback.cml similarity index 100% rename from iris_grib/tests/results/integration/iris_integration/__init__/TestCallbacks/grib_callback.cml rename to iris_grib/tests/results/integration/iris_integration/callback/TestCallbacks/load_callback.cml From 078658dbb1ce0caa4679d7967063045bae78764e Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Mon, 24 Feb 2020 15:01:39 +0000 Subject: [PATCH 161/583] Port pickling test from Iris. (#201) * Port pickling test from Iris. * Fix license header. * Update comments. --- .../iris_integration/test_pickle_message.py | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 iris_grib/tests/integration/iris_integration/test_pickle_message.py diff --git a/iris_grib/tests/integration/iris_integration/test_pickle_message.py b/iris_grib/tests/integration/iris_integration/test_pickle_message.py new file mode 100644 index 00000000..b44444b0 --- /dev/null +++ b/iris_grib/tests/integration/iris_integration/test_pickle_message.py @@ -0,0 +1,69 @@ +# Copyright iris-grib contributors +# +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. +"""Check that a GribMessage can be pickled.""" + +# Import iris_grib.tests first so that some things can be initialised before +# importing anything else. +import iris_grib.tests as tests + +import pickle +import unittest + +from iris.tests.integration.test_pickle import Common as PickleCommon + +from iris_grib.message import GribMessage + + +@tests.skip_data +class TestPickleGribMessage(PickleCommon, tests.IrisGribTest): + # NOTE: based on 'Common' from iris.tests.integration.test_pickle. + def setUp(self): + self.path = tests.get_data_path(("GRIB", "fp_units", "hours.grib2")) + + # NOTE: this looks like it is overriding the parent "pickle_cube", but this + # function is *not* the same thing. + # (a) the tests which use pickle_cube are "test_protocol_XXX", and none + # of those currently work (see overrides below). + # (b) the tests which use *this* function are the extra ones below. + # These check only that a GribMessage, and its lazy ".data", can be + # pickled. However, still, neither reads back successfully. + # TODO: resolve this or remove the test. + def pickle_obj(self, obj): + with self.temp_filename(".pkl") as filename: + with open(filename, "wb") as f: + pickle.dump(obj, f) + # NOTE: *ought* to read back + check equal, but it does not work. + # TODO: fix + + # These probably "ought" to work, but currently fail. + # see https://github.com/SciTools/iris-grib/issues/202 + @unittest.expectedFailure + def test_protocol_0(self): + super().test_protocol_0() + + @unittest.expectedFailure + def test_protocol_1(self): + super().test_protocol_1() + + @unittest.expectedFailure + def test_protocol_2(self): + super().test_protocol_2() + + def test(self): + # Check that a GribMessage pickles without errors. + messages = GribMessage.messages_from_filename(self.path) + obj = next(messages) + self.pickle_obj(obj) + + def test_data(self): + # Check that GribMessage.data pickles without errors. + messages = GribMessage.messages_from_filename(self.path) + obj = next(messages).data + self.pickle_obj(obj) + + +if __name__ == "__main__": + tests.main() From 80767beff9e84c1c7cd7a880cf5a9900f7174f40 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Mon, 24 Feb 2020 15:04:08 +0000 Subject: [PATCH 162/583] Import tests from iris.test.integration.test_grib load (#200) * Port tests from iris.tests.integration.test_grib_load * Minor tidying + comments update. Ensure that all tests check number of cubes loaded. * Code style fix. * Update iris_grib/tests/integration/load_convert/test_sample_file_loads.py Co-Authored-By: lbdreyer * Removed old broken test. Co-authored-by: lbdreyer --- .../load_convert/test_sample_file_loads.py | 216 ++++++++++++++++++ .../sample_file_loads/3_layer.cml | 127 ++++++++++ .../sample_file_loads/earth_shape_0.cml | 57 +++++ .../sample_file_loads/earth_shape_1.cml | 57 +++++ .../sample_file_loads/earth_shape_2.cml | 57 +++++ .../sample_file_loads/earth_shape_3.cml | 57 +++++ .../sample_file_loads/earth_shape_4.cml | 57 +++++ .../sample_file_loads/earth_shape_5.cml | 57 +++++ .../sample_file_loads/earth_shape_6.cml | 57 +++++ .../sample_file_loads/earth_shape_7.cml | 57 +++++ .../sample_file_loads/earth_shape_grib1.cml | 32 +++ .../sample_file_loads/ineg_jneg.cml | 57 +++++ .../sample_file_loads/ineg_jpos.cml | 57 +++++ .../sample_file_loads/ipos_jneg.cml | 57 +++++ .../sample_file_loads/ipos_jpos.cml | 57 +++++ .../sample_file_loads/lambert_grib1.cml | 38 +++ .../sample_file_loads/lambert_grib2.cml | 37 +++ .../missing_values_grib2.cml | 40 ++++ .../sample_file_loads/polar_stereo_grib1.cml | 34 +++ .../sample_file_loads/reduced_gg_grib2.cml | 46 ++++ .../sample_file_loads/reduced_ll_grib1.cml | 21 ++ .../sample_file_loads/regular_gg_grib1.cml | 32 +++ .../sample_file_loads/regular_gg_grib2.cml | 35 +++ .../sample_file_loads/rotated.cml | 31 +++ .../sample_file_loads/time_bound_grib1.cml | 33 +++ .../sample_file_loads/time_bound_grib2.cml | 57 +++++ 26 files changed, 1463 insertions(+) create mode 100644 iris_grib/tests/integration/load_convert/test_sample_file_loads.py create mode 100644 iris_grib/tests/results/integration/load_convert/sample_file_loads/3_layer.cml create mode 100644 iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_0.cml create mode 100644 iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_1.cml create mode 100644 iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_2.cml create mode 100644 iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_3.cml create mode 100644 iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_4.cml create mode 100644 iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_5.cml create mode 100644 iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_6.cml create mode 100644 iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_7.cml create mode 100644 iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_grib1.cml create mode 100644 iris_grib/tests/results/integration/load_convert/sample_file_loads/ineg_jneg.cml create mode 100644 iris_grib/tests/results/integration/load_convert/sample_file_loads/ineg_jpos.cml create mode 100644 iris_grib/tests/results/integration/load_convert/sample_file_loads/ipos_jneg.cml create mode 100644 iris_grib/tests/results/integration/load_convert/sample_file_loads/ipos_jpos.cml create mode 100644 iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib1.cml create mode 100644 iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib2.cml create mode 100644 iris_grib/tests/results/integration/load_convert/sample_file_loads/missing_values_grib2.cml create mode 100644 iris_grib/tests/results/integration/load_convert/sample_file_loads/polar_stereo_grib1.cml create mode 100644 iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_gg_grib2.cml create mode 100644 iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_ll_grib1.cml create mode 100644 iris_grib/tests/results/integration/load_convert/sample_file_loads/regular_gg_grib1.cml create mode 100644 iris_grib/tests/results/integration/load_convert/sample_file_loads/regular_gg_grib2.cml create mode 100644 iris_grib/tests/results/integration/load_convert/sample_file_loads/rotated.cml create mode 100644 iris_grib/tests/results/integration/load_convert/sample_file_loads/time_bound_grib1.cml create mode 100644 iris_grib/tests/results/integration/load_convert/sample_file_loads/time_bound_grib2.cml diff --git a/iris_grib/tests/integration/load_convert/test_sample_file_loads.py b/iris_grib/tests/integration/load_convert/test_sample_file_loads.py new file mode 100644 index 00000000..44142a1a --- /dev/null +++ b/iris_grib/tests/integration/load_convert/test_sample_file_loads.py @@ -0,0 +1,216 @@ +# Copyright iris-grib contributors +# +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. +""" +Integration tests for grib2 file loading. + +These tests load various files from iris-test-data, and compare the cube with a +reference CML file, to catch any unexpected changes over time. + +""" + +# import iris_grib.tests first so that some things can be initialised +# before importing anything else. +import iris_grib.tests as tests + +from unittest import skipIf + +import iris + +# Skip out tests that fail because the file coding is not yet supported. +# NOTE: now *only* used for the file 'GRIB/y_fastest/y_fast.grib2', as the +# loader does not support X,Y dimensioned data (as opposed to Y,X). +# TODO: fix this, or remove the test. +skip_irisgrib_fails = skipIf( + True, "Current grib2 loader does not support this test(s)." +) + +_RESULTDIR_PREFIX = ("integration", "load_convert", "sample_file_loads") + + +@tests.skip_data +class TestBasicLoad(tests.IrisGribTest): + def test_load_rotated(self): + cubes = iris.load( + tests.get_data_path(("GRIB", "rotated_uk", "uk_wrongparam.grib1")) + ) + self.assertCML(cubes, _RESULTDIR_PREFIX + ("rotated.cml",)) + + def test_load_time_bound(self): + cubes = iris.load( + tests.get_data_path(("GRIB", "time_processed", "time_bound.grib1")) + ) + self.assertCML(cubes, _RESULTDIR_PREFIX + ("time_bound_grib1.cml",)) + + def test_load_time_processed(self): + cubes = iris.load( + tests.get_data_path(("GRIB", "time_processed", "time_bound.grib2")) + ) + self.assertCML(cubes, _RESULTDIR_PREFIX + ("time_bound_grib2.cml",)) + + def test_load_3_layer(self): + cubes = iris.load( + tests.get_data_path(("GRIB", "3_layer_viz", "3_layer.grib2")) + ) + cubes = iris.cube.CubeList([cubes[1], cubes[0], cubes[2]]) + self.assertCML(cubes, _RESULTDIR_PREFIX + ("3_layer.cml",)) + + def test_load_masked(self): + gribfile = tests.get_data_path( + ("GRIB", "missing_values", "missing_values.grib2") + ) + cubes = iris.load(gribfile) + self.assertCML(cubes, + _RESULTDIR_PREFIX + ("missing_values_grib2.cml",)) + + def test_polar_stereo_grib1(self): + cube = iris.load_cube( + tests.get_data_path(("GRIB", "polar_stereo", "ST4.2013052210.01h")) + ) + self.assertCML(cube, _RESULTDIR_PREFIX + ("polar_stereo_grib1.cml",)) + + def test_polar_stereo_grib2_grid_definition(self): + cube = iris.load_cube( + tests.get_data_path( + ( + "GRIB", + "polar_stereo", + "CMC_glb_TMP_ISBL_1015_ps30km_2013052000_P006.grib2", + ) + ) + ) + self.assertEqual(cube.shape, (200, 247)) + pxc = cube.coord("projection_x_coordinate") + self.assertAlmostEqual(pxc.points.max(), 4769905.5125, places=4) + self.assertAlmostEqual(pxc.points.min(), -2610094.4875, places=4) + pyc = cube.coord("projection_y_coordinate") + self.assertAlmostEqual(pyc.points.max(), -216.1459, places=4) + self.assertAlmostEqual(pyc.points.min(), -5970216.1459, places=4) + self.assertEqual(pyc.coord_system, pxc.coord_system) + self.assertEqual(pyc.coord_system.grid_mapping_name, "stereographic") + self.assertEqual(pyc.coord_system.central_lat, 90.0) + self.assertEqual(pyc.coord_system.central_lon, 249.0) + self.assertEqual(pyc.coord_system.false_easting, 0.0) + self.assertEqual(pyc.coord_system.false_northing, 0.0) + self.assertEqual(pyc.coord_system.true_scale_lat, 60.0) + + def test_lambert_grib1(self): + cube = iris.load_cube( + tests.get_data_path(("GRIB", "lambert", "lambert.grib1")) + ) + self.assertCML(cube, _RESULTDIR_PREFIX + ("lambert_grib1.cml",)) + + def test_lambert_grib2(self): + cube = iris.load_cube( + tests.get_data_path(("GRIB", "lambert", "lambert.grib2")) + ) + self.assertCML(cube, _RESULTDIR_PREFIX + ("lambert_grib2.cml",)) + + def test_regular_gg_grib1(self): + cube = iris.load_cube( + tests.get_data_path(("GRIB", "gaussian", "regular_gg.grib1")) + ) + self.assertCML(cube, _RESULTDIR_PREFIX + ("regular_gg_grib1.cml",)) + + def test_regular_gg_grib2(self): + cube = iris.load_cube( + tests.get_data_path(("GRIB", "gaussian", "regular_gg.grib2")) + ) + self.assertCML(cube, _RESULTDIR_PREFIX + ("regular_gg_grib2.cml",)) + + def test_reduced_ll(self): + cube = iris.load_cube( + tests.get_data_path(("GRIB", "reduced", "reduced_ll.grib1")) + ) + self.assertCML(cube, _RESULTDIR_PREFIX + ("reduced_ll_grib1.cml",)) + + def test_reduced_gg(self): + cube = iris.load_cube( + tests.get_data_path(("GRIB", "reduced", "reduced_gg.grib2")) + ) + self.assertCML(cube, _RESULTDIR_PREFIX + ("reduced_gg_grib2.cml",)) + + +@tests.skip_data +class TestIjDirections(tests.IrisGribTest): + @staticmethod + def _old_compat_load(name): + filepath = tests.get_data_path(("GRIB", "ij_directions", name)) + cube = iris.load_cube(filepath) + return cube + + def test_ij_directions_ipos_jpos(self): + cubes = self._old_compat_load("ipos_jpos.grib2") + self.assertCML(cubes, _RESULTDIR_PREFIX + ("ipos_jpos.cml",)) + + def test_ij_directions_ipos_jneg(self): + cubes = self._old_compat_load("ipos_jneg.grib2") + self.assertCML(cubes, _RESULTDIR_PREFIX + ("ipos_jneg.cml",)) + + def test_ij_directions_ineg_jneg(self): + cubes = self._old_compat_load("ineg_jneg.grib2") + self.assertCML(cubes, _RESULTDIR_PREFIX + ("ineg_jneg.cml",)) + + def test_ij_directions_ineg_jpos(self): + cubes = self._old_compat_load("ineg_jpos.grib2") + self.assertCML(cubes, _RESULTDIR_PREFIX + ("ineg_jpos.cml",)) + + +@tests.skip_data +class TestShapeOfEarth(tests.IrisGribTest): + @staticmethod + def _old_compat_load(name): + filepath = tests.get_data_path(("GRIB", "shape_of_earth", name)) + cube = iris.load_cube(filepath) + return cube + + def test_shape_of_earth_basic(self): + # pre-defined sphere + cube = self._old_compat_load("0.grib2") + self.assertCML(cube, _RESULTDIR_PREFIX + ("earth_shape_0.cml",)) + + def test_shape_of_earth_custom_1(self): + # custom sphere + cube = self._old_compat_load("1.grib2") + self.assertCML(cube, _RESULTDIR_PREFIX + ("earth_shape_1.cml",)) + + def test_shape_of_earth_IAU65(self): + # IAU65 oblate sphere + cube = self._old_compat_load("2.grib2") + self.assertCML(cube, _RESULTDIR_PREFIX + ("earth_shape_2.cml",)) + + def test_shape_of_earth_custom_3(self): + # custom oblate spheroid (km) + cube = self._old_compat_load("3.grib2") + self.assertCML(cube, _RESULTDIR_PREFIX + ("earth_shape_3.cml",)) + + def test_shape_of_earth_IAG_GRS80(self): + # IAG-GRS80 oblate spheroid + cube = self._old_compat_load("4.grib2") + self.assertCML(cube, _RESULTDIR_PREFIX + ("earth_shape_4.cml",)) + + def test_shape_of_earth_WGS84(self): + # WGS84 + cube = self._old_compat_load("5.grib2") + self.assertCML(cube, _RESULTDIR_PREFIX + ("earth_shape_5.cml",)) + + def test_shape_of_earth_pre_6(self): + # pre-defined sphere + cube = self._old_compat_load("6.grib2") + self.assertCML(cube, _RESULTDIR_PREFIX + ("earth_shape_6.cml",)) + + def test_shape_of_earth_custom_7(self): + # custom oblate spheroid (m) + cube = self._old_compat_load("7.grib2") + self.assertCML(cube, _RESULTDIR_PREFIX + ("earth_shape_7.cml",)) + + def test_shape_of_earth_grib1(self): + # grib1 - same as grib2 shape 6, above + cube = self._old_compat_load("global.grib1") + self.assertCML(cube, _RESULTDIR_PREFIX + ("earth_shape_grib1.cml",)) + + +if __name__ == "__main__": + tests.main() diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/3_layer.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/3_layer.cml new file mode 100644 index 00000000..76cc41a0 --- /dev/null +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/3_layer.cml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_0.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_0.cml new file mode 100644 index 00000000..bb51db32 --- /dev/null +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_0.cml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_1.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_1.cml new file mode 100644 index 00000000..774e9921 --- /dev/null +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_1.cml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_2.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_2.cml new file mode 100644 index 00000000..3ff9cccc --- /dev/null +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_2.cml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_3.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_3.cml new file mode 100644 index 00000000..47d11467 --- /dev/null +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_3.cml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_4.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_4.cml new file mode 100644 index 00000000..e6aa14e4 --- /dev/null +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_4.cml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_5.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_5.cml new file mode 100644 index 00000000..1257c9c2 --- /dev/null +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_5.cml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_6.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_6.cml new file mode 100644 index 00000000..eb966571 --- /dev/null +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_6.cml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_7.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_7.cml new file mode 100644 index 00000000..d27ce04a --- /dev/null +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_7.cml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_grib1.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_grib1.cml new file mode 100644 index 00000000..7ee99f8d --- /dev/null +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_grib1.cml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/ineg_jneg.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/ineg_jneg.cml new file mode 100644 index 00000000..a7d77410 --- /dev/null +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/ineg_jneg.cml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/ineg_jpos.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/ineg_jpos.cml new file mode 100644 index 00000000..f578fcea --- /dev/null +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/ineg_jpos.cml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/ipos_jneg.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/ipos_jneg.cml new file mode 100644 index 00000000..bb51db32 --- /dev/null +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/ipos_jneg.cml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/ipos_jpos.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/ipos_jpos.cml new file mode 100644 index 00000000..4dc6d7f9 --- /dev/null +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/ipos_jpos.cml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib1.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib1.cml new file mode 100644 index 00000000..74fe0a27 --- /dev/null +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib1.cml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib2.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib2.cml new file mode 100644 index 00000000..dc938f0a --- /dev/null +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib2.cml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/missing_values_grib2.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/missing_values_grib2.cml new file mode 100644 index 00000000..c4c0d819 --- /dev/null +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/missing_values_grib2.cml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/polar_stereo_grib1.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/polar_stereo_grib1.cml new file mode 100644 index 00000000..f8e03e6d --- /dev/null +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/polar_stereo_grib1.cml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_gg_grib2.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_gg_grib2.cml new file mode 100644 index 00000000..fa3ba45e --- /dev/null +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_gg_grib2.cml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_ll_grib1.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_ll_grib1.cml new file mode 100644 index 00000000..b1d68014 --- /dev/null +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_ll_grib1.cml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/regular_gg_grib1.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/regular_gg_grib1.cml new file mode 100644 index 00000000..b1dc1f6c --- /dev/null +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/regular_gg_grib1.cml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/regular_gg_grib2.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/regular_gg_grib2.cml new file mode 100644 index 00000000..14213c16 --- /dev/null +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/regular_gg_grib2.cml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/rotated.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/rotated.cml new file mode 100644 index 00000000..06e2b517 --- /dev/null +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/rotated.cml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_bound_grib1.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_bound_grib1.cml new file mode 100644 index 00000000..89902729 --- /dev/null +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_bound_grib1.cml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_bound_grib2.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_bound_grib2.cml new file mode 100644 index 00000000..bb51db32 --- /dev/null +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_bound_grib2.cml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From b8ec83827e65c3673b1e589ed884712037735503 Mon Sep 17 00:00:00 2001 From: lbdreyer Date: Mon, 24 Feb 2020 17:36:37 +0100 Subject: [PATCH 163/583] Port TestGribMessage from iris (#203) --- iris_grib/tests/__init__.py | 114 ++++++++++++++++++ .../test_grid_definition_section.py | 4 +- .../test_product_definition_section.py | 3 +- .../integration/save_rules/test_grib_save.py | 4 +- 4 files changed, 117 insertions(+), 8 deletions(-) diff --git a/iris_grib/tests/__init__.py b/iris_grib/tests/__init__.py index 897feaf5..2d1c1681 100644 --- a/iris_grib/tests/__init__.py +++ b/iris_grib/tests/__init__.py @@ -17,6 +17,8 @@ import os import os.path +import numpy as np + try: from iris.tests import IrisTest_nometa as IrisTest except ImportError: @@ -24,6 +26,8 @@ from iris.tests import main, skip_data, get_data_path +from iris_grib.message import GribMessage + #: Basepath for iris-grib test results. _RESULT_PATH = os.path.join(os.path.dirname(__file__), 'results') @@ -92,3 +96,113 @@ def get_testdata_path(relative_path): if not isinstance(relative_path, str): relative_path = os.path.join(*relative_path) return os.path.abspath(os.path.join(_TESTDATA_PATH, relative_path)) + + +class TestGribMessage(IrisGribTest): + def assertGribMessageContents(self, filename, contents): + """ + Evaluate whether all messages in a GRIB2 file contain the provided + contents. + + * filename (string) + The path on disk of an existing GRIB file + + * contents + An iterable of GRIB message keys and expected values. + + """ + messages = GribMessage.messages_from_filename(filename) + for message in messages: + for element in contents: + section, key, val = element + self.assertEqual(message.sections[section][key], val) + + def assertGribMessageDifference( + self, filename1, filename2, diffs, skip_keys=(), skip_sections=() + ): + """ + Evaluate that the two messages only differ in the ways specified. + + * filename[0|1] (string) + The path on disk of existing GRIB files + + * diffs + An dictionary of GRIB message keys and expected diff values: + {key: (m1val, m2val),...} . + + * skip_keys + An iterable of key names to ignore during comparison. + + * skip_sections + An iterable of section numbers to ignore during comparison. + + """ + messages1 = list(GribMessage.messages_from_filename(filename1)) + messages2 = list(GribMessage.messages_from_filename(filename2)) + self.assertEqual(len(messages1), len(messages2)) + for m1, m2 in zip(messages1, messages2): + m1_sect = set(m1.sections.keys()) + m2_sect = set(m2.sections.keys()) + + for missing_section in m1_sect ^ m2_sect: + what = ( + "introduced" if missing_section in m1_sect else "removed" + ) + # Assert that an introduced section is in the diffs. + self.assertIn( + missing_section, + skip_sections, + msg="Section {} {}".format(missing_section, what), + ) + + for section in m1_sect & m2_sect: + # For each section, check that the differences are + # known diffs. + m1_keys = set(m1.sections[section]._keys) + m2_keys = set(m2.sections[section]._keys) + + difference = m1_keys ^ m2_keys + unexpected_differences = difference - set(skip_keys) + if unexpected_differences: + self.fail( + "There were keys in section {} which \n" + "weren't in both messages and which weren't " + "skipped.\n{}" + "".format(section, ", ".join(unexpected_differences)) + ) + + keys_to_compare = m1_keys & m2_keys - set(skip_keys) + + for key in keys_to_compare: + m1_value = m1.sections[section][key] + m2_value = m2.sections[section][key] + msg = "{} {} != {}" + if key not in diffs: + # We have a key which we expect to be the same for + # both messages. + if isinstance(m1_value, np.ndarray): + # A large tolerance appears to be required for + # gribapi 1.12, but not for 1.14. + self.assertArrayAlmostEqual( + m1_value, m2_value, decimal=2 + ) + else: + self.assertEqual( + m1_value, + m2_value, + msg=msg.format(key, m1_value, m2_value), + ) + else: + # We have a key which we expect to be different + # for each message. + self.assertEqual( + m1_value, + diffs[key][0], + msg=msg.format(key, m1_value, diffs[key][0]), + ) + + self.assertEqual( + m2_value, + diffs[key][1], + msg=msg.format(key, m2_value, diffs[key][1]), + ) diff --git a/iris_grib/tests/integration/round_trip/test_grid_definition_section.py b/iris_grib/tests/integration/round_trip/test_grid_definition_section.py index a7bcc122..7a3c508c 100644 --- a/iris_grib/tests/integration/round_trip/test_grid_definition_section.py +++ b/iris_grib/tests/integration/round_trip/test_grid_definition_section.py @@ -17,12 +17,10 @@ from iris.fileformats.pp import EARTH_RADIUS as UM_DEFAULT_EARTH_RADIUS from iris.util import is_regular -from iris.tests import TestGribMessage - from iris_grib.grib_phenom_translation import GRIBCode -class TestGDT5(TestGribMessage): +class TestGDT5(tests.TestGribMessage): def test_save_load(self): # Load sample UKV data (variable-resolution rotated grid). path = tests.get_data_path(("PP", "ukV1", "ukVpmslont.pp")) diff --git a/iris_grib/tests/integration/round_trip/test_product_definition_section.py b/iris_grib/tests/integration/round_trip/test_product_definition_section.py index b0fed1cc..72721380 100644 --- a/iris_grib/tests/integration/round_trip/test_product_definition_section.py +++ b/iris_grib/tests/integration/round_trip/test_product_definition_section.py @@ -18,13 +18,12 @@ import iris.coords import iris.coord_systems -from iris.tests import TestGribMessage import iris.tests.stock as stock from iris_grib.grib_phenom_translation import GRIBCode -class TestPDT11(TestGribMessage): +class TestPDT11(tests.TestGribMessage): def test_perturbation(self): path = tests.get_data_path( ("NetCDF", "global", "xyt", "SMALL_hires_wind_u_for_ipcc4.nc") diff --git a/iris_grib/tests/integration/save_rules/test_grib_save.py b/iris_grib/tests/integration/save_rules/test_grib_save.py index 9cbb7177..4cf3665b 100644 --- a/iris_grib/tests/integration/save_rules/test_grib_save.py +++ b/iris_grib/tests/integration/save_rules/test_grib_save.py @@ -26,13 +26,11 @@ import iris.exceptions import iris.util -from iris.tests import TestGribMessage - import gribapi from iris_grib._load_convert import _MDI as MDI -class TestLoadSave(TestGribMessage): +class TestLoadSave(tests.TestGribMessage): def setUp(self): self.skip_keys = [] From 12b989b7960eaaf06fa968ed0bc1c8978fac5119 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Mon, 24 Feb 2020 16:42:34 +0000 Subject: [PATCH 164/583] Release 0x15x1 (#204) * Updated release notes. * Update version string. * Remove redundant test skipper: should have been in #200. --- docs/ref/release_notes.rst | 21 ++++++++++++++++++- iris_grib/__init__.py | 2 +- .../load_convert/test_sample_file_loads.py | 10 --------- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/docs/ref/release_notes.rst b/docs/ref/release_notes.rst index bb5a286b..6e9dd931 100644 --- a/docs/ref/release_notes.rst +++ b/docs/ref/release_notes.rst @@ -1,6 +1,7 @@ Release Notes ============= + What's new in iris-grib v0.15 ----------------------------- @@ -29,7 +30,7 @@ Features iris_grib.grib_phenom_translation.GRIBCode and represents the parameter code. When saving, if a cube has a GRIBCode attribute, this determines the parameter code in the created message(s): This will _override_ any translation from the CF names. - + Bug Fixes ^^^^^^^^^ @@ -42,6 +43,24 @@ Dependencies * Python 2 is no longer supported +:Release: 0.15.1 +:Date: 24 Feb 2020 + +Bug Fixes +^^^^^^^^^ + +* Fixed a bug that was causing all field data to be read from file during the + initial cube loading. This occurred since Dask version 2.0, and caused + slow loading and excessive memory use. This problem was shared with UM file + access in Iris : see + https://scitools.org.uk/iris/docs/v2.4.0/whatsnew/2.4.html#bugs-fixed . + +Dependencies +^^^^^^^^^^^^ + +* Now requires Iris version >= 2.4 + + What's new in iris-grib v0.14 ----------------------------- diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index 9e4a6e6b..1f40af63 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -33,7 +33,7 @@ from .message import GribMessage -__version__ = '0.16.0dev0' +__version__ = '0.15.1' __all__ = ['load_cubes', 'save_grib2', 'load_pairs_from_fields', 'save_pairs_from_cube', 'save_messages'] diff --git a/iris_grib/tests/integration/load_convert/test_sample_file_loads.py b/iris_grib/tests/integration/load_convert/test_sample_file_loads.py index 44142a1a..a947d69e 100644 --- a/iris_grib/tests/integration/load_convert/test_sample_file_loads.py +++ b/iris_grib/tests/integration/load_convert/test_sample_file_loads.py @@ -15,18 +15,8 @@ # before importing anything else. import iris_grib.tests as tests -from unittest import skipIf - import iris -# Skip out tests that fail because the file coding is not yet supported. -# NOTE: now *only* used for the file 'GRIB/y_fastest/y_fast.grib2', as the -# loader does not support X,Y dimensioned data (as opposed to Y,X). -# TODO: fix this, or remove the test. -skip_irisgrib_fails = skipIf( - True, "Current grib2 loader does not support this test(s)." -) - _RESULTDIR_PREFIX = ("integration", "load_convert", "sample_file_loads") From 2193f5263318214cc5ef3eda8316a9d5d259f785 Mon Sep 17 00:00:00 2001 From: lbdreyer Date: Tue, 2 Jun 2020 17:37:50 +0100 Subject: [PATCH 165/583] Latest eccodes + workaround seg fault when saving (#208) --- environment.yml | 2 +- iris_grib/_save_rules.py | 7 ++++++ .../unit/save_rules/test_data_section.py | 23 +++++++++++++++++++ iris_grib/tests/unit/test_save_messages.py | 14 +++-------- 4 files changed, 34 insertions(+), 12 deletions(-) diff --git a/environment.yml b/environment.yml index cf1cb7b9..2c41b6dc 100644 --- a/environment.yml +++ b/environment.yml @@ -2,5 +2,5 @@ channels: - conda-forge dependencies: - iris>=2.4 - - python-eccodes>=0.9.1,<2 + - python-eccodes - pep8 diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index e3c35293..f3eeb940 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -1489,6 +1489,13 @@ def data_section(cube, grib): # Enable missing values in the grib message. gribapi.grib_set(grib, "bitmapPresent", 1) gribapi.grib_set_double(grib, "missingValue", fill_value) + + # A segmentation fault is raised by `gribapi.grib_set_double_array` if it + # tries to cast large data to float64. As a temporary fix we cast the data + # upfront + # TODO: remove the `astype` command once eccodes (gribapi) has been fixed. + if data.dtype != np.float64: + data = data.astype(np.float64) gribapi.grib_set_double_array(grib, "values", data.flatten()) # todo: check packing accuracy? diff --git a/iris_grib/tests/unit/save_rules/test_data_section.py b/iris_grib/tests/unit/save_rules/test_data_section.py index c309ec20..6379c942 100644 --- a/iris_grib/tests/unit/save_rules/test_data_section.py +++ b/iris_grib/tests/unit/save_rules/test_data_section.py @@ -14,6 +14,7 @@ from unittest import mock +import gribapi import iris.cube import numpy as np @@ -151,5 +152,27 @@ def test_scaled_with_nan_fill_value(self): self.assertValues(grib_api, [-1000, 2000, FILL, FILL]) +class TestNonDoubleData(tests.IrisGribTest): + # When saving to GRIB, data that is not float64 is cast to float64. This + # test checks that non-float64 data is saved without raising a segmentation + # fault. + def check(self, dtype): + data = np.random.random(1920 * 2560).astype(dtype) + cube = iris.cube.Cube(data, + standard_name='geopotential_height', units='km') + grib_message = gribapi.grib_new_from_samples("GRIB2") + data_section(cube, grib_message) + gribapi.grib_release(grib_message) + + def test_float32(self): + self.check(dtype=np.float32) + + def test_int32(self): + self.check(dtype=np.int32) + + def test_int64(self): + self.check(dtype=np.int64) + + if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/test_save_messages.py b/iris_grib/tests/unit/test_save_messages.py index f0c6e115..974647f2 100644 --- a/iris_grib/tests/unit/test_save_messages.py +++ b/iris_grib/tests/unit/test_save_messages.py @@ -23,22 +23,14 @@ def setUp(self): def test_save(self): m = mock.mock_open() with mock.patch('builtins.open', m, create=True): - # sending a MagicMock object to gribapi raises an AssertionError - # as the gribapi code does a type check - # this is deemed acceptable within the scope of this unit test - with self.assertRaises((AssertionError, TypeError)): - iris_grib.save_messages([self.grib_message], 'foo.grib2') + iris_grib.save_messages([self.grib_message], 'foo.grib2') self.assertTrue(mock.call('foo.grib2', 'wb') in m.mock_calls) def test_save_append(self): m = mock.mock_open() with mock.patch('builtins.open', m, create=True): - # sending a MagicMock object to gribapi raises an AssertionError - # as the gribapi code does a type check - # this is deemed acceptable within the scope of this unit test - with self.assertRaises((AssertionError, TypeError)): - iris_grib.save_messages([self.grib_message], 'foo.grib2', - append=True) + iris_grib.save_messages([self.grib_message], 'foo.grib2', + append=True) self.assertTrue(mock.call('foo.grib2', 'ab') in m.mock_calls) From 2e99443289d4e3ba2fa58cb52d60c0de1cda94e1 Mon Sep 17 00:00:00 2001 From: Thomas Powell Date: Mon, 15 Jun 2020 15:30:44 +0100 Subject: [PATCH 166/583] Add support for Lambert Azimuthal Equal Area Projection (#187) --- iris_grib/_load_convert.py | 55 ++++++++++- iris_grib/message.py | 5 +- .../test_grid_definition_template_140.py | 92 +++++++++++++++++++ .../tests/unit/message/test_GribMessage.py | 11 +++ 4 files changed, 157 insertions(+), 6 deletions(-) create mode 100644 iris_grib/tests/unit/load_convert/test_grid_definition_template_140.py diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index b99546a0..4b3a4bba 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -528,7 +528,7 @@ def grid_definition_template_0_and_1(section, metadata, y_name, x_name, cs): scan = scanning_mode(section['scanningMode']) - # Set resoultion flags + # Set resolution flags res_flags = resolution_flags(section['resolutionAndComponentFlags']) # Calculate longitude points. @@ -928,10 +928,16 @@ def _calculate_proj_coords_from_grid_lengths(section, cs): mm_to_m = 1e-3 if section['gridDefinitionTemplateNumber'] in _XYGRIDLENGTH_GDT_NUMBERS: - dx = section['Dx'] - dy = section['Dy'] - nx = section['Nx'] - ny = section['Ny'] + if section['gridDefinitionTemplateNumber'] == 140: + dx = section['xDirectionGridLengthInMillimetres'] + dy = section['yDirectionGridLengthInMillimetres'] + nx = section['numberOfPointsAlongXAxis'] + ny = section['numberOfPointsAlongYAxis'] + else: + dx = section['Dx'] + dy = section['Dy'] + nx = section['Nx'] + ny = section['Ny'] elif section['gridDefinitionTemplateNumber'] in _IJGRIDLENGTH_GDT_NUMBERS: dx = section['Di'] dy = section['Dj'] @@ -1259,6 +1265,42 @@ def grid_definition_template_90(section, metadata): metadata['dim_coords_and_dims'].append((x_coord, x_dim)) +def grid_definition_template_140(section, metadata): + """ + Translate template representing Lambert Azimuthal Equal Area. + + Updates the metadata in-place with the translations. + + Args: + + * section: + Dictionary of coded key/value pairs from section 3 of the message. + + * metadata: + :class:`collections.OrderedDict` of metadata. + """ + # Define the coordinate system + major, minor, radius = ellipsoid_geometry(section) + cs = icoord_systems.LambertAzimuthalEqualArea( + section['standardParallelInMicrodegrees'] * _GRID_ACCURACY_IN_DEGREES, + section['centralLongitudeInMicrodegrees'] * _GRID_ACCURACY_IN_DEGREES, + 0, + 0, + ellipsoid(section['shapeOfTheEarth'], major, minor, radius)) + + x_coord, y_coord, scan = \ + _calculate_proj_coords_from_grid_lengths(section, cs) + + # Determine the order of the dimensions. + y_dim, x_dim = 0, 1 + if scan.j_consecutive: + y_dim, x_dim = 1, 0 + + # Add the projection coordinates to the metadata dim coords. + metadata['dim_coords_and_dims'].append((y_coord, y_dim)) + metadata['dim_coords_and_dims'].append((x_coord, x_dim)) + + def grid_definition_section(section, metadata): """ Translate section 3 from the GRIB2 message. @@ -1313,6 +1355,9 @@ def grid_definition_section(section, metadata): elif template == 90: # Process space view. grid_definition_template_90(section, metadata) + elif template == 140: + # Process Lambert Azimuthal Equal Area. + grid_definition_template_140(section, metadata) else: msg = 'Grid definition template [{}] is not supported'.format(template) raise TranslationError(msg) diff --git a/iris_grib/message.py b/iris_grib/message.py index 06642f24..503d4cd6 100644 --- a/iris_grib/message.py +++ b/iris_grib/message.py @@ -19,7 +19,7 @@ from iris._lazy_data import as_lazy_data from iris.exceptions import TranslationError -_SUPPORTED_GRID_DEFINITIONS = (0, 1, 5, 10, 12, 20, 30, 40, 90) +_SUPPORTED_GRID_DEFINITIONS = (0, 1, 5, 10, 12, 20, 30, 40, 90, 140) class _OpenFileRef: @@ -144,6 +144,9 @@ def data(self): raise TranslationError(msg) if template in (20, 30, 90): shape = (grid_section['Ny'], grid_section['Nx']) + elif template == 140: + shape = (grid_section['numberOfPointsAlongYAxis'], + grid_section['numberOfPointsAlongXAxis']) elif template == 40 and reduced: shape = (grid_section['numberOfDataPoints'],) else: diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_140.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_140.py new file mode 100644 index 00000000..9abf0c7a --- /dev/null +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_140.py @@ -0,0 +1,92 @@ +# Copyright iris-grib contributors +# +# This file is part of iris-grib 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 +:func:`iris_grib._load_convert.grid_definition_template_140`. +""" + +# import iris_grib.tests first so that some things can be initialised +# before importing anything else. +import iris_grib.tests as tests + +import cartopy.crs as ccrs +import numpy as np + +import iris.coord_systems +import iris.coords + +from iris_grib.tests.unit.load_convert import empty_metadata +from iris_grib._load_convert import _MDI as MDI + +from iris_grib._load_convert import grid_definition_template_140 + + +class Test(tests.IrisGribTest): + + def section_3(self): + section = { + 'gridDefinitionTemplateNumber': 140, + 'shapeOfTheEarth': 4, + 'scaleFactorOfRadiusOfSphericalEarth': MDI, + 'scaledValueOfRadiusOfSphericalEarth': MDI, + 'scaleFactorOfEarthMajorAxis': MDI, + 'scaledValueOfEarthMajorAxis': MDI, + 'scaleFactorOfEarthMinorAxis': MDI, + 'scaledValueOfEarthMinorAxis': MDI, + 'numberOfPointsAlongXAxis': 2, + 'numberOfPointsAlongYAxis': 2, + 'latitudeOfFirstGridPoint': 53988880, + 'longitudeOfFirstGridPoint': -4027984, + 'standardParallelInMicrodegrees': 54900000, + 'centralLongitudeInMicrodegrees': -2500000, + 'resolutionAndComponentFlags': 0b00110000, + 'xDirectionGridLengthInMillimetres': 2000000, + 'yDirectionGridLengthInMillimetres': 2000000, + 'scanningMode': 0b01000000, + } + return section + + def expected(self, y_dim, x_dim): + # Prepare the expectation. + expected = empty_metadata() + ellipsoid = iris.coord_systems.GeogCS( + 6378137, + inverse_flattening=298.257222101) + cs = iris.coord_systems.LambertAzimuthalEqualArea( + latitude_of_projection_origin=54.9, + longitude_of_projection_origin=-2.5, + false_easting=0, + false_northing=0, + ellipsoid=ellipsoid) + lon0 = -4027984 * 1e-6 + lat0 = 53988880 * 1e-6 + x0m, y0m = cs.as_cartopy_crs().transform_point( + lon0, lat0, ccrs.Geodetic()) + dxm = dym = 2000. + x_points = x0m + dxm * np.arange(2) + y_points = y0m + dym * np.arange(2) + x = iris.coords.DimCoord(x_points, + standard_name='projection_x_coordinate', + units='m', + coord_system=cs) + y = iris.coords.DimCoord(y_points, + standard_name='projection_y_coordinate', + units='m', + coord_system=cs) + expected['dim_coords_and_dims'].append((y, y_dim)) + expected['dim_coords_and_dims'].append((x, x_dim)) + return expected + + def test(self): + section = self.section_3() + metadata = empty_metadata() + grid_definition_template_140(section, metadata) + expected = self.expected(0, 1) + self.assertEqual(metadata, expected) + + +if __name__ == '__main__': + tests.main() diff --git a/iris_grib/tests/unit/message/test_GribMessage.py b/iris_grib/tests/unit/message/test_GribMessage.py index bdfea0c4..881c7db4 100644 --- a/iris_grib/tests/unit/message/test_GribMessage.py +++ b/iris_grib/tests/unit/message/test_GribMessage.py @@ -255,6 +255,17 @@ def section_3(self, scanning_mode): return section_3 +class Test_data__grid_template_140(tests.IrisGribTest, + Mixin_data__grid_template): + def section_3(self, scanning_mode): + section_3 = _example_section_3(140, scanning_mode) + section_3['numberOfPointsAlongXAxis'] = section_3['Ni'] + section_3['numberOfPointsAlongYAxis'] = section_3['Nj'] + del section_3['Ni'] + del section_3['Nj'] + return section_3 + + class Test_data__unknown_grid_template(tests.IrisGribTest): def test(self): message = _make_test_message( From 17a51d03ecc0a4ebe2f0b12cdb8b107a58afabfe Mon Sep 17 00:00:00 2001 From: Bill Little Date: Wed, 17 Jun 2020 09:45:02 +0100 Subject: [PATCH 167/583] external grib test data skipper and hook (#212) --- iris_grib/tests/__init__.py | 29 +++++++++++++++++++ .../load_convert/test_load_hybrid_coords.py | 2 ++ .../test_WAFC_mapping_round_trip.py | 1 + .../test_hybrid_coords_round_trip.py | 2 ++ .../save_rules/test_save_hybrid_coords.py | 2 ++ 5 files changed, 36 insertions(+) diff --git a/iris_grib/tests/__init__.py b/iris_grib/tests/__init__.py index 2d1c1681..6653ca5c 100644 --- a/iris_grib/tests/__init__.py +++ b/iris_grib/tests/__init__.py @@ -16,6 +16,7 @@ import inspect import os import os.path +import unittest import numpy as np @@ -35,6 +36,34 @@ #: Basepath for iris-grib loadable test files. _TESTDATA_PATH = os.path.join(os.path.dirname(__file__), 'testdata') +override = os.environ.get("GRIB_TEST_DATA_PATH") +if override: + if os.path.isdir(os.path.expanduser(override)): + _TESTDATA_PATH = os.path.abspath(override) + + +def skip_grib_data(fn): + """ + Decorator to choose whether to run tests, based on the availability of + external data. + + Example usage: + @skip_data + class MyDataTests(tests.IrisGribTest): + ... + + """ + dpath = _TESTDATA_PATH + evar = "GRIB_TEST_NO_DATA" + no_data = not os.path.isdir(dpath) or os.environ.get(evar) + reason = "Test(s) require missing external GRIB test data." + + skip = unittest.skipIf( + condition=no_data, reason=reason + ) + + return skip(fn) + class IrisGribTest(IrisTest): # A specialised version of an IrisTest that implements the correct diff --git a/iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py b/iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py index e254effe..2a7e61ad 100644 --- a/iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py +++ b/iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py @@ -17,6 +17,7 @@ from iris.aux_factory import HybridHeightFactory, HybridPressureFactory +@tests.skip_grib_data class TestHybridHeight(tests.IrisGribTest): def setUp(self): filepath = self.get_testdata_path('faked_sample_hh_grib_data.grib2') @@ -45,6 +46,7 @@ def test_hybrid_height_coords_values(self): atol=0.5) +@tests.skip_grib_data class TestHybridPressure(tests.IrisGribTest): def setUp(self): filepath = self.get_testdata_path('faked_sample_hp_grib_data.grib2') diff --git a/iris_grib/tests/integration/round_trip/test_WAFC_mapping_round_trip.py b/iris_grib/tests/integration/round_trip/test_WAFC_mapping_round_trip.py index 57b01943..82d8e845 100644 --- a/iris_grib/tests/integration/round_trip/test_WAFC_mapping_round_trip.py +++ b/iris_grib/tests/integration/round_trip/test_WAFC_mapping_round_trip.py @@ -17,6 +17,7 @@ from iris.cube import Cube +@tests.skip_grib_data class TestWAFCCodes(tests.IrisGribTest): def setUp(self): self.cat = self.get_testdata_path('CAT_T+24_0600.grib2') diff --git a/iris_grib/tests/integration/round_trip/test_hybrid_coords_round_trip.py b/iris_grib/tests/integration/round_trip/test_hybrid_coords_round_trip.py index d922963b..bf053fe4 100644 --- a/iris_grib/tests/integration/round_trip/test_hybrid_coords_round_trip.py +++ b/iris_grib/tests/integration/round_trip/test_hybrid_coords_round_trip.py @@ -23,6 +23,7 @@ from iris.experimental.equalise_cubes import equalise_attributes +@tests.skip_grib_data class TestHybridHeightRoundTrip(tests.IrisGribTest): def test_hh_round_trip(self): filepath = self.get_testdata_path( @@ -41,6 +42,7 @@ def test_hh_round_trip(self): self.assertTrue(saved_cube == cube) +@tests.skip_grib_data class TestHybridPressureRoundTrip(tests.IrisGribTest): def test_hybrid_pressure(self): filepath = self.get_testdata_path( diff --git a/iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py b/iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py index cd1ab0de..cc3fa0e2 100644 --- a/iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py +++ b/iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py @@ -20,6 +20,7 @@ from iris_grib import save_pairs_from_cube, save_messages, GribMessage +@tests.skip_grib_data class TestSaveHybridHeight(tests.IrisGribTest): def setUp(self): reference_data_filepath = self.get_testdata_path('hybrid_height.nc') @@ -80,6 +81,7 @@ def test_save(self): 255) +@tests.skip_grib_data class TestSaveHybridPressure(tests.IrisGribTest): def setUp(self): reference_data_filepath = self.get_testdata_path( From 7a53e7e4c0076ec5747cdcfe45c6e69c1dc84bbb Mon Sep 17 00:00:00 2001 From: Matt Wander <42675413+m1dr@users.noreply.github.com> Date: Wed, 17 Jun 2020 15:00:07 +0100 Subject: [PATCH 168/583] Add support for missing timeIncrement in template 4.8 (#206) --- iris_grib/_load_convert.py | 4 +++- .../tests/unit/load_convert/test_statistical_cell_method.py | 6 ++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index 4b3a4bba..9f5410ad 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -91,6 +91,8 @@ 12: '12 hours', 13: 'seconds' } +# Regulation 92.1.4 +_TIME_RANGE_MISSING = 2 ** 32 - 1 # Reference Code Table 4.5. _FIXED_SURFACE = { @@ -1969,7 +1971,7 @@ def statistical_cell_method(section): raise TranslationError(msg) interval_number = section['timeIncrement'] - if interval_number == 0: + if interval_number in (0, _TIME_RANGE_MISSING): intervals_string = None else: units_string = _TIME_RANGE_UNITS[ diff --git a/iris_grib/tests/unit/load_convert/test_statistical_cell_method.py b/iris_grib/tests/unit/load_convert/test_statistical_cell_method.py index d4437e82..b2dd61d4 100644 --- a/iris_grib/tests/unit/load_convert/test_statistical_cell_method.py +++ b/iris_grib/tests/unit/load_convert/test_statistical_cell_method.py @@ -45,6 +45,12 @@ def test_intervals(self): self.assertEqual(cell_method, self.expected_cell_method(intervals=('3 hours',))) + def test_increment_missing(self): + self.section['timeIncrement'] = 2 ** 32 - 1 + self.section['indicatorOfUnitForTimeIncrement'] = 255 + cell_method = statistical_cell_method(self.section) + self.assertEqual(cell_method, self.expected_cell_method()) + def test_different_statistic(self): self.section['typeOfStatisticalProcessing'] = 6 cell_method = statistical_cell_method(self.section) From 07a1b229b4e744de843c9a537f30194accdd3918 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Mon, 22 Jun 2020 11:09:40 +0100 Subject: [PATCH 169/583] Correct rounding of vertical coordinates. (#210) --- iris_grib/_save_rules.py | 6 +++--- iris_grib/tests/unit/save_rules/test_set_fixed_surfaces.py | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index f3eeb940..cb331cf2 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -932,7 +932,7 @@ def set_fixed_surfaces(cube, grib, full3d_cube=None): output_v = v_coord.units.convert(v_coord.points[0], output_unit) if output_v - abs(output_v): warnings.warn("Vertical level encoding problem: scaling required.") - output_v = int(output_v) + output_v = int(round(output_v)) gribapi.grib_set(grib, "typeOfFirstFixedSurface", grib_v_code) gribapi.grib_set(grib, "scaleFactorOfFirstFixedSurface", 0) @@ -950,9 +950,9 @@ def set_fixed_surfaces(cube, grib, full3d_cube=None): gribapi.grib_set(grib, "scaleFactorOfFirstFixedSurface", 0) gribapi.grib_set(grib, "scaleFactorOfSecondFixedSurface", 0) gribapi.grib_set(grib, "scaledValueOfFirstFixedSurface", - int(output_v[0])) + int(round(output_v[0]))) gribapi.grib_set(grib, "scaledValueOfSecondFixedSurface", - int(output_v[1])) + int(round(output_v[1]))) if hybrid_factory is not None: # Need to record ALL the level coefficents in a 'PV' vector. diff --git a/iris_grib/tests/unit/save_rules/test_set_fixed_surfaces.py b/iris_grib/tests/unit/save_rules/test_set_fixed_surfaces.py index 3731e8d5..545b19c0 100644 --- a/iris_grib/tests/unit/save_rules/test_set_fixed_surfaces.py +++ b/iris_grib/tests/unit/save_rules/test_set_fixed_surfaces.py @@ -33,10 +33,10 @@ def test_bounded_altitude_feet(self): set_fixed_surfaces(cube, grib) self.assertEqual( gribapi.grib_get_double(grib, "scaledValueOfFirstFixedSurface"), - 304.0) + 305.0) # precise ~304.8 self.assertEqual( gribapi.grib_get_double(grib, "scaledValueOfSecondFixedSurface"), - 609.0) + 610.0) # precise ~609.6 self.assertEqual( gribapi.grib_get_long(grib, "typeOfFirstFixedSurface"), 102) From 4b7797fd3ff5ffc7c98ad82a3d28356639e1cf0b Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Wed, 24 Jun 2020 17:05:53 +0100 Subject: [PATCH 170/583] Tests for saving other-format data into grib : ported from Iris. (#213) * Tests for saving other-format data into grib : ported from Iris. * Add mo-pack as a test dependency. --- environment.yml | 1 + .../integration/format_interop/__init__.py | 12 ++ .../format_interop/test_name_grib.py | 114 ++++++++++++++++++ .../format_interop/test_pp_grib.py | 49 ++++++++ .../NAMEII/0_TRACER_AIR_CONCENTRATION.cml | 37 ++++++ .../name_grib/NAMEII/1_TRACER_DOSAGE.cml | 37 ++++++ .../NAMEII/3_TRACER_DRY_DEPOSITION.cml | 34 ++++++ .../NAMEII/4_TRACER_TOTAL_DEPOSITION.cml | 34 ++++++ .../NAMEIII/0_TRACER_AIR_CONCENTRATION.cml | 34 ++++++ .../NAMEIII/1_TRACER_AIR_CONCENTRATION.cml | 34 ++++++ .../NAMEIII/2_TRACER_DRY_DEPOSITION.cml | 34 ++++++ .../NAMEIII/3_TRACER_WET_DEPOSITION.cml | 34 ++++++ .../name_grib/NAMEIII/4_TRACER_DEPOSITION.cml | 34 ++++++ 13 files changed, 488 insertions(+) create mode 100644 iris_grib/tests/integration/format_interop/__init__.py create mode 100644 iris_grib/tests/integration/format_interop/test_name_grib.py create mode 100644 iris_grib/tests/integration/format_interop/test_pp_grib.py create mode 100644 iris_grib/tests/results/integration/name_grib/NAMEII/0_TRACER_AIR_CONCENTRATION.cml create mode 100644 iris_grib/tests/results/integration/name_grib/NAMEII/1_TRACER_DOSAGE.cml create mode 100644 iris_grib/tests/results/integration/name_grib/NAMEII/3_TRACER_DRY_DEPOSITION.cml create mode 100644 iris_grib/tests/results/integration/name_grib/NAMEII/4_TRACER_TOTAL_DEPOSITION.cml create mode 100644 iris_grib/tests/results/integration/name_grib/NAMEIII/0_TRACER_AIR_CONCENTRATION.cml create mode 100644 iris_grib/tests/results/integration/name_grib/NAMEIII/1_TRACER_AIR_CONCENTRATION.cml create mode 100644 iris_grib/tests/results/integration/name_grib/NAMEIII/2_TRACER_DRY_DEPOSITION.cml create mode 100644 iris_grib/tests/results/integration/name_grib/NAMEIII/3_TRACER_WET_DEPOSITION.cml create mode 100644 iris_grib/tests/results/integration/name_grib/NAMEIII/4_TRACER_DEPOSITION.cml diff --git a/environment.yml b/environment.yml index 2c41b6dc..6fc22df4 100644 --- a/environment.yml +++ b/environment.yml @@ -2,5 +2,6 @@ channels: - conda-forge dependencies: - iris>=2.4 + - mo_pack - python-eccodes - pep8 diff --git a/iris_grib/tests/integration/format_interop/__init__.py b/iris_grib/tests/integration/format_interop/__init__.py new file mode 100644 index 00000000..4596852a --- /dev/null +++ b/iris_grib/tests/integration/format_interop/__init__.py @@ -0,0 +1,12 @@ +# Copyright iris-grib contributors +# +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. +""" +Integration tests for format interoperability. + +Checks that specific features of cubes loaded from other formats are correctly +represented by grib saving. + +""" diff --git a/iris_grib/tests/integration/format_interop/test_name_grib.py b/iris_grib/tests/integration/format_interop/test_name_grib.py new file mode 100644 index 00000000..00ad9d85 --- /dev/null +++ b/iris_grib/tests/integration/format_interop/test_name_grib.py @@ -0,0 +1,114 @@ +# Copyright iris-grib contributors +# +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. +"""Integration tests for NAME to GRIB2 interoperability.""" + +# Import iris_grib.tests first so that some things can be initialised before +# importing anything else. +import iris_grib.tests as tests + +import numpy as np +import warnings + +import iris + + +def name_cb(cube, field, filename): + # NAME files give the time point at the end of the range but Iris' + # GRIB loader creates it in the middle (the GRIB file itself doesn't + # encode a time point). Here we make them consistent so we can + # easily compare them. + t_coord = cube.coord("time") + t_coord.points = t_coord.bounds[0][1] + fp_coord = cube.coord("forecast_period") + fp_coord.points = fp_coord.bounds[0][1] + # NAME contains extra vertical meta-data. + z_coord = cube.coords("height") + if z_coord: + z_coord[0].standard_name = "height" + z_coord[0].long_name = "height above ground level" + + +class TestNameToGRIB(tests.IrisGribTest): + def check_common(self, name_cube, grib_cube): + self.assertTrue(np.allclose(name_cube.data, grib_cube.data)) + self.assertTrue( + np.allclose( + name_cube.coord("latitude").points, + grib_cube.coord("latitude").points, + ) + ) + self.assertTrue( + np.allclose( + name_cube.coord("longitude").points, + grib_cube.coord("longitude").points - 360, + ) + ) + + for c in ["height", "time"]: + if name_cube.coords(c): + self.assertEqual(name_cube.coord(c), grib_cube.coord(c)) + + @tests.skip_data + def test_name2_field(self): + filepath = tests.get_data_path(("NAME", "NAMEII_field.txt")) + name_cubes = iris.load(filepath) + + # There is a known load/save problem with numerous + # gribapi/eccodes versions and + # zero only data, where min == max. + # This may be a problem with data scaling. + for i, name_cube in enumerate(name_cubes): + data = name_cube.data + if np.min(data) == np.max(data): + msg = ( + 'NAMEII cube #{}, "{}" has empty data : ' + "SKIPPING test for this cube, as save/load will " + "not currently work." + ) + warnings.warn(msg.format(i, name_cube.name())) + continue + + with self.temp_filename(".grib2") as temp_filename: + iris.save(name_cube, temp_filename) + grib_cube = iris.load_cube(temp_filename, callback=name_cb) + self.check_common(name_cube, grib_cube) + self.assertCML( + grib_cube, + self.get_result_path( + ( + "integration", + "name_grib", + "NAMEII", + "{}_{}.cml".format(i, name_cube.name()), + ) + ), + ) + + @tests.skip_data + def test_name3_field(self): + filepath = tests.get_data_path(("NAME", "NAMEIII_field.txt")) + name_cubes = iris.load(filepath) + for i, name_cube in enumerate(name_cubes): + with self.temp_filename(".grib2") as temp_filename: + iris.save(name_cube, temp_filename) + grib_cube = iris.load_cube(temp_filename, callback=name_cb) + + self.check_common(name_cube, grib_cube) + self.assertCML( + grib_cube, + self.get_result_path( + ( + "integration", + "name_grib", + "NAMEIII", + "{}_{}.cml".format(i, name_cube.name()), + ) + ), + ) + + +if __name__ == "__main__": + tests.main() diff --git a/iris_grib/tests/integration/format_interop/test_pp_grib.py b/iris_grib/tests/integration/format_interop/test_pp_grib.py new file mode 100644 index 00000000..59b8ce54 --- /dev/null +++ b/iris_grib/tests/integration/format_interop/test_pp_grib.py @@ -0,0 +1,49 @@ +# Copyright iris-grib contributors +# +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. +"""Integration tests for PP/GRIB interoperability.""" + +# Import iris_grib.tests first so that some things can be initialised before +# importing anything else. +import iris_grib.tests as tests + +import iris + + +class TestBoundedTime(tests.IrisTest): + @tests.skip_data + def test_time_and_forecast_period_round_trip(self): + pp_path = tests.get_data_path( + ("PP", "meanMaxMin", "200806081200__qwpb.T24.pp") + ) + # Choose the first time-bounded Cube in the PP dataset. + original = [ + cube + for cube in iris.load(pp_path) + if cube.coord("time").has_bounds() + ][0] + # Save it to GRIB2 and re-load. + with self.temp_filename(".grib2") as grib_path: + iris.save(original, grib_path) + from_grib = iris.load_cube(grib_path) + # Avoid the downcasting warning when saving to PP. + from_grib.data = from_grib.data.astype("f4") + # Re-save to PP and re-load. + with self.temp_filename(".pp") as pp_path: + iris.save(from_grib, pp_path) + from_pp = iris.load_cube(pp_path) + self.assertEqual(original.coord("time"), from_grib.coord("time")) + self.assertEqual( + original.coord("forecast_period"), + from_grib.coord("forecast_period"), + ) + self.assertEqual(original.coord("time"), from_pp.coord("time")) + self.assertEqual( + original.coord("forecast_period"), from_pp.coord("forecast_period") + ) + + +if __name__ == "__main__": + tests.main() diff --git a/iris_grib/tests/results/integration/name_grib/NAMEII/0_TRACER_AIR_CONCENTRATION.cml b/iris_grib/tests/results/integration/name_grib/NAMEII/0_TRACER_AIR_CONCENTRATION.cml new file mode 100644 index 00000000..b0daf509 --- /dev/null +++ b/iris_grib/tests/results/integration/name_grib/NAMEII/0_TRACER_AIR_CONCENTRATION.cml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iris_grib/tests/results/integration/name_grib/NAMEII/1_TRACER_DOSAGE.cml b/iris_grib/tests/results/integration/name_grib/NAMEII/1_TRACER_DOSAGE.cml new file mode 100644 index 00000000..aef4988c --- /dev/null +++ b/iris_grib/tests/results/integration/name_grib/NAMEII/1_TRACER_DOSAGE.cml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iris_grib/tests/results/integration/name_grib/NAMEII/3_TRACER_DRY_DEPOSITION.cml b/iris_grib/tests/results/integration/name_grib/NAMEII/3_TRACER_DRY_DEPOSITION.cml new file mode 100644 index 00000000..5787c196 --- /dev/null +++ b/iris_grib/tests/results/integration/name_grib/NAMEII/3_TRACER_DRY_DEPOSITION.cml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iris_grib/tests/results/integration/name_grib/NAMEII/4_TRACER_TOTAL_DEPOSITION.cml b/iris_grib/tests/results/integration/name_grib/NAMEII/4_TRACER_TOTAL_DEPOSITION.cml new file mode 100644 index 00000000..5787c196 --- /dev/null +++ b/iris_grib/tests/results/integration/name_grib/NAMEII/4_TRACER_TOTAL_DEPOSITION.cml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iris_grib/tests/results/integration/name_grib/NAMEIII/0_TRACER_AIR_CONCENTRATION.cml b/iris_grib/tests/results/integration/name_grib/NAMEIII/0_TRACER_AIR_CONCENTRATION.cml new file mode 100644 index 00000000..1a31427d --- /dev/null +++ b/iris_grib/tests/results/integration/name_grib/NAMEIII/0_TRACER_AIR_CONCENTRATION.cml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iris_grib/tests/results/integration/name_grib/NAMEIII/1_TRACER_AIR_CONCENTRATION.cml b/iris_grib/tests/results/integration/name_grib/NAMEIII/1_TRACER_AIR_CONCENTRATION.cml new file mode 100644 index 00000000..7007836e --- /dev/null +++ b/iris_grib/tests/results/integration/name_grib/NAMEIII/1_TRACER_AIR_CONCENTRATION.cml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iris_grib/tests/results/integration/name_grib/NAMEIII/2_TRACER_DRY_DEPOSITION.cml b/iris_grib/tests/results/integration/name_grib/NAMEIII/2_TRACER_DRY_DEPOSITION.cml new file mode 100644 index 00000000..850ef89e --- /dev/null +++ b/iris_grib/tests/results/integration/name_grib/NAMEIII/2_TRACER_DRY_DEPOSITION.cml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iris_grib/tests/results/integration/name_grib/NAMEIII/3_TRACER_WET_DEPOSITION.cml b/iris_grib/tests/results/integration/name_grib/NAMEIII/3_TRACER_WET_DEPOSITION.cml new file mode 100644 index 00000000..ade4cea9 --- /dev/null +++ b/iris_grib/tests/results/integration/name_grib/NAMEIII/3_TRACER_WET_DEPOSITION.cml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iris_grib/tests/results/integration/name_grib/NAMEIII/4_TRACER_DEPOSITION.cml b/iris_grib/tests/results/integration/name_grib/NAMEIII/4_TRACER_DEPOSITION.cml new file mode 100644 index 00000000..088b622c --- /dev/null +++ b/iris_grib/tests/results/integration/name_grib/NAMEIII/4_TRACER_DEPOSITION.cml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From dc3cdcacafb0437776fe1baaad87477724ab0ad7 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Wed, 30 Sep 2020 16:28:47 +0100 Subject: [PATCH 171/583] Changes to gdt90 load. (#223) * Changes to gdt90 load. * Resolve uncertainty over false_easting/northing values. * Correct tests for new behaviours. --- iris_grib/_load_convert.py | 29 ++++++++------- .../TestImport/gdt90_with_bitmap.cml | 15 ++++---- .../test_grid_definition_template_90.py | 37 +++++++++++++++---- 3 files changed, 53 insertions(+), 28 deletions(-) diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index 9f5410ad..8cc62a25 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -1198,10 +1198,6 @@ def grid_definition_template_90(section, metadata): geog_cs = ellipsoid(section['shapeOfTheEarth'], major, minor, radius) height_above_centre = geog_cs.semi_major_axis * section['Nr'] / 1e6 height_above_ellipsoid = height_above_centre - geog_cs.semi_major_axis - cs = icoord_systems.VerticalPerspective(sub_satellite_lat, - sub_satellite_lon, - height_above_ellipsoid, - ellipsoid=geog_cs) # Figure out how large the Earth would appear in projection coodinates. # For both the apparent equatorial and polar diameters this is a @@ -1225,17 +1221,14 @@ def grid_definition_template_90(section, metadata): # This can be simplified using: cos(psi) = a / height_above_centre half_apparent_equatorial_angle = math.asin(geog_cs.semi_major_axis / height_above_centre) - x_apparent_diameter = (2 * half_apparent_equatorial_angle * - height_above_ellipsoid) parametric_angle = math.acos(geog_cs.semi_major_axis / height_above_centre) half_apparent_polar_angle = math.atan(geog_cs.semi_minor_axis / (height_above_centre * math.sin(parametric_angle))) - y_apparent_diameter = (2 * half_apparent_polar_angle * - height_above_ellipsoid) - - y_step = y_apparent_diameter / section['dy'] - x_step = x_apparent_diameter / section['dx'] + y_apparent_angular_diameter = 2 * half_apparent_polar_angle + x_apparent_angular_diameter = 2 * half_apparent_equatorial_angle + y_step = y_apparent_angular_diameter / section['dy'] + x_step = x_apparent_angular_diameter / section['dx'] y_start = y_step * (section['Yo'] - section['Yp'] / 1000) x_start = x_step * (section['Xo'] - section['Xp'] / 1000) y_points = y_start + np.arange(section['Ny']) * y_step @@ -1251,10 +1244,20 @@ def grid_definition_template_90(section, metadata): if not scan.j_positive: raise TranslationError('Unsupported -y scanning') + # Make a coordinate system for the X and Y coordinates. + # Note: false_easting/northing are always just zero, as the calculation of + # x_points/y_points takes both Xp/Yp and Xo/Yo into account. + cs = icoord_systems.Geostationary( + latitude_of_projection_origin=sub_satellite_lat, + longitude_of_projection_origin=sub_satellite_lon, + perspective_point_height=height_above_ellipsoid, + sweep_angle_axis='y', + ellipsoid=geog_cs) + # Create the X and Y coordinates. - y_coord = DimCoord(y_points, 'projection_y_coordinate', units='m', + y_coord = DimCoord(y_points, 'projection_y_coordinate', units='radians', coord_system=cs) - x_coord = DimCoord(x_points, 'projection_x_coordinate', units='m', + x_coord = DimCoord(x_points, 'projection_x_coordinate', units='radians', coord_system=cs) # Determine the lat/lon dimensions. diff --git a/iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt90_with_bitmap.cml b/iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt90_with_bitmap.cml index 3118f868..ebd77222 100644 --- a/iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt90_with_bitmap.cml +++ b/iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt90_with_bitmap.cml @@ -9,16 +9,17 @@ - - + + - - + + diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_90.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_90.py index 8e9047da..5d1e2f50 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_90.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_90.py @@ -60,19 +60,25 @@ def expected_uk(self, y_dim, x_dim): height = (6610674e-6 - 1) * major lat = lon = 0 easting = northing = 0 - cs = iris.coord_systems.VerticalPerspective(lat, lon, height, easting, - northing, ellipsoid) + cs = iris.coord_systems.Geostationary( + latitude_of_projection_origin=lat, + longitude_of_projection_origin=lon, + perspective_point_height=height, + sweep_angle_axis='y', + false_easting=easting, + false_northing=northing, + ellipsoid=ellipsoid) nx = 390 - x_origin = 369081.56145444815 - dx = -3000.663101255676 + x_origin = 0.010313624253429191 + dx = -8.38506036864162e-05 x = iris.coords.DimCoord(np.arange(nx) * dx + x_origin, - 'projection_x_coordinate', units='m', + 'projection_x_coordinate', units='radians', coord_system=cs) ny = 227 - y_origin = 4392884.59201891 - dy = 3000.604229521113 + y_origin = 0.12275487535118533 + dy = 8.384895857321404e-05 y = iris.coords.DimCoord(np.arange(ny) * dy + y_origin, - 'projection_y_coordinate', units='m', + 'projection_y_coordinate', units='radians', coord_system=cs) expected['dim_coords_and_dims'].append((y, y_dim)) expected['dim_coords_and_dims'].append((x, x_dim)) @@ -86,6 +92,9 @@ def compare(self, metadata, expected): expected['dim_coords_and_dims']): result_coord, result_dims = result_pair expected_coord, expected_dims = expected_pair + # Take copies for safety, as we are going to modify them. + result_coord, expected_coord = [co.copy() for co in + (result_coord, expected_coord)] # Ensure the dims match. self.assertEqual(result_dims, expected_dims) # Ensure the coordinate systems match (allowing for precision). @@ -110,6 +119,18 @@ def compare(self, metadata, expected): # rest of the coordinate attributes. result_coord.coord_system = None expected_coord.coord_system = None + + # Likewise, first compare the points (and optional bounds) + # *approximately*, then force those equal + compare other aspects. + self.assertArrayAlmostEqual(result_coord.points, + expected_coord.points) + result_coord.points = expected_coord.points + if result_coord.has_bounds() and expected_coord.has_bounds(): + self.assertArrayAlmostEqual(result_coord.bounds, + expected_coord.bounds) + result_coord.bounds = expected_coord.bounds + + # Compare the coords, having equalised the array values. self.assertEqual(result_coord, expected_coord) # Ensure no other metadata was created. From 6e2e65d50991d3e0af52bb1b32376b23136a7d41 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Mon, 5 Oct 2020 12:09:27 +0100 Subject: [PATCH 172/583] Whatsnew v0.16 (#225) * Whatsnew draft for v0.16 release. * Review changes. * Merge old 0.15.1 whatsnew into new one; remove unmatched bracket. --- docs/ref/release_notes.rst | 131 ++++++++++++++++++++++++++++++++----- 1 file changed, 113 insertions(+), 18 deletions(-) diff --git a/docs/ref/release_notes.rst b/docs/ref/release_notes.rst index 6e9dd931..87feaaef 100644 --- a/docs/ref/release_notes.rst +++ b/docs/ref/release_notes.rst @@ -1,6 +1,119 @@ Release Notes ============= +======= +What's new in iris-grib v0.16 +----------------------------- + +:Release: 0.16.0 +:Date: ?? Sep 2020 + +Features +^^^^^^^^ + +* `@tpowellmeto `_ added support for loading + data on a "Lambert Azimuthal Equal Area Projection", + i.e. grid definition template 3.140. + `(PR#187) `_ + +* `@bjlittle `_ made all the tests runnable for a + packaged install of iris-grib, where the grib testdata files will be missing. + `(PR#212) `_ + +* `@m1dr `_ added support for loading statistical + fields, as encoded in production definition template 3.8, even when the + "interval time increment" value is not specified (i.e. set to "missing"). + `(PR#206) `_ + +* `@pp-mo `_ ported some tests from Iris, which test + grib saving of data loaded from other formats. + `(PR#213) `_ + +* All grib-dependent testing is now contained in iris-grib : **There are no + remaining tests in Iris which use grib.** + + +Bugs Fixed +^^^^^^^^^^ + +* `@lbdreyer `_ unpinned the python-eccodes + version for Travis testing, and added a workaround for a known bug in recent + versions of python-eccodes. + Previously, we could only test against python-eccodes versions ">=0.9.1,<2". + `(PR#208) `_ + +* `@pp-mo `_ fixed save operations to round off the + the integer values of vertical surfaces, instead of truncating them. + `(PR#210) `_ + +* `@pp-mo `_ fixed loading of grid definition + template 3.90, "Space view perspective or orthographic grid", which was + **broken since Iris 2.3**. This now produces data with an iris + `Geostationary `_ + coordinate system. Prior to Iris 2.3, what is now the Iris 'Geostationary' + class was (incorrectly) named "VerticalPerspective" : When that was + `corrected in Iris 2.3 `_ , it + broke the iris-grib loading, since the data was now incorrectly + assigned the "new-style" Iris + `VerticalPerspective `_ + coordinate system, equivalent to the Cartopy + `NearsidePerspective `_ + and Proj + `"nsper" `_ . + The plotting behaviour of this is now **the same again as before Iris 2.3** : + only the Iris coordinate system has changed. + `(PR#223) `_ + + +What's new in iris-grib v0.15.1 +------------------------------- + +:Release: 0.15.1 +:Date: 24 Feb 2020 + +Bugs Fixed +^^^^^^^^^^ + +* `@pp-mo `_ fixed a problem that caused very slow + loading, and possible memory overflows, with Dask versions >= 2.0. + **This requires Iris >= 2.4**, as a new minimum dependency. + ( This problem was shared with UM file access in Iris : see + https://scitools.org.uk/iris/docs/v2.4.0/whatsnew/2.4.html#bugs-fixed ). + `(PR#190) `_ + +* `@trexfeathers `_ fixed all the tests to + work with the latest Iris version, previously broken since Iris >= 2.3. + `(PR#184) `_ + and `(PR#185) `_ + +* `@lbdreyer `_ fixed a problem with the metadata + in setup.py. + `(PR#183) `_ + + +Internal +^^^^^^^^ + +* `@lbdreyer `_ and + `@pp-mo `_ ported various grib-specific tests from + Iris. + ( `PR#191 `_ , + `PR#192 `_ , + `PR#194 `_ , + `PR#195 `_ , + `PR#198 `_ , + `PR#199 `_ , + `PR#200 `_ , + `PR#201 `_ and + `PR#203 `_ ) + +Dependencies +^^^^^^^^^^^^ + +* now requires Iris version >= 2.4 + Needed for the bugfix in + `PR#190 `_ . + What's new in iris-grib v0.15 ----------------------------- @@ -43,24 +156,6 @@ Dependencies * Python 2 is no longer supported -:Release: 0.15.1 -:Date: 24 Feb 2020 - -Bug Fixes -^^^^^^^^^ - -* Fixed a bug that was causing all field data to be read from file during the - initial cube loading. This occurred since Dask version 2.0, and caused - slow loading and excessive memory use. This problem was shared with UM file - access in Iris : see - https://scitools.org.uk/iris/docs/v2.4.0/whatsnew/2.4.html#bugs-fixed . - -Dependencies -^^^^^^^^^^^^ - -* Now requires Iris version >= 2.4 - - What's new in iris-grib v0.14 ----------------------------- From 329075f21beda088bb1c238bd97d3784b7223d86 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Mon, 5 Oct 2020 15:44:03 +0100 Subject: [PATCH 173/583] Update version in index; new module docs content. (#230) --- docs/index.rst | 2 +- docs/ref/grib_phenom_translation/grib_phenom_translation.rst | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/index.rst b/docs/index.rst index 2147ee17..4fec281c 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -3,7 +3,7 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -Iris-grib v0.14 +Iris-grib v0.16 =============== The library ``iris-grib`` provides functionality for converting between weather and diff --git a/docs/ref/grib_phenom_translation/grib_phenom_translation.rst b/docs/ref/grib_phenom_translation/grib_phenom_translation.rst index 19dde447..d1f34c5a 100644 --- a/docs/ref/grib_phenom_translation/grib_phenom_translation.rst +++ b/docs/ref/grib_phenom_translation/grib_phenom_translation.rst @@ -6,6 +6,7 @@ In this module: * :py:obj:`grib1_phenom_to_cf_info` * :py:obj:`grib2_phenom_to_cf_info` * :py:obj:`cf_phenom_to_grib2_info` + * :py:obj:`GRIBCode` .. currentmodule:: iris_grib.grib_phenom_translation @@ -18,3 +19,5 @@ In this module: .. autofunction:: iris_grib.grib_phenom_translation.cf_phenom_to_grib2_info +.. autoclass:: iris_grib.grib_phenom_translation.GRIBCode + :members: From ad6c676eba036fb07cdaa20960450dc6e13407ed Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Mon, 5 Oct 2020 16:33:45 +0100 Subject: [PATCH 174/583] Adopt newstyle dependencies; fix travis to suit. (#229) Co-authored-by: Martin Yeo --- .travis.yml | 82 +++++++++++++++++++-------------- environment.yml | 7 --- readthedocs.yml | 2 +- requirements/all.txt | 3 ++ requirements/ci/iris-grib.yml | 1 + requirements/ci/py36.yml | 22 +++++++++ requirements/ci/py37.yml | 22 +++++++++ requirements/ci/readthedocs.yml | 1 + requirements/core.txt | 4 ++ requirements/setup.txt | 4 ++ requirements/test.txt | 5 ++ setup.py | 78 ++++++++++++++++++------------- 12 files changed, 158 insertions(+), 73 deletions(-) delete mode 100644 environment.yml create mode 100644 requirements/all.txt create mode 120000 requirements/ci/iris-grib.yml create mode 100644 requirements/ci/py36.yml create mode 100644 requirements/ci/py37.yml create mode 120000 requirements/ci/readthedocs.yml create mode 100644 requirements/core.txt create mode 100644 requirements/setup.txt create mode 100644 requirements/test.txt diff --git a/.travis.yml b/.travis.yml index dffed78d..c5625e9e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,68 +3,82 @@ dist: xenial env: matrix: - - PYTHON_VERSION=3.6 - - PYTHON_VERSION=3.7 + - PYTHON_VERSION=36 + - PYTHON_VERSION=37 install: + # Download iris-test-data + # ----------------------------------- + - > + export IRIS_TEST_DATA_REF="https://github.com/SciTools/iris-test-data/archive/master.zip"; + export IRIS_TEST_DATA_DOWNLOAD="${HOME}/iris-test-data"; + mkdir ${IRIS_TEST_DATA_DOWNLOAD}; + wget -O ${IRIS_TEST_DATA_DOWNLOAD}/iris-test-data.zip ${IRIS_TEST_DATA_REF}; + unzip -q ${IRIS_TEST_DATA_DOWNLOAD}/iris-test-data.zip -d ${IRIS_TEST_DATA_DOWNLOAD}; + export IRIS_TEST_DATA_PATH=${IRIS_TEST_DATA_DOWNLOAD}/iris-test-data-master/test_data + # Install miniconda # ----------------- - > echo "Installing miniconda"; export CONDA_BASE="https://repo.continuum.io/miniconda/Miniconda"; - if [[ "${PYTHON_VERSION}" == 2* ]]; then - wget --quiet ${CONDA_BASE}2-latest-Linux-x86_64.sh -O miniconda.sh; - else - wget --quiet ${CONDA_BASE}3-latest-Linux-x86_64.sh -O miniconda.sh; - fi; + wget --quiet ${CONDA_BASE}3-latest-Linux-x86_64.sh -O miniconda.sh; bash miniconda.sh -b -p ${HOME}/miniconda; export PATH="${HOME}/miniconda/bin:${PATH}"; - # Configure the test environment - # ------------------------------ + # Create the test environment + # --------------------------- - > - echo "Configuring testing environment"; + echo "Creating testing environment"; conda config --set always_yes yes --set changeps1 no; conda config --set show_channel_urls True; conda config --add channels conda-forge; conda update --quiet conda; - ENV_NAME='test-environment'; - conda create --quiet -n ${ENV_NAME} python=${PYTHON_VERSION} mock filelock pep8; - source activate ${ENV_NAME}; - # Customise the test environment - # ------------------------------ + # Get environment spec. - > - conda env update -n ${ENV_NAME} --quiet --file environment.yml; - # Check installation of eccodes. - python -m eccodes selfcheck; + export ENV_NAME="iris-grib-dev"; + export ENV_FILE="${TRAVIS_BUILD_DIR}/requirements/ci/py${PYTHON_VERSION}.yml"; - # Download and install iris-test-data - # ----------------------------------- + # Create environment. - > - export IRIS_TEST_DATA_REF="https://github.com/SciTools/iris-test-data/archive/master.zip"; - export IRIS_TEST_DATA_LOCATION="${HOME}/iris-test-data"; - mkdir ${IRIS_TEST_DATA_LOCATION}; - wget -O ${IRIS_TEST_DATA_LOCATION}/iris-test-data.zip ${IRIS_TEST_DATA_REF}; - unzip -q ${IRIS_TEST_DATA_LOCATION}/iris-test-data.zip -d ${IRIS_TEST_DATA_LOCATION}; + conda env create --quiet --file=${ENV_FILE}; + source activate ${ENV_NAME}; - # Locate iris installation - # ------------------------ + # Check installation of eccodes. + - python -m eccodes selfcheck; + + # Install pip, then coveralls. + - conda install --quiet pip; + - pip install coveralls; + + # Output environment debug info. + - > + conda list -n ${ENV_NAME}; + conda info -a; + + # Configure Iris + # -------------- + - echo "Configuring Iris"; + + # Locate Iris installation. - export IRIS_DIR=$(python -c "import iris; import os.path; print(os.path.dirname(iris.__file__))") - # Poke site.cfg to reference iris-test-data + # Set iris config paths. - > + export PREFIX="${HOME}/miniconda/envs/${ENV_NAME}"; SITE_CFG="${IRIS_DIR}/etc/site.cfg"; echo "[Resources]" > ${SITE_CFG}; - echo "test_data_dir = ${IRIS_TEST_DATA_LOCATION}/iris-test-data-master/test_data" >> ${SITE_CFG}; + echo "test_data_dir = ${IRIS_TEST_DATA_PATH}" >> ${SITE_CFG}; + echo "[System]" >> ${SITE_CFG}; + echo "udunits2_path = ${PREFIX}/lib/libudunits2.so" >> ${SITE_CFG}; # Install iris-grib itself # ------------------------ - - pip install . --no-deps - - # Install coveralls for test coverage - # ----------------------------------- - - pip install coveralls + - > + echo "Installing Iris-grib."; + cd ${TRAVIS_BUILD_DIR}; + pip install . --no-deps; # Summarise the environment # ------------------------- diff --git a/environment.yml b/environment.yml deleted file mode 100644 index 6fc22df4..00000000 --- a/environment.yml +++ /dev/null @@ -1,7 +0,0 @@ -channels: - - conda-forge -dependencies: - - iris>=2.4 - - mo_pack - - python-eccodes - - pep8 diff --git a/readthedocs.yml b/readthedocs.yml index 5d3b36c7..4653044c 100644 --- a/readthedocs.yml +++ b/readthedocs.yml @@ -1,2 +1,2 @@ conda: - file: environment.yml + file: requirements/ci/readthedocs.yml diff --git a/requirements/all.txt b/requirements/all.txt new file mode 100644 index 00000000..e776a67c --- /dev/null +++ b/requirements/all.txt @@ -0,0 +1,3 @@ +# Optional dependencies. + +mo_pack diff --git a/requirements/ci/iris-grib.yml b/requirements/ci/iris-grib.yml new file mode 120000 index 00000000..e9adb956 --- /dev/null +++ b/requirements/ci/iris-grib.yml @@ -0,0 +1 @@ +py37.yml \ No newline at end of file diff --git a/requirements/ci/py36.yml b/requirements/ci/py36.yml new file mode 100644 index 00000000..85bfcd5c --- /dev/null +++ b/requirements/ci/py36.yml @@ -0,0 +1,22 @@ +name: iris-grib-dev + +channels: + - conda-forge + +dependencies: + - python=3.6 + +# Setup dependencies. + - setuptools + +# Core dependencies. + - iris>=2.4 + - python-eccodes + +# Optional dependencies. + - mo_pack + +# Test dependencies. + - mock + - filelock + - pep8 diff --git a/requirements/ci/py37.yml b/requirements/ci/py37.yml new file mode 100644 index 00000000..65f0f0b5 --- /dev/null +++ b/requirements/ci/py37.yml @@ -0,0 +1,22 @@ +name: iris-grib-dev + +channels: + - conda-forge + +dependencies: + - python=3.7 + +# Setup dependencies. + - setuptools + +# Core dependencies. + - iris>=2.4 + - python-eccodes + +# Optional dependencies. + - mo_pack + +# Test dependencies. + - mock + - filelock + - pep8 diff --git a/requirements/ci/readthedocs.yml b/requirements/ci/readthedocs.yml new file mode 120000 index 00000000..2239061d --- /dev/null +++ b/requirements/ci/readthedocs.yml @@ -0,0 +1 @@ +iris-grib.yml \ No newline at end of file diff --git a/requirements/core.txt b/requirements/core.txt new file mode 100644 index 00000000..f88d210d --- /dev/null +++ b/requirements/core.txt @@ -0,0 +1,4 @@ +# Core dependencies. + +scitools-iris>=2.4 +eccodes-python diff --git a/requirements/setup.txt b/requirements/setup.txt new file mode 100644 index 00000000..fb07d5ac --- /dev/null +++ b/requirements/setup.txt @@ -0,0 +1,4 @@ +# Dependencies necessary to run setup.py of iris-grib +# --------------------------------------------------- + +setuptools diff --git a/requirements/test.txt b/requirements/test.txt new file mode 100644 index 00000000..da738e0b --- /dev/null +++ b/requirements/test.txt @@ -0,0 +1,5 @@ +# Test dependencies. + +mock +filelock +pep8 diff --git a/setup.py b/setup.py index 5db3255b..272e946e 100644 --- a/setup.py +++ b/setup.py @@ -2,48 +2,59 @@ import os import os.path -import sys from setuptools import setup -import textwrap -name = 'iris_grib' - - -LONG_DESCRIPTION = textwrap.dedent(""" - Iris loading of GRIB files - ========================== - - With this package, iris is able to load GRIB files: - - ``` - my_data = iris.load(path_to_grib_file) - ``` - """) - - -here = os.path.abspath(os.path.dirname(__file__)) -pkg_root = os.path.join(here, name) +NAME = 'iris_grib' +PYPI_NAME = 'iris-grib' +PACKAGE_DIR = os.path.abspath(os.path.dirname(__file__)) +PACKAGE_ROOT = os.path.join(PACKAGE_DIR, NAME) packages = [] -for d, _, _ in os.walk(os.path.join(here, name)): +for d, _, _ in os.walk(os.path.join(PACKAGE_DIR, NAME)): if os.path.exists(os.path.join(d, '__init__.py')): - packages.append(d[len(here)+1:].replace(os.path.sep, '.')) + packages.append(d[len(PACKAGE_DIR) + 1:].replace(os.path.sep, '.')) + + +def pip_requirements(*args): + requirements = [] + for name in args: + fname = os.path.join( + PACKAGE_DIR, "requirements", "{}.txt".format(name) + ) + if not os.path.exists(fname): + emsg = ( + f"Unable to find the {name!r} requirements file at {fname!r}" + ) + raise RuntimeError(emsg) + with open(fname, "r") as fh: + for line in fh: + line = line.strip() + if not line or line.startswith("#"): + continue + requirements.append(line) + return requirements def extract_version(): version = None - fdir = os.path.dirname(__file__) - fnme = os.path.join(fdir, 'iris_grib', '__init__.py') - with open(fnme) as fd: - for line in fd: + fname = os.path.join(PACKAGE_DIR, 'iris_grib', '__init__.py') + with open(fname) as fi: + for line in fi: if (line.startswith('__version__')): _, version = line.split('=') - version = version.strip()[1:-1] # Remove quotation characters + version = version.strip()[1:-1] # Remove quotations break return version +def long_description(): + fname = os.path.join(PACKAGE_DIR, "README.rst") + with open(fname, "rb") as fi: + result = fi.read().decode("utf-8") + return result + + def file_walk_relative(top, remove=''): """ Returns a generator of files from the top of the tree, removing @@ -58,13 +69,14 @@ def file_walk_relative(top, remove=''): setup_args = dict( - name = name, + name = PYPI_NAME, version = extract_version(), packages = packages, package_data = {'iris_grib': list(file_walk_relative('iris_grib/tests/results', remove='iris_grib/'))}, description = "GRIB loading for Iris", - long_description = LONG_DESCRIPTION, + long_description = long_description(), + long_description_content_type = "text/x-rst", url = 'https://github.com/SciTools/iris-grib', author = 'UK Met Office', author_email = 'scitools-iris@googlegroups.com', @@ -78,10 +90,14 @@ def file_walk_relative(top, remove=''): 'Programming Language :: Python :: 3 :: Only', ], # NOTE: The Python 3 bindings to eccodes (eccodes-python) is available on - # PyPI, but the user is required to install eccodes itself manually. See + # PyPI, but the user is required to install eccodes itself manually. See # ECMWF ecCodes installation documentation for more information. - install_requires=['scitools-iris>=2.4.*'] + ['eccodes-python'], - test_suite = 'iris_grib.tests', + install_requires=pip_requirements("setup", "core"), + test_suite = f'{NAME}.tests', + extras_require={ + "all": pip_requirements("all"), + "test": pip_requirements("test"), + }, ) From b2e4dba63afb7258d8ac1f21b31ea968a4089be0 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Tue, 6 Oct 2020 16:36:47 +0100 Subject: [PATCH 175/583] Travis test with both Iris latest-release and latest-master. (#231) * Travis test with both Iris latest-release and latest-master. * Modify test CMLs for latest Iris (Iris3.0 changes). * Grib1 load fixes. * Fix loading since units=None default for Iris3 coords * Modify test to work with latest Iris (Iris3.0 changes). * Test against latest Iris only. * Review changes. --- .travis.yml | 29 +++++++++++++++-- iris_grib/_grib1_load_rules.py | 4 +-- iris_grib/_load_convert.py | 13 +++++--- .../data_section/TestGDT30/lambert.cml | 8 ++--- .../sample_file_loads/lambert_grib1.cml | 8 ++--- .../sample_file_loads/lambert_grib2.cml | 8 ++--- .../grib1_load_rules/test_grib1_convert.py | 31 ++++++++----------- .../load_convert/test_satellite_common.py | 6 ++-- 8 files changed, 65 insertions(+), 42 deletions(-) diff --git a/.travis.yml b/.travis.yml index c5625e9e..fabdc93c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,8 +3,10 @@ dist: xenial env: matrix: - - PYTHON_VERSION=36 - - PYTHON_VERSION=37 + - PYTHON_VERSION=36 LIMIT_TO_RELEASED_IRIS=false + - PYTHON_VERSION=37 LIMIT_TO_RELEASED_IRIS=false + # - PYTHON_VERSION=36 LIMIT_TO_RELEASED_IRIS=true + # - PYTHON_VERSION=37 LIMIT_TO_RELEASED_IRIS=true install: # Download iris-test-data @@ -40,6 +42,22 @@ install: export ENV_NAME="iris-grib-dev"; export ENV_FILE="${TRAVIS_BUILD_DIR}/requirements/ci/py${PYTHON_VERSION}.yml"; + # Optionally download latest Iris from repo, + # and replace the Iris dependency with Iris' underlying dependencies. + - > + if [[ "${LIMIT_TO_RELEASED_IRIS}" == false ]]; then + IRIS_REF="https://github.com/SciTools/iris/archive/master.zip"; + export IRIS_LOCATION="${HOME}/iris"; + mkdir ${IRIS_LOCATION}; + wget -O ${IRIS_LOCATION}/iris.zip ${IRIS_REF}; + unzip -q ${IRIS_LOCATION}/iris.zip -d ${IRIS_LOCATION}; + + IRIS_ENV_FILE="${IRIS_LOCATION}/iris-master/requirements/ci/py${PYTHON_VERSION}.yml"; + sed -i "/- iris/d" ${ENV_FILE}; + echo "# IRIS DEPENDENCIES." >> ${ENV_FILE}; + sed -ne "/dependencies:/,$ p" ${IRIS_ENV_FILE} | sed "1d" >> ${ENV_FILE}; + fi; + # Create environment. - > conda env create --quiet --file=${ENV_FILE}; @@ -61,6 +79,13 @@ install: # -------------- - echo "Configuring Iris"; + # Optionally install latest Iris from downloaded source. + - > + if [[ "${LIMIT_TO_RELEASED_IRIS}" == false ]]; then + cd ${IRIS_LOCATION}/iris-master; + python setup.py --quiet install; + fi; + # Locate Iris installation. - export IRIS_DIR=$(python -c "import iris; import os.path; print(os.path.dirname(iris.__file__))") diff --git a/iris_grib/_grib1_load_rules.py b/iris_grib/_grib1_load_rules.py index 30d36655..fd537442 100644 --- a/iris_grib/_grib1_load_rules.py +++ b/iris_grib/_grib1_load_rules.py @@ -238,9 +238,9 @@ def add_bounded_time_coords(aux_coords_and_dims, grib): if \ (grib.levelType == 'ml') and \ (hasattr(grib, 'pv')): - aux_coords_and_dims.append((AuxCoord(grib.level, standard_name='model_level_number', attributes={'positive': 'up'}), None)) + aux_coords_and_dims.append((AuxCoord(grib.level, standard_name='model_level_number', units=1, attributes={'positive': 'up'}), None)) aux_coords_and_dims.append((DimCoord(grib.pv[grib.level], long_name='level_pressure', units='Pa'), None)) - aux_coords_and_dims.append((AuxCoord(grib.pv[grib.numberOfCoordinatesValues//2 + grib.level], long_name='sigma'), None)) + aux_coords_and_dims.append((AuxCoord(grib.pv[grib.numberOfCoordinatesValues//2 + grib.level], long_name='sigma', units=1), None)) factories.append(Factory(HybridPressureFactory, [{'long_name': 'level_pressure'}, {'long_name': 'sigma'}, Reference('surface_pressure')])) if grib._originatingCentre != 'unknown': diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index 8cc62a25..33c7e6a6 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -1545,7 +1545,7 @@ def hybrid_factories(section, metadata): # Create the model level number scalar coordinate. scaledValue = section['scaledValueOfFirstFixedSurface'] coord = DimCoord(scaledValue, standard_name='model_level_number', - attributes=dict(positive='up')) + units=1, attributes=dict(positive='up')) metadata['aux_coords_and_dims'].append((coord, None)) if typeOfFirstFixedSurface == 118: @@ -1576,7 +1576,7 @@ def hybrid_factories(section, metadata): metadata['aux_coords_and_dims'].append((coord, None)) # Create the sigma scalar coordinate. offset = NV // 2 + scaledValue - coord = AuxCoord(pv[offset], long_name='sigma') + coord = AuxCoord(pv[offset], long_name='sigma', units=1) metadata['aux_coords_and_dims'].append((coord, None)) # Create the associated factory reference. factory = Factory(factory_class, factory_args) @@ -2286,19 +2286,22 @@ def satellite_common(section, metadata): if NB > 0: # Create the satellite series coordinate. satelliteSeries = section['satelliteSeries'] - coord = AuxCoord(satelliteSeries, long_name='satellite_series') + coord = AuxCoord(satelliteSeries, long_name='satellite_series', + units=1) # Add the satellite series coordinate to the metadata aux coords. metadata['aux_coords_and_dims'].append((coord, None)) # Create the satellite number coordinate. satelliteNumber = section['satelliteNumber'] - coord = AuxCoord(satelliteNumber, long_name='satellite_number') + coord = AuxCoord(satelliteNumber, long_name='satellite_number', + units=1) # Add the satellite number coordinate to the metadata aux coords. metadata['aux_coords_and_dims'].append((coord, None)) # Create the satellite instrument type coordinate. instrumentType = section['instrumentType'] - coord = AuxCoord(instrumentType, long_name='instrument_type') + coord = AuxCoord(instrumentType, long_name='instrument_type', + units=1) # Add the instrument type coordinate to the metadata aux coords. metadata['aux_coords_and_dims'].append((coord, None)) diff --git a/iris_grib/tests/results/integration/load_convert/data_section/TestGDT30/lambert.cml b/iris_grib/tests/results/integration/load_convert/data_section/TestGDT30/lambert.cml index 215a0de8..dff111dc 100644 --- a/iris_grib/tests/results/integration/load_convert/data_section/TestGDT30/lambert.cml +++ b/iris_grib/tests/results/integration/load_convert/data_section/TestGDT30/lambert.cml @@ -15,16 +15,16 @@ - - + - - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib1.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib1.cml index 74fe0a27..56e96e7a 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib1.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib1.cml @@ -16,16 +16,16 @@ - - + - - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib2.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib2.cml index dc938f0a..813553b5 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib2.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib2.cml @@ -15,16 +15,16 @@ - - + - - + diff --git a/iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py b/iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py index b8e990bb..e84b9a1a 100644 --- a/iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py +++ b/iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py @@ -9,11 +9,10 @@ # importing anything else import iris_grib.tests as tests -import cf_units import gribapi from unittest import mock -import iris +from iris.aux_factory import HybridPressureFactory from iris.exceptions import TranslationError from iris.fileformats.rules import Reference @@ -109,27 +108,23 @@ def test_grib1_hybrid_height(self): results = grib1_convert(gw) factory, = results[0] - self.assertEqual(factory.factory_class, - iris.aux_factory.HybridPressureFactory) + self.assertEqual(factory.factory_class, HybridPressureFactory) delta, sigma, ref = factory.args self.assertEqual(delta, {'long_name': 'level_pressure'}) self.assertEqual(sigma, {'long_name': 'sigma'}) self.assertEqual(ref, Reference(name='surface_pressure')) - ml_ref = iris.coords.CoordDefn('model_level_number', None, None, - cf_units.Unit('1'), - {'positive': 'up'}, None, False) - lp_ref = iris.coords.CoordDefn(None, 'level_pressure', None, - cf_units.Unit('Pa'), - {}, None, False) - s_ref = iris.coords.CoordDefn(None, 'sigma', None, - cf_units.Unit('1'), - {}, None, False) - - aux_coord_defns = [coord._as_defn() for coord, dim in results[8]] - self.assertIn(ml_ref, aux_coord_defns) - self.assertIn(lp_ref, aux_coord_defns) - self.assertIn(s_ref, aux_coord_defns) + coords_and_dims = results[8] + coord, = [co for co, _ in coords_and_dims + if co.name() == 'model_level_number'] + self.assertEqual(coord.units, '1') + self.assertEqual(coord.attributes['positive'], 'up') + coord, = [co for co, _ in coords_and_dims + if co.name() == 'level_pressure'] + self.assertEqual(coord.units, 'Pa') + coord, = [co for co, _ in coords_and_dims + if co.name() == 'sigma'] + self.assertEqual(coord.units, '1') if __name__ == "__main__": diff --git a/iris_grib/tests/unit/load_convert/test_satellite_common.py b/iris_grib/tests/unit/load_convert/test_satellite_common.py index edcdd2e2..d2814ddc 100644 --- a/iris_grib/tests/unit/load_convert/test_satellite_common.py +++ b/iris_grib/tests/unit/load_convert/test_satellite_common.py @@ -43,11 +43,11 @@ def _check(self, factors=1, values=111): # Check the result. expected = empty_metadata() - coord = AuxCoord(series, long_name='satellite_series') + coord = AuxCoord(series, long_name='satellite_series', units=1) expected['aux_coords_and_dims'].append((coord, None)) - coord = AuxCoord(number, long_name='satellite_number') + coord = AuxCoord(number, long_name='satellite_number', units=1) expected['aux_coords_and_dims'].append((coord, None)) - coord = AuxCoord(instrument, long_name='instrument_type') + coord = AuxCoord(instrument, long_name='instrument_type', units=1) expected['aux_coords_and_dims'].append((coord, None)) standard_name = 'sensor_band_central_radiation_wavenumber' coord = AuxCoord(values / (10.0 ** factors), From 1b7c07751feb0f4c57ebafb8a2f15a808bfd15cb Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Mon, 12 Oct 2020 13:58:23 +0100 Subject: [PATCH 176/583] Cosmetic change : rename the travis iris-test-version options (#234) * Rename Iris test-version options, and enable all to check action. * Review changes. --- .travis.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.travis.yml b/.travis.yml index fabdc93c..085c8746 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,10 +3,10 @@ dist: xenial env: matrix: - - PYTHON_VERSION=36 LIMIT_TO_RELEASED_IRIS=false - - PYTHON_VERSION=37 LIMIT_TO_RELEASED_IRIS=false - # - PYTHON_VERSION=36 LIMIT_TO_RELEASED_IRIS=true - # - PYTHON_VERSION=37 LIMIT_TO_RELEASED_IRIS=true + - PYTHON_VERSION=36 IRIS_SOURCE=master + - PYTHON_VERSION=37 IRIS_SOURCE=master + - PYTHON_VERSION=36 IRIS_SOURCE=release + - PYTHON_VERSION=37 IRIS_SOURCE=release install: # Download iris-test-data @@ -42,10 +42,10 @@ install: export ENV_NAME="iris-grib-dev"; export ENV_FILE="${TRAVIS_BUILD_DIR}/requirements/ci/py${PYTHON_VERSION}.yml"; - # Optionally download latest Iris from repo, + # Optionally download latest Iris master, from the github repo, # and replace the Iris dependency with Iris' underlying dependencies. - > - if [[ "${LIMIT_TO_RELEASED_IRIS}" == false ]]; then + if [[ "${IRIS_SOURCE}" == "master" ]]; then IRIS_REF="https://github.com/SciTools/iris/archive/master.zip"; export IRIS_LOCATION="${HOME}/iris"; mkdir ${IRIS_LOCATION}; @@ -79,9 +79,9 @@ install: # -------------- - echo "Configuring Iris"; - # Optionally install latest Iris from downloaded source. + # Optionally install latest Iris master, from downloaded source. - > - if [[ "${LIMIT_TO_RELEASED_IRIS}" == false ]]; then + if [[ "${IRIS_SOURCE}" == "master" ]]; then cd ${IRIS_LOCATION}/iris-master; python setup.py --quiet install; fi; From 5fbbb99efd5a59161efacee12bf07e3047483ebd Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Mon, 12 Oct 2020 15:22:28 +0100 Subject: [PATCH 177/583] Version 0.16 release candidate (#232) * Require Iris >=3 (just for the gdt90 changes). * Whatsnew entry for requiring Iris 3. * Set version string for release candidate. * Test against Iris 3.0.0rc0 from conda-forge/rc_iris. --- docs/ref/release_notes.rst | 8 ++++++++ iris_grib/__init__.py | 2 +- requirements/ci/py36.yml | 4 ++-- requirements/ci/py37.yml | 4 ++-- requirements/core.txt | 2 +- 5 files changed, 14 insertions(+), 6 deletions(-) diff --git a/docs/ref/release_notes.rst b/docs/ref/release_notes.rst index 87feaaef..e3f49876 100644 --- a/docs/ref/release_notes.rst +++ b/docs/ref/release_notes.rst @@ -64,6 +64,14 @@ Bugs Fixed only the Iris coordinate system has changed. `(PR#223) `_ +Dependencies +^^^^^^^^^^^^ + +* now requires Iris version >= 3.0 + Needed for the bugfix in + `PR#223 `_ . + + What's new in iris-grib v0.15.1 ------------------------------- diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index 1f40af63..cb927950 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -33,7 +33,7 @@ from .message import GribMessage -__version__ = '0.15.1' +__version__ = '0.16.0rc0' __all__ = ['load_cubes', 'save_grib2', 'load_pairs_from_fields', 'save_pairs_from_cube', 'save_messages'] diff --git a/requirements/ci/py36.yml b/requirements/ci/py36.yml index 85bfcd5c..c827c5af 100644 --- a/requirements/ci/py36.yml +++ b/requirements/ci/py36.yml @@ -1,7 +1,7 @@ name: iris-grib-dev channels: - - conda-forge + - conda-forge/label/rc_iris dependencies: - python=3.6 @@ -10,7 +10,7 @@ dependencies: - setuptools # Core dependencies. - - iris>=2.4 + - iris=3.0.0rc0 - python-eccodes # Optional dependencies. diff --git a/requirements/ci/py37.yml b/requirements/ci/py37.yml index 65f0f0b5..9646baf7 100644 --- a/requirements/ci/py37.yml +++ b/requirements/ci/py37.yml @@ -1,7 +1,7 @@ name: iris-grib-dev channels: - - conda-forge + - conda-forge/label/rc_iris dependencies: - python=3.7 @@ -10,7 +10,7 @@ dependencies: - setuptools # Core dependencies. - - iris>=2.4 + - iris=3.0.0rc0 - python-eccodes # Optional dependencies. diff --git a/requirements/core.txt b/requirements/core.txt index f88d210d..8ae4936c 100644 --- a/requirements/core.txt +++ b/requirements/core.txt @@ -1,4 +1,4 @@ # Core dependencies. -scitools-iris>=2.4 +scitools-iris>=3.0.0rc0 eccodes-python From 0cc5152c4e1fd2b59d2e3af6e1e0ff2d5623be67 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Mon, 12 Oct 2020 15:49:25 +0100 Subject: [PATCH 178/583] Fix RC date in release notes (about to cut). (#235) --- docs/ref/release_notes.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/ref/release_notes.rst b/docs/ref/release_notes.rst index e3f49876..7a9177bf 100644 --- a/docs/ref/release_notes.rst +++ b/docs/ref/release_notes.rst @@ -6,7 +6,7 @@ What's new in iris-grib v0.16 ----------------------------- :Release: 0.16.0 -:Date: ?? Sep 2020 +:Date: 12 Oct 2020 Features ^^^^^^^^ From 06534bc878c9677fdef7e0a7cd982115004d440c Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Wed, 20 Jan 2021 16:02:49 +0000 Subject: [PATCH 179/583] Add 'main' conda-forge channel, needed for docs builds. (#240) * Add 'main' conda-forge channel, needed for docs builds. * Use fixed spherical-earth-radius in GRIB1, ignoring change in gribapi default. * Codestyle fix. --- iris_grib/__init__.py | 68 +++++++++++++--------------------------- requirements/ci/py36.yml | 1 + requirements/ci/py37.yml | 1 + 3 files changed, 23 insertions(+), 47 deletions(-) diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index cb927950..5e9093ec 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -342,56 +342,30 @@ def _compute_extra_keys(self): self.extra_keys['_forecastTimeUnit'] = self._timeunit_string() # shape of the earth - - # pre-defined sphere - if self.shapeOfTheEarth == 0: + soe_code = self.shapeOfTheEarth + # As this class is now *only* for GRIB1, 'shapeOfTheEarth' is not a + # value read from the actual file : It is really a GRIB2 param, and + # the value is merely what eccodes (gribapi) gives as the default. + # This was always = 6, until eccodes 0.19, when it changed to 0. + # See https://jira.ecmwf.int/browse/ECC-811 + # The two represent different sized spherical earths. + if soe_code not in (6, 0): + raise ValueError('Unexpected shapeOfTheEarth value =', soe_code) + + soe_code = 6 + # *FOR NOW* maintain the old behaviour (radius=6371229) in all cases, + # for backwards compatibility. + # However, this does not match the 'radiusOfTheEarth' default from the + # gribapi so is probably incorrect (see above issue ECC-811). + # So we may change this in future. + + if soe_code == 0: + # New supposedly-correct default value, matches 'radiusOfTheEarth'. geoid = coord_systems.GeogCS(semi_major_axis=6367470) - - # custom sphere - elif self.shapeOfTheEarth == 1: - geoid = coord_systems.GeogCS( - self.scaledValueOfRadiusOfSphericalEarth * - 10 ** -self.scaleFactorOfRadiusOfSphericalEarth) - - # IAU65 oblate sphere - elif self.shapeOfTheEarth == 2: - geoid = coord_systems.GeogCS(6378160, inverse_flattening=297.0) - - # custom oblate spheroid (km) - elif self.shapeOfTheEarth == 3: - geoid = coord_systems.GeogCS( - semi_major_axis=self.scaledValueOfEarthMajorAxis * - 10 ** -self.scaleFactorOfEarthMajorAxis * 1000., - semi_minor_axis=self.scaledValueOfEarthMinorAxis * - 10 ** -self.scaleFactorOfEarthMinorAxis * 1000.) - - # IAG-GRS80 oblate spheroid - elif self.shapeOfTheEarth == 4: - geoid = coord_systems.GeogCS(6378137, None, 298.257222101) - - # WGS84 - elif self.shapeOfTheEarth == 5: - geoid = \ - coord_systems.GeogCS(6378137, inverse_flattening=298.257223563) - - # pre-defined sphere - elif self.shapeOfTheEarth == 6: + elif soe_code == 6: + # Old value, does *not* match the 'radiusOfTheEarth' parameter. geoid = coord_systems.GeogCS(6371229) - # custom oblate spheroid (m) - elif self.shapeOfTheEarth == 7: - geoid = coord_systems.GeogCS( - semi_major_axis=self.scaledValueOfEarthMajorAxis * - 10 ** -self.scaleFactorOfEarthMajorAxis, - semi_minor_axis=self.scaledValueOfEarthMinorAxis * - 10 ** -self.scaleFactorOfEarthMinorAxis) - - elif self.shapeOfTheEarth == 8: - raise ValueError("unhandled shape of earth : grib earth shape = 8") - - else: - raise ValueError("undefined shape of earth") - gridType = gribapi.grib_get_string(self.grib_message, "gridType") if gridType in ["regular_ll", "regular_gg", "reduced_ll", diff --git a/requirements/ci/py36.yml b/requirements/ci/py36.yml index c827c5af..46a059d7 100644 --- a/requirements/ci/py36.yml +++ b/requirements/ci/py36.yml @@ -2,6 +2,7 @@ name: iris-grib-dev channels: - conda-forge/label/rc_iris + - conda-forge dependencies: - python=3.6 diff --git a/requirements/ci/py37.yml b/requirements/ci/py37.yml index 9646baf7..c723e617 100644 --- a/requirements/ci/py37.yml +++ b/requirements/ci/py37.yml @@ -2,6 +2,7 @@ name: iris-grib-dev channels: - conda-forge/label/rc_iris + - conda-forge dependencies: - python=3.7 From 6aa2040195ec01790ac4ae366ffcf76233447a09 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Wed, 27 Jan 2021 12:28:38 +0000 Subject: [PATCH 180/583] Update requirements to pick up Iris 3. (#243) --- requirements/ci/py36.yml | 3 +-- requirements/ci/py37.yml | 3 +-- requirements/core.txt | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/requirements/ci/py36.yml b/requirements/ci/py36.yml index 46a059d7..e9293f3c 100644 --- a/requirements/ci/py36.yml +++ b/requirements/ci/py36.yml @@ -1,7 +1,6 @@ name: iris-grib-dev channels: - - conda-forge/label/rc_iris - conda-forge dependencies: @@ -11,7 +10,7 @@ dependencies: - setuptools # Core dependencies. - - iris=3.0.0rc0 + - iris>=3 - python-eccodes # Optional dependencies. diff --git a/requirements/ci/py37.yml b/requirements/ci/py37.yml index c723e617..98c7f5c5 100644 --- a/requirements/ci/py37.yml +++ b/requirements/ci/py37.yml @@ -1,7 +1,6 @@ name: iris-grib-dev channels: - - conda-forge/label/rc_iris - conda-forge dependencies: @@ -11,7 +10,7 @@ dependencies: - setuptools # Core dependencies. - - iris=3.0.0rc0 + - iris>=3 - python-eccodes # Optional dependencies. diff --git a/requirements/core.txt b/requirements/core.txt index 8ae4936c..21263d7a 100644 --- a/requirements/core.txt +++ b/requirements/core.txt @@ -1,4 +1,4 @@ # Core dependencies. -scitools-iris>=3.0.0rc0 +scitools-iris>=3 eccodes-python From 7b53510d7338ae2aae33c77ceab8d54c21cef140 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Wed, 27 Jan 2021 15:05:47 +0000 Subject: [PATCH 181/583] Remove eccodes bug workaround added in #208. (#224) --- iris_grib/_save_rules.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index cb331cf2..0f0e4df3 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -1490,12 +1490,6 @@ def data_section(cube, grib): gribapi.grib_set(grib, "bitmapPresent", 1) gribapi.grib_set_double(grib, "missingValue", fill_value) - # A segmentation fault is raised by `gribapi.grib_set_double_array` if it - # tries to cast large data to float64. As a temporary fix we cast the data - # upfront - # TODO: remove the `astype` command once eccodes (gribapi) has been fixed. - if data.dtype != np.float64: - data = data.astype(np.float64) gribapi.grib_set_double_array(grib, "values", data.flatten()) # todo: check packing accuracy? From ea40ec18d3bfc7f669c9e74d8fee838aa1f6d66f Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Wed, 27 Jan 2021 15:42:44 +0000 Subject: [PATCH 182/583] Docstest 0v16 (#244) * Document PR#240 in release notes. * Fix version string and release-notes date. --- docs/ref/release_notes.rst | 14 ++++++++++++-- iris_grib/__init__.py | 2 +- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/docs/ref/release_notes.rst b/docs/ref/release_notes.rst index 7a9177bf..dc361c14 100644 --- a/docs/ref/release_notes.rst +++ b/docs/ref/release_notes.rst @@ -1,12 +1,12 @@ Release Notes ============= -======= + What's new in iris-grib v0.16 ----------------------------- :Release: 0.16.0 -:Date: 12 Oct 2020 +:Date: 27 Jan 2021 Features ^^^^^^^^ @@ -64,6 +64,16 @@ Bugs Fixed only the Iris coordinate system has changed. `(PR#223) `_ +* `@pp-mo `_ fixed a problem where cubes were loading from GRIB 1 with a changed coordinate + system, since eccodes versions >= 1.19. This resulted from a change to eccodes, which now returns a different + 'shapeOfTheEarth' parameter : see `eccodes issue ECC-811 `_ . This resulted + in a coordinate system with a different earth radius. + For backwards compatibilty, the earth radius has now been fixed to the same value as previously. + However, pending further investigation, this value may be technically incorrect and we may + yet decide to change it in a future release. + `(PR#240) `_ + + Dependencies ^^^^^^^^^^^^ diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index 5e9093ec..24ceb845 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -33,7 +33,7 @@ from .message import GribMessage -__version__ = '0.16.0rc0' +__version__ = '0.16.0' __all__ = ['load_cubes', 'save_grib2', 'load_pairs_from_fields', 'save_pairs_from_cube', 'save_messages'] From e2dc18a072c197af7b1d8ce145283014a0464fcf Mon Sep 17 00:00:00 2001 From: James Penn Date: Wed, 24 Feb 2021 09:34:45 +0000 Subject: [PATCH 183/583] Version bump to 0.17.dev0 --- iris_grib/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index 24ceb845..ae718c6e 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -33,7 +33,7 @@ from .message import GribMessage -__version__ = '0.16.0' +__version__ = '0.17.dev0' __all__ = ['load_cubes', 'save_grib2', 'load_pairs_from_fields', 'save_pairs_from_cube', 'save_messages'] From 1a8be5972dd11c6a5895150335a9269f0ba876eb Mon Sep 17 00:00:00 2001 From: James Penn Date: Tue, 2 Mar 2021 13:57:52 +0000 Subject: [PATCH 184/583] Cirrus CI (#250) * Travis test with both Iris latest-release and latest-master. (#231) * Travis test with both Iris latest-release and latest-master. * Modify test CMLs for latest Iris (Iris3.0 changes). * Grib1 load fixes. * Fix loading since units=None default for Iris3 coords * Modify test to work with latest Iris (Iris3.0 changes). * Test against latest Iris only. * Review changes. * Cosmetic change : rename the travis iris-test-version options (#234) * Rename Iris test-version options, and enable all to check action. * Review changes. * Version 0.16 release candidate (#232) * Require Iris >=3 (just for the gdt90 changes). * Whatsnew entry for requiring Iris 3. * Set version string for release candidate. * Test against Iris 3.0.0rc0 from conda-forge/rc_iris. * Fix RC date in release notes (about to cut). (#235) * Add 'main' conda-forge channel, needed for docs builds. (#240) * Add 'main' conda-forge channel, needed for docs builds. * Use fixed spherical-earth-radius in GRIB1, ignoring change in gribapi default. * Codestyle fix. * Update requirements to pick up Iris 3. (#243) * Remove eccodes bug workaround added in #208. (#224) * Docstest 0v16 (#244) * Document PR#240 in release notes. * Fix version string and release-notes date. * Added getting started .cirrus.yml * Update cirrus to use miniconda image * Update .cirrus.yml * Update .cirrus.yml Copied across cirrus file from iris-ugrid * Added nox testing Borrowing from iris and iris-ugrid, added nox testing and a test runner. Tests currently fail on my local machine. * Path fixes in cirrus.yml * eccodes test added to noxfile * Added config and coverage * Trying to set SITE_CFG * syntax error * taking the IRIS_DIR from Travis CI config * Add allow_failures to the linux task for now * Dodgy r key... * Update .cirrus.yml * Allow failures in linting * Force return error 0 for now * Added eccodes test * moved matrix * Yaml syntax error & * wrong way around * Typo * Update iris version dependency * Date fix This resolves the same bash issue as https://github.com/SciTools/iris/pull/4019 * Configure Iris in nox * Updated CI config * correct site-packages path * Fix to iris test data path * force cache update * refactored writing iris config in noxfile * Fix pep8 and license test fails * Support for testing against packaged iris and building from source * Adding yaml to list of cirrus container requirements * invalidate cirrus cache * really invalidate cirrus cache... * yaml -> pyyaml * missing iris_dir reference * call write_iris_config * docstrings and matrix testing * git syntax error * eccodes selfcheck in basic tests * Removed py3.8 testing for now * Fixed regression in setup.py test * Removed unused imports * Disabled lint checking * Removed nox from test dependencies for python3.6 and python3.8 * Removed python3.8 from noxfile * Removed nox from test requirements Co-authored-by: Patrick Peglar --- .cirrus.yml | 106 ++++++++ .gitignore | 4 + iris_grib/tests/runner/__init__.py | 9 + iris_grib/tests/runner/__main__.py | 40 +++ iris_grib/tests/runner/_runner.py | 144 +++++++++++ noxfile.py | 388 +++++++++++++++++++++++++++++ requirements/ci/py36.yml | 2 + requirements/ci/py37.yml | 2 + requirements/ci/py38.yml | 24 ++ requirements/test.txt | 1 + setup.py | 3 +- 11 files changed, 721 insertions(+), 2 deletions(-) create mode 100644 .cirrus.yml create mode 100644 iris_grib/tests/runner/__init__.py create mode 100644 iris_grib/tests/runner/__main__.py create mode 100644 iris_grib/tests/runner/_runner.py create mode 100644 noxfile.py create mode 100644 requirements/ci/py38.yml diff --git a/.cirrus.yml b/.cirrus.yml new file mode 100644 index 00000000..7590017d --- /dev/null +++ b/.cirrus.yml @@ -0,0 +1,106 @@ +# Reference: +# - https://cirrus-ci.org/guide/writing-tasks/ +# - https://cirrus-ci.org/guide/tips-and-tricks/#sharing-configuration-between-tasks +# - https://cirrus-ci.org/guide/linux/ +# - https://cirrus-ci.org/guide/macOS/ +# - https://cirrus-ci.org/guide/windows/ +# - https://hub.docker.com/_/gcc/ +# - https://hub.docker.com/_/python/ + +# +# Global defaults. +# +container: + image: python:3.8 + cpu: 2 + memory: 4G + +env: + # Maximum cache period (in weeks) before forcing a new cache upload. + CACHE_PERIOD: "2" + # Increment the build number to force new conda cache upload. + CONDA_CACHE_BUILD: "98" + # Increment the build number to force new nox cache upload. + NOX_CACHE_BUILD: "98" + # Increment the build number to force new pip cache upload. + PIP_CACHE_BUILD: "98" + # Pip package to be upgraded/installed. + PIP_CACHE_PACKAGES: "pip setuptools wheel nox pyyaml" + # Base directory for the iris-test-data. + IRIS_TEST_DATA_DIR: ${HOME}/iris-test-data + # Git commit hash for iris test data. + IRIS_TEST_DATA_REF: "2.0.0" + +# +# Linting +# [2021-03-01] jamesp: Currently not black or flake compliant. +# GitHub issues open #251 and #252 +# lint_task: +# auto_cancellation: true +# name: "${CIRRUS_OS}: flake8 and black" +# pip_cache: +# folder: ~/.cache/pip +# fingerprint_script: +# - echo "${CIRRUS_TASK_NAME}" +# - echo "$(date +%Y).$(expr $(date +%U) / ${CACHE_PERIOD}):${PIP_CACHE_BUILD} ${PIP_CACHE_PACKAGES}" +# lint_script: +# - pip list +# - python -m pip install --retries 3 --upgrade ${PIP_CACHE_PACKAGES} +# - pip list +# - nox --session flake8 +# - nox --session black + + +# +# Testing (Linux) +# +linux_task_template: &LINUX_TASK_TEMPLATE + auto_cancellation: true + env: + PATH: ${HOME}/miniconda/bin:${PATH} + + container: + image: gcc:latest + cpu: 6 + memory: 8G + conda_cache: + folder: ${HOME}/miniconda + fingerprint_script: + - wget --quiet https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh + - echo "${CIRRUS_OS} $(sha256sum miniconda.sh)" + - echo "$(date +%Y).$(expr $(date +%U) / ${CACHE_PERIOD}):${CONDA_CACHE_BUILD}" + populate_script: + - bash miniconda.sh -b -p ${HOME}/miniconda + - conda config --set always_yes yes --set changeps1 no + - conda config --set show_channel_urls True + - conda config --add channels conda-forge + - conda update --quiet --name base conda + - conda install --quiet --name base nox pip coverage pyyaml + nox_cache: + folder: ${CIRRUS_WORKING_DIR}/.nox + fingerprint_script: + - echo "${CIRRUS_TASK_NAME}" + - echo "$(date +%Y).$(expr $(date +%U) / ${CACHE_PERIOD}):${NOX_CACHE_BUILD}" + - sha256sum ${CIRRUS_WORKING_DIR}/requirements/ci/py$(echo ${PY_VER} | tr -d ".").yml + - echo "IRIS ${IRIS_SOURCE}" + data_cache: + folder: ${IRIS_TEST_DATA_DIR} + fingerprint_script: + - echo "${IRIS_TEST_DATA_REF}" + populate_script: + - wget --quiet https://github.com/SciTools/iris-test-data/archive/v${IRIS_TEST_DATA_REF}.zip -O iris-test-data.zip + - unzip -q iris-test-data.zip + - mv iris-test-data-$(echo "${IRIS_TEST_DATA_REF}" | sed "s/^v//") ${IRIS_TEST_DATA_DIR} + +tests_task: + matrix: + env: + PY_VER: 3.6 + env: + PY_VER: 3.7 + # env: + # PY_VER: 3.8 + name: "${CIRRUS_OS}: py${PY_VER} tests" + << : *LINUX_TASK_TEMPLATE + tests_script: + - nox --session tests -- --test-data-dir ${IRIS_TEST_DATA_DIR}/test_data diff --git a/.gitignore b/.gitignore index fcae05cd..2cab3a2f 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,9 @@ sdist develop-eggs .installed.cfg +# test +.nox/ + # Installer logs pip-log.txt @@ -24,3 +27,4 @@ pip-log.txt \#* \.\#* *.swp +.vscode/ \ No newline at end of file diff --git a/iris_grib/tests/runner/__init__.py b/iris_grib/tests/runner/__init__.py new file mode 100644 index 00000000..c9ef7b89 --- /dev/null +++ b/iris_grib/tests/runner/__init__.py @@ -0,0 +1,9 @@ +# Copyright iris-grib contributors +# +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. +""" +Empty file to allow import. + +""" diff --git a/iris_grib/tests/runner/__main__.py b/iris_grib/tests/runner/__main__.py new file mode 100644 index 00000000..cb44fc10 --- /dev/null +++ b/iris_grib/tests/runner/__main__.py @@ -0,0 +1,40 @@ +# Copyright iris-grib contributors +# +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. +""" +Provides testing capabilities for installed copies of iris-grib. + +""" + +import argparse + +from ._runner import TestRunner + + +parser = argparse.ArgumentParser( + "iris_grib.tests", description=TestRunner.description +) +for long_opt, short_opt, help_text in TestRunner.user_options: + long_opt = long_opt.strip("=") + if long_opt in TestRunner.boolean_options: + parser.add_argument( + "--" + long_opt, + "-" + short_opt, + action="store_true", + help=help_text, + ) + else: + parser.add_argument("--" + long_opt, "-" + short_opt, help=help_text) +args = parser.parse_args() + +runner = TestRunner() + +runner.initialize_options() +for long_opt, short_opt, help_text in TestRunner.user_options: + arg = long_opt.replace("-", "_").strip("=") + setattr(runner, arg, getattr(args, arg)) +runner.finalize_options() + +runner.run() diff --git a/iris_grib/tests/runner/_runner.py b/iris_grib/tests/runner/_runner.py new file mode 100644 index 00000000..4648c436 --- /dev/null +++ b/iris_grib/tests/runner/_runner.py @@ -0,0 +1,144 @@ +# Copyright iris-grib contributors +# +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. +""" +Provides testing capabilities for installed copies of iris-grib. + +""" + +# Because this file is imported by setup.py, there may be additional runtime +# imports later in the file. +import multiprocessing +import os + + +# NOTE: Do not inherit from object as distutils does not like it. +class TestRunner: + """Run the iris-grib tests under nose and multiprocessor for performance""" + + description = ( + "Run tests under nose and multiprocessor for performance. " + "Specifying one or more test flags will run *only* those " + "tests." + ) + user_options = [ + ( + "no-data", + "n", + "Override the paths to the data repositories so it " + "appears to the tests that it does not exist.", + ), + ("stop", "x", "Stop running tests after the first error or failure."), + ("unit-tests", "s", "Run the limited subset of unit tests."), + ("integration-tests", "i", "Run the integration tests."), + ("default-tests", "d", "Run the default tests."), + ( + "coding-tests", + "c", + "Run the coding standards tests. (These are a " + "subset of the default tests.)", + ), + ( + "num-processors=", + "p", + "The number of processors used for running " "the tests.", + ), + ("create-missing", "m", "Create missing test result files."), + ] + boolean_options = [ + "no-data", + "unit-tests", + "stop", + "default-tests", + "integration-tests", + "create-missing", + ] + + def initialize_options(self): + self.no_data = False + self.stop = False + self.unit_tests = False + self.default_tests = False + self.integration_tests = False + self.num_processors = None + self.create_missing = False + + def finalize_options(self): + # These enviroment variables will be propagated to all the + # processes that nose.run creates. + if self.no_data: + print("Running tests in no-data mode...") + import iris.config + + iris.config.TEST_DATA_DIR = None + if self.create_missing: + os.environ["IRIS_TEST_CREATE_MISSING"] = "true" + + tests = [] + if self.unit_tests: + tests.append("unit") + if self.default_tests: + tests.append("default") + if self.integration_tests: + tests.append("integration") + if not tests: + tests.append("default") + print("Running test suite(s): {}".format(", ".join(tests))) + if self.stop: + print("Stopping tests after the first error or failure") + if self.num_processors is None: + # Choose a magic number that works reasonably well for the default + # number of processes. + self.num_processors = (multiprocessing.cpu_count() + 1) // 4 + 1 + else: + self.num_processors = int(self.num_processors) + + def run(self): + import nose + + if hasattr(self, "distribution") and self.distribution.tests_require: + self.distribution.fetch_build_eggs(self.distribution.tests_require) + + tests = [] + if self.unit_tests: + tests.append("iris_grib.tests.unit") + if self.default_tests: + tests.append("iris_grib.tests") + if self.integration_tests: + tests.append("iris_grib.tests.integration") + + if not tests: + tests.append("iris_grib.tests") + + regexp_pat = r"--match=^([Tt]est(?![Mm]ixin)|[Ss]ystem)" + + n_processors = max(self.num_processors, 1) + + args = [ + "", + None, + "--processes=%s" % n_processors, + "--verbosity=2", + regexp_pat, + "--process-timeout=180", + ] + + if self.stop: + args.append("--stop") + + result = True + for test in tests: + args[1] = test + print() + print( + "Running test discovery on %s with %s processors." + % (test, n_processors) + ) + # run the tests at module level i.e. my_module.tests + # - test must start with test/Test and must not contain the + # word Mixin. + result &= nose.run(argv=args) + if result is False: + exit(1) diff --git a/noxfile.py b/noxfile.py new file mode 100644 index 00000000..e9a029fe --- /dev/null +++ b/noxfile.py @@ -0,0 +1,388 @@ +# Copyright iris-grib contributors +# +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. +""" +Perform test automation with nox. + +For further details, see https://nox.thea.codes/en/stable/# + +""" + +from contextlib import contextmanager +import hashlib +import os +from pathlib import Path + +import nox +import yaml + +#: Default to reusing any pre-existing nox environments. +nox.options.reuse_existing_virtualenvs = True + +#: Name of the package to test. +PACKAGE = str("iris_grib") + +#: Cirrus-CI environment variable hook. +PY_VER = os.environ.get("PY_VER", ["3.6", "3.7"]) +IRIS_SOURCE = os.environ.get("IRIS_SOURCE", ['source', 'conda-forge']) + +#: Default cartopy cache directory. +CARTOPY_CACHE_DIR = os.environ.get("HOME") / Path(".local/share/cartopy") + + +def venv_cached(session, requirements_file=None): + """ + Determine whether the nox session environment has been cached. + + Parameters + ---------- + session: object + A `nox.sessions.Session` object. + + Returns + ------- + bool + Whether the session has been cached. + + """ + result = False + if not requirements_file is None: + yml = Path(requirements_file) + else: + yml = Path(f"requirements/ci/py{session.python.replace('.', '')}.yml") + tmp_dir = Path(session.create_tmp()) + cache = tmp_dir / yml.name + if cache.is_file(): + with open(yml, "rb") as fi: + expected = hashlib.sha256(fi.read()).hexdigest() + with open(cache, "r") as fi: + actual = fi.read() + result = actual == expected + return result + + +def concat_requirements(primary, *others): + """Join together the dependencies of one or more requirements.yaml. + + Parameters + ---------- + primary: str + filename of the primary requirements.yaml + + others: list[str] + list of additional requirements.yamls + + Returns + ------- + yaml + Dictionary of yaml data: primary with the addition + of others[]['dependencies'] + + """ + with open(primary, 'r') as f: + requirements = yaml.load(f, yaml.FullLoader) + + for o in others: + with open(o, 'r') as f: + oreq = yaml.load(f, yaml.FullLoader) + requirements['dependencies'].extend(oreq['dependencies']) + + return requirements + + +def cache_venv(session, requirements_file=None): + """ + Cache the nox session environment. + + This consists of saving a hexdigest (sha256) of the associated + conda requirements YAML file. + + Parameters + ---------- + session: object + A `nox.sessions.Session` object. + + """ + if requirements_file is None: + yml = Path(f"requirements/ci/py{session.python.replace('.', '')}.yml") + else: + yml = Path(requirements_file) + with open(yml, "rb") as fi: + hexdigest = hashlib.sha256(fi.read()).hexdigest() + tmp_dir = Path(session.create_tmp()) + cache = tmp_dir / yml.name + with open(cache, "w") as fo: + fo.write(hexdigest) + + +def cache_cartopy(session): + """ + Determine whether to cache the cartopy natural earth shapefiles. + + Parameters + ---------- + session: object + A `nox.sessions.Session` object. + + """ + if not CARTOPY_CACHE_DIR.is_dir(): + session.run( + "python", + "-c", + "import cartopy; cartopy.io.shapereader.natural_earth()", + ) + +def write_iris_config(session): + """Add test data dir and libudunits2.so to iris config. + + test data dir is set from session pos args. i.e. can be + configured by passing in on the command line: + nox --session tests -- --test-data-dir $TEST_DATA_DIR/test_data + + Parameters + ---------- + session: object + A `nox.sessions.Session` object. + + """ + try: + test_data_dir = session.posargs[session.posargs.index('--test-data-dir')+1] + except: + test_data_dir = "" + + iris_config_file = os.path.join(session.virtualenv.location, 'lib', f'python{session.python}', 'site-packages', 'iris', 'etc', 'site.cfg') + iris_config = f""" +[Resources] +test_data_dir = {test_data_dir} +[System] +udunits2_path = {os.path.join(session.virtualenv.location, 'lib', 'libudunits2.so')} +""" + + print("Iris config\n-----------") + print(iris_config) + + with open(iris_config_file, 'w') as f: + f.write(iris_config) + +@contextmanager +def prepare_venv(session, requirements_file=None): + """ + Create and cache the nox session conda environment, and additionally + provide conda environment package details and info. + + Note that, iris-grib is installed into the environment using pip. + + Parameters + ---------- + session: object + A `nox.sessions.Session` object. + + requirements_file: str + Path to the environment requirements file. + Default: requirements/ci/py{PY_VER}.yml + + Notes + ----- + See + - https://github.com/theacodes/nox/issues/346 + - https://github.com/theacodes/nox/issues/260 + + """ + if requirements_file is None: + # Determine the conda requirements yaml file. + requirements_file = f"requirements/ci/py{session.python.replace('.', '')}.yml" + + if not venv_cached(session, requirements_file): + # Back-door approach to force nox to use "conda env update". + command = ( + "conda", + "env", + "update", + f"--prefix={session.virtualenv.location}", + f"--file={requirements_file}", + "--prune", + ) + session._run(*command, silent=True, external="error") + cache_venv(session) + + cache_cartopy(session) + + # Allow the user to do setup things + # like installing iris-grib in development mode + yield session + + # Determine whether verbose diagnostics have been requested + # from the command line. + verbose = "-v" in session.posargs or "--verbose" in session.posargs + + if verbose: + session.run("conda", "info") + session.run("conda", "list", f"--prefix={session.virtualenv.location}") + session.run( + "conda", + "list", + f"--prefix={session.virtualenv.location}", + "--explicit", + ) + + +@nox.session +def flake8(session): + """ + Perform flake8 linting of iris-grib. + + Parameters + ---------- + session: object + A `nox.sessions.Session` object. + + """ + # Pip install the session requirements. + session.install("flake8") + # Execute the flake8 linter on the package. + session.run("flake8", PACKAGE) + # Execute the flake8 linter on this file. + session.run("flake8", __file__) + + +@nox.session +def black(session): + """ + Perform black format checking of iris-grib. + + Parameters + ---------- + session: object + A `nox.sessions.Session` object. + + """ + # Pip install the session requirements. + session.install("black==20.8b1") + # Execute the black format checker on the package. + session.run("black", "--check", PACKAGE) + # Execute the black format checker on this file. + session.run("black", "--check", __file__) + + +@nox.session(python=PY_VER, venv_backend="conda") +@nox.parametrize('iris', IRIS_SOURCE) +def tests(session, iris): + """ + Perform iris-grib tests against release and development versions of iris. + + Parameters + ---------- + session: object + A `nox.sessions.Session` object. + + """ + + if iris == 'source': + # get latest iris + iris_dir = f"{session.create_tmp()}/iris" + + if os.path.exists(iris_dir): + # cached. update by pulling from origin/master + session.run( + "git", + "-C", + iris_dir, + "pull", + "origin", + "master", + external=True # use git from host environment + ) + else: + session.run( + "git", + "clone", + "https://github.com/scitools/iris.git", + iris_dir, + external=True + ) + + # combine iris and iris-grib requirements into one requirement list + requirements = concat_requirements( + f"requirements/ci/py{session.python.replace('.', '')}.yml", + f"{iris_dir}/requirements/ci/py{session.python.replace('.', '')}.yml" + ) + # remove iris dependencies, we'll install these from source + requirements['dependencies'] = [x for x in requirements['dependencies'] + if not x.startswith('iris')] + req_file = f"{session.create_tmp()}/requirements.yaml" + with open(req_file, 'w') as f: + yaml.dump(requirements, f) + else: + req_file = f"requirements/ci/py{session.python.replace('.', '')}.yml" + + with prepare_venv(session, req_file): + if iris == 'source': + session.install(iris_dir, '--no-deps') + session.install("--no-deps", "--editable", ".") + write_iris_config(session) + + session.run("python", "-m", "eccodes", "selfcheck") + + session.run( + "python", + "-m", + "iris_grib.tests.runner", + "--default-tests", + "--unit-tests", + "--integration-tests", + ) + + + +@nox.session(python=PY_VER, venv_backend="conda") +def doctest(session): + """ + Perform iris-grib doc-tests. + + Parameters + ---------- + session: object + A `nox.sessions.Session` object. + + """ + prepare_venv(session) + session.cd("docs") + session.run( + "make", + "clean", + "html", + external=True, + ) + session.run( + "make", + "doctest", + external=True, + ) + + +@nox.session(python=PY_VER, venv_backend="conda") +def linkcheck(session): + """ + Perform iris-grib doc link check. + + Parameters + ---------- + session: object + A `nox.sessions.Session` object. + + """ + prepare_venv(session) + session.cd("docs") + session.run( + "make", + "clean", + "html", + external=True, + ) + session.run( + "make", + "linkcheck", + external=True, + ) \ No newline at end of file diff --git a/requirements/ci/py36.yml b/requirements/ci/py36.yml index e9293f3c..e51e7c59 100644 --- a/requirements/ci/py36.yml +++ b/requirements/ci/py36.yml @@ -20,3 +20,5 @@ dependencies: - mock - filelock - pep8 + - requests + - nose diff --git a/requirements/ci/py37.yml b/requirements/ci/py37.yml index 98c7f5c5..fbcc8433 100644 --- a/requirements/ci/py37.yml +++ b/requirements/ci/py37.yml @@ -20,3 +20,5 @@ dependencies: - mock - filelock - pep8 + - requests + - nose diff --git a/requirements/ci/py38.yml b/requirements/ci/py38.yml new file mode 100644 index 00000000..cc84dcd9 --- /dev/null +++ b/requirements/ci/py38.yml @@ -0,0 +1,24 @@ +name: iris-grib-dev + +channels: + - conda-forge + +dependencies: + - python=3.8 + +# Setup dependencies. + - setuptools + +# Core dependencies. + - iris>=3 + - python-eccodes + +# Optional dependencies. + - mo_pack + +# Test dependencies. + - mock + - filelock + - pep8 + - requests + - nose \ No newline at end of file diff --git a/requirements/test.txt b/requirements/test.txt index da738e0b..9249fdee 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -3,3 +3,4 @@ mock filelock pep8 +requests diff --git a/setup.py b/setup.py index 272e946e..2a4afec4 100644 --- a/setup.py +++ b/setup.py @@ -4,7 +4,6 @@ import os.path from setuptools import setup - NAME = 'iris_grib' PYPI_NAME = 'iris-grib' PACKAGE_DIR = os.path.abspath(os.path.dirname(__file__)) @@ -93,7 +92,7 @@ def file_walk_relative(top, remove=''): # PyPI, but the user is required to install eccodes itself manually. See # ECMWF ecCodes installation documentation for more information. install_requires=pip_requirements("setup", "core"), - test_suite = f'{NAME}.tests', + test_loader="unittest:TestLoader", extras_require={ "all": pip_requirements("all"), "test": pip_requirements("test"), From e2573c5af1b5f7e8e4a90a5d8028461cf1764e22 Mon Sep 17 00:00:00 2001 From: Bill Little Date: Tue, 2 Mar 2021 16:25:44 +0000 Subject: [PATCH 185/583] update build badge (#258) --- README.rst | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/README.rst b/README.rst index 3448e508..d951dd15 100644 --- a/README.rst +++ b/README.rst @@ -1,7 +1,7 @@ iris-grib ========= -|Travis|_ |Coveralls|_ +|CirrusCI|_ GRIB interface for `Iris `_. @@ -17,10 +17,7 @@ Copyright and licence iris-grib may be freely distributed, modified and used commercially under the terms of its `GNU LGPLv3 license `_. -\(C) British Crown Copyright 2010 - 2020, Met Office +\(C) British Crown Copyright 2010 - 2021, Met Office -.. |Travis| image:: https://travis-ci.org/SciTools/iris-grib.svg?branch=master -.. _Travis: https://travis-ci.org/SciTools/iris-grib - -.. |Coveralls| image:: https://coveralls.io/repos/github/SciTools/iris-grib/badge.svg?branch=master -.. _Coveralls: https://coveralls.io/github/SciTools/iris-grib?branch=master +.. |CirrusCI| image:: https://api.cirrus-ci.com/github/SciTools/iris-grib.svg?branch=master +.. _CirrusCI: https://cirrus-ci.com/github/SciTools/iris-grib From 7c9db59ab58f426ca6e0b9a58e1d28b0924008ad Mon Sep 17 00:00:00 2001 From: Bill Little Date: Tue, 2 Mar 2021 16:43:50 +0000 Subject: [PATCH 186/583] add coveralls badge (#259) --- README.rst | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.rst b/README.rst index d951dd15..ee3aa9a6 100644 --- a/README.rst +++ b/README.rst @@ -1,7 +1,7 @@ iris-grib ========= -|CirrusCI|_ +|CirrusCI|_ |Coveralls|_ GRIB interface for `Iris `_. @@ -21,3 +21,6 @@ terms of its `GNU LGPLv3 license `_. .. |CirrusCI| image:: https://api.cirrus-ci.com/github/SciTools/iris-grib.svg?branch=master .. _CirrusCI: https://cirrus-ci.com/github/SciTools/iris-grib + +.. |Coveralls| image:: https://coveralls.io/repos/github/SciTools/iris-grib/badge.svg?branch=master +.. _Coveralls: https://coveralls.io/github/SciTools/iris-grib?branch=master From 8036e13162f227d96b3369f63b31724a3038edf4 Mon Sep 17 00:00:00 2001 From: Bill Little Date: Thu, 8 Apr 2021 09:50:46 +0100 Subject: [PATCH 187/583] conda workaround in cirrus-ci for bad linux kernel version (#262) --- .cirrus.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.cirrus.yml b/.cirrus.yml index 7590017d..0e64f2ae 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -69,7 +69,9 @@ linux_task_template: &LINUX_TASK_TEMPLATE - wget --quiet https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh - echo "${CIRRUS_OS} $(sha256sum miniconda.sh)" - echo "$(date +%Y).$(expr $(date +%U) / ${CACHE_PERIOD}):${CONDA_CACHE_BUILD}" + - uname -r populate_script: + - export CONDA_OVERRIDE_LINUX="$(uname -r | cut -d'+' -f1)" - bash miniconda.sh -b -p ${HOME}/miniconda - conda config --set always_yes yes --set changeps1 no - conda config --set show_channel_urls True @@ -103,4 +105,5 @@ tests_task: name: "${CIRRUS_OS}: py${PY_VER} tests" << : *LINUX_TASK_TEMPLATE tests_script: + - export CONDA_OVERRIDE_LINUX="$(uname -r | cut -d'+' -f1)" - nox --session tests -- --test-data-dir ${IRIS_TEST_DATA_DIR}/test_data From 9cec4d641b30bedb5fbcfcd1fdafbba4403e3b5b Mon Sep 17 00:00:00 2001 From: Matt Wander <42675413+m1dr@users.noreply.github.com> Date: Tue, 27 Apr 2021 17:25:00 +0100 Subject: [PATCH 188/583] Add support for reg 92.1.8 where lon increment not given (#261) --- iris_grib/_load_convert.py | 19 +++++---- .../load_convert/test_calculate_increment.py | 4 ++ .../test_grid_definition_template_0_and_1.py | 41 +++++++++++++++---- 3 files changed, 49 insertions(+), 15 deletions(-) diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index 33c7e6a6..8f72b37a 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -487,12 +487,13 @@ def ellipsoid_geometry(section): return major, minor, radius -def _calculate_increment(first_grid_point, last_grid_point, num_intervals): - # Calculates the directional increment from the difference between - # the grid point values divided by the total number of intervals. - # Required by template 0 & 40 when no increment values are provided. - - return math.fabs(last_grid_point - first_grid_point) / num_intervals +def _calculate_increment(first_point, last_point, n_increments, mod=math.inf): + """ + Calculates the directional increment from the difference between the grid + point values divided by the total number of increments. Required by + template 0 & 40 when no increment values are provided. + """ + return (last_point - first_point) % mod / n_increments def grid_definition_template_0_and_1(section, metadata, y_name, x_name, cs): @@ -538,7 +539,8 @@ def grid_definition_template_0_and_1(section, metadata, y_name, x_name, cs): if res_flags.i_increments_given else _calculate_increment(section['longitudeOfFirstGridPoint'], section['longitudeOfLastGridPoint'], - section['Ni'] - 1)) + section['Ni'] - 1, + 360.0 / _GRID_ACCURACY_IN_DEGREES)) x_inc *= _GRID_ACCURACY_IN_DEGREES x_offset = section['longitudeOfFirstGridPoint'] * _GRID_ACCURACY_IN_DEGREES x_direction = -1 if scan.i_negative else 1 @@ -1071,7 +1073,8 @@ def grid_definition_template_40_regular(section, metadata, cs): if res_flags.i_increments_given else _calculate_increment(section['longitudeOfFirstGridPoint'], section['longitudeOfLastGridPoint'], - section['Ni'] - 1)) + section['Ni'] - 1, + 360.0 / _GRID_ACCURACY_IN_DEGREES)) x_inc *= _GRID_ACCURACY_IN_DEGREES x_offset = section['longitudeOfFirstGridPoint'] * _GRID_ACCURACY_IN_DEGREES x_direction = -1 if scan.i_negative else 1 diff --git a/iris_grib/tests/unit/load_convert/test_calculate_increment.py b/iris_grib/tests/unit/load_convert/test_calculate_increment.py index 3b959a01..e43d93d9 100644 --- a/iris_grib/tests/unit/load_convert/test_calculate_increment.py +++ b/iris_grib/tests/unit/load_convert/test_calculate_increment.py @@ -24,6 +24,10 @@ def test_positive(self): result = _calculate_increment(-5, 5, 10) self.assertEqual(result, 1) + def test_with_mod(self): + result = _calculate_increment(355, 5, 10, 360) + self.assertEqual(result, 1) + if __name__ == '__main__': tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_0_and_1.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_0_and_1.py index f11d1269..c1487ff2 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_0_and_1.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_0_and_1.py @@ -49,18 +49,17 @@ def section_3(self): }) return section - def expected(self, x_dim, y_dim, x_neg=True, y_neg=True): + def expected(self, x_dim, y_dim, x_points, y_points, x_neg=True, + y_neg=True): # Prepare the expectation. expected = empty_metadata() cs = iris.coord_systems.GeogCS(6367470) - x_points = np.array([0., 1., 2., 3., 4., 5.]) if x_neg: x_points = x_points[::-1] x = iris.coords.DimCoord(x_points, standard_name='longitude', units='degrees', coord_system=cs) - y_points = np.array([0., 1., 2., 3., 4., 5.]) if y_neg: y_points = y_points[::-1] y = iris.coords.DimCoord(y_points, @@ -77,7 +76,10 @@ def test_without_increments(self): cs = iris.coord_systems.GeogCS(6367470) grid_definition_template_0_and_1(section, metadata, 'latitude', 'longitude', cs) - expected = self.expected(1, 0, x_neg=False, y_neg=False) + x_points = np.array([0., 1., 2., 3., 4., 5.]) + y_points = np.array([0., 1., 2., 3., 4., 5.]) + expected = self.expected(1, 0, x_points, y_points, x_neg=False, + y_neg=False) self.assertEqual(metadata, expected) def test_with_increments(self): @@ -89,7 +91,10 @@ def test_with_increments(self): cs = iris.coord_systems.GeogCS(6367470) grid_definition_template_0_and_1(section, metadata, 'latitude', 'longitude', cs) - expected = self.expected(1, 0, x_neg=False, y_neg=False) + x_points = np.array([0., 1., 2., 3., 4., 5.]) + y_points = np.array([0., 1., 2., 3., 4., 5.]) + expected = self.expected(1, 0, x_points, y_points, x_neg=False, + y_neg=False) self.assertEqual(metadata, expected) def test_with_i_not_j_increment(self): @@ -100,7 +105,10 @@ def test_with_i_not_j_increment(self): cs = iris.coord_systems.GeogCS(6367470) grid_definition_template_0_and_1(section, metadata, 'latitude', 'longitude', cs) - expected = self.expected(1, 0, x_neg=False, y_neg=False) + x_points = np.array([0., 1., 2., 3., 4., 5.]) + y_points = np.array([0., 1., 2., 3., 4., 5.]) + expected = self.expected(1, 0, x_points, y_points, x_neg=False, + y_neg=False) self.assertEqual(metadata, expected) def test_with_j_not_i_increment(self): @@ -111,7 +119,26 @@ def test_with_j_not_i_increment(self): cs = iris.coord_systems.GeogCS(6367470) grid_definition_template_0_and_1(section, metadata, 'latitude', 'longitude', cs) - expected = self.expected(1, 0, x_neg=False, y_neg=False) + x_points = np.array([0., 1., 2., 3., 4., 5.]) + y_points = np.array([0., 1., 2., 3., 4., 5.]) + expected = self.expected(1, 0, x_points, y_points, x_neg=False, + y_neg=False) + self.assertEqual(metadata, expected) + + def test_without_increments_crossing_0_lon(self): + section = self.section_3() + section['longitudeOfFirstGridPoint'] = 355000000 + section['Ni'] = 11 + metadata = empty_metadata() + cs = iris.coord_systems.GeogCS(6367470) + grid_definition_template_0_and_1(section, metadata, 'latitude', + 'longitude', cs) + x_points = np.array( + [355., 356., 357., 358., 359., 360., 361., 362., 363., 364., 365.] + ) + y_points = np.array([0., 1., 2., 3., 4., 5.]) + expected = self.expected(1, 0, x_points, y_points, x_neg=False, + y_neg=False) self.assertEqual(metadata, expected) From bdb8c638549cf22beaa3582ee9c1f5bdd45867d5 Mon Sep 17 00:00:00 2001 From: lbdreyer Date: Wed, 12 May 2021 15:13:19 +0100 Subject: [PATCH 189/583] Add data template number 42 to the list of supported templates (#264) --- iris_grib/_load_convert.py | 2 +- .../test_data_representation_section.py | 38 +++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 iris_grib/tests/unit/load_convert/test_data_representation_section.py diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index 8f72b37a..f27c551d 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -2515,7 +2515,7 @@ def data_representation_section(section): template = section['dataRepresentationTemplateNumber'] # Supported templates for both grid point and spectral data: - grid_point_templates = (0, 1, 2, 3, 4, 40, 41, 61) + grid_point_templates = (0, 1, 2, 3, 4, 40, 41, 42, 61) spectral_templates = (50, 51) supported_templates = grid_point_templates + spectral_templates diff --git a/iris_grib/tests/unit/load_convert/test_data_representation_section.py b/iris_grib/tests/unit/load_convert/test_data_representation_section.py new file mode 100644 index 00000000..e4992ed5 --- /dev/null +++ b/iris_grib/tests/unit/load_convert/test_data_representation_section.py @@ -0,0 +1,38 @@ +# Copyright iris-grib contributors +# +# This file is part of iris-grib and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. +""" +Test function :func:`iris_grib._load_convert.data_representation_section.` + +""" + +# import iris_grib.tests first so that some things can be initialised +# before importing anything else. +import iris_grib.tests as tests + +from iris.exceptions import TranslationError + +from iris_grib._load_convert import data_representation_section +from iris_grib.tests.unit import _make_test_message + + +class Test(tests.IrisGribTest): + def test_supported_templates(self): + template_nums = [0, 1, 2, 3, 4, 40, 41, 42, 50, 51, 61] + for template_num in template_nums: + message = _make_test_message( + {5: {'dataRepresentationTemplateNumber': template_num}}) + data_representation_section(message.sections[5]) + + def test_unsupported_template(self): + message = _make_test_message( + {5: {'dataRepresentationTemplateNumber': 5}}) + err_msg = r'Template \[5\] is not supported' + with self.assertRaisesRegex(TranslationError, err_msg): + data_representation_section(message.sections[5]) + + +if __name__ == '__main__': + tests.main() From 665df606de7b966886cd2b74ca9421f3207be9d0 Mon Sep 17 00:00:00 2001 From: Bill Little Date: Sun, 23 May 2021 08:21:33 +0100 Subject: [PATCH 190/583] add badges (#268) --- README.rst | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/README.rst b/README.rst index ee3aa9a6..6e379cb0 100644 --- a/README.rst +++ b/README.rst @@ -1,7 +1,7 @@ iris-grib ========= -|CirrusCI|_ |Coveralls|_ +|CirrusCI|_ |Coveralls|_ |conda-forge|_ |pypi|_ |License|_ |Commits|_ |Contributors|_ GRIB interface for `Iris `_. @@ -24,3 +24,18 @@ terms of its `GNU LGPLv3 license `_. .. |Coveralls| image:: https://coveralls.io/repos/github/SciTools/iris-grib/badge.svg?branch=master .. _Coveralls: https://coveralls.io/github/SciTools/iris-grib?branch=master + +.. |conda-forge| image:: https://img.shields.io/conda/vn/conda-forge/iris-grib?color=orange&label=conda-forge&logo=conda-forge&logoColor=white +.. _conda-forge: https://anaconda.org/conda-forge/iris-grib + +.. |pypi| image:: https://img.shields.io/pypi/v/iris-grib?color=orange&label=pypi&logo=python&logoColor=white +.. _pypi: https://pypi.org/project/iris-grib + +.. |License| image:: https://img.shields.io/github/license/SciTools/iris-grib?style=plastic +.. _License: https://github.com/SciTools/iris-grib/blob/master/COPYING + +.. |Contributors| image:: https://img.shields.io/github/contributors/SciTools/iris-grib?style=plastic +.. _Contributors: https://github.com/SciTools/iris-grib/graphs/contributors + +.. |Commits| image:: https://img.shields.io/github/commits-since/SciTools/iris-grib/latest.svg?style=plastic +.. _Commits: https://github.com/SciTools/iris-grib/commits/master \ No newline at end of file From 99d43447444e46f1a909d665ea7b4a89fb5c949d Mon Sep 17 00:00:00 2001 From: Tom Dufall Date: Tue, 25 May 2021 11:17:49 +0100 Subject: [PATCH 191/583] Fix Iris dev guide link (#267) The Iris dev guide has moved - update the link to the new location --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8952a210..6275cf90 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -14,7 +14,7 @@ Getting started 2. Fork the iris-grib repository, create your new fix/feature branch, and start commiting code. - The main - [Iris development guide](http://scitools.org.uk/iris/docs/latest/developers_guide/gitwash/git_development.html) + [Iris development guide](https://scitools-iris.readthedocs.io/en/latest/developers_guide/gitwash/index.html) has more detail. 3. Remember to add appropriate documentation and tests to supplement any new or changed functionality. From e78018c87849c60cb259d7b2294977cd265cb77e Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Tue, 6 Jul 2021 16:08:00 +0100 Subject: [PATCH 192/583] Various testing fixes (#283) * Update noxfile.py * Test against python 3.7,3.8; Run all tests, only once. * Update cirrus.yml too * Fix matrix usage in cirrus.yml * Remove now-unneeded _array_slice_ifempty calls. * Removed obsolete test. * Make separate cirrus tasks for iris version options. * Fix cirrus task naming. --- .cirrus.yml | 24 ++++++--- iris_grib/__init__.py | 19 +++---- iris_grib/message.py | 49 +++++++++---------- .../tests/unit/message/test__DataProxy.py | 26 ---------- noxfile.py | 10 ++-- 5 files changed, 50 insertions(+), 78 deletions(-) diff --git a/.cirrus.yml b/.cirrus.yml index 0e64f2ae..186fc951 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -96,13 +96,23 @@ linux_task_template: &LINUX_TASK_TEMPLATE tests_task: matrix: - env: - PY_VER: 3.6 - env: - PY_VER: 3.7 - # env: - # PY_VER: 3.8 - name: "${CIRRUS_OS}: py${PY_VER} tests" + - name: "${CIRRUS_OS} tests: iris=repo-main python=3.7" + env: + PY_VER: 3.7 + IRIS_SOURCE: "source" + - name: "${CIRRUS_OS} tests: iris=repo-main python=3.8" + env: + PY_VER: 3.8 + IRIS_SOURCE: "source" + - name: "${CIRRUS_OS} tests: iris=conda-release python=3.7" + env: + PY_VER: 3.7 + IRIS_SOURCE: "conda-forge" + - name: "${CIRRUS_OS} tests: iris=conda-release python=3.8" + env: + PY_VER: 3.8 + IRIS_SOURCE: "conda-forge" + << : *LINUX_TASK_TEMPLATE tests_script: - export CONDA_OVERRIDE_LINUX="$(uname -r | cut -d'+' -f1)" diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index ae718c6e..03f42cbc 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -25,7 +25,6 @@ from iris._lazy_data import as_lazy_data import iris.coord_systems as coord_systems from iris.exceptions import TranslationError, NotYetImplementedError -from iris.util import _array_slice_ifempty from . import grib_phenom_translation as gptx from . import _save_rules @@ -98,17 +97,13 @@ def ndim(self): return len(self.shape) def __getitem__(self, keys): - # Avoid fetching file data just to return an 'empty' result. - # Needed because of how dask.array.from_array behaves since Dask v2.0. - result = _array_slice_ifempty(keys, self.shape, self.dtype) - if result is None: - with open(self.path, 'rb') as grib_fh: - grib_fh.seek(self.offset) - grib_message = gribapi.grib_new_from_file(grib_fh) - data = _message_values(grib_message, self.shape) - gribapi.grib_release(grib_message) - - result = data.__getitem__(keys) + with open(self.path, 'rb') as grib_fh: + grib_fh.seek(self.offset) + grib_message = gribapi.grib_new_from_file(grib_fh) + data = _message_values(grib_message, self.shape) + gribapi.grib_release(grib_message) + + result = data.__getitem__(keys) return result diff --git a/iris_grib/message.py b/iris_grib/message.py index 503d4cd6..21ea52a7 100644 --- a/iris_grib/message.py +++ b/iris_grib/message.py @@ -12,7 +12,6 @@ import re import gribapi -from iris_grib import _array_slice_ifempty import numpy as np import numpy.ma as ma @@ -233,32 +232,28 @@ def __getitem__(self, keys): # NB. Currently assumes that the validity of this interpretation # is checked before this proxy is created. - # Avoid fetching file data just to return an 'empty' result. - # Needed because of how dask.array.from_array behaves since Dask v2.0. - result = _array_slice_ifempty(keys, self.shape, self.dtype) - if result is None: - message = self.recreate_raw() - sections = message.sections - bitmap_section = sections[6] - bitmap = self._bitmap(bitmap_section) - data = sections[7]['codedValues'] - - if bitmap is not None: - # Note that bitmap and data are both 1D arrays at this point. - if np.count_nonzero(bitmap) == data.shape[0]: - # Only the non-masked values are included in codedValues. - _data = np.empty(shape=bitmap.shape) - _data[bitmap.astype(bool)] = data - # `ma.masked_array` masks where input = 1, the opposite of - # the behaviour specified by the GRIB spec. - data = ma.masked_array(_data, mask=np.logical_not(bitmap), - fill_value=np.nan) - else: - msg = 'Shapes of data and bitmap do not match.' - raise TranslationError(msg) - - data = data.reshape(self.shape) - result = data.__getitem__(keys) + message = self.recreate_raw() + sections = message.sections + bitmap_section = sections[6] + bitmap = self._bitmap(bitmap_section) + data = sections[7]['codedValues'] + + if bitmap is not None: + # Note that bitmap and data are both 1D arrays at this point. + if np.count_nonzero(bitmap) == data.shape[0]: + # Only the non-masked values are included in codedValues. + _data = np.empty(shape=bitmap.shape) + _data[bitmap.astype(bool)] = data + # `ma.masked_array` masks where input = 1, the opposite of + # the behaviour specified by the GRIB spec. + data = ma.masked_array(_data, mask=np.logical_not(bitmap), + fill_value=np.nan) + else: + msg = 'Shapes of data and bitmap do not match.' + raise TranslationError(msg) + + data = data.reshape(self.shape) + result = data.__getitem__(keys) return result diff --git a/iris_grib/tests/unit/message/test__DataProxy.py b/iris_grib/tests/unit/message/test__DataProxy.py index d7494d5e..b828c97c 100644 --- a/iris_grib/tests/unit/message/test__DataProxy.py +++ b/iris_grib/tests/unit/message/test__DataProxy.py @@ -43,31 +43,5 @@ def test_bitmap__invalid_indicator(self): data_proxy._bitmap(section_6) -class Test_emptyfetch(tests.IrisGribTest): - # See : - # iris.tests.unit.fileformats.pp.test_PPDataProxy.Test__getitem__slicing - # In this case, test *only* the no-data-read effect, not the method which - # is part of Iris. - def test_empty_slice(self): - # Check behaviour of the getitem call with an 'empty' slicing. - # This is necessary because, since Dask 2.0, the "from_array" function - # takes a zero-length slice of its array argument, to capture array - # metadata, and in those cases we want to avoid file access. - test_dtype = np.dtype(np.float32) - mock_datafetch = mock.MagicMock() - proxy = _DataProxy(shape=(3, 4), - dtype=np.dtype(np.float32), - recreate_raw=mock_datafetch) - - # Test the special no-data indexing operation. - result = proxy[0:0, 0:0] - - # Check the behaviour and results were as expected. - self.assertEqual(mock_datafetch.call_count, 0) - self.assertIsInstance(result, np.ndarray) - self.assertEqual(result.dtype, test_dtype) - self.assertEqual(result.shape, (0, 0)) - - if __name__ == '__main__': tests.main() diff --git a/noxfile.py b/noxfile.py index e9a029fe..fa801a49 100644 --- a/noxfile.py +++ b/noxfile.py @@ -25,7 +25,7 @@ PACKAGE = str("iris_grib") #: Cirrus-CI environment variable hook. -PY_VER = os.environ.get("PY_VER", ["3.6", "3.7"]) +PY_VER = os.environ.get("PY_VER", ["3.7", "3.8"]) IRIS_SOURCE = os.environ.get("IRIS_SOURCE", ['source', 'conda-forge']) #: Default cartopy cache directory. @@ -284,14 +284,14 @@ def tests(session, iris): iris_dir = f"{session.create_tmp()}/iris" if os.path.exists(iris_dir): - # cached. update by pulling from origin/master + # cached. update by pulling from origin/main session.run( "git", "-C", iris_dir, "pull", "origin", - "master", + "main", external=True # use git from host environment ) else: @@ -330,8 +330,6 @@ def tests(session, iris): "-m", "iris_grib.tests.runner", "--default-tests", - "--unit-tests", - "--integration-tests", ) @@ -385,4 +383,4 @@ def linkcheck(session): "make", "linkcheck", external=True, - ) \ No newline at end of file + ) From 832b526f960ec3f4b495ad81bb7d3d11b12769ae Mon Sep 17 00:00:00 2001 From: lbdreyer Date: Fri, 4 Mar 2022 11:12:48 +0000 Subject: [PATCH 193/583] Mergeback v0.17.x back on to main (#289) --- .cirrus.yml | 63 ++-- .flake8 | 4 + docs/conf.py | 2 +- docs/index.rst | 2 +- docs/ref/release_notes.rst | 52 +++ iris_grib/__init__.py | 5 +- iris_grib/_grib1_load_rules.py | 263 ++++++++++---- iris_grib/_load_convert.py | 2 +- iris_grib/_save_rules.py | 3 +- iris_grib/grib_phenom_translation.py | 1 + iris_grib/tests/__init__.py | 4 +- .../load_convert/test_load_hybrid_coords.py | 2 +- .../test_grid_definition_section.py | 2 - .../save_rules/test_save_hybrid_coords.py | 1 - iris_grib/tests/test_license_headers.py | 1 - iris_grib/tests/unit/__init__.py | 8 +- .../load_convert/test_ensemble_identifier.py | 4 +- .../test_grid_definition_template_10.py | 1 - .../test_product_definition_template_10.py | 2 - .../test_product_definition_template_15.py | 7 +- .../test_product_definition_template_31.py | 5 - .../test_product_definition_template_32.py | 7 - .../load_convert/test_satellite_common.py | 2 - .../test_statistical_cell_method.py | 6 +- .../test_statistical_forecast_period_coord.py | 6 +- .../load_convert/test_translate_phenomenon.py | 2 - .../tests/unit/message/test_GribMessage.py | 4 +- .../tests/unit/message/test__DataProxy.py | 3 - .../unit/message/test__RawGribMessage.py | 2 +- iris_grib/tests/unit/save_rules/__init__.py | 3 +- .../test__missing_forecast_period.py | 3 - .../test__non_missing_forecast_period.py | 2 - .../test_grid_definition_template_10.py | 1 - .../test_grid_definition_template_12.py | 1 - .../test_grid_definition_template_30.py | 1 - .../test_product_definition_template_1.py | 2 +- .../unit/save_rules/test_set_time_range.py | 2 +- iris_grib/tests/unit/test_GribWrapper.py | 8 +- iris_grib/tests/unit/test__load_generate.py | 3 - iris_grib/tests/unit/test_load_cubes.py | 1 - noxfile.py | 333 +++++++++--------- requirements/ci/py36.yml | 24 -- requirements/ci/py37.yml | 2 +- requirements/ci/py38.yml | 4 +- requirements/core.txt | 2 +- requirements/nox.lock/py37-linux-64.lock | 127 +++++++ requirements/nox.lock/py38-linux-64.lock | 125 +++++++ setup.py | 2 +- 48 files changed, 728 insertions(+), 384 deletions(-) create mode 100644 .flake8 delete mode 100644 requirements/ci/py36.yml create mode 100644 requirements/nox.lock/py37-linux-64.lock create mode 100644 requirements/nox.lock/py38-linux-64.lock diff --git a/.cirrus.yml b/.cirrus.yml index 186fc951..16e1a116 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -24,7 +24,7 @@ env: NOX_CACHE_BUILD: "98" # Increment the build number to force new pip cache upload. PIP_CACHE_BUILD: "98" - # Pip package to be upgraded/installed. + # Pip packages to be upgraded/installed. PIP_CACHE_PACKAGES: "pip setuptools wheel nox pyyaml" # Base directory for the iris-test-data. IRIS_TEST_DATA_DIR: ${HOME}/iris-test-data @@ -33,22 +33,22 @@ env: # # Linting -# [2021-03-01] jamesp: Currently not black or flake compliant. -# GitHub issues open #251 and #252 -# lint_task: -# auto_cancellation: true -# name: "${CIRRUS_OS}: flake8 and black" -# pip_cache: -# folder: ~/.cache/pip -# fingerprint_script: -# - echo "${CIRRUS_TASK_NAME}" -# - echo "$(date +%Y).$(expr $(date +%U) / ${CACHE_PERIOD}):${PIP_CACHE_BUILD} ${PIP_CACHE_PACKAGES}" -# lint_script: -# - pip list -# - python -m pip install --retries 3 --upgrade ${PIP_CACHE_PACKAGES} -# - pip list -# - nox --session flake8 -# - nox --session black +# [2021-03-01] jamesp: Currently not black compliant. +# GitHub issue open #251 +lint_task: + auto_cancellation: true + name: "${CIRRUS_OS}: flake8" # and black + pip_cache: + folder: ~/.cache/pip + fingerprint_script: + - echo "${CIRRUS_TASK_NAME}" + - echo "$(date +%Y).$(expr $(date +%U) / ${CACHE_PERIOD}):${PIP_CACHE_BUILD} ${PIP_CACHE_PACKAGES}" + lint_script: + - pip list + - python -m pip install --retries 3 --upgrade ${PIP_CACHE_PACKAGES} + - pip list + - nox --session flake8 +# - nox --session black # @@ -80,10 +80,10 @@ linux_task_template: &LINUX_TASK_TEMPLATE - conda install --quiet --name base nox pip coverage pyyaml nox_cache: folder: ${CIRRUS_WORKING_DIR}/.nox + reupload_on_changes: true fingerprint_script: - echo "${CIRRUS_TASK_NAME}" - - echo "$(date +%Y).$(expr $(date +%U) / ${CACHE_PERIOD}):${NOX_CACHE_BUILD}" - - sha256sum ${CIRRUS_WORKING_DIR}/requirements/ci/py$(echo ${PY_VER} | tr -d ".").yml + - echo "${NOX_CACHE_BUILD}" - echo "IRIS ${IRIS_SOURCE}" data_cache: folder: ${IRIS_TEST_DATA_DIR} @@ -96,14 +96,12 @@ linux_task_template: &LINUX_TASK_TEMPLATE tests_task: matrix: - - name: "${CIRRUS_OS} tests: iris=repo-main python=3.7" - env: - PY_VER: 3.7 - IRIS_SOURCE: "source" - - name: "${CIRRUS_OS} tests: iris=repo-main python=3.8" - env: - PY_VER: 3.8 - IRIS_SOURCE: "source" + # TODO: iris-grib does not currently work with iris-main, see Github issue + # #288 and #277. + #- name: "${CIRRUS_OS} tests: iris=repo-main python=3.8" + # env: + # PY_VER: 3.8 + # IRIS_SOURCE: "source" - name: "${CIRRUS_OS} tests: iris=conda-release python=3.7" env: PY_VER: 3.7 @@ -117,3 +115,14 @@ tests_task: tests_script: - export CONDA_OVERRIDE_LINUX="$(uname -r | cut -d'+' -f1)" - nox --session tests -- --test-data-dir ${IRIS_TEST_DATA_DIR}/test_data + +# [2021-06-07] lbdreyer: Doctests are failing, see Github Issue #274 +#doctest_task: +# matrix: +# env: +# PY_VER: 3.7 +# name: "${CIRRUS_OS}: py${PY_VER} tests" +# << : *LINUX_TASK_TEMPLATE +# tests_script: +# - export CONDA_OVERRIDE_LINUX="$(uname -r | cut -d'+' -f1)" +# - nox --session doctest -- --test-data-dir ${IRIS_TEST_DATA_DIR}/test_data diff --git a/.flake8 b/.flake8 new file mode 100644 index 00000000..2a930a03 --- /dev/null +++ b/.flake8 @@ -0,0 +1,4 @@ +[flake8] +exclude = + # Auto-generated file + iris_grib/_grib_cf_map.py diff --git a/docs/conf.py b/docs/conf.py index 02c79205..b901678e 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -50,7 +50,7 @@ # General information about the project. project = u'iris-grib' -copyright = u'2016, Met Office' +copyright = u'2021, Met Office' author = u'Met Office' # The version info for the project you're documenting, acts as replacement for diff --git a/docs/index.rst b/docs/index.rst index 4fec281c..69cf2147 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -3,7 +3,7 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -Iris-grib v0.16 +Iris-grib v0.17 =============== The library ``iris-grib`` provides functionality for converting between weather and diff --git a/docs/ref/release_notes.rst b/docs/ref/release_notes.rst index dc361c14..766b33e4 100644 --- a/docs/ref/release_notes.rst +++ b/docs/ref/release_notes.rst @@ -2,6 +2,58 @@ Release Notes ============= +What's new in iris-grib v0.17.1 +------------------------------- + +:Release: 0.17.1 +:Date: 8 June 2021 + +Bugs Fixed +^^^^^^^^^^ + +* `@TomDufall `_ removed the empty slice + handling (originally added in v0.15.1) as this used + iris.util._array_slice_ifempty which was removed in Iris v3.0.2 and is no + longer necessary. + `(PR#270) `_ + + +Dependencies +^^^^^^^^^^^^ + +* now requires Iris version >= 3.0.2. + +* now requires Python version >= 3.7. + + + +What's new in iris-grib v0.17 +----------------------------- + +:Release: 0.17.0 +:Date: 18 May 2021 + +Features +^^^^^^^^ + +* `@m1dr `_ added support for GRIB regulation 92.1.8 + for loading GRIB files where the longitude increment is not given. + `(PR#261) `_ + +* `@lbdreyer `_ added support for loading grid + point and spectral data with CCSDS recommended lossless compression, i.e. + data representation template 42. + `(PR#264) `_ + + +Internal +^^^^^^^^ + +* `@jamesp `_ moved CI testing to Cirrus CI. + `(PR#250) `_ + + + What's new in iris-grib v0.16 ----------------------------- diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index 03f42cbc..09c0f4b8 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -12,7 +12,6 @@ import datetime import math # for fmod -import warnings import cartopy.crs as ccrs import cf_units @@ -21,7 +20,7 @@ import numpy.ma as ma # NOTE: careful here, to avoid circular imports (as iris imports grib) -import iris +import iris # noqa: F401 from iris._lazy_data import as_lazy_data import iris.coord_systems as coord_systems from iris.exceptions import TranslationError, NotYetImplementedError @@ -32,7 +31,7 @@ from .message import GribMessage -__version__ = '0.17.dev0' +__version__ = '0.18.dev0' __all__ = ['load_cubes', 'save_grib2', 'load_pairs_from_fields', 'save_pairs_from_cube', 'save_messages'] diff --git a/iris_grib/_grib1_load_rules.py b/iris_grib/_grib1_load_rules.py index fd537442..4520097e 100644 --- a/iris_grib/_grib1_load_rules.py +++ b/iris_grib/_grib1_load_rules.py @@ -7,16 +7,13 @@ # Historically this was auto-generated from # SciTools/iris-code-generators:tools/gen_rules.py -import warnings from cf_units import CALENDAR_GREGORIAN, Unit -import numpy as np from iris.aux_factory import HybridPressureFactory from iris.coords import AuxCoord, CellMethod, DimCoord from iris.exceptions import TranslationError -from iris.fileformats.rules import (ConversionMetadata, Factory, Reference, - ReferenceTarget) +from iris.fileformats.rules import (ConversionMetadata, Factory, Reference) def grib1_convert(grib): @@ -47,50 +44,82 @@ def grib1_convert(grib): dim_coords_and_dims = [] aux_coords_and_dims = [] - if \ - (grib.gridType=="reduced_gg"): - aux_coords_and_dims.append((AuxCoord(grib._y_points, grib._y_coord_name, units='degrees', coord_system=grib._coord_system), 0)) - aux_coords_and_dims.append((AuxCoord(grib._x_points, grib._x_coord_name, units='degrees', coord_system=grib._coord_system), 0)) - - if \ - (grib.gridType=="regular_ll") and \ - (grib.jPointsAreConsecutive == 0): - dim_coords_and_dims.append((DimCoord(grib._y_points, grib._y_coord_name, units='degrees', coord_system=grib._coord_system), 0)) - dim_coords_and_dims.append((DimCoord(grib._x_points, grib._x_coord_name, units='degrees', coord_system=grib._coord_system, circular=grib._x_circular), 1)) - - if \ - (grib.gridType=="regular_ll") and \ - (grib.jPointsAreConsecutive == 1): - dim_coords_and_dims.append((DimCoord(grib._y_points, grib._y_coord_name, units='degrees', coord_system=grib._coord_system), 1)) - dim_coords_and_dims.append((DimCoord(grib._x_points, grib._x_coord_name, units='degrees', coord_system=grib._coord_system, circular=grib._x_circular), 0)) - - if \ - (grib.gridType=="regular_gg") and \ - (grib.jPointsAreConsecutive == 0): - dim_coords_and_dims.append((DimCoord(grib._y_points, grib._y_coord_name, units='degrees', coord_system=grib._coord_system), 0)) - dim_coords_and_dims.append((DimCoord(grib._x_points, grib._x_coord_name, units='degrees', coord_system=grib._coord_system, circular=grib._x_circular), 1)) - - if \ - (grib.gridType=="regular_gg") and \ - (grib.jPointsAreConsecutive == 1): - dim_coords_and_dims.append((DimCoord(grib._y_points, grib._y_coord_name, units='degrees', coord_system=grib._coord_system), 1)) - dim_coords_and_dims.append((DimCoord(grib._x_points, grib._x_coord_name, units='degrees', coord_system=grib._coord_system, circular=grib._x_circular), 0)) - - if \ - (grib.gridType=="rotated_ll") and \ - (grib.jPointsAreConsecutive == 0): - dim_coords_and_dims.append((DimCoord(grib._y_points, grib._y_coord_name, units='degrees', coord_system=grib._coord_system), 0)) - dim_coords_and_dims.append((DimCoord(grib._x_points, grib._x_coord_name, units='degrees', coord_system=grib._coord_system, circular=grib._x_circular), 1)) - - if \ - (grib.gridType=="rotated_ll") and \ - (grib.jPointsAreConsecutive == 1): - dim_coords_and_dims.append((DimCoord(grib._y_points, grib._y_coord_name, units='degrees', coord_system=grib._coord_system), 1)) - dim_coords_and_dims.append((DimCoord(grib._x_points, grib._x_coord_name, units='degrees', coord_system=grib._coord_system, circular=grib._x_circular), 0)) - - if grib.gridType in ["polar_stereographic", "lambert"]: - dim_coords_and_dims.append((DimCoord(grib._y_points, grib._y_coord_name, units="m", coord_system=grib._coord_system), 0)) - dim_coords_and_dims.append((DimCoord(grib._x_points, grib._x_coord_name, units="m", coord_system=grib._coord_system), 1)) + if grib.gridType == "reduced_gg": + aux_coords_and_dims.append( + ( + AuxCoord( + grib._y_points, + grib._y_coord_name, + units='degrees', + coord_system=grib._coord_system, + ), + 0 + ) + ) + aux_coords_and_dims.append( + ( + AuxCoord( + grib._x_points, + grib._x_coord_name, + units='degrees', + coord_system=grib._coord_system, + ), + 0 + ) + ) + elif grib.gridType in ("regular_ll", "rotated_ll", "regular_gg"): + j_points_are_consecutive = grib.jPointsAreConsecutive + + if j_points_are_consecutive not in (0, 1): + raise ValueError + + dim_coords_and_dims.append( + ( + DimCoord( + grib._y_points, + grib._y_coord_name, + units='degrees', + coord_system=grib._coord_system, + ), + j_points_are_consecutive + ) + ) + dim_coords_and_dims.append( + ( + DimCoord( + grib._x_points, + grib._x_coord_name, + units='degrees', + coord_system=grib._coord_system, + circular=grib._x_circular, + ), + int(not(j_points_are_consecutive)) + ) + ) + + elif grib.gridType in ["polar_stereographic", "lambert"]: + dim_coords_and_dims.append( + ( + DimCoord( + grib._y_points, + grib._y_coord_name, + units="m", + coord_system=grib._coord_system, + ), + 0 + ) + ) + dim_coords_and_dims.append( + ( + DimCoord( + grib._x_points, + grib._x_coord_name, + units="m", + coord_system=grib._coord_system, + ), + 1 + ) + ) if \ (grib.table2Version < 128) and \ @@ -122,19 +151,38 @@ def grib1_convert(grib): if \ (grib.table2Version >= 128) and \ (grib._cf_data is None): - long_name = "UNKNOWN LOCAL PARAM " + str(grib.indicatorOfParameter) + "." + str(grib.table2Version) + long_name = f"UNKNOWN LOCAL PARAM {grib.indicatorOfParameter}"\ + f".{grib.table2Version}" units = "???" if \ (grib.table2Version == 1) and \ (grib.indicatorOfParameter >= 128): - long_name = "UNKNOWN LOCAL PARAM " + str(grib.indicatorOfParameter) + "." + str(grib.table2Version) + long_name = f"UNKNOWN LOCAL PARAM {grib.indicatorOfParameter}"\ + f".{grib.table2Version}" units = "???" - if \ - (grib._phenomenonDateTime != -1.0): - aux_coords_and_dims.append((DimCoord(points=grib.startStep, standard_name='forecast_period', units=grib._forecastTimeUnit), None)) - aux_coords_and_dims.append((DimCoord(points=grib.phenomenon_points('hours'), standard_name='time', units=Unit('hours since epoch', CALENDAR_GREGORIAN)), None)) + if grib._phenomenonDateTime != -1.0: + aux_coords_and_dims.append( + ( + DimCoord( + points=grib.startStep, + standard_name='forecast_period', + units=grib._forecastTimeUnit, + ), + None + ) + ) + aux_coords_and_dims.append( + ( + DimCoord( + points=grib.phenomenon_points('hours'), + standard_name='time', + units=Unit('hours since epoch', CALENDAR_GREGORIAN), + ), + None + ) + ) def add_bounded_time_coords(aux_coords_and_dims, grib): t_bounds = grib.phenomenon_bounds('hours') @@ -222,29 +270,94 @@ def add_bounded_time_coords(aux_coords_and_dims, grib): add_bounded_time_coords(aux_coords_and_dims, grib) cell_methods.append(CellMethod("standard_deviation", coords="time")) - if \ - (grib.levelType == 'pl'): - aux_coords_and_dims.append((DimCoord(points=grib.level, long_name="pressure", units="hPa"), None)) - - if \ - (grib.levelType == 'sfc'): - - if (grib._cf_data is not None) and \ - (grib._cf_data.set_height is not None): - aux_coords_and_dims.append((DimCoord(points=grib._cf_data.set_height, long_name="height", units="m", attributes={'positive':'up'}), None)) - elif grib.typeOfLevel == 'heightAboveGround': # required for NCAR - aux_coords_and_dims.append((DimCoord(points=grib.level, long_name="height", units="m", attributes={'positive':'up'}), None)) - - if \ - (grib.levelType == 'ml') and \ - (hasattr(grib, 'pv')): - aux_coords_and_dims.append((AuxCoord(grib.level, standard_name='model_level_number', units=1, attributes={'positive': 'up'}), None)) - aux_coords_and_dims.append((DimCoord(grib.pv[grib.level], long_name='level_pressure', units='Pa'), None)) - aux_coords_and_dims.append((AuxCoord(grib.pv[grib.numberOfCoordinatesValues//2 + grib.level], long_name='sigma', units=1), None)) - factories.append(Factory(HybridPressureFactory, [{'long_name': 'level_pressure'}, {'long_name': 'sigma'}, Reference('surface_pressure')])) + if grib.levelType == 'pl': + aux_coords_and_dims.append( + ( + DimCoord( + points=grib.level, long_name="pressure", units="hPa" + ), + None + ) + ) + + if grib.levelType == 'sfc': + if grib._cf_data is not None and grib._cf_data.set_height is not None: + aux_coords_and_dims.append( + ( + DimCoord( + points=grib._cf_data.set_height, + long_name="height", + units="m", + attributes={'positive': 'up'}, + ), + None + ) + ) + elif grib.typeOfLevel == 'heightAboveGround': # required for NCAR + aux_coords_and_dims.append( + ( + DimCoord( + points=grib.level, + long_name="height", + units="m", + attributes={'positive': 'up'}, + ), + None + ) + ) + + if grib.levelType == 'ml' and hasattr(grib, 'pv'): + aux_coords_and_dims.append( + ( + AuxCoord( + grib.level, + standard_name='model_level_number', + units=1, + attributes={'positive': 'up'}, + ), + None + ) + ) + aux_coords_and_dims.append( + ( + DimCoord( + grib.pv[grib.level], long_name='level_pressure', units='Pa' + ), + None + ) + ) + aux_coords_and_dims.append( + ( + AuxCoord( + grib.pv[grib.numberOfCoordinatesValues//2 + grib.level], + long_name='sigma', + units=1, + ), + None + ) + ) + factories.append( + Factory( + HybridPressureFactory, + [ + {'long_name': 'level_pressure'}, + {'long_name': 'sigma'}, + Reference('surface_pressure'), + ] + ) + ) if grib._originatingCentre != 'unknown': - aux_coords_and_dims.append((AuxCoord(points=grib._originatingCentre, long_name='originating_centre', units='no_unit'), None)) + aux_coords_and_dims.append( + ( + AuxCoord( + points=grib._originatingCentre, + long_name='originating_centre', + units='no_unit', + ), + None + ) + ) return ConversionMetadata(factories, references, standard_name, long_name, units, attributes, cell_methods, diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index f27c551d..f987479c 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -17,7 +17,7 @@ import warnings import cartopy.crs as ccrs -from cf_units import CALENDAR_GREGORIAN, date2num, Unit +from cf_units import CALENDAR_GREGORIAN, Unit import numpy as np import numpy.ma as ma diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index 0f0e4df3..8b437587 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -17,7 +17,6 @@ import gribapi import numpy as np import numpy.ma as ma -import cartopy.crs as ccrs import iris from iris.aux_factory import HybridHeightFactory, HybridPressureFactory @@ -706,7 +705,7 @@ def set_discipline_and_parameter(cube, grib): category = gc.category number = gc.number identity_found = True - except: + except Exception: pass if not identity_found: diff --git a/iris_grib/grib_phenom_translation.py b/iris_grib/grib_phenom_translation.py index 988a1464..9a814db6 100644 --- a/iris_grib/grib_phenom_translation.py +++ b/iris_grib/grib_phenom_translation.py @@ -260,6 +260,7 @@ def _make_cf_grib2_entry(standard_name, long_name, return table + _CF_GRIB2_TABLE = _make_cf_to_grib2_table() diff --git a/iris_grib/tests/__init__.py b/iris_grib/tests/__init__.py index 6653ca5c..7242a6fd 100644 --- a/iris_grib/tests/__init__.py +++ b/iris_grib/tests/__init__.py @@ -11,7 +11,7 @@ """ -import iris.tests +import iris.tests # noqa: F401 import inspect import os @@ -25,7 +25,7 @@ except ImportError: from iris.tests import IrisTest -from iris.tests import main, skip_data, get_data_path +from iris.tests import main, skip_data, get_data_path # noqa: F401 from iris_grib.message import GribMessage diff --git a/iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py b/iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py index 2a7e61ad..b2f42e8f 100644 --- a/iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py +++ b/iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py @@ -13,7 +13,7 @@ import iris_grib.tests as tests -from iris import load_cube, load +from iris import load_cube from iris.aux_factory import HybridHeightFactory, HybridPressureFactory diff --git a/iris_grib/tests/integration/save_rules/test_grid_definition_section.py b/iris_grib/tests/integration/save_rules/test_grid_definition_section.py index 64b94510..64de2775 100644 --- a/iris_grib/tests/integration/save_rules/test_grid_definition_section.py +++ b/iris_grib/tests/integration/save_rules/test_grid_definition_section.py @@ -13,14 +13,12 @@ # importing anything else. import iris_grib.tests as tests -from iris.coords import DimCoord from iris.coord_systems import (GeogCS, RotatedGeogCS, Mercator, TransverseMercator, LambertConformal, AlbersEqualArea) -from iris.cube import Cube import numpy as np from iris_grib._save_rules import grid_definition_section diff --git a/iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py b/iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py index cc3fa0e2..9b1525b7 100644 --- a/iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py +++ b/iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py @@ -15,7 +15,6 @@ import numpy as np import iris -from iris.cube import Cube from iris_grib import save_pairs_from_cube, save_messages, GribMessage diff --git a/iris_grib/tests/test_license_headers.py b/iris_grib/tests/test_license_headers.py index 7c874b85..68bffb01 100644 --- a/iris_grib/tests/test_license_headers.py +++ b/iris_grib/tests/test_license_headers.py @@ -11,7 +11,6 @@ from datetime import datetime from fnmatch import fnmatch import os -import re import subprocess import unittest diff --git a/iris_grib/tests/unit/__init__.py b/iris_grib/tests/unit/__init__.py index 258224bf..b077d253 100644 --- a/iris_grib/tests/unit/__init__.py +++ b/iris_grib/tests/unit/__init__.py @@ -213,8 +213,8 @@ def cube_from_message(self, grib): # Parameter translation now uses the GribWrapper, so we must convert # the Mock-based fake message to a FakeGribMessage. with mock.patch('iris_grib.gribapi', _mock_gribapi): - grib_message = FakeGribMessage(**grib.__dict__) - wrapped_msg = iris_grib.GribWrapper(grib_message) - cube, _, _ = iris.fileformats.rules._make_cube( - wrapped_msg, iris_grib._grib1_load_rules.grib1_convert) + grib_message = FakeGribMessage(**grib.__dict__) + wrapped_msg = iris_grib.GribWrapper(grib_message) + cube, _, _ = iris.fileformats.rules._make_cube( + wrapped_msg, iris_grib._grib1_load_rules.grib1_convert) return cube diff --git a/iris_grib/tests/unit/load_convert/test_ensemble_identifier.py b/iris_grib/tests/unit/load_convert/test_ensemble_identifier.py index 0157547d..97cd7ca1 100644 --- a/iris_grib/tests/unit/load_convert/test_ensemble_identifier.py +++ b/iris_grib/tests/unit/load_convert/test_ensemble_identifier.py @@ -13,7 +13,6 @@ # before importing anything else. import iris_grib.tests as tests -from copy import deepcopy from unittest import mock import warnings @@ -24,9 +23,7 @@ class Test(tests.IrisGribTest): def setUp(self): - module = 'iris_grib._load_convert' self.patch('warnings.warn') - this = '{}.product_definition_template_0'.format(module) def _check(self, request_warning): section = {'perturbationNumber': 17} @@ -36,6 +33,7 @@ def _check(self, request_warning): expected = DimCoord(section['perturbationNumber'], standard_name='realization', units='no_unit') + self.assertEqual(realization, expected) if request_warning: warn_msgs = [mcall[1][0] for mcall in warnings.warn.mock_calls] diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_10.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_10.py index 670e7cd0..1d835b7a 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_10.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_10.py @@ -20,7 +20,6 @@ import iris.exceptions from iris_grib.tests.unit.load_convert import empty_metadata -from iris_grib._load_convert import _MDI as MDI from iris_grib._load_convert import grid_definition_template_10 diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_10.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_10.py index a43f4f42..fadabb5a 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_10.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_10.py @@ -12,7 +12,6 @@ # before importing anything else. import iris_grib.tests as tests -from copy import deepcopy from unittest import mock from iris.coords import DimCoord @@ -23,7 +22,6 @@ class Test(tests.IrisGribTest): def setUp(self): module = 'iris_grib._load_convert' - this_module = '{}.product_definition_template_10'.format(module) self.patch_statistical_fp_coord = self.patch( module + '.statistical_forecast_period_coord', return_value=mock.sentinel.dummy_fp_coord) diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py index 0cc245ec..92a703b2 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py @@ -16,13 +16,10 @@ # before importing anything else. import iris_grib.tests as tests -from unittest import mock - import iris.coords from iris.exceptions import TranslationError from iris.coords import CellMethod, DimCoord -import iris_grib from iris_grib.tests.unit.load_convert import empty_metadata from iris_grib.tests.unit.load_convert import LoadConvertTest from iris_grib._load_convert import _MDI as MDI @@ -90,14 +87,14 @@ def test_translation(self): def test_bad_statistic_method(self): section = section_4_sample() section['statisticalProcess'] = 999 - msg = 'unsupported statistical process type \[999\]' + msg = r'unsupported statistical process type \[999\]' with self.assertRaisesRegex(TranslationError, msg): self._translate(section) def test_bad_spatial_processing_code(self): section = section_4_sample() section['spatialProcessing'] = 999 - msg = 'unsupported spatial processing type \[999\]' + msg = r'unsupported spatial processing type \[999\]' with self.assertRaisesRegex(TranslationError, msg): self._translate(section) diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_31.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_31.py index 03fdfd9a..dcb935b2 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_31.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_31.py @@ -12,12 +12,7 @@ # before importing anything else. import iris_grib.tests as tests -from copy import deepcopy from unittest import mock -import warnings - -from iris.coords import AuxCoord -import numpy as np from iris_grib.tests.unit.load_convert import empty_metadata diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_32.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_32.py index 8a94d0db..be992d3b 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_32.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_32.py @@ -12,16 +12,9 @@ # before importing anything else. import iris_grib.tests as tests -from copy import deepcopy from unittest import mock -import warnings - -from iris.coords import AuxCoord, DimCoord -import numpy as np from iris_grib.tests.unit.load_convert import empty_metadata -from iris_grib._load_convert import _MDI as MDI - from iris_grib._load_convert import product_definition_template_32 diff --git a/iris_grib/tests/unit/load_convert/test_satellite_common.py b/iris_grib/tests/unit/load_convert/test_satellite_common.py index d2814ddc..50c3b5fc 100644 --- a/iris_grib/tests/unit/load_convert/test_satellite_common.py +++ b/iris_grib/tests/unit/load_convert/test_satellite_common.py @@ -12,9 +12,7 @@ # before importing anything else. import iris_grib.tests as tests -from copy import deepcopy from unittest import mock -import warnings from iris.coords import AuxCoord import numpy as np diff --git a/iris_grib/tests/unit/load_convert/test_statistical_cell_method.py b/iris_grib/tests/unit/load_convert/test_statistical_cell_method.py index b2dd61d4..6f6973bd 100644 --- a/iris_grib/tests/unit/load_convert/test_statistical_cell_method.py +++ b/iris_grib/tests/unit/load_convert/test_statistical_cell_method.py @@ -67,21 +67,21 @@ def test_fail_bad_ranges(self): def test_fail_multiple_ranges(self): self.section['numberOfTimeRange'] = 2 with self.assertRaisesRegex(TranslationError, - 'multiple time ranges \[2\]'): + r'multiple time ranges \[2\]'): statistical_cell_method(self.section) def test_fail_unknown_statistic(self): self.section['typeOfStatisticalProcessing'] = 17 with self.assertRaisesRegex( TranslationError, - 'contains an unsupported statistical process type \[17\]'): + r'contains an unsupported statistical process type \[17\]'): statistical_cell_method(self.section) def test_fail_bad_increment_type(self): self.section['typeOfTimeIncrement'] = 7 with self.assertRaisesRegex( TranslationError, - 'time-increment type \[7\] is not supported'): + r'time-increment type \[7\] is not supported'): statistical_cell_method(self.section) def test_pdt_9(self): diff --git a/iris_grib/tests/unit/load_convert/test_statistical_forecast_period_coord.py b/iris_grib/tests/unit/load_convert/test_statistical_forecast_period_coord.py index 3b941f1d..7bfc8b82 100644 --- a/iris_grib/tests/unit/load_convert/test_statistical_forecast_period_coord.py +++ b/iris_grib/tests/unit/load_convert/test_statistical_forecast_period_coord.py @@ -51,14 +51,12 @@ def test_basic(self): self.assertArrayAlmostEqual(coord.bounds, [[0.0, 8.0]]) def test_with_hindcast(self): - coord = statistical_forecast_period_coord(self.section, - self.frt_coord) + _ = statistical_forecast_period_coord(self.section, self.frt_coord) self.assertEqual(self.patch_hindcast.call_count, 1) def test_no_hindcast(self): self.patch(self.module + '.options.support_hindcast_values', False) - coord = statistical_forecast_period_coord(self.section, - self.frt_coord) + _ = statistical_forecast_period_coord(self.section, self.frt_coord) self.assertEqual(self.patch_hindcast.call_count, 0) diff --git a/iris_grib/tests/unit/load_convert/test_translate_phenomenon.py b/iris_grib/tests/unit/load_convert/test_translate_phenomenon.py index 6f79474f..49c30f85 100644 --- a/iris_grib/tests/unit/load_convert/test_translate_phenomenon.py +++ b/iris_grib/tests/unit/load_convert/test_translate_phenomenon.py @@ -12,8 +12,6 @@ # before importing anything else. import iris_grib.tests as tests -from copy import deepcopy - from cf_units import Unit from iris.coords import DimCoord diff --git a/iris_grib/tests/unit/message/test_GribMessage.py b/iris_grib/tests/unit/message/test_GribMessage.py index 881c7db4..f4062754 100644 --- a/iris_grib/tests/unit/message/test_GribMessage.py +++ b/iris_grib/tests/unit/message/test_GribMessage.py @@ -41,7 +41,7 @@ def test_release_file(self): '3_layer.grib2')) my_file = open(filename) - import builtins + import builtins # noqa: F401 self.patch('builtins.open', mock.Mock(return_value=my_file)) messages = list(GribMessage.messages_from_filename(filename)) @@ -274,7 +274,7 @@ def test(self): 7: {'codedValues': np.arange(12)}}) with self.assertRaisesRegex(TranslationError, 'template 999 is not supported'): - data = message.data + _ = message.data if __name__ == '__main__': diff --git a/iris_grib/tests/unit/message/test__DataProxy.py b/iris_grib/tests/unit/message/test__DataProxy.py index b828c97c..d2de3266 100644 --- a/iris_grib/tests/unit/message/test__DataProxy.py +++ b/iris_grib/tests/unit/message/test__DataProxy.py @@ -12,9 +12,6 @@ # importing anything else. import iris_grib.tests as tests -from unittest import mock - -import numpy as np from numpy.random import randint from iris.exceptions import TranslationError diff --git a/iris_grib/tests/unit/message/test__RawGribMessage.py b/iris_grib/tests/unit/message/test__RawGribMessage.py index 67156e50..3213f784 100644 --- a/iris_grib/tests/unit/message/test__RawGribMessage.py +++ b/iris_grib/tests/unit/message/test__RawGribMessage.py @@ -27,7 +27,7 @@ def setUp(self): def test_sections__set(self): # Test that sections writes into the _sections attribute. - res = self.message.sections + _ = self.message.sections self.assertNotEqual(self.message._sections, None) def test_sections__indexing(self): diff --git a/iris_grib/tests/unit/save_rules/__init__.py b/iris_grib/tests/unit/save_rules/__init__.py index 3779aea0..87e87938 100644 --- a/iris_grib/tests/unit/save_rules/__init__.py +++ b/iris_grib/tests/unit/save_rules/__init__.py @@ -7,8 +7,7 @@ # Import iris_grib.tests first so that some things can be initialised before # importing anything else. -import iris_grib.tests as tests - +import iris_grib.tests # noqa: F401 from unittest import mock import numpy as np diff --git a/iris_grib/tests/unit/save_rules/test__missing_forecast_period.py b/iris_grib/tests/unit/save_rules/test__missing_forecast_period.py index b525b652..46775502 100644 --- a/iris_grib/tests/unit/save_rules/test__missing_forecast_period.py +++ b/iris_grib/tests/unit/save_rules/test__missing_forecast_period.py @@ -12,9 +12,6 @@ # importing anything else. import iris_grib.tests as tests -import datetime -import numpy as np - from iris.cube import Cube from iris.coords import DimCoord diff --git a/iris_grib/tests/unit/save_rules/test__non_missing_forecast_period.py b/iris_grib/tests/unit/save_rules/test__non_missing_forecast_period.py index e558650d..cced408f 100644 --- a/iris_grib/tests/unit/save_rules/test__non_missing_forecast_period.py +++ b/iris_grib/tests/unit/save_rules/test__non_missing_forecast_period.py @@ -9,8 +9,6 @@ # importing anything else. import iris_grib.tests as tests -import cf_units - import iris from iris_grib._save_rules import _non_missing_forecast_period diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py index 5410b186..e509a4f1 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py @@ -14,7 +14,6 @@ import numpy as np -import iris.coords from iris.coord_systems import GeogCS, Mercator from iris_grib._save_rules import grid_definition_template_10 diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_12.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_12.py index 2efcecb9..cf600a80 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_template_12.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_12.py @@ -16,7 +16,6 @@ import iris.coords from iris.coord_systems import GeogCS, TransverseMercator -from iris.exceptions import TranslationError from iris_grib._save_rules import grid_definition_template_12 from iris_grib.tests.unit.save_rules import GdtTestMixin diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_30.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_30.py index 9622e5f0..8437ca31 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_template_30.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_30.py @@ -16,7 +16,6 @@ import iris.coords from iris.coord_systems import GeogCS, LambertConformal -from iris.exceptions import TranslationError from iris_grib._save_rules import grid_definition_template_30 from iris_grib.tests.unit.save_rules import GdtTestMixin diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_1.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_1.py index 2543aaac..c8f9acfa 100644 --- a/iris_grib/tests/unit/save_rules/test_product_definition_template_1.py +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_1.py @@ -17,7 +17,7 @@ from cf_units import Unit import gribapi -from iris.coords import CellMethod, DimCoord +from iris.coords import DimCoord import iris.tests.stock as stock from iris_grib._save_rules import product_definition_template_1 diff --git a/iris_grib/tests/unit/save_rules/test_set_time_range.py b/iris_grib/tests/unit/save_rules/test_set_time_range.py index ac823707..522e3bea 100644 --- a/iris_grib/tests/unit/save_rules/test_set_time_range.py +++ b/iris_grib/tests/unit/save_rules/test_set_time_range.py @@ -80,7 +80,7 @@ def test_fractional_hours(self, mock_set_long): warnings.simplefilter("always") set_time_range(self.coord, mock.sentinel.grib) self.assertEqual(len(warn), 1) - msg = 'Truncating floating point lengthOfTimeRange 10\.8?9+ ' \ + msg = r'Truncating floating point lengthOfTimeRange 10\.8?9+ ' \ 'to integer value 10' self.assertRegex(str(warn[0].message), msg) mock_set_long.assert_any_call(mock.sentinel.grib, diff --git a/iris_grib/tests/unit/test_GribWrapper.py b/iris_grib/tests/unit/test_GribWrapper.py index 45a402c6..cbd0f233 100644 --- a/iris_grib/tests/unit/test_GribWrapper.py +++ b/iris_grib/tests/unit/test_GribWrapper.py @@ -15,10 +15,10 @@ import numpy as np from unittest import mock -from iris._lazy_data import as_concrete_data, is_lazy_data +from iris._lazy_data import is_lazy_data from iris.exceptions import TranslationError -from iris_grib import GribWrapper, GribDataProxy, _load_generate +from iris_grib import GribWrapper, _load_generate _message_length = 1000 @@ -110,7 +110,7 @@ def test_regular_proxy_args(self): self.lookup(grib_message, 'Ni')) for offset in self.expected: with mock.patch('iris_grib.GribDataProxy') as mock_gdp: - gw = GribWrapper(grib_message, self.grib_fh) + _ = GribWrapper(grib_message, self.grib_fh) mock_gdp.assert_called_once_with(shape, self.dtype, self.path, offset) @@ -119,7 +119,7 @@ def test_reduced_proxy_args(self): shape = (self.lookup(grib_message, 'numberOfValues')) for offset in self.expected: with mock.patch('iris_grib.GribDataProxy') as mock_gdp: - gw = GribWrapper(grib_message, self.grib_fh) + _ = GribWrapper(grib_message, self.grib_fh) mock_gdp.assert_called_once_with((shape,), self.dtype, self.path, offset) diff --git a/iris_grib/tests/unit/test__load_generate.py b/iris_grib/tests/unit/test__load_generate.py index 049a98b4..ed2610f8 100644 --- a/iris_grib/tests/unit/test__load_generate.py +++ b/iris_grib/tests/unit/test__load_generate.py @@ -9,11 +9,8 @@ from unittest import mock -import iris from iris.exceptions import TranslationError -from iris.fileformats.rules import Loader -import iris_grib from iris_grib import GribWrapper from iris_grib import _load_generate from iris_grib.message import GribMessage diff --git a/iris_grib/tests/unit/test_load_cubes.py b/iris_grib/tests/unit/test_load_cubes.py index ea3ed0b1..440e2707 100644 --- a/iris_grib/tests/unit/test_load_cubes.py +++ b/iris_grib/tests/unit/test_load_cubes.py @@ -9,7 +9,6 @@ from unittest import mock -import iris from iris.fileformats.rules import Loader import iris_grib diff --git a/noxfile.py b/noxfile.py index fa801a49..4fac1195 100644 --- a/noxfile.py +++ b/noxfile.py @@ -16,12 +16,12 @@ from pathlib import Path import nox -import yaml +from nox.logger import logger #: Default to reusing any pre-existing nox environments. nox.options.reuse_existing_virtualenvs = True -#: Name of the package to test. +#: Name of the package to test. PACKAGE = str("iris_grib") #: Cirrus-CI environment variable hook. @@ -32,142 +32,140 @@ CARTOPY_CACHE_DIR = os.environ.get("HOME") / Path(".local/share/cartopy") -def venv_cached(session, requirements_file=None): +def _cache_cartopy(session: nox.sessions.Session) -> None: """ - Determine whether the nox session environment has been cached. + Determine whether to cache the cartopy natural earth shapefiles. Parameters ---------- session: object A `nox.sessions.Session` object. - Returns - ------- - bool - Whether the session has been cached. - """ - result = False - if not requirements_file is None: - yml = Path(requirements_file) - else: - yml = Path(f"requirements/ci/py{session.python.replace('.', '')}.yml") - tmp_dir = Path(session.create_tmp()) - cache = tmp_dir / yml.name - if cache.is_file(): - with open(yml, "rb") as fi: - expected = hashlib.sha256(fi.read()).hexdigest() - with open(cache, "r") as fi: - actual = fi.read() - result = actual == expected - return result + if not CARTOPY_CACHE_DIR.is_dir(): + session.run( + "python", + "-c", + "import cartopy; cartopy.io.shapereader.natural_earth()", + ) + +def _write_iris_config(session: nox.sessions.Session) -> None: + """ + Add test data dir and libudunits2.so to iris config. -def concat_requirements(primary, *others): - """Join together the dependencies of one or more requirements.yaml. + test data dir is set from session pos args. i.e. can be + configured by passing in on the command line: + nox --session tests -- --test-data-dir $TEST_DATA_DIR/test_data Parameters ---------- - primary: str - filename of the primary requirements.yaml - - others: list[str] - list of additional requirements.yamls - - Returns - ------- - yaml - Dictionary of yaml data: primary with the addition - of others[]['dependencies'] + session: object + A `nox.sessions.Session` object. """ - with open(primary, 'r') as f: - requirements = yaml.load(f, yaml.FullLoader) + try: + test_data_dir = session.posargs[ + session.posargs.index('--test-data-dir')+1 + ] + except Exception: + test_data_dir = "" - for o in others: - with open(o, 'r') as f: - oreq = yaml.load(f, yaml.FullLoader) - requirements['dependencies'].extend(oreq['dependencies']) - - return requirements + iris_config_file = os.path.join( + session.virtualenv.location, + 'lib', + f'python{session.python}', + 'site-packages', + 'iris', + 'etc', + 'site.cfg', + ) + iris_config = f""" +[Resources] +test_data_dir = {test_data_dir} +[System] +udunits2_path = { + os.path.join(session.virtualenv.location,'lib', 'libudunits2.so') +} +""" + print("Iris config\n-----------") + print(iris_config) -def cache_venv(session, requirements_file=None): - """ - Cache the nox session environment. + with open(iris_config_file, 'w') as f: + f.write(iris_config) - This consists of saving a hexdigest (sha256) of the associated - conda requirements YAML file. - Parameters - ---------- - session: object - A `nox.sessions.Session` object. +def _session_lockfile(session: nox.sessions.Session) -> Path: + """ + Return the path of the session lockfile for the relevant python string + e.g ``py38``. """ - if requirements_file is None: - yml = Path(f"requirements/ci/py{session.python.replace('.', '')}.yml") - else: - yml = Path(requirements_file) - with open(yml, "rb") as fi: - hexdigest = hashlib.sha256(fi.read()).hexdigest() + lockfile_name = f"py{session.python.replace('.', '')}-linux-64.lock" + return Path("requirements/nox.lock") / lockfile_name + + +def _file_content(file_path: Path) -> str: + with file_path.open("r") as file: + return file.read() + + +def _session_cachefile(session: nox.sessions.Session) -> Path: + """Return the path of the session lockfile cache.""" tmp_dir = Path(session.create_tmp()) - cache = tmp_dir / yml.name - with open(cache, "w") as fo: - fo.write(hexdigest) + cache = tmp_dir / _session_lockfile(session).name + return cache -def cache_cartopy(session): +def _venv_populated(session: nox.sessions.Session) -> bool: """ - Determine whether to cache the cartopy natural earth shapefiles. + Return True if the Conda venv has been created and the list of packages in + the lockfile installed. - Parameters - ---------- - session: object - A `nox.sessions.Session` object. + """ + return _session_cachefile(session).is_file() + +def _venv_changed(session: nox.sessions.Session) -> bool: """ - if not CARTOPY_CACHE_DIR.is_dir(): - session.run( - "python", - "-c", - "import cartopy; cartopy.io.shapereader.natural_earth()", - ) + Return True if the installed session is different to that specified in the + lockfile. -def write_iris_config(session): - """Add test data dir and libudunits2.so to iris config. + """ + result = False + if _venv_populated(session): + expected = _file_content(_session_lockfile(session)) + actual = _file_content(_session_cachefile(session)) + result = actual != expected + return result + + +def _install_and_cache_venv(session: nox.sessions.Session) -> None: + """ + Install and cache the nox session environment. + This consists of saving a hexdigest (sha256) of the associated + Conda lock file. - test data dir is set from session pos args. i.e. can be - configured by passing in on the command line: - nox --session tests -- --test-data-dir $TEST_DATA_DIR/test_data - Parameters ---------- session: object A `nox.sessions.Session` object. """ - try: - test_data_dir = session.posargs[session.posargs.index('--test-data-dir')+1] - except: - test_data_dir = "" - - iris_config_file = os.path.join(session.virtualenv.location, 'lib', f'python{session.python}', 'site-packages', 'iris', 'etc', 'site.cfg') - iris_config = f""" -[Resources] -test_data_dir = {test_data_dir} -[System] -udunits2_path = {os.path.join(session.virtualenv.location, 'lib', 'libudunits2.so')} -""" + lockfile = _session_lockfile(session) + session.conda_install(f"--file={lockfile}") - print("Iris config\n-----------") - print(iris_config) + with open(lockfile, "rb") as fi: + hexdigest = hashlib.sha256(fi.read()).hexdigest() + with _session_cachefile(session).open("w") as cachefile: + cachefile.write(hexdigest) - with open(iris_config_file, 'w') as f: - f.write(iris_config) @contextmanager -def prepare_venv(session, requirements_file=None): +def prepare_venv( + session: nox.sessions.Session, iris_source: str = 'conda_forge' +) -> None: """ Create and cache the nox session conda environment, and additionally provide conda environment package details and info. @@ -178,10 +176,10 @@ def prepare_venv(session, requirements_file=None): ---------- session: object A `nox.sessions.Session` object. - - requirements_file: str - Path to the environment requirements file. - Default: requirements/ci/py{PY_VER}.yml + + iris_source: str + Determines where Iris was sourced from. Either 'conda_forge' (the + default), or 'source' which refers to the Iris main branch. Notes ----- @@ -190,46 +188,73 @@ def prepare_venv(session, requirements_file=None): - https://github.com/theacodes/nox/issues/260 """ - if requirements_file is None: - # Determine the conda requirements yaml file. - requirements_file = f"requirements/ci/py{session.python.replace('.', '')}.yml" + venv_dir = session.virtualenv.location_name + + if not _venv_populated(session): + # Environment has been created but packages not yet installed. + # Populate the environment from the lockfile. + logger.debug(f"Populating conda env: {venv_dir}") + _install_and_cache_venv(session) + + elif _venv_changed(session): + # Destroy the environment and rebuild it. + logger.debug(f"Lockfile changed. Recreating conda env: {venv_dir}") + _reuse_original = session.virtualenv.reuse_existing + session.virtualenv.reuse_existing = False + session.virtualenv.create() + _install_and_cache_venv(session) + session.virtualenv.reuse_existing = _reuse_original + + logger.debug(f"Environment up to date: {venv_dir}") + + if iris_source == 'source': + # get latest iris + iris_dir = f"{session.create_tmp()}/iris" - if not venv_cached(session, requirements_file): - # Back-door approach to force nox to use "conda env update". - command = ( - "conda", - "env", - "update", - f"--prefix={session.virtualenv.location}", - f"--file={requirements_file}", - "--prune", - ) - session._run(*command, silent=True, external="error") - cache_venv(session) + if os.path.exists(iris_dir): + # cached. update by pulling from origin/master + session.run( + "git", + "-C", + iris_dir, + "pull", + "origin", + "main", + external=True # use git from host environment + ) + else: + session.run( + "git", + "clone", + "https://github.com/scitools/iris.git", + iris_dir, + external=True + ) + session.install(iris_dir, '--no-deps') + + _cache_cartopy(session) + _write_iris_config(session) - cache_cartopy(session) + # Install the iris-grib source in develop mode. + session.install("--no-deps", "--editable", ".") - # Allow the user to do setup things - # like installing iris-grib in development mode - yield session - # Determine whether verbose diagnostics have been requested # from the command line. verbose = "-v" in session.posargs or "--verbose" in session.posargs if verbose: session.run("conda", "info") - session.run("conda", "list", f"--prefix={session.virtualenv.location}") + session.run("conda", "list", f"--prefix={venv_dir}") session.run( "conda", "list", - f"--prefix={session.virtualenv.location}", + f"--prefix={venv_dir}", "--explicit", ) @nox.session -def flake8(session): +def flake8(session: nox.sessions.Session): """ Perform flake8 linting of iris-grib. @@ -248,7 +273,7 @@ def flake8(session): @nox.session -def black(session): +def black(session: nox.sessions.Session): """ Perform black format checking of iris-grib. @@ -267,8 +292,8 @@ def black(session): @nox.session(python=PY_VER, venv_backend="conda") -@nox.parametrize('iris', IRIS_SOURCE) -def tests(session, iris): +@nox.parametrize('iris_source', IRIS_SOURCE) +def tests(session: nox.sessions.Session, iris_source: str): """ Perform iris-grib tests against release and development versions of iris. @@ -277,51 +302,12 @@ def tests(session, iris): session: object A `nox.sessions.Session` object. - """ - - if iris == 'source': - # get latest iris - iris_dir = f"{session.create_tmp()}/iris" + iris_source: str + Either 'conda_forge' if using Iris from conda-forge, or 'source' if + installing Iris from the Iris' main branch. - if os.path.exists(iris_dir): - # cached. update by pulling from origin/main - session.run( - "git", - "-C", - iris_dir, - "pull", - "origin", - "main", - external=True # use git from host environment - ) - else: - session.run( - "git", - "clone", - "https://github.com/scitools/iris.git", - iris_dir, - external=True - ) - - # combine iris and iris-grib requirements into one requirement list - requirements = concat_requirements( - f"requirements/ci/py{session.python.replace('.', '')}.yml", - f"{iris_dir}/requirements/ci/py{session.python.replace('.', '')}.yml" - ) - # remove iris dependencies, we'll install these from source - requirements['dependencies'] = [x for x in requirements['dependencies'] - if not x.startswith('iris')] - req_file = f"{session.create_tmp()}/requirements.yaml" - with open(req_file, 'w') as f: - yaml.dump(requirements, f) - else: - req_file = f"requirements/ci/py{session.python.replace('.', '')}.yml" - - with prepare_venv(session, req_file): - if iris == 'source': - session.install(iris_dir, '--no-deps') - session.install("--no-deps", "--editable", ".") - write_iris_config(session) + """ + prepare_venv(session, iris_source) session.run("python", "-m", "eccodes", "selfcheck") @@ -333,9 +319,8 @@ def tests(session, iris): ) - @nox.session(python=PY_VER, venv_backend="conda") -def doctest(session): +def doctest(session: nox.sessions.Session): """ Perform iris-grib doc-tests. @@ -361,7 +346,7 @@ def doctest(session): @nox.session(python=PY_VER, venv_backend="conda") -def linkcheck(session): +def linkcheck(session: nox.sessions.Session): """ Perform iris-grib doc link check. diff --git a/requirements/ci/py36.yml b/requirements/ci/py36.yml deleted file mode 100644 index e51e7c59..00000000 --- a/requirements/ci/py36.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: iris-grib-dev - -channels: - - conda-forge - -dependencies: - - python=3.6 - -# Setup dependencies. - - setuptools - -# Core dependencies. - - iris>=3 - - python-eccodes - -# Optional dependencies. - - mo_pack - -# Test dependencies. - - mock - - filelock - - pep8 - - requests - - nose diff --git a/requirements/ci/py37.yml b/requirements/ci/py37.yml index fbcc8433..68e0f80e 100644 --- a/requirements/ci/py37.yml +++ b/requirements/ci/py37.yml @@ -10,7 +10,7 @@ dependencies: - setuptools # Core dependencies. - - iris>=3 + - iris>=3.0.2 - python-eccodes # Optional dependencies. diff --git a/requirements/ci/py38.yml b/requirements/ci/py38.yml index cc84dcd9..3836de41 100644 --- a/requirements/ci/py38.yml +++ b/requirements/ci/py38.yml @@ -10,7 +10,7 @@ dependencies: - setuptools # Core dependencies. - - iris>=3 + - iris>=3.0.2 - python-eccodes # Optional dependencies. @@ -21,4 +21,4 @@ dependencies: - filelock - pep8 - requests - - nose \ No newline at end of file + - nose diff --git a/requirements/core.txt b/requirements/core.txt index 21263d7a..f96770b2 100644 --- a/requirements/core.txt +++ b/requirements/core.txt @@ -1,4 +1,4 @@ # Core dependencies. -scitools-iris>=3 +scitools-iris>=3.0.2 eccodes-python diff --git a/requirements/nox.lock/py37-linux-64.lock b/requirements/nox.lock/py37-linux-64.lock new file mode 100644 index 00000000..21a9029d --- /dev/null +++ b/requirements/nox.lock/py37-linux-64.lock @@ -0,0 +1,127 @@ +# platform: linux-64 +# env_hash: 79ed224559178fc9f6977fee4e2d80112f2bb8577c135e85152ef0a1f13ef003 +@EXPLICIT +https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2021.5.30-ha878542_0.tar.bz2#6a777890e94194dc94a29a76d2a7e721 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.35.1-hea4e1c9_2.tar.bz2#83610dba766a186bdc7a116053b782a4 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-9.3.0-hff62375_19.tar.bz2#c2d8da3cb171e4aa642d20c6e4e42a04 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-9.3.0-h6de172a_19.tar.bz2#cd9a24a8dde03ec0cf0e603b0bea85a1 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-9.3.0-hff62375_19.tar.bz2#aea379bd68fdcdf9499fa1453f852ac1 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-9.3.0-h2828fa1_19.tar.bz2#ab0a307912033126da02507b59e79ec9 +https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-1_gnu.tar.bz2#561e277319a41d4f24f5c05a9ef63c04 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-9.3.0-h2828fa1_19.tar.bz2#9d5cdfc51476ee4dcdd96ed2dca3f943 +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.17.1-h7f98852_1.tar.bz2#ed1dc233ed5e3eaa9bfbaac64d130c5e +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/geos-3.9.1-h9c3ff4c_2.tar.bz2#b9a6d9422aed3ad84ec6ccee9bfcaa0f +https://conda.anaconda.org/conda-forge/linux-64/jbig-2.1-h7f98852_2003.tar.bz2#1aa0cee79792fa97b7ff4545110b60bf +https://conda.anaconda.org/conda-forge/linux-64/jpeg-9d-h36c2ea0_0.tar.bz2#ea02ce6037dbe81803ae6123e5ba1568 +https://conda.anaconda.org/conda-forge/linux-64/lerc-2.2.1-h9c3ff4c_0.tar.bz2#ea833dcaeb9e7ac4fac521f1a7abec82 +https://conda.anaconda.org/conda-forge/linux-64/libaec-1.0.4-h9c3ff4c_1.tar.bz2#90dbd3066828b76fa810578e49cef920 +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.7-h7f98852_5.tar.bz2#10e242842cd30c59c12d79371dc0f583 +https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h516909a_1.tar.bz2#6f8720dff19e17ce5d48cfe7f3d2f0a3 +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.3-h58526e2_2.tar.bz2#665369991d8dd290ac5ee92fce3e6bf5 +https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.15-pthreads_h8fe5266_1.tar.bz2#bb5527a16584426a897f22643d9a36a6 +https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.2.0-h7f98852_2.tar.bz2#fb63a035a3b552c88a30d84b89ebf4c4 +https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.3-h9c3ff4c_0.tar.bz2#4eb64ee0d5cd43096ffcf843c76b05d4 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.2-h58526e2_4.tar.bz2#509f2a21c4a09214cd737a480dfd80c9 +https://conda.anaconda.org/conda-forge/linux-64/openssl-1.1.1k-h7f98852_0.tar.bz2#07fae2cb088379c8441e0f3ffa1f4025 +https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.0-h7f98852_3.tar.bz2#52402c791f35e414e704b7a113f99605 +https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.5-h516909a_1.tar.bz2#33f601066901f3e1a85af3522a8113f9 +https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h516909a_0.tar.bz2#03a530e925414902547cf48da7756db8 +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.11-h516909a_1010.tar.bz2#339cc5584e6d26bc73a875ba900028c3 +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/jasper-1.900.1-h07fcdf6_1006.tar.bz2#babe76b3c95cc3e9005a66855ffe4e21 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-9_openblas.tar.bz2#5f08755e98b2a43ca68124e629a5a0cb +https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 +https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.43.0-h812cca2_0.tar.bz2#1867d1e9658596b3fac8847a7702eef4 +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.9.0-ha56f1ee_6.tar.bz2#f0dfb86444df325e599dbc3f4c0a3f5b +https://conda.anaconda.org/conda-forge/linux-64/libzip-1.7.3-h4de3113_0.tar.bz2#2568763f88009f95e9262cba837dbb82 +https://conda.anaconda.org/conda-forge/linux-64/readline-8.1-h46c0cb4_0.tar.bz2#5788de3c8d7a7d64ac56c784c4ef48e6 +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.10-h21135ba_1.tar.bz2#c647f70aa7e3d4cc4e029cc1c9a99953 +https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.27.27-h975c496_1.tar.bz2#e663bd5dbc8cc4c1647d9f51cf25872c +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/freetype-2.10.4-h0708190_1.tar.bz2#4a06f2ac2e5bfae7b6b245171c3f07aa +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.19.1-hcc1bbae_0.tar.bz2#59b0695a515a6c54d45463dbf208ae38 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-9_openblas.tar.bz2#edee85b4f83376ceae81e0975b8bffa2 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-9_openblas.tar.bz2#572d84ab07962986f6dd8e4637a475ca +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.3.0-hf544144_1.tar.bz2#a65a4158716bd7d95bfa69bcfd83081c +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.35.5-h74cdb3f_0.tar.bz2#e876c82c21e7074d299e13762d02466c +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.77.0-h2574ce0_0.tar.bz2#05cf8dca8408b5f1ffcc5e2d5a7c5da2 +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.4.0-hb52868f_1.tar.bz2#b7ad78ad2e9ee155f59e6428406ee824 +https://conda.anaconda.org/conda-forge/linux-64/python-3.7.10-hffdb5ce_100_cpython.tar.bz2#7425fffa658971915f595e9110163c3c +https://conda.anaconda.org/conda-forge/noarch/attrs-21.2.0-pyhd8ed1ab_0.tar.bz2#d2e1c7f388ac403df7079b411c37cc50 +https://conda.anaconda.org/conda-forge/noarch/cloudpickle-1.6.0-py_0.tar.bz2#76d764d8881719e305f6fa368dc2b65e +https://conda.anaconda.org/conda-forge/linux-64/curl-7.77.0-hea6ffbf_0.tar.bz2#7d1168349d6fba67ae1fdf61970b83e1 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.0.12-pyh9f0ad1d_0.tar.bz2#7544ed05bbbe9bb687bc9bcbe4d6cb46 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2021.5.0-pyhd8ed1ab_0.tar.bz2#da823f51ebb876dafbed1c892fd80956 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.10.6-nompi_h6a2412b_1114.tar.bz2#0a2984b78f51148d7ff6219abe73509e +https://conda.anaconda.org/conda-forge/noarch/heapdict-1.0.1-py_0.tar.bz2#77242bfb1e74a627fb06319b5a2d3b95 +https://conda.anaconda.org/conda-forge/noarch/idna-2.10-pyh9f0ad1d_0.tar.bz2#f95a12b4f435aae6680fe55ae2eb1b06 +https://conda.anaconda.org/conda-forge/noarch/locket-0.2.0-py_2.tar.bz2#709e8671651c7ec3d1ad07800339ff1d +https://conda.anaconda.org/conda-forge/noarch/nose-1.3.7-py_1006.tar.bz2#382019d5f8e9362ef6f60a8d4e7bce8f +https://conda.anaconda.org/conda-forge/noarch/olefile-0.46-pyh9f0ad1d_1.tar.bz2#0b2e68acc8c78c8cc392b90983481f58 +https://conda.anaconda.org/conda-forge/noarch/pep8-1.7.1-py_0.tar.bz2#d0b5bc3aebbffcb175bf8a1d419acb79 +https://conda.anaconda.org/conda-forge/linux-64/proj-7.2.0-h277dcde_2.tar.bz2#db654ee11298d3463bad67445707654c +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.20-pyh9f0ad1d_2.tar.bz2#aa798d50ffd182a0f6f31478c7f434f6 +https://conda.anaconda.org/conda-forge/noarch/pyke-1.1.1-pyhd8ed1ab_1004.tar.bz2#5f0236abfbb6d53826d1afed1e64f82e +https://conda.anaconda.org/conda-forge/noarch/pyparsing-2.4.7-pyh9f0ad1d_0.tar.bz2#626c4f20d5bf06dcec9cf2eaa31725c7 +https://conda.anaconda.org/conda-forge/noarch/pyshp-2.1.3-pyh44b312d_0.tar.bz2#2d1867b980785eb44b8122184d8b42a6 +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.7-1_cp37m.tar.bz2#658a5c3d766bfc6574480204b10a6f20 +https://conda.anaconda.org/conda-forge/noarch/pytz-2021.1-pyhd8ed1ab_0.tar.bz2#3af2e9424d5eb0063824a3f9b850d411 +https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 +https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_0.tar.bz2#6d6552722448103793743dabfbda532d +https://conda.anaconda.org/conda-forge/noarch/tblib-1.7.0-pyhd8ed1ab_0.tar.bz2#3d4afc31302aa7be471feb6be048ed76 +https://conda.anaconda.org/conda-forge/noarch/toolz-0.11.1-py_0.tar.bz2#d1e66b58cb00b3817ad9f05eec098c00 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-3.10.0.0-pyha770c72_0.tar.bz2#67c0cba6533b641f28946d7c16f361c8 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.4.1-pyhd8ed1ab_0.tar.bz2#a4fa30eb74a326092b3d8078b1f1aae1 +https://conda.anaconda.org/conda-forge/linux-64/antlr-python-runtime-4.7.2-py37h89c1867_1002.tar.bz2#cf3aeeb80dbd517761019a8edcd5b108 +https://conda.anaconda.org/conda-forge/linux-64/certifi-2021.5.30-py37h89c1867_0.tar.bz2#105f18ae8597a5f4d4e3188bcb06c796 +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.14.5-py37hc58025e_0.tar.bz2#e05f1fad0c52c21b6b92778d31f89cd0 +https://conda.anaconda.org/conda-forge/linux-64/chardet-4.0.0-py37h89c1867_1.tar.bz2#f4fbd4721b80f0d6b53b3a3374914068 +https://conda.anaconda.org/conda-forge/noarch/cycler-0.10.0-py_2.tar.bz2#f6d7c7e6d8f42cbbec7e07a8d879f91c +https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.11.0-py37h5e8e339_3.tar.bz2#2e89a6f3baf5eeb13763f61ea3d0601f +https://conda.anaconda.org/conda-forge/linux-64/importlib-metadata-4.5.0-py37h89c1867_0.tar.bz2#71a9d20403f28d15f7a94d0817584efa +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.3.1-py37h2527ec5_1.tar.bz2#61149814e0ea71cb5b44881c65d25f7b +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.8.0-nompi_hcd642e3_103.tar.bz2#a4c691f7630ad2cbcc1f1298b4b15ded +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.0.1-py37h5e8e339_0.tar.bz2#90ad307f6997784664de956e09ec689e +https://conda.anaconda.org/conda-forge/linux-64/mock-4.0.3-py37h89c1867_1.tar.bz2#b45c06a416e3f3f74fab9b7b5964c17a +https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.0.2-py37h2527ec5_1.tar.bz2#07952b04eee02d873daa311a35b27454 +https://conda.anaconda.org/conda-forge/linux-64/numpy-1.20.3-py37h038b26d_1.tar.bz2#4644df846d272b6316503418db23b5dd +https://conda.anaconda.org/conda-forge/noarch/packaging-20.9-pyh44b312d_0.tar.bz2#be69a38e912054a62dc82cc3c7711a64 +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-8.2.0-py37h4600e1f_1.tar.bz2#8998270d7ebbb22261ab440176d3a5cf +https://conda.anaconda.org/conda-forge/linux-64/psutil-5.8.0-py37h5e8e339_1.tar.bz2#2923250371b05e798f3732531cdb5300 +https://conda.anaconda.org/conda-forge/linux-64/pysocks-1.7.1-py37h89c1867_3.tar.bz2#bd069d59ee91a2e26552cd7bb4c64032 +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.1-py_0.tar.bz2#0d0150ed9c2d25817f5324108d3f7571 +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-2.0.2-py37h5e8e339_0.tar.bz2#3f1e633378cd3c8b1ce13b3f2f5eadd7 +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-5.4.1-py37h5e8e339_0.tar.bz2#090550b9425fe9a87dc1ec7fde201633 +https://conda.anaconda.org/conda-forge/linux-64/tornado-6.1-py37h5e8e339_1.tar.bz2#92449128c4639feae48d731ef2186099 +https://conda.anaconda.org/conda-forge/noarch/zict-2.0.0-py_0.tar.bz2#4750152be22f24d695b3004c5e1712d3 +https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py37h5e8e339_1001.tar.bz2#871eed4ba322e7b3f200956a096b34e7 +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.2.1-py37h161383b_1.tar.bz2#314ca8b00ed742f8c46a6cc68d84d90f +https://conda.anaconda.org/conda-forge/linux-64/click-8.0.1-py37h89c1867_0.tar.bz2#bb1ad97b5d8626f662b753f620c3c913 +https://conda.anaconda.org/conda-forge/linux-64/cryptography-3.4.7-py37h5d9358c_0.tar.bz2#d811fb6a96ae0cf8c0a17457a8e67ff4 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2021.6.0-pyhd8ed1ab_0.tar.bz2#cea7be7ed76c4664498447ef35d2268c +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.22.0-he2bb022_0.tar.bz2#98a82d5f89708b080c39c4e73558b58e +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.0.1-pyhd8ed1ab_0.tar.bz2#c647e77921fd3e245cdcc5b2d451a0f8 +https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py37h902c9e0_1005.tar.bz2#40db532422636dd1e980154114486a00 +https://conda.anaconda.org/conda-forge/linux-64/pandas-1.2.4-py37h219a48f_0.tar.bz2#fb33763b90acf1a4a7cffb7ab994a3cd +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.6.3-py37h29e03ee_0.tar.bz2#a469d02f72b9cef07f4408d419b17dcc +https://conda.anaconda.org/conda-forge/linux-64/setuptools-49.6.0-py37h89c1867_3.tar.bz2#928c178bf6805b8ab71fabaa620e0234 +https://conda.anaconda.org/conda-forge/linux-64/shapely-1.7.1-py37h2d1e849_5.tar.bz2#451beb59aca4c165e68fbe8be3a37149 +https://conda.anaconda.org/conda-forge/linux-64/bokeh-2.3.2-py37h89c1867_0.tar.bz2#2c0224d9598b7c4fef87536ecbfc87af +https://conda.anaconda.org/conda-forge/linux-64/cf-units-2.1.5-py37h6f94858_0.tar.bz2#5ad0ed053fc1c3bf156cf181cdded003 +https://conda.anaconda.org/conda-forge/linux-64/distributed-2021.6.0-py37h89c1867_0.tar.bz2#c8228e953e50cc4a62087c477f8efb02 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.4.2-py37hdd32ed1_0.tar.bz2#ee755b80aae171058a46c5d7badd08ff +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.5.6-nompi_py37h946d57d_103.tar.bz2#600a3ba1f0b13ca31d4f593f1fa490b4 +https://conda.anaconda.org/conda-forge/noarch/pyopenssl-20.0.1-pyhd8ed1ab_0.tar.bz2#92371c25994d0f5d28a01c1fb75ebf86 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2021.03.0-py37h6f94858_1.tar.bz2#45cd92e3c2048aa78cf81f78756632fc +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.19.0.post1-py37h0c48da3_0.tar.bz2#44add1e9550c8caf69ce64561ce73035 +https://conda.anaconda.org/conda-forge/noarch/dask-2021.6.0-pyhd8ed1ab_0.tar.bz2#554ef426ff0ef06641338b7a514d6354 +https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.5-pyhd8ed1ab_0.tar.bz2#36f0ca66d6dd09423e5c2551148d45cd +https://conda.anaconda.org/conda-forge/linux-64/iris-3.0.2-py37h89c1867_1.tar.bz2#6f48b8b5c25ba3fde73b84de106d1052 +https://conda.anaconda.org/conda-forge/noarch/requests-2.25.1-pyhd3deb0d_0.tar.bz2#ae687aba31a1c400192a86a2e993ffdc diff --git a/requirements/nox.lock/py38-linux-64.lock b/requirements/nox.lock/py38-linux-64.lock new file mode 100644 index 00000000..ceebcf28 --- /dev/null +++ b/requirements/nox.lock/py38-linux-64.lock @@ -0,0 +1,125 @@ +# platform: linux-64 +# env_hash: 5b63d4ac76488b1798081b1ae9ca6cae022cc090016e4838a6e53c3ca1bb6e53 +@EXPLICIT +https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2021.5.30-ha878542_0.tar.bz2#6a777890e94194dc94a29a76d2a7e721 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.35.1-hea4e1c9_2.tar.bz2#83610dba766a186bdc7a116053b782a4 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-9.3.0-hff62375_19.tar.bz2#c2d8da3cb171e4aa642d20c6e4e42a04 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-9.3.0-h6de172a_19.tar.bz2#cd9a24a8dde03ec0cf0e603b0bea85a1 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-9.3.0-hff62375_19.tar.bz2#aea379bd68fdcdf9499fa1453f852ac1 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-9.3.0-h2828fa1_19.tar.bz2#ab0a307912033126da02507b59e79ec9 +https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-1_gnu.tar.bz2#561e277319a41d4f24f5c05a9ef63c04 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-9.3.0-h2828fa1_19.tar.bz2#9d5cdfc51476ee4dcdd96ed2dca3f943 +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.17.1-h7f98852_1.tar.bz2#ed1dc233ed5e3eaa9bfbaac64d130c5e +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/geos-3.9.1-h9c3ff4c_2.tar.bz2#b9a6d9422aed3ad84ec6ccee9bfcaa0f +https://conda.anaconda.org/conda-forge/linux-64/jbig-2.1-h7f98852_2003.tar.bz2#1aa0cee79792fa97b7ff4545110b60bf +https://conda.anaconda.org/conda-forge/linux-64/jpeg-9d-h36c2ea0_0.tar.bz2#ea02ce6037dbe81803ae6123e5ba1568 +https://conda.anaconda.org/conda-forge/linux-64/lerc-2.2.1-h9c3ff4c_0.tar.bz2#ea833dcaeb9e7ac4fac521f1a7abec82 +https://conda.anaconda.org/conda-forge/linux-64/libaec-1.0.4-h9c3ff4c_1.tar.bz2#90dbd3066828b76fa810578e49cef920 +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.7-h7f98852_5.tar.bz2#10e242842cd30c59c12d79371dc0f583 +https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h516909a_1.tar.bz2#6f8720dff19e17ce5d48cfe7f3d2f0a3 +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.3-h58526e2_2.tar.bz2#665369991d8dd290ac5ee92fce3e6bf5 +https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.15-pthreads_h8fe5266_1.tar.bz2#bb5527a16584426a897f22643d9a36a6 +https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.2.0-h7f98852_2.tar.bz2#fb63a035a3b552c88a30d84b89ebf4c4 +https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.3-h9c3ff4c_0.tar.bz2#4eb64ee0d5cd43096ffcf843c76b05d4 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.2-h58526e2_4.tar.bz2#509f2a21c4a09214cd737a480dfd80c9 +https://conda.anaconda.org/conda-forge/linux-64/openssl-1.1.1k-h7f98852_0.tar.bz2#07fae2cb088379c8441e0f3ffa1f4025 +https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.0-h7f98852_3.tar.bz2#52402c791f35e414e704b7a113f99605 +https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.5-h516909a_1.tar.bz2#33f601066901f3e1a85af3522a8113f9 +https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h516909a_0.tar.bz2#03a530e925414902547cf48da7756db8 +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.11-h516909a_1010.tar.bz2#339cc5584e6d26bc73a875ba900028c3 +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/jasper-1.900.1-h07fcdf6_1006.tar.bz2#babe76b3c95cc3e9005a66855ffe4e21 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-9_openblas.tar.bz2#5f08755e98b2a43ca68124e629a5a0cb +https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 +https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.43.0-h812cca2_0.tar.bz2#1867d1e9658596b3fac8847a7702eef4 +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.9.0-ha56f1ee_6.tar.bz2#f0dfb86444df325e599dbc3f4c0a3f5b +https://conda.anaconda.org/conda-forge/linux-64/libzip-1.7.3-h4de3113_0.tar.bz2#2568763f88009f95e9262cba837dbb82 +https://conda.anaconda.org/conda-forge/linux-64/readline-8.1-h46c0cb4_0.tar.bz2#5788de3c8d7a7d64ac56c784c4ef48e6 +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.10-h21135ba_1.tar.bz2#c647f70aa7e3d4cc4e029cc1c9a99953 +https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.27.27-h975c496_1.tar.bz2#e663bd5dbc8cc4c1647d9f51cf25872c +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/freetype-2.10.4-h0708190_1.tar.bz2#4a06f2ac2e5bfae7b6b245171c3f07aa +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.19.1-hcc1bbae_0.tar.bz2#59b0695a515a6c54d45463dbf208ae38 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-9_openblas.tar.bz2#edee85b4f83376ceae81e0975b8bffa2 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-9_openblas.tar.bz2#572d84ab07962986f6dd8e4637a475ca +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.3.0-hf544144_1.tar.bz2#a65a4158716bd7d95bfa69bcfd83081c +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.35.5-h74cdb3f_0.tar.bz2#e876c82c21e7074d299e13762d02466c +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.77.0-h2574ce0_0.tar.bz2#05cf8dca8408b5f1ffcc5e2d5a7c5da2 +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.4.0-hb52868f_1.tar.bz2#b7ad78ad2e9ee155f59e6428406ee824 +https://conda.anaconda.org/conda-forge/linux-64/python-3.8.10-h49503c6_1_cpython.tar.bz2#69f7d6ef1f00c3a109b1b06279e6d6a9 +https://conda.anaconda.org/conda-forge/noarch/attrs-21.2.0-pyhd8ed1ab_0.tar.bz2#d2e1c7f388ac403df7079b411c37cc50 +https://conda.anaconda.org/conda-forge/noarch/cloudpickle-1.6.0-py_0.tar.bz2#76d764d8881719e305f6fa368dc2b65e +https://conda.anaconda.org/conda-forge/linux-64/curl-7.77.0-hea6ffbf_0.tar.bz2#7d1168349d6fba67ae1fdf61970b83e1 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.0.12-pyh9f0ad1d_0.tar.bz2#7544ed05bbbe9bb687bc9bcbe4d6cb46 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2021.5.0-pyhd8ed1ab_0.tar.bz2#da823f51ebb876dafbed1c892fd80956 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.10.6-nompi_h6a2412b_1114.tar.bz2#0a2984b78f51148d7ff6219abe73509e +https://conda.anaconda.org/conda-forge/noarch/heapdict-1.0.1-py_0.tar.bz2#77242bfb1e74a627fb06319b5a2d3b95 +https://conda.anaconda.org/conda-forge/noarch/idna-2.10-pyh9f0ad1d_0.tar.bz2#f95a12b4f435aae6680fe55ae2eb1b06 +https://conda.anaconda.org/conda-forge/noarch/locket-0.2.0-py_2.tar.bz2#709e8671651c7ec3d1ad07800339ff1d +https://conda.anaconda.org/conda-forge/noarch/nose-1.3.7-py_1006.tar.bz2#382019d5f8e9362ef6f60a8d4e7bce8f +https://conda.anaconda.org/conda-forge/noarch/olefile-0.46-pyh9f0ad1d_1.tar.bz2#0b2e68acc8c78c8cc392b90983481f58 +https://conda.anaconda.org/conda-forge/noarch/pep8-1.7.1-py_0.tar.bz2#d0b5bc3aebbffcb175bf8a1d419acb79 +https://conda.anaconda.org/conda-forge/linux-64/proj-7.2.0-h277dcde_2.tar.bz2#db654ee11298d3463bad67445707654c +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.20-pyh9f0ad1d_2.tar.bz2#aa798d50ffd182a0f6f31478c7f434f6 +https://conda.anaconda.org/conda-forge/noarch/pyke-1.1.1-pyhd8ed1ab_1004.tar.bz2#5f0236abfbb6d53826d1afed1e64f82e +https://conda.anaconda.org/conda-forge/noarch/pyparsing-2.4.7-pyh9f0ad1d_0.tar.bz2#626c4f20d5bf06dcec9cf2eaa31725c7 +https://conda.anaconda.org/conda-forge/noarch/pyshp-2.1.3-pyh44b312d_0.tar.bz2#2d1867b980785eb44b8122184d8b42a6 +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.8-1_cp38.tar.bz2#8d05152d6fb3012b27a0e6fbcc14bea1 +https://conda.anaconda.org/conda-forge/noarch/pytz-2021.1-pyhd8ed1ab_0.tar.bz2#3af2e9424d5eb0063824a3f9b850d411 +https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 +https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_0.tar.bz2#6d6552722448103793743dabfbda532d +https://conda.anaconda.org/conda-forge/noarch/tblib-1.7.0-pyhd8ed1ab_0.tar.bz2#3d4afc31302aa7be471feb6be048ed76 +https://conda.anaconda.org/conda-forge/noarch/toolz-0.11.1-py_0.tar.bz2#d1e66b58cb00b3817ad9f05eec098c00 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-3.10.0.0-pyha770c72_0.tar.bz2#67c0cba6533b641f28946d7c16f361c8 +https://conda.anaconda.org/conda-forge/linux-64/antlr-python-runtime-4.7.2-py38h578d9bd_1002.tar.bz2#2b2207e2c8a05fc0bc5b62fc32c355e6 +https://conda.anaconda.org/conda-forge/linux-64/certifi-2021.5.30-py38h578d9bd_0.tar.bz2#a2e14464711f8e76010cd7e0c49bc4ae +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.14.5-py38ha65f79e_0.tar.bz2#386057f231a571b75bfa7307c9acd5f6 +https://conda.anaconda.org/conda-forge/linux-64/chardet-4.0.0-py38h578d9bd_1.tar.bz2#9294a5e2c7545a2f67ac348aadd53344 +https://conda.anaconda.org/conda-forge/linux-64/click-8.0.1-py38h578d9bd_0.tar.bz2#45426acde32f0ddd94dcee3478fd13e3 +https://conda.anaconda.org/conda-forge/noarch/cycler-0.10.0-py_2.tar.bz2#f6d7c7e6d8f42cbbec7e07a8d879f91c +https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.11.0-py38h497a2fe_3.tar.bz2#45568bae22c3825f22b631101ecbad35 +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.3.1-py38h1fd1430_1.tar.bz2#01488c80daae318ed5c17e7bb12af64e +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.8.0-nompi_hcd642e3_103.tar.bz2#a4c691f7630ad2cbcc1f1298b4b15ded +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.0.1-py38h497a2fe_0.tar.bz2#d075babffd68330d81b0488a45435698 +https://conda.anaconda.org/conda-forge/linux-64/mock-4.0.3-py38h578d9bd_1.tar.bz2#58f0b38b126cf7cda0a584ebb911d8ce +https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.0.2-py38h1fd1430_1.tar.bz2#5854c568e0d341313fb0a6487f1c687e +https://conda.anaconda.org/conda-forge/linux-64/numpy-1.20.3-py38h9894fe3_1.tar.bz2#a65d77d36ddfd5c58cdda67ba2ca06c3 +https://conda.anaconda.org/conda-forge/noarch/packaging-20.9-pyh44b312d_0.tar.bz2#be69a38e912054a62dc82cc3c7711a64 +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-8.2.0-py38ha0e1e83_1.tar.bz2#46a555b3ce021469f7f62d72fe6ebb4b +https://conda.anaconda.org/conda-forge/linux-64/psutil-5.8.0-py38h497a2fe_1.tar.bz2#3c465545aa3cec37f8f1341546677956 +https://conda.anaconda.org/conda-forge/linux-64/pysocks-1.7.1-py38h578d9bd_3.tar.bz2#8284bab4783fd6fdd11b695958945614 +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.1-py_0.tar.bz2#0d0150ed9c2d25817f5324108d3f7571 +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-2.0.2-py38h497a2fe_0.tar.bz2#27b37e3f79205080b573442445ed727b +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-5.4.1-py38h497a2fe_0.tar.bz2#36d6e06148013694eb943576cd305f67 +https://conda.anaconda.org/conda-forge/linux-64/tornado-6.1-py38h497a2fe_1.tar.bz2#e772c8383768280af283e814e2126663 +https://conda.anaconda.org/conda-forge/noarch/zict-2.0.0-py_0.tar.bz2#4750152be22f24d695b3004c5e1712d3 +https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py38h497a2fe_1001.tar.bz2#56753dd777a6517b34966ddcb39af734 +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.2.1-py38hab2c0dc_1.tar.bz2#777186ded2d850f3eab4ce7131c6c17c +https://conda.anaconda.org/conda-forge/linux-64/cryptography-3.4.7-py38ha5dfef3_0.tar.bz2#a8b014aba670157256dabdc885f71af4 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2021.6.0-pyhd8ed1ab_0.tar.bz2#cea7be7ed76c4664498447ef35d2268c +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.22.0-he2bb022_0.tar.bz2#98a82d5f89708b080c39c4e73558b58e +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.0.1-pyhd8ed1ab_0.tar.bz2#c647e77921fd3e245cdcc5b2d451a0f8 +https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py38h5c078b8_1005.tar.bz2#d318a411c4cb595d5adb60ec7b4a46f0 +https://conda.anaconda.org/conda-forge/linux-64/pandas-1.2.4-py38h1abd341_0.tar.bz2#91150ede50b13d34a03e9ef51b7b379f +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.6.3-py38h7b17777_0.tar.bz2#8055079ed82e1ada1cc4714c26d04802 +https://conda.anaconda.org/conda-forge/linux-64/setuptools-49.6.0-py38h578d9bd_3.tar.bz2#59c561cd1be0db9cf1c83f7d7cc74f4d +https://conda.anaconda.org/conda-forge/linux-64/shapely-1.7.1-py38haeee4fe_5.tar.bz2#2e633d8e2257f3c0e465c858ce2ddbc6 +https://conda.anaconda.org/conda-forge/linux-64/bokeh-2.3.2-py38h578d9bd_0.tar.bz2#c417008fc6050795805a34dd0d84c190 +https://conda.anaconda.org/conda-forge/linux-64/cf-units-2.1.5-py38hb5d20a5_0.tar.bz2#b45764dbfe02c18f80458bb241e37955 +https://conda.anaconda.org/conda-forge/linux-64/distributed-2021.6.0-py38h578d9bd_0.tar.bz2#ddaa3cc0da3478d3ea96da2e04717813 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.4.2-py38hcc49a3a_0.tar.bz2#4bfb6818a1fce6d4129fdf121f788505 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.5.6-nompi_py38h5e9db54_103.tar.bz2#72a5656daeee23c80e22b936bef0ceb3 +https://conda.anaconda.org/conda-forge/noarch/pyopenssl-20.0.1-pyhd8ed1ab_0.tar.bz2#92371c25994d0f5d28a01c1fb75ebf86 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2021.03.0-py38hb5d20a5_1.tar.bz2#1586d8fb31f3aa7b2f9f206ed2b9ea7e +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.19.0.post1-py38hc9c980b_0.tar.bz2#65e97172e139d3465895eb07a1fd52f2 +https://conda.anaconda.org/conda-forge/noarch/dask-2021.6.0-pyhd8ed1ab_0.tar.bz2#554ef426ff0ef06641338b7a514d6354 +https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.5-pyhd8ed1ab_0.tar.bz2#36f0ca66d6dd09423e5c2551148d45cd +https://conda.anaconda.org/conda-forge/linux-64/iris-3.0.2-py38h578d9bd_1.tar.bz2#be39010c3f01f3da2050b0a5890795f7 +https://conda.anaconda.org/conda-forge/noarch/requests-2.25.1-pyhd3deb0d_0.tar.bz2#ae687aba31a1c400192a86a2e993ffdc diff --git a/setup.py b/setup.py index 2a4afec4..492543e1 100644 --- a/setup.py +++ b/setup.py @@ -84,8 +84,8 @@ def file_walk_relative(top, remove=''): keywords = ['iris', 'GRIB'], classifiers=[ 'Programming Language :: Python', - 'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.7', + 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3 :: Only', ], # NOTE: The Python 3 bindings to eccodes (eccodes-python) is available on From ac658b404b68f367cd2a56d12dd50439cb3975e9 Mon Sep 17 00:00:00 2001 From: lbdreyer Date: Tue, 8 Mar 2022 12:08:07 +0000 Subject: [PATCH 194/583] Get iris-grib working with latest versions of its dependencies (Iris, eccodes, cftime, cartopy, proj) (#288) --- .cirrus.yml | 12 +- iris_grib/__init__.py | 12 +- iris_grib/_load_convert.py | 6 +- iris_grib/_save_rules.py | 22 ++- .../format_interop/test_name_grib.py | 11 ++ .../NAMEII/0_TRACER_AIR_CONCENTRATION.cml | 6 +- .../name_grib/NAMEII/1_TRACER_DOSAGE.cml | 6 +- .../test_grid_definition_template_10.py | 3 +- .../save_rules/test_set_fixed_surfaces.py | 15 +- noxfile.py | 2 +- requirements/ci/iris-grib.yml | 2 +- requirements/ci/nox.lock/py38-linux-64.lock | 141 ++++++++++++++++++ requirements/ci/py37.yml | 24 --- requirements/ci/py38.yml | 1 + requirements/nox.lock/py37-linux-64.lock | 127 ---------------- requirements/nox.lock/py38-linux-64.lock | 125 ---------------- setup.py | 1 - 17 files changed, 204 insertions(+), 312 deletions(-) create mode 100644 requirements/ci/nox.lock/py38-linux-64.lock delete mode 100644 requirements/ci/py37.yml delete mode 100644 requirements/nox.lock/py37-linux-64.lock delete mode 100644 requirements/nox.lock/py38-linux-64.lock diff --git a/.cirrus.yml b/.cirrus.yml index 16e1a116..203ed889 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -96,16 +96,10 @@ linux_task_template: &LINUX_TASK_TEMPLATE tests_task: matrix: - # TODO: iris-grib does not currently work with iris-main, see Github issue - # #288 and #277. - #- name: "${CIRRUS_OS} tests: iris=repo-main python=3.8" - # env: - # PY_VER: 3.8 - # IRIS_SOURCE: "source" - - name: "${CIRRUS_OS} tests: iris=conda-release python=3.7" + - name: "${CIRRUS_OS} tests: iris=repo-main python=3.8" env: - PY_VER: 3.7 - IRIS_SOURCE: "conda-forge" + PY_VER: 3.8 + IRIS_SOURCE: "source" - name: "${CIRRUS_OS} tests: iris=conda-release python=3.8" env: PY_VER: 3.8 diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index 09c0f4b8..20588385 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -618,8 +618,12 @@ def phenomenon_points(self, time_unit): """ time_reference = '%s since epoch' % time_unit - return cf_units.date2num(self._phenomenonDateTime, time_reference, - cf_units.CALENDAR_GREGORIAN) + return float( + cf_units.date2num( + self._phenomenonDateTime, time_reference, + cf_units.CALENDAR_GREGORIAN + ) + ) def phenomenon_bounds(self, time_unit): """ @@ -630,8 +634,8 @@ def phenomenon_bounds(self, time_unit): # TODO #576 Investigate when it's valid to get phenomenon_bounds time_reference = '%s since epoch' % time_unit unit = cf_units.Unit(time_reference, cf_units.CALENDAR_GREGORIAN) - return [unit.date2num(self._periodStartDateTime), - unit.date2num(self._periodEndDateTime)] + return [float(unit.date2num(self._periodStartDateTime)), + float(unit.date2num(self._periodEndDateTime))] def _longitude_is_cyclic(points): diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index f987479c..7f54173a 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -292,7 +292,7 @@ def reference_time_coord(section): # Current GRIBAPI does not cover GRIB Section 1 - Octets 22-nn (optional) # which are part of GRIB spec v12. unit = Unit('hours since epoch', calendar=CALENDAR_GREGORIAN) - point = unit.date2num(dt) + point = float(unit.date2num(dt)) # Reference Code Table 1.2. significanceOfReferenceTime = section['significanceOfReferenceTime'] @@ -1839,7 +1839,7 @@ def coord_timedelta(coord, value): # Calculate validity (phenomenon) time in forecast-reference-time units. frt_point = frt_coord.units.num2date(frt_coord.points[0]) point_delta = coord_timedelta(fp_coord, fp_coord.points[0]) - point = frt_coord.units.date2num(frt_point + point_delta) + point = float(frt_coord.units.date2num(frt_point + point_delta)) # Calculate bounds (if any) in the same way. if fp_coord.bounds is None: @@ -1847,7 +1847,7 @@ def coord_timedelta(coord, value): else: bounds_deltas = [coord_timedelta(fp_coord, bound_point) for bound_point in fp_coord.bounds[0]] - bounds = [frt_coord.units.date2num(frt_point + delta) + bounds = [float(frt_coord.units.date2num(frt_point + delta)) for delta in bounds_deltas] # Create the time scalar coordinate. diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index 8b437587..32ad8716 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -15,6 +15,7 @@ import cf_units import gribapi +from gribapi import GRIB_MISSING_LONG import numpy as np import numpy.ma as ma @@ -180,13 +181,16 @@ def shape_of_the_earth(cube, grib): # assume latlon cs = cube.coord(dimensions=[0]).coord_system - # Initially set shape_of_earth keys to missing (255 for byte, -1 for long). + # Initially set shape_of_earth keys to missing (255 for byte). gribapi.grib_set_long(grib, "scaleFactorOfRadiusOfSphericalEarth", 255) - gribapi.grib_set_long(grib, "scaledValueOfRadiusOfSphericalEarth", -1) + gribapi.grib_set_long(grib, "scaledValueOfRadiusOfSphericalEarth", + GRIB_MISSING_LONG) gribapi.grib_set_long(grib, "scaleFactorOfEarthMajorAxis", 255) - gribapi.grib_set_long(grib, "scaledValueOfEarthMajorAxis", -1) + gribapi.grib_set_long(grib, "scaledValueOfEarthMajorAxis", + GRIB_MISSING_LONG) gribapi.grib_set_long(grib, "scaleFactorOfEarthMinorAxis", 255) - gribapi.grib_set_long(grib, "scaledValueOfEarthMinorAxis", -1) + gribapi.grib_set_long(grib, "scaledValueOfEarthMinorAxis", + GRIB_MISSING_LONG) if isinstance(cs, GeogCS): ellipsoid = cs @@ -923,9 +927,10 @@ def set_fixed_surfaces(cube, grib, full3d_cube=None): gribapi.grib_set(grib, "scaleFactorOfFirstFixedSurface", 0) gribapi.grib_set(grib, "scaledValueOfFirstFixedSurface", 0) # Set secondary surface = 'missing'. - gribapi.grib_set(grib, "typeOfSecondFixedSurface", -1) + gribapi.grib_set(grib, "typeOfSecondFixedSurface", 255) gribapi.grib_set(grib, "scaleFactorOfSecondFixedSurface", 255) - gribapi.grib_set(grib, "scaledValueOfSecondFixedSurface", -1) + gribapi.grib_set(grib, "scaledValueOfSecondFixedSurface", + GRIB_MISSING_LONG) elif not v_coord.has_bounds(): # No second surface output_v = v_coord.units.convert(v_coord.points[0], output_unit) @@ -936,9 +941,10 @@ def set_fixed_surfaces(cube, grib, full3d_cube=None): gribapi.grib_set(grib, "typeOfFirstFixedSurface", grib_v_code) gribapi.grib_set(grib, "scaleFactorOfFirstFixedSurface", 0) gribapi.grib_set(grib, "scaledValueOfFirstFixedSurface", output_v) - gribapi.grib_set(grib, "typeOfSecondFixedSurface", -1) + gribapi.grib_set(grib, "typeOfSecondFixedSurface", 255) gribapi.grib_set(grib, "scaleFactorOfSecondFixedSurface", 255) - gribapi.grib_set(grib, "scaledValueOfSecondFixedSurface", -1) + gribapi.grib_set(grib, "scaledValueOfSecondFixedSurface", + GRIB_MISSING_LONG) else: # bounded : set lower+upper surfaces output_v = v_coord.units.convert(v_coord.bounds[0], output_unit) diff --git a/iris_grib/tests/integration/format_interop/test_name_grib.py b/iris_grib/tests/integration/format_interop/test_name_grib.py index 00ad9d85..15b82142 100644 --- a/iris_grib/tests/integration/format_interop/test_name_grib.py +++ b/iris_grib/tests/integration/format_interop/test_name_grib.py @@ -29,6 +29,7 @@ def name_cb(cube, field, filename): if z_coord: z_coord[0].standard_name = "height" z_coord[0].long_name = "height above ground level" + z_coord[0].attributes = {'positive': 'up'} class TestNameToGRIB(tests.IrisGribTest): @@ -71,6 +72,11 @@ def test_name2_field(self): warnings.warn(msg.format(i, name_cube.name())) continue + # Iris>=3.2 loads in an extra 'z' coordinate which cannot currently + # be save to GRIB. + if name_cube.coords('z'): + name_cube.remove_coord('z') + with self.temp_filename(".grib2") as temp_filename: iris.save(name_cube, temp_filename) grib_cube = iris.load_cube(temp_filename, callback=name_cb) @@ -92,6 +98,11 @@ def test_name3_field(self): filepath = tests.get_data_path(("NAME", "NAMEIII_field.txt")) name_cubes = iris.load(filepath) for i, name_cube in enumerate(name_cubes): + # Iris>=3.2 loads in an extra 'z' coordinate which cannot currently + # be save to GRIB. + if name_cube.coord('z') is not None: + name_cube.remove_coord('z') + with self.temp_filename(".grib2") as temp_filename: iris.save(name_cube, temp_filename) grib_cube = iris.load_cube(temp_filename, callback=name_cb) diff --git a/iris_grib/tests/results/integration/name_grib/NAMEII/0_TRACER_AIR_CONCENTRATION.cml b/iris_grib/tests/results/integration/name_grib/NAMEII/0_TRACER_AIR_CONCENTRATION.cml index b0daf509..1eb16eaf 100644 --- a/iris_grib/tests/results/integration/name_grib/NAMEII/0_TRACER_AIR_CONCENTRATION.cml +++ b/iris_grib/tests/results/integration/name_grib/NAMEII/0_TRACER_AIR_CONCENTRATION.cml @@ -9,7 +9,11 @@ - + + + + + - + + + + + Path: """ lockfile_name = f"py{session.python.replace('.', '')}-linux-64.lock" - return Path("requirements/nox.lock") / lockfile_name + return Path("requirements/ci/nox.lock") / lockfile_name def _file_content(file_path: Path) -> str: diff --git a/requirements/ci/iris-grib.yml b/requirements/ci/iris-grib.yml index e9adb956..a76932b5 120000 --- a/requirements/ci/iris-grib.yml +++ b/requirements/ci/iris-grib.yml @@ -1 +1 @@ -py37.yml \ No newline at end of file +py38.yml \ No newline at end of file diff --git a/requirements/ci/nox.lock/py38-linux-64.lock b/requirements/ci/nox.lock/py38-linux-64.lock new file mode 100644 index 00000000..74506936 --- /dev/null +++ b/requirements/ci/nox.lock/py38-linux-64.lock @@ -0,0 +1,141 @@ +# Generated by conda-lock. +# platform: linux-64 +# input_hash: 7035385083b1ee27d72762b3b315668678ee6f326c3e5a9e72c3d400163803b0 +@EXPLICIT +https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2021.10.8-ha878542_0.tar.bz2#575611b8a84f45960e87722eeb51fa26 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.36.1-hea4e1c9_2.tar.bz2#bd4f2e711b39af170e7ff15163fe87ee +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-11.2.0-h5c6108e_13.tar.bz2#b62e87134ec17e1180cfcb3951624db4 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-11.2.0-he4da1e4_13.tar.bz2#573a74710fad22a27da784cc238150b9 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-11.2.0-h69a702a_13.tar.bz2#a3a07a89af69d1eada078695b42e4961 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-11.2.0-h1d223b6_13.tar.bz2#8e91f1f21417c9ab1265240ee4f9db1e +https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-1_gnu.tar.bz2#561e277319a41d4f24f5c05a9ef63c04 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-11.2.0-h1d223b6_13.tar.bz2#63eaf0f146cc80abd84743d48d667da4 +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.6-h27087fc_0.tar.bz2#90dec9e76bc164857cc200f81e981dab +https://conda.anaconda.org/conda-forge/linux-64/geos-3.10.2-h9c3ff4c_0.tar.bz2#fe9a66a351bfa7a84c3108304c7bcba5 +https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.1-h36c2ea0_2.tar.bz2#626e68ae9cc5912d6adb79d318cf962d +https://conda.anaconda.org/conda-forge/linux-64/jbig-2.1-h7f98852_2003.tar.bz2#1aa0cee79792fa97b7ff4545110b60bf +https://conda.anaconda.org/conda-forge/linux-64/jpeg-9e-h7f98852_0.tar.bz2#5c214edc675a7fb7cbb34b1d854e5141 +https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 +https://conda.anaconda.org/conda-forge/linux-64/lerc-3.0-h9c3ff4c_0.tar.bz2#7fcefde484980d23f0ec24c11e314d2e +https://conda.anaconda.org/conda-forge/linux-64/libaec-1.0.6-h9c3ff4c_0.tar.bz2#c77f5e4e418fa47d699d6afa54c5d444 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.0.9-h7f98852_6.tar.bz2#b0f44f63f7d771d7670747a1dd5d5ac1 +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.10-h7f98852_0.tar.bz2#ffa3a757a97e851293909b49f49f28fb +https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h516909a_1.tar.bz2#6f8720dff19e17ce5d48cfe7f3d2f0a3 +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 +https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-he1b5a44_1001.tar.bz2#8208602aec4826053c116552369a394c +https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d +https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.0-h7f98852_0.tar.bz2#39b1328babf85c7c3a61636d9cd50206 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.18-pthreads_h8fe5266_0.tar.bz2#41532e4448c0cce086d6570f95e4e12e +https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.2.2-h7f98852_1.tar.bz2#46cf26ecc8775a0aab300ea1821aaa3c +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/ncurses-6.3-h9c3ff4c_0.tar.bz2#fb31bcb7af058244479ca635d20f0f4a +https://conda.anaconda.org/conda-forge/linux-64/openssl-1.1.1l-h7f98852_0.tar.bz2#de7b38a1542dbe6f41653a8ae71adc53 +https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 +https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b +https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.9-h7f98852_0.tar.bz2#bf6f803a544f26ebbdc3bfff272eb179 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2#be93aabceefa2fac576e971aef407908 +https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h7f98852_1002.tar.bz2#1e15f6ad85a7d743a2ac68dae6c82b98 +https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007.tar.bz2#b4a4381d54784606820704f7b5f05a15 +https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.0-h7f98852_3.tar.bz2#52402c791f35e414e704b7a113f99605 +https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.5-h516909a_1.tar.bz2#33f601066901f3e1a85af3522a8113f9 +https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-13_linux64_openblas.tar.bz2#8a4038563ed92dfa622bd72c0d8f31d3 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.0.9-h7f98852_6.tar.bz2#c7c03a2592cac92246a13a0732bd1573 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.0.9-h7f98852_6.tar.bz2#28bfe0a70154e6881da7bae97517c948 +https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 +https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.13-h7f98852_1004.tar.bz2#b3653fdc58d03face9724f602218a904 +https://conda.anaconda.org/conda-forge/linux-64/readline-8.1-h46c0cb4_0.tar.bz2#5788de3c8d7a7d64ac56c784c4ef48e6 +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 +https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-hc3e0081_0.tar.bz2#d4c341e0379c31e9e781d4f204726867 +https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 +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.2-ha95c52a_0.tar.bz2#5222b231b1ef49a7f60d40b363469b70 +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/krb5-1.19.2-h3790be6_4.tar.bz2#dbbd32092ee31aab0f2d213e8f9f1b40 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-13_linux64_openblas.tar.bz2#b17676dbd6688396c3a3076259fb7907 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-13_linux64_openblas.tar.bz2#018b80e8f21d8560ae4961567e3e00c9 +https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.47.0-h727a467_0.tar.bz2#a22567abfea169ff8048506b1ca9b230 +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-h542a066_3.tar.bz2#1a0efb4dfd880b0376da8e1ba39fa838 +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/sqlite-3.37.0-h9cd32fc_0.tar.bz2#eb66fc098824d25518a79e83d12a81d6 +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/brotli-1.0.9-h7f98852_6.tar.bz2#612385c4a83edb0619fe911d9da317f4 +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/lcms2-2.12-hddcbb42_0.tar.bz2#797117394a4aa588de6d741b06fad80f +https://conda.anaconda.org/conda-forge/linux-64/libcurl-7.81.0-h2574ce0_0.tar.bz2#1f8655741d0269ca6756f131522da1e8 +https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.2.2-h3452ae3_0.tar.bz2#c363665b4aabe56aae4f8981cff5b153 +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.4.0-hb52868f_1.tar.bz2#b7ad78ad2e9ee155f59e6428406ee824 +https://conda.anaconda.org/conda-forge/linux-64/python-3.8.12-ha38a3c6_3_cpython.tar.bz2#bed445cebcd8f97dce76dc06201928ee +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h7f98852_1.tar.bz2#536cc5db4d0a3ba0630541aec064b5e4 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a +https://conda.anaconda.org/conda-forge/noarch/attrs-21.4.0-pyhd8ed1ab_0.tar.bz2#f70280205d7044c8b8358c8de3190e5d +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-2.0.12-pyhd8ed1ab_0.tar.bz2#1f5b32dabae0f1893ae3283dac7f799e +https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.0.0-pyhd8ed1ab_0.tar.bz2#3a8fc8b627d5fb6af827e126a10a86c6 +https://conda.anaconda.org/conda-forge/linux-64/curl-7.81.0-h2574ce0_0.tar.bz2#3a95d393b490f82aa406f1892fad84d9 +https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb +https://conda.anaconda.org/conda-forge/noarch/filelock-3.6.0-pyhd8ed1ab_0.tar.bz2#6e03ca6c7b47a4152a2b12c6eee3bd32 +https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.2-pyhd8ed1ab_0.tar.bz2#c2a60dd9f1210b8ee2037f7d0ec6251a +https://conda.anaconda.org/conda-forge/noarch/fsspec-2022.2.0-pyhd8ed1ab_0.tar.bz2#f31e31092035d427b05233ab924c7613 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.12.1-nompi_h2386368_104.tar.bz2#9607caa4c7df524ab6ddf6005ffa6731 +https://conda.anaconda.org/conda-forge/noarch/idna-3.3-pyhd8ed1ab_0.tar.bz2#40b50b8b030f5f2f22085c062ed013dd +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 +https://conda.anaconda.org/conda-forge/noarch/pep8-1.7.1-py_0.tar.bz2#d0b5bc3aebbffcb175bf8a1d419acb79 +https://conda.anaconda.org/conda-forge/linux-64/proj-8.2.1-h277dcde_0.tar.bz2#f2ceb1be6565c35e2db0ac948754751d +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.0.7-pyhd8ed1ab_0.tar.bz2#727e2216d9c47455d8ddc060eb2caad9 +https://conda.anaconda.org/conda-forge/noarch/pyshp-2.2.0-pyhd8ed1ab_0.tar.bz2#2aa546be05be34b8e1744afd327b623f +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.8-2_cp38.tar.bz2#bfbb29d517281e78ac53e48d21e6e860 +https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 +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.1-pyhd8ed1ab_0.tar.bz2#1ca02aaf78d9c70d9a81a3bed5752022 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 +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/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/freeglut-3.2.2-h9c3ff4c_1.tar.bz2#1192066d1296de9b492175a4cf43fe8a +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/libnetcdf-4.8.1-nompi_hb3fd0d9_101.tar.bz2#f51a2170153d740fd9324534e71cd8a0 +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.0-py38h0a891b7_1.tar.bz2#60eff55f2a845f35e58bd0be235fe4b7 +https://conda.anaconda.org/conda-forge/linux-64/mock-4.0.3-py38h578d9bd_2.tar.bz2#216a7cebe9c35fcb8bcbe3ed5b315ae1 +https://conda.anaconda.org/conda-forge/linux-64/numpy-1.22.2-py38h6ae9a64_0.tar.bz2#065a900932f904e0182acfcfadc467e3 +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-9.0.1-py38h0ee0e06_2.tar.bz2#3aa55d569eaf224b3a18d9b6223a526d +https://conda.anaconda.org/conda-forge/linux-64/pysocks-1.7.1-py38h578d9bd_4.tar.bz2#9c4bbee6f682f2fc7d7803df3996e77e +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-3.0.0-py38h0a891b7_0.tar.bz2#12eaa8cbfedfbf7879e5653467b03c94 +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-60.9.3-py38h578d9bd_0.tar.bz2#864b832ea94d9c0b37ddfbbb8adb42f1 +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/brotlipy-0.7.0-py38h497a2fe_1003.tar.bz2#9189b42c42b9c87b2b2068cbe31901a8 +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.0-py38h3ec907f_0.tar.bz2#35411e5fc8dd523f9e68316847e6a25b +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-2022.2.1-pyhd8ed1ab_0.tar.bz2#0cb751f07e68fda1d631a02faa66f0de +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.29.1-py38h497a2fe_0.tar.bz2#121e02be214af4980911bb2cbd5b2742 +https://conda.anaconda.org/conda-forge/linux-64/jasper-2.0.33-ha77e612_0.tar.bz2#054883e8ea7142e89bcbec08b5d401ea +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.0.3-pyhd8ed1ab_0.tar.bz2#036d872c653780cb26e797e2e2f61b4c +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/pip-22.0.4-pyhd8ed1ab_0.tar.bz2#b1239ce8ef2a1eec485c398a683c5bff +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.3.0-py38h5383654_1.tar.bz2#5b600e019fa7c33be73bdb626236936b +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.8.0-py38h56a6a73_1.tar.bz2#86073932d9e675c5929376f6f8b79b97 +https://conda.anaconda.org/conda-forge/linux-64/shapely-1.8.0-py38h596eeab_5.tar.bz2#ec3b783081e14a9dc0eb5ce609649728 +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.0.1-py38h6c62de6_2.tar.bz2#350322b046c129e5802b79358a1343f7 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.25.0-hc08acdf_0.tar.bz2#b7b2677cdf0fe54885d72280ecff58af +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/netcdf4-1.5.8-nompi_py38h2823cc8_101.tar.bz2#1dfe1cdee4532c72f893955259eb3de9 +https://conda.anaconda.org/conda-forge/noarch/pyopenssl-22.0.0-pyhd8ed1ab_0.tar.bz2#1d7e241dfaf5475e893d4b824bb71b44 +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.20.2-py38ha217159_3.tar.bz2#d7461e191f7a0522e4709612786bdf4e +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.4.0-py38h6c62de6_0.tar.bz2#99a827766a8c3a68f1a51dd51b388aef +https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.8-pyhd8ed1ab_1.tar.bz2#53f1387c68c21cecb386e2cde51b3f7c +https://conda.anaconda.org/conda-forge/noarch/iris-3.2.0.post0-pyhd8ed1ab_0.tar.bz2#80f5a40bea1c67acded6d3d6301e81a3 +https://conda.anaconda.org/conda-forge/noarch/requests-2.27.1-pyhd8ed1ab_0.tar.bz2#7c1c427246b057b8fa97200ecdb2ed62 diff --git a/requirements/ci/py37.yml b/requirements/ci/py37.yml deleted file mode 100644 index 68e0f80e..00000000 --- a/requirements/ci/py37.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: iris-grib-dev - -channels: - - conda-forge - -dependencies: - - python=3.7 - -# Setup dependencies. - - setuptools - -# Core dependencies. - - iris>=3.0.2 - - python-eccodes - -# Optional dependencies. - - mo_pack - -# Test dependencies. - - mock - - filelock - - pep8 - - requests - - nose diff --git a/requirements/ci/py38.yml b/requirements/ci/py38.yml index 3836de41..5fa58bb1 100644 --- a/requirements/ci/py38.yml +++ b/requirements/ci/py38.yml @@ -15,6 +15,7 @@ dependencies: # Optional dependencies. - mo_pack + - pip # Test dependencies. - mock diff --git a/requirements/nox.lock/py37-linux-64.lock b/requirements/nox.lock/py37-linux-64.lock deleted file mode 100644 index 21a9029d..00000000 --- a/requirements/nox.lock/py37-linux-64.lock +++ /dev/null @@ -1,127 +0,0 @@ -# platform: linux-64 -# env_hash: 79ed224559178fc9f6977fee4e2d80112f2bb8577c135e85152ef0a1f13ef003 -@EXPLICIT -https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2021.5.30-ha878542_0.tar.bz2#6a777890e94194dc94a29a76d2a7e721 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.35.1-hea4e1c9_2.tar.bz2#83610dba766a186bdc7a116053b782a4 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-9.3.0-hff62375_19.tar.bz2#c2d8da3cb171e4aa642d20c6e4e42a04 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-9.3.0-h6de172a_19.tar.bz2#cd9a24a8dde03ec0cf0e603b0bea85a1 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-9.3.0-hff62375_19.tar.bz2#aea379bd68fdcdf9499fa1453f852ac1 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-9.3.0-h2828fa1_19.tar.bz2#ab0a307912033126da02507b59e79ec9 -https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-1_gnu.tar.bz2#561e277319a41d4f24f5c05a9ef63c04 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-9.3.0-h2828fa1_19.tar.bz2#9d5cdfc51476ee4dcdd96ed2dca3f943 -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.17.1-h7f98852_1.tar.bz2#ed1dc233ed5e3eaa9bfbaac64d130c5e -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/geos-3.9.1-h9c3ff4c_2.tar.bz2#b9a6d9422aed3ad84ec6ccee9bfcaa0f -https://conda.anaconda.org/conda-forge/linux-64/jbig-2.1-h7f98852_2003.tar.bz2#1aa0cee79792fa97b7ff4545110b60bf -https://conda.anaconda.org/conda-forge/linux-64/jpeg-9d-h36c2ea0_0.tar.bz2#ea02ce6037dbe81803ae6123e5ba1568 -https://conda.anaconda.org/conda-forge/linux-64/lerc-2.2.1-h9c3ff4c_0.tar.bz2#ea833dcaeb9e7ac4fac521f1a7abec82 -https://conda.anaconda.org/conda-forge/linux-64/libaec-1.0.4-h9c3ff4c_1.tar.bz2#90dbd3066828b76fa810578e49cef920 -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.7-h7f98852_5.tar.bz2#10e242842cd30c59c12d79371dc0f583 -https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h516909a_1.tar.bz2#6f8720dff19e17ce5d48cfe7f3d2f0a3 -https://conda.anaconda.org/conda-forge/linux-64/libffi-3.3-h58526e2_2.tar.bz2#665369991d8dd290ac5ee92fce3e6bf5 -https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.15-pthreads_h8fe5266_1.tar.bz2#bb5527a16584426a897f22643d9a36a6 -https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.2.0-h7f98852_2.tar.bz2#fb63a035a3b552c88a30d84b89ebf4c4 -https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.3-h9c3ff4c_0.tar.bz2#4eb64ee0d5cd43096ffcf843c76b05d4 -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.2-h58526e2_4.tar.bz2#509f2a21c4a09214cd737a480dfd80c9 -https://conda.anaconda.org/conda-forge/linux-64/openssl-1.1.1k-h7f98852_0.tar.bz2#07fae2cb088379c8441e0f3ffa1f4025 -https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.0-h7f98852_3.tar.bz2#52402c791f35e414e704b7a113f99605 -https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.5-h516909a_1.tar.bz2#33f601066901f3e1a85af3522a8113f9 -https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h516909a_0.tar.bz2#03a530e925414902547cf48da7756db8 -https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.11-h516909a_1010.tar.bz2#339cc5584e6d26bc73a875ba900028c3 -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/jasper-1.900.1-h07fcdf6_1006.tar.bz2#babe76b3c95cc3e9005a66855ffe4e21 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-9_openblas.tar.bz2#5f08755e98b2a43ca68124e629a5a0cb -https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.43.0-h812cca2_0.tar.bz2#1867d1e9658596b3fac8847a7702eef4 -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.9.0-ha56f1ee_6.tar.bz2#f0dfb86444df325e599dbc3f4c0a3f5b -https://conda.anaconda.org/conda-forge/linux-64/libzip-1.7.3-h4de3113_0.tar.bz2#2568763f88009f95e9262cba837dbb82 -https://conda.anaconda.org/conda-forge/linux-64/readline-8.1-h46c0cb4_0.tar.bz2#5788de3c8d7a7d64ac56c784c4ef48e6 -https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.10-h21135ba_1.tar.bz2#c647f70aa7e3d4cc4e029cc1c9a99953 -https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.27.27-h975c496_1.tar.bz2#e663bd5dbc8cc4c1647d9f51cf25872c -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/freetype-2.10.4-h0708190_1.tar.bz2#4a06f2ac2e5bfae7b6b245171c3f07aa -https://conda.anaconda.org/conda-forge/linux-64/krb5-1.19.1-hcc1bbae_0.tar.bz2#59b0695a515a6c54d45463dbf208ae38 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-9_openblas.tar.bz2#edee85b4f83376ceae81e0975b8bffa2 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-9_openblas.tar.bz2#572d84ab07962986f6dd8e4637a475ca -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.3.0-hf544144_1.tar.bz2#a65a4158716bd7d95bfa69bcfd83081c -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.35.5-h74cdb3f_0.tar.bz2#e876c82c21e7074d299e13762d02466c -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.77.0-h2574ce0_0.tar.bz2#05cf8dca8408b5f1ffcc5e2d5a7c5da2 -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.4.0-hb52868f_1.tar.bz2#b7ad78ad2e9ee155f59e6428406ee824 -https://conda.anaconda.org/conda-forge/linux-64/python-3.7.10-hffdb5ce_100_cpython.tar.bz2#7425fffa658971915f595e9110163c3c -https://conda.anaconda.org/conda-forge/noarch/attrs-21.2.0-pyhd8ed1ab_0.tar.bz2#d2e1c7f388ac403df7079b411c37cc50 -https://conda.anaconda.org/conda-forge/noarch/cloudpickle-1.6.0-py_0.tar.bz2#76d764d8881719e305f6fa368dc2b65e -https://conda.anaconda.org/conda-forge/linux-64/curl-7.77.0-hea6ffbf_0.tar.bz2#7d1168349d6fba67ae1fdf61970b83e1 -https://conda.anaconda.org/conda-forge/noarch/filelock-3.0.12-pyh9f0ad1d_0.tar.bz2#7544ed05bbbe9bb687bc9bcbe4d6cb46 -https://conda.anaconda.org/conda-forge/noarch/fsspec-2021.5.0-pyhd8ed1ab_0.tar.bz2#da823f51ebb876dafbed1c892fd80956 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.10.6-nompi_h6a2412b_1114.tar.bz2#0a2984b78f51148d7ff6219abe73509e -https://conda.anaconda.org/conda-forge/noarch/heapdict-1.0.1-py_0.tar.bz2#77242bfb1e74a627fb06319b5a2d3b95 -https://conda.anaconda.org/conda-forge/noarch/idna-2.10-pyh9f0ad1d_0.tar.bz2#f95a12b4f435aae6680fe55ae2eb1b06 -https://conda.anaconda.org/conda-forge/noarch/locket-0.2.0-py_2.tar.bz2#709e8671651c7ec3d1ad07800339ff1d -https://conda.anaconda.org/conda-forge/noarch/nose-1.3.7-py_1006.tar.bz2#382019d5f8e9362ef6f60a8d4e7bce8f -https://conda.anaconda.org/conda-forge/noarch/olefile-0.46-pyh9f0ad1d_1.tar.bz2#0b2e68acc8c78c8cc392b90983481f58 -https://conda.anaconda.org/conda-forge/noarch/pep8-1.7.1-py_0.tar.bz2#d0b5bc3aebbffcb175bf8a1d419acb79 -https://conda.anaconda.org/conda-forge/linux-64/proj-7.2.0-h277dcde_2.tar.bz2#db654ee11298d3463bad67445707654c -https://conda.anaconda.org/conda-forge/noarch/pycparser-2.20-pyh9f0ad1d_2.tar.bz2#aa798d50ffd182a0f6f31478c7f434f6 -https://conda.anaconda.org/conda-forge/noarch/pyke-1.1.1-pyhd8ed1ab_1004.tar.bz2#5f0236abfbb6d53826d1afed1e64f82e -https://conda.anaconda.org/conda-forge/noarch/pyparsing-2.4.7-pyh9f0ad1d_0.tar.bz2#626c4f20d5bf06dcec9cf2eaa31725c7 -https://conda.anaconda.org/conda-forge/noarch/pyshp-2.1.3-pyh44b312d_0.tar.bz2#2d1867b980785eb44b8122184d8b42a6 -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.7-1_cp37m.tar.bz2#658a5c3d766bfc6574480204b10a6f20 -https://conda.anaconda.org/conda-forge/noarch/pytz-2021.1-pyhd8ed1ab_0.tar.bz2#3af2e9424d5eb0063824a3f9b850d411 -https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 -https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_0.tar.bz2#6d6552722448103793743dabfbda532d -https://conda.anaconda.org/conda-forge/noarch/tblib-1.7.0-pyhd8ed1ab_0.tar.bz2#3d4afc31302aa7be471feb6be048ed76 -https://conda.anaconda.org/conda-forge/noarch/toolz-0.11.1-py_0.tar.bz2#d1e66b58cb00b3817ad9f05eec098c00 -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-3.10.0.0-pyha770c72_0.tar.bz2#67c0cba6533b641f28946d7c16f361c8 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.4.1-pyhd8ed1ab_0.tar.bz2#a4fa30eb74a326092b3d8078b1f1aae1 -https://conda.anaconda.org/conda-forge/linux-64/antlr-python-runtime-4.7.2-py37h89c1867_1002.tar.bz2#cf3aeeb80dbd517761019a8edcd5b108 -https://conda.anaconda.org/conda-forge/linux-64/certifi-2021.5.30-py37h89c1867_0.tar.bz2#105f18ae8597a5f4d4e3188bcb06c796 -https://conda.anaconda.org/conda-forge/linux-64/cffi-1.14.5-py37hc58025e_0.tar.bz2#e05f1fad0c52c21b6b92778d31f89cd0 -https://conda.anaconda.org/conda-forge/linux-64/chardet-4.0.0-py37h89c1867_1.tar.bz2#f4fbd4721b80f0d6b53b3a3374914068 -https://conda.anaconda.org/conda-forge/noarch/cycler-0.10.0-py_2.tar.bz2#f6d7c7e6d8f42cbbec7e07a8d879f91c -https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.11.0-py37h5e8e339_3.tar.bz2#2e89a6f3baf5eeb13763f61ea3d0601f -https://conda.anaconda.org/conda-forge/linux-64/importlib-metadata-4.5.0-py37h89c1867_0.tar.bz2#71a9d20403f28d15f7a94d0817584efa -https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.3.1-py37h2527ec5_1.tar.bz2#61149814e0ea71cb5b44881c65d25f7b -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.8.0-nompi_hcd642e3_103.tar.bz2#a4c691f7630ad2cbcc1f1298b4b15ded -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.0.1-py37h5e8e339_0.tar.bz2#90ad307f6997784664de956e09ec689e -https://conda.anaconda.org/conda-forge/linux-64/mock-4.0.3-py37h89c1867_1.tar.bz2#b45c06a416e3f3f74fab9b7b5964c17a -https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.0.2-py37h2527ec5_1.tar.bz2#07952b04eee02d873daa311a35b27454 -https://conda.anaconda.org/conda-forge/linux-64/numpy-1.20.3-py37h038b26d_1.tar.bz2#4644df846d272b6316503418db23b5dd -https://conda.anaconda.org/conda-forge/noarch/packaging-20.9-pyh44b312d_0.tar.bz2#be69a38e912054a62dc82cc3c7711a64 -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-8.2.0-py37h4600e1f_1.tar.bz2#8998270d7ebbb22261ab440176d3a5cf -https://conda.anaconda.org/conda-forge/linux-64/psutil-5.8.0-py37h5e8e339_1.tar.bz2#2923250371b05e798f3732531cdb5300 -https://conda.anaconda.org/conda-forge/linux-64/pysocks-1.7.1-py37h89c1867_3.tar.bz2#bd069d59ee91a2e26552cd7bb4c64032 -https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.1-py_0.tar.bz2#0d0150ed9c2d25817f5324108d3f7571 -https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-2.0.2-py37h5e8e339_0.tar.bz2#3f1e633378cd3c8b1ce13b3f2f5eadd7 -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-5.4.1-py37h5e8e339_0.tar.bz2#090550b9425fe9a87dc1ec7fde201633 -https://conda.anaconda.org/conda-forge/linux-64/tornado-6.1-py37h5e8e339_1.tar.bz2#92449128c4639feae48d731ef2186099 -https://conda.anaconda.org/conda-forge/noarch/zict-2.0.0-py_0.tar.bz2#4750152be22f24d695b3004c5e1712d3 -https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py37h5e8e339_1001.tar.bz2#871eed4ba322e7b3f200956a096b34e7 -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.2.1-py37h161383b_1.tar.bz2#314ca8b00ed742f8c46a6cc68d84d90f -https://conda.anaconda.org/conda-forge/linux-64/click-8.0.1-py37h89c1867_0.tar.bz2#bb1ad97b5d8626f662b753f620c3c913 -https://conda.anaconda.org/conda-forge/linux-64/cryptography-3.4.7-py37h5d9358c_0.tar.bz2#d811fb6a96ae0cf8c0a17457a8e67ff4 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2021.6.0-pyhd8ed1ab_0.tar.bz2#cea7be7ed76c4664498447ef35d2268c -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.22.0-he2bb022_0.tar.bz2#98a82d5f89708b080c39c4e73558b58e -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.0.1-pyhd8ed1ab_0.tar.bz2#c647e77921fd3e245cdcc5b2d451a0f8 -https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py37h902c9e0_1005.tar.bz2#40db532422636dd1e980154114486a00 -https://conda.anaconda.org/conda-forge/linux-64/pandas-1.2.4-py37h219a48f_0.tar.bz2#fb33763b90acf1a4a7cffb7ab994a3cd -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.6.3-py37h29e03ee_0.tar.bz2#a469d02f72b9cef07f4408d419b17dcc -https://conda.anaconda.org/conda-forge/linux-64/setuptools-49.6.0-py37h89c1867_3.tar.bz2#928c178bf6805b8ab71fabaa620e0234 -https://conda.anaconda.org/conda-forge/linux-64/shapely-1.7.1-py37h2d1e849_5.tar.bz2#451beb59aca4c165e68fbe8be3a37149 -https://conda.anaconda.org/conda-forge/linux-64/bokeh-2.3.2-py37h89c1867_0.tar.bz2#2c0224d9598b7c4fef87536ecbfc87af -https://conda.anaconda.org/conda-forge/linux-64/cf-units-2.1.5-py37h6f94858_0.tar.bz2#5ad0ed053fc1c3bf156cf181cdded003 -https://conda.anaconda.org/conda-forge/linux-64/distributed-2021.6.0-py37h89c1867_0.tar.bz2#c8228e953e50cc4a62087c477f8efb02 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.4.2-py37hdd32ed1_0.tar.bz2#ee755b80aae171058a46c5d7badd08ff -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.5.6-nompi_py37h946d57d_103.tar.bz2#600a3ba1f0b13ca31d4f593f1fa490b4 -https://conda.anaconda.org/conda-forge/noarch/pyopenssl-20.0.1-pyhd8ed1ab_0.tar.bz2#92371c25994d0f5d28a01c1fb75ebf86 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2021.03.0-py37h6f94858_1.tar.bz2#45cd92e3c2048aa78cf81f78756632fc -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.19.0.post1-py37h0c48da3_0.tar.bz2#44add1e9550c8caf69ce64561ce73035 -https://conda.anaconda.org/conda-forge/noarch/dask-2021.6.0-pyhd8ed1ab_0.tar.bz2#554ef426ff0ef06641338b7a514d6354 -https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.5-pyhd8ed1ab_0.tar.bz2#36f0ca66d6dd09423e5c2551148d45cd -https://conda.anaconda.org/conda-forge/linux-64/iris-3.0.2-py37h89c1867_1.tar.bz2#6f48b8b5c25ba3fde73b84de106d1052 -https://conda.anaconda.org/conda-forge/noarch/requests-2.25.1-pyhd3deb0d_0.tar.bz2#ae687aba31a1c400192a86a2e993ffdc diff --git a/requirements/nox.lock/py38-linux-64.lock b/requirements/nox.lock/py38-linux-64.lock deleted file mode 100644 index ceebcf28..00000000 --- a/requirements/nox.lock/py38-linux-64.lock +++ /dev/null @@ -1,125 +0,0 @@ -# platform: linux-64 -# env_hash: 5b63d4ac76488b1798081b1ae9ca6cae022cc090016e4838a6e53c3ca1bb6e53 -@EXPLICIT -https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2021.5.30-ha878542_0.tar.bz2#6a777890e94194dc94a29a76d2a7e721 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.35.1-hea4e1c9_2.tar.bz2#83610dba766a186bdc7a116053b782a4 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-9.3.0-hff62375_19.tar.bz2#c2d8da3cb171e4aa642d20c6e4e42a04 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-9.3.0-h6de172a_19.tar.bz2#cd9a24a8dde03ec0cf0e603b0bea85a1 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-9.3.0-hff62375_19.tar.bz2#aea379bd68fdcdf9499fa1453f852ac1 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-9.3.0-h2828fa1_19.tar.bz2#ab0a307912033126da02507b59e79ec9 -https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-1_gnu.tar.bz2#561e277319a41d4f24f5c05a9ef63c04 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-9.3.0-h2828fa1_19.tar.bz2#9d5cdfc51476ee4dcdd96ed2dca3f943 -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.17.1-h7f98852_1.tar.bz2#ed1dc233ed5e3eaa9bfbaac64d130c5e -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/geos-3.9.1-h9c3ff4c_2.tar.bz2#b9a6d9422aed3ad84ec6ccee9bfcaa0f -https://conda.anaconda.org/conda-forge/linux-64/jbig-2.1-h7f98852_2003.tar.bz2#1aa0cee79792fa97b7ff4545110b60bf -https://conda.anaconda.org/conda-forge/linux-64/jpeg-9d-h36c2ea0_0.tar.bz2#ea02ce6037dbe81803ae6123e5ba1568 -https://conda.anaconda.org/conda-forge/linux-64/lerc-2.2.1-h9c3ff4c_0.tar.bz2#ea833dcaeb9e7ac4fac521f1a7abec82 -https://conda.anaconda.org/conda-forge/linux-64/libaec-1.0.4-h9c3ff4c_1.tar.bz2#90dbd3066828b76fa810578e49cef920 -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.7-h7f98852_5.tar.bz2#10e242842cd30c59c12d79371dc0f583 -https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h516909a_1.tar.bz2#6f8720dff19e17ce5d48cfe7f3d2f0a3 -https://conda.anaconda.org/conda-forge/linux-64/libffi-3.3-h58526e2_2.tar.bz2#665369991d8dd290ac5ee92fce3e6bf5 -https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.15-pthreads_h8fe5266_1.tar.bz2#bb5527a16584426a897f22643d9a36a6 -https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.2.0-h7f98852_2.tar.bz2#fb63a035a3b552c88a30d84b89ebf4c4 -https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.3-h9c3ff4c_0.tar.bz2#4eb64ee0d5cd43096ffcf843c76b05d4 -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.2-h58526e2_4.tar.bz2#509f2a21c4a09214cd737a480dfd80c9 -https://conda.anaconda.org/conda-forge/linux-64/openssl-1.1.1k-h7f98852_0.tar.bz2#07fae2cb088379c8441e0f3ffa1f4025 -https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.0-h7f98852_3.tar.bz2#52402c791f35e414e704b7a113f99605 -https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.5-h516909a_1.tar.bz2#33f601066901f3e1a85af3522a8113f9 -https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h516909a_0.tar.bz2#03a530e925414902547cf48da7756db8 -https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.11-h516909a_1010.tar.bz2#339cc5584e6d26bc73a875ba900028c3 -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/jasper-1.900.1-h07fcdf6_1006.tar.bz2#babe76b3c95cc3e9005a66855ffe4e21 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-9_openblas.tar.bz2#5f08755e98b2a43ca68124e629a5a0cb -https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.43.0-h812cca2_0.tar.bz2#1867d1e9658596b3fac8847a7702eef4 -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.9.0-ha56f1ee_6.tar.bz2#f0dfb86444df325e599dbc3f4c0a3f5b -https://conda.anaconda.org/conda-forge/linux-64/libzip-1.7.3-h4de3113_0.tar.bz2#2568763f88009f95e9262cba837dbb82 -https://conda.anaconda.org/conda-forge/linux-64/readline-8.1-h46c0cb4_0.tar.bz2#5788de3c8d7a7d64ac56c784c4ef48e6 -https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.10-h21135ba_1.tar.bz2#c647f70aa7e3d4cc4e029cc1c9a99953 -https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.27.27-h975c496_1.tar.bz2#e663bd5dbc8cc4c1647d9f51cf25872c -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/freetype-2.10.4-h0708190_1.tar.bz2#4a06f2ac2e5bfae7b6b245171c3f07aa -https://conda.anaconda.org/conda-forge/linux-64/krb5-1.19.1-hcc1bbae_0.tar.bz2#59b0695a515a6c54d45463dbf208ae38 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-9_openblas.tar.bz2#edee85b4f83376ceae81e0975b8bffa2 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-9_openblas.tar.bz2#572d84ab07962986f6dd8e4637a475ca -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.3.0-hf544144_1.tar.bz2#a65a4158716bd7d95bfa69bcfd83081c -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.35.5-h74cdb3f_0.tar.bz2#e876c82c21e7074d299e13762d02466c -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.77.0-h2574ce0_0.tar.bz2#05cf8dca8408b5f1ffcc5e2d5a7c5da2 -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.4.0-hb52868f_1.tar.bz2#b7ad78ad2e9ee155f59e6428406ee824 -https://conda.anaconda.org/conda-forge/linux-64/python-3.8.10-h49503c6_1_cpython.tar.bz2#69f7d6ef1f00c3a109b1b06279e6d6a9 -https://conda.anaconda.org/conda-forge/noarch/attrs-21.2.0-pyhd8ed1ab_0.tar.bz2#d2e1c7f388ac403df7079b411c37cc50 -https://conda.anaconda.org/conda-forge/noarch/cloudpickle-1.6.0-py_0.tar.bz2#76d764d8881719e305f6fa368dc2b65e -https://conda.anaconda.org/conda-forge/linux-64/curl-7.77.0-hea6ffbf_0.tar.bz2#7d1168349d6fba67ae1fdf61970b83e1 -https://conda.anaconda.org/conda-forge/noarch/filelock-3.0.12-pyh9f0ad1d_0.tar.bz2#7544ed05bbbe9bb687bc9bcbe4d6cb46 -https://conda.anaconda.org/conda-forge/noarch/fsspec-2021.5.0-pyhd8ed1ab_0.tar.bz2#da823f51ebb876dafbed1c892fd80956 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.10.6-nompi_h6a2412b_1114.tar.bz2#0a2984b78f51148d7ff6219abe73509e -https://conda.anaconda.org/conda-forge/noarch/heapdict-1.0.1-py_0.tar.bz2#77242bfb1e74a627fb06319b5a2d3b95 -https://conda.anaconda.org/conda-forge/noarch/idna-2.10-pyh9f0ad1d_0.tar.bz2#f95a12b4f435aae6680fe55ae2eb1b06 -https://conda.anaconda.org/conda-forge/noarch/locket-0.2.0-py_2.tar.bz2#709e8671651c7ec3d1ad07800339ff1d -https://conda.anaconda.org/conda-forge/noarch/nose-1.3.7-py_1006.tar.bz2#382019d5f8e9362ef6f60a8d4e7bce8f -https://conda.anaconda.org/conda-forge/noarch/olefile-0.46-pyh9f0ad1d_1.tar.bz2#0b2e68acc8c78c8cc392b90983481f58 -https://conda.anaconda.org/conda-forge/noarch/pep8-1.7.1-py_0.tar.bz2#d0b5bc3aebbffcb175bf8a1d419acb79 -https://conda.anaconda.org/conda-forge/linux-64/proj-7.2.0-h277dcde_2.tar.bz2#db654ee11298d3463bad67445707654c -https://conda.anaconda.org/conda-forge/noarch/pycparser-2.20-pyh9f0ad1d_2.tar.bz2#aa798d50ffd182a0f6f31478c7f434f6 -https://conda.anaconda.org/conda-forge/noarch/pyke-1.1.1-pyhd8ed1ab_1004.tar.bz2#5f0236abfbb6d53826d1afed1e64f82e -https://conda.anaconda.org/conda-forge/noarch/pyparsing-2.4.7-pyh9f0ad1d_0.tar.bz2#626c4f20d5bf06dcec9cf2eaa31725c7 -https://conda.anaconda.org/conda-forge/noarch/pyshp-2.1.3-pyh44b312d_0.tar.bz2#2d1867b980785eb44b8122184d8b42a6 -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.8-1_cp38.tar.bz2#8d05152d6fb3012b27a0e6fbcc14bea1 -https://conda.anaconda.org/conda-forge/noarch/pytz-2021.1-pyhd8ed1ab_0.tar.bz2#3af2e9424d5eb0063824a3f9b850d411 -https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 -https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_0.tar.bz2#6d6552722448103793743dabfbda532d -https://conda.anaconda.org/conda-forge/noarch/tblib-1.7.0-pyhd8ed1ab_0.tar.bz2#3d4afc31302aa7be471feb6be048ed76 -https://conda.anaconda.org/conda-forge/noarch/toolz-0.11.1-py_0.tar.bz2#d1e66b58cb00b3817ad9f05eec098c00 -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-3.10.0.0-pyha770c72_0.tar.bz2#67c0cba6533b641f28946d7c16f361c8 -https://conda.anaconda.org/conda-forge/linux-64/antlr-python-runtime-4.7.2-py38h578d9bd_1002.tar.bz2#2b2207e2c8a05fc0bc5b62fc32c355e6 -https://conda.anaconda.org/conda-forge/linux-64/certifi-2021.5.30-py38h578d9bd_0.tar.bz2#a2e14464711f8e76010cd7e0c49bc4ae -https://conda.anaconda.org/conda-forge/linux-64/cffi-1.14.5-py38ha65f79e_0.tar.bz2#386057f231a571b75bfa7307c9acd5f6 -https://conda.anaconda.org/conda-forge/linux-64/chardet-4.0.0-py38h578d9bd_1.tar.bz2#9294a5e2c7545a2f67ac348aadd53344 -https://conda.anaconda.org/conda-forge/linux-64/click-8.0.1-py38h578d9bd_0.tar.bz2#45426acde32f0ddd94dcee3478fd13e3 -https://conda.anaconda.org/conda-forge/noarch/cycler-0.10.0-py_2.tar.bz2#f6d7c7e6d8f42cbbec7e07a8d879f91c -https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.11.0-py38h497a2fe_3.tar.bz2#45568bae22c3825f22b631101ecbad35 -https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.3.1-py38h1fd1430_1.tar.bz2#01488c80daae318ed5c17e7bb12af64e -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.8.0-nompi_hcd642e3_103.tar.bz2#a4c691f7630ad2cbcc1f1298b4b15ded -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.0.1-py38h497a2fe_0.tar.bz2#d075babffd68330d81b0488a45435698 -https://conda.anaconda.org/conda-forge/linux-64/mock-4.0.3-py38h578d9bd_1.tar.bz2#58f0b38b126cf7cda0a584ebb911d8ce -https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.0.2-py38h1fd1430_1.tar.bz2#5854c568e0d341313fb0a6487f1c687e -https://conda.anaconda.org/conda-forge/linux-64/numpy-1.20.3-py38h9894fe3_1.tar.bz2#a65d77d36ddfd5c58cdda67ba2ca06c3 -https://conda.anaconda.org/conda-forge/noarch/packaging-20.9-pyh44b312d_0.tar.bz2#be69a38e912054a62dc82cc3c7711a64 -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-8.2.0-py38ha0e1e83_1.tar.bz2#46a555b3ce021469f7f62d72fe6ebb4b -https://conda.anaconda.org/conda-forge/linux-64/psutil-5.8.0-py38h497a2fe_1.tar.bz2#3c465545aa3cec37f8f1341546677956 -https://conda.anaconda.org/conda-forge/linux-64/pysocks-1.7.1-py38h578d9bd_3.tar.bz2#8284bab4783fd6fdd11b695958945614 -https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.1-py_0.tar.bz2#0d0150ed9c2d25817f5324108d3f7571 -https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-2.0.2-py38h497a2fe_0.tar.bz2#27b37e3f79205080b573442445ed727b -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-5.4.1-py38h497a2fe_0.tar.bz2#36d6e06148013694eb943576cd305f67 -https://conda.anaconda.org/conda-forge/linux-64/tornado-6.1-py38h497a2fe_1.tar.bz2#e772c8383768280af283e814e2126663 -https://conda.anaconda.org/conda-forge/noarch/zict-2.0.0-py_0.tar.bz2#4750152be22f24d695b3004c5e1712d3 -https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py38h497a2fe_1001.tar.bz2#56753dd777a6517b34966ddcb39af734 -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.2.1-py38hab2c0dc_1.tar.bz2#777186ded2d850f3eab4ce7131c6c17c -https://conda.anaconda.org/conda-forge/linux-64/cryptography-3.4.7-py38ha5dfef3_0.tar.bz2#a8b014aba670157256dabdc885f71af4 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2021.6.0-pyhd8ed1ab_0.tar.bz2#cea7be7ed76c4664498447ef35d2268c -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.22.0-he2bb022_0.tar.bz2#98a82d5f89708b080c39c4e73558b58e -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.0.1-pyhd8ed1ab_0.tar.bz2#c647e77921fd3e245cdcc5b2d451a0f8 -https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py38h5c078b8_1005.tar.bz2#d318a411c4cb595d5adb60ec7b4a46f0 -https://conda.anaconda.org/conda-forge/linux-64/pandas-1.2.4-py38h1abd341_0.tar.bz2#91150ede50b13d34a03e9ef51b7b379f -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.6.3-py38h7b17777_0.tar.bz2#8055079ed82e1ada1cc4714c26d04802 -https://conda.anaconda.org/conda-forge/linux-64/setuptools-49.6.0-py38h578d9bd_3.tar.bz2#59c561cd1be0db9cf1c83f7d7cc74f4d -https://conda.anaconda.org/conda-forge/linux-64/shapely-1.7.1-py38haeee4fe_5.tar.bz2#2e633d8e2257f3c0e465c858ce2ddbc6 -https://conda.anaconda.org/conda-forge/linux-64/bokeh-2.3.2-py38h578d9bd_0.tar.bz2#c417008fc6050795805a34dd0d84c190 -https://conda.anaconda.org/conda-forge/linux-64/cf-units-2.1.5-py38hb5d20a5_0.tar.bz2#b45764dbfe02c18f80458bb241e37955 -https://conda.anaconda.org/conda-forge/linux-64/distributed-2021.6.0-py38h578d9bd_0.tar.bz2#ddaa3cc0da3478d3ea96da2e04717813 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.4.2-py38hcc49a3a_0.tar.bz2#4bfb6818a1fce6d4129fdf121f788505 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.5.6-nompi_py38h5e9db54_103.tar.bz2#72a5656daeee23c80e22b936bef0ceb3 -https://conda.anaconda.org/conda-forge/noarch/pyopenssl-20.0.1-pyhd8ed1ab_0.tar.bz2#92371c25994d0f5d28a01c1fb75ebf86 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2021.03.0-py38hb5d20a5_1.tar.bz2#1586d8fb31f3aa7b2f9f206ed2b9ea7e -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.19.0.post1-py38hc9c980b_0.tar.bz2#65e97172e139d3465895eb07a1fd52f2 -https://conda.anaconda.org/conda-forge/noarch/dask-2021.6.0-pyhd8ed1ab_0.tar.bz2#554ef426ff0ef06641338b7a514d6354 -https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.5-pyhd8ed1ab_0.tar.bz2#36f0ca66d6dd09423e5c2551148d45cd -https://conda.anaconda.org/conda-forge/linux-64/iris-3.0.2-py38h578d9bd_1.tar.bz2#be39010c3f01f3da2050b0a5890795f7 -https://conda.anaconda.org/conda-forge/noarch/requests-2.25.1-pyhd3deb0d_0.tar.bz2#ae687aba31a1c400192a86a2e993ffdc diff --git a/setup.py b/setup.py index 492543e1..b2b0fba2 100644 --- a/setup.py +++ b/setup.py @@ -84,7 +84,6 @@ def file_walk_relative(top, remove=''): keywords = ['iris', 'GRIB'], classifiers=[ 'Programming Language :: Python', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3 :: Only', ], From 0f6475ea37e9c4630ba0b47f3a5588e4d6aa7450 Mon Sep 17 00:00:00 2001 From: lbdreyer Date: Fri, 18 Mar 2022 10:25:24 +0000 Subject: [PATCH 195/583] Mergeback 0.18.x branch to main (#294) * NOT a merge commit, as merge permission was blocked, but content is very simple * Update version string to 0.18 and update docs (#291) * Update version number to 0.19.dev0 --- docs/conf.py | 4 ++-- docs/index.rst | 2 +- docs/ref/release_notes.rst | 33 +++++++++++++++++++++++++++++++++ iris_grib/__init__.py | 2 +- 4 files changed, 37 insertions(+), 4 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index b901678e..db9a165b 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -50,7 +50,7 @@ # General information about the project. project = u'iris-grib' -copyright = u'2021, Met Office' +copyright = u'2022, Met Office' author = u'Met Office' # The version info for the project you're documenting, acts as replacement for @@ -297,5 +297,5 @@ # Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = { 'python': ('https://docs.python.org/', None), - 'iris': ('http://scitools.org.uk/iris/docs/latest/', None), + 'iris': ('https://scitools-iris.readthedocs.io/en/latest/', None), } diff --git a/docs/index.rst b/docs/index.rst index 69cf2147..d13f95cd 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -3,7 +3,7 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -Iris-grib v0.17 +Iris-grib v0.18 =============== The library ``iris-grib`` provides functionality for converting between weather and diff --git a/docs/ref/release_notes.rst b/docs/ref/release_notes.rst index 766b33e4..9e25d296 100644 --- a/docs/ref/release_notes.rst +++ b/docs/ref/release_notes.rst @@ -2,6 +2,38 @@ Release Notes ============= +What's new in iris-grib v0.18.0 +------------------------------- + +:Release: 0.18.0 +:Date: 14 March 2022 + +Bugs Fixed +^^^^^^^^^^ +* `@lbdreyer `_ made various updates to allow + iris-grib to work with the latest versions of + `iris `_, + `cf-units `_, + `ecCodes `_ and + `cartopy `_, including casting + the usage of :meth:`cf_units.Unit.date2num` as float. setting and setting the + values of some missing keys using ``gribapi.GRIB_MISSING_LONG``. + `(PR#288) `_ + + +Dependencies +^^^^^^^^^^^^ +* now requires Python version >= 3.8 + + +Internal +^^^^^^^^ +* `@TomDufall `_ updated the code so that it was + `flake8 `_ compliant and enabled flake8 + checks to the CI. + `(PR#271) `_ + + What's new in iris-grib v0.17.1 ------------------------------- @@ -196,6 +228,7 @@ Features * Updated translations between GRIB parameter code and CF standard_name or long_name : + * additional WAFC codes, both to and from CF * 'mass_fraction_of_cloud_liquid_water_in_air' and 'mass_fraction_of_cloud_ice_in_air', both to and from CF * 'surface_downwelling_longwave_flux_in_air', now translates to GRIBcode(2, 0, 5, 3) (but not the reverse). diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index 20588385..caf83764 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -31,7 +31,7 @@ from .message import GribMessage -__version__ = '0.18.dev0' +__version__ = '0.19.dev0' __all__ = ['load_cubes', 'save_grib2', 'load_pairs_from_fields', 'save_pairs_from_cube', 'save_messages'] From a4bed1a0a671f4ca5770e9df9d3c6c161db4f417 Mon Sep 17 00:00:00 2001 From: Martin Yeo <40734014+trexfeathers@users.noreply.github.com> Date: Mon, 25 Apr 2022 12:39:36 +0100 Subject: [PATCH 196/583] Transverse Mercator support negative scanning (#296) --- iris_grib/_load_convert.py | 46 +++++++++----- .../test_grid_definition_template_12.py | 63 +++++++++++++++++-- 2 files changed, 89 insertions(+), 20 deletions(-) diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index 7f54173a..7376f255 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -842,25 +842,41 @@ def grid_definition_template_12(section, metadata): # precision, as opposed to using Di and Dj. # Check whether Di and Dj are as consistent as possible with that # interpretation - i.e. they are within 1cm. - def check_range(v1, v2, n, d): - min_last = v1 + (n - 1) * (d - 1) - max_last = v1 + (n - 1) * (d + 1) - if not (min_last < v2 < max_last): - raise TranslationError('Inconsistent grid definition') - check_range(x1, x2, section['Ni'], section['Di']) - check_range(y1, y2, section['Nj'], section['Dj']) + def check_range(v1, v2, n, d, axis_name): + small = min(v1, v2) + large = max(v1, v2) + min_last = small + (n - 1) * (d - 1) + max_last = small + (n - 1) * (d + 1) + if not (min_last < large < max_last): + message = ( + f'File grid {axis_name} definition inconsistent: ' + f'{v1} to {v2} in {n} steps is incompatible with step-size ' + f'{d} .' + ) + raise TranslationError(message) + check_range(x1, x2, section['Ni'], section['Di'], 'X') + check_range(y1, y2, section['Nj'], section['Dj'], 'Y') + + # Further over-specification - the sequence of X1 & X2 is enough to + # generate the sequence in the correct direction (also Y1 & Y2). All + # scanningMode can do is add confusion; warn if there is inconsistency. + def validate_scanning(axis: str, stated: bool, encoded: bool): + def scan_str(scanning_bool): + return "positive" if scanning_bool else "negative" + if stated != encoded: + message = ( + f"File grid {axis} definition inconsistent: " + f"scanningMode = {scan_str(stated)}, actual grid point " + f"direction is {scan_str(encoded)}." + ) + warnings.warn(message) + scan = scanning_mode(section['scanningMode']) + validate_scanning("X", not scan.i_negative, x1 < x2) + validate_scanning("Y", scan.j_positive, y1 < y2) x_points = np.linspace(x1 * CM_TO_M, x2 * CM_TO_M, section['Ni']) y_points = np.linspace(y1 * CM_TO_M, y2 * CM_TO_M, section['Nj']) - # This has only been tested with +x/+y scanning, so raise an error - # for other permutations. - scan = scanning_mode(section['scanningMode']) - if scan.i_negative: - raise TranslationError('Unsupported -x scanning') - if not scan.j_positive: - raise TranslationError('Unsupported -y scanning') - # Create the X and Y coordinates. y_coord = DimCoord(y_points, 'projection_y_coordinate', units='m', coord_system=cs) diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_12.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_12.py index b5833334..6e21230b 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_12.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_12.py @@ -14,6 +14,7 @@ import iris_grib.tests as tests import numpy as np +import warnings import iris.coord_systems import iris.coords @@ -53,7 +54,7 @@ def section_3(self): } return section - def expected(self, y_dim, x_dim): + def expected(self, y_dim, x_dim, x_negative=False, y_negative=False): # Prepare the expectation. expected = empty_metadata() ellipsoid = iris.coord_systems.GeogCS(6377563.396, 6356256.909) @@ -62,13 +63,19 @@ def expected(self, y_dim, x_dim): nx = 4 x_origin = 293000 dx = 2000 - x = iris.coords.DimCoord(np.arange(nx) * dx + x_origin, + x_array = np.arange(nx) * dx + x_origin + if x_negative: + x_array = np.flip(x_array) + x = iris.coords.DimCoord(x_array, 'projection_x_coordinate', units='m', coord_system=cs) ny = 3 y_origin = 92000 dy = 1000 - y = iris.coords.DimCoord(np.arange(ny) * dy + y_origin, + y_array = np.arange(ny) * dy + y_origin + if y_negative: + y_array = np.flip(y_array) + y = iris.coords.DimCoord(y_array, 'projection_y_coordinate', units='m', coord_system=cs) expected['dim_coords_and_dims'].append((y, y_dim)) @@ -95,17 +102,63 @@ def test_spherical(self): def test_negative_x(self): section = self.section_3() section['scanningMode'] = 0b11000000 + section['X1'], section['X2'] = section['X2'], section['X1'] metadata = empty_metadata() + grid_definition_template_12(section, metadata) + expected = self.expected(0, 1, x_negative=True) + self.assertEqual(metadata, expected) + + def test_x_inconsistent_direction(self): + section = self.section_3() + section['scanningMode'] = 0b11000000 + metadata = empty_metadata() + with warnings.catch_warnings(record=True) as warn: + grid_definition_template_12(section, metadata) + self.assertEqual(len(warn), 1) + message = "X definition inconsistent: scanningMode" + self.assertRegex(str(warn[0].message), message) + expected = self.expected(0, 1) + self.assertEqual(metadata, expected) + + def test_x_inconsistent_steps(self): + section = self.section_3() + section['Ni'] += 1 + metadata = empty_metadata() + expected_regex = ( + "X definition inconsistent: .* incompatible with step-size") with self.assertRaisesRegex(iris.exceptions.TranslationError, - '-x scanning'): + expected_regex): grid_definition_template_12(section, metadata) def test_negative_y(self): section = self.section_3() section['scanningMode'] = 0b00000000 + section['Y1'], section['Y2'] = section['Y2'], section['Y1'] + metadata = empty_metadata() + grid_definition_template_12(section, metadata) + expected = self.expected(0, 1, y_negative=True) + self.assertEqual(metadata, expected) + + def test_y_inconsistent_direction(self): + section = self.section_3() + section['scanningMode'] = 0b00000000 + metadata = empty_metadata() + with warnings.catch_warnings(record=True) as warn: + grid_definition_template_12(section, metadata) + self.assertEqual(len(warn), 1) + message = "Y definition inconsistent: scanningMode" + self.assertRegex(str(warn[0].message), message) + expected = self.expected(0, 1) + self.assertEqual(metadata, expected) + + def test_y_inconsistent_steps(self): + section = self.section_3() + section['Nj'] += 1 metadata = empty_metadata() + expected_regex = ( + "Y definition inconsistent: .* incompatible with step-size") with self.assertRaisesRegex(iris.exceptions.TranslationError, - '-y scanning'): + expected_regex): grid_definition_template_12(section, metadata) def test_transposed(self): From 4715462d317a012ff6ee9886168d37bc03a07702 Mon Sep 17 00:00:00 2001 From: Martin Yeo <40734014+trexfeathers@users.noreply.github.com> Date: Wed, 5 Oct 2022 22:30:54 +0100 Subject: [PATCH 197/583] Update lock-file and tests (#299) * Update lockfile. * Gregorian calendar is now standard - SciTools/cf-units@f6ee3e3. * Coord system includes scale_factor_at_projection_origin - SciTools/iris@149e2d1. * Fix Flake8 fail. --- iris_grib/_grib1_load_rules.py | 2 +- .../callback/TestCallbacks/load_callback.cml | 4 +- .../grid_complex_spatial_differencing.cml | 4 +- .../data_section/TestGDT30/lambert.cml | 4 +- .../data_section/TestGDT40/reduced.cml | 4 +- .../data_section/TestGDT40/regular.cml | 4 +- .../data_section/TestImport/gdt1.cml | 4 +- .../TestImport/gdt90_with_bitmap.cml | 2 +- .../sample_file_loads/3_layer.cml | 12 +- .../sample_file_loads/earth_shape_0.cml | 4 +- .../sample_file_loads/earth_shape_1.cml | 4 +- .../sample_file_loads/earth_shape_2.cml | 4 +- .../sample_file_loads/earth_shape_3.cml | 4 +- .../sample_file_loads/earth_shape_4.cml | 4 +- .../sample_file_loads/earth_shape_5.cml | 4 +- .../sample_file_loads/earth_shape_6.cml | 4 +- .../sample_file_loads/earth_shape_7.cml | 4 +- .../sample_file_loads/earth_shape_grib1.cml | 2 +- .../sample_file_loads/ineg_jneg.cml | 4 +- .../sample_file_loads/ineg_jpos.cml | 4 +- .../sample_file_loads/ipos_jneg.cml | 4 +- .../sample_file_loads/ipos_jpos.cml | 4 +- .../sample_file_loads/lambert_grib1.cml | 2 +- .../sample_file_loads/lambert_grib2.cml | 4 +- .../missing_values_grib2.cml | 4 +- .../sample_file_loads/polar_stereo_grib1.cml | 6 +- .../sample_file_loads/reduced_gg_grib2.cml | 4 +- .../sample_file_loads/reduced_ll_grib1.cml | 2 +- .../sample_file_loads/regular_gg_grib1.cml | 2 +- .../sample_file_loads/regular_gg_grib2.cml | 4 +- .../sample_file_loads/rotated.cml | 2 +- .../sample_file_loads/time_bound_grib1.cml | 2 +- .../sample_file_loads/time_bound_grib2.cml | 4 +- .../NAMEII/0_TRACER_AIR_CONCENTRATION.cml | 2 +- .../name_grib/NAMEII/1_TRACER_DOSAGE.cml | 2 +- .../NAMEII/3_TRACER_DRY_DEPOSITION.cml | 2 +- .../NAMEII/4_TRACER_TOTAL_DEPOSITION.cml | 2 +- .../NAMEIII/0_TRACER_AIR_CONCENTRATION.cml | 2 +- .../NAMEIII/1_TRACER_AIR_CONCENTRATION.cml | 2 +- .../NAMEIII/2_TRACER_DRY_DEPOSITION.cml | 2 +- .../NAMEIII/3_TRACER_WET_DEPOSITION.cml | 2 +- .../name_grib/NAMEIII/4_TRACER_DEPOSITION.cml | 2 +- .../load_cubes/load_cubes/reduced_raw.cml | 4 +- requirements/ci/nox.lock/py38-linux-64.lock | 186 +++++++++--------- 44 files changed, 166 insertions(+), 168 deletions(-) diff --git a/iris_grib/_grib1_load_rules.py b/iris_grib/_grib1_load_rules.py index 4520097e..de834538 100644 --- a/iris_grib/_grib1_load_rules.py +++ b/iris_grib/_grib1_load_rules.py @@ -93,7 +93,7 @@ def grib1_convert(grib): coord_system=grib._coord_system, circular=grib._x_circular, ), - int(not(j_points_are_consecutive)) + int(not j_points_are_consecutive) ) ) diff --git a/iris_grib/tests/results/integration/iris_integration/callback/TestCallbacks/load_callback.cml b/iris_grib/tests/results/integration/iris_integration/callback/TestCallbacks/load_callback.cml index aef0310a..9ca506d6 100644 --- a/iris_grib/tests/results/integration/iris_integration/callback/TestCallbacks/load_callback.cml +++ b/iris_grib/tests/results/integration/iris_integration/callback/TestCallbacks/load_callback.cml @@ -12,7 +12,7 @@ - + - + diff --git a/iris_grib/tests/results/integration/load_convert/data_section/TestDRT3/grid_complex_spatial_differencing.cml b/iris_grib/tests/results/integration/load_convert/data_section/TestDRT3/grid_complex_spatial_differencing.cml index 2cfe06f8..5b2df9cb 100644 --- a/iris_grib/tests/results/integration/load_convert/data_section/TestDRT3/grid_complex_spatial_differencing.cml +++ b/iris_grib/tests/results/integration/load_convert/data_section/TestDRT3/grid_complex_spatial_differencing.cml @@ -9,7 +9,7 @@ - + + diff --git a/iris_grib/tests/results/integration/load_convert/data_section/TestGDT30/lambert.cml b/iris_grib/tests/results/integration/load_convert/data_section/TestGDT30/lambert.cml index dff111dc..d540797f 100644 --- a/iris_grib/tests/results/integration/load_convert/data_section/TestGDT30/lambert.cml +++ b/iris_grib/tests/results/integration/load_convert/data_section/TestGDT30/lambert.cml @@ -9,7 +9,7 @@ - + @@ -28,7 +28,7 @@ - + diff --git a/iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/reduced.cml b/iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/reduced.cml index 3a963b32..97cd48db 100644 --- a/iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/reduced.cml +++ b/iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/reduced.cml @@ -10,7 +10,7 @@ - + - + diff --git a/iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/regular.cml b/iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/regular.cml index e5eea0fc..899e7c1a 100644 --- a/iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/regular.cml +++ b/iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/regular.cml @@ -9,7 +9,7 @@ - + - + diff --git a/iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt1.cml b/iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt1.cml index d304d8a8..f1fc667a 100644 --- a/iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt1.cml +++ b/iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt1.cml @@ -9,7 +9,7 @@ - + - + diff --git a/iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt90_with_bitmap.cml b/iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt90_with_bitmap.cml index ebd77222..6abba28a 100644 --- a/iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt90_with_bitmap.cml +++ b/iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt90_with_bitmap.cml @@ -32,7 +32,7 @@ - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/3_layer.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/3_layer.cml index 76cc41a0..d7dd8851 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/3_layer.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/3_layer.cml @@ -9,7 +9,7 @@ - + - + @@ -42,7 +42,7 @@ - + - + @@ -96,7 +96,7 @@ - + - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_0.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_0.cml index bb51db32..d7dc7e27 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_0.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_0.cml @@ -9,7 +9,7 @@ - + - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_1.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_1.cml index 774e9921..3db83ea9 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_1.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_1.cml @@ -9,7 +9,7 @@ - + - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_2.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_2.cml index 3ff9cccc..783291a0 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_2.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_2.cml @@ -9,7 +9,7 @@ - + - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_3.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_3.cml index 47d11467..c086c34a 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_3.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_3.cml @@ -9,7 +9,7 @@ - + - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_4.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_4.cml index e6aa14e4..3759b3c3 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_4.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_4.cml @@ -9,7 +9,7 @@ - + - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_5.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_5.cml index 1257c9c2..c2e3cfa6 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_5.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_5.cml @@ -9,7 +9,7 @@ - + - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_6.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_6.cml index eb966571..c09149c3 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_6.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_6.cml @@ -9,7 +9,7 @@ - + - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_7.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_7.cml index d27ce04a..1dd59645 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_7.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_7.cml @@ -9,7 +9,7 @@ - + - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_grib1.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_grib1.cml index 7ee99f8d..69d0a118 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_grib1.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_grib1.cml @@ -23,7 +23,7 @@ - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/ineg_jneg.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/ineg_jneg.cml index a7d77410..c21bb515 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/ineg_jneg.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/ineg_jneg.cml @@ -9,7 +9,7 @@ - + - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/ineg_jpos.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/ineg_jpos.cml index f578fcea..93305eb9 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/ineg_jpos.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/ineg_jpos.cml @@ -9,7 +9,7 @@ - + - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/ipos_jneg.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/ipos_jneg.cml index bb51db32..d7dc7e27 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/ipos_jneg.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/ipos_jneg.cml @@ -9,7 +9,7 @@ - + - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/ipos_jpos.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/ipos_jpos.cml index 4dc6d7f9..b5a5dce2 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/ipos_jpos.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/ipos_jpos.cml @@ -9,7 +9,7 @@ - + - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib1.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib1.cml index 56e96e7a..c2a61005 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib1.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib1.cml @@ -29,7 +29,7 @@ - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib2.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib2.cml index 813553b5..212d670f 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib2.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib2.cml @@ -9,7 +9,7 @@ - + @@ -28,7 +28,7 @@ - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/missing_values_grib2.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/missing_values_grib2.cml index c4c0d819..dbaf177f 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/missing_values_grib2.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/missing_values_grib2.cml @@ -9,7 +9,7 @@ - + + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/polar_stereo_grib1.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/polar_stereo_grib1.cml index f8e03e6d..6ba79091 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/polar_stereo_grib1.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/polar_stereo_grib1.cml @@ -11,17 +11,17 @@ - + - + - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_gg_grib2.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_gg_grib2.cml index fa3ba45e..a0a32bfb 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_gg_grib2.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_gg_grib2.cml @@ -10,7 +10,7 @@ - + - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_ll_grib1.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_ll_grib1.cml index b1d68014..ebb87124 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_ll_grib1.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_ll_grib1.cml @@ -12,7 +12,7 @@ - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/regular_gg_grib1.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/regular_gg_grib1.cml index b1dc1f6c..7db45208 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/regular_gg_grib1.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/regular_gg_grib1.cml @@ -23,7 +23,7 @@ - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/regular_gg_grib2.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/regular_gg_grib2.cml index 14213c16..f51cddff 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/regular_gg_grib2.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/regular_gg_grib2.cml @@ -9,7 +9,7 @@ - + - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/rotated.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/rotated.cml index 06e2b517..f48ea9d3 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/rotated.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/rotated.cml @@ -22,7 +22,7 @@ - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_bound_grib1.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_bound_grib1.cml index 89902729..530f48d9 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_bound_grib1.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_bound_grib1.cml @@ -20,7 +20,7 @@ - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_bound_grib2.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_bound_grib2.cml index bb51db32..d7dc7e27 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_bound_grib2.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_bound_grib2.cml @@ -9,7 +9,7 @@ - + - + diff --git a/iris_grib/tests/results/integration/name_grib/NAMEII/0_TRACER_AIR_CONCENTRATION.cml b/iris_grib/tests/results/integration/name_grib/NAMEII/0_TRACER_AIR_CONCENTRATION.cml index 1eb16eaf..9a4c1d4f 100644 --- a/iris_grib/tests/results/integration/name_grib/NAMEII/0_TRACER_AIR_CONCENTRATION.cml +++ b/iris_grib/tests/results/integration/name_grib/NAMEII/0_TRACER_AIR_CONCENTRATION.cml @@ -28,7 +28,7 @@ - + diff --git a/iris_grib/tests/results/integration/name_grib/NAMEII/1_TRACER_DOSAGE.cml b/iris_grib/tests/results/integration/name_grib/NAMEII/1_TRACER_DOSAGE.cml index 822e45db..e950bcf0 100644 --- a/iris_grib/tests/results/integration/name_grib/NAMEII/1_TRACER_DOSAGE.cml +++ b/iris_grib/tests/results/integration/name_grib/NAMEII/1_TRACER_DOSAGE.cml @@ -28,7 +28,7 @@ - + diff --git a/iris_grib/tests/results/integration/name_grib/NAMEII/3_TRACER_DRY_DEPOSITION.cml b/iris_grib/tests/results/integration/name_grib/NAMEII/3_TRACER_DRY_DEPOSITION.cml index 5787c196..e2b605f2 100644 --- a/iris_grib/tests/results/integration/name_grib/NAMEII/3_TRACER_DRY_DEPOSITION.cml +++ b/iris_grib/tests/results/integration/name_grib/NAMEII/3_TRACER_DRY_DEPOSITION.cml @@ -21,7 +21,7 @@ - + diff --git a/iris_grib/tests/results/integration/name_grib/NAMEII/4_TRACER_TOTAL_DEPOSITION.cml b/iris_grib/tests/results/integration/name_grib/NAMEII/4_TRACER_TOTAL_DEPOSITION.cml index 5787c196..e2b605f2 100644 --- a/iris_grib/tests/results/integration/name_grib/NAMEII/4_TRACER_TOTAL_DEPOSITION.cml +++ b/iris_grib/tests/results/integration/name_grib/NAMEII/4_TRACER_TOTAL_DEPOSITION.cml @@ -21,7 +21,7 @@ - + diff --git a/iris_grib/tests/results/integration/name_grib/NAMEIII/0_TRACER_AIR_CONCENTRATION.cml b/iris_grib/tests/results/integration/name_grib/NAMEIII/0_TRACER_AIR_CONCENTRATION.cml index 1a31427d..e48a0898 100644 --- a/iris_grib/tests/results/integration/name_grib/NAMEIII/0_TRACER_AIR_CONCENTRATION.cml +++ b/iris_grib/tests/results/integration/name_grib/NAMEIII/0_TRACER_AIR_CONCENTRATION.cml @@ -21,7 +21,7 @@ - + diff --git a/iris_grib/tests/results/integration/name_grib/NAMEIII/1_TRACER_AIR_CONCENTRATION.cml b/iris_grib/tests/results/integration/name_grib/NAMEIII/1_TRACER_AIR_CONCENTRATION.cml index 7007836e..776bd084 100644 --- a/iris_grib/tests/results/integration/name_grib/NAMEIII/1_TRACER_AIR_CONCENTRATION.cml +++ b/iris_grib/tests/results/integration/name_grib/NAMEIII/1_TRACER_AIR_CONCENTRATION.cml @@ -21,7 +21,7 @@ - + diff --git a/iris_grib/tests/results/integration/name_grib/NAMEIII/2_TRACER_DRY_DEPOSITION.cml b/iris_grib/tests/results/integration/name_grib/NAMEIII/2_TRACER_DRY_DEPOSITION.cml index 850ef89e..a5f12ebc 100644 --- a/iris_grib/tests/results/integration/name_grib/NAMEIII/2_TRACER_DRY_DEPOSITION.cml +++ b/iris_grib/tests/results/integration/name_grib/NAMEIII/2_TRACER_DRY_DEPOSITION.cml @@ -21,7 +21,7 @@ - + diff --git a/iris_grib/tests/results/integration/name_grib/NAMEIII/3_TRACER_WET_DEPOSITION.cml b/iris_grib/tests/results/integration/name_grib/NAMEIII/3_TRACER_WET_DEPOSITION.cml index ade4cea9..f57bdc7a 100644 --- a/iris_grib/tests/results/integration/name_grib/NAMEIII/3_TRACER_WET_DEPOSITION.cml +++ b/iris_grib/tests/results/integration/name_grib/NAMEIII/3_TRACER_WET_DEPOSITION.cml @@ -21,7 +21,7 @@ - + diff --git a/iris_grib/tests/results/integration/name_grib/NAMEIII/4_TRACER_DEPOSITION.cml b/iris_grib/tests/results/integration/name_grib/NAMEIII/4_TRACER_DEPOSITION.cml index 088b622c..6e4e1017 100644 --- a/iris_grib/tests/results/integration/name_grib/NAMEIII/4_TRACER_DEPOSITION.cml +++ b/iris_grib/tests/results/integration/name_grib/NAMEIII/4_TRACER_DEPOSITION.cml @@ -21,7 +21,7 @@ - + diff --git a/iris_grib/tests/results/unit/load_cubes/load_cubes/reduced_raw.cml b/iris_grib/tests/results/unit/load_cubes/load_cubes/reduced_raw.cml index 6846382f..5d687f24 100644 --- a/iris_grib/tests/results/unit/load_cubes/load_cubes/reduced_raw.cml +++ b/iris_grib/tests/results/unit/load_cubes/load_cubes/reduced_raw.cml @@ -10,7 +10,7 @@ - + - + diff --git a/requirements/ci/nox.lock/py38-linux-64.lock b/requirements/ci/nox.lock/py38-linux-64.lock index 74506936..4be011b7 100644 --- a/requirements/ci/nox.lock/py38-linux-64.lock +++ b/requirements/ci/nox.lock/py38-linux-64.lock @@ -1,39 +1,37 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 7035385083b1ee27d72762b3b315668678ee6f326c3e5a9e72c3d400163803b0 +# input_hash: 653d8b6f55f200fb89ab1c6af6b2911b1aaa9b165a6276768e5d033b691c319f @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2021.10.8-ha878542_0.tar.bz2#575611b8a84f45960e87722eeb51fa26 +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2022.9.24-ha878542_0.tar.bz2#41e4e87062433e283696cf384f952ef6 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.36.1-hea4e1c9_2.tar.bz2#bd4f2e711b39af170e7ff15163fe87ee -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-11.2.0-h5c6108e_13.tar.bz2#b62e87134ec17e1180cfcb3951624db4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-11.2.0-he4da1e4_13.tar.bz2#573a74710fad22a27da784cc238150b9 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-11.2.0-h69a702a_13.tar.bz2#a3a07a89af69d1eada078695b42e4961 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-11.2.0-h1d223b6_13.tar.bz2#8e91f1f21417c9ab1265240ee4f9db1e -https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-1_gnu.tar.bz2#561e277319a41d4f24f5c05a9ef63c04 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-11.2.0-h1d223b6_13.tar.bz2#63eaf0f146cc80abd84743d48d667da4 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-12.1.0-hdcd56e2_16.tar.bz2#b02605b875559ff99f04351fd5040760 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-12.1.0-ha89aaad_16.tar.bz2#6f5ba041a41eb102a1027d9e68731be7 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-12.1.0-h69a702a_16.tar.bz2#6bf15e29a20f614b18ae89368260d0a2 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-12.1.0-h8d9b700_16.tar.bz2#f013cf7749536ce43d82afbffdf499ab +https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-12.1.0-h8d9b700_16.tar.bz2#4f05bc9844f7c101e6e147dab3c88d5c 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.6-h27087fc_0.tar.bz2#90dec9e76bc164857cc200f81e981dab -https://conda.anaconda.org/conda-forge/linux-64/geos-3.10.2-h9c3ff4c_0.tar.bz2#fe9a66a351bfa7a84c3108304c7bcba5 -https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.1-h36c2ea0_2.tar.bz2#626e68ae9cc5912d6adb79d318cf962d -https://conda.anaconda.org/conda-forge/linux-64/jbig-2.1-h7f98852_2003.tar.bz2#1aa0cee79792fa97b7ff4545110b60bf -https://conda.anaconda.org/conda-forge/linux-64/jpeg-9e-h7f98852_0.tar.bz2#5c214edc675a7fb7cbb34b1d854e5141 +https://conda.anaconda.org/conda-forge/linux-64/expat-2.4.9-h27087fc_0.tar.bz2#493ac8b2503a949aebe33d99ea0c284f +https://conda.anaconda.org/conda-forge/linux-64/geos-3.11.0-h27087fc_0.tar.bz2#a583d0bc9a85c48e8b07a588d1ac8a80 +https://conda.anaconda.org/conda-forge/linux-64/jpeg-9e-h166bdaf_2.tar.bz2#ee8b844357a0946870901c7c6f418268 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 -https://conda.anaconda.org/conda-forge/linux-64/lerc-3.0-h9c3ff4c_0.tar.bz2#7fcefde484980d23f0ec24c11e314d2e +https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libaec-1.0.6-h9c3ff4c_0.tar.bz2#c77f5e4e418fa47d699d6afa54c5d444 -https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.0.9-h7f98852_6.tar.bz2#b0f44f63f7d771d7670747a1dd5d5ac1 -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.10-h7f98852_0.tar.bz2#ffa3a757a97e851293909b49f49f28fb +https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.0.9-h166bdaf_7.tar.bz2#f82dc1c78bcf73583f2656433ce2933c +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.14-h166bdaf_0.tar.bz2#fc84a0446e4e4fb882e78d786cfb9734 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h516909a_1.tar.bz2#6f8720dff19e17ce5d48cfe7f3d2f0a3 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-he1b5a44_1001.tar.bz2#8208602aec4826053c116552369a394c https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.0-h7f98852_0.tar.bz2#39b1328babf85c7c3a61636d9cd50206 -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.18-pthreads_h8fe5266_0.tar.bz2#41532e4448c0cce086d6570f95e4e12e -https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.2.2-h7f98852_1.tar.bz2#46cf26ecc8775a0aab300ea1821aaa3c -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/ncurses-6.3-h9c3ff4c_0.tar.bz2#fb31bcb7af058244479ca635d20f0f4a -https://conda.anaconda.org/conda-forge/linux-64/openssl-1.1.1l-h7f98852_0.tar.bz2#de7b38a1542dbe6f41653a8ae71adc53 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.21-pthreads_h78a6416_3.tar.bz2#8c5963a49b6035c40646a763293fbb35 +https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.32.1-h7f98852_1000.tar.bz2#772d69f030955d9646d3d0eaf21d859d +https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.2.4-h166bdaf_0.tar.bz2#ac2ccf7323d21f2994e4d1f5da664f37 +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.12-h166bdaf_4.tar.bz2#6a2e5b333ba57ce7eec61e90260cbb79 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.3-h27087fc_1.tar.bz2#4acfc691e64342b9dae57cf2adc63238 +https://conda.anaconda.org/conda-forge/linux-64/openssl-1.1.1q-h166bdaf_0.tar.bz2#07acc367c7fc8b716770cd5b36d31717 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a @@ -42,100 +40,100 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.t https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h7f98852_1002.tar.bz2#1e15f6ad85a7d743a2ac68dae6c82b98 https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007.tar.bz2#b4a4381d54784606820704f7b5f05a15 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.0-h7f98852_3.tar.bz2#52402c791f35e414e704b7a113f99605 -https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.5-h516909a_1.tar.bz2#33f601066901f3e1a85af3522a8113f9 +https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-13_linux64_openblas.tar.bz2#8a4038563ed92dfa622bd72c0d8f31d3 -https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.0.9-h7f98852_6.tar.bz2#c7c03a2592cac92246a13a0732bd1573 -https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.0.9-h7f98852_6.tar.bz2#28bfe0a70154e6881da7bae97517c948 +https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h9772cbc_4.tar.bz2#dd3e1941dd06f64cb88647d2f7ff8aaa +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-16_linux64_openblas.tar.bz2#d9b7a8639171f6c6fa0a983edabcfe2b +https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.0.9-h166bdaf_7.tar.bz2#37a460703214d0d1b421e2a47eb5e6d0 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.0.9-h166bdaf_7.tar.bz2#785a9296ea478eb78c47593c4da6550f https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 +https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.47.0-hdcd2b5c_1.tar.bz2#6fe9e31c2b8d0b022626ccac13e6ca3c +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.38-h753d276_0.tar.bz2#575078de1d3a3114b3ce131bd1508d0c +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.39.4-h753d276_0.tar.bz2#978924c298fc2215f129e8171bbea688 +https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.10.0-haa6b8db_3.tar.bz2#89acee135f0809a18a1f4537390aa2dd https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.13-h7f98852_1004.tar.bz2#b3653fdc58d03face9724f602218a904 -https://conda.anaconda.org/conda-forge/linux-64/readline-8.1-h46c0cb4_0.tar.bz2#5788de3c8d7a7d64ac56c784c4ef48e6 +https://conda.anaconda.org/conda-forge/linux-64/libzip-1.9.2-hc869a4a_1.tar.bz2#7a268cf1386d271e576e35ae82149ef2 +https://conda.anaconda.org/conda-forge/linux-64/readline-8.1.2-h0f457ee_0.tar.bz2#db2ebbe2943aae81ed051a6a9af8e0fa https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-hc3e0081_0.tar.bz2#d4c341e0379c31e9e781d4f204726867 https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 -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.2-ha95c52a_0.tar.bz2#5222b231b1ef49a7f60d40b363469b70 -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/krb5-1.19.2-h3790be6_4.tar.bz2#dbbd32092ee31aab0f2d213e8f9f1b40 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-13_linux64_openblas.tar.bz2#b17676dbd6688396c3a3076259fb7907 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-13_linux64_openblas.tar.bz2#018b80e8f21d8560ae4961567e3e00c9 -https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.47.0-h727a467_0.tar.bz2#a22567abfea169ff8048506b1ca9b230 -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-h542a066_3.tar.bz2#1a0efb4dfd880b0376da8e1ba39fa838 -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/sqlite-3.37.0-h9cd32fc_0.tar.bz2#eb66fc098824d25518a79e83d12a81d6 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-h6239696_4.tar.bz2#adcf0be7897e73e312bd24353b613f74 +https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_7.tar.bz2#1699c1211d56a23c66047524cd76796e +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-hca18f0e_0.tar.bz2#4e54cbfc47b8c74c2ecc1e7730d8edce +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.19.3-h3790be6_0.tar.bz2#7d862b05445123144bec92cb1acc8ef8 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-16_linux64_openblas.tar.bz2#20bae26d0a1db73f758fc3754cab4719 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-16_linux64_openblas.tar.bz2#955d993f41f9354bf753d29864ea20ad +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.4.0-h55922b4_4.tar.bz2#901791f0ec7cddc8714e76e273013a91 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.39.4-h4ff8645_0.tar.bz2#643c271de2dd23ecbd107284426cebc2 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/brotli-1.0.9-h7f98852_6.tar.bz2#612385c4a83edb0619fe911d9da317f4 -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/brotli-1.0.9-h166bdaf_7.tar.bz2#3889dec08a472eb0f423e5609c76bde1 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.81.0-h2574ce0_0.tar.bz2#1f8655741d0269ca6756f131522da1e8 -https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.2.2-h3452ae3_0.tar.bz2#c363665b4aabe56aae4f8981cff5b153 -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.4.0-hb52868f_1.tar.bz2#b7ad78ad2e9ee155f59e6428406ee824 -https://conda.anaconda.org/conda-forge/linux-64/python-3.8.12-ha38a3c6_3_cpython.tar.bz2#bed445cebcd8f97dce76dc06201928ee +https://conda.anaconda.org/conda-forge/linux-64/libcurl-7.85.0-h7bff187_0.tar.bz2#054fb5981fdbe031caeb612b71d85f84 +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-h7d73246_1.tar.bz2#a11b4df9271a8d7917686725aa04c8f2 +https://conda.anaconda.org/conda-forge/linux-64/python-3.8.13-h582c2e5_0_cpython.tar.bz2#8ec74710472994e2411a8020fa8589ce https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h7f98852_1.tar.bz2#536cc5db4d0a3ba0630541aec064b5e4 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a -https://conda.anaconda.org/conda-forge/noarch/attrs-21.4.0-pyhd8ed1ab_0.tar.bz2#f70280205d7044c8b8358c8de3190e5d -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-2.0.12-pyhd8ed1ab_0.tar.bz2#1f5b32dabae0f1893ae3283dac7f799e -https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.0.0-pyhd8ed1ab_0.tar.bz2#3a8fc8b627d5fb6af827e126a10a86c6 -https://conda.anaconda.org/conda-forge/linux-64/curl-7.81.0-h2574ce0_0.tar.bz2#3a95d393b490f82aa406f1892fad84d9 +https://conda.anaconda.org/conda-forge/noarch/attrs-22.1.0-pyh71513ae_1.tar.bz2#6d3ccbc56256204925bfa8378722792f +https://conda.anaconda.org/conda-forge/noarch/certifi-2022.9.24-pyhd8ed1ab_0.tar.bz2#f66309b099374af91369e67e84af397d +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-2.1.1-pyhd8ed1ab_0.tar.bz2#c1d5b294fbf9a795dec349a6f4d8be8e +https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.0-pyhd8ed1ab_0.tar.bz2#a6cf47b09786423200d7982d1faa19eb +https://conda.anaconda.org/conda-forge/linux-64/curl-7.85.0-h7bff187_0.tar.bz2#a8ac96d6b09b8ed5b0ac6563901e2195 https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb -https://conda.anaconda.org/conda-forge/noarch/filelock-3.6.0-pyhd8ed1ab_0.tar.bz2#6e03ca6c7b47a4152a2b12c6eee3bd32 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.8.0-pyhd8ed1ab_0.tar.bz2#10f0218dbd493ab2e5dc6759ddea4526 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.2-pyhd8ed1ab_0.tar.bz2#c2a60dd9f1210b8ee2037f7d0ec6251a -https://conda.anaconda.org/conda-forge/noarch/fsspec-2022.2.0-pyhd8ed1ab_0.tar.bz2#f31e31092035d427b05233ab924c7613 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.12.1-nompi_h2386368_104.tar.bz2#9607caa4c7df524ab6ddf6005ffa6731 -https://conda.anaconda.org/conda-forge/noarch/idna-3.3-pyhd8ed1ab_0.tar.bz2#40b50b8b030f5f2f22085c062ed013dd -https://conda.anaconda.org/conda-forge/noarch/locket-0.2.0-py_2.tar.bz2#709e8671651c7ec3d1ad07800339ff1d +https://conda.anaconda.org/conda-forge/noarch/fsspec-2022.8.2-pyhd8ed1ab_0.tar.bz2#140dc6615896e7d4be1059a63370be93 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.12.2-nompi_h2386368_100.tar.bz2#b014a5f912e0193783e48086b7bb3995 +https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed +https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 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 https://conda.anaconda.org/conda-forge/noarch/pep8-1.7.1-py_0.tar.bz2#d0b5bc3aebbffcb175bf8a1d419acb79 -https://conda.anaconda.org/conda-forge/linux-64/proj-8.2.1-h277dcde_0.tar.bz2#f2ceb1be6565c35e2db0ac948754751d +https://conda.anaconda.org/conda-forge/linux-64/proj-9.1.0-h93bde94_0.tar.bz2#255c7204dda39747c3ba380d28b026d7 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.0.7-pyhd8ed1ab_0.tar.bz2#727e2216d9c47455d8ddc060eb2caad9 -https://conda.anaconda.org/conda-forge/noarch/pyshp-2.2.0-pyhd8ed1ab_0.tar.bz2#2aa546be05be34b8e1744afd327b623f +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.0.9-pyhd8ed1ab_0.tar.bz2#e8fbc1b54b25f4b08281467bc13b70cc +https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 +https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.8-2_cp38.tar.bz2#bfbb29d517281e78ac53e48d21e6e860 +https://conda.anaconda.org/conda-forge/noarch/setuptools-65.4.1-pyhd8ed1ab_0.tar.bz2#d61d9f25af23c24002e659b854c6f5ae https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 -https://conda.anaconda.org/conda-forge/noarch/toolz-0.11.2-pyhd8ed1ab_0.tar.bz2#f348d1590550371edfac5ed3c1d44f7e +https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 https://conda.anaconda.org/conda-forge/noarch/wheel-0.37.1-pyhd8ed1ab_0.tar.bz2#1ca02aaf78d9c70d9a81a3bed5752022 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 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/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/cffi-1.15.1-py38h4a40e3a_0.tar.bz2#a970d201055ec06a75db83bf25447eb2 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-h9c3ff4c_1.tar.bz2#1192066d1296de9b492175a4cf43fe8a -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/libnetcdf-4.8.1-nompi_hb3fd0d9_101.tar.bz2#f51a2170153d740fd9324534e71cd8a0 -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.0-py38h0a891b7_1.tar.bz2#60eff55f2a845f35e58bd0be235fe4b7 -https://conda.anaconda.org/conda-forge/linux-64/mock-4.0.3-py38h578d9bd_2.tar.bz2#216a7cebe9c35fcb8bcbe3ed5b315ae1 -https://conda.anaconda.org/conda-forge/linux-64/numpy-1.22.2-py38h6ae9a64_0.tar.bz2#065a900932f904e0182acfcfadc467e3 +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.4-py38h43d8883_0.tar.bz2#ae54c61918e1cbd280b8587ed6219258 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.8.1-nompi_h21705cb_104.tar.bz2#4426b64bac9de35499554d45b93de880 +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.1-py38h0a891b7_1.tar.bz2#20d003ad5f584e212c299f64cac46c05 +https://conda.anaconda.org/conda-forge/linux-64/mock-4.0.3-py38h578d9bd_3.tar.bz2#616ceac2c8733522d2841f91a362a70c +https://conda.anaconda.org/conda-forge/linux-64/numpy-1.23.3-py38h3a7f9d9_0.tar.bz2#83ba913fc1174925d4e862eccb53db59 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-9.0.1-py38h0ee0e06_2.tar.bz2#3aa55d569eaf224b3a18d9b6223a526d -https://conda.anaconda.org/conda-forge/linux-64/pysocks-1.7.1-py38h578d9bd_4.tar.bz2#9c4bbee6f682f2fc7d7803df3996e77e +https://conda.anaconda.org/conda-forge/noarch/partd-1.3.0-pyhd8ed1ab_0.tar.bz2#af8c82d121e63082926062d61d9abb54 +https://conda.anaconda.org/conda-forge/linux-64/pillow-9.2.0-py38ha3b2c9c_2.tar.bz2#a077cc2bb9d854074b1cf4607252da7a +https://conda.anaconda.org/conda-forge/noarch/pip-22.2.2-pyhd8ed1ab_0.tar.bz2#0b43abe4d3ee93e82742d37def53a836 +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.4.0-py38hd7890fc_1.tar.bz2#f851bb08c85122fd0e1f66d2072ebf0b 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-3.0.0-py38h0a891b7_0.tar.bz2#12eaa8cbfedfbf7879e5653467b03c94 -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-60.9.3-py38h578d9bd_0.tar.bz2#864b832ea94d9c0b37ddfbbb8adb42f1 -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/brotlipy-0.7.0-py38h497a2fe_1003.tar.bz2#9189b42c42b9c87b2b2068cbe31901a8 -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.0-py38h3ec907f_0.tar.bz2#35411e5fc8dd523f9e68316847e6a25b -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-2022.2.1-pyhd8ed1ab_0.tar.bz2#0cb751f07e68fda1d631a02faa66f0de -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.29.1-py38h497a2fe_0.tar.bz2#121e02be214af4980911bb2cbd5b2742 +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.0.0-py38h0a891b7_1.tar.bz2#69fc64e4f4c13abe0b8df699ddaa1051 +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py38h0a891b7_4.tar.bz2#ba24ff01bb38c5cd5be54b45ef685db3 +https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-14.0.0-py38h0a891b7_1.tar.bz2#83df0e9e3faffc295f12607438691465 +https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py38h0a891b7_1004.tar.bz2#9fcaaca218dcfeb8da806d4fd4824aa0 +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py38h26c90d9_0.tar.bz2#df081ec90a13f53fe522c8e876d3f0cf +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.0.5-py38h43d8883_0.tar.bz2#0650a251fd701bbe5ac44e74cf632af8 +https://conda.anaconda.org/conda-forge/linux-64/cryptography-38.0.1-py38h2b5fc30_0.tar.bz2#692d3e8efeb7f290daafa660ec7f1154 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2022.9.2-pyhd8ed1ab_0.tar.bz2#9993f51a02fc8338837421211b53ab19 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.37.4-py38h0a891b7_0.tar.bz2#401adaccd86738f95a247d2007d925cf https://conda.anaconda.org/conda-forge/linux-64/jasper-2.0.33-ha77e612_0.tar.bz2#054883e8ea7142e89bcbec08b5d401ea -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.0.3-pyhd8ed1ab_0.tar.bz2#036d872c653780cb26e797e2e2f61b4c -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/pip-22.0.4-pyhd8ed1ab_0.tar.bz2#b1239ce8ef2a1eec485c398a683c5bff -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.3.0-py38h5383654_1.tar.bz2#5b600e019fa7c33be73bdb626236936b -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.8.0-py38h56a6a73_1.tar.bz2#86073932d9e675c5929376f6f8b79b97 -https://conda.anaconda.org/conda-forge/linux-64/shapely-1.8.0-py38h596eeab_5.tar.bz2#ec3b783081e14a9dc0eb5ce609649728 -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.0.1-py38h6c62de6_2.tar.bz2#350322b046c129e5802b79358a1343f7 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.25.0-hc08acdf_0.tar.bz2#b7b2677cdf0fe54885d72280ecff58af -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/netcdf4-1.5.8-nompi_py38h2823cc8_101.tar.bz2#1dfe1cdee4532c72f893955259eb3de9 -https://conda.anaconda.org/conda-forge/noarch/pyopenssl-22.0.0-pyhd8ed1ab_0.tar.bz2#1d7e241dfaf5475e893d4b824bb71b44 -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.20.2-py38ha217159_3.tar.bz2#d7461e191f7a0522e4709612786bdf4e -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.4.0-py38h6c62de6_0.tar.bz2#99a827766a8c3a68f1a51dd51b388aef -https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.8-pyhd8ed1ab_1.tar.bz2#53f1387c68c21cecb386e2cde51b3f7c -https://conda.anaconda.org/conda-forge/noarch/iris-3.2.0.post0-pyhd8ed1ab_0.tar.bz2#80f5a40bea1c67acded6d3d6301e81a3 -https://conda.anaconda.org/conda-forge/noarch/requests-2.27.1-pyhd8ed1ab_0.tar.bz2#7c1c427246b057b8fa97200ecdb2ed62 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 +https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py38h71d37f0_1007.tar.bz2#c8d3d8f137f8af7b1daca318131223b1 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.9.1-py38hea3f02b_0.tar.bz2#b232edb409c6a79e5921b3591c56b716 +https://conda.anaconda.org/conda-forge/linux-64/shapely-1.8.4-py38h3b45516_0.tar.bz2#d8621497bcc7b369ef9cce25d5a58aeb +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.1.1-py38h71d37f0_0.tar.bz2#b9e7f6f7509496a4a62906d02dfe3128 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.27.0-h164a9dd_0.tar.bz2#517bb7ad16aed252c06e3436bab00c9e +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.6.0-py38hb021067_0.tar.bz2#315ee5c0fbee508e739ddfac2bf8f600 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.0-nompi_py38h2a9f00d_102.tar.bz2#533ae5db3e2367d71a7890efb0aa3cdc +https://conda.anaconda.org/conda-forge/noarch/pyopenssl-22.0.0-pyhd8ed1ab_1.tar.bz2#2e7e3630919d29c8216bfa2cd643d79e +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.21.0-py38h606536b_0.tar.bz2#38fc3704565e44fb9fcdfaded03eee76 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.4.2-py38h71d37f0_0.tar.bz2#e732ced022b91d03704e9e74704775e6 +https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.11-pyhd8ed1ab_0.tar.bz2#0738978569b10669bdef41c671252dd1 +https://conda.anaconda.org/conda-forge/noarch/iris-3.3.1-pyhd8ed1ab_0.tar.bz2#176ab70a4fdd63397fdbfdbcd082a36e +https://conda.anaconda.org/conda-forge/noarch/requests-2.28.1-pyhd8ed1ab_1.tar.bz2#089382ee0e2dc2eae33a04cc3c2bddb0 From ffb1f8c5fa7d0eec98720c0c976e656a274164e4 Mon Sep 17 00:00:00 2001 From: Martin Yeo <40734014+trexfeathers@users.noreply.github.com> Date: Fri, 7 Oct 2022 10:49:28 +0100 Subject: [PATCH 198/583] New GRIB-CF mappings (#297) * New mappings from Julian Heming. * Further mappings. * Remove auto-generated message. --- iris_grib/_grib_cf_map.py | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/iris_grib/_grib_cf_map.py b/iris_grib/_grib_cf_map.py index 7d79b41a..eb830635 100644 --- a/iris_grib/_grib_cf_map.py +++ b/iris_grib/_grib_cf_map.py @@ -3,13 +3,6 @@ # This file is part of iris-grib and is released under the LGPL license. # See COPYING and COPYING.LESSER in the root of the repository for full # licensing details. -# -# DO NOT EDIT: AUTO-GENERATED -# Created on 29 November 2019 10:11 from -# http://www.metarelate.net/metOcean -# at commit 36da82fe65a1a37e6cf1fa49899107fc6dc908ed - -# https://github.com/metarelate/metOcean/commit/36da82fe65a1a37e6cf1fa49899107fc6dc908ed """ Provides GRIB/CF phenomenon translations. @@ -63,19 +56,27 @@ G2Param(2, 0, 0, 10): CFName('surface_upward_latent_heat_flux', None, 'W m-2'), G2Param(2, 0, 0, 11): CFName('surface_upward_sensible_heat_flux', None, 'W m-2'), G2Param(2, 0, 0, 17): CFName('surface_temperature', None, 'K'), + G2Param(2, 0, 0, 32): CFName('wet_bulb_potential_temperature', None, 'K'), G2Param(2, 0, 1, 0): CFName('specific_humidity', None, 'kg kg-1'), G2Param(2, 0, 1, 1): CFName('relative_humidity', None, '%'), G2Param(2, 0, 1, 2): CFName('humidity_mixing_ratio', None, 'kg kg-1'), G2Param(2, 0, 1, 3): CFName(None, 'precipitable_water', 'kg m-2'), G2Param(2, 0, 1, 7): CFName('precipitation_flux', None, 'kg m-2 s-1'), + G2Param(2, 0, 1, 9): CFName('stratiform_rainfall_amount', 'Large-scale precipitation (non-convective)', 'kg m-2'), + G2Param(2, 0, 1, 10): CFName('convective_rainfall_amount', 'Convective precipitation', 'kg m-2'), G2Param(2, 0, 1, 11): CFName('thickness_of_snowfall_amount', None, 'm'), G2Param(2, 0, 1, 13): CFName('liquid_water_content_of_surface_snow', None, 'kg m-2'), + G2Param(2, 0, 1, 15): CFName('stratiform_snowfall_amount', 'Large-scale snow', 'kg m-2'), G2Param(2, 0, 1, 22): CFName(None, 'cloud_mixing_ratio', 'kg kg-1'), + G2Param(2, 0, 1, 37): CFName('convective_rainfall_flux', 'Convective precipitation rate', 'kg m-2 s-1'), G2Param(2, 0, 1, 49): CFName('precipitation_amount', None, 'kg m-2'), G2Param(2, 0, 1, 51): CFName('atmosphere_mass_content_of_water', None, 'kg m-2'), G2Param(2, 0, 1, 53): CFName('snowfall_flux', None, 'kg m-2 s-1'), + G2Param(2, 0, 1, 58): CFName('convective_snowfall_flux', 'Convective snowfall rate', 'kg m-2 s-1'), + G2Param(2, 0, 1, 59): CFName('stratiform_snowfall_flux', 'Large scale snowfall rate', 'kg m-2 s-1'), G2Param(2, 0, 1, 60): CFName('snowfall_amount', None, 'kg m-2'), G2Param(2, 0, 1, 64): CFName('atmosphere_mass_content_of_water_vapor', None, 'kg m-2'), + G2Param(2, 0, 1, 77): CFName('stratiform_rainfall_flux', 'Large scale rain rate', 'kg m-2 s-1'), G2Param(2, 0, 1, 83): CFName('mass_fraction_of_cloud_liquid_water_in_air', None, 'kg kg-1'), G2Param(2, 0, 1, 84): CFName('mass_fraction_of_cloud_ice_in_air', None, 'kg kg-1'), G2Param(2, 0, 2, 0): CFName('wind_from_direction', None, 'degrees'), @@ -83,7 +84,9 @@ G2Param(2, 0, 2, 2): CFName('x_wind', None, 'm s-1'), G2Param(2, 0, 2, 3): CFName('y_wind', None, 'm s-1'), G2Param(2, 0, 2, 8): CFName('lagrangian_tendency_of_air_pressure', None, 'Pa s-1'), + G2Param(2, 0, 2, 9): CFName('upward_air_velocity', 'Vertical velocity (geometric)', 'm s-1'), G2Param(2, 0, 2, 10): CFName('atmosphere_absolute_vorticity', None, 's-1'), + G2Param(2, 0, 2, 12): CFName('atmosphere_relative_vorticity', 'Relative vorticity', 's-1'), G2Param(2, 0, 2, 14): CFName(None, 'ertel_potential_velocity', 'K m2 kg-1 s-1'), G2Param(2, 0, 2, 22): CFName('wind_speed_of_gust', None, 'm s-1'), G2Param(2, 0, 3, 0): CFName('air_pressure', None, 'Pa'), @@ -96,6 +99,7 @@ G2Param(2, 0, 4, 7): CFName('surface_downwelling_shortwave_flux_in_air', None, 'W m-2'), G2Param(2, 0, 4, 9): CFName('surface_net_downward_shortwave_flux', None, 'W m-2'), G2Param(2, 0, 5, 3): CFName('surface_downwelling_longwave_flux_in_air', None, 'W m-2'), + G2Param(2, 0, 5, 4): CFName('toa_outgoing_longwave_flux', 'Upward long-wave radiation flux', 'W m-2'), G2Param(2, 0, 5, 5): CFName('surface_net_downward_longwave_flux', None, 'W m-2'), G2Param(2, 0, 6, 1): CFName(None, 'cloud_area_fraction_assuming_maximum_random_overlap', '1'), G2Param(2, 0, 6, 3): CFName('low_type_cloud_area_fraction', None, '%'), @@ -118,6 +122,7 @@ G2Param(2, 2, 0, 0): CFName('land_area_fraction', None, '1'), G2Param(2, 2, 0, 1): CFName('surface_roughness_length', None, 'm'), G2Param(2, 2, 0, 2): CFName('soil_temperature', None, 'K'), + G2Param(2, 2, 0, 3): CFName('soil_moisture_content', 'Soil moisture content', 'kg m-2'), G2Param(2, 2, 0, 7): CFName('surface_altitude', None, 'm'), G2Param(2, 2, 0, 22): CFName('moisture_content_of_soil_layer', None, 'kg m-2'), G2Param(2, 2, 0, 34): CFName('surface_runoff_flux', None, 'kg m-2 s-1'), @@ -181,7 +186,11 @@ CFName('atmosphere_mass_content_of_water', None, 'kg m-2'): G2Param(2, 0, 1, 51), CFName('atmosphere_mass_content_of_water_vapor', None, 'kg m-2'): G2Param(2, 0, 1, 64), CFName('atmosphere_mole_content_of_ozone', None, 'Dobson'): G2Param(2, 0, 14, 0), + CFName('atmosphere_relative_vorticity', None, 's-1'): G2Param(2, 0, 2, 12), CFName('atmosphere_specific_convective_available_potential_energy', None, 'J kg-1'): G2Param(2, 0, 7, 6), + CFName('convective_rainfall_amount', None, 'kg m-2'): G2Param(2, 0, 1, 10), + CFName('convective_rainfall_flux', None, 'kg m-2 s-1'): G2Param(2, 0, 1, 37), + CFName('convective_snowfall_flux', None, 'kg m-2 s-1'): G2Param(2, 0, 1, 58), CFName('cloud_area_fraction_in_atmosphere_layer', None, '%'): G2Param(2, 0, 6, 7), CFName('dew_point_temperature', None, 'K'): G2Param(2, 0, 0, 6), CFName('geopotential', None, 'm2 s-2'): G2Param(2, 0, 3, 4), @@ -207,8 +216,13 @@ CFName('sea_water_y_velocity', None, 'm s-1'): G2Param(2, 10, 1, 3), CFName('snowfall_amount', None, 'kg m-2'): G2Param(2, 0, 1, 60), CFName('snowfall_flux', None, 'kg m-2 s-1'): G2Param(2, 0, 1, 53), + CFName('soil_moisture_content', None, 'kg m-2'): G2Param(2, 2, 0, 3), CFName('soil_temperature', None, 'K'): G2Param(2, 2, 0, 2), CFName('specific_humidity', None, 'kg kg-1'): G2Param(2, 0, 1, 0), + CFName('stratiform_rainfall_amount', None, 'kg m-2'): G2Param(2, 0, 1, 9), + CFName('stratiform_rainfall_flux', None, 'kg m-2 s-1'): G2Param(2, 0, 1, 77), + CFName('stratiform_snowfall_amount', None, 'kg m-2'): G2Param(2, 0, 1, 15), + CFName('stratiform_snowfall_flux', None, 'kg m-2 s-1'): G2Param(2, 0, 1, 59), CFName('surface_air_pressure', None, 'Pa'): G2Param(2, 0, 3, 0), CFName('surface_altitude', None, 'm'): G2Param(2, 2, 0, 7), CFName('surface_downwelling_longwave_flux_in_air', None, 'W m-2'): G2Param(2, 0, 5, 3), @@ -220,7 +234,10 @@ CFName('surface_temperature', None, 'K'): G2Param(2, 0, 0, 17), CFName('surface_upward_latent_heat_flux', None, 'W m-2'): G2Param(2, 0, 0, 10), CFName('surface_upward_sensible_heat_flux', None, 'W m-2'): G2Param(2, 0, 0, 11), + CFName('toa_outgoing_longwave_flux', None, 'W m-2'): G2Param(2, 0, 5, 4), CFName('thickness_of_snowfall_amount', None, 'm'): G2Param(2, 0, 1, 11), + CFName('upward_air_velocity', None, 'm s-1'): G2Param(2, 0, 2, 9), + CFName('wet_bulb_potential_temperature', None, 'K'): G2Param(2, 0, 0, 32), CFName('wind_from_direction', None, 'degrees'): G2Param(2, 0, 2, 0), CFName('wind_speed', None, 'm s-1'): G2Param(2, 0, 2, 1), CFName('wind_speed_of_gust', None, 'm s-1'): G2Param(2, 0, 2, 22), From 6b9304722ad9eb18c403db48947cb95b7519b3d5 Mon Sep 17 00:00:00 2001 From: lbdreyer Date: Wed, 2 Nov 2022 17:57:29 +0000 Subject: [PATCH 199/583] Use reusable workflow for refresh lockfile job (#304) * Use reusable workflow for refresh lockfiles * Fix cron time --- .github/workflows/refresh-lockfiles.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 .github/workflows/refresh-lockfiles.yml diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml new file mode 100644 index 00000000..3ee6b18f --- /dev/null +++ b/.github/workflows/refresh-lockfiles.yml @@ -0,0 +1,14 @@ +# Updates the environment lock files. See the called workflow in the +# scitools/reusable_workflows repo for more details. +name: Refresh Lockfiles + + +on: + workflow_dispatch: + schedule: + - cron: "2 0 * * 6" + +jobs: + refresh_lockfiles: + uses: scitools/reusable_workflows/.github/workflows/refresh-lockfiles.yml@main + secrets: inherit From c185841d96e47f314c44e7abd7855506444b3f99 Mon Sep 17 00:00:00 2001 From: lbdreyer Date: Wed, 2 Nov 2022 18:03:17 +0000 Subject: [PATCH 200/583] Correct location of reusable workflow repo (#307) --- .github/workflows/refresh-lockfiles.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 3ee6b18f..7f21e653 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/reusable_workflows/.github/workflows/refresh-lockfiles.yml@main + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@main secrets: inherit From 97930b69a3caf223c87c0f28f1a6cdb69fdbd335 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Wed, 9 Nov 2022 10:03:39 +0000 Subject: [PATCH 201/583] Updated environment lockfiles (#309) Co-authored-by: Lockfile bot --- requirements/ci/nox.lock/py38-linux-64.lock | 113 ++++++++++---------- 1 file changed, 59 insertions(+), 54 deletions(-) diff --git a/requirements/ci/nox.lock/py38-linux-64.lock b/requirements/ci/nox.lock/py38-linux-64.lock index 4be011b7..0ed6c44b 100644 --- a/requirements/ci/nox.lock/py38-linux-64.lock +++ b/requirements/ci/nox.lock/py38-linux-64.lock @@ -1,37 +1,39 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 653d8b6f55f200fb89ab1c6af6b2911b1aaa9b165a6276768e5d033b691c319f +# input_hash: 5d1f8c55ed222f05f64baa37a9f6b110189c50ca5fb7ffb4607bb76ffbb75226 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2022.9.24-ha878542_0.tar.bz2#41e4e87062433e283696cf384f952ef6 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.36.1-hea4e1c9_2.tar.bz2#bd4f2e711b39af170e7ff15163fe87ee -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-12.1.0-hdcd56e2_16.tar.bz2#b02605b875559ff99f04351fd5040760 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-12.1.0-ha89aaad_16.tar.bz2#6f5ba041a41eb102a1027d9e68731be7 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-12.1.0-h69a702a_16.tar.bz2#6bf15e29a20f614b18ae89368260d0a2 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-12.1.0-h8d9b700_16.tar.bz2#f013cf7749536ce43d82afbffdf499ab +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.39-hc81fddc_0.tar.bz2#c2719e2faa7bd7076d3a4b52271e5622 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-12.2.0-h337968e_19.tar.bz2#164b4b1acaedc47ee7e658ae6b308ca3 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-12.2.0-h46fd767_19.tar.bz2#1030b1f38c129f2634eae026f704fe60 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-12.2.0-h69a702a_19.tar.bz2#cd7a806282c16e1f2d39a7e80d3a3e0d +https://conda.anaconda.org/conda-forge/linux-64/libgomp-12.2.0-h65d4601_19.tar.bz2#cedcee7c064c01c403f962c9e8d3c373 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-12.1.0-h8d9b700_16.tar.bz2#4f05bc9844f7c101e6e147dab3c88d5c +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-12.2.0-h65d4601_19.tar.bz2#e4c94f80aef025c17ab0828cd85ef535 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.9-h27087fc_0.tar.bz2#493ac8b2503a949aebe33d99ea0c284f +https://conda.anaconda.org/conda-forge/linux-64/expat-2.5.0-h27087fc_0.tar.bz2#c4fbad8d4bddeb3c085f18cbf97fbfad https://conda.anaconda.org/conda-forge/linux-64/geos-3.11.0-h27087fc_0.tar.bz2#a583d0bc9a85c48e8b07a588d1ac8a80 +https://conda.anaconda.org/conda-forge/linux-64/icu-70.1-h27087fc_0.tar.bz2#87473a15119779e021c314249d4b4aed https://conda.anaconda.org/conda-forge/linux-64/jpeg-9e-h166bdaf_2.tar.bz2#ee8b844357a0946870901c7c6f418268 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libaec-1.0.6-h9c3ff4c_0.tar.bz2#c77f5e4e418fa47d699d6afa54c5d444 -https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.0.9-h166bdaf_7.tar.bz2#f82dc1c78bcf73583f2656433ce2933c +https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.0.9-h166bdaf_8.tar.bz2#9194c9bf9428035a05352d031462eae4 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.14-h166bdaf_0.tar.bz2#fc84a0446e4e4fb882e78d786cfb9734 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h516909a_1.tar.bz2#6f8720dff19e17ce5d48cfe7f3d2f0a3 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-he1b5a44_1001.tar.bz2#8208602aec4826053c116552369a394c +https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-h166bdaf_0.tar.bz2#b62b52da46c39ee2bc3c162ac7f1804d https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.0-h7f98852_0.tar.bz2#39b1328babf85c7c3a61636d9cd50206 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.21-pthreads_h78a6416_3.tar.bz2#8c5963a49b6035c40646a763293fbb35 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.32.1-h7f98852_1000.tar.bz2#772d69f030955d9646d3d0eaf21d859d https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.2.4-h166bdaf_0.tar.bz2#ac2ccf7323d21f2994e4d1f5da664f37 -https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.12-h166bdaf_4.tar.bz2#6a2e5b333ba57ce7eec61e90260cbb79 +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h166bdaf_4.tar.bz2#f3f9de449d32ca9b9c66a22863c96f41 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.3-h27087fc_1.tar.bz2#4acfc691e64342b9dae57cf2adc63238 -https://conda.anaconda.org/conda-forge/linux-64/openssl-1.1.1q-h166bdaf_0.tar.bz2#07acc367c7fc8b716770cd5b36d31717 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.0.7-h166bdaf_0.tar.bz2#d1ad1824c71e67dea42f07e06cd177dc https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a @@ -42,47 +44,50 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.0-h7f98852_3.tar.bz2#52402c791f35e414e704b7a113f99605 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae -https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h9772cbc_4.tar.bz2#dd3e1941dd06f64cb88647d2f7ff8aaa https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-16_linux64_openblas.tar.bz2#d9b7a8639171f6c6fa0a983edabcfe2b -https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.0.9-h166bdaf_7.tar.bz2#37a460703214d0d1b421e2a47eb5e6d0 -https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.0.9-h166bdaf_7.tar.bz2#785a9296ea478eb78c47593c4da6550f +https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.0.9-h166bdaf_8.tar.bz2#4ae4d7795d33e02bd20f6b23d91caf82 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.0.9-h166bdaf_8.tar.bz2#04bac51ba35ea023dc48af73c1c88c25 https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.47.0-hdcd2b5c_1.tar.bz2#6fe9e31c2b8d0b022626ccac13e6ca3c +https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.47.0-hff17c54_1.tar.bz2#2b7dbfa6988a41f9d23ba6d4f0e1d74e https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.38-h753d276_0.tar.bz2#575078de1d3a3114b3ce131bd1508d0c https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.39.4-h753d276_0.tar.bz2#978924c298fc2215f129e8171bbea688 -https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.10.0-haa6b8db_3.tar.bz2#89acee135f0809a18a1f4537390aa2dd +https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.10.0-hf14f497_3.tar.bz2#d85acad4b47dff4e3def14a769a97906 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.13-h7f98852_1004.tar.bz2#b3653fdc58d03face9724f602218a904 -https://conda.anaconda.org/conda-forge/linux-64/libzip-1.9.2-hc869a4a_1.tar.bz2#7a268cf1386d271e576e35ae82149ef2 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.10.3-h7463322_0.tar.bz2#3b933ea47ef8f330c4c068af25fcd6a8 +https://conda.anaconda.org/conda-forge/linux-64/libzip-1.9.2-hc929e4a_1.tar.bz2#5b122b50e738c4be5c3f2899f010d7cf https://conda.anaconda.org/conda-forge/linux-64/readline-8.1.2-h0f457ee_0.tar.bz2#db2ebbe2943aae81ed051a6a9af8e0fa https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-hc3e0081_0.tar.bz2#d4c341e0379c31e9e781d4f204726867 https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-h166bdaf_4.tar.bz2#4b11e365c0275b808be78b30f904e295 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-h6239696_4.tar.bz2#adcf0be7897e73e312bd24353b613f74 -https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_7.tar.bz2#1699c1211d56a23c66047524cd76796e +https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_8.tar.bz2#e5613f2bc717e9945840ff474419b8e4 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-hca18f0e_0.tar.bz2#4e54cbfc47b8c74c2ecc1e7730d8edce -https://conda.anaconda.org/conda-forge/linux-64/krb5-1.19.3-h3790be6_0.tar.bz2#7d862b05445123144bec92cb1acc8ef8 +https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h9772cbc_5.tar.bz2#ee08782aff2ff9b3291c967fa6bc7336 +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.19.3-h08a2579_0.tar.bz2#d25e05e7ee0e302b52d24491db4891eb https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-16_linux64_openblas.tar.bz2#20bae26d0a1db73f758fc3754cab4719 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-16_linux64_openblas.tar.bz2#955d993f41f9354bf753d29864ea20ad https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.4.0-h55922b4_4.tar.bz2#901791f0ec7cddc8714e76e273013a91 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.39.4-h4ff8645_0.tar.bz2#643c271de2dd23ecbd107284426cebc2 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/brotli-1.0.9-h166bdaf_7.tar.bz2#3889dec08a472eb0f423e5609c76bde1 -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.85.0-h7bff187_0.tar.bz2#054fb5981fdbe031caeb612b71d85f84 +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_8.tar.bz2#2ff08978892a3e8b954397c461f18418 +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.14-h6ed2654_0.tar.bz2#dcc588839de1445d90995a0a2c4f3a39 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-7.86.0-h2283fc2_1.tar.bz2#fdca8cd67ec2676f90a70ac73a32538b https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-h7d73246_1.tar.bz2#a11b4df9271a8d7917686725aa04c8f2 -https://conda.anaconda.org/conda-forge/linux-64/python-3.8.13-h582c2e5_0_cpython.tar.bz2#8ec74710472994e2411a8020fa8589ce +https://conda.anaconda.org/conda-forge/linux-64/python-3.8.13-ha86cf86_0_cpython.tar.bz2#39183fc3fc91579b466dfa767d2ef4b1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h7f98852_1.tar.bz2#536cc5db4d0a3ba0630541aec064b5e4 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/noarch/attrs-22.1.0-pyh71513ae_1.tar.bz2#6d3ccbc56256204925bfa8378722792f https://conda.anaconda.org/conda-forge/noarch/certifi-2022.9.24-pyhd8ed1ab_0.tar.bz2#f66309b099374af91369e67e84af397d https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-2.1.1-pyhd8ed1ab_0.tar.bz2#c1d5b294fbf9a795dec349a6f4d8be8e +https://conda.anaconda.org/conda-forge/noarch/click-8.1.3-unix_pyhd8ed1ab_2.tar.bz2#20e4087407c7cb04a40817114b333dbf https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.0-pyhd8ed1ab_0.tar.bz2#a6cf47b09786423200d7982d1faa19eb -https://conda.anaconda.org/conda-forge/linux-64/curl-7.85.0-h7bff187_0.tar.bz2#a8ac96d6b09b8ed5b0ac6563901e2195 +https://conda.anaconda.org/conda-forge/linux-64/curl-7.86.0-h2283fc2_1.tar.bz2#9d4149760567cb232691cce2d8ccc21f https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb https://conda.anaconda.org/conda-forge/noarch/filelock-3.8.0-pyhd8ed1ab_0.tar.bz2#10f0218dbd493ab2e5dc6759ddea4526 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.2-pyhd8ed1ab_0.tar.bz2#c2a60dd9f1210b8ee2037f7d0ec6251a -https://conda.anaconda.org/conda-forge/noarch/fsspec-2022.8.2-pyhd8ed1ab_0.tar.bz2#140dc6615896e7d4be1059a63370be93 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.12.2-nompi_h2386368_100.tar.bz2#b014a5f912e0193783e48086b7bb3995 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2022.10.0-pyhd8ed1ab_0.tar.bz2#ee4d78b97e857cb8d845c8fa4c898433 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.12.2-nompi_h4df4325_100.tar.bz2#91f6a330e4aeba166e5d7f0ee0af3d37 https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 @@ -94,46 +99,46 @@ https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.0.9-pyhd8ed1ab_0.tar.b https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.8-2_cp38.tar.bz2#bfbb29d517281e78ac53e48d21e6e860 -https://conda.anaconda.org/conda-forge/noarch/setuptools-65.4.1-pyhd8ed1ab_0.tar.bz2#d61d9f25af23c24002e659b854c6f5ae +https://conda.anaconda.org/conda-forge/noarch/setuptools-65.5.1-pyhd8ed1ab_0.tar.bz2#cfb8dc4d9d285ca5fb1177b9dd450e33 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.37.1-pyhd8ed1ab_0.tar.bz2#1ca02aaf78d9c70d9a81a3bed5752022 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.38.1-pyhd8ed1ab_0.tar.bz2#378143e35844908162bca2488436887a https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 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/linux-64/cffi-1.15.1-py38h4a40e3a_0.tar.bz2#a970d201055ec06a75db83bf25447eb2 +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py38h4a40e3a_2.tar.bz2#2276b1f4d1ede3f5f14cc7e4ae6f9a33 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-h9c3ff4c_1.tar.bz2#1192066d1296de9b492175a4cf43fe8a -https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.4-py38h43d8883_0.tar.bz2#ae54c61918e1cbd280b8587ed6219258 -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.8.1-nompi_h21705cb_104.tar.bz2#4426b64bac9de35499554d45b93de880 -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.1-py38h0a891b7_1.tar.bz2#20d003ad5f584e212c299f64cac46c05 -https://conda.anaconda.org/conda-forge/linux-64/mock-4.0.3-py38h578d9bd_3.tar.bz2#616ceac2c8733522d2841f91a362a70c -https://conda.anaconda.org/conda-forge/linux-64/numpy-1.23.3-py38h3a7f9d9_0.tar.bz2#83ba913fc1174925d4e862eccb53db59 +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.4-py38h43d8883_1.tar.bz2#41ca56d5cac7bfc7eb4fcdbee878eb84 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.8.1-nompi_h261ec11_106.tar.bz2#9b25de670ce5753a33c18b1090d1d3bf +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.1-py38h0a891b7_2.tar.bz2#c342a370480791db83d5dd20f2d8899f +https://conda.anaconda.org/conda-forge/noarch/mock-4.0.3-pyhd8ed1ab_4.tar.bz2#a49a3174d0d7392c115a6608548a907c +https://conda.anaconda.org/conda-forge/linux-64/numpy-1.23.4-py38h7042d01_1.tar.bz2#7fa0e9ed4e8a096e2f00b2426ebba0de https://conda.anaconda.org/conda-forge/noarch/packaging-21.3-pyhd8ed1ab_0.tar.bz2#71f1ab2de48613876becddd496371c85 https://conda.anaconda.org/conda-forge/noarch/partd-1.3.0-pyhd8ed1ab_0.tar.bz2#af8c82d121e63082926062d61d9abb54 -https://conda.anaconda.org/conda-forge/linux-64/pillow-9.2.0-py38ha3b2c9c_2.tar.bz2#a077cc2bb9d854074b1cf4607252da7a -https://conda.anaconda.org/conda-forge/noarch/pip-22.2.2-pyhd8ed1ab_0.tar.bz2#0b43abe4d3ee93e82742d37def53a836 -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.4.0-py38hd7890fc_1.tar.bz2#f851bb08c85122fd0e1f66d2072ebf0b +https://conda.anaconda.org/conda-forge/linux-64/pillow-9.2.0-py38h9eb91d8_3.tar.bz2#61dc7b3140b7b79b1985b53d52726d74 +https://conda.anaconda.org/conda-forge/noarch/pip-22.3-pyhd8ed1ab_0.tar.bz2#6f4c6de9fed2a9bd8043283611b09587 +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.4.0-py38hce0a2d1_2.tar.bz2#be61a535f279bffdf7f449a654eaa19d 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-3.0.0-py38h0a891b7_1.tar.bz2#69fc64e4f4c13abe0b8df699ddaa1051 -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py38h0a891b7_4.tar.bz2#ba24ff01bb38c5cd5be54b45ef685db3 -https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-14.0.0-py38h0a891b7_1.tar.bz2#83df0e9e3faffc295f12607438691465 -https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py38h0a891b7_1004.tar.bz2#9fcaaca218dcfeb8da806d4fd4824aa0 -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py38h26c90d9_0.tar.bz2#df081ec90a13f53fe522c8e876d3f0cf -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.0.5-py38h43d8883_0.tar.bz2#0650a251fd701bbe5ac44e74cf632af8 -https://conda.anaconda.org/conda-forge/linux-64/cryptography-38.0.1-py38h2b5fc30_0.tar.bz2#692d3e8efeb7f290daafa660ec7f1154 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2022.9.2-pyhd8ed1ab_0.tar.bz2#9993f51a02fc8338837421211b53ab19 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.37.4-py38h0a891b7_0.tar.bz2#401adaccd86738f95a247d2007d925cf +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.0.0-py38h0a891b7_2.tar.bz2#9b13816a39904084556126a6ce7fd0d0 +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py38h0a891b7_5.tar.bz2#0856c59f9ddb710c640dc0428d66b1b7 +https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.0.0-py38h0a891b7_0.tar.bz2#44421904760e9f5ae2035193e04360f0 +https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py38h0a891b7_1005.tar.bz2#e99e08812dfff30fdd17b3f8838e2759 +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py38h26c90d9_1.tar.bz2#dcc025a7bb54374979c500c2e161fac9 +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.0.6-py38h43d8883_0.tar.bz2#1107ee053d55172b26c4fc905dd0238e +https://conda.anaconda.org/conda-forge/linux-64/cryptography-38.0.3-py38h80a4ca7_0.tar.bz2#9822ec88bb44cddbe3fdeebc41135808 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2022.10.2-pyhd8ed1ab_0.tar.bz2#6f837aa0cbc910b39207fe5d97dfdf1e +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.38.0-py38h0a891b7_1.tar.bz2#62c89ddefed9c5835e228a32b357a28d https://conda.anaconda.org/conda-forge/linux-64/jasper-2.0.33-ha77e612_0.tar.bz2#054883e8ea7142e89bcbec08b5d401ea https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 -https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py38h71d37f0_1007.tar.bz2#c8d3d8f137f8af7b1daca318131223b1 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.9.1-py38hea3f02b_0.tar.bz2#b232edb409c6a79e5921b3591c56b716 -https://conda.anaconda.org/conda-forge/linux-64/shapely-1.8.4-py38h3b45516_0.tar.bz2#d8621497bcc7b369ef9cce25d5a58aeb -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.1.1-py38h71d37f0_0.tar.bz2#b9e7f6f7509496a4a62906d02dfe3128 +https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py38h26c90d9_1008.tar.bz2#6bc8cd29312f4fc77156b78124e165cd +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.9.3-py38h8ce737c_1.tar.bz2#7b69c1e959b9f2ef360d2927284042cc +https://conda.anaconda.org/conda-forge/linux-64/shapely-1.8.5-py38hc9bb657_1.tar.bz2#1d08682ad092550a728bf45fce568f4e +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.1.1-py38h26c90d9_2.tar.bz2#0ea017e84efe45badce6c32f274dbf8e https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.27.0-h164a9dd_0.tar.bz2#517bb7ad16aed252c06e3436bab00c9e -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.6.0-py38hb021067_0.tar.bz2#315ee5c0fbee508e739ddfac2bf8f600 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.6.2-py38hb021067_0.tar.bz2#72422499195d8aded0dfd461c6e3e86f https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.0-nompi_py38h2a9f00d_102.tar.bz2#533ae5db3e2367d71a7890efb0aa3cdc -https://conda.anaconda.org/conda-forge/noarch/pyopenssl-22.0.0-pyhd8ed1ab_1.tar.bz2#2e7e3630919d29c8216bfa2cd643d79e -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.21.0-py38h606536b_0.tar.bz2#38fc3704565e44fb9fcdfaded03eee76 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.4.2-py38h71d37f0_0.tar.bz2#e732ced022b91d03704e9e74704775e6 +https://conda.anaconda.org/conda-forge/noarch/pyopenssl-22.1.0-pyhd8ed1ab_0.tar.bz2#fbfa0a180d48c800f922a10a114a8632 +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.21.0-py38hd475de4_2.tar.bz2#bb2026700724e39401fbcc346b438df4 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.4.2-py38h26c90d9_1.tar.bz2#f1a36545bf196571e21491cecd8af475 https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.11-pyhd8ed1ab_0.tar.bz2#0738978569b10669bdef41c671252dd1 https://conda.anaconda.org/conda-forge/noarch/iris-3.3.1-pyhd8ed1ab_0.tar.bz2#176ab70a4fdd63397fdbfdbcd082a36e https://conda.anaconda.org/conda-forge/noarch/requests-2.28.1-pyhd8ed1ab_1.tar.bz2#089382ee0e2dc2eae33a04cc3c2bddb0 From d3988a43c5af00b4a4da804bcde1820dd1c34a1e Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 14 Nov 2022 09:45:25 +0000 Subject: [PATCH 202/583] Updated environment lockfiles (#310) Co-authored-by: Lockfile bot --- requirements/ci/nox.lock/py38-linux-64.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/requirements/ci/nox.lock/py38-linux-64.lock b/requirements/ci/nox.lock/py38-linux-64.lock index 0ed6c44b..27873e80 100644 --- a/requirements/ci/nox.lock/py38-linux-64.lock +++ b/requirements/ci/nox.lock/py38-linux-64.lock @@ -86,7 +86,7 @@ https://conda.anaconda.org/conda-forge/linux-64/curl-7.86.0-h2283fc2_1.tar.bz2#9 https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb https://conda.anaconda.org/conda-forge/noarch/filelock-3.8.0-pyhd8ed1ab_0.tar.bz2#10f0218dbd493ab2e5dc6759ddea4526 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.2-pyhd8ed1ab_0.tar.bz2#c2a60dd9f1210b8ee2037f7d0ec6251a -https://conda.anaconda.org/conda-forge/noarch/fsspec-2022.10.0-pyhd8ed1ab_0.tar.bz2#ee4d78b97e857cb8d845c8fa4c898433 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2022.11.0-pyhd8ed1ab_0.tar.bz2#eb919f2119a6db5d0192f9e9c3711572 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.12.2-nompi_h4df4325_100.tar.bz2#91f6a330e4aeba166e5d7f0ee0af3d37 https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 @@ -102,7 +102,7 @@ https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.8-2_cp38.tar.bz2#bf https://conda.anaconda.org/conda-forge/noarch/setuptools-65.5.1-pyhd8ed1ab_0.tar.bz2#cfb8dc4d9d285ca5fb1177b9dd450e33 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.38.1-pyhd8ed1ab_0.tar.bz2#378143e35844908162bca2488436887a +https://conda.anaconda.org/conda-forge/noarch/wheel-0.38.4-pyhd8ed1ab_0.tar.bz2#c829cfb8cb826acb9de0ac1a2df0a940 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 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/linux-64/cffi-1.15.1-py38h4a40e3a_2.tar.bz2#2276b1f4d1ede3f5f14cc7e4ae6f9a33 @@ -115,7 +115,7 @@ https://conda.anaconda.org/conda-forge/linux-64/numpy-1.23.4-py38h7042d01_1.tar. https://conda.anaconda.org/conda-forge/noarch/packaging-21.3-pyhd8ed1ab_0.tar.bz2#71f1ab2de48613876becddd496371c85 https://conda.anaconda.org/conda-forge/noarch/partd-1.3.0-pyhd8ed1ab_0.tar.bz2#af8c82d121e63082926062d61d9abb54 https://conda.anaconda.org/conda-forge/linux-64/pillow-9.2.0-py38h9eb91d8_3.tar.bz2#61dc7b3140b7b79b1985b53d52726d74 -https://conda.anaconda.org/conda-forge/noarch/pip-22.3-pyhd8ed1ab_0.tar.bz2#6f4c6de9fed2a9bd8043283611b09587 +https://conda.anaconda.org/conda-forge/noarch/pip-22.3.1-pyhd8ed1ab_0.tar.bz2#da66f2851b9836d3a7c5190082a45f7d https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.4.0-py38hce0a2d1_2.tar.bz2#be61a535f279bffdf7f449a654eaa19d 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-3.0.0-py38h0a891b7_2.tar.bz2#9b13816a39904084556126a6ce7fd0d0 @@ -130,7 +130,7 @@ https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.38.0-py38h0a891b7_1. https://conda.anaconda.org/conda-forge/linux-64/jasper-2.0.33-ha77e612_0.tar.bz2#054883e8ea7142e89bcbec08b5d401ea https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py38h26c90d9_1008.tar.bz2#6bc8cd29312f4fc77156b78124e165cd -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.9.3-py38h8ce737c_1.tar.bz2#7b69c1e959b9f2ef360d2927284042cc +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.9.3-py38h8ce737c_2.tar.bz2#dfd81898f0c6e9ee0c22305da6aa443e https://conda.anaconda.org/conda-forge/linux-64/shapely-1.8.5-py38hc9bb657_1.tar.bz2#1d08682ad092550a728bf45fce568f4e https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.1.1-py38h26c90d9_2.tar.bz2#0ea017e84efe45badce6c32f274dbf8e https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.27.0-h164a9dd_0.tar.bz2#517bb7ad16aed252c06e3436bab00c9e From b466279912906dc705449942141e6d04f326a2b1 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 21 Nov 2022 10:04:24 +0000 Subject: [PATCH 203/583] Updated environment lockfiles (#311) Co-authored-by: Lockfile bot --- requirements/ci/nox.lock/py38-linux-64.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/requirements/ci/nox.lock/py38-linux-64.lock b/requirements/ci/nox.lock/py38-linux-64.lock index 27873e80..992a83d7 100644 --- a/requirements/ci/nox.lock/py38-linux-64.lock +++ b/requirements/ci/nox.lock/py38-linux-64.lock @@ -14,7 +14,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-12.2.0-h65d4601_19.tar 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.5.0-h27087fc_0.tar.bz2#c4fbad8d4bddeb3c085f18cbf97fbfad -https://conda.anaconda.org/conda-forge/linux-64/geos-3.11.0-h27087fc_0.tar.bz2#a583d0bc9a85c48e8b07a588d1ac8a80 +https://conda.anaconda.org/conda-forge/linux-64/geos-3.11.1-h27087fc_0.tar.bz2#917b9a50001fffdd89b321b5dba31e55 https://conda.anaconda.org/conda-forge/linux-64/icu-70.1-h27087fc_0.tar.bz2#87473a15119779e021c314249d4b4aed https://conda.anaconda.org/conda-forge/linux-64/jpeg-9e-h166bdaf_2.tar.bz2#ee8b844357a0946870901c7c6f418268 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 @@ -50,7 +50,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.0.9-h166bdaf_8.ta https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.47.0-hff17c54_1.tar.bz2#2b7dbfa6988a41f9d23ba6d4f0e1d74e https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.38-h753d276_0.tar.bz2#575078de1d3a3114b3ce131bd1508d0c -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.39.4-h753d276_0.tar.bz2#978924c298fc2215f129e8171bbea688 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.40.0-h753d276_0.tar.bz2#2e5f9a37d487e1019fd4d8113adb2f9f https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.10.0-hf14f497_3.tar.bz2#d85acad4b47dff4e3def14a769a97906 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.13-h7f98852_1004.tar.bz2#b3653fdc58d03face9724f602218a904 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.10.3-h7463322_0.tar.bz2#3b933ea47ef8f330c4c068af25fcd6a8 @@ -68,7 +68,7 @@ https://conda.anaconda.org/conda-forge/linux-64/krb5-1.19.3-h08a2579_0.tar.bz2#d https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-16_linux64_openblas.tar.bz2#20bae26d0a1db73f758fc3754cab4719 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-16_linux64_openblas.tar.bz2#955d993f41f9354bf753d29864ea20ad https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.4.0-h55922b4_4.tar.bz2#901791f0ec7cddc8714e76e273013a91 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.39.4-h4ff8645_0.tar.bz2#643c271de2dd23ecbd107284426cebc2 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.40.0-h4ff8645_0.tar.bz2#bb11803129cbbb53ed56f9506ff74145 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/brotli-1.0.9-h166bdaf_8.tar.bz2#2ff08978892a3e8b954397c461f18418 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.14-h6ed2654_0.tar.bz2#dcc588839de1445d90995a0a2c4f3a39 @@ -125,19 +125,19 @@ https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py38h0a891b7_1005 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py38h26c90d9_1.tar.bz2#dcc025a7bb54374979c500c2e161fac9 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.0.6-py38h43d8883_0.tar.bz2#1107ee053d55172b26c4fc905dd0238e https://conda.anaconda.org/conda-forge/linux-64/cryptography-38.0.3-py38h80a4ca7_0.tar.bz2#9822ec88bb44cddbe3fdeebc41135808 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2022.10.2-pyhd8ed1ab_0.tar.bz2#6f837aa0cbc910b39207fe5d97dfdf1e +https://conda.anaconda.org/conda-forge/noarch/dask-core-2022.11.1-pyhd8ed1ab_0.conda#383ee12e7c9c27adab310a884bc359ab https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.38.0-py38h0a891b7_1.tar.bz2#62c89ddefed9c5835e228a32b357a28d https://conda.anaconda.org/conda-forge/linux-64/jasper-2.0.33-ha77e612_0.tar.bz2#054883e8ea7142e89bcbec08b5d401ea https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py38h26c90d9_1008.tar.bz2#6bc8cd29312f4fc77156b78124e165cd https://conda.anaconda.org/conda-forge/linux-64/scipy-1.9.3-py38h8ce737c_2.tar.bz2#dfd81898f0c6e9ee0c22305da6aa443e -https://conda.anaconda.org/conda-forge/linux-64/shapely-1.8.5-py38hc9bb657_1.tar.bz2#1d08682ad092550a728bf45fce568f4e +https://conda.anaconda.org/conda-forge/linux-64/shapely-1.8.5-py38hafd38ec_2.tar.bz2#8df75c6a8c1deac4e99583ec624ff327 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.1.1-py38h26c90d9_2.tar.bz2#0ea017e84efe45badce6c32f274dbf8e https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.27.0-h164a9dd_0.tar.bz2#517bb7ad16aed252c06e3436bab00c9e https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.6.2-py38hb021067_0.tar.bz2#72422499195d8aded0dfd461c6e3e86f https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.0-nompi_py38h2a9f00d_102.tar.bz2#533ae5db3e2367d71a7890efb0aa3cdc https://conda.anaconda.org/conda-forge/noarch/pyopenssl-22.1.0-pyhd8ed1ab_0.tar.bz2#fbfa0a180d48c800f922a10a114a8632 -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.21.0-py38hd475de4_2.tar.bz2#bb2026700724e39401fbcc346b438df4 +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.21.0-py38hf6c3373_3.tar.bz2#1dc477fef9b0b1080af3e7c7ecb4aff7 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.4.2-py38h26c90d9_1.tar.bz2#f1a36545bf196571e21491cecd8af475 https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.11-pyhd8ed1ab_0.tar.bz2#0738978569b10669bdef41c671252dd1 https://conda.anaconda.org/conda-forge/noarch/iris-3.3.1-pyhd8ed1ab_0.tar.bz2#176ab70a4fdd63397fdbfdbcd082a36e From c192455fdf08de5b28e98fbc78b93dd348a0ea64 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 5 Dec 2022 00:20:07 +0000 Subject: [PATCH 204/583] Updated environment lockfiles (#312) Co-authored-by: Lockfile bot --- requirements/ci/nox.lock/py38-linux-64.lock | 76 ++++++++++----------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/requirements/ci/nox.lock/py38-linux-64.lock b/requirements/ci/nox.lock/py38-linux-64.lock index 992a83d7..f64dc5ab 100644 --- a/requirements/ci/nox.lock/py38-linux-64.lock +++ b/requirements/ci/nox.lock/py38-linux-64.lock @@ -4,9 +4,10 @@ @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2022.9.24-ha878542_0.tar.bz2#41e4e87062433e283696cf384f952ef6 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.39-hc81fddc_0.tar.bz2#c2719e2faa7bd7076d3a4b52271e5622 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.39-hcc3a1bd_1.conda#737be0d34c22d24432049ab7a3214de4 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-12.2.0-h337968e_19.tar.bz2#164b4b1acaedc47ee7e658ae6b308ca3 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-12.2.0-h46fd767_19.tar.bz2#1030b1f38c129f2634eae026f704fe60 +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.8-3_cp38.conda#2f3f7af062b42d664117662612022204 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-12.2.0-h69a702a_19.tar.bz2#cd7a806282c16e1f2d39a7e80d3a3e0d https://conda.anaconda.org/conda-forge/linux-64/libgomp-12.2.0-h65d4601_19.tar.bz2#cedcee7c064c01c403f962c9e8d3c373 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d @@ -49,7 +50,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.0.9-h166bdaf_8.ta https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.0.9-h166bdaf_8.tar.bz2#04bac51ba35ea023dc48af73c1c88c25 https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.47.0-hff17c54_1.tar.bz2#2b7dbfa6988a41f9d23ba6d4f0e1d74e -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.38-h753d276_0.tar.bz2#575078de1d3a3114b3ce131bd1508d0c +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.39-h753d276_0.conda#e1c890aebdebbfbf87e2c917187b4416 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.40.0-h753d276_0.tar.bz2#2e5f9a37d487e1019fd4d8113adb2f9f https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.10.0-hf14f497_3.tar.bz2#d85acad4b47dff4e3def14a769a97906 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.13-h7f98852_1004.tar.bz2#b3653fdc58d03face9724f602218a904 @@ -62,83 +63,82 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_100 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-h166bdaf_4.tar.bz2#4b11e365c0275b808be78b30f904e295 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-h6239696_4.tar.bz2#adcf0be7897e73e312bd24353b613f74 https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_8.tar.bz2#e5613f2bc717e9945840ff474419b8e4 -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-hca18f0e_0.tar.bz2#4e54cbfc47b8c74c2ecc1e7730d8edce +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-hca18f0e_1.conda#e1232042de76d24539a436d37597eb06 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h9772cbc_5.tar.bz2#ee08782aff2ff9b3291c967fa6bc7336 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.19.3-h08a2579_0.tar.bz2#d25e05e7ee0e302b52d24491db4891eb https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-16_linux64_openblas.tar.bz2#20bae26d0a1db73f758fc3754cab4719 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-16_linux64_openblas.tar.bz2#955d993f41f9354bf753d29864ea20ad https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.4.0-h55922b4_4.tar.bz2#901791f0ec7cddc8714e76e273013a91 +https://conda.anaconda.org/conda-forge/linux-64/python-3.8.15-h4a9ceb5_0_cpython.conda#dc29a8a79d0f2c80004cc06d3190104f https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.40.0-h4ff8645_0.tar.bz2#bb11803129cbbb53ed56f9506ff74145 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/brotli-1.0.9-h166bdaf_8.tar.bz2#2ff08978892a3e8b954397c461f18418 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.14-h6ed2654_0.tar.bz2#dcc588839de1445d90995a0a2c4f3a39 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-7.86.0-h2283fc2_1.tar.bz2#fdca8cd67ec2676f90a70ac73a32538b -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-h7d73246_1.tar.bz2#a11b4df9271a8d7917686725aa04c8f2 -https://conda.anaconda.org/conda-forge/linux-64/python-3.8.13-ha86cf86_0_cpython.tar.bz2#39183fc3fc91579b466dfa767d2ef4b1 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h7f98852_1.tar.bz2#536cc5db4d0a3ba0630541aec064b5e4 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a +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/attrs-22.1.0-pyh71513ae_1.tar.bz2#6d3ccbc56256204925bfa8378722792f +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_8.tar.bz2#2ff08978892a3e8b954397c461f18418 https://conda.anaconda.org/conda-forge/noarch/certifi-2022.9.24-pyhd8ed1ab_0.tar.bz2#f66309b099374af91369e67e84af397d https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-2.1.1-pyhd8ed1ab_0.tar.bz2#c1d5b294fbf9a795dec349a6f4d8be8e https://conda.anaconda.org/conda-forge/noarch/click-8.1.3-unix_pyhd8ed1ab_2.tar.bz2#20e4087407c7cb04a40817114b333dbf https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.0-pyhd8ed1ab_0.tar.bz2#a6cf47b09786423200d7982d1faa19eb -https://conda.anaconda.org/conda-forge/linux-64/curl-7.86.0-h2283fc2_1.tar.bz2#9d4149760567cb232691cce2d8ccc21f https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb https://conda.anaconda.org/conda-forge/noarch/filelock-3.8.0-pyhd8ed1ab_0.tar.bz2#10f0218dbd493ab2e5dc6759ddea4526 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.2-pyhd8ed1ab_0.tar.bz2#c2a60dd9f1210b8ee2037f7d0ec6251a https://conda.anaconda.org/conda-forge/noarch/fsspec-2022.11.0-pyhd8ed1ab_0.tar.bz2#eb919f2119a6db5d0192f9e9c3711572 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.12.2-nompi_h4df4325_100.tar.bz2#91f6a330e4aeba166e5d7f0ee0af3d37 https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.4-py38h43d8883_1.tar.bz2#41ca56d5cac7bfc7eb4fcdbee878eb84 +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.14-h6ed2654_0.tar.bz2#dcc588839de1445d90995a0a2c4f3a39 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-7.86.0-h2283fc2_1.tar.bz2#fdca8cd67ec2676f90a70ac73a32538b https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.1-py38h0a891b7_2.tar.bz2#c342a370480791db83d5dd20f2d8899f 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 +https://conda.anaconda.org/conda-forge/linux-64/numpy-1.23.5-py38h7042d01_0.conda#d5a3620cd8c1af4115120f21d678507a +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-h7d73246_1.tar.bz2#a11b4df9271a8d7917686725aa04c8f2 https://conda.anaconda.org/conda-forge/noarch/pep8-1.7.1-py_0.tar.bz2#d0b5bc3aebbffcb175bf8a1d419acb79 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.1.0-h93bde94_0.tar.bz2#255c7204dda39747c3ba380d28b026d7 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.0.9-pyhd8ed1ab_0.tar.bz2#e8fbc1b54b25f4b08281467bc13b70cc https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.8-2_cp38.tar.bz2#bfbb29d517281e78ac53e48d21e6e860 +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.0.0-py38h0a891b7_2.tar.bz2#9b13816a39904084556126a6ce7fd0d0 +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py38h0a891b7_5.tar.bz2#0856c59f9ddb710c640dc0428d66b1b7 https://conda.anaconda.org/conda-forge/noarch/setuptools-65.5.1-pyhd8ed1ab_0.tar.bz2#cfb8dc4d9d285ca5fb1177b9dd450e33 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 +https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.0.0-py38h0a891b7_0.tar.bz2#44421904760e9f5ae2035193e04360f0 https://conda.anaconda.org/conda-forge/noarch/wheel-0.38.4-pyhd8ed1ab_0.tar.bz2#c829cfb8cb826acb9de0ac1a2df0a940 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 -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/linux-64/xorg-libxext-1.3.4-h7f98852_1.tar.bz2#536cc5db4d0a3ba0630541aec064b5e4 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py38h4a40e3a_2.tar.bz2#2276b1f4d1ede3f5f14cc7e4ae6f9a33 -https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-h9c3ff4c_1.tar.bz2#1192066d1296de9b492175a4cf43fe8a -https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.4-py38h43d8883_1.tar.bz2#41ca56d5cac7bfc7eb4fcdbee878eb84 -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.8.1-nompi_h261ec11_106.tar.bz2#9b25de670ce5753a33c18b1090d1d3bf -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.1-py38h0a891b7_2.tar.bz2#c342a370480791db83d5dd20f2d8899f +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py38h26c90d9_1.tar.bz2#dcc025a7bb54374979c500c2e161fac9 +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.0.6-py38h43d8883_0.tar.bz2#1107ee053d55172b26c4fc905dd0238e +https://conda.anaconda.org/conda-forge/linux-64/curl-7.86.0-h2283fc2_1.tar.bz2#9d4149760567cb232691cce2d8ccc21f +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.38.0-py38h0a891b7_1.tar.bz2#62c89ddefed9c5835e228a32b357a28d +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.12.2-nompi_h4df4325_100.tar.bz2#91f6a330e4aeba166e5d7f0ee0af3d37 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 +https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py38h26c90d9_1008.tar.bz2#6bc8cd29312f4fc77156b78124e165cd https://conda.anaconda.org/conda-forge/noarch/mock-4.0.3-pyhd8ed1ab_4.tar.bz2#a49a3174d0d7392c115a6608548a907c -https://conda.anaconda.org/conda-forge/linux-64/numpy-1.23.4-py38h7042d01_1.tar.bz2#7fa0e9ed4e8a096e2f00b2426ebba0de https://conda.anaconda.org/conda-forge/noarch/packaging-21.3-pyhd8ed1ab_0.tar.bz2#71f1ab2de48613876becddd496371c85 https://conda.anaconda.org/conda-forge/noarch/partd-1.3.0-pyhd8ed1ab_0.tar.bz2#af8c82d121e63082926062d61d9abb54 https://conda.anaconda.org/conda-forge/linux-64/pillow-9.2.0-py38h9eb91d8_3.tar.bz2#61dc7b3140b7b79b1985b53d52726d74 https://conda.anaconda.org/conda-forge/noarch/pip-22.3.1-pyhd8ed1ab_0.tar.bz2#da66f2851b9836d3a7c5190082a45f7d -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.4.0-py38hce0a2d1_2.tar.bz2#be61a535f279bffdf7f449a654eaa19d +https://conda.anaconda.org/conda-forge/linux-64/proj-9.1.0-h93bde94_0.tar.bz2#255c7204dda39747c3ba380d28b026d7 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-3.0.0-py38h0a891b7_2.tar.bz2#9b13816a39904084556126a6ce7fd0d0 -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py38h0a891b7_5.tar.bz2#0856c59f9ddb710c640dc0428d66b1b7 -https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.0.0-py38h0a891b7_0.tar.bz2#44421904760e9f5ae2035193e04360f0 -https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py38h0a891b7_1005.tar.bz2#e99e08812dfff30fdd17b3f8838e2759 -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py38h26c90d9_1.tar.bz2#dcc025a7bb54374979c500c2e161fac9 -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.0.6-py38h43d8883_0.tar.bz2#1107ee053d55172b26c4fc905dd0238e -https://conda.anaconda.org/conda-forge/linux-64/cryptography-38.0.3-py38h80a4ca7_0.tar.bz2#9822ec88bb44cddbe3fdeebc41135808 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2022.11.1-pyhd8ed1ab_0.conda#383ee12e7c9c27adab310a884bc359ab -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.38.0-py38h0a891b7_1.tar.bz2#62c89ddefed9c5835e228a32b357a28d -https://conda.anaconda.org/conda-forge/linux-64/jasper-2.0.33-ha77e612_0.tar.bz2#054883e8ea7142e89bcbec08b5d401ea -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 -https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py38h26c90d9_1008.tar.bz2#6bc8cd29312f4fc77156b78124e165cd https://conda.anaconda.org/conda-forge/linux-64/scipy-1.9.3-py38h8ce737c_2.tar.bz2#dfd81898f0c6e9ee0c22305da6aa443e https://conda.anaconda.org/conda-forge/linux-64/shapely-1.8.5-py38hafd38ec_2.tar.bz2#8df75c6a8c1deac4e99583ec624ff327 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 +https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py38h0a891b7_1005.tar.bz2#e99e08812dfff30fdd17b3f8838e2759 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.1.1-py38h26c90d9_2.tar.bz2#0ea017e84efe45badce6c32f274dbf8e -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.27.0-h164a9dd_0.tar.bz2#517bb7ad16aed252c06e3436bab00c9e +https://conda.anaconda.org/conda-forge/linux-64/cryptography-38.0.4-py38h80a4ca7_0.conda#d3c4698fd7475640f4d9eff8d792deac +https://conda.anaconda.org/conda-forge/noarch/dask-core-2022.12.0-pyhd8ed1ab_0.conda#3a0f020d07998e1ae711df071f97fc19 +https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-h9c3ff4c_1.tar.bz2#1192066d1296de9b492175a4cf43fe8a +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.8.1-nompi_h261ec11_106.tar.bz2#9b25de670ce5753a33c18b1090d1d3bf https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.6.2-py38hb021067_0.tar.bz2#72422499195d8aded0dfd461c6e3e86f +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.4.0-py38hce0a2d1_2.tar.bz2#be61a535f279bffdf7f449a654eaa19d +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.21.0-py38hf6c3373_3.tar.bz2#1dc477fef9b0b1080af3e7c7ecb4aff7 +https://conda.anaconda.org/conda-forge/linux-64/jasper-2.0.33-ha77e612_0.tar.bz2#054883e8ea7142e89bcbec08b5d401ea https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.0-nompi_py38h2a9f00d_102.tar.bz2#533ae5db3e2367d71a7890efb0aa3cdc https://conda.anaconda.org/conda-forge/noarch/pyopenssl-22.1.0-pyhd8ed1ab_0.tar.bz2#fbfa0a180d48c800f922a10a114a8632 -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.21.0-py38hf6c3373_3.tar.bz2#1dc477fef9b0b1080af3e7c7ecb4aff7 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.27.0-h164a9dd_0.tar.bz2#517bb7ad16aed252c06e3436bab00c9e +https://conda.anaconda.org/conda-forge/noarch/iris-3.4.0-pyhd8ed1ab_0.conda#6a6c17cfff8564de41d2a952c97bc2e8 +https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.13-pyhd8ed1ab_0.conda#3078ef2359efd6ecadbc7e085c5e0592 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.4.2-py38h26c90d9_1.tar.bz2#f1a36545bf196571e21491cecd8af475 -https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.11-pyhd8ed1ab_0.tar.bz2#0738978569b10669bdef41c671252dd1 -https://conda.anaconda.org/conda-forge/noarch/iris-3.3.1-pyhd8ed1ab_0.tar.bz2#176ab70a4fdd63397fdbfdbcd082a36e https://conda.anaconda.org/conda-forge/noarch/requests-2.28.1-pyhd8ed1ab_1.tar.bz2#089382ee0e2dc2eae33a04cc3c2bddb0 From 0d48b53052389648e0b0d178c4c331c3a6e4f73e Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Wed, 14 Dec 2022 10:22:31 +0000 Subject: [PATCH 205/583] Updated environment lockfiles (#313) Co-authored-by: Lockfile bot --- requirements/ci/nox.lock/py38-linux-64.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/requirements/ci/nox.lock/py38-linux-64.lock b/requirements/ci/nox.lock/py38-linux-64.lock index f64dc5ab..77df8bd7 100644 --- a/requirements/ci/nox.lock/py38-linux-64.lock +++ b/requirements/ci/nox.lock/py38-linux-64.lock @@ -3,7 +3,7 @@ # input_hash: 5d1f8c55ed222f05f64baa37a9f6b110189c50ca5fb7ffb4607bb76ffbb75226 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2022.9.24-ha878542_0.tar.bz2#41e4e87062433e283696cf384f952ef6 +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2022.12.7-ha878542_0.conda#ff9f73d45c4a07d6f424495288a26080 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.39-hcc3a1bd_1.conda#737be0d34c22d24432049ab7a3214de4 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-12.2.0-h337968e_19.tar.bz2#164b4b1acaedc47ee7e658ae6b308ca3 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-12.2.0-h46fd767_19.tar.bz2#1030b1f38c129f2634eae026f704fe60 @@ -34,7 +34,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.4-h166bdaf_0.tar.bz2#ac2ccf7323d21f2994e4d1f5da664f37 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h166bdaf_4.tar.bz2#f3f9de449d32ca9b9c66a22863c96f41 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.3-h27087fc_1.tar.bz2#4acfc691e64342b9dae57cf2adc63238 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.0.7-h166bdaf_0.tar.bz2#d1ad1824c71e67dea42f07e06cd177dc +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.0.7-h0b41bf4_1.conda#7adaac6ff98219bcb99b45e408b80f4e https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a @@ -75,12 +75,12 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.7.2-h7f98852_0.tar 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/attrs-22.1.0-pyh71513ae_1.tar.bz2#6d3ccbc56256204925bfa8378722792f https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_8.tar.bz2#2ff08978892a3e8b954397c461f18418 -https://conda.anaconda.org/conda-forge/noarch/certifi-2022.9.24-pyhd8ed1ab_0.tar.bz2#f66309b099374af91369e67e84af397d +https://conda.anaconda.org/conda-forge/noarch/certifi-2022.12.7-pyhd8ed1ab_0.conda#fb9addc3db06e56abe03e0e9f21a63e6 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-2.1.1-pyhd8ed1ab_0.tar.bz2#c1d5b294fbf9a795dec349a6f4d8be8e https://conda.anaconda.org/conda-forge/noarch/click-8.1.3-unix_pyhd8ed1ab_2.tar.bz2#20e4087407c7cb04a40817114b333dbf https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.0-pyhd8ed1ab_0.tar.bz2#a6cf47b09786423200d7982d1faa19eb https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb -https://conda.anaconda.org/conda-forge/noarch/filelock-3.8.0-pyhd8ed1ab_0.tar.bz2#10f0218dbd493ab2e5dc6759ddea4526 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.8.2-pyhd8ed1ab_0.conda#0f09c2bc17ddd8732be8e5b99297c7ce https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.2-pyhd8ed1ab_0.tar.bz2#c2a60dd9f1210b8ee2037f7d0ec6251a https://conda.anaconda.org/conda-forge/noarch/fsspec-2022.11.0-pyhd8ed1ab_0.tar.bz2#eb919f2119a6db5d0192f9e9c3711572 https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed @@ -93,6 +93,7 @@ https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 https://conda.anaconda.org/conda-forge/noarch/nose-1.3.7-py_1006.tar.bz2#382019d5f8e9362ef6f60a8d4e7bce8f https://conda.anaconda.org/conda-forge/linux-64/numpy-1.23.5-py38h7042d01_0.conda#d5a3620cd8c1af4115120f21d678507a https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-h7d73246_1.tar.bz2#a11b4df9271a8d7917686725aa04c8f2 +https://conda.anaconda.org/conda-forge/noarch/packaging-22.0-pyhd8ed1ab_0.conda#0e8e1bd93998978fc3125522266d12db https://conda.anaconda.org/conda-forge/noarch/pep8-1.7.1-py_0.tar.bz2#d0b5bc3aebbffcb175bf8a1d419acb79 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.0.9-pyhd8ed1ab_0.tar.bz2#e8fbc1b54b25f4b08281467bc13b70cc @@ -116,7 +117,6 @@ https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.12.2-nompi_h4df4325_100.t https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py38h26c90d9_1008.tar.bz2#6bc8cd29312f4fc77156b78124e165cd https://conda.anaconda.org/conda-forge/noarch/mock-4.0.3-pyhd8ed1ab_4.tar.bz2#a49a3174d0d7392c115a6608548a907c -https://conda.anaconda.org/conda-forge/noarch/packaging-21.3-pyhd8ed1ab_0.tar.bz2#71f1ab2de48613876becddd496371c85 https://conda.anaconda.org/conda-forge/noarch/partd-1.3.0-pyhd8ed1ab_0.tar.bz2#af8c82d121e63082926062d61d9abb54 https://conda.anaconda.org/conda-forge/linux-64/pillow-9.2.0-py38h9eb91d8_3.tar.bz2#61dc7b3140b7b79b1985b53d52726d74 https://conda.anaconda.org/conda-forge/noarch/pip-22.3.1-pyhd8ed1ab_0.tar.bz2#da66f2851b9836d3a7c5190082a45f7d @@ -135,9 +135,9 @@ https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.6.2-py38hb0210 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.4.0-py38hce0a2d1_2.tar.bz2#be61a535f279bffdf7f449a654eaa19d https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.21.0-py38hf6c3373_3.tar.bz2#1dc477fef9b0b1080af3e7c7ecb4aff7 https://conda.anaconda.org/conda-forge/linux-64/jasper-2.0.33-ha77e612_0.tar.bz2#054883e8ea7142e89bcbec08b5d401ea -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.0-nompi_py38h2a9f00d_102.tar.bz2#533ae5db3e2367d71a7890efb0aa3cdc +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.0-nompi_py38h6b4b75c_103.conda#ea3d2204fc3a7db7d831daa437a58717 https://conda.anaconda.org/conda-forge/noarch/pyopenssl-22.1.0-pyhd8ed1ab_0.tar.bz2#fbfa0a180d48c800f922a10a114a8632 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.27.0-h164a9dd_0.tar.bz2#517bb7ad16aed252c06e3436bab00c9e +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.27.1-h7f7619e_0.conda#42dfafe8f635d19ca9aa9771ea9e1b9f https://conda.anaconda.org/conda-forge/noarch/iris-3.4.0-pyhd8ed1ab_0.conda#6a6c17cfff8564de41d2a952c97bc2e8 https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.13-pyhd8ed1ab_0.conda#3078ef2359efd6ecadbc7e085c5e0592 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.4.2-py38h26c90d9_1.tar.bz2#f1a36545bf196571e21491cecd8af475 From d89dd1facb3a25418187c42537dba63aa1322598 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 19 Dec 2022 18:51:19 +0000 Subject: [PATCH 206/583] Updated environment lockfiles (#314) Co-authored-by: Lockfile bot --- requirements/ci/nox.lock/py38-linux-64.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/requirements/ci/nox.lock/py38-linux-64.lock b/requirements/ci/nox.lock/py38-linux-64.lock index 77df8bd7..df45e005 100644 --- a/requirements/ci/nox.lock/py38-linux-64.lock +++ b/requirements/ci/nox.lock/py38-linux-64.lock @@ -65,7 +65,7 @@ https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-h6239696_4.tar.bz2#ad https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_8.tar.bz2#e5613f2bc717e9945840ff474419b8e4 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-hca18f0e_1.conda#e1232042de76d24539a436d37597eb06 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h9772cbc_5.tar.bz2#ee08782aff2ff9b3291c967fa6bc7336 -https://conda.anaconda.org/conda-forge/linux-64/krb5-1.19.3-h08a2579_0.tar.bz2#d25e05e7ee0e302b52d24491db4891eb +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.20.1-h81ceb04_0.conda#89a41adce7106749573d883b2f657d78 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-16_linux64_openblas.tar.bz2#20bae26d0a1db73f758fc3754cab4719 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-16_linux64_openblas.tar.bz2#955d993f41f9354bf753d29864ea20ad https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.4.0-h55922b4_4.tar.bz2#901791f0ec7cddc8714e76e273013a91 @@ -86,7 +86,7 @@ https://conda.anaconda.org/conda-forge/noarch/fsspec-2022.11.0-pyhd8ed1ab_0.tar. https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.4-py38h43d8883_1.tar.bz2#41ca56d5cac7bfc7eb4fcdbee878eb84 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.14-h6ed2654_0.tar.bz2#dcc588839de1445d90995a0a2c4f3a39 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-7.86.0-h2283fc2_1.tar.bz2#fdca8cd67ec2676f90a70ac73a32538b +https://conda.anaconda.org/conda-forge/linux-64/libcurl-7.86.0-hdc1c0ab_2.conda#c4c21da8fc657a6c5e426b8cbad36cc2 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.1-py38h0a891b7_2.tar.bz2#c342a370480791db83d5dd20f2d8899f https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 @@ -108,10 +108,10 @@ https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.0.0-py38h0a891b7 https://conda.anaconda.org/conda-forge/noarch/wheel-0.38.4-pyhd8ed1ab_0.tar.bz2#c829cfb8cb826acb9de0ac1a2df0a940 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h7f98852_1.tar.bz2#536cc5db4d0a3ba0630541aec064b5e4 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a -https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py38h4a40e3a_2.tar.bz2#2276b1f4d1ede3f5f14cc7e4ae6f9a33 +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py38h4a40e3a_3.conda#3ac112151c6b6cfe457e976de41af0c5 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py38h26c90d9_1.tar.bz2#dcc025a7bb54374979c500c2e161fac9 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.0.6-py38h43d8883_0.tar.bz2#1107ee053d55172b26c4fc905dd0238e -https://conda.anaconda.org/conda-forge/linux-64/curl-7.86.0-h2283fc2_1.tar.bz2#9d4149760567cb232691cce2d8ccc21f +https://conda.anaconda.org/conda-forge/linux-64/curl-7.86.0-hdc1c0ab_2.conda#3c96ba0c180e389621c4fd62d06c151b https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.38.0-py38h0a891b7_1.tar.bz2#62c89ddefed9c5835e228a32b357a28d https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.12.2-nompi_h4df4325_100.tar.bz2#91f6a330e4aeba166e5d7f0ee0af3d37 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 @@ -123,17 +123,17 @@ https://conda.anaconda.org/conda-forge/noarch/pip-22.3.1-pyhd8ed1ab_0.tar.bz2#da https://conda.anaconda.org/conda-forge/linux-64/proj-9.1.0-h93bde94_0.tar.bz2#255c7204dda39747c3ba380d28b026d7 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/scipy-1.9.3-py38h8ce737c_2.tar.bz2#dfd81898f0c6e9ee0c22305da6aa443e -https://conda.anaconda.org/conda-forge/linux-64/shapely-1.8.5-py38hafd38ec_2.tar.bz2#8df75c6a8c1deac4e99583ec624ff327 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.0-py38hd07e089_0.conda#e8243980979661d5e941fcfd954ddb13 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py38h0a891b7_1005.tar.bz2#e99e08812dfff30fdd17b3f8838e2759 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.1.1-py38h26c90d9_2.tar.bz2#0ea017e84efe45badce6c32f274dbf8e https://conda.anaconda.org/conda-forge/linux-64/cryptography-38.0.4-py38h80a4ca7_0.conda#d3c4698fd7475640f4d9eff8d792deac -https://conda.anaconda.org/conda-forge/noarch/dask-core-2022.12.0-pyhd8ed1ab_0.conda#3a0f020d07998e1ae711df071f97fc19 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2022.12.1-pyhd8ed1ab_0.conda#f12878f9839c72f3d51af02fb10da43d https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-h9c3ff4c_1.tar.bz2#1192066d1296de9b492175a4cf43fe8a https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.8.1-nompi_h261ec11_106.tar.bz2#9b25de670ce5753a33c18b1090d1d3bf https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.6.2-py38hb021067_0.tar.bz2#72422499195d8aded0dfd461c6e3e86f -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.4.0-py38hce0a2d1_2.tar.bz2#be61a535f279bffdf7f449a654eaa19d -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.21.0-py38hf6c3373_3.tar.bz2#1dc477fef9b0b1080af3e7c7ecb4aff7 +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.4.1-py38hf928c62_0.conda#bb6d6874f1dcafdd2dce7dfd54d2b96c +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.21.1-py38h3d2c718_0.conda#55ba6e3a49c4293302262286a49607d8 https://conda.anaconda.org/conda-forge/linux-64/jasper-2.0.33-ha77e612_0.tar.bz2#054883e8ea7142e89bcbec08b5d401ea https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.0-nompi_py38h6b4b75c_103.conda#ea3d2204fc3a7db7d831daa437a58717 https://conda.anaconda.org/conda-forge/noarch/pyopenssl-22.1.0-pyhd8ed1ab_0.tar.bz2#fbfa0a180d48c800f922a10a114a8632 From 2ba611c6b7f61e1c792adfe1b28ad94897fc8c9d Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Tue, 3 Jan 2023 16:13:40 +0000 Subject: [PATCH 207/583] Updated environment lockfiles (#315) Co-authored-by: Lockfile bot --- requirements/ci/nox.lock/py38-linux-64.lock | 26 ++++++++++----------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/requirements/ci/nox.lock/py38-linux-64.lock b/requirements/ci/nox.lock/py38-linux-64.lock index df45e005..14585277 100644 --- a/requirements/ci/nox.lock/py38-linux-64.lock +++ b/requirements/ci/nox.lock/py38-linux-64.lock @@ -68,31 +68,32 @@ https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h9772cbc_5.tar.bz2#e https://conda.anaconda.org/conda-forge/linux-64/krb5-1.20.1-h81ceb04_0.conda#89a41adce7106749573d883b2f657d78 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-16_linux64_openblas.tar.bz2#20bae26d0a1db73f758fc3754cab4719 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-16_linux64_openblas.tar.bz2#955d993f41f9354bf753d29864ea20ad -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.4.0-h55922b4_4.tar.bz2#901791f0ec7cddc8714e76e273013a91 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.5.0-h82bc61c_0.conda#a01611c54334d783847879ee40109657 https://conda.anaconda.org/conda-forge/linux-64/python-3.8.15-h4a9ceb5_0_cpython.conda#dc29a8a79d0f2c80004cc06d3190104f https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.40.0-h4ff8645_0.tar.bz2#bb11803129cbbb53ed56f9506ff74145 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/antlr-python-runtime-4.7.2-py38h578d9bd_1003.tar.bz2#db8b471d9a764f561a129f94ea215c0a -https://conda.anaconda.org/conda-forge/noarch/attrs-22.1.0-pyh71513ae_1.tar.bz2#6d3ccbc56256204925bfa8378722792f +https://conda.anaconda.org/conda-forge/noarch/attrs-22.2.0-pyh71513ae_0.conda#8b76db7818a4e401ed4486c4c1635cd9 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_8.tar.bz2#2ff08978892a3e8b954397c461f18418 https://conda.anaconda.org/conda-forge/noarch/certifi-2022.12.7-pyhd8ed1ab_0.conda#fb9addc3db06e56abe03e0e9f21a63e6 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-2.1.1-pyhd8ed1ab_0.tar.bz2#c1d5b294fbf9a795dec349a6f4d8be8e https://conda.anaconda.org/conda-forge/noarch/click-8.1.3-unix_pyhd8ed1ab_2.tar.bz2#20e4087407c7cb04a40817114b333dbf https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.0-pyhd8ed1ab_0.tar.bz2#a6cf47b09786423200d7982d1faa19eb https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb -https://conda.anaconda.org/conda-forge/noarch/filelock-3.8.2-pyhd8ed1ab_0.conda#0f09c2bc17ddd8732be8e5b99297c7ce +https://conda.anaconda.org/conda-forge/noarch/filelock-3.9.0-pyhd8ed1ab_0.conda#1addc115923d646ca19ed90edc413506 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.2-pyhd8ed1ab_0.tar.bz2#c2a60dd9f1210b8ee2037f7d0ec6251a https://conda.anaconda.org/conda-forge/noarch/fsspec-2022.11.0-pyhd8ed1ab_0.tar.bz2#eb919f2119a6db5d0192f9e9c3711572 https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.4-py38h43d8883_1.tar.bz2#41ca56d5cac7bfc7eb4fcdbee878eb84 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.14-h6ed2654_0.tar.bz2#dcc588839de1445d90995a0a2c4f3a39 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-7.86.0-hdc1c0ab_2.conda#c4c21da8fc657a6c5e426b8cbad36cc2 +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.14-hfd0df8a_1.conda#c2566c2ea5f153ddd6bf4acaf7547d97 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-7.87.0-hdc1c0ab_0.conda#bc302fa1cf8eda15c60f669b7524a320 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.1-py38h0a891b7_2.tar.bz2#c342a370480791db83d5dd20f2d8899f +https://conda.anaconda.org/conda-forge/noarch/mock-5.0.0-pyhd8ed1ab_0.conda#d9d75bfae9eab6df13d8cbe650b9762d 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 -https://conda.anaconda.org/conda-forge/linux-64/numpy-1.23.5-py38h7042d01_0.conda#d5a3620cd8c1af4115120f21d678507a -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-h7d73246_1.tar.bz2#a11b4df9271a8d7917686725aa04c8f2 +https://conda.anaconda.org/conda-forge/linux-64/numpy-1.24.1-py38hab0fcb9_0.conda#2c0b3c72dad0288d9582ccbceb250cb4 +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-hfec8fc6_2.conda#5ce6a42505c6e9e6151c54c3ec8d68ea https://conda.anaconda.org/conda-forge/noarch/packaging-22.0-pyhd8ed1ab_0.conda#0e8e1bd93998978fc3125522266d12db https://conda.anaconda.org/conda-forge/noarch/pep8-1.7.1-py_0.tar.bz2#d0b5bc3aebbffcb175bf8a1d419acb79 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff @@ -101,7 +102,7 @@ https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#9 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.0.0-py38h0a891b7_2.tar.bz2#9b13816a39904084556126a6ce7fd0d0 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py38h0a891b7_5.tar.bz2#0856c59f9ddb710c640dc0428d66b1b7 -https://conda.anaconda.org/conda-forge/noarch/setuptools-65.5.1-pyhd8ed1ab_0.tar.bz2#cfb8dc4d9d285ca5fb1177b9dd450e33 +https://conda.anaconda.org/conda-forge/noarch/setuptools-65.6.3-pyhd8ed1ab_0.conda#9600fc9524d3f821e6a6d58c52f5bf5a https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.0.0-py38h0a891b7_0.tar.bz2#44421904760e9f5ae2035193e04360f0 @@ -111,16 +112,15 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_10 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py38h4a40e3a_3.conda#3ac112151c6b6cfe457e976de41af0c5 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py38h26c90d9_1.tar.bz2#dcc025a7bb54374979c500c2e161fac9 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.0.6-py38h43d8883_0.tar.bz2#1107ee053d55172b26c4fc905dd0238e -https://conda.anaconda.org/conda-forge/linux-64/curl-7.86.0-hdc1c0ab_2.conda#3c96ba0c180e389621c4fd62d06c151b +https://conda.anaconda.org/conda-forge/linux-64/curl-7.87.0-hdc1c0ab_0.conda#b14123ca479b9473d7f7395b0fd25c97 https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.38.0-py38h0a891b7_1.tar.bz2#62c89ddefed9c5835e228a32b357a28d -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.12.2-nompi_h4df4325_100.tar.bz2#91f6a330e4aeba166e5d7f0ee0af3d37 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.12.2-nompi_h4df4325_101.conda#162a25904af6586b234b2dd52ee99c61 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py38h26c90d9_1008.tar.bz2#6bc8cd29312f4fc77156b78124e165cd -https://conda.anaconda.org/conda-forge/noarch/mock-4.0.3-pyhd8ed1ab_4.tar.bz2#a49a3174d0d7392c115a6608548a907c https://conda.anaconda.org/conda-forge/noarch/partd-1.3.0-pyhd8ed1ab_0.tar.bz2#af8c82d121e63082926062d61d9abb54 -https://conda.anaconda.org/conda-forge/linux-64/pillow-9.2.0-py38h9eb91d8_3.tar.bz2#61dc7b3140b7b79b1985b53d52726d74 +https://conda.anaconda.org/conda-forge/linux-64/pillow-9.2.0-py38hde6dc18_4.conda#4fdd0141a90ae358d12ef90a4dc244ed https://conda.anaconda.org/conda-forge/noarch/pip-22.3.1-pyhd8ed1ab_0.tar.bz2#da66f2851b9836d3a7c5190082a45f7d -https://conda.anaconda.org/conda-forge/linux-64/proj-9.1.0-h93bde94_0.tar.bz2#255c7204dda39747c3ba380d28b026d7 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.1.0-h8ffa02c_1.conda#ed901e1f5c504b144b31f015c6702634 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/scipy-1.9.3-py38h8ce737c_2.tar.bz2#dfd81898f0c6e9ee0c22305da6aa443e https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.0-py38hd07e089_0.conda#e8243980979661d5e941fcfd954ddb13 From 553e4e3e425c78dfedbf8f690aa19348ed5bfa63 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Tue, 10 Jan 2023 10:57:58 +0000 Subject: [PATCH 208/583] Updated environment lockfiles (#317) Co-authored-by: Lockfile bot --- requirements/ci/nox.lock/py38-linux-64.lock | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/requirements/ci/nox.lock/py38-linux-64.lock b/requirements/ci/nox.lock/py38-linux-64.lock index 14585277..c9d307c4 100644 --- a/requirements/ci/nox.lock/py38-linux-64.lock +++ b/requirements/ci/nox.lock/py38-linux-64.lock @@ -27,6 +27,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h516909a_1.tar.bz2#6f https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-he1b5a44_1001.tar.bz2#8208602aec4826053c116552369a394c https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-h166bdaf_0.tar.bz2#b62b52da46c39ee2bc3c162ac7f1804d +https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-2.1.4-h166bdaf_0.tar.bz2#b4f717df2d377410b462328bf0e8fb7d https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.0-h7f98852_0.tar.bz2#39b1328babf85c7c3a61636d9cd50206 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.21-pthreads_h78a6416_3.tar.bz2#8c5963a49b6035c40646a763293fbb35 @@ -42,14 +43,14 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.9-h7f98852_0.tar https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2#be93aabceefa2fac576e971aef407908 https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h7f98852_1002.tar.bz2#1e15f6ad85a7d743a2ac68dae6c82b98 https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007.tar.bz2#b4a4381d54784606820704f7b5f05a15 -https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.0-h7f98852_3.tar.bz2#52402c791f35e414e704b7a113f99605 +https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.1-h0b41bf4_0.conda#e9c3bcf0e0c719431abec8ca447eee27 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-16_linux64_openblas.tar.bz2#d9b7a8639171f6c6fa0a983edabcfe2b https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.0.9-h166bdaf_8.tar.bz2#4ae4d7795d33e02bd20f6b23d91caf82 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.0.9-h166bdaf_8.tar.bz2#04bac51ba35ea023dc48af73c1c88c25 https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.47.0-hff17c54_1.tar.bz2#2b7dbfa6988a41f9d23ba6d4f0e1d74e +https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.51.0-hff17c54_0.conda#dd682f0b6d65e75b2bc868fc8e93d87e https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.39-h753d276_0.conda#e1c890aebdebbfbf87e2c917187b4416 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.40.0-h753d276_0.tar.bz2#2e5f9a37d487e1019fd4d8113adb2f9f https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.10.0-hf14f497_3.tar.bz2#d85acad4b47dff4e3def14a769a97906 @@ -73,6 +74,7 @@ https://conda.anaconda.org/conda-forge/linux-64/python-3.8.15-h4a9ceb5_0_cpython https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.40.0-h4ff8645_0.tar.bz2#bb11803129cbbb53ed56f9506ff74145 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/antlr-python-runtime-4.7.2-py38h578d9bd_1003.tar.bz2#db8b471d9a764f561a129f94ea215c0a +https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyh9f0ad1d_0.tar.bz2#5f095bc6454094e96f146491fd03633b https://conda.anaconda.org/conda-forge/noarch/attrs-22.2.0-pyh71513ae_0.conda#8b76db7818a4e401ed4486c4c1635cd9 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_8.tar.bz2#2ff08978892a3e8b954397c461f18418 https://conda.anaconda.org/conda-forge/noarch/certifi-2022.12.7-pyhd8ed1ab_0.conda#fb9addc3db06e56abe03e0e9f21a63e6 @@ -100,7 +102,7 @@ https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.0.9-pyhd8ed1ab_0.tar.bz2#e8fbc1b54b25f4b08281467bc13b70cc https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 -https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.0.0-py38h0a891b7_2.tar.bz2#9b13816a39904084556126a6ce7fd0d0 +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.2.0-py38h1de0b5d_0.conda#7db73572d4f7e10a759bad609a228ad0 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py38h0a891b7_5.tar.bz2#0856c59f9ddb710c640dc0428d66b1b7 https://conda.anaconda.org/conda-forge/noarch/setuptools-65.6.3-pyhd8ed1ab_0.conda#9600fc9524d3f821e6a6d58c52f5bf5a https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 @@ -118,27 +120,28 @@ https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.12.2-nompi_h4df4325_101.c https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py38h26c90d9_1008.tar.bz2#6bc8cd29312f4fc77156b78124e165cd https://conda.anaconda.org/conda-forge/noarch/partd-1.3.0-pyhd8ed1ab_0.tar.bz2#af8c82d121e63082926062d61d9abb54 -https://conda.anaconda.org/conda-forge/linux-64/pillow-9.2.0-py38hde6dc18_4.conda#4fdd0141a90ae358d12ef90a4dc244ed +https://conda.anaconda.org/conda-forge/linux-64/pillow-9.4.0-py38hb32c036_0.conda#a288a6e69efc2f20c30ebfa590e11bed https://conda.anaconda.org/conda-forge/noarch/pip-22.3.1-pyhd8ed1ab_0.tar.bz2#da66f2851b9836d3a7c5190082a45f7d https://conda.anaconda.org/conda-forge/linux-64/proj-9.1.0-h8ffa02c_1.conda#ed901e1f5c504b144b31f015c6702634 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/scipy-1.9.3-py38h8ce737c_2.tar.bz2#dfd81898f0c6e9ee0c22305da6aa443e https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.0-py38hd07e089_0.conda#e8243980979661d5e941fcfd954ddb13 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py38h0a891b7_1005.tar.bz2#e99e08812dfff30fdd17b3f8838e2759 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.1.1-py38h26c90d9_2.tar.bz2#0ea017e84efe45badce6c32f274dbf8e -https://conda.anaconda.org/conda-forge/linux-64/cryptography-38.0.4-py38h80a4ca7_0.conda#d3c4698fd7475640f4d9eff8d792deac +https://conda.anaconda.org/conda-forge/linux-64/cryptography-39.0.0-py38h3d167d9_0.conda#0ef859aa9dafce54bdf3d56715daed35 https://conda.anaconda.org/conda-forge/noarch/dask-core-2022.12.1-pyhd8ed1ab_0.conda#f12878f9839c72f3d51af02fb10da43d https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-h9c3ff4c_1.tar.bz2#1192066d1296de9b492175a4cf43fe8a https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.8.1-nompi_h261ec11_106.tar.bz2#9b25de670ce5753a33c18b1090d1d3bf https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.6.2-py38hb021067_0.tar.bz2#72422499195d8aded0dfd461c6e3e86f https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.4.1-py38hf928c62_0.conda#bb6d6874f1dcafdd2dce7dfd54d2b96c -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.21.1-py38h3d2c718_0.conda#55ba6e3a49c4293302262286a49607d8 https://conda.anaconda.org/conda-forge/linux-64/jasper-2.0.33-ha77e612_0.tar.bz2#054883e8ea7142e89bcbec08b5d401ea https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.0-nompi_py38h6b4b75c_103.conda#ea3d2204fc3a7db7d831daa437a58717 -https://conda.anaconda.org/conda-forge/noarch/pyopenssl-22.1.0-pyhd8ed1ab_0.tar.bz2#fbfa0a180d48c800f922a10a114a8632 +https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.0.0-pyhd8ed1ab_0.conda#d41957700e83bbb925928764cb7f8878 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.27.1-h7f7619e_0.conda#42dfafe8f635d19ca9aa9771ea9e1b9f -https://conda.anaconda.org/conda-forge/noarch/iris-3.4.0-pyhd8ed1ab_0.conda#6a6c17cfff8564de41d2a952c97bc2e8 https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.13-pyhd8ed1ab_0.conda#3078ef2359efd6ecadbc7e085c5e0592 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.4.2-py38h26c90d9_1.tar.bz2#f1a36545bf196571e21491cecd8af475 https://conda.anaconda.org/conda-forge/noarch/requests-2.28.1-pyhd8ed1ab_1.tar.bz2#089382ee0e2dc2eae33a04cc3c2bddb0 +https://conda.anaconda.org/conda-forge/noarch/pooch-1.6.0-pyhd8ed1ab_0.tar.bz2#6429e1d1091c51f626b5dcfdd38bf429 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.10.0-py38h10c12cc_0.conda#466ea530d622838f6cdec4f771ddc249 +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.21.1-py38h3d2c718_0.conda#55ba6e3a49c4293302262286a49607d8 +https://conda.anaconda.org/conda-forge/noarch/iris-3.4.0-pyhd8ed1ab_0.conda#6a6c17cfff8564de41d2a952c97bc2e8 From d4f6cbfebc387151665a90015167b7f3474e04ff Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 20 Feb 2023 12:06:53 +0000 Subject: [PATCH 209/583] Updated environment lockfiles (#319) Co-authored-by: Lockfile bot --- requirements/ci/nox.lock/py38-linux-64.lock | 68 +++++++++++---------- 1 file changed, 35 insertions(+), 33 deletions(-) diff --git a/requirements/ci/nox.lock/py38-linux-64.lock b/requirements/ci/nox.lock/py38-linux-64.lock index c9d307c4..e370571d 100644 --- a/requirements/ci/nox.lock/py38-linux-64.lock +++ b/requirements/ci/nox.lock/py38-linux-64.lock @@ -4,7 +4,7 @@ @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2022.12.7-ha878542_0.conda#ff9f73d45c4a07d6f424495288a26080 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.39-hcc3a1bd_1.conda#737be0d34c22d24432049ab7a3214de4 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-12.2.0-h337968e_19.tar.bz2#164b4b1acaedc47ee7e658ae6b308ca3 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-12.2.0-h46fd767_19.tar.bz2#1030b1f38c129f2634eae026f704fe60 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.8-3_cp38.conda#2f3f7af062b42d664117662612022204 @@ -17,17 +17,16 @@ https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.18.1-h7f98852_0.tar.bz2 https://conda.anaconda.org/conda-forge/linux-64/expat-2.5.0-h27087fc_0.tar.bz2#c4fbad8d4bddeb3c085f18cbf97fbfad https://conda.anaconda.org/conda-forge/linux-64/geos-3.11.1-h27087fc_0.tar.bz2#917b9a50001fffdd89b321b5dba31e55 https://conda.anaconda.org/conda-forge/linux-64/icu-70.1-h27087fc_0.tar.bz2#87473a15119779e021c314249d4b4aed -https://conda.anaconda.org/conda-forge/linux-64/jpeg-9e-h166bdaf_2.tar.bz2#ee8b844357a0946870901c7c6f418268 +https://conda.anaconda.org/conda-forge/linux-64/jpeg-9e-h0b41bf4_3.conda#c7a069243e1fbe9a556ed2ec030e6407 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f -https://conda.anaconda.org/conda-forge/linux-64/libaec-1.0.6-h9c3ff4c_0.tar.bz2#c77f5e4e418fa47d699d6afa54c5d444 +https://conda.anaconda.org/conda-forge/linux-64/libaec-1.0.6-hcb278e6_1.conda#0f683578378cddb223e7fd24f785ab2a https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.0.9-h166bdaf_8.tar.bz2#9194c9bf9428035a05352d031462eae4 -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.14-h166bdaf_0.tar.bz2#fc84a0446e4e4fb882e78d786cfb9734 +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.17-h0b41bf4_0.conda#5cc781fd91968b11a8a7fdbee0982676 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h516909a_1.tar.bz2#6f8720dff19e17ce5d48cfe7f3d2f0a3 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-he1b5a44_1001.tar.bz2#8208602aec4826053c116552369a394c https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-h166bdaf_0.tar.bz2#b62b52da46c39ee2bc3c162ac7f1804d -https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-2.1.4-h166bdaf_0.tar.bz2#b4f717df2d377410b462328bf0e8fb7d https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.0-h7f98852_0.tar.bz2#39b1328babf85c7c3a61636d9cd50206 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.21-pthreads_h78a6416_3.tar.bz2#8c5963a49b6035c40646a763293fbb35 @@ -35,7 +34,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.4-h166bdaf_0.tar.bz2#ac2ccf7323d21f2994e4d1f5da664f37 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h166bdaf_4.tar.bz2#f3f9de449d32ca9b9c66a22863c96f41 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.3-h27087fc_1.tar.bz2#4acfc691e64342b9dae57cf2adc63238 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.0.7-h0b41bf4_1.conda#7adaac6ff98219bcb99b45e408b80f4e +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.0.8-h0b41bf4_0.conda#e043403cd18faf815bf7705ab6c1e092 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a @@ -62,15 +61,15 @@ https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-hc3e0081_0.tar.bz2#d4c341e0379c31e9e781d4f204726867 https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-h166bdaf_4.tar.bz2#4b11e365c0275b808be78b30f904e295 -https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-h6239696_4.tar.bz2#adcf0be7897e73e312bd24353b613f74 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-h3eb15da_6.conda#6b63daed8feeca47be78f323e793d555 https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_8.tar.bz2#e5613f2bc717e9945840ff474419b8e4 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-hca18f0e_1.conda#e1232042de76d24539a436d37597eb06 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h9772cbc_5.tar.bz2#ee08782aff2ff9b3291c967fa6bc7336 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.20.1-h81ceb04_0.conda#89a41adce7106749573d883b2f657d78 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-16_linux64_openblas.tar.bz2#20bae26d0a1db73f758fc3754cab4719 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-16_linux64_openblas.tar.bz2#955d993f41f9354bf753d29864ea20ad -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.5.0-h82bc61c_0.conda#a01611c54334d783847879ee40109657 -https://conda.anaconda.org/conda-forge/linux-64/python-3.8.15-h4a9ceb5_0_cpython.conda#dc29a8a79d0f2c80004cc06d3190104f +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.5.0-h6adf6a1_2.conda#2e648a34072eb39d7c4fc2a9981c5f0c +https://conda.anaconda.org/conda-forge/linux-64/python-3.8.16-he550d4f_1_cpython.conda#9de84cccfbc5f8350a3667bb6ef6fc30 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.40.0-h4ff8645_0.tar.bz2#bb11803129cbbb53ed56f9506ff74145 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/antlr-python-runtime-4.7.2-py38h578d9bd_1003.tar.bz2#db8b471d9a764f561a129f94ea215c0a @@ -80,23 +79,23 @@ https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_8.tar.bz2# https://conda.anaconda.org/conda-forge/noarch/certifi-2022.12.7-pyhd8ed1ab_0.conda#fb9addc3db06e56abe03e0e9f21a63e6 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-2.1.1-pyhd8ed1ab_0.tar.bz2#c1d5b294fbf9a795dec349a6f4d8be8e https://conda.anaconda.org/conda-forge/noarch/click-8.1.3-unix_pyhd8ed1ab_2.tar.bz2#20e4087407c7cb04a40817114b333dbf -https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.0-pyhd8ed1ab_0.tar.bz2#a6cf47b09786423200d7982d1faa19eb +https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.1-pyhd8ed1ab_0.conda#b325bfc4cff7d7f8a868f1f7ecc4ed16 https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb https://conda.anaconda.org/conda-forge/noarch/filelock-3.9.0-pyhd8ed1ab_0.conda#1addc115923d646ca19ed90edc413506 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.2-pyhd8ed1ab_0.tar.bz2#c2a60dd9f1210b8ee2037f7d0ec6251a -https://conda.anaconda.org/conda-forge/noarch/fsspec-2022.11.0-pyhd8ed1ab_0.tar.bz2#eb919f2119a6db5d0192f9e9c3711572 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.1.0-pyhd8ed1ab_0.conda#44f6828b8f7cc3433d68d1d1c0e9add2 https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.4-py38h43d8883_1.tar.bz2#41ca56d5cac7bfc7eb4fcdbee878eb84 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.14-hfd0df8a_1.conda#c2566c2ea5f153ddd6bf4acaf7547d97 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-7.87.0-hdc1c0ab_0.conda#bc302fa1cf8eda15c60f669b7524a320 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-7.88.0-hdc1c0ab_0.conda#c44acb3847ff118c068b662aff858afd https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.1-py38h0a891b7_2.tar.bz2#c342a370480791db83d5dd20f2d8899f -https://conda.anaconda.org/conda-forge/noarch/mock-5.0.0-pyhd8ed1ab_0.conda#d9d75bfae9eab6df13d8cbe650b9762d +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.2-py38h1de0b5d_0.conda#6d97b5d6f06933ab653f1862ddf6e33e +https://conda.anaconda.org/conda-forge/noarch/mock-5.0.1-pyhd8ed1ab_0.conda#2938496cc6ab759a14be351c5a4cc76d 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 -https://conda.anaconda.org/conda-forge/linux-64/numpy-1.24.1-py38hab0fcb9_0.conda#2c0b3c72dad0288d9582ccbceb250cb4 +https://conda.anaconda.org/conda-forge/linux-64/numpy-1.24.2-py38h10c12cc_0.conda#05592c85b9f6931dc2df1e80c0d56294 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-hfec8fc6_2.conda#5ce6a42505c6e9e6151c54c3ec8d68ea -https://conda.anaconda.org/conda-forge/noarch/packaging-22.0-pyhd8ed1ab_0.conda#0e8e1bd93998978fc3125522266d12db +https://conda.anaconda.org/conda-forge/noarch/packaging-23.0-pyhd8ed1ab_0.conda#1ff2e3ca41f0ce16afec7190db28288b https://conda.anaconda.org/conda-forge/noarch/pep8-1.7.1-py_0.tar.bz2#d0b5bc3aebbffcb175bf8a1d419acb79 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.0.9-pyhd8ed1ab_0.tar.bz2#e8fbc1b54b25f4b08281467bc13b70cc @@ -104,44 +103,47 @@ https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#9 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.2.0-py38h1de0b5d_0.conda#7db73572d4f7e10a759bad609a228ad0 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py38h0a891b7_5.tar.bz2#0856c59f9ddb710c640dc0428d66b1b7 -https://conda.anaconda.org/conda-forge/noarch/setuptools-65.6.3-pyhd8ed1ab_0.conda#9600fc9524d3f821e6a6d58c52f5bf5a +https://conda.anaconda.org/conda-forge/noarch/setuptools-67.3.2-pyhd8ed1ab_0.conda#543af74c4042aee5702a033e03a216d0 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.0.0-py38h0a891b7_0.tar.bz2#44421904760e9f5ae2035193e04360f0 https://conda.anaconda.org/conda-forge/noarch/wheel-0.38.4-pyhd8ed1ab_0.tar.bz2#c829cfb8cb826acb9de0ac1a2df0a940 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h7f98852_1.tar.bz2#536cc5db4d0a3ba0630541aec064b5e4 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a +https://conda.anaconda.org/conda-forge/noarch/zipp-3.13.0-pyhd8ed1ab_0.conda#41b09d997939e83b231c4557a90c3b13 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py38h4a40e3a_3.conda#3ac112151c6b6cfe457e976de41af0c5 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py38h26c90d9_1.tar.bz2#dcc025a7bb54374979c500c2e161fac9 -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.0.6-py38h43d8883_0.tar.bz2#1107ee053d55172b26c4fc905dd0238e -https://conda.anaconda.org/conda-forge/linux-64/curl-7.87.0-hdc1c0ab_0.conda#b14123ca479b9473d7f7395b0fd25c97 +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.0.7-py38hfbd4bf9_0.conda#638537863b298151635c05c762a997ab +https://conda.anaconda.org/conda-forge/linux-64/curl-7.88.0-hdc1c0ab_0.conda#5d9ac94ee84305ada32c3d287d0ec602 https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.38.0-py38h0a891b7_1.tar.bz2#62c89ddefed9c5835e228a32b357a28d https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.12.2-nompi_h4df4325_101.conda#162a25904af6586b234b2dd52ee99c61 +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-5.10.2-pyhd8ed1ab_0.conda#de76905f801c22fc43e624058574eab3 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py38h26c90d9_1008.tar.bz2#6bc8cd29312f4fc77156b78124e165cd https://conda.anaconda.org/conda-forge/noarch/partd-1.3.0-pyhd8ed1ab_0.tar.bz2#af8c82d121e63082926062d61d9abb54 -https://conda.anaconda.org/conda-forge/linux-64/pillow-9.4.0-py38hb32c036_0.conda#a288a6e69efc2f20c30ebfa590e11bed -https://conda.anaconda.org/conda-forge/noarch/pip-22.3.1-pyhd8ed1ab_0.tar.bz2#da66f2851b9836d3a7c5190082a45f7d -https://conda.anaconda.org/conda-forge/linux-64/proj-9.1.0-h8ffa02c_1.conda#ed901e1f5c504b144b31f015c6702634 +https://conda.anaconda.org/conda-forge/linux-64/pillow-9.4.0-py38hde6dc18_1.conda#3de5619d3f556f966189e5251a266125 +https://conda.anaconda.org/conda-forge/noarch/pip-23.0.1-pyhd8ed1ab_0.conda#8025ca83b8ba5430b640b83917c2a6f7 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.1.1-h8ffa02c_2.conda#c264aea0e16bba26afa0a0940e954492 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/shapely-2.0.0-py38hd07e089_0.conda#e8243980979661d5e941fcfd954ddb13 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.1-py38hd07e089_0.conda#84c9262ab4057ed9f80888fcfc4bf60a https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py38h0a891b7_1005.tar.bz2#e99e08812dfff30fdd17b3f8838e2759 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.1.1-py38h26c90d9_2.tar.bz2#0ea017e84efe45badce6c32f274dbf8e -https://conda.anaconda.org/conda-forge/linux-64/cryptography-39.0.0-py38h3d167d9_0.conda#0ef859aa9dafce54bdf3d56715daed35 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2022.12.1-pyhd8ed1ab_0.conda#f12878f9839c72f3d51af02fb10da43d +https://conda.anaconda.org/conda-forge/linux-64/cryptography-39.0.1-py38h3d167d9_0.conda#375c00c98c36b0e79aaaf2149e51f27d +https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.2.0-pyhd8ed1ab_0.conda#156fb994a4e07091c4fad2c148589eb2 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-h9c3ff4c_1.tar.bz2#1192066d1296de9b492175a4cf43fe8a +https://conda.anaconda.org/conda-forge/noarch/importlib-resources-5.10.2-pyhd8ed1ab_0.conda#ebf8b116aac3fe86270bfe5f61fe2b80 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.8.1-nompi_h261ec11_106.tar.bz2#9b25de670ce5753a33c18b1090d1d3bf -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.6.2-py38hb021067_0.tar.bz2#72422499195d8aded0dfd461c6e3e86f -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.4.1-py38hf928c62_0.conda#bb6d6874f1dcafdd2dce7dfd54d2b96c -https://conda.anaconda.org/conda-forge/linux-64/jasper-2.0.33-ha77e612_0.tar.bz2#054883e8ea7142e89bcbec08b5d401ea +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.4.1-py38h58d5fe2_1.conda#5286eaec7e93586e4ae05e7d658cd3e2 +https://conda.anaconda.org/conda-forge/linux-64/jasper-2.0.33-h0ff4b12_1.conda#753b7aa9da058b8cb4cd699b71c4bb77 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.0-py38hd6c3c57_0.conda#dd63f6486ba95c036b6bfe0b5c53d875 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.0-nompi_py38h6b4b75c_103.conda#ea3d2204fc3a7db7d831daa437a58717 https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.0.0-pyhd8ed1ab_0.conda#d41957700e83bbb925928764cb7f8878 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.27.1-h7f7619e_0.conda#42dfafe8f635d19ca9aa9771ea9e1b9f -https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.13-pyhd8ed1ab_0.conda#3078ef2359efd6ecadbc7e085c5e0592 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.4.2-py38h26c90d9_1.tar.bz2#f1a36545bf196571e21491cecd8af475 -https://conda.anaconda.org/conda-forge/noarch/requests-2.28.1-pyhd8ed1ab_1.tar.bz2#089382ee0e2dc2eae33a04cc3c2bddb0 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.28.0-h7513371_0.conda#3e83137037cada84605f24baf8a46549 +https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.14-pyhd8ed1ab_0.conda#01f33ad2e0aaf6b5ba4add50dad5ad29 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.5.1-py38h7e4f40d_0.conda#b12c8a72aef587f134f5ff048da0ed6f +https://conda.anaconda.org/conda-forge/noarch/requests-2.28.2-pyhd8ed1ab_0.conda#11d178fc55199482ee48d6812ea83983 https://conda.anaconda.org/conda-forge/noarch/pooch-1.6.0-pyhd8ed1ab_0.tar.bz2#6429e1d1091c51f626b5dcfdd38bf429 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.10.0-py38h10c12cc_0.conda#466ea530d622838f6cdec4f771ddc249 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.10.0-py38h10c12cc_2.conda#d6a3defdc4ab4acd69c04c8ef73d9b57 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.21.1-py38h3d2c718_0.conda#55ba6e3a49c4293302262286a49607d8 https://conda.anaconda.org/conda-forge/noarch/iris-3.4.0-pyhd8ed1ab_0.conda#6a6c17cfff8564de41d2a952c97bc2e8 From b9e966da285a6d6745d8d26e0ab6d7f20fa334b1 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 27 Feb 2023 10:25:13 +0000 Subject: [PATCH 210/583] Updated environment lockfiles (#320) Co-authored-by: Lockfile bot --- requirements/ci/nox.lock/py38-linux-64.lock | 26 ++++++++++----------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/requirements/ci/nox.lock/py38-linux-64.lock b/requirements/ci/nox.lock/py38-linux-64.lock index e370571d..737b1f33 100644 --- a/requirements/ci/nox.lock/py38-linux-64.lock +++ b/requirements/ci/nox.lock/py38-linux-64.lock @@ -40,7 +40,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1 https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.9-h7f98852_0.tar.bz2#bf6f803a544f26ebbdc3bfff272eb179 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2#be93aabceefa2fac576e971aef407908 -https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h7f98852_1002.tar.bz2#1e15f6ad85a7d743a2ac68dae6c82b98 +https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h0b41bf4_1003.conda#bce9f945da8ad2ae9b1d7165a64d0f87 https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007.tar.bz2#b4a4381d54784606820704f7b5f05a15 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.1-h0b41bf4_0.conda#e9c3bcf0e0c719431abec8ca447eee27 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 @@ -87,7 +87,7 @@ https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.1.0-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.4-py38h43d8883_1.tar.bz2#41ca56d5cac7bfc7eb4fcdbee878eb84 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.14-hfd0df8a_1.conda#c2566c2ea5f153ddd6bf4acaf7547d97 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-7.88.0-hdc1c0ab_0.conda#c44acb3847ff118c068b662aff858afd +https://conda.anaconda.org/conda-forge/linux-64/libcurl-7.88.1-hdc1c0ab_0.conda#81eaeb3b35163c8e90e57532bc93754d https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.2-py38h1de0b5d_0.conda#6d97b5d6f06933ab653f1862ddf6e33e https://conda.anaconda.org/conda-forge/noarch/mock-5.0.1-pyhd8ed1ab_0.conda#2938496cc6ab759a14be351c5a4cc76d @@ -103,21 +103,21 @@ https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#9 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.2.0-py38h1de0b5d_0.conda#7db73572d4f7e10a759bad609a228ad0 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py38h0a891b7_5.tar.bz2#0856c59f9ddb710c640dc0428d66b1b7 -https://conda.anaconda.org/conda-forge/noarch/setuptools-67.3.2-pyhd8ed1ab_0.conda#543af74c4042aee5702a033e03a216d0 +https://conda.anaconda.org/conda-forge/noarch/setuptools-67.4.0-pyhd8ed1ab_0.conda#c6f4b87020c72e2700e3e94c1fc93b70 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.0.0-py38h0a891b7_0.tar.bz2#44421904760e9f5ae2035193e04360f0 https://conda.anaconda.org/conda-forge/noarch/wheel-0.38.4-pyhd8ed1ab_0.tar.bz2#c829cfb8cb826acb9de0ac1a2df0a940 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h7f98852_1.tar.bz2#536cc5db4d0a3ba0630541aec064b5e4 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a -https://conda.anaconda.org/conda-forge/noarch/zipp-3.13.0-pyhd8ed1ab_0.conda#41b09d997939e83b231c4557a90c3b13 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.14.0-pyhd8ed1ab_0.conda#01ea04980fa39d7b6dbdd6c67016d177 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py38h4a40e3a_3.conda#3ac112151c6b6cfe457e976de41af0c5 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py38h26c90d9_1.tar.bz2#dcc025a7bb54374979c500c2e161fac9 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.0.7-py38hfbd4bf9_0.conda#638537863b298151635c05c762a997ab -https://conda.anaconda.org/conda-forge/linux-64/curl-7.88.0-hdc1c0ab_0.conda#5d9ac94ee84305ada32c3d287d0ec602 +https://conda.anaconda.org/conda-forge/linux-64/curl-7.88.1-hdc1c0ab_0.conda#1968e4fef727858ac04746560e820928 https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.38.0-py38h0a891b7_1.tar.bz2#62c89ddefed9c5835e228a32b357a28d https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.12.2-nompi_h4df4325_101.conda#162a25904af6586b234b2dd52ee99c61 -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-5.10.2-pyhd8ed1ab_0.conda#de76905f801c22fc43e624058574eab3 +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-5.12.0-pyhd8ed1ab_0.conda#e5fd2260a231ee63b6969f4801082f2b https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py38h26c90d9_1008.tar.bz2#6bc8cd29312f4fc77156b78124e165cd https://conda.anaconda.org/conda-forge/noarch/partd-1.3.0-pyhd8ed1ab_0.tar.bz2#af8c82d121e63082926062d61d9abb54 @@ -130,20 +130,20 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py38h0a891b7_1005.tar.bz2#e99e08812dfff30fdd17b3f8838e2759 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.1.1-py38h26c90d9_2.tar.bz2#0ea017e84efe45badce6c32f274dbf8e https://conda.anaconda.org/conda-forge/linux-64/cryptography-39.0.1-py38h3d167d9_0.conda#375c00c98c36b0e79aaaf2149e51f27d -https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.2.0-pyhd8ed1ab_0.conda#156fb994a4e07091c4fad2c148589eb2 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.2.1-pyhd8ed1ab_0.conda#26875eb004037d9067f1558abf01ef8a https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-h9c3ff4c_1.tar.bz2#1192066d1296de9b492175a4cf43fe8a -https://conda.anaconda.org/conda-forge/noarch/importlib-resources-5.10.2-pyhd8ed1ab_0.conda#ebf8b116aac3fe86270bfe5f61fe2b80 +https://conda.anaconda.org/conda-forge/noarch/importlib-resources-5.12.0-pyhd8ed1ab_0.conda#3544c818f0720c89eb16ae6940ab440b https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.8.1-nompi_h261ec11_106.tar.bz2#9b25de670ce5753a33c18b1090d1d3bf https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.4.1-py38h58d5fe2_1.conda#5286eaec7e93586e4ae05e7d658cd3e2 https://conda.anaconda.org/conda-forge/linux-64/jasper-2.0.33-h0ff4b12_1.conda#753b7aa9da058b8cb4cd699b71c4bb77 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.0-py38hd6c3c57_0.conda#dd63f6486ba95c036b6bfe0b5c53d875 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.0-nompi_py38h6b4b75c_103.conda#ea3d2204fc3a7db7d831daa437a58717 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.2-nompi_py38h2250339_100.tar.bz2#dd97e93b1f64f1cc58879d53c23ec93f https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.0.0-pyhd8ed1ab_0.conda#d41957700e83bbb925928764cb7f8878 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.28.0-h7513371_0.conda#3e83137037cada84605f24baf8a46549 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.28.0-h7513371_1.conda#5591e878880d0d621966336ec5474857 https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.14-pyhd8ed1ab_0.conda#01f33ad2e0aaf6b5ba4add50dad5ad29 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.5.1-py38h7e4f40d_0.conda#b12c8a72aef587f134f5ff048da0ed6f https://conda.anaconda.org/conda-forge/noarch/requests-2.28.2-pyhd8ed1ab_0.conda#11d178fc55199482ee48d6812ea83983 https://conda.anaconda.org/conda-forge/noarch/pooch-1.6.0-pyhd8ed1ab_0.tar.bz2#6429e1d1091c51f626b5dcfdd38bf429 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.10.0-py38h10c12cc_2.conda#d6a3defdc4ab4acd69c04c8ef73d9b57 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.10.1-py38h10c12cc_0.conda#1cbc47bb9a600ce4a49d8da797d375bf https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.21.1-py38h3d2c718_0.conda#55ba6e3a49c4293302262286a49607d8 -https://conda.anaconda.org/conda-forge/noarch/iris-3.4.0-pyhd8ed1ab_0.conda#6a6c17cfff8564de41d2a952c97bc2e8 +https://conda.anaconda.org/conda-forge/noarch/iris-3.4.1-pyhd8ed1ab_0.conda#4dcbc9255798749fb7e0f5f443d4b22a From e2544c534337455a74f16895a71e9af59f237e33 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 6 Mar 2023 09:19:51 +0000 Subject: [PATCH 211/583] Updated environment lockfiles (#323) Co-authored-by: Lockfile bot --- requirements/ci/nox.lock/py38-linux-64.lock | 22 +++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/requirements/ci/nox.lock/py38-linux-64.lock b/requirements/ci/nox.lock/py38-linux-64.lock index 737b1f33..b2b70acd 100644 --- a/requirements/ci/nox.lock/py38-linux-64.lock +++ b/requirements/ci/nox.lock/py38-linux-64.lock @@ -49,7 +49,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-16_linux64_openbla https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.0.9-h166bdaf_8.tar.bz2#4ae4d7795d33e02bd20f6b23d91caf82 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.0.9-h166bdaf_8.tar.bz2#04bac51ba35ea023dc48af73c1c88c25 https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.51.0-hff17c54_0.conda#dd682f0b6d65e75b2bc868fc8e93d87e +https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.52.0-h61bc06f_0.conda#613955a50485812985c059e7b269f42e https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.39-h753d276_0.conda#e1c890aebdebbfbf87e2c917187b4416 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.40.0-h753d276_0.tar.bz2#2e5f9a37d487e1019fd4d8113adb2f9f https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.10.0-hf14f497_3.tar.bz2#d85acad4b47dff4e3def14a769a97906 @@ -71,9 +71,8 @@ https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-16_linux64_openb https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.5.0-h6adf6a1_2.conda#2e648a34072eb39d7c4fc2a9981c5f0c https://conda.anaconda.org/conda-forge/linux-64/python-3.8.16-he550d4f_1_cpython.conda#9de84cccfbc5f8350a3667bb6ef6fc30 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.40.0-h4ff8645_0.tar.bz2#bb11803129cbbb53ed56f9506ff74145 -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/xorg-libx11-1.8.4-h0b41bf4_0.conda#ea8fbfeb976ac49cbeb594e985393514 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/appdirs-1.4.4-pyh9f0ad1d_0.tar.bz2#5f095bc6454094e96f146491fd03633b https://conda.anaconda.org/conda-forge/noarch/attrs-22.2.0-pyh71513ae_0.conda#8b76db7818a4e401ed4486c4c1635cd9 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_8.tar.bz2#2ff08978892a3e8b954397c461f18418 https://conda.anaconda.org/conda-forge/noarch/certifi-2022.12.7-pyhd8ed1ab_0.conda#fb9addc3db06e56abe03e0e9f21a63e6 @@ -106,11 +105,12 @@ https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py38h0a891b7_5.tar.bz https://conda.anaconda.org/conda-forge/noarch/setuptools-67.4.0-pyhd8ed1ab_0.conda#c6f4b87020c72e2700e3e94c1fc93b70 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.4.0-pyha770c72_0.tar.bz2#2d93b130d148d7fc77e583677792fc6a https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.0.0-py38h0a891b7_0.tar.bz2#44421904760e9f5ae2035193e04360f0 https://conda.anaconda.org/conda-forge/noarch/wheel-0.38.4-pyhd8ed1ab_0.tar.bz2#c829cfb8cb826acb9de0ac1a2df0a940 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a -https://conda.anaconda.org/conda-forge/noarch/zipp-3.14.0-pyhd8ed1ab_0.conda#01ea04980fa39d7b6dbdd6c67016d177 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.15.0-pyhd8ed1ab_0.conda#13018819ca8f5b7cc675a8faf1f5fedf https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py38h4a40e3a_3.conda#3ac112151c6b6cfe457e976de41af0c5 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py38h26c90d9_1.tar.bz2#dcc025a7bb54374979c500c2e161fac9 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.0.7-py38hfbd4bf9_0.conda#638537863b298151635c05c762a997ab @@ -126,24 +126,26 @@ https://conda.anaconda.org/conda-forge/noarch/pip-23.0.1-pyhd8ed1ab_0.conda#8025 https://conda.anaconda.org/conda-forge/linux-64/proj-9.1.1-h8ffa02c_2.conda#c264aea0e16bba26afa0a0940e954492 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/shapely-2.0.1-py38hd07e089_0.conda#84c9262ab4057ed9f80888fcfc4bf60a +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.4.0-hd8ed1ab_0.tar.bz2#be969210b61b897775a0de63cd9e9026 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py38h0a891b7_1005.tar.bz2#e99e08812dfff30fdd17b3f8838e2759 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.1.1-py38h26c90d9_2.tar.bz2#0ea017e84efe45badce6c32f274dbf8e -https://conda.anaconda.org/conda-forge/linux-64/cryptography-39.0.1-py38h3d167d9_0.conda#375c00c98c36b0e79aaaf2149e51f27d -https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.2.1-pyhd8ed1ab_0.conda#26875eb004037d9067f1558abf01ef8a +https://conda.anaconda.org/conda-forge/linux-64/cryptography-39.0.2-py38h3d167d9_0.conda#6c60377f8bfa325a2cd80d603627a613 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.3.0-pyhd8ed1ab_0.conda#34437340f37faafad7a6287d3b624f60 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-h9c3ff4c_1.tar.bz2#1192066d1296de9b492175a4cf43fe8a https://conda.anaconda.org/conda-forge/noarch/importlib-resources-5.12.0-pyhd8ed1ab_0.conda#3544c818f0720c89eb16ae6940ab440b -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.8.1-nompi_h261ec11_106.tar.bz2#9b25de670ce5753a33c18b1090d1d3bf +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.1-nompi_h34a3ff0_101.conda#9ce7f5bde721be2f82da9f861c57f1b3 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.1.0-pyhd8ed1ab_0.conda#0b8fbdfd52918bc2f1b76feccd95c919 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.4.1-py38h58d5fe2_1.conda#5286eaec7e93586e4ae05e7d658cd3e2 https://conda.anaconda.org/conda-forge/linux-64/jasper-2.0.33-h0ff4b12_1.conda#753b7aa9da058b8cb4cd699b71c4bb77 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.0-py38hd6c3c57_0.conda#dd63f6486ba95c036b6bfe0b5c53d875 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.2-nompi_py38h2250339_100.tar.bz2#dd97e93b1f64f1cc58879d53c23ec93f +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.2-nompi_py38h08fe49f_101.conda#d2f666fab1d9a1948928756ca8ac1824 https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.0.0-pyhd8ed1ab_0.conda#d41957700e83bbb925928764cb7f8878 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.28.0-h7513371_1.conda#5591e878880d0d621966336ec5474857 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.28.0-h54fcba4_2.conda#f17923e95663a1ae83feba9018112259 https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.14-pyhd8ed1ab_0.conda#01f33ad2e0aaf6b5ba4add50dad5ad29 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.5.1-py38h7e4f40d_0.conda#b12c8a72aef587f134f5ff048da0ed6f https://conda.anaconda.org/conda-forge/noarch/requests-2.28.2-pyhd8ed1ab_0.conda#11d178fc55199482ee48d6812ea83983 -https://conda.anaconda.org/conda-forge/noarch/pooch-1.6.0-pyhd8ed1ab_0.tar.bz2#6429e1d1091c51f626b5dcfdd38bf429 +https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyhd8ed1ab_0.conda#eb2e0fc33ad0d04b51f9280360c13c1e https://conda.anaconda.org/conda-forge/linux-64/scipy-1.10.1-py38h10c12cc_0.conda#1cbc47bb9a600ce4a49d8da797d375bf https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.21.1-py38h3d2c718_0.conda#55ba6e3a49c4293302262286a49607d8 https://conda.anaconda.org/conda-forge/noarch/iris-3.4.1-pyhd8ed1ab_0.conda#4dcbc9255798749fb7e0f5f443d4b22a From f13df7e72cf342f19aad6b089d22c4f490bf01d2 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 13 Mar 2023 11:09:48 +0000 Subject: [PATCH 212/583] Updated environment lockfiles (#324) Co-authored-by: Lockfile bot --- requirements/ci/nox.lock/py38-linux-64.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/requirements/ci/nox.lock/py38-linux-64.lock b/requirements/ci/nox.lock/py38-linux-64.lock index b2b70acd..81f743af 100644 --- a/requirements/ci/nox.lock/py38-linux-64.lock +++ b/requirements/ci/nox.lock/py38-linux-64.lock @@ -82,10 +82,10 @@ https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.1-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb https://conda.anaconda.org/conda-forge/noarch/filelock-3.9.0-pyhd8ed1ab_0.conda#1addc115923d646ca19ed90edc413506 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.2-pyhd8ed1ab_0.tar.bz2#c2a60dd9f1210b8ee2037f7d0ec6251a -https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.1.0-pyhd8ed1ab_0.conda#44f6828b8f7cc3433d68d1d1c0e9add2 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.3.0-pyhd8ed1ab_1.conda#0db48a2f5a68e28e5af8d3df276f2255 https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.4-py38h43d8883_1.tar.bz2#41ca56d5cac7bfc7eb4fcdbee878eb84 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.14-hfd0df8a_1.conda#c2566c2ea5f153ddd6bf4acaf7547d97 +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-hfd0df8a_0.conda#aa8840cdf17ef0c6084d1e24abc7a28b https://conda.anaconda.org/conda-forge/linux-64/libcurl-7.88.1-hdc1c0ab_0.conda#81eaeb3b35163c8e90e57532bc93754d https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.2-py38h1de0b5d_0.conda#6d97b5d6f06933ab653f1862ddf6e33e @@ -102,7 +102,7 @@ https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#9 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.2.0-py38h1de0b5d_0.conda#7db73572d4f7e10a759bad609a228ad0 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py38h0a891b7_5.tar.bz2#0856c59f9ddb710c640dc0428d66b1b7 -https://conda.anaconda.org/conda-forge/noarch/setuptools-67.4.0-pyhd8ed1ab_0.conda#c6f4b87020c72e2700e3e94c1fc93b70 +https://conda.anaconda.org/conda-forge/noarch/setuptools-67.6.0-pyhd8ed1ab_0.conda#e18ed61c37145bb9b48d1d98801960f7 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.4.0-pyha770c72_0.tar.bz2#2d93b130d148d7fc77e583677792fc6a @@ -115,7 +115,7 @@ https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py38h4a40e3a_3.conda https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py38h26c90d9_1.tar.bz2#dcc025a7bb54374979c500c2e161fac9 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.0.7-py38hfbd4bf9_0.conda#638537863b298151635c05c762a997ab https://conda.anaconda.org/conda-forge/linux-64/curl-7.88.1-hdc1c0ab_0.conda#1968e4fef727858ac04746560e820928 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.38.0-py38h0a891b7_1.tar.bz2#62c89ddefed9c5835e228a32b357a28d +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.39.0-py38h1de0b5d_0.conda#aac6f6ca6b8c5d321392f5f7aa3d3186 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.12.2-nompi_h4df4325_101.conda#162a25904af6586b234b2dd52ee99c61 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-5.12.0-pyhd8ed1ab_0.conda#e5fd2260a231ee63b6969f4801082f2b https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 @@ -131,15 +131,15 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py38h0a891b7_1005.tar.bz2#e99e08812dfff30fdd17b3f8838e2759 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.1.1-py38h26c90d9_2.tar.bz2#0ea017e84efe45badce6c32f274dbf8e https://conda.anaconda.org/conda-forge/linux-64/cryptography-39.0.2-py38h3d167d9_0.conda#6c60377f8bfa325a2cd80d603627a613 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.3.0-pyhd8ed1ab_0.conda#34437340f37faafad7a6287d3b624f60 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.3.1-pyhd8ed1ab_0.conda#0a3abdbff6e296d056ce01ee3529638d https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-h9c3ff4c_1.tar.bz2#1192066d1296de9b492175a4cf43fe8a https://conda.anaconda.org/conda-forge/noarch/importlib-resources-5.12.0-pyhd8ed1ab_0.conda#3544c818f0720c89eb16ae6940ab440b https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.1-nompi_h34a3ff0_101.conda#9ce7f5bde721be2f82da9f861c57f1b3 https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.1.0-pyhd8ed1ab_0.conda#0b8fbdfd52918bc2f1b76feccd95c919 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.4.1-py38h58d5fe2_1.conda#5286eaec7e93586e4ae05e7d658cd3e2 https://conda.anaconda.org/conda-forge/linux-64/jasper-2.0.33-h0ff4b12_1.conda#753b7aa9da058b8cb4cd699b71c4bb77 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.0-py38hd6c3c57_0.conda#dd63f6486ba95c036b6bfe0b5c53d875 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.2-nompi_py38h08fe49f_101.conda#d2f666fab1d9a1948928756ca8ac1824 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py38hd6c3c57_0.conda#3b8ba76acae09fbd4b2247c4ee4c0324 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.3-nompi_py38h08fe49f_100.conda#4d0df1a9f6dcfb5d8754ea2e2ecd6fd1 https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.0.0-pyhd8ed1ab_0.conda#d41957700e83bbb925928764cb7f8878 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.28.0-h54fcba4_2.conda#f17923e95663a1ae83feba9018112259 https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.14-pyhd8ed1ab_0.conda#01f33ad2e0aaf6b5ba4add50dad5ad29 From 5b04edec2ac48028be29837161453222d4739297 Mon Sep 17 00:00:00 2001 From: lbdreyer Date: Wed, 15 Mar 2023 12:17:02 +0000 Subject: [PATCH 213/583] Drop use of shapeOfTheEarth for Grib 1 (#316) * Drop use of shapeOfTheEarth for Grib 1 * Add whats new entry * Update release notes message --- docs/ref/release_notes.rst | 20 ++++++++++++ iris_grib/__init__.py | 31 +++++-------------- .../sample_file_loads/earth_shape_grib1.cml | 8 ++--- .../sample_file_loads/lambert_grib1.cml | 14 ++++----- .../sample_file_loads/polar_stereo_grib1.cml | 12 +++---- .../sample_file_loads/regular_gg_grib1.cml | 8 ++--- .../sample_file_loads/rotated.cml | 8 ++--- .../sample_file_loads/time_bound_grib1.cml | 8 ++--- iris_grib/tests/unit/__init__.py | 2 +- .../test_grib1_load_translations.py | 2 +- 10 files changed, 59 insertions(+), 54 deletions(-) diff --git a/docs/ref/release_notes.rst b/docs/ref/release_notes.rst index 9e25d296..a200bb12 100644 --- a/docs/ref/release_notes.rst +++ b/docs/ref/release_notes.rst @@ -2,6 +2,26 @@ Release Notes ============= +What's new in iris-grib v0.19.0 +------------------------------- + +:Release: 0.19.0 +:Date: [unreleased] + +Bugs Fixed +^^^^^^^^^^ +* `@lbdreyer `_ and + `@pp-mo `_ (reviewer) modified the GRIB1 loading + code so that it no longer assumes a spherical Earth with radius of 6371229 m + and instead uses the resolutionAndComponentFlag to determine the shape of the + Earth. This can either be a spherical Earth with radius of 6367470 m or an + oblate spheroid, the latter of which is not supported. Note that this change + in Earth's radius will result in a different coordinate system and may also + affect the coordinate values. + `(PR#316) `_ + + + What's new in iris-grib v0.18.0 ------------------------------- diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index caf83764..39f9ea3b 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -335,30 +335,15 @@ def _compute_extra_keys(self): # TODO #575 Do we want PP or GRIB style forecast delta? self.extra_keys['_forecastTimeUnit'] = self._timeunit_string() - # shape of the earth - soe_code = self.shapeOfTheEarth - # As this class is now *only* for GRIB1, 'shapeOfTheEarth' is not a - # value read from the actual file : It is really a GRIB2 param, and - # the value is merely what eccodes (gribapi) gives as the default. - # This was always = 6, until eccodes 0.19, when it changed to 0. - # See https://jira.ecmwf.int/browse/ECC-811 - # The two represent different sized spherical earths. - if soe_code not in (6, 0): - raise ValueError('Unexpected shapeOfTheEarth value =', soe_code) - - soe_code = 6 - # *FOR NOW* maintain the old behaviour (radius=6371229) in all cases, - # for backwards compatibility. - # However, this does not match the 'radiusOfTheEarth' default from the - # gribapi so is probably incorrect (see above issue ECC-811). - # So we may change this in future. - - if soe_code == 0: - # New supposedly-correct default value, matches 'radiusOfTheEarth'. + # shape of the Earth + oblate_Earth = self.resolutionAndComponentFlags & 0b0100000 + if oblate_Earth: + # Earth assumed oblate spheroidal with size as determined by IAU in + # 1965 (6378.160 km, 6356.775 km, f = 1/297.0) + raise ValueError("Oblate Spheroidal Earth is not supported.") + else: + # Earth assumed spherical with radius 6367.47 km geoid = coord_systems.GeogCS(semi_major_axis=6367470) - elif soe_code == 6: - # Old value, does *not* match the 'radiusOfTheEarth' parameter. - geoid = coord_systems.GeogCS(6371229) gridType = gribapi.grib_get_string(self.grib_message, "gridType") diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_grib1.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_grib1.cml index 69d0a118..eeab2992 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_grib1.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_grib1.cml @@ -6,14 +6,14 @@ - - + + - - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib1.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib1.cml index c2a61005..9f002e3d 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib1.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib1.cml @@ -16,16 +16,16 @@ - - + + - - + + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/polar_stereo_grib1.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/polar_stereo_grib1.cml index 6ba79091..427b5db6 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/polar_stereo_grib1.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/polar_stereo_grib1.cml @@ -9,15 +9,15 @@ - - + + - - + + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/regular_gg_grib1.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/regular_gg_grib1.cml index 7db45208..102918f0 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/regular_gg_grib1.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/regular_gg_grib1.cml @@ -6,14 +6,14 @@ - - + - - + + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/rotated.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/rotated.cml index f48ea9d3..28c5d834 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/rotated.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/rotated.cml @@ -6,13 +6,13 @@ - - + + - - + + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_bound_grib1.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_bound_grib1.cml index 530f48d9..6dbb1f63 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_bound_grib1.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_bound_grib1.cml @@ -6,14 +6,14 @@ - - + + - - + diff --git a/iris_grib/tests/unit/__init__.py b/iris_grib/tests/unit/__init__.py index b077d253..302b4042 100644 --- a/iris_grib/tests/unit/__init__.py +++ b/iris_grib/tests/unit/__init__.py @@ -119,9 +119,9 @@ def _init_minimal_message(self): 'hour': 12, 'minute': 0, 'indicatorOfUnitOfTimeRange': 1, - 'shapeOfTheEarth': 6, 'gridType': 'rotated_ll', 'angleOfRotation': 0.0, + 'resolutionAndComponentFlags': 128, 'iDirectionIncrementInDegrees': 0.036, 'jDirectionIncrementInDegrees': 0.036, 'iScansNegatively': 0, diff --git a/iris_grib/tests/unit/grib1_load_rules/test_grib1_load_translations.py b/iris_grib/tests/unit/grib1_load_rules/test_grib1_load_translations.py index 8087b1c1..d541dfba 100644 --- a/iris_grib/tests/unit/grib1_load_rules/test_grib1_load_translations.py +++ b/iris_grib/tests/unit/grib1_load_rules/test_grib1_load_translations.py @@ -133,9 +133,9 @@ def _init_minimal_message(self, edition=1): "hour": 12, "minute": 0, "indicatorOfUnitOfTimeRange": 1, - "shapeOfTheEarth": 6, "gridType": "rotated_ll", "angleOfRotation": 0.0, + "resolutionAndComponentFlags": 128, "iDirectionIncrementInDegrees": 0.036, "jDirectionIncrementInDegrees": 0.036, "iScansNegatively": 0, From 4ac9169058518c4da1a5003484e7f7706633add6 Mon Sep 17 00:00:00 2001 From: s-boardman Date: Wed, 15 Mar 2023 16:48:17 +0000 Subject: [PATCH 214/583] Correct bounded forecast period calculation (#322) * Correct calculation of forecast_period period for time_bounded_coords. * Extend tests to cover grib data with 3 hour units. --- iris_grib/_grib1_load_rules.py | 5 ++- .../grib1_load_rules/test_grib1_convert.py | 32 +++++++++++++++++++ 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/iris_grib/_grib1_load_rules.py b/iris_grib/_grib1_load_rules.py index de834538..8a82d10a 100644 --- a/iris_grib/_grib1_load_rules.py +++ b/iris_grib/_grib1_load_rules.py @@ -186,11 +186,10 @@ def grib1_convert(grib): def add_bounded_time_coords(aux_coords_and_dims, grib): t_bounds = grib.phenomenon_bounds('hours') - period = Unit('hours').convert(t_bounds[1] - t_bounds[0], - grib._forecastTimeUnit) + period = t_bounds[1] - t_bounds[0] aux_coords_and_dims.append(( DimCoord(standard_name='forecast_period', - units=grib._forecastTimeUnit, + units="hours", points=grib._forecastTime + 0.5 * period, bounds=[grib._forecastTime, grib._forecastTime + period]), None)) diff --git a/iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py b/iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py index e84b9a1a..710a41f0 100644 --- a/iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py +++ b/iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py @@ -58,47 +58,79 @@ def assert_bounded_message(self, **kwargs): expected_points=[100], expected_bounds=[[80, 120]]) + def assert_bounded_message_3hours(self, **kwargs): + attributes = {'productDefinitionTemplateNumber': 0, + 'edition': 1, '_forecastTime': 252, + '_forecastTimeUnit': '3 hours', + 'phenomenon_bounds': lambda u: (252, 258), + '_phenomenonDateTime': -1, + 'table2Version': 9999, + '_originatingCentre': 'xxx', + } + attributes.update(kwargs) + message = mock.Mock(**attributes) + self._test_for_coord(message, grib1_convert, self.is_forecast_period, + expected_points=[255], + expected_bounds=[[252, 258]]) + self._test_for_coord(message, grib1_convert, self.is_time, + expected_points=[255], + expected_bounds=[[252, 258]]) + def test_time_range_indicator_2(self): self.assert_bounded_message(timeRangeIndicator=2) + self.assert_bounded_message_3hours(timeRangeIndicator=2) def test_time_range_indicator_3(self): self.assert_bounded_message(timeRangeIndicator=3) + self.assert_bounded_message_3hours(timeRangeIndicator=3) def test_time_range_indicator_4(self): self.assert_bounded_message(timeRangeIndicator=4) + self.assert_bounded_message_3hours(timeRangeIndicator=4) def test_time_range_indicator_5(self): self.assert_bounded_message(timeRangeIndicator=5) + self.assert_bounded_message_3hours(timeRangeIndicator=5) def test_time_range_indicator_51(self): self.assert_bounded_message(timeRangeIndicator=51) + self.assert_bounded_message_3hours(timeRangeIndicator=51) def test_time_range_indicator_113(self): self.assert_bounded_message(timeRangeIndicator=113) + self.assert_bounded_message_3hours(timeRangeIndicator=113) def test_time_range_indicator_114(self): self.assert_bounded_message(timeRangeIndicator=114) + self.assert_bounded_message_3hours(timeRangeIndicator=114) def test_time_range_indicator_115(self): self.assert_bounded_message(timeRangeIndicator=115) + self.assert_bounded_message_3hours(timeRangeIndicator=115) def test_time_range_indicator_116(self): self.assert_bounded_message(timeRangeIndicator=116) + self.assert_bounded_message_3hours(timeRangeIndicator=116) def test_time_range_indicator_117(self): self.assert_bounded_message(timeRangeIndicator=117) + self.assert_bounded_message_3hours(timeRangeIndicator=117) def test_time_range_indicator_118(self): self.assert_bounded_message(timeRangeIndicator=118) + self.assert_bounded_message_3hours(timeRangeIndicator=118) def test_time_range_indicator_123(self): self.assert_bounded_message(timeRangeIndicator=123) + self.assert_bounded_message_3hours(timeRangeIndicator=123) def test_time_range_indicator_124(self): self.assert_bounded_message(timeRangeIndicator=124) + self.assert_bounded_message_3hours(timeRangeIndicator=124) def test_time_range_indicator_125(self): self.assert_bounded_message(timeRangeIndicator=125) + self.assert_bounded_message_3hours(timeRangeIndicator=125) class Test_GribLevels(tests.IrisTest): From a2ef066270260cfc2e7bfc482c07634b5b4cab33 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 20 Mar 2023 11:41:06 +0000 Subject: [PATCH 215/583] Updated environment lockfiles (#326) Co-authored-by: Lockfile bot --- requirements/ci/nox.lock/py38-linux-64.lock | 45 ++++++++++----------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/requirements/ci/nox.lock/py38-linux-64.lock b/requirements/ci/nox.lock/py38-linux-64.lock index 81f743af..ddaf11c0 100644 --- a/requirements/ci/nox.lock/py38-linux-64.lock +++ b/requirements/ci/nox.lock/py38-linux-64.lock @@ -17,7 +17,6 @@ https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.18.1-h7f98852_0.tar.bz2 https://conda.anaconda.org/conda-forge/linux-64/expat-2.5.0-h27087fc_0.tar.bz2#c4fbad8d4bddeb3c085f18cbf97fbfad https://conda.anaconda.org/conda-forge/linux-64/geos-3.11.1-h27087fc_0.tar.bz2#917b9a50001fffdd89b321b5dba31e55 https://conda.anaconda.org/conda-forge/linux-64/icu-70.1-h27087fc_0.tar.bz2#87473a15119779e021c314249d4b4aed -https://conda.anaconda.org/conda-forge/linux-64/jpeg-9e-h0b41bf4_3.conda#c7a069243e1fbe9a556ed2ec030e6407 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libaec-1.0.6-hcb278e6_1.conda#0f683578378cddb223e7fd24f785ab2a @@ -27,14 +26,15 @@ https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h516909a_1.tar.bz2#6f https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-he1b5a44_1001.tar.bz2#8208602aec4826053c116552369a394c https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-h166bdaf_0.tar.bz2#b62b52da46c39ee2bc3c162ac7f1804d +https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-2.1.5.1-h0b41bf4_0.conda#1edd9e67bdb90d78cea97733ff6b54e6 https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.0-h7f98852_0.tar.bz2#39b1328babf85c7c3a61636d9cd50206 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.21-pthreads_h78a6416_3.tar.bz2#8c5963a49b6035c40646a763293fbb35 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.32.1-h7f98852_1000.tar.bz2#772d69f030955d9646d3d0eaf21d859d -https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.2.4-h166bdaf_0.tar.bz2#ac2ccf7323d21f2994e4d1f5da664f37 +https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.0-h0b41bf4_0.conda#0d4a7508d8c6c65314f2b9c1f56ad408 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h166bdaf_4.tar.bz2#f3f9de449d32ca9b9c66a22863c96f41 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.3-h27087fc_1.tar.bz2#4acfc691e64342b9dae57cf2adc63238 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.0.8-h0b41bf4_0.conda#e043403cd18faf815bf7705ab6c1e092 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.1.0-h0b41bf4_0.conda#2d833be81a21128e317325a01326d36f https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a @@ -45,6 +45,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.1-h0b41bf4_0.conda#e9c3bcf0e0c719431abec8ca447eee27 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae +https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h501b40f_6.conda#c3e9338e15d90106f467377017352b97 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-16_linux64_openblas.tar.bz2#d9b7a8639171f6c6fa0a983edabcfe2b https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.0.9-h166bdaf_8.tar.bz2#4ae4d7795d33e02bd20f6b23d91caf82 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.0.9-h166bdaf_8.tar.bz2#04bac51ba35ea023dc48af73c1c88c25 @@ -54,21 +55,19 @@ https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.39-h753d276_0.conda#e https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.40.0-h753d276_0.tar.bz2#2e5f9a37d487e1019fd4d8113adb2f9f https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.10.0-hf14f497_3.tar.bz2#d85acad4b47dff4e3def14a769a97906 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.13-h7f98852_1004.tar.bz2#b3653fdc58d03face9724f602218a904 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.10.3-h7463322_0.tar.bz2#3b933ea47ef8f330c4c068af25fcd6a8 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.10.3-hca2bb57_3.conda#29474f139e5017090f218ef6b3753efd https://conda.anaconda.org/conda-forge/linux-64/libzip-1.9.2-hc929e4a_1.tar.bz2#5b122b50e738c4be5c3f2899f010d7cf https://conda.anaconda.org/conda-forge/linux-64/readline-8.1.2-h0f457ee_0.tar.bz2#db2ebbe2943aae81ed051a6a9af8e0fa https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-hc3e0081_0.tar.bz2#d4c341e0379c31e9e781d4f204726867 https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 -https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-h166bdaf_4.tar.bz2#4b11e365c0275b808be78b30f904e295 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-h3eb15da_6.conda#6b63daed8feeca47be78f323e793d555 https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_8.tar.bz2#e5613f2bc717e9945840ff474419b8e4 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-hca18f0e_1.conda#e1232042de76d24539a436d37597eb06 -https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h9772cbc_5.tar.bz2#ee08782aff2ff9b3291c967fa6bc7336 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.20.1-h81ceb04_0.conda#89a41adce7106749573d883b2f657d78 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-16_linux64_openblas.tar.bz2#20bae26d0a1db73f758fc3754cab4719 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-16_linux64_openblas.tar.bz2#955d993f41f9354bf753d29864ea20ad -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.5.0-h6adf6a1_2.conda#2e648a34072eb39d7c4fc2a9981c5f0c +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.5.0-hddfeb54_5.conda#d2343e6594c2a4a654a475a6131ef20d https://conda.anaconda.org/conda-forge/linux-64/python-3.8.16-he550d4f_1_cpython.conda#9de84cccfbc5f8350a3667bb6ef6fc30 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.40.0-h4ff8645_0.tar.bz2#bb11803129cbbb53ed56f9506ff74145 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.4-h0b41bf4_0.conda#ea8fbfeb976ac49cbeb594e985393514 @@ -80,13 +79,13 @@ https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-2.1.1-pyhd8ed1a https://conda.anaconda.org/conda-forge/noarch/click-8.1.3-unix_pyhd8ed1ab_2.tar.bz2#20e4087407c7cb04a40817114b333dbf https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.1-pyhd8ed1ab_0.conda#b325bfc4cff7d7f8a868f1f7ecc4ed16 https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb -https://conda.anaconda.org/conda-forge/noarch/filelock-3.9.0-pyhd8ed1ab_0.conda#1addc115923d646ca19ed90edc413506 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.10.0-pyhd8ed1ab_0.conda#6f90f1dc834447823b11d155726fcb37 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.2-pyhd8ed1ab_0.tar.bz2#c2a60dd9f1210b8ee2037f7d0ec6251a https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.3.0-pyhd8ed1ab_1.conda#0db48a2f5a68e28e5af8d3df276f2255 https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.4-py38h43d8883_1.tar.bz2#41ca56d5cac7bfc7eb4fcdbee878eb84 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-hfd0df8a_0.conda#aa8840cdf17ef0c6084d1e24abc7a28b -https://conda.anaconda.org/conda-forge/linux-64/libcurl-7.88.1-hdc1c0ab_0.conda#81eaeb3b35163c8e90e57532bc93754d +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-haa2dc70_1.conda#980d8aca0bc23ca73fa8caa3e7c84c28 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-7.88.1-hdc1c0ab_1.conda#3d1189864d1c0ed2a5919cb067b5903d https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.2-py38h1de0b5d_0.conda#6d97b5d6f06933ab653f1862ddf6e33e https://conda.anaconda.org/conda-forge/noarch/mock-5.0.1-pyhd8ed1ab_0.conda#2938496cc6ab759a14be351c5a4cc76d @@ -105,28 +104,28 @@ https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py38h0a891b7_5.tar.bz https://conda.anaconda.org/conda-forge/noarch/setuptools-67.6.0-pyhd8ed1ab_0.conda#e18ed61c37145bb9b48d1d98801960f7 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.4.0-pyha770c72_0.tar.bz2#2d93b130d148d7fc77e583677792fc6a +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.5.0-pyha770c72_0.conda#43e7d9e50261fb11deb76e17d8431aac https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.0.0-py38h0a891b7_0.tar.bz2#44421904760e9f5ae2035193e04360f0 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.38.4-pyhd8ed1ab_0.tar.bz2#c829cfb8cb826acb9de0ac1a2df0a940 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.40.0-pyhd8ed1ab_0.conda#49bb0d9e60ce1db25e151780331bb5f3 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/noarch/zipp-3.15.0-pyhd8ed1ab_0.conda#13018819ca8f5b7cc675a8faf1f5fedf https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py38h4a40e3a_3.conda#3ac112151c6b6cfe457e976de41af0c5 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py38h26c90d9_1.tar.bz2#dcc025a7bb54374979c500c2e161fac9 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.0.7-py38hfbd4bf9_0.conda#638537863b298151635c05c762a997ab -https://conda.anaconda.org/conda-forge/linux-64/curl-7.88.1-hdc1c0ab_0.conda#1968e4fef727858ac04746560e820928 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.39.0-py38h1de0b5d_0.conda#aac6f6ca6b8c5d321392f5f7aa3d3186 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.12.2-nompi_h4df4325_101.conda#162a25904af6586b234b2dd52ee99c61 +https://conda.anaconda.org/conda-forge/linux-64/curl-7.88.1-hdc1c0ab_1.conda#2016c398f234cfa354ea704c6731b5d5 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.39.2-py38h1de0b5d_0.conda#affec6061f9a2d056db74561477a62b5 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.0-nompi_hb72d44e_103.conda#975973a4350ab45ff1981fe535a12af5 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-5.12.0-pyhd8ed1ab_0.conda#e5fd2260a231ee63b6969f4801082f2b https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py38h26c90d9_1008.tar.bz2#6bc8cd29312f4fc77156b78124e165cd https://conda.anaconda.org/conda-forge/noarch/partd-1.3.0-pyhd8ed1ab_0.tar.bz2#af8c82d121e63082926062d61d9abb54 -https://conda.anaconda.org/conda-forge/linux-64/pillow-9.4.0-py38hde6dc18_1.conda#3de5619d3f556f966189e5251a266125 +https://conda.anaconda.org/conda-forge/linux-64/pillow-9.4.0-py38h961100d_2.conda#26a5eb5d9f097e5011d54aa5cc1571c8 https://conda.anaconda.org/conda-forge/noarch/pip-23.0.1-pyhd8ed1ab_0.conda#8025ca83b8ba5430b640b83917c2a6f7 https://conda.anaconda.org/conda-forge/linux-64/proj-9.1.1-h8ffa02c_2.conda#c264aea0e16bba26afa0a0940e954492 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/shapely-2.0.1-py38hd07e089_0.conda#84c9262ab4057ed9f80888fcfc4bf60a -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.4.0-hd8ed1ab_0.tar.bz2#be969210b61b897775a0de63cd9e9026 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.5.0-hd8ed1ab_0.conda#b3c594fde1a80a1fc3eb9cc4a5dfe392 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py38h0a891b7_1005.tar.bz2#e99e08812dfff30fdd17b3f8838e2759 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.1.1-py38h26c90d9_2.tar.bz2#0ea017e84efe45badce6c32f274dbf8e @@ -134,15 +133,15 @@ https://conda.anaconda.org/conda-forge/linux-64/cryptography-39.0.2-py38h3d167d9 https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.3.1-pyhd8ed1ab_0.conda#0a3abdbff6e296d056ce01ee3529638d https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-h9c3ff4c_1.tar.bz2#1192066d1296de9b492175a4cf43fe8a https://conda.anaconda.org/conda-forge/noarch/importlib-resources-5.12.0-pyhd8ed1ab_0.conda#3544c818f0720c89eb16ae6940ab440b -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.1-nompi_h34a3ff0_101.conda#9ce7f5bde721be2f82da9f861c57f1b3 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.1.0-pyhd8ed1ab_0.conda#0b8fbdfd52918bc2f1b76feccd95c919 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_hf3f8848_100.conda#27512e862382d3a456354ec64234963c +https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.1.1-pyhd8ed1ab_0.conda#1d1a27f637808c76dd83e3f469aa6f7e https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.4.1-py38h58d5fe2_1.conda#5286eaec7e93586e4ae05e7d658cd3e2 -https://conda.anaconda.org/conda-forge/linux-64/jasper-2.0.33-h0ff4b12_1.conda#753b7aa9da058b8cb4cd699b71c4bb77 +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.0.0-h32699f2_1.conda#fdde5424ecef5f7ad310b4242229291c https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py38hd6c3c57_0.conda#3b8ba76acae09fbd4b2247c4ee4c0324 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.3-nompi_py38h08fe49f_100.conda#4d0df1a9f6dcfb5d8754ea2e2ecd6fd1 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.3-nompi_py38hd31e641_102.conda#1631559ac87f3f0742a8abd0ecd32e2d https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.0.0-pyhd8ed1ab_0.conda#d41957700e83bbb925928764cb7f8878 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.28.0-h54fcba4_2.conda#f17923e95663a1ae83feba9018112259 -https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.14-pyhd8ed1ab_0.conda#01f33ad2e0aaf6b5ba4add50dad5ad29 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.29.0-h95353b9_3.conda#6d038ad12516161a8a20d3ec8b0090d3 +https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.15-pyhd8ed1ab_0.conda#27db656619a55d727eaf5a6ece3d2fd6 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.5.1-py38h7e4f40d_0.conda#b12c8a72aef587f134f5ff048da0ed6f https://conda.anaconda.org/conda-forge/noarch/requests-2.28.2-pyhd8ed1ab_0.conda#11d178fc55199482ee48d6812ea83983 https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyhd8ed1ab_0.conda#eb2e0fc33ad0d04b51f9280360c13c1e From a017a12bb44f6ad20698eaf0bda7e92d71f71c8b Mon Sep 17 00:00:00 2001 From: Bill Little Date: Thu, 23 Mar 2023 10:55:11 +0000 Subject: [PATCH 216/583] standardize requirements (#327) --- .travis.yml | 120 ------------------ noxfile.py | 2 +- requirements/{ci => }/iris-grib.yml | 0 .../{ci/nox.lock => locks}/py38-linux-64.lock | 0 requirements/{ci => }/py38.yml | 0 requirements/{ci => }/readthedocs.yml | 0 6 files changed, 1 insertion(+), 121 deletions(-) delete mode 100644 .travis.yml rename requirements/{ci => }/iris-grib.yml (100%) rename requirements/{ci/nox.lock => locks}/py38-linux-64.lock (100%) rename requirements/{ci => }/py38.yml (100%) rename requirements/{ci => }/readthedocs.yml (100%) diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 085c8746..00000000 --- a/.travis.yml +++ /dev/null @@ -1,120 +0,0 @@ -language: minimal -dist: xenial - -env: - matrix: - - PYTHON_VERSION=36 IRIS_SOURCE=master - - PYTHON_VERSION=37 IRIS_SOURCE=master - - PYTHON_VERSION=36 IRIS_SOURCE=release - - PYTHON_VERSION=37 IRIS_SOURCE=release - -install: - # Download iris-test-data - # ----------------------------------- - - > - export IRIS_TEST_DATA_REF="https://github.com/SciTools/iris-test-data/archive/master.zip"; - export IRIS_TEST_DATA_DOWNLOAD="${HOME}/iris-test-data"; - mkdir ${IRIS_TEST_DATA_DOWNLOAD}; - wget -O ${IRIS_TEST_DATA_DOWNLOAD}/iris-test-data.zip ${IRIS_TEST_DATA_REF}; - unzip -q ${IRIS_TEST_DATA_DOWNLOAD}/iris-test-data.zip -d ${IRIS_TEST_DATA_DOWNLOAD}; - export IRIS_TEST_DATA_PATH=${IRIS_TEST_DATA_DOWNLOAD}/iris-test-data-master/test_data - - # Install miniconda - # ----------------- - - > - echo "Installing miniconda"; - export CONDA_BASE="https://repo.continuum.io/miniconda/Miniconda"; - wget --quiet ${CONDA_BASE}3-latest-Linux-x86_64.sh -O miniconda.sh; - bash miniconda.sh -b -p ${HOME}/miniconda; - export PATH="${HOME}/miniconda/bin:${PATH}"; - - # Create the test environment - # --------------------------- - - > - echo "Creating testing environment"; - conda config --set always_yes yes --set changeps1 no; - conda config --set show_channel_urls True; - conda config --add channels conda-forge; - conda update --quiet conda; - - # Get environment spec. - - > - export ENV_NAME="iris-grib-dev"; - export ENV_FILE="${TRAVIS_BUILD_DIR}/requirements/ci/py${PYTHON_VERSION}.yml"; - - # Optionally download latest Iris master, from the github repo, - # and replace the Iris dependency with Iris' underlying dependencies. - - > - if [[ "${IRIS_SOURCE}" == "master" ]]; then - IRIS_REF="https://github.com/SciTools/iris/archive/master.zip"; - export IRIS_LOCATION="${HOME}/iris"; - mkdir ${IRIS_LOCATION}; - wget -O ${IRIS_LOCATION}/iris.zip ${IRIS_REF}; - unzip -q ${IRIS_LOCATION}/iris.zip -d ${IRIS_LOCATION}; - - IRIS_ENV_FILE="${IRIS_LOCATION}/iris-master/requirements/ci/py${PYTHON_VERSION}.yml"; - sed -i "/- iris/d" ${ENV_FILE}; - echo "# IRIS DEPENDENCIES." >> ${ENV_FILE}; - sed -ne "/dependencies:/,$ p" ${IRIS_ENV_FILE} | sed "1d" >> ${ENV_FILE}; - fi; - - # Create environment. - - > - conda env create --quiet --file=${ENV_FILE}; - source activate ${ENV_NAME}; - - # Check installation of eccodes. - - python -m eccodes selfcheck; - - # Install pip, then coveralls. - - conda install --quiet pip; - - pip install coveralls; - - # Output environment debug info. - - > - conda list -n ${ENV_NAME}; - conda info -a; - - # Configure Iris - # -------------- - - echo "Configuring Iris"; - - # Optionally install latest Iris master, from downloaded source. - - > - if [[ "${IRIS_SOURCE}" == "master" ]]; then - cd ${IRIS_LOCATION}/iris-master; - python setup.py --quiet install; - fi; - - # Locate Iris installation. - - export IRIS_DIR=$(python -c "import iris; import os.path; print(os.path.dirname(iris.__file__))") - - # Set iris config paths. - - > - export PREFIX="${HOME}/miniconda/envs/${ENV_NAME}"; - SITE_CFG="${IRIS_DIR}/etc/site.cfg"; - echo "[Resources]" > ${SITE_CFG}; - echo "test_data_dir = ${IRIS_TEST_DATA_PATH}" >> ${SITE_CFG}; - echo "[System]" >> ${SITE_CFG}; - echo "udunits2_path = ${PREFIX}/lib/libudunits2.so" >> ${SITE_CFG}; - - # Install iris-grib itself - # ------------------------ - - > - echo "Installing Iris-grib."; - cd ${TRAVIS_BUILD_DIR}; - pip install . --no-deps; - - # Summarise the environment - # ------------------------- - - > - conda list -n ${ENV_NAME}; - conda list -n ${ENV_NAME} --explicit; - conda info -a; - -script: - # Ensure we can import iris_grib and that the tests pass - # ------------------------------------------------------ - - coverage run setup.py test - -after_success: coveralls diff --git a/noxfile.py b/noxfile.py index a8ea6532..81bd7b95 100644 --- a/noxfile.py +++ b/noxfile.py @@ -103,7 +103,7 @@ def _session_lockfile(session: nox.sessions.Session) -> Path: """ lockfile_name = f"py{session.python.replace('.', '')}-linux-64.lock" - return Path("requirements/ci/nox.lock") / lockfile_name + return Path("requirements/locks") / lockfile_name def _file_content(file_path: Path) -> str: diff --git a/requirements/ci/iris-grib.yml b/requirements/iris-grib.yml similarity index 100% rename from requirements/ci/iris-grib.yml rename to requirements/iris-grib.yml diff --git a/requirements/ci/nox.lock/py38-linux-64.lock b/requirements/locks/py38-linux-64.lock similarity index 100% rename from requirements/ci/nox.lock/py38-linux-64.lock rename to requirements/locks/py38-linux-64.lock diff --git a/requirements/ci/py38.yml b/requirements/py38.yml similarity index 100% rename from requirements/ci/py38.yml rename to requirements/py38.yml diff --git a/requirements/ci/readthedocs.yml b/requirements/readthedocs.yml similarity index 100% rename from requirements/ci/readthedocs.yml rename to requirements/readthedocs.yml From 233f5929cb09fae1fb4e754e4cb77ecf1224ba26 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 27 Mar 2023 12:00:22 +0100 Subject: [PATCH 217/583] Updated environment lockfiles (#328) Co-authored-by: Lockfile bot --- requirements/locks/py38-linux-64.lock | 28 ++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/requirements/locks/py38-linux-64.lock b/requirements/locks/py38-linux-64.lock index ddaf11c0..81142d55 100644 --- a/requirements/locks/py38-linux-64.lock +++ b/requirements/locks/py38-linux-64.lock @@ -15,13 +15,13 @@ https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-12.2.0-h65d4601_19.tar 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.5.0-h27087fc_0.tar.bz2#c4fbad8d4bddeb3c085f18cbf97fbfad -https://conda.anaconda.org/conda-forge/linux-64/geos-3.11.1-h27087fc_0.tar.bz2#917b9a50001fffdd89b321b5dba31e55 -https://conda.anaconda.org/conda-forge/linux-64/icu-70.1-h27087fc_0.tar.bz2#87473a15119779e021c314249d4b4aed +https://conda.anaconda.org/conda-forge/linux-64/geos-3.11.2-hcb278e6_0.conda#3b8e364995e3575e57960d29c1e5ab14 +https://conda.anaconda.org/conda-forge/linux-64/icu-72.1-hcb278e6_0.conda#7c8d20d847bb45f56bd941578fcfa146 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libaec-1.0.6-hcb278e6_1.conda#0f683578378cddb223e7fd24f785ab2a https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.0.9-h166bdaf_8.tar.bz2#9194c9bf9428035a05352d031462eae4 -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.17-h0b41bf4_0.conda#5cc781fd91968b11a8a7fdbee0982676 +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.18-h0b41bf4_0.conda#6aa9c9de5542ecb07fdda9ca626252d8 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h516909a_1.tar.bz2#6f8720dff19e17ce5d48cfe7f3d2f0a3 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-he1b5a44_1001.tar.bz2#8208602aec4826053c116552369a394c @@ -55,9 +55,9 @@ https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.39-h753d276_0.conda#e https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.40.0-h753d276_0.tar.bz2#2e5f9a37d487e1019fd4d8113adb2f9f https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.10.0-hf14f497_3.tar.bz2#d85acad4b47dff4e3def14a769a97906 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.13-h7f98852_1004.tar.bz2#b3653fdc58d03face9724f602218a904 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.10.3-hca2bb57_3.conda#29474f139e5017090f218ef6b3753efd +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.10.3-hfdac1af_6.conda#7eecaadc2eaeef464c5fe17702f17c86 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.9.2-hc929e4a_1.tar.bz2#5b122b50e738c4be5c3f2899f010d7cf -https://conda.anaconda.org/conda-forge/linux-64/readline-8.1.2-h0f457ee_0.tar.bz2#db2ebbe2943aae81ed051a6a9af8e0fa +https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-hc3e0081_0.tar.bz2#d4c341e0379c31e9e781d4f204726867 https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 @@ -67,7 +67,7 @@ https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-hca18f0e_1.conda https://conda.anaconda.org/conda-forge/linux-64/krb5-1.20.1-h81ceb04_0.conda#89a41adce7106749573d883b2f657d78 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-16_linux64_openblas.tar.bz2#20bae26d0a1db73f758fc3754cab4719 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-16_linux64_openblas.tar.bz2#955d993f41f9354bf753d29864ea20ad -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.5.0-hddfeb54_5.conda#d2343e6594c2a4a654a475a6131ef20d +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.5.0-ha587672_6.conda#4e5ee4b062c21519efbee7e2ae608748 https://conda.anaconda.org/conda-forge/linux-64/python-3.8.16-he550d4f_1_cpython.conda#9de84cccfbc5f8350a3667bb6ef6fc30 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.40.0-h4ff8645_0.tar.bz2#bb11803129cbbb53ed56f9506ff74145 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.4-h0b41bf4_0.conda#ea8fbfeb976ac49cbeb594e985393514 @@ -79,7 +79,7 @@ https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-2.1.1-pyhd8ed1a https://conda.anaconda.org/conda-forge/noarch/click-8.1.3-unix_pyhd8ed1ab_2.tar.bz2#20e4087407c7cb04a40817114b333dbf https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.1-pyhd8ed1ab_0.conda#b325bfc4cff7d7f8a868f1f7ecc4ed16 https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb -https://conda.anaconda.org/conda-forge/noarch/filelock-3.10.0-pyhd8ed1ab_0.conda#6f90f1dc834447823b11d155726fcb37 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.10.4-pyhd8ed1ab_0.conda#22b444d0094cacef08e2dd216b9b2b0e https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.2-pyhd8ed1ab_0.tar.bz2#c2a60dd9f1210b8ee2037f7d0ec6251a https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.3.0-pyhd8ed1ab_1.conda#0db48a2f5a68e28e5af8d3df276f2255 https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed @@ -116,6 +116,7 @@ https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.0.7-py38hfbd4bf9_0.c https://conda.anaconda.org/conda-forge/linux-64/curl-7.88.1-hdc1c0ab_1.conda#2016c398f234cfa354ea704c6731b5d5 https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.39.2-py38h1de0b5d_0.conda#affec6061f9a2d056db74561477a62b5 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.0-nompi_hb72d44e_103.conda#975973a4350ab45ff1981fe535a12af5 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.1.0-pyha770c72_0.conda#30b3127c385ca2ed5ef87f3d53d466bc https://conda.anaconda.org/conda-forge/noarch/importlib_resources-5.12.0-pyhd8ed1ab_0.conda#e5fd2260a231ee63b6969f4801082f2b https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py38h26c90d9_1008.tar.bz2#6bc8cd29312f4fc77156b78124e165cd @@ -124,27 +125,28 @@ https://conda.anaconda.org/conda-forge/linux-64/pillow-9.4.0-py38h961100d_2.cond https://conda.anaconda.org/conda-forge/noarch/pip-23.0.1-pyhd8ed1ab_0.conda#8025ca83b8ba5430b640b83917c2a6f7 https://conda.anaconda.org/conda-forge/linux-64/proj-9.1.1-h8ffa02c_2.conda#c264aea0e16bba26afa0a0940e954492 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/shapely-2.0.1-py38hd07e089_0.conda#84c9262ab4057ed9f80888fcfc4bf60a +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.1-py38haaa171b_1.conda#fdd08c011257c5e4727cca36f04af74f https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.5.0-hd8ed1ab_0.conda#b3c594fde1a80a1fc3eb9cc4a5dfe392 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py38h0a891b7_1005.tar.bz2#e99e08812dfff30fdd17b3f8838e2759 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.1.1-py38h26c90d9_2.tar.bz2#0ea017e84efe45badce6c32f274dbf8e https://conda.anaconda.org/conda-forge/linux-64/cryptography-39.0.2-py38h3d167d9_0.conda#6c60377f8bfa325a2cd80d603627a613 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.3.1-pyhd8ed1ab_0.conda#0a3abdbff6e296d056ce01ee3529638d https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-h9c3ff4c_1.tar.bz2#1192066d1296de9b492175a4cf43fe8a https://conda.anaconda.org/conda-forge/noarch/importlib-resources-5.12.0-pyhd8ed1ab_0.conda#3544c818f0720c89eb16ae6940ab440b -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_hf3f8848_100.conda#27512e862382d3a456354ec64234963c +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.1.0-hd8ed1ab_0.conda#90bab1d97fdb6bb40c8e00207bf222dc +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_hf3f8848_102.conda#a13f03ed04521e5dc6bde90578ff4dd0 https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.1.1-pyhd8ed1ab_0.conda#1d1a27f637808c76dd83e3f469aa6f7e https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.4.1-py38h58d5fe2_1.conda#5286eaec7e93586e4ae05e7d658cd3e2 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.3.2-pyhd8ed1ab_0.conda#a3552db3a43810551cc93f9a4272380e https://conda.anaconda.org/conda-forge/linux-64/jasper-4.0.0-h32699f2_1.conda#fdde5424ecef5f7ad310b4242229291c https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py38hd6c3c57_0.conda#3b8ba76acae09fbd4b2247c4ee4c0324 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.3-nompi_py38hd31e641_102.conda#1631559ac87f3f0742a8abd0ecd32e2d -https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.0.0-pyhd8ed1ab_0.conda#d41957700e83bbb925928764cb7f8878 +https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.1.0-pyhd8ed1ab_0.conda#3a5b9d88c369e7960e3dde3229066908 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.29.0-h95353b9_3.conda#6d038ad12516161a8a20d3ec8b0090d3 https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.15-pyhd8ed1ab_0.conda#27db656619a55d727eaf5a6ece3d2fd6 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.5.1-py38h7e4f40d_0.conda#b12c8a72aef587f134f5ff048da0ed6f https://conda.anaconda.org/conda-forge/noarch/requests-2.28.2-pyhd8ed1ab_0.conda#11d178fc55199482ee48d6812ea83983 -https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyhd8ed1ab_0.conda#eb2e0fc33ad0d04b51f9280360c13c1e +https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyha770c72_3.conda#5936894aade8240c867d292aa0d980c6 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.10.1-py38h10c12cc_0.conda#1cbc47bb9a600ce4a49d8da797d375bf -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.21.1-py38h3d2c718_0.conda#55ba6e3a49c4293302262286a49607d8 +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.21.1-py38h1abf878_1.conda#4d102cd1e6db10034a6c97df4444833f https://conda.anaconda.org/conda-forge/noarch/iris-3.4.1-pyhd8ed1ab_0.conda#4dcbc9255798749fb7e0f5f443d4b22a From 32e9eef7b44d316027d613916f8245b963e47ff1 Mon Sep 17 00:00:00 2001 From: s-boardman Date: Wed, 29 Mar 2023 10:05:56 +0100 Subject: [PATCH 218/583] Convert gribapi to eccodes (#325) * Convert gribapi references/calls to eccodes. * pep8 changes * Correct gribapi references in comments. * Swap references to gribapi to ecCodes in docstrings. * Correct typo in comment. Co-authored-by: lbdreyer * Swap from GribInternalError to CodesInternalError for consistency --------- Co-authored-by: lbdreyer --- iris_grib/__init__.py | 59 +-- iris_grib/_load_convert.py | 4 +- iris_grib/_save_rules.py | 386 +++++++++--------- iris_grib/message.py | 40 +- .../integration/save_rules/test_grib_save.py | 10 +- iris_grib/tests/unit/__init__.py | 44 +- .../grib1_load_rules/test_grib1_convert.py | 4 +- .../test_grib1_load_translations.py | 52 +-- iris_grib/tests/unit/message/test_Section.py | 14 +- .../unit/message/test__RawGribMessage.py | 8 +- iris_grib/tests/unit/save_rules/__init__.py | 20 +- ...product_definition_template_8_10_and_11.py | 22 +- .../unit/save_rules/test_data_section.py | 42 +- .../test_grid_definition_template_12.py | 18 +- .../unit/save_rules/test_identification.py | 28 +- .../test_product_definition_template_1.py | 6 +- .../test_product_definition_template_10.py | 6 +- .../test_product_definition_template_11.py | 4 +- .../test_product_definition_template_15.py | 16 +- .../test_product_definition_template_40.py | 4 +- .../test_product_definition_template_8.py | 8 +- .../unit/save_rules/test_reference_time.py | 14 +- .../test_set_discipline_and_parameter.py | 6 +- .../save_rules/test_set_fixed_surfaces.py | 40 +- .../save_rules/test_set_time_increment.py | 16 +- .../unit/save_rules/test_set_time_range.py | 8 +- iris_grib/tests/unit/test_GribWrapper.py | 26 +- iris_grib/tests/unit/test_save_messages.py | 4 +- 28 files changed, 468 insertions(+), 441 deletions(-) diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index 39f9ea3b..118886dd 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -15,7 +15,7 @@ import cartopy.crs as ccrs import cf_units -import gribapi +import eccodes import numpy as np import numpy.ma as ma @@ -98,9 +98,11 @@ def ndim(self): def __getitem__(self, keys): with open(self.path, 'rb') as grib_fh: grib_fh.seek(self.offset) - grib_message = gribapi.grib_new_from_file(grib_fh) + grib_message = eccodes.codes_new_from_file( + grib_fh, eccodes.CODES_PRODUCT_GRIB + ) data = _message_values(grib_message, self.shape) - gribapi.grib_release(grib_message) + eccodes.codes_release(grib_message) result = data.__getitem__(keys) @@ -128,6 +130,7 @@ class GribWrapper: provides alternative means of working with GRIB message instances. """ + def __init__(self, grib_message, grib_fh=None): """Store the grib message and compute our extra keys.""" self.grib_message = grib_message @@ -145,7 +148,8 @@ def __init__(self, grib_message, grib_fh=None): # Note that, the grib-api has already read this message and # advanced the file pointer to the end of the message. offset = grib_fh.tell() - message_length = gribapi.grib_get_long(grib_message, 'totalLength') + message_length = eccodes.codes_get_long( + grib_message, 'totalLength') # Initialise the key-extension dictionary. # NOTE: this attribute *must* exist, or the the __getattr__ overload @@ -155,12 +159,12 @@ def __init__(self, grib_message, grib_fh=None): self._compute_extra_keys() # Calculate the data payload shape. - shape = (gribapi.grib_get_long(grib_message, 'numberOfValues'),) + shape = (eccodes.codes_get_long(grib_message, 'numberOfValues'),) if not self.gridType.startswith('reduced'): ni, nj = self.Ni, self.Nj - j_fast = gribapi.grib_get_long(grib_message, - 'jPointsAreConsecutive') + j_fast = eccodes.codes_get_long(grib_message, + 'jPointsAreConsecutive') shape = (nj, ni) if j_fast == 0 else (ni, nj) if deferred: @@ -191,27 +195,30 @@ def __getattr__(self, key): # we just get as the type of the "values" # array...special case here... if key in ["values", "pv", "latitudes", "longitudes"]: - res = gribapi.grib_get_double_array(self.grib_message, key) + res = eccodes.codes_get_double_array(self.grib_message, key) elif key in ('typeOfFirstFixedSurface', 'typeOfSecondFixedSurface'): - res = np.int32(gribapi.grib_get_long(self.grib_message, key)) + res = np.int32(eccodes.codes_get_long(self.grib_message, key)) else: - key_type = gribapi.grib_get_native_type(self.grib_message, key) + key_type = eccodes.codes_get_native_type( + self.grib_message, key) if key_type == int: - res = np.int32(gribapi.grib_get_long(self.grib_message, - key)) + res = np.int32(eccodes.codes_get_long(self.grib_message, + key)) elif key_type == float: # Because some computer keys are floats, like # longitudeOfFirstGridPointInDegrees, a float32 # is not always enough... - res = np.float64(gribapi.grib_get_double(self.grib_message, - key)) + res = np.float64(eccodes.codes_get_double( + self.grib_message, key + ) + ) elif key_type == str: - res = gribapi.grib_get_string(self.grib_message, key) + res = eccodes.codes_get_string(self.grib_message, key) else: emsg = "Unknown type for {} : {}" raise ValueError(emsg.format(key, str(key_type))) - except gribapi.errors.GribInternalError: + except eccodes.CodesInternalError: res = None # ...or is it in our list of extras? @@ -258,7 +265,7 @@ def _compute_extra_keys(self): longitudeOfSouthernPoleInDegrees = 0.0 latitudeOfSouthernPoleInDegrees = 90.0 - centre = gribapi.grib_get_string(self.grib_message, "centre") + centre = eccodes.codes_get_string(self.grib_message, "centre") # default values self.extra_keys = {'_referenceDateTime': -1.0, @@ -287,7 +294,7 @@ def _compute_extra_keys(self): # cf phenomenon translation # Get centre code (N.B. self.centre has default type = string) - centre_number = gribapi.grib_get_long(self.grib_message, "centre") + centre_number = eccodes.codes_get_long(self.grib_message, "centre") # Look for a known grib1-to-cf translation (or None). cf_data = gptx.grib1_phenom_to_cf_info( table2_version=self.table2Version, @@ -345,7 +352,7 @@ def _compute_extra_keys(self): # Earth assumed spherical with radius 6367.47 km geoid = coord_systems.GeogCS(semi_major_axis=6367470) - gridType = gribapi.grib_get_string(self.grib_message, "gridType") + gridType = eccodes.codes_get_string(self.grib_message, "gridType") if gridType in ["regular_ll", "regular_gg", "reduced_ll", "reduced_gg"]: @@ -416,8 +423,8 @@ def _compute_extra_keys(self): # get the distinct latitudes, and make sure they are sorted # (south-to-north) and then put them in the right direction # depending on the scan direction - latitude_points = gribapi.grib_get_double_array( - self.grib_message, 'distinctLatitudes').astype(np.float64) + latitude_points = eccodes.codes_get_double_array( + self.grib_message, 'distinctLatitudes').astype(np.float64) latitude_points.sort() if not self.jScansPositively: # we require latitudes north-to-south @@ -639,8 +646,8 @@ def _longitude_is_cyclic(points): def _message_values(grib_message, shape): - gribapi.grib_set_double(grib_message, 'missingValue', np.nan) - data = gribapi.grib_get_double_array(grib_message, 'values') + eccodes.codes_set_double(grib_message, 'missingValue', np.nan) + data = eccodes.codes_get_double_array(grib_message, 'values') data = data.reshape(shape) # Handle missing values in a sensible way. @@ -787,7 +794,7 @@ def save_pairs_from_cube(cube): # Save each latlon slice2D in the cube for slice2D in cube.slices([y_coords[0], x_coords[0]]): - grib_message = gribapi.grib_new_from_samples("GRIB2") + grib_message = eccodes.codes_grib_new_from_samples("GRIB2") _save_rules.run(slice2D, grib_message, cube) yield (slice2D, grib_message) @@ -824,8 +831,8 @@ def save_messages(messages, target, append=False): try: for message in messages: - gribapi.grib_write(message, grib_file) - gribapi.grib_release(message) + eccodes.codes_write(message, grib_file) + eccodes.codes_release(message) finally: # (this bit is common to the pp and grib savers...) if isinstance(target, str): diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index 7376f255..0d6a50c8 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -204,7 +204,7 @@ def _masker(item): return result -# Use ECCodes gribapi to recognise missing value +# Use ECCodes to recognise missing value _MDI = None @@ -1875,7 +1875,7 @@ def coord_timedelta(coord, value): def time_coords(section, metadata, rt_coord): if 'forecastTime' in section.keys(): forecast_time = section['forecastTime'] - # The gribapi encodes the forecast time as 'startStep' for pdt 4.4x; + # ecCodes encodes the forecast time as 'startStep' for pdt 4.4x; # product_definition_template_40 makes use of this function. The # following will be removed once the suspected bug is fixed. elif 'startStep' in section.keys(): diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index 32ad8716..116304c6 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -14,8 +14,8 @@ import warnings import cf_units -import gribapi -from gribapi import GRIB_MISSING_LONG +import eccodes +from eccodes import CODES_MISSING_LONG as GRIB_MISSING_LONG import numpy as np import numpy.ma as ma @@ -56,7 +56,7 @@ def fixup_float32_as_int32(value): # Convert from two's-complement to sign-and-magnitude. # NB. Because of the silly representation of negative # integers in GRIB2, there is no value we can pass to - # grib_set that will result in the bit pattern 0x80000000. + # codes_set that will result in the bit pattern 0x80000000. # But since that bit pattern corresponds to a floating # point value of negative-zero, we can safely treat it as # positive-zero instead. @@ -93,10 +93,10 @@ def ensure_set_int32_value(grib, key, value): """ try: - gribapi.grib_set(grib, key, value) - except gribapi.GribInternalError: + eccodes.codes_set(grib, key, value) + except eccodes.CodesInternalError: value = fixup_int32_as_uint32(value) - gribapi.grib_set(grib, key, value) + eccodes.codes_set(grib, key, value) ############################################################################### @@ -121,8 +121,8 @@ def ensure_set_int32_value(grib, key, value): def centre(cube, grib): # TODO: read centre from cube - gribapi.grib_set_long(grib, "centre", 74) # UKMO - gribapi.grib_set_long(grib, "subCentre", 0) # exeter is not in the spec + eccodes.codes_set_long(grib, "centre", 74) # UKMO + eccodes.codes_set_long(grib, "subCentre", 0) # exeter is not in the spec def reference_time(cube, grib): @@ -138,10 +138,10 @@ def reference_time(cube, grib): else: rt, rt_meaning, _, _ = _missing_forecast_period(cube) - gribapi.grib_set_long(grib, "significanceOfReferenceTime", rt_meaning) - gribapi.grib_set_long( + eccodes.codes_set_long(grib, "significanceOfReferenceTime", rt_meaning) + eccodes.codes_set_long( grib, "dataDate", "%04d%02d%02d" % (rt.year, rt.month, rt.day)) - gribapi.grib_set_long( + eccodes.codes_set_long( grib, "dataTime", "%02d%02d" % (rt.hour, rt.minute)) # TODO: Set the calendar, when we find out what happened to the proposal! @@ -155,7 +155,7 @@ def identification(cube, grib): # operational product, operational test, research product, etc # (missing for now) - gribapi.grib_set_long(grib, "productionStatusOfProcessedData", 255) + eccodes.codes_set_long(grib, "productionStatusOfProcessedData", 255) # Code table 1.4 # analysis, forecast, processed satellite, processed radar, @@ -163,11 +163,11 @@ def identification(cube, grib): # assume realization will always have 1 and only 1 point # as cubes saving to GRIB2 a 2D horizontal slices if cube.coord('realization').points[0] != 0: - gribapi.grib_set_long(grib, "typeOfProcessedData", 4) + eccodes.codes_set_long(grib, "typeOfProcessedData", 4) else: - gribapi.grib_set_long(grib, "typeOfProcessedData", 3) + eccodes.codes_set_long(grib, "typeOfProcessedData", 3) else: - gribapi.grib_set_long(grib, "typeOfProcessedData", 2) + eccodes.codes_set_long(grib, "typeOfProcessedData", 2) ############################################################################### @@ -182,15 +182,15 @@ def shape_of_the_earth(cube, grib): cs = cube.coord(dimensions=[0]).coord_system # Initially set shape_of_earth keys to missing (255 for byte). - gribapi.grib_set_long(grib, "scaleFactorOfRadiusOfSphericalEarth", 255) - gribapi.grib_set_long(grib, "scaledValueOfRadiusOfSphericalEarth", - GRIB_MISSING_LONG) - gribapi.grib_set_long(grib, "scaleFactorOfEarthMajorAxis", 255) - gribapi.grib_set_long(grib, "scaledValueOfEarthMajorAxis", - GRIB_MISSING_LONG) - gribapi.grib_set_long(grib, "scaleFactorOfEarthMinorAxis", 255) - gribapi.grib_set_long(grib, "scaledValueOfEarthMinorAxis", - GRIB_MISSING_LONG) + eccodes.codes_set_long(grib, "scaleFactorOfRadiusOfSphericalEarth", 255) + eccodes.codes_set_long(grib, "scaledValueOfRadiusOfSphericalEarth", + GRIB_MISSING_LONG) + eccodes.codes_set_long(grib, "scaleFactorOfEarthMajorAxis", 255) + eccodes.codes_set_long(grib, "scaledValueOfEarthMajorAxis", + GRIB_MISSING_LONG) + eccodes.codes_set_long(grib, "scaleFactorOfEarthMinorAxis", 255) + eccodes.codes_set_long(grib, "scaledValueOfEarthMinorAxis", + GRIB_MISSING_LONG) if isinstance(cs, GeogCS): ellipsoid = cs @@ -203,28 +203,28 @@ def shape_of_the_earth(cube, grib): # Spherical earth. if ellipsoid.inverse_flattening == 0.0: - gribapi.grib_set_long(grib, "shapeOfTheEarth", 1) - gribapi.grib_set_long(grib, "scaleFactorOfRadiusOfSphericalEarth", 0) - gribapi.grib_set_long(grib, "scaledValueOfRadiusOfSphericalEarth", - ellipsoid.semi_major_axis) - gribapi.grib_set_long(grib, "scaleFactorOfEarthMajorAxis", 0) - gribapi.grib_set_long(grib, "scaledValueOfEarthMajorAxis", 0) - gribapi.grib_set_long(grib, "scaleFactorOfEarthMinorAxis", 0) - gribapi.grib_set_long(grib, "scaledValueOfEarthMinorAxis", 0) + eccodes.codes_set_long(grib, "shapeOfTheEarth", 1) + eccodes.codes_set_long(grib, "scaleFactorOfRadiusOfSphericalEarth", 0) + eccodes.codes_set_long(grib, "scaledValueOfRadiusOfSphericalEarth", + ellipsoid.semi_major_axis) + eccodes.codes_set_long(grib, "scaleFactorOfEarthMajorAxis", 0) + eccodes.codes_set_long(grib, "scaledValueOfEarthMajorAxis", 0) + eccodes.codes_set_long(grib, "scaleFactorOfEarthMinorAxis", 0) + eccodes.codes_set_long(grib, "scaledValueOfEarthMinorAxis", 0) # Oblate spheroid earth. else: - gribapi.grib_set_long(grib, "shapeOfTheEarth", 7) - gribapi.grib_set_long(grib, "scaleFactorOfEarthMajorAxis", 0) - gribapi.grib_set_long(grib, "scaledValueOfEarthMajorAxis", - ellipsoid.semi_major_axis) - gribapi.grib_set_long(grib, "scaleFactorOfEarthMinorAxis", 0) - gribapi.grib_set_long(grib, "scaledValueOfEarthMinorAxis", - ellipsoid.semi_minor_axis) + eccodes.codes_set_long(grib, "shapeOfTheEarth", 7) + eccodes.codes_set_long(grib, "scaleFactorOfEarthMajorAxis", 0) + eccodes.codes_set_long(grib, "scaledValueOfEarthMajorAxis", + ellipsoid.semi_major_axis) + eccodes.codes_set_long(grib, "scaleFactorOfEarthMinorAxis", 0) + eccodes.codes_set_long(grib, "scaledValueOfEarthMinorAxis", + ellipsoid.semi_minor_axis) def grid_dims(x_coord, y_coord, grib, x_str, y_str): - gribapi.grib_set_long(grib, x_str, x_coord.shape[0]) - gribapi.grib_set_long(grib, y_str, y_coord.shape[0]) + eccodes.codes_set_long(grib, x_str, x_coord.shape[0]) + eccodes.codes_set_long(grib, y_str, y_coord.shape[0]) def latlon_first_last(x_coord, y_coord, grib): @@ -232,23 +232,23 @@ def latlon_first_last(x_coord, y_coord, grib): warnings.warn("Ignoring xy bounds") # XXX Pending #1125 -# gribapi.grib_set_double(grib, "latitudeOfFirstGridPointInDegrees", +# eccodes.codes_set_double(grib, "latitudeOfFirstGridPointInDegrees", # float(y_coord.points[0])) -# gribapi.grib_set_double(grib, "latitudeOfLastGridPointInDegrees", +# eccodes.codes_set_double(grib, "latitudeOfLastGridPointInDegrees", # float(y_coord.points[-1])) -# gribapi.grib_set_double(grib, "longitudeOfFirstGridPointInDegrees", +# eccodes.codes_set_double(grib, "longitudeOfFirstGridPointInDegrees", # float(x_coord.points[0])) -# gribapi.grib_set_double(grib, "longitudeOfLastGridPointInDegrees", +# eccodes.codes_set_double(grib, "longitudeOfLastGridPointInDegrees", # float(x_coord.points[-1])) # WORKAROUND - gribapi.grib_set_long(grib, "latitudeOfFirstGridPoint", - int(y_coord.points[0]*1000000)) - gribapi.grib_set_long(grib, "latitudeOfLastGridPoint", - int(y_coord.points[-1]*1000000)) - gribapi.grib_set_long(grib, "longitudeOfFirstGridPoint", - int((x_coord.points[0] % 360)*1000000)) - gribapi.grib_set_long(grib, "longitudeOfLastGridPoint", - int((x_coord.points[-1] % 360)*1000000)) + eccodes.codes_set_long(grib, "latitudeOfFirstGridPoint", + int(y_coord.points[0]*1000000)) + eccodes.codes_set_long(grib, "latitudeOfLastGridPoint", + int(y_coord.points[-1]*1000000)) + eccodes.codes_set_long(grib, "longitudeOfFirstGridPoint", + int((x_coord.points[0] % 360)*1000000)) + eccodes.codes_set_long(grib, "longitudeOfLastGridPoint", + int((x_coord.points[-1] % 360)*1000000)) def dx_dy(x_coord, y_coord, grib): @@ -258,24 +258,24 @@ def dx_dy(x_coord, y_coord, grib): # 1 * 10^6 * floating point value. # WMO Manual on Codes regulation 92.1.6 if x_coord.units == 'degrees': - gribapi.grib_set(grib, "iDirectionIncrement", - round(1e6 * float(abs(x_step)))) + eccodes.codes_set(grib, "iDirectionIncrement", + round(1e6 * float(abs(x_step)))) else: raise ValueError('X coordinate must be in degrees, not {}' '.'.format(x_coord.units)) if y_coord.units == 'degrees': - gribapi.grib_set(grib, "jDirectionIncrement", - round(1e6 * float(abs(y_step)))) + eccodes.codes_set(grib, "jDirectionIncrement", + round(1e6 * float(abs(y_step)))) else: raise ValueError('Y coordinate must be in degrees, not {}' '.'.format(y_coord.units)) def scanning_mode_flags(x_coord, y_coord, grib): - gribapi.grib_set_long(grib, "iScansPositively", - int(x_coord.points[1] - x_coord.points[0] > 0)) - gribapi.grib_set_long(grib, "jScansPositively", - int(y_coord.points[1] - y_coord.points[0] > 0)) + eccodes.codes_set_long(grib, "iScansPositively", + int(x_coord.points[1] - x_coord.points[0] > 0)) + eccodes.codes_set_long(grib, "jScansPositively", + int(y_coord.points[1] - y_coord.points[0] > 0)) def horizontal_grid_common(cube, grib, xy=False): @@ -306,7 +306,7 @@ def latlon_points_irregular(cube, grib): component_flags = 0 if is_grid_wind: component_flags |= 2 ** _RESOLUTION_AND_COMPONENTS_GRID_WINDS_BIT - gribapi.grib_set(grib, 'resolutionAndComponentFlags', component_flags) + eccodes.codes_set(grib, 'resolutionAndComponentFlags', component_flags) # Record the X and Y coordinate values. # NOTE: there is currently a bug in the gribapi which means that the size @@ -315,10 +315,10 @@ def latlon_points_irregular(cube, grib): # So, this only works at present if the x and y dimensions are **equal**. lon_values = x_coord.points / _DEFAULT_DEGREES_UNITS lat_values = y_coord.points / _DEFAULT_DEGREES_UNITS - gribapi.grib_set_array(grib, 'longitudes', - np.array(np.round(lon_values), dtype=np.int64)) - gribapi.grib_set_array(grib, 'latitudes', - np.array(np.round(lat_values), dtype=np.int64)) + eccodes.codes_set_array(grib, 'longitudes', + np.array(np.round(lon_values), dtype=np.int64)) + eccodes.codes_set_array(grib, 'latitudes', + np.array(np.round(lat_values), dtype=np.int64)) def rotated_pole(cube, grib): @@ -330,18 +330,18 @@ def rotated_pole(cube, grib): 'Grib save does not yet support Rotated-pole coordinates with ' 'a rotated prime meridian.') # XXX Pending #1125 -# gribapi.grib_set_double(grib, "latitudeOfSouthernPoleInDegrees", +# eccodes.codes_set_double(grib, "latitudeOfSouthernPoleInDegrees", # float(cs.n_pole.latitude)) -# gribapi.grib_set_double(grib, "longitudeOfSouthernPoleInDegrees", +# eccodes.codes_set_double(grib, "longitudeOfSouthernPoleInDegrees", # float(cs.n_pole.longitude)) -# gribapi.grib_set_double(grib, "angleOfRotationInDegrees", 0) +# eccodes.codes_set_double(grib, "angleOfRotationInDegrees", 0) # WORKAROUND latitude = cs.grid_north_pole_latitude / _DEFAULT_DEGREES_UNITS longitude = (((cs.grid_north_pole_longitude + 180) % 360) / _DEFAULT_DEGREES_UNITS) - gribapi.grib_set(grib, "latitudeOfSouthernPole", - int(round(latitude))) - gribapi.grib_set(grib, "longitudeOfSouthernPole", int(round(longitude))) - gribapi.grib_set(grib, "angleOfRotation", 0) + eccodes.codes_set(grib, "latitudeOfSouthernPole", - int(round(latitude))) + eccodes.codes_set(grib, "longitudeOfSouthernPole", int(round(longitude))) + eccodes.codes_set(grib, "angleOfRotation", 0) def points_in_unit(coord, unit): @@ -369,7 +369,7 @@ def grid_definition_template_0(cube, grib): """ # Constant resolution, aka 'regular' true lat-lon grid. - gribapi.grib_set_long(grib, "gridDefinitionTemplateNumber", 0) + eccodes.codes_set_long(grib, "gridDefinitionTemplateNumber", 0) horizontal_grid_common(cube, grib) latlon_points_regular(cube, grib) @@ -385,7 +385,7 @@ def grid_definition_template_1(cube, grib): """ # Constant resolution, aka 'regular' rotated lat-lon grid. - gribapi.grib_set_long(grib, "gridDefinitionTemplateNumber", 1) + eccodes.codes_set_long(grib, "gridDefinitionTemplateNumber", 1) # Record details of the rotated coordinate system. rotated_pole(cube, grib) @@ -405,7 +405,7 @@ def grid_definition_template_4(cube, grib): """ # XXX: will we need to set `Ni` and `Nj`? - gribapi.grib_set(grib, "gridDefinitionTemplateNumber", 4) + eccodes.codes_set(grib, "gridDefinitionTemplateNumber", 4) horizontal_grid_common(cube, grib) latlon_points_irregular(cube, grib) @@ -427,9 +427,9 @@ def grid_definition_template_5(cube, grib): # This is acceptable, as the subsequent call to 'horizontal_grid_common' # will set these to the correct horizontal dimensions # (by calling 'grid_dims'). - gribapi.grib_set(grib, "Ni", 1) - gribapi.grib_set(grib, "Nj", 1) - gribapi.grib_set(grib, "gridDefinitionTemplateNumber", 5) + eccodes.codes_set(grib, "Ni", 1) + eccodes.codes_set(grib, "Nj", 1) + eccodes.codes_set(grib, "gridDefinitionTemplateNumber", 5) # Record details of the rotated coordinate system. rotated_pole(cube, grib) @@ -446,7 +446,7 @@ def grid_definition_template_10(cube, grib): Template 3.10 is used to represent a Mercator grid. """ - gribapi.grib_set(grib, "gridDefinitionTemplateNumber", 10) + eccodes.codes_set(grib, "gridDefinitionTemplateNumber", 10) # Retrieve some information from the cube. y_coord = cube.coord(dimensions=[0]) @@ -469,8 +469,8 @@ def grid_definition_template_10(cube, grib): msg = 'Irregular coordinates not supported for Mercator.' raise TranslationError(msg) - gribapi.grib_set(grib, 'Di', abs(x_step)) - gribapi.grib_set(grib, 'Dj', abs(y_step)) + eccodes.codes_set(grib, 'Di', abs(x_step)) + eccodes.codes_set(grib, 'Dj', abs(y_step)) horizontal_grid_common(cube, grib) @@ -487,25 +487,25 @@ def grid_definition_template_10(cube, grib): first_x = first_x % 360 last_x = last_x % 360 - gribapi.grib_set(grib, "latitudeOfFirstGridPoint", - int(np.round(first_y / _DEFAULT_DEGREES_UNITS))) - gribapi.grib_set(grib, "longitudeOfFirstGridPoint", - int(np.round(first_x / _DEFAULT_DEGREES_UNITS))) - gribapi.grib_set(grib, "latitudeOfLastGridPoint", - int(np.round(last_y / _DEFAULT_DEGREES_UNITS))) - gribapi.grib_set(grib, "longitudeOfLastGridPoint", - int(np.round(last_x / _DEFAULT_DEGREES_UNITS))) + eccodes.codes_set(grib, "latitudeOfFirstGridPoint", + int(np.round(first_y / _DEFAULT_DEGREES_UNITS))) + eccodes.codes_set(grib, "longitudeOfFirstGridPoint", + int(np.round(first_x / _DEFAULT_DEGREES_UNITS))) + eccodes.codes_set(grib, "latitudeOfLastGridPoint", + int(np.round(last_y / _DEFAULT_DEGREES_UNITS))) + eccodes.codes_set(grib, "longitudeOfLastGridPoint", + int(np.round(last_x / _DEFAULT_DEGREES_UNITS))) # Check and raise a more intelligible error, if the Iris version is too old # to support the Mercator 'standard_parallel' property. confirm_extended_mercator_supported() # Encode the latitude at which the projection intersects the Earth. - gribapi.grib_set(grib, 'LaD', - cs.standard_parallel / _DEFAULT_DEGREES_UNITS) + eccodes.codes_set(grib, 'LaD', + cs.standard_parallel / _DEFAULT_DEGREES_UNITS) # Encode resolution and component flags - gribapi.grib_set(grib, 'resolutionAndComponentFlags', - 0x1 << _RESOLUTION_AND_COMPONENTS_GRID_WINDS_BIT) + eccodes.codes_set(grib, 'resolutionAndComponentFlags', + 0x1 << _RESOLUTION_AND_COMPONENTS_GRID_WINDS_BIT) def grid_definition_template_12(cube, grib): @@ -516,7 +516,7 @@ def grid_definition_template_12(cube, grib): Template 3.12 is used to represent a Transverse Mercator grid. """ - gribapi.grib_set(grib, "gridDefinitionTemplateNumber", 12) + eccodes.codes_set(grib, "gridDefinitionTemplateNumber", 12) # Retrieve some information from the cube. y_coord = cube.coord(dimensions=[0]) @@ -540,8 +540,8 @@ def grid_definition_template_12(cube, grib): msg = ('Irregular coordinates not supported for Transverse ' 'Mercator.') raise TranslationError(msg) - gribapi.grib_set(grib, 'Di', abs(x_step)) - gribapi.grib_set(grib, 'Dj', abs(y_step)) + eccodes.codes_set(grib, 'Di', abs(x_step)) + eccodes.codes_set(grib, 'Dj', abs(y_step)) horizontal_grid_common(cube, grib) # GRIBAPI expects unsigned ints in X1, X2, Y1, Y2 but it should accept @@ -553,10 +553,14 @@ def grid_definition_template_12(cube, grib): ensure_set_int32_value(grib, 'X2', int(x_cm[-1])) # Lat and lon of reference point are measured in millionths of a degree. - gribapi.grib_set(grib, "latitudeOfReferencePoint", - cs.latitude_of_projection_origin / _DEFAULT_DEGREES_UNITS) - gribapi.grib_set(grib, "longitudeOfReferencePoint", - cs.longitude_of_central_meridian / _DEFAULT_DEGREES_UNITS) + eccodes.codes_set( + grib, "latitudeOfReferencePoint", + cs.latitude_of_projection_origin / _DEFAULT_DEGREES_UNITS + ) + eccodes.codes_set( + grib, "longitudeOfReferencePoint", + cs.longitude_of_central_meridian / _DEFAULT_DEGREES_UNITS + ) # Convert a value in metres into the closest integer number of # centimetres. @@ -564,18 +568,18 @@ def m_to_cm(value): return int(round(value * 100)) # False easting and false northing are measured in units of (10^-2)m. - gribapi.grib_set(grib, 'XR', m_to_cm(cs.false_easting)) - gribapi.grib_set(grib, 'YR', m_to_cm(cs.false_northing)) + eccodes.codes_set(grib, 'XR', m_to_cm(cs.false_easting)) + eccodes.codes_set(grib, 'YR', m_to_cm(cs.false_northing)) # GRIBAPI expects a signed int for scaleFactorAtReferencePoint # but it should accept a float, so work around this. # See https://software.ecmwf.int/issues/browse/SUP-1100 value = cs.scale_factor_at_central_meridian - key_type = gribapi.grib_get_native_type(grib, - "scaleFactorAtReferencePoint") + key_type = eccodes.codes_get_native_type(grib, + "scaleFactorAtReferencePoint") if key_type is not float: value = fixup_float32_as_int32(value) - gribapi.grib_set(grib, "scaleFactorAtReferencePoint", value) + eccodes.codes_set(grib, "scaleFactorAtReferencePoint", value) def grid_definition_template_30(cube, grib): @@ -587,7 +591,7 @@ def grid_definition_template_30(cube, grib): """ - gribapi.grib_set(grib, "gridDefinitionTemplateNumber", 30) + eccodes.codes_set(grib, "gridDefinitionTemplateNumber", 30) # Retrieve some information from the cube. y_coord = cube.coord(dimensions=[0]) @@ -610,8 +614,8 @@ def grid_definition_template_30(cube, grib): msg = ('Irregular coordinates not supported for Lambert ' 'Conformal.') raise TranslationError(msg) - gribapi.grib_set(grib, 'Dx', abs(x_step)) - gribapi.grib_set(grib, 'Dy', abs(y_step)) + eccodes.codes_set(grib, 'Dx', abs(x_step)) + eccodes.codes_set(grib, 'Dy', abs(y_step)) horizontal_grid_common(cube, grib, xy=True) @@ -624,25 +628,25 @@ def grid_definition_template_30(cube, grib): first_x = first_x % 360 central_lon = cs.central_lon % 360 - gribapi.grib_set(grib, "latitudeOfFirstGridPoint", - int(np.round(first_y / _DEFAULT_DEGREES_UNITS))) - gribapi.grib_set(grib, "longitudeOfFirstGridPoint", - int(np.round(first_x / _DEFAULT_DEGREES_UNITS))) - gribapi.grib_set(grib, "LaD", cs.central_lat / _DEFAULT_DEGREES_UNITS) - gribapi.grib_set(grib, "LoV", central_lon / _DEFAULT_DEGREES_UNITS) + eccodes.codes_set(grib, "latitudeOfFirstGridPoint", + int(np.round(first_y / _DEFAULT_DEGREES_UNITS))) + eccodes.codes_set(grib, "longitudeOfFirstGridPoint", + int(np.round(first_x / _DEFAULT_DEGREES_UNITS))) + eccodes.codes_set(grib, "LaD", cs.central_lat / _DEFAULT_DEGREES_UNITS) + eccodes.codes_set(grib, "LoV", central_lon / _DEFAULT_DEGREES_UNITS) latin1, latin2 = cs.secant_latitudes - gribapi.grib_set(grib, "Latin1", latin1 / _DEFAULT_DEGREES_UNITS) - gribapi.grib_set(grib, "Latin2", latin2 / _DEFAULT_DEGREES_UNITS) - gribapi.grib_set(grib, 'resolutionAndComponentFlags', - 0x1 << _RESOLUTION_AND_COMPONENTS_GRID_WINDS_BIT) + eccodes.codes_set(grib, "Latin1", latin1 / _DEFAULT_DEGREES_UNITS) + eccodes.codes_set(grib, "Latin2", latin2 / _DEFAULT_DEGREES_UNITS) + eccodes.codes_set(grib, 'resolutionAndComponentFlags', + 0x1 << _RESOLUTION_AND_COMPONENTS_GRID_WINDS_BIT) # Which pole are the parallels closest to? That is the direction # that the cone converges. poliest_sec = latin1 if abs(latin1) > abs(latin2) else latin2 centre_flag = 0x0 if poliest_sec > 0 else 0x1 - gribapi.grib_set(grib, 'projectionCentreFlag', centre_flag) - gribapi.grib_set(grib, "latitudeOfSouthernPole", 0) - gribapi.grib_set(grib, "longitudeOfSouthernPole", 0) + eccodes.codes_set(grib, 'projectionCentreFlag', centre_flag) + eccodes.codes_set(grib, "latitudeOfSouthernPole", 0) + eccodes.codes_set(grib, "longitudeOfSouthernPole", 0) def grid_definition_section(cube, grib): @@ -729,9 +733,9 @@ def set_discipline_and_parameter(cube, grib): 'discipline, parameterCategory and parameterNumber ' 'have been set to "missing".') - gribapi.grib_set(grib, "discipline", discipline) - gribapi.grib_set(grib, "parameterCategory", category) - gribapi.grib_set(grib, "parameterNumber", number) + eccodes.codes_set(grib, "discipline", discipline) + eccodes.codes_set(grib, "parameterCategory", category) + eccodes.codes_set(grib, "parameterNumber", number) def _non_missing_forecast_period(cube): @@ -837,8 +841,8 @@ def set_forecast_time(cube, grib): else: _, _, fp, grib_time_code = _missing_forecast_period(cube) - gribapi.grib_set(grib, "indicatorOfUnitOfTimeRange", grib_time_code) - gribapi.grib_set(grib, "forecastTime", fp) + eccodes.codes_set(grib, "indicatorOfUnitOfTimeRange", grib_time_code) + eccodes.codes_set(grib, "forecastTime", fp) def set_fixed_surfaces(cube, grib, full3d_cube=None): @@ -923,14 +927,14 @@ def set_fixed_surfaces(cube, grib, full3d_cube=None): # NOTE: may *not* be truly correct, but seems to be common practice. # Still under investigation : # See https://github.com/SciTools/iris/issues/519 - gribapi.grib_set(grib, "typeOfFirstFixedSurface", 1) - gribapi.grib_set(grib, "scaleFactorOfFirstFixedSurface", 0) - gribapi.grib_set(grib, "scaledValueOfFirstFixedSurface", 0) + eccodes.codes_set(grib, "typeOfFirstFixedSurface", 1) + eccodes.codes_set(grib, "scaleFactorOfFirstFixedSurface", 0) + eccodes.codes_set(grib, "scaledValueOfFirstFixedSurface", 0) # Set secondary surface = 'missing'. - gribapi.grib_set(grib, "typeOfSecondFixedSurface", 255) - gribapi.grib_set(grib, "scaleFactorOfSecondFixedSurface", 255) - gribapi.grib_set(grib, "scaledValueOfSecondFixedSurface", - GRIB_MISSING_LONG) + eccodes.codes_set(grib, "typeOfSecondFixedSurface", 255) + eccodes.codes_set(grib, "scaleFactorOfSecondFixedSurface", 255) + eccodes.codes_set(grib, "scaledValueOfSecondFixedSurface", + GRIB_MISSING_LONG) elif not v_coord.has_bounds(): # No second surface output_v = v_coord.units.convert(v_coord.points[0], output_unit) @@ -938,26 +942,26 @@ def set_fixed_surfaces(cube, grib, full3d_cube=None): warnings.warn("Vertical level encoding problem: scaling required.") output_v = int(round(output_v)) - gribapi.grib_set(grib, "typeOfFirstFixedSurface", grib_v_code) - gribapi.grib_set(grib, "scaleFactorOfFirstFixedSurface", 0) - gribapi.grib_set(grib, "scaledValueOfFirstFixedSurface", output_v) - gribapi.grib_set(grib, "typeOfSecondFixedSurface", 255) - gribapi.grib_set(grib, "scaleFactorOfSecondFixedSurface", 255) - gribapi.grib_set(grib, "scaledValueOfSecondFixedSurface", - GRIB_MISSING_LONG) + eccodes.codes_set(grib, "typeOfFirstFixedSurface", grib_v_code) + eccodes.codes_set(grib, "scaleFactorOfFirstFixedSurface", 0) + eccodes.codes_set(grib, "scaledValueOfFirstFixedSurface", output_v) + eccodes.codes_set(grib, "typeOfSecondFixedSurface", 255) + eccodes.codes_set(grib, "scaleFactorOfSecondFixedSurface", 255) + eccodes.codes_set(grib, "scaledValueOfSecondFixedSurface", + GRIB_MISSING_LONG) else: # bounded : set lower+upper surfaces output_v = v_coord.units.convert(v_coord.bounds[0], output_unit) if output_v[0] - abs(output_v[0]) or output_v[1] - abs(output_v[1]): warnings.warn("Vertical level encoding problem: scaling required.") - gribapi.grib_set(grib, "typeOfFirstFixedSurface", grib_v_code) - gribapi.grib_set(grib, "typeOfSecondFixedSurface", grib_v_code) - gribapi.grib_set(grib, "scaleFactorOfFirstFixedSurface", 0) - gribapi.grib_set(grib, "scaleFactorOfSecondFixedSurface", 0) - gribapi.grib_set(grib, "scaledValueOfFirstFixedSurface", - int(round(output_v[0]))) - gribapi.grib_set(grib, "scaledValueOfSecondFixedSurface", - int(round(output_v[1]))) + eccodes.codes_set(grib, "typeOfFirstFixedSurface", grib_v_code) + eccodes.codes_set(grib, "typeOfSecondFixedSurface", grib_v_code) + eccodes.codes_set(grib, "scaleFactorOfFirstFixedSurface", 0) + eccodes.codes_set(grib, "scaleFactorOfSecondFixedSurface", 0) + eccodes.codes_set(grib, "scaledValueOfFirstFixedSurface", + int(round(output_v[0]))) + eccodes.codes_set(grib, "scaledValueOfSecondFixedSurface", + int(round(output_v[1]))) if hybrid_factory is not None: # Need to record ALL the level coefficents in a 'PV' vector. @@ -997,8 +1001,8 @@ def set_fixed_surfaces(cube, grib, full3d_cube=None): coeffs_array[n_coeffs + n_lev] = sigma pv_values = [float(el) for el in coeffs_array] # eccodes does not support writing numpy.int64, cast to python int - gribapi.grib_set(grib, "NV", int(n_coeffs * 2)) - gribapi.grib_set_array(grib, "pv", pv_values) + eccodes.codes_set(grib, "NV", int(n_coeffs * 2)) + eccodes.codes_set_array(grib, "pv", pv_values) def set_time_range(time_coord, grib): @@ -1016,8 +1020,8 @@ def set_time_range(time_coord, grib): raise ValueError(msg.format(time_coord.nbounds)) # Set type to hours and convert period to this unit. - gribapi.grib_set(grib, "indicatorOfUnitForTimeRange", - _TIME_RANGE_UNITS['hours']) + eccodes.codes_set(grib, "indicatorOfUnitForTimeRange", + _TIME_RANGE_UNITS['hours']) hours_since_units = cf_units.Unit('hours since epoch', calendar=time_coord.units.calendar) start_hours, end_hours = time_coord.units.convert(time_coord.bounds[0], @@ -1032,7 +1036,7 @@ def set_time_range(time_coord, grib): msg = 'Truncating floating point lengthOfTimeRange {} to ' \ 'integer value {}' warnings.warn(msg.format(time_range_in_hours, integer_hours)) - gribapi.grib_set(grib, "lengthOfTimeRange", integer_hours) + eccodes.codes_set(grib, "lengthOfTimeRange", integer_hours) def set_time_increment(cell_method, grib): @@ -1044,7 +1048,7 @@ def set_time_increment(cell_method, grib): # Type of time increment, e.g incrementing forecast period, incrementing # forecast reference time, etc. Set to missing, but we could use the # cell method coord to infer a value (see code table 4.11). - gribapi.grib_set(grib, "typeOfTimeIncrement", 255) + eccodes.codes_set(grib, "typeOfTimeIncrement", 255) # Default values for the time increment value and units type. inc = 0 @@ -1072,8 +1076,8 @@ def set_time_increment(cell_method, grib): 'integer value {}'.format(inc, integer_inc)) inc = integer_inc - gribapi.grib_set(grib, "indicatorOfUnitForTimeIncrement", units_type) - gribapi.grib_set(grib, "timeIncrement", inc) + eccodes.codes_set(grib, "indicatorOfUnitForTimeIncrement", units_type) + eccodes.codes_set(grib, "timeIncrement", inc) def _cube_is_time_statistic(cube): @@ -1176,11 +1180,11 @@ def set_ensemble(cube, grib): len(cube.coord('realization').points) == 1): raise ValueError("A cube 'realization' coordinate with one " "point is required, but not present") - gribapi.grib_set(grib, "perturbationNumber", - int(cube.coord('realization').points[0])) + eccodes.codes_set(grib, "perturbationNumber", + int(cube.coord('realization').points[0])) # no encoding at present in iris-grib, set to missing - gribapi.grib_set(grib, "numberOfForecastsInEnsemble", 255) - gribapi.grib_set(grib, "typeOfEnsembleForecast", 255) + eccodes.codes_set(grib, "numberOfForecastsInEnsemble", 255) + eccodes.codes_set(grib, "typeOfEnsembleForecast", 255) def product_definition_template_common(cube, grib, full3d_cube=None): @@ -1192,9 +1196,9 @@ def product_definition_template_common(cube, grib, full3d_cube=None): set_discipline_and_parameter(cube, grib) # Various missing values. - gribapi.grib_set(grib, "typeOfGeneratingProcess", 255) - gribapi.grib_set(grib, "backgroundProcess", 255) - gribapi.grib_set(grib, "generatingProcessIdentifier", 255) + eccodes.codes_set(grib, "typeOfGeneratingProcess", 255) + eccodes.codes_set(grib, "backgroundProcess", 255) + eccodes.codes_set(grib, "generatingProcessIdentifier", 255) # Generic time handling. set_forecast_time(cube, grib) @@ -1212,7 +1216,7 @@ def product_definition_template_0(cube, grib, full3d_cube=None): a horizontal level at a point in time. """ - gribapi.grib_set_long(grib, "productDefinitionTemplateNumber", 0) + eccodes.codes_set_long(grib, "productDefinitionTemplateNumber", 0) product_definition_template_common(cube, grib, full3d_cube) @@ -1226,7 +1230,7 @@ def product_definition_template_1(cube, grib, full3d_cube=None): in time. """ - gribapi.grib_set(grib, "productDefinitionTemplateNumber", 1) + eccodes.codes_set(grib, "productDefinitionTemplateNumber", 1) product_definition_template_common(cube, grib, full3d_cube) set_ensemble(cube, grib) @@ -1240,7 +1244,7 @@ def product_definition_template_8(cube, grib, full3d_cube=None): interval. """ - gribapi.grib_set(grib, "productDefinitionTemplateNumber", 8) + eccodes.codes_set(grib, "productDefinitionTemplateNumber", 8) _product_definition_template_8_10_and_11(cube, grib) @@ -1253,13 +1257,13 @@ def product_definition_template_10(cube, grib, full3d_cube=None): interval. """ - gribapi.grib_set(grib, "productDefinitionTemplateNumber", 10) + eccodes.codes_set(grib, "productDefinitionTemplateNumber", 10) if not (cube.coords('percentile_over_time') and len(cube.coord('percentile_over_time').points) == 1): raise ValueError("A cube 'percentile_over_time' coordinate with one " "point is required, but not present.") - gribapi.grib_set(grib, "percentileValue", - int(cube.coord('percentile_over_time').points[0])) + eccodes.codes_set(grib, "percentileValue", + int(cube.coord('percentile_over_time').points[0])) _product_definition_template_8_10_and_11(cube, grib) @@ -1272,7 +1276,7 @@ def product_definition_template_11(cube, grib, full3d_cube=None): interval for an ensemble member. """ - gribapi.grib_set(grib, "productDefinitionTemplateNumber", 11) + eccodes.codes_set(grib, "productDefinitionTemplateNumber", 11) set_ensemble(cube, grib) _product_definition_template_8_10_and_11(cube, grib) @@ -1305,18 +1309,18 @@ def _product_definition_template_8_10_and_11(cube, grib, full3d_cube=None): # Set the associated keys for the end of the interval (octets 35-41 # in section 4). - gribapi.grib_set(grib, "yearOfEndOfOverallTimeInterval", end.year) - gribapi.grib_set(grib, "monthOfEndOfOverallTimeInterval", end.month) - gribapi.grib_set(grib, "dayOfEndOfOverallTimeInterval", end.day) - gribapi.grib_set(grib, "hourOfEndOfOverallTimeInterval", end.hour) - gribapi.grib_set(grib, "minuteOfEndOfOverallTimeInterval", end.minute) - gribapi.grib_set(grib, "secondOfEndOfOverallTimeInterval", end.second) + eccodes.codes_set(grib, "yearOfEndOfOverallTimeInterval", end.year) + eccodes.codes_set(grib, "monthOfEndOfOverallTimeInterval", end.month) + eccodes.codes_set(grib, "dayOfEndOfOverallTimeInterval", end.day) + eccodes.codes_set(grib, "hourOfEndOfOverallTimeInterval", end.hour) + eccodes.codes_set(grib, "minuteOfEndOfOverallTimeInterval", end.minute) + eccodes.codes_set(grib, "secondOfEndOfOverallTimeInterval", end.second) # Only one time range specification. If there were a series of aggregations # (e.g. the mean of an accumulation) one might set this to a higher value, # but we currently only handle a single time related cell method. - gribapi.grib_set(grib, "numberOfTimeRange", 1) - gribapi.grib_set(grib, "numberOfMissingInStatisticalProcess", 0) + eccodes.codes_set(grib, "numberOfTimeRange", 1) + eccodes.codes_set(grib, "numberOfMissingInStatisticalProcess", 0) # Period over which statistical processing is performed. set_time_range(time_coord, grib) @@ -1342,7 +1346,7 @@ def _product_definition_template_8_10_and_11(cube, grib, full3d_cube=None): # Type of statistical process (see code table 4.10) statistic_type = _STATISTIC_TYPE_NAMES.get(cell_method.method, 255) - gribapi.grib_set(grib, "typeOfStatisticalProcessing", statistic_type) + eccodes.codes_set(grib, "typeOfStatisticalProcessing", statistic_type) # Time increment i.e. interval of cell method (if any) set_time_increment(cell_method, grib) @@ -1384,13 +1388,13 @@ def product_definition_template_15(cube, grib, full3d_cube=None): "as a spatial statistical process.") # Set GRIB messages - gribapi.grib_set(grib, "productDefinitionTemplateNumber", 15) + eccodes.codes_set(grib, "productDefinitionTemplateNumber", 15) product_definition_template_common(cube, grib, full3d_cube) - gribapi.grib_set(grib, "spatialProcessing", spatial_processing) + eccodes.codes_set(grib, "spatialProcessing", spatial_processing) if number_of_points is not None: - gribapi.grib_set(grib, "numberOfPointsUsed", number_of_points) + eccodes.codes_set(grib, "numberOfPointsUsed", number_of_points) if statistical_process is not None: - gribapi.grib_set(grib, "statisticalProcess", statistical_process) + eccodes.codes_set(grib, "statisticalProcess", statistical_process) def product_definition_template_40(cube, grib, full3d_cube=None): @@ -1403,10 +1407,10 @@ def product_definition_template_40(cube, grib, full3d_cube=None): constituents. """ - gribapi.grib_set(grib, "productDefinitionTemplateNumber", 40) + eccodes.codes_set(grib, "productDefinitionTemplateNumber", 40) product_definition_template_common(cube, grib) constituent_type = cube.attributes['WMO_constituent_type'] - gribapi.grib_set(grib, "constituentType", constituent_type) + eccodes.codes_set(grib, "constituentType", constituent_type) def product_definition_section(cube, grib, full3d_cube=None): @@ -1489,16 +1493,16 @@ def data_section(cube, grib): if fill_value is None: # Disable missing values in the grib message. - gribapi.grib_set(grib, "bitmapPresent", 0) + eccodes.codes_set(grib, "bitmapPresent", 0) else: # Enable missing values in the grib message. - gribapi.grib_set(grib, "bitmapPresent", 1) - gribapi.grib_set_double(grib, "missingValue", fill_value) + eccodes.codes_set(grib, "bitmapPresent", 1) + eccodes.codes_set_double(grib, "missingValue", fill_value) - gribapi.grib_set_double_array(grib, "values", data.flatten()) + eccodes.codes_set_double_array(grib, "values", data.flatten()) # todo: check packing accuracy? -# print("packingError", gribapi.getb_get_double(grib, "packingError")) +# print("packingError", eccodes.get_get_double(grib, "packingError")) ############################################################################### @@ -1530,7 +1534,7 @@ def run(slice2d_cube, grib, full3d_cube): * grib_message_id: ID of a grib message in memory. This is typically the return value of - :func:`gribapi.grib_new_from_samples`. + :func:`eccodes.codes_grib_new_from_samples`. * full3d_cube: A :class:`iris.slice2d_cube.Cube` representing the entire save cube. diff --git a/iris_grib/message.py b/iris_grib/message.py index 21ea52a7..41d7db1c 100644 --- a/iris_grib/message.py +++ b/iris_grib/message.py @@ -11,7 +11,7 @@ from collections import namedtuple import re -import gribapi +import eccodes import numpy as np import numpy.ma as ma @@ -60,7 +60,9 @@ def messages_from_filename(filename): while True: offset = grib_fh.tell() - grib_id = gribapi.grib_new_from_file(grib_fh) + grib_id = eccodes.codes_new_from_file( + grib_fh, eccodes.CODES_PRODUCT_GRIB + ) if grib_id is None: break raw_message = _RawGribMessage(grib_id) @@ -74,7 +76,7 @@ def __init__(self, raw_message, recreate_raw, file_ref=None): them directly. """ - # A RawGribMessage giving gribapi access to the original grib message. + # A RawGribMessage giving ecCodes access to the original grib message. self._raw_message = raw_message # A _MessageLocation which dask uses to read the message data array, # by which time this message may be dead and the original grib file @@ -282,7 +284,9 @@ class _RawGribMessage: def from_file_offset(filename, offset): with open(filename, 'rb') as f: f.seek(offset) - message_id = gribapi.grib_new_from_file(f) + message_id = eccodes.codes_new_from_file( + f, eccodes.CODES_PRODUCT_GRIB + ) if message_id is None: fmt = 'Invalid GRIB message: {} @ {}' raise RuntimeError(fmt.format(filename, offset)) @@ -305,10 +309,10 @@ def __init__(self, message_id): def __del__(self): """ - Release the gribapi reference to the message at end of object's life. + Release the ecCodes reference to the message at end of object's life. """ - gribapi.grib_release(self._message_id) + eccodes.codes_release(self._message_id) @property def sections(self): @@ -330,11 +334,11 @@ def sections(self): def _get_message_keys(self): """Creates a generator of all the keys in the message.""" - keys_itr = gribapi.grib_keys_iterator_new(self._message_id) - gribapi.grib_skip_computed(keys_itr) - while gribapi.grib_keys_iterator_next(keys_itr): - yield gribapi.grib_keys_iterator_get_name(keys_itr) - gribapi.grib_keys_iterator_delete(keys_itr) + keys_itr = eccodes.codes_keys_iterator_new(self._message_id) + eccodes.codes_skip_computed(keys_itr) + while eccodes.codes_keys_iterator_next(keys_itr): + yield eccodes.codes_keys_iterator_get_name(keys_itr) + eccodes.codes_keys_iterator_delete(keys_itr) def _get_message_sections(self): """ @@ -436,12 +440,12 @@ def _get_key_value(self, key): 'scaledValueOfCentralWaveNumber', 'longitudes', 'latitudes') if key in vector_keys: - res = gribapi.grib_get_array(self._message_id, key) + res = eccodes.codes_get_array(self._message_id, key) elif key == 'bitmap': # The bitmap is stored as contiguous boolean bits, one bit for each - # data point. GRIBAPI returns these as strings, so it must be + # data point. ecCodes returns these as strings, so it must be # type-cast to return an array of ints (0, 1). - res = gribapi.grib_get_array(self._message_id, key, int) + res = eccodes.codes_get_array(self._message_id, key, int) elif key in ('typeOfFirstFixedSurface', 'typeOfSecondFixedSurface'): # By default these values are returned as unhelpful strings but # we can use int representation to compare against instead. @@ -466,7 +470,7 @@ def get_computed_key(self, key): """ vector_keys = ('longitudes', 'latitudes', 'distinctLatitudes') if key in vector_keys: - res = gribapi.grib_get_array(self._message_id, key) + res = eccodes.codes_get_array(self._message_id, key) else: res = self._get_value_or_missing(key) return res @@ -481,11 +485,11 @@ def _get_value_or_missing(self, key, use_int=False): Implementation of Regulations 92.1.4 and 92.1.5 via ECCodes. """ - if gribapi.grib_is_missing(self._message_id, key): + if eccodes.codes_is_missing(self._message_id, key): result = None else: if use_int: - result = gribapi.grib_get(self._message_id, key, int) + result = eccodes.codes_get(self._message_id, key, int) else: - result = gribapi.grib_get(self._message_id, key) + result = eccodes.codes_get(self._message_id, key) return result diff --git a/iris_grib/tests/integration/save_rules/test_grib_save.py b/iris_grib/tests/integration/save_rules/test_grib_save.py index 4cf3665b..2a71eacb 100644 --- a/iris_grib/tests/integration/save_rules/test_grib_save.py +++ b/iris_grib/tests/integration/save_rules/test_grib_save.py @@ -26,7 +26,7 @@ import iris.exceptions import iris.util -import gribapi +import eccodes from iris_grib._load_convert import _MDI as MDI @@ -211,15 +211,17 @@ def test_bounded_level(self): with self.temp_filename(".grib2") as testfile: iris.save(cube, testfile) with open(testfile, "rb") as saved_file: - g = gribapi.grib_new_from_file(saved_file) + g = eccodes.codes_new_from_file( + saved_file, eccodes.CODES_PRODUCT_GRIB + ) self.assertEqual( - gribapi.grib_get_double( + eccodes.codes_get_double( g, "scaledValueOfFirstFixedSurface" ), 0.0, ) self.assertEqual( - gribapi.grib_get_double( + eccodes.codes_get_double( g, "scaledValueOfSecondFixedSurface" ), 2147483647.0, diff --git a/iris_grib/tests/unit/__init__.py b/iris_grib/tests/unit/__init__.py index 302b4042..8af062e3 100644 --- a/iris_grib/tests/unit/__init__.py +++ b/iris_grib/tests/unit/__init__.py @@ -9,7 +9,7 @@ # before importing anything else. import iris_grib.tests as tests -import gribapi +import eccodes import numpy as np from unittest import mock @@ -25,9 +25,9 @@ def _make_test_message(sections): return GribMessage(raw_message, recreate_raw) -def _mock_gribapi_fetch(message, key): +def _mock_eccodes_fetch(message, key): """ - Fake the gribapi key-fetch. + Fake the ecCodes key-fetch. Fetch key-value from the fake message (dictionary). If the key is not present, raise the diagnostic exception. @@ -36,12 +36,12 @@ def _mock_gribapi_fetch(message, key): if key in message: return message[key] else: - raise _mock_gribapi.GribInternalError + raise _mock_eccodes.CodesInternalError -def _mock_gribapi__grib_is_missing(grib_message, keyname): +def _mock_eccodes__codes_is_missing(grib_message, keyname): """ - Fake the gribapi key-existence enquiry. + Fake the ecCodes key-existence enquiry. Return whether the key exists in the fake message (dictionary). @@ -49,9 +49,9 @@ def _mock_gribapi__grib_is_missing(grib_message, keyname): return (keyname not in grib_message) -def _mock_gribapi__grib_get_native_type(grib_message, keyname): +def _mock_eccodes__codes_get_native_type(grib_message, keyname): """ - Fake the gribapi type-discovery operation. + Fake the ecCodes type-discovery operation. Return type of key-value in the fake message (dictionary). If the key is not present, raise the diagnostic exception. @@ -59,22 +59,22 @@ def _mock_gribapi__grib_get_native_type(grib_message, keyname): """ if keyname in grib_message: return type(grib_message[keyname]) - raise _mock_gribapi.GribInternalError(keyname) + raise _mock_eccodes.CodesInternalError(keyname) -# Construct a mock object to mimic the gribapi for GribWrapper testing. -_mock_gribapi = mock.Mock(spec=gribapi) -_mock_gribapi.GribInternalError = Exception +# Construct a mock object to mimic the eccodes for GribWrapper testing. +_mock_eccodes = mock.Mock(spec=eccodes) +_mock_eccodes.CodesInternalError = Exception -_mock_gribapi.grib_get_long = mock.Mock(side_effect=_mock_gribapi_fetch) -_mock_gribapi.grib_get_string = mock.Mock(side_effect=_mock_gribapi_fetch) -_mock_gribapi.grib_get_double = mock.Mock(side_effect=_mock_gribapi_fetch) -_mock_gribapi.grib_get_double_array = mock.Mock( - side_effect=_mock_gribapi_fetch) -_mock_gribapi.grib_is_missing = mock.Mock( - side_effect=_mock_gribapi__grib_is_missing) -_mock_gribapi.grib_get_native_type = mock.Mock( - side_effect=_mock_gribapi__grib_get_native_type) +_mock_eccodes.codes_get_long = mock.Mock(side_effect=_mock_eccodes_fetch) +_mock_eccodes.codes_get_string = mock.Mock(side_effect=_mock_eccodes_fetch) +_mock_eccodes.codes_get_double = mock.Mock(side_effect=_mock_eccodes_fetch) +_mock_eccodes.codes_get_double_array = mock.Mock( + side_effect=_mock_eccodes_fetch) +_mock_eccodes.codes_is_missing = mock.Mock( + side_effect=_mock_eccodes__codes_is_missing) +_mock_eccodes.codes_get_native_type = mock.Mock( + side_effect=_mock_eccodes__codes_get_native_type) class FakeGribMessage(dict): @@ -212,7 +212,7 @@ def mock_grib(self): def cube_from_message(self, grib): # Parameter translation now uses the GribWrapper, so we must convert # the Mock-based fake message to a FakeGribMessage. - with mock.patch('iris_grib.gribapi', _mock_gribapi): + with mock.patch('iris_grib.eccodes', _mock_eccodes): grib_message = FakeGribMessage(**grib.__dict__) wrapped_msg = iris_grib.GribWrapper(grib_message) cube, _, _ = iris.fileformats.rules._make_cube( diff --git a/iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py b/iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py index 710a41f0..f99525ad 100644 --- a/iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py +++ b/iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py @@ -9,7 +9,7 @@ # importing anything else import iris_grib.tests as tests -import gribapi +import eccodes from unittest import mock from iris.aux_factory import HybridPressureFactory @@ -135,7 +135,7 @@ def test_time_range_indicator_125(self): class Test_GribLevels(tests.IrisTest): def test_grib1_hybrid_height(self): - gm = gribapi.grib_new_from_samples('regular_gg_ml_grib1') + gm = eccodes.codes_grib_new_from_samples('regular_gg_ml_grib1') gw = GribWrapper(gm) results = grib1_convert(gw) diff --git a/iris_grib/tests/unit/grib1_load_rules/test_grib1_load_translations.py b/iris_grib/tests/unit/grib1_load_rules/test_grib1_load_translations.py index d541dfba..82471943 100644 --- a/iris_grib/tests/unit/grib1_load_rules/test_grib1_load_translations.py +++ b/iris_grib/tests/unit/grib1_load_rules/test_grib1_load_translations.py @@ -23,14 +23,14 @@ import iris import iris.exceptions -import gribapi +import eccodes import iris.fileformats import iris_grib -def _mock_gribapi_fetch(message, key): +def _mock_eccodes_fetch(message, key): """ - Fake the gribapi key-fetch. + Fake the ecCodes key-fetch. Fetch key-value from the fake message (dictionary). If the key is not present, raise the diagnostic exception. @@ -39,12 +39,12 @@ def _mock_gribapi_fetch(message, key): if key in message: return message[key] else: - raise _mock_gribapi.errors.GribInternalError + raise _mock_eccodes.CodesInternalError -def _mock_gribapi__grib_is_missing(grib_message, keyname): +def _mock_eccodes__codes_is_missing(grib_message, keyname): """ - Fake the gribapi key-existence enquiry. + Fake the ecCodes key-existence enquiry. Return whether the key exists in the fake message (dictionary). @@ -52,9 +52,9 @@ def _mock_gribapi__grib_is_missing(grib_message, keyname): return keyname not in grib_message -def _mock_gribapi__grib_get_native_type(grib_message, keyname): +def _mock_eccodes__codes_get_native_type(grib_message, keyname): """ - Fake the gribapi type-discovery operation. + Fake the ecCodes type-discovery operation. Return type of key-value in the fake message (dictionary). If the key is not present, raise the diagnostic exception. @@ -62,24 +62,24 @@ def _mock_gribapi__grib_get_native_type(grib_message, keyname): """ if keyname in grib_message: return type(grib_message[keyname]) - raise _mock_gribapi.errors.GribInternalError(keyname) + raise _mock_eccodes.CodesInternalError(keyname) -# Construct a mock object to mimic the gribapi for GribWrapper testing. -_mock_gribapi = mock.Mock(spec=gribapi) -_mock_gribapi.errors.GribInternalError = Exception +# Construct a mock object to mimic the ecCodes for GribWrapper testing. +_mock_eccodes = mock.Mock(spec=eccodes) +_mock_eccodes.CodesInternalError = Exception -_mock_gribapi.grib_get_long = mock.Mock(side_effect=_mock_gribapi_fetch) -_mock_gribapi.grib_get_string = mock.Mock(side_effect=_mock_gribapi_fetch) -_mock_gribapi.grib_get_double = mock.Mock(side_effect=_mock_gribapi_fetch) -_mock_gribapi.grib_get_double_array = mock.Mock( - side_effect=_mock_gribapi_fetch +_mock_eccodes.codes_get_long = mock.Mock(side_effect=_mock_eccodes_fetch) +_mock_eccodes.codes_get_string = mock.Mock(side_effect=_mock_eccodes_fetch) +_mock_eccodes.codes_get_double = mock.Mock(side_effect=_mock_eccodes_fetch) +_mock_eccodes.codes_get_double_array = mock.Mock( + side_effect=_mock_eccodes_fetch ) -_mock_gribapi.grib_is_missing = mock.Mock( - side_effect=_mock_gribapi__grib_is_missing +_mock_eccodes.codes_is_missing = mock.Mock( + side_effect=_mock_eccodes__codes_is_missing ) -_mock_gribapi.grib_get_native_type = mock.Mock( - side_effect=_mock_gribapi__grib_get_native_type +_mock_eccodes.codes_get_native_type = mock.Mock( + side_effect=_mock_eccodes__codes_get_native_type ) # define seconds in an hour, for general test usage @@ -173,7 +173,7 @@ def _run_timetests(self, test_set): # Operates on lists of cases for various time-units and grib-editions. # Format: (edition, code, expected-exception, # equivalent-seconds, description-string) - with mock.patch("iris_grib.gribapi", _mock_gribapi): + with mock.patch("iris_grib.eccodes", _mock_eccodes): for test_controls in test_set: ( grib_edition, @@ -294,12 +294,12 @@ def test_warn_unknown_pdts(self): with self.temp_filename() as temp_gribfile_path: # Write a test grib message to the temporary file. with open(temp_gribfile_path, "wb") as temp_gribfile: - grib_message = gribapi.grib_new_from_samples("GRIB2") + grib_message = eccodes.codes_grib_new_from_samples("GRIB2") # Set the PDT to something unexpected. - gribapi.grib_set_long( + eccodes.codes_set_long( grib_message, "productDefinitionTemplateNumber", 5 ) - gribapi.grib_write(grib_message, temp_gribfile) + eccodes.codes_write(grib_message, temp_gribfile) # Load the message from the file as a cube. cube_generator = iris_grib.load_cubes(temp_gribfile_path) @@ -329,7 +329,7 @@ def mock_grib(self): def cube_from_message(self, grib): # Parameter translation now uses the GribWrapper, so we must convert # the Mock-based fake message to a FakeGribMessage. - with mock.patch("iris_grib.gribapi", _mock_gribapi): + with mock.patch("iris_grib.eccodes", _mock_eccodes): grib_message = FakeGribMessage(**grib.__dict__) wrapped_msg = iris_grib.GribWrapper(grib_message) cube, _, _ = iris.fileformats.rules._make_cube( diff --git a/iris_grib/tests/unit/message/test_Section.py b/iris_grib/tests/unit/message/test_Section.py index fca3815d..76e9e043 100644 --- a/iris_grib/tests/unit/message/test_Section.py +++ b/iris_grib/tests/unit/message/test_Section.py @@ -12,7 +12,7 @@ # importing anything else. import iris_grib.tests as tests -import gribapi +import eccodes import numpy as np from iris_grib.message import Section @@ -23,7 +23,9 @@ class Test___getitem__(tests.IrisGribTest): def setUp(self): filename = tests.get_data_path(('GRIB', 'uk_t', 'uk_t.grib2')) with open(filename, 'rb') as grib_fh: - self.grib_id = gribapi.grib_new_from_file(grib_fh) + self.grib_id = eccodes.codes_new_from_file( + grib_fh, eccodes.CODES_PRODUCT_GRIB + ) def test_scalar(self): section = Section(self.grib_id, None, ['Ni']) @@ -56,7 +58,9 @@ class Test__getitem___pdt_31(tests.IrisGribTest): def setUp(self): filename = tests.get_data_path(('GRIB', 'umukv', 'ukv_chan9.grib2')) with open(filename, 'rb') as grib_fh: - self.grib_id = gribapi.grib_new_from_file(grib_fh) + self.grib_id = eccodes.codes_new_from_file( + grib_fh, eccodes.CODES_PRODUCT_GRIB + ) self.keys = ['satelliteSeries', 'satelliteNumber', 'instrumentType', 'scaleFactorOfCentralWaveNumber', 'scaledValueOfCentralWaveNumber'] @@ -74,7 +78,9 @@ class Test_get_computed_key(tests.IrisGribTest): def test_gdt40_computed(self): fname = tests.get_data_path(('GRIB', 'gaussian', 'regular_gg.grib2')) with open(fname, 'rb') as grib_fh: - self.grib_id = gribapi.grib_new_from_file(grib_fh) + self.grib_id = eccodes.codes_new_from_file( + grib_fh, eccodes.CODES_PRODUCT_GRIB + ) section = Section(self.grib_id, None, []) latitudes = section.get_computed_key('latitudes') self.assertTrue(88.55 < latitudes[0] < 88.59) diff --git a/iris_grib/tests/unit/message/test__RawGribMessage.py b/iris_grib/tests/unit/message/test__RawGribMessage.py index 3213f784..cb839b8b 100644 --- a/iris_grib/tests/unit/message/test__RawGribMessage.py +++ b/iris_grib/tests/unit/message/test__RawGribMessage.py @@ -12,7 +12,7 @@ # importing anything else. import iris_grib.tests as tests -import gribapi +import eccodes from iris_grib.message import _RawGribMessage @@ -22,7 +22,9 @@ class Test(tests.IrisGribTest): def setUp(self): filename = tests.get_data_path(('GRIB', 'uk_t', 'uk_t.grib2')) with open(filename, 'rb') as grib_fh: - grib_id = gribapi.grib_new_from_file(grib_fh) + grib_id = eccodes.codes_new_from_file( + grib_fh, eccodes.CODES_PRODUCT_GRIB + ) self.message = _RawGribMessage(grib_id) def test_sections__set(self): @@ -41,7 +43,7 @@ def test__get_message_sections__section_numbers(self): def test_sections__numberOfSection_value(self): # The key `numberOfSection` is repeated in every section meaning that - # if requested using gribapi it always defaults to its last value (7). + # if requested using ecCodes it always defaults to its last value (7). # This tests that the `_RawGribMessage._get_message_sections` # override is functioning. section_number = 4 diff --git a/iris_grib/tests/unit/save_rules/__init__.py b/iris_grib/tests/unit/save_rules/__init__.py index 87e87938..0d42e82c 100644 --- a/iris_grib/tests/unit/save_rules/__init__.py +++ b/iris_grib/tests/unit/save_rules/__init__.py @@ -23,20 +23,20 @@ class GdtTestMixin: TARGET_MODULE = 'iris_grib._save_rules' def setUp(self): - # Patch the gribapi of the tested module. - self.mock_gribapi = self.patch(self.TARGET_MODULE + '.gribapi') + # Patch the ecCodes of the tested module. + self.mock_eccodes = self.patch(self.TARGET_MODULE + '.eccodes') - # Fix the mock gribapi to record key assignments. - def grib_set_trap(grib, name, value): + # Fix the mock ecCodes to record key assignments. + def codes_set_trap(grib, name, value): # Record a key setting on the mock passed as the 'grib message id'. grib.keys[name] = value - self.mock_gribapi.grib_set = grib_set_trap - self.mock_gribapi.grib_set_long = grib_set_trap - self.mock_gribapi.grib_set_float = grib_set_trap - self.mock_gribapi.grib_set_double = grib_set_trap - self.mock_gribapi.grib_set_long_array = grib_set_trap - self.mock_gribapi.grib_set_array = grib_set_trap + self.mock_eccodes.codes_set = codes_set_trap + self.mock_eccodes.codes_set_long = codes_set_trap + self.mock_eccodes.codes_set_float = codes_set_trap + self.mock_eccodes.codes_set_double = codes_set_trap + self.mock_eccodes.codes_set_long_array = codes_set_trap + self.mock_eccodes.codes_set_array = codes_set_trap # Create a mock 'grib message id', with a 'keys' dict for settings. self.mock_grib = mock.Mock(keys={}) diff --git a/iris_grib/tests/unit/save_rules/test__product_definition_template_8_10_and_11.py b/iris_grib/tests/unit/save_rules/test__product_definition_template_8_10_and_11.py index f2e9762e..0e55f271 100644 --- a/iris_grib/tests/unit/save_rules/test__product_definition_template_8_10_and_11.py +++ b/iris_grib/tests/unit/save_rules/test__product_definition_template_8_10_and_11.py @@ -16,7 +16,7 @@ from unittest import mock from cf_units import Unit -import gribapi +import eccodes from iris.coords import CellMethod, DimCoord import iris.tests.stock as stock @@ -33,7 +33,7 @@ def setUp(self): units=Unit('days since epoch', calendar='standard')) self.cube.add_aux_coord(coord) - @mock.patch.object(gribapi, 'grib_set') + @mock.patch.object(eccodes, 'codes_set') def test_sum(self, mock_set): cube = self.cube cell_method = CellMethod(method='sum', coords=['time']) @@ -43,7 +43,7 @@ def test_sum(self, mock_set): mock_set.assert_any_call(mock.sentinel.grib, "typeOfStatisticalProcessing", 1) - @mock.patch.object(gribapi, 'grib_set') + @mock.patch.object(eccodes, 'codes_set') def test_unrecognised(self, mock_set): cube = self.cube cell_method = CellMethod(method='95th percentile', coords=['time']) @@ -53,7 +53,7 @@ def test_unrecognised(self, mock_set): mock_set.assert_any_call(mock.sentinel.grib, "typeOfStatisticalProcessing", 255) - @mock.patch.object(gribapi, 'grib_set') + @mock.patch.object(eccodes, 'codes_set') def test_multiple_cell_method_coords(self, mock_set): cube = self.cube cell_method = CellMethod(method='sum', @@ -63,7 +63,7 @@ def test_multiple_cell_method_coords(self, mock_set): 'Cannot handle multiple coordinate name'): _product_definition_template_8_10_and_11(cube, mock.sentinel.grib) - @mock.patch.object(gribapi, 'grib_set') + @mock.patch.object(eccodes, 'codes_set') def test_cell_method_coord_name_fail(self, mock_set): cube = self.cube cell_method = CellMethod(method='mean', coords=['season']) @@ -80,7 +80,7 @@ def setUp(self): # Rename cube to avoid warning about unknown discipline/parameter. self.cube.rename('air_temperature') - @mock.patch.object(gribapi, 'grib_set') + @mock.patch.object(eccodes, 'codes_set') def test_multiple_points(self, mock_set): # Add time coord with multiple points. coord = DimCoord([23, 24, 25], 'time', @@ -92,7 +92,7 @@ def test_multiple_points(self, mock_set): _product_definition_template_8_10_and_11(self.cube, mock.sentinel.grib) - @mock.patch.object(gribapi, 'grib_set') + @mock.patch.object(eccodes, 'codes_set') def test_no_bounds(self, mock_set): # Add time coord with no bounds. coord = DimCoord(23, 'time', @@ -104,7 +104,7 @@ def test_no_bounds(self, mock_set): _product_definition_template_8_10_and_11(self.cube, mock.sentinel.grib) - @mock.patch.object(gribapi, 'grib_set') + @mock.patch.object(eccodes, 'codes_set') def test_more_than_two_bounds(self, mock_set): # Add time coord with more than two bounds. coord = DimCoord(23, 'time', bounds=[21, 22, 23], @@ -125,7 +125,7 @@ def setUp(self): cell_method = CellMethod(method='sum', coords=['time']) self.cube.add_cell_method(cell_method) - @mock.patch.object(gribapi, 'grib_set') + @mock.patch.object(eccodes, 'codes_set') def test_default_calendar(self, mock_set): cube = self.cube # End bound is 1972-04-26 10:27:07. @@ -149,7 +149,7 @@ def test_default_calendar(self, mock_set): mock_set.assert_any_call( grib, "secondOfEndOfOverallTimeInterval", 7) - @mock.patch.object(gribapi, 'grib_set') + @mock.patch.object(eccodes, 'codes_set') def test_360_day_calendar(self, mock_set): cube = self.cube # End bound is 1972-05-07 10:27:07 @@ -175,7 +175,7 @@ def test_360_day_calendar(self, mock_set): class TestNumberOfTimeRange(tests.IrisGribTest): - @mock.patch.object(gribapi, 'grib_set') + @mock.patch.object(eccodes, 'codes_set') def test_other_cell_methods(self, mock_set): cube = stock.lat_lon_cube() # Rename cube to avoid warning about unknown discipline/parameter. diff --git a/iris_grib/tests/unit/save_rules/test_data_section.py b/iris_grib/tests/unit/save_rules/test_data_section.py index 6379c942..0b3f1ab0 100644 --- a/iris_grib/tests/unit/save_rules/test_data_section.py +++ b/iris_grib/tests/unit/save_rules/test_data_section.py @@ -14,42 +14,42 @@ from unittest import mock -import gribapi +import eccodes import iris.cube import numpy as np from iris_grib._save_rules import data_section -GRIB_API = 'iris_grib._save_rules.gribapi' +GRIB_API = 'iris_grib._save_rules.eccodes' GRIB_MESSAGE = mock.sentinel.GRIB_MESSAGE class TestMDI(tests.IrisGribTest): def assertBitmapOff(self, grib_api): # Check the use of a mask has been turned off via: - # gribapi.grib_set(grib_message, 'bitmapPresent', 0) - grib_api.grib_set.assert_called_once_with(GRIB_MESSAGE, - 'bitmapPresent', 0) + # eccodes.codes_set(grib_message, 'bitmapPresent', 0) + grib_api.codes_set.assert_called_once_with(GRIB_MESSAGE, + 'bitmapPresent', 0) def assertBitmapOn(self, grib_api, fill_value): # Check the use of a mask has been turned on via: - # gribapi.grib_set(grib_message, 'bitmapPresent', 1) - # gribapi.grib_set_double(grib_message, 'missingValue', fill_value) - grib_api.grib_set.assert_called_once_with(GRIB_MESSAGE, - 'bitmapPresent', 1) - grib_api.grib_set_double.assert_called_once_with(GRIB_MESSAGE, - 'missingValue', - fill_value) + # eccodes.codes_set(grib_message, 'bitmapPresent', 1) + # eccodes.codes_set_double(grib_message, 'missingValue', fill_value) + grib_api.codes_set.assert_called_once_with(GRIB_MESSAGE, + 'bitmapPresent', 1) + grib_api.codes_set_double.assert_called_once_with(GRIB_MESSAGE, + 'missingValue', + fill_value) def assertBitmapRange(self, grib_api, min_data, max_data): # Check the use of a mask has been turned on via: - # gribapi.grib_set(grib_message, 'bitmapPresent', 1) - # gribapi.grib_set_double(grib_message, 'missingValue', ...) + # eccodes.codes_set(grib_message, 'bitmapPresent', 1) + # eccodes.codes_set_double(grib_message, 'missingValue', ...) # and that a suitable fill value has been chosen. - grib_api.grib_set.assert_called_once_with(GRIB_MESSAGE, - 'bitmapPresent', 1) - args, = grib_api.grib_set_double.call_args_list + grib_api.codes_set.assert_called_once_with(GRIB_MESSAGE, + 'bitmapPresent', 1) + args, = grib_api.codes_set_double.call_args_list (message, key, fill_value), kwargs = args self.assertIs(message, GRIB_MESSAGE) self.assertEqual(key, 'missingValue') @@ -60,8 +60,8 @@ def assertBitmapRange(self, grib_api, min_data, max_data): def assertValues(self, grib_api, values): # Check the correct data values have been set via: - # gribapi.grib_set_double_array(grib_message, 'values', ...) - args, = grib_api.grib_set_double_array.call_args_list + # eccodes.codes_set_double_array(grib_message, 'values', ...) + args, = grib_api.codes_set_double_array.call_args_list (message, key, values), kwargs = args self.assertIs(message, GRIB_MESSAGE) self.assertEqual(key, 'values') @@ -160,9 +160,9 @@ def check(self, dtype): data = np.random.random(1920 * 2560).astype(dtype) cube = iris.cube.Cube(data, standard_name='geopotential_height', units='km') - grib_message = gribapi.grib_new_from_samples("GRIB2") + grib_message = eccodes.codes_grib_new_from_samples("GRIB2") data_section(cube, grib_message) - gribapi.grib_release(grib_message) + eccodes.codes_release(grib_message) def test_float32(self): self.check(dtype=np.float32) diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_12.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_12.py index cf600a80..2cead106 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_template_12.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_12.py @@ -102,15 +102,15 @@ def test__grid_points_approx(self): self._check_key("Di", 200) self._check_key("Dj", 500) - def test__negative_grid_points_gribapi_broken(self): - self.mock_gribapi.GribInternalError = FakeGribError + def test__negative_grid_points_eccodes_broken(self): + self.mock_eccodes.CodesInternalError = FakeGribError # Force the test to run the signed int --> unsigned int workaround. def set(grib, key, value): if key in ["X1", "X2", "Y1", "Y2"] and value < 0: - raise self.mock_gribapi.GribInternalError() + raise self.mock_eccodes.CodesInternalError() grib.keys[key] = value - self.mock_gribapi.grib_set = set + self.mock_eccodes.codes_set = set test_cube = self._make_test_cube(x_points=[-1, 1, 3, 5, 7], y_points=[-4, 9]) @@ -120,7 +120,7 @@ def set(grib, key, value): self._check_key("Y1", 0x80000190) self._check_key("Y2", 900) - def test__negative_grid_points_gribapi_fixed(self): + def test__negative_grid_points_eccodes_fixed(self): test_cube = self._make_test_cube(x_points=[-1, 1, 3, 5, 7], y_points=[-4, 9]) grid_definition_template_12(test_cube, self.mock_grib) @@ -136,7 +136,7 @@ def test__template_specifics(self): self._check_key("XR", 40000000.0) self._check_key("YR", -10000000.0) - def test__scale_factor_gribapi_broken(self): + def test__scale_factor_eccodes_broken(self): # GRIBAPI expects a signed int for scaleFactorAtReferencePoint # but it should accept a float, so work around this. # See https://software.ecmwf.int/issues/browse/SUP-1100 @@ -144,16 +144,16 @@ def test__scale_factor_gribapi_broken(self): def get_native_type(grib, key): assert key == "scaleFactorAtReferencePoint" return int - self.mock_gribapi.grib_get_native_type = get_native_type + self.mock_eccodes.codes_get_native_type = get_native_type grid_definition_template_12(self.test_cube, self.mock_grib) self._check_key("scaleFactorAtReferencePoint", 1065346526) - def test__scale_factor_gribapi_fixed(self): + def test__scale_factor_eccodes_fixed(self): def get_native_type(grib, key): assert key == "scaleFactorAtReferencePoint" return float - self.mock_gribapi.grib_get_native_type = get_native_type + self.mock_eccodes.codes_get_native_type = get_native_type grid_definition_template_12(self.test_cube, self.mock_grib) self._check_key("scaleFactorAtReferencePoint", 0.9996012717) diff --git a/iris_grib/tests/unit/save_rules/test_identification.py b/iris_grib/tests/unit/save_rules/test_identification.py index a49ee4ad..c3676e15 100644 --- a/iris_grib/tests/unit/save_rules/test_identification.py +++ b/iris_grib/tests/unit/save_rules/test_identification.py @@ -11,7 +11,7 @@ from unittest import mock -import gribapi +import eccodes import iris import iris.tests.stock as stock @@ -20,7 +20,7 @@ from iris_grib.tests.unit import TestGribSimple -GRIB_API = 'iris_grib._save_rules.gribapi' +GRIB_API = 'iris_grib._save_rules.eccodes' class Test(TestGribSimple): @@ -28,12 +28,12 @@ class Test(TestGribSimple): def test_no_realization(self): cube = stock.simple_pp() grib = mock.Mock() - mock_gribapi = mock.Mock(spec=gribapi) - with mock.patch(GRIB_API, mock_gribapi): + mock_eccodes = mock.Mock(spec=eccodes) + with mock.patch(GRIB_API, mock_eccodes): identification(cube, grib) - mock_gribapi.assert_has_calls( - [mock.call.grib_set_long(grib, "typeOfProcessedData", 2)]) + mock_eccodes.assert_has_calls( + [mock.call.codes_set_long(grib, "typeOfProcessedData", 2)]) @tests.skip_data def test_realization_0(self): @@ -43,12 +43,12 @@ def test_realization_0(self): cube.add_aux_coord(realisation) grib = mock.Mock() - mock_gribapi = mock.Mock(spec=gribapi) - with mock.patch(GRIB_API, mock_gribapi): + mock_eccodes = mock.Mock(spec=eccodes) + with mock.patch(GRIB_API, mock_eccodes): identification(cube, grib) - mock_gribapi.assert_has_calls( - [mock.call.grib_set_long(grib, "typeOfProcessedData", 3)]) + mock_eccodes.assert_has_calls( + [mock.call.codes_set_long(grib, "typeOfProcessedData", 3)]) @tests.skip_data def test_realization_n(self): @@ -58,12 +58,12 @@ def test_realization_n(self): cube.add_aux_coord(realisation) grib = mock.Mock() - mock_gribapi = mock.Mock(spec=gribapi) - with mock.patch(GRIB_API, mock_gribapi): + mock_eccodes = mock.Mock(spec=eccodes) + with mock.patch(GRIB_API, mock_eccodes): identification(cube, grib) - mock_gribapi.assert_has_calls( - [mock.call.grib_set_long(grib, "typeOfProcessedData", 4)]) + mock_eccodes.assert_has_calls( + [mock.call.codes_set_long(grib, "typeOfProcessedData", 4)]) if __name__ == "__main__": diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_1.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_1.py index c8f9acfa..3f8d84ff 100644 --- a/iris_grib/tests/unit/save_rules/test_product_definition_template_1.py +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_1.py @@ -15,7 +15,7 @@ from unittest import mock from cf_units import Unit -import gribapi +import eccodes from iris.coords import DimCoord import iris.tests.stock as stock @@ -32,7 +32,7 @@ def setUp(self): units=Unit('days since epoch', calendar='standard')) self.cube.add_aux_coord(coord) - @mock.patch.object(gribapi, 'grib_set') + @mock.patch.object(eccodes, 'codes_set') def test_realization(self, mock_set): cube = self.cube coord = DimCoord(10, 'realization', units='1') @@ -48,7 +48,7 @@ def test_realization(self, mock_set): mock_set.assert_any_call(mock.sentinel.grib, "typeOfEnsembleForecast", 255) - @mock.patch.object(gribapi, 'grib_set') + @mock.patch.object(eccodes, 'codes_set') def test_multiple_realization_values(self, mock_set): cube = self.cube coord = DimCoord([8, 9, 10], 'realization', units='1') diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_10.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_10.py index 0c6c2fba..42acbe7f 100644 --- a/iris_grib/tests/unit/save_rules/test_product_definition_template_10.py +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_10.py @@ -15,7 +15,7 @@ from unittest import mock from cf_units import Unit -import gribapi +import eccodes from iris.coords import DimCoord import iris.tests.stock as stock @@ -33,7 +33,7 @@ def setUp(self): units=Unit('days since epoch', calendar='julian')) self.cube.add_aux_coord(time_coord) - @mock.patch.object(gribapi, 'grib_set') + @mock.patch.object(eccodes, 'codes_set') def test_percentile_value(self, mock_set): cube = self.cube percentile_coord = DimCoord(95, long_name='percentile_over_time') @@ -45,7 +45,7 @@ def test_percentile_value(self, mock_set): mock_set.assert_any_call(mock.sentinel.grib, "percentileValue", 95) - @mock.patch.object(gribapi, 'grib_set') + @mock.patch.object(eccodes, 'codes_set') def test_multiple_percentile_value(self, mock_set): cube = self.cube percentile_coord = DimCoord([5, 10, 15], diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_11.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_11.py index d3aca8d3..82e56af7 100644 --- a/iris_grib/tests/unit/save_rules/test_product_definition_template_11.py +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_11.py @@ -15,7 +15,7 @@ from unittest import mock from cf_units import Unit -import gribapi +import eccodes from iris.coords import CellMethod, DimCoord import iris.tests.stock as stock @@ -34,7 +34,7 @@ def setUp(self): coord = DimCoord(4, 'realization', units='1') self.cube.add_aux_coord(coord) - @mock.patch.object(gribapi, 'grib_set') + @mock.patch.object(eccodes, 'codes_set') def test_realization(self, mock_set): cube = self.cube cell_method = CellMethod(method='sum', coords=['time']) diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py index 5461e93e..8286bd7d 100644 --- a/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py @@ -15,7 +15,7 @@ from unittest import mock from cf_units import Unit -import gribapi +import eccodes from iris.coords import CellMethod, DimCoord import iris.tests.stock as stock @@ -35,7 +35,7 @@ def setUp(self): # Rename cube to avoid warning about unknown discipline/parameter. self.cube.rename('air_temperature') - @mock.patch.object(gribapi, 'grib_set') + @mock.patch.object(eccodes, 'codes_set') def test_cell_method(self, mock_set): cube_0 = self.cube cube_0.attributes = dict(spatial_processing_type='No interpolation') @@ -53,7 +53,7 @@ def test_cell_method(self, mock_set): mock_set.assert_any_call(mock.sentinel.grib, "statisticalProcess", 0) - @mock.patch.object(gribapi, 'grib_set') + @mock.patch.object(eccodes, 'codes_set') def test_bilinear_interpolation(self, mock_set): cube_1 = self.cube cube_1.attributes = dict(spatial_processing_type='Bilinear ' @@ -69,7 +69,7 @@ def test_bilinear_interpolation(self, mock_set): mock_set.assert_any_call(mock.sentinel.grib, "numberOfPointsUsed", 4) - @mock.patch.object(gribapi, 'grib_set') + @mock.patch.object(eccodes, 'codes_set') def test_bicubic_interpolation(self, mock_set): cube_2 = self.cube cube_2.attributes = dict(spatial_processing_type='Bicubic ' @@ -85,7 +85,7 @@ def test_bicubic_interpolation(self, mock_set): mock_set.assert_any_call(mock.sentinel.grib, "numberOfPointsUsed", 4) - @mock.patch.object(gribapi, 'grib_set') + @mock.patch.object(eccodes, 'codes_set') def test_nearest_neighbour_interpolation(self, mock_set): cube_3 = self.cube cube_3.attributes = dict(spatial_processing_type='Nearest neighbour ' @@ -101,7 +101,7 @@ def test_nearest_neighbour_interpolation(self, mock_set): mock_set.assert_any_call(mock.sentinel.grib, "numberOfPointsUsed", 1) - @mock.patch.object(gribapi, 'grib_set') + @mock.patch.object(eccodes, 'codes_set') def test_budget_interpolation(self, mock_set): cube_4 = self.cube cube_4.attributes = dict(spatial_processing_type='Budget ' @@ -117,7 +117,7 @@ def test_budget_interpolation(self, mock_set): mock_set.assert_any_call(mock.sentinel.grib, "numberOfPointsUsed", 4) - @mock.patch.object(gribapi, 'grib_set') + @mock.patch.object(eccodes, 'codes_set') def test_spectral_interpolation(self, mock_set): cube_5 = self.cube cube_5.attributes = dict(spatial_processing_type='Spectral ' @@ -133,7 +133,7 @@ def test_spectral_interpolation(self, mock_set): mock_set.assert_any_call(mock.sentinel.grib, "numberOfPointsUsed", 4) - @mock.patch.object(gribapi, 'grib_set') + @mock.patch.object(eccodes, 'codes_set') def test_neighbour_budget_interpolation(self, mock_set): cube_6 = self.cube cube_6.attributes = dict(spatial_processing_type='Neighbour-budget ' diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_40.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_40.py index b6a9f81f..0f6d34e3 100644 --- a/iris_grib/tests/unit/save_rules/test_product_definition_template_40.py +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_40.py @@ -15,7 +15,7 @@ from unittest import mock from cf_units import Unit -import gribapi +import eccodes from iris.coords import DimCoord import iris.tests.stock as stock @@ -33,7 +33,7 @@ def setUp(self): self.cube.add_aux_coord(coord) self.cube.attributes['WMO_constituent_type'] = 0 - @mock.patch.object(gribapi, 'grib_set') + @mock.patch.object(eccodes, 'codes_set') def test_constituent_type(self, mock_set): cube = self.cube diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_8.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_8.py index 5b82a80c..3c539e2f 100644 --- a/iris_grib/tests/unit/save_rules/test_product_definition_template_8.py +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_8.py @@ -15,7 +15,7 @@ from unittest import mock from cf_units import Unit -import gribapi +import eccodes import numpy as np from iris.coords import CellMethod, DimCoord @@ -34,7 +34,7 @@ def setUp(self): units=Unit('days since epoch', calendar='standard')) self.cube.add_aux_coord(coord) - @mock.patch.object(gribapi, 'grib_set') + @mock.patch.object(eccodes, 'codes_set') def test_product_definition(self, mock_set): cube = self.cube cell_method = CellMethod(method='sum', coords=['time']) @@ -46,7 +46,7 @@ def test_product_definition(self, mock_set): class Test_type_of_statistical_processing(tests.IrisTest): - @mock.patch.object(gribapi, "grib_set") + @mock.patch.object(eccodes, "codes_set") def test_stats_type_min(self, mock_set): grib = None cube = iris.cube.Cube(np.array([1.0])) @@ -59,7 +59,7 @@ def test_stats_type_min(self, mock_set): product_definition_template_8(cube, grib) mock_set.assert_any_call(grib, "typeOfStatisticalProcessing", 2) - @mock.patch.object(gribapi, "grib_set") + @mock.patch.object(eccodes, "codes_set") def test_stats_type_max(self, mock_set): grib = None cube = iris.cube.Cube(np.array([1.0])) diff --git a/iris_grib/tests/unit/save_rules/test_reference_time.py b/iris_grib/tests/unit/save_rules/test_reference_time.py index 6998abcc..d5cf6197 100644 --- a/iris_grib/tests/unit/save_rules/test_reference_time.py +++ b/iris_grib/tests/unit/save_rules/test_reference_time.py @@ -11,7 +11,7 @@ from unittest import mock -import gribapi +import eccodes from iris_grib import load_cubes from iris_grib._save_rules import reference_time @@ -20,14 +20,14 @@ class Test(tests.IrisGribTest): def _test(self, cube): grib = mock.Mock() - mock_gribapi = mock.Mock(spec=gribapi) - with mock.patch('iris_grib._save_rules.gribapi', mock_gribapi): + mock_eccodes = mock.Mock(spec=eccodes) + with mock.patch('iris_grib._save_rules.eccodes', mock_eccodes): reference_time(cube, grib) - mock_gribapi.assert_has_calls( - [mock.call.grib_set_long(grib, "significanceOfReferenceTime", 1), - mock.call.grib_set_long(grib, "dataDate", '19980306'), - mock.call.grib_set_long(grib, "dataTime", '0300')]) + mock_eccodes.assert_has_calls( + [mock.call.codes_set_long(grib, "significanceOfReferenceTime", 1), + mock.call.codes_set_long(grib, "dataDate", '19980306'), + mock.call.codes_set_long(grib, "dataTime", '0300')]) @tests.skip_data def test_forecast_period(self): diff --git a/iris_grib/tests/unit/save_rules/test_set_discipline_and_parameter.py b/iris_grib/tests/unit/save_rules/test_set_discipline_and_parameter.py index 31d41a7e..83728084 100644 --- a/iris_grib/tests/unit/save_rules/test_set_discipline_and_parameter.py +++ b/iris_grib/tests/unit/save_rules/test_set_discipline_and_parameter.py @@ -27,8 +27,8 @@ def setUp(self): def _check_coding(self, cube, discipline, paramCategory, paramNumber): # Check that encoding 'cube' writes the expected phenomenon keys. - grib_set_patch = self.patch( - 'iris_grib._save_rules.gribapi.grib_set') + codes_set_patch = self.patch( + 'iris_grib._save_rules.eccodes.codes_set') mock_message = mock.sentinel.grib2_message set_discipline_and_parameter(cube, mock_message) @@ -38,7 +38,7 @@ def _check_coding(self, cube, discipline, paramCategory, paramNumber): mock.call(mock_message, "parameterCategory", paramCategory), mock.call(mock_message, "parameterNumber", paramNumber)] - self.assertEqual(grib_set_patch.call_args_list, expected_calls) + self.assertEqual(codes_set_patch.call_args_list, expected_calls) def test_unknown_phenomenon(self): cube = self.mock_cube diff --git a/iris_grib/tests/unit/save_rules/test_set_fixed_surfaces.py b/iris_grib/tests/unit/save_rules/test_set_fixed_surfaces.py index 862fd75d..aa37a62f 100644 --- a/iris_grib/tests/unit/save_rules/test_set_fixed_surfaces.py +++ b/iris_grib/tests/unit/save_rules/test_set_fixed_surfaces.py @@ -14,8 +14,8 @@ from unittest import mock -import gribapi -from gribapi import GRIB_MISSING_LONG +import eccodes +from eccodes import CODES_MISSING_LONG as GRIB_MISSING_LONG import numpy as np import iris.cube @@ -30,19 +30,19 @@ def test_bounded_altitude_feet(self): cube.add_aux_coord(iris.coords.AuxCoord( 1500.0, long_name='altitude', units='ft', bounds=np.array([1000.0, 2000.0]))) - grib = gribapi.grib_new_from_samples("GRIB2") + grib = eccodes.codes_grib_new_from_samples("GRIB2") set_fixed_surfaces(cube, grib) self.assertEqual( - gribapi.grib_get_double(grib, "scaledValueOfFirstFixedSurface"), + eccodes.codes_get_double(grib, "scaledValueOfFirstFixedSurface"), 305.0) # precise ~304.8 self.assertEqual( - gribapi.grib_get_double(grib, "scaledValueOfSecondFixedSurface"), + eccodes.codes_get_double(grib, "scaledValueOfSecondFixedSurface"), 610.0) # precise ~609.6 self.assertEqual( - gribapi.grib_get_long(grib, "typeOfFirstFixedSurface"), + eccodes.codes_get_long(grib, "typeOfFirstFixedSurface"), 102) self.assertEqual( - gribapi.grib_get_long(grib, "typeOfSecondFixedSurface"), + eccodes.codes_get_long(grib, "typeOfSecondFixedSurface"), 102) def test_theta_level(self): @@ -51,19 +51,19 @@ def test_theta_level(self): 230.0, standard_name='air_potential_temperature', units='K', attributes={'positive': 'up'}, bounds=np.array([220.0, 240.0]))) - grib = gribapi.grib_new_from_samples("GRIB2") + grib = eccodes.codes_grib_new_from_samples("GRIB2") set_fixed_surfaces(cube, grib) self.assertEqual( - gribapi.grib_get_double(grib, "scaledValueOfFirstFixedSurface"), + eccodes.codes_get_double(grib, "scaledValueOfFirstFixedSurface"), 220.0) self.assertEqual( - gribapi.grib_get_double(grib, "scaledValueOfSecondFixedSurface"), + eccodes.codes_get_double(grib, "scaledValueOfSecondFixedSurface"), 240.0) self.assertEqual( - gribapi.grib_get_long(grib, "typeOfFirstFixedSurface"), + eccodes.codes_get_long(grib, "typeOfFirstFixedSurface"), 107) self.assertEqual( - gribapi.grib_get_long(grib, "typeOfSecondFixedSurface"), + eccodes.codes_get_long(grib, "typeOfSecondFixedSurface"), 107) def test_depth(self): @@ -71,22 +71,22 @@ def test_depth(self): cube.add_aux_coord(iris.coords.AuxCoord( 1, long_name='depth', units='m', bounds=np.array([0., 2]), attributes={'positive': 'down'})) - grib = gribapi.grib_new_from_samples("GRIB2") + grib = eccodes.codes_grib_new_from_samples("GRIB2") set_fixed_surfaces(cube, grib) self.assertEqual( - gribapi.grib_get_double(grib, "scaledValueOfFirstFixedSurface"), + eccodes.codes_get_double(grib, "scaledValueOfFirstFixedSurface"), 0.) self.assertEqual( - gribapi.grib_get_double(grib, "scaledValueOfSecondFixedSurface"), + eccodes.codes_get_double(grib, "scaledValueOfSecondFixedSurface"), 2) self.assertEqual( - gribapi.grib_get_long(grib, "typeOfFirstFixedSurface"), + eccodes.codes_get_long(grib, "typeOfFirstFixedSurface"), 106) self.assertEqual( - gribapi.grib_get_long(grib, "typeOfSecondFixedSurface"), + eccodes.codes_get_long(grib, "typeOfSecondFixedSurface"), 106) - @mock.patch.object(gribapi, "grib_set") + @mock.patch.object(eccodes, "codes_set") def test_altitude_point(self, mock_set): grib = None cube = iris.cube.Cube([1, 2, 3, 4, 5]) @@ -106,7 +106,7 @@ def test_altitude_point(self, mock_set): mock_set.assert_any_call(grib, "scaledValueOfSecondFixedSurface", GRIB_MISSING_LONG) - @mock.patch.object(gribapi, "grib_set") + @mock.patch.object(eccodes, "codes_set") def test_height_point(self, mock_set): grib = None cube = iris.cube.Cube([1, 2, 3, 4, 5]) @@ -122,7 +122,7 @@ def test_height_point(self, mock_set): mock_set.assert_any_call(grib, "scaledValueOfSecondFixedSurface", GRIB_MISSING_LONG) - @mock.patch.object(gribapi, "grib_set") + @mock.patch.object(eccodes, "codes_set") def test_no_vertical(self, mock_set): grib = None cube = iris.cube.Cube([1, 2, 3, 4, 5]) diff --git a/iris_grib/tests/unit/save_rules/test_set_time_increment.py b/iris_grib/tests/unit/save_rules/test_set_time_increment.py index a6bf57b7..ec0272d4 100644 --- a/iris_grib/tests/unit/save_rules/test_set_time_increment.py +++ b/iris_grib/tests/unit/save_rules/test_set_time_increment.py @@ -14,7 +14,7 @@ from unittest import mock -import gribapi +import eccodes from iris.coords import CellMethod @@ -22,7 +22,7 @@ class Test(tests.IrisGribTest): - @mock.patch.object(gribapi, 'grib_set') + @mock.patch.object(eccodes, 'codes_set') def test_no_intervals(self, mock_set): cell_method = CellMethod('sum', 'time') set_time_increment(cell_method, mock.sentinel.grib) @@ -30,7 +30,7 @@ def test_no_intervals(self, mock_set): 'indicatorOfUnitForTimeIncrement', 255) mock_set.assert_any_call(mock.sentinel.grib, 'timeIncrement', 0) - @mock.patch.object(gribapi, 'grib_set') + @mock.patch.object(eccodes, 'codes_set') def test_area(self, mock_set): cell_method = CellMethod('sum', 'area', '25 km') set_time_increment(cell_method, mock.sentinel.grib) @@ -38,7 +38,7 @@ def test_area(self, mock_set): 'indicatorOfUnitForTimeIncrement', 255) mock_set.assert_any_call(mock.sentinel.grib, 'timeIncrement', 0) - @mock.patch.object(gribapi, 'grib_set') + @mock.patch.object(eccodes, 'codes_set') def test_multiple_intervals(self, mock_set): cell_method = CellMethod('sum', 'time', ('1 hour', '24 hour')) set_time_increment(cell_method, mock.sentinel.grib) @@ -46,7 +46,7 @@ def test_multiple_intervals(self, mock_set): 'indicatorOfUnitForTimeIncrement', 255) mock_set.assert_any_call(mock.sentinel.grib, 'timeIncrement', 0) - @mock.patch.object(gribapi, 'grib_set') + @mock.patch.object(eccodes, 'codes_set') def test_hr(self, mock_set): cell_method = CellMethod('sum', 'time', '23 hr') set_time_increment(cell_method, mock.sentinel.grib) @@ -54,7 +54,7 @@ def test_hr(self, mock_set): 'indicatorOfUnitForTimeIncrement', 1) mock_set.assert_any_call(mock.sentinel.grib, 'timeIncrement', 23) - @mock.patch.object(gribapi, 'grib_set') + @mock.patch.object(eccodes, 'codes_set') def test_hour(self, mock_set): cell_method = CellMethod('sum', 'time', '24 hour') set_time_increment(cell_method, mock.sentinel.grib) @@ -62,7 +62,7 @@ def test_hour(self, mock_set): 'indicatorOfUnitForTimeIncrement', 1) mock_set.assert_any_call(mock.sentinel.grib, 'timeIncrement', 24) - @mock.patch.object(gribapi, 'grib_set') + @mock.patch.object(eccodes, 'codes_set') def test_hours(self, mock_set): cell_method = CellMethod('sum', 'time', '25 hours') set_time_increment(cell_method, mock.sentinel.grib) @@ -70,7 +70,7 @@ def test_hours(self, mock_set): 'indicatorOfUnitForTimeIncrement', 1) mock_set.assert_any_call(mock.sentinel.grib, 'timeIncrement', 25) - @mock.patch.object(gribapi, 'grib_set') + @mock.patch.object(eccodes, 'codes_set') def test_fractional_hours(self, mock_set): cell_method = CellMethod('sum', 'time', '25.9 hours') with mock.patch('warnings.warn') as warn: diff --git a/iris_grib/tests/unit/save_rules/test_set_time_range.py b/iris_grib/tests/unit/save_rules/test_set_time_range.py index 522e3bea..cadbb58a 100644 --- a/iris_grib/tests/unit/save_rules/test_set_time_range.py +++ b/iris_grib/tests/unit/save_rules/test_set_time_range.py @@ -16,7 +16,7 @@ import warnings from cf_units import Unit -import gribapi +import eccodes from iris.coords import DimCoord @@ -47,7 +47,7 @@ def test_non_scalar(self): 'coordinate, got 2 points'): set_time_range(coord, mock.sentinel.grib) - @mock.patch.object(gribapi, 'grib_set') + @mock.patch.object(eccodes, 'codes_set') def test_hours(self, mock_set): lower = 10 upper = 20 @@ -58,7 +58,7 @@ def test_hours(self, mock_set): mock_set.assert_any_call(mock.sentinel.grib, 'lengthOfTimeRange', upper - lower) - @mock.patch.object(gribapi, 'grib_set') + @mock.patch.object(eccodes, 'codes_set') def test_days(self, mock_set): lower = 4 upper = 6 @@ -71,7 +71,7 @@ def test_days(self, mock_set): 'lengthOfTimeRange', (upper - lower) * 24) - @mock.patch.object(gribapi, 'grib_set') + @mock.patch.object(eccodes, 'codes_set') def test_fractional_hours(self, mock_set_long): lower = 10.0 upper = 20.9 diff --git a/iris_grib/tests/unit/test_GribWrapper.py b/iris_grib/tests/unit/test_GribWrapper.py index cbd0f233..48f703b7 100644 --- a/iris_grib/tests/unit/test_GribWrapper.py +++ b/iris_grib/tests/unit/test_GribWrapper.py @@ -24,7 +24,7 @@ _message_length = 1000 -def _mock_grib_get_long(grib_message, key): +def _mock_codes_get_long(grib_message, key): lookup = dict(totalLength=_message_length, numberOfValues=200, jPointsAreConsecutive=0, @@ -34,16 +34,16 @@ def _mock_grib_get_long(grib_message, key): try: result = lookup[key] except KeyError: - msg = 'Mock grib_get_long unknown key: {!r}'.format(key) + msg = 'Mock codes_get_long unknown key: {!r}'.format(key) raise AttributeError(msg) return result -def _mock_grib_get_string(grib_message, key): +def _mock_codes_get_string(grib_message, key): return grib_message -def _mock_grib_get_native_type(grib_message, key): +def _mock_codes_get_native_type(grib_message, key): result = int if key == 'gridType': result = str @@ -54,9 +54,10 @@ class Test_edition(tests.IrisGribTest): def setUp(self): self.patch('iris_grib.GribWrapper._confirm_in_scope') self.patch('iris_grib.GribWrapper._compute_extra_keys') - self.patch('gribapi.grib_get_long', _mock_grib_get_long) - self.patch('gribapi.grib_get_string', _mock_grib_get_string) - self.patch('gribapi.grib_get_native_type', _mock_grib_get_native_type) + self.patch('eccodes.codes_get_long', _mock_codes_get_long) + self.patch('eccodes.codes_get_string', _mock_codes_get_string) + self.patch('eccodes.codes_get_native_type', + _mock_codes_get_native_type) self.tell = mock.Mock(side_effect=[_message_length]) def test_not_edition_1(self): @@ -64,7 +65,7 @@ def func(grib_message, key): return 2 emsg = "GRIB edition 2 is not supported by 'GribWrapper'" - with mock.patch('gribapi.grib_get_long', func): + with mock.patch('eccodes.codes_get_long', func): with self.assertRaisesRegex(TranslationError, emsg): GribWrapper(None) @@ -94,15 +95,16 @@ class Test_deferred_proxy_args(tests.IrisTest): def setUp(self): self.patch('iris_grib.GribWrapper._confirm_in_scope') self.patch('iris_grib.GribWrapper._compute_extra_keys') - self.patch('gribapi.grib_get_long', _mock_grib_get_long) - self.patch('gribapi.grib_get_string', _mock_grib_get_string) - self.patch('gribapi.grib_get_native_type', _mock_grib_get_native_type) + self.patch('eccodes.codes_get_long', _mock_codes_get_long) + self.patch('eccodes.codes_get_string', _mock_codes_get_string) + self.patch('eccodes.codes_get_native_type', + _mock_codes_get_native_type) tell_tale = np.arange(1, 5) * _message_length self.expected = tell_tale - _message_length self.grib_fh = mock.Mock(tell=mock.Mock(side_effect=tell_tale)) self.dtype = np.float64 self.path = self.grib_fh.name - self.lookup = _mock_grib_get_long + self.lookup = _mock_codes_get_long def test_regular_proxy_args(self): grib_message = 'regular_ll' diff --git a/iris_grib/tests/unit/test_save_messages.py b/iris_grib/tests/unit/test_save_messages.py index 974647f2..4b42272b 100644 --- a/iris_grib/tests/unit/test_save_messages.py +++ b/iris_grib/tests/unit/test_save_messages.py @@ -9,7 +9,7 @@ # importing anything else. import iris_grib.tests as tests -import gribapi +import eccodes from unittest import mock import iris_grib @@ -18,7 +18,7 @@ class TestSaveMessages(tests.IrisGribTest): def setUp(self): # Create a test object to stand in for a real PPField. - self.grib_message = gribapi.grib_new_from_samples("GRIB2") + self.grib_message = eccodes.codes_grib_new_from_samples("GRIB2") def test_save(self): m = mock.mock_open() From e619d0d64150d69547a1a2cc1f6f7c7d94ae8bfd Mon Sep 17 00:00:00 2001 From: Bill Little Date: Thu, 30 Mar 2023 10:45:28 +0100 Subject: [PATCH 219/583] use workflows version for refrech-lockfiles ci (#331) --- .github/workflows/refresh-lockfiles.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 7f21e653..e4a6c80d 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@main + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2023.03.0 secrets: inherit From fd82f16c3be5bf7a249b81712209157b1c8c5b6b Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Thu, 30 Mar 2023 11:02:05 +0100 Subject: [PATCH 220/583] Updated environment lockfiles (#332) Co-authored-by: Lockfile bot --- requirements/locks/py38-linux-64.lock | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/requirements/locks/py38-linux-64.lock b/requirements/locks/py38-linux-64.lock index 81142d55..105503ae 100644 --- a/requirements/locks/py38-linux-64.lock +++ b/requirements/locks/py38-linux-64.lock @@ -30,12 +30,14 @@ https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-2.1.5.1-h0b41bf4_0 https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.0-h7f98852_0.tar.bz2#39b1328babf85c7c3a61636d9cd50206 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.21-pthreads_h78a6416_3.tar.bz2#8c5963a49b6035c40646a763293fbb35 -https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.32.1-h7f98852_1000.tar.bz2#772d69f030955d9646d3d0eaf21d859d +https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.0-h0b41bf4_0.conda#0d4a7508d8c6c65314f2b9c1f56ad408 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h166bdaf_4.tar.bz2#f3f9de449d32ca9b9c66a22863c96f41 +https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.3-h27087fc_1.tar.bz2#4acfc691e64342b9dae57cf2adc63238 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.1.0-h0b41bf4_0.conda#2d833be81a21128e317325a01326d36f https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 +https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-h9fff704_0.conda#e6d228cd0bb74a51dd18f5bfce0b4115 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.9-h7f98852_0.tar.bz2#bf6f803a544f26ebbdc3bfff272eb179 @@ -62,6 +64,7 @@ https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-hc3e0081_0.tar.bz2#d4c341e0379c31e9e781d4f204726867 https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-h3eb15da_6.conda#6b63daed8feeca47be78f323e793d555 +https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.3-hafa529b_0.conda#bcf0664a2dbbbb86cbd4c1e6ff10ddd6 https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_8.tar.bz2#e5613f2bc717e9945840ff474419b8e4 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-hca18f0e_1.conda#e1232042de76d24539a436d37597eb06 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.20.1-h81ceb04_0.conda#89a41adce7106749573d883b2f657d78 @@ -79,7 +82,7 @@ https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-2.1.1-pyhd8ed1a https://conda.anaconda.org/conda-forge/noarch/click-8.1.3-unix_pyhd8ed1ab_2.tar.bz2#20e4087407c7cb04a40817114b333dbf https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.1-pyhd8ed1ab_0.conda#b325bfc4cff7d7f8a868f1f7ecc4ed16 https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb -https://conda.anaconda.org/conda-forge/noarch/filelock-3.10.4-pyhd8ed1ab_0.conda#22b444d0094cacef08e2dd216b9b2b0e +https://conda.anaconda.org/conda-forge/noarch/filelock-3.10.7-pyhd8ed1ab_0.conda#6a0601f92717ce555d79d83d693b6fa3 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.2-pyhd8ed1ab_0.tar.bz2#c2a60dd9f1210b8ee2037f7d0ec6251a https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.3.0-pyhd8ed1ab_1.conda#0db48a2f5a68e28e5af8d3df276f2255 https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed @@ -101,7 +104,7 @@ https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#9 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.2.0-py38h1de0b5d_0.conda#7db73572d4f7e10a759bad609a228ad0 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py38h0a891b7_5.tar.bz2#0856c59f9ddb710c640dc0428d66b1b7 -https://conda.anaconda.org/conda-forge/noarch/setuptools-67.6.0-pyhd8ed1ab_0.conda#e18ed61c37145bb9b48d1d98801960f7 +https://conda.anaconda.org/conda-forge/noarch/setuptools-67.6.1-pyhd8ed1ab_0.conda#6c443cccff3daa3d83b2b807b0a298ce https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.5.0-pyha770c72_0.conda#43e7d9e50261fb11deb76e17d8431aac @@ -114,7 +117,7 @@ https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py38h4a40e3a_3.conda https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py38h26c90d9_1.tar.bz2#dcc025a7bb54374979c500c2e161fac9 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.0.7-py38hfbd4bf9_0.conda#638537863b298151635c05c762a997ab https://conda.anaconda.org/conda-forge/linux-64/curl-7.88.1-hdc1c0ab_1.conda#2016c398f234cfa354ea704c6731b5d5 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.39.2-py38h1de0b5d_0.conda#affec6061f9a2d056db74561477a62b5 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.39.3-py38h1de0b5d_0.conda#34449fe6e3949956fac2236c9a9a3d3b https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.0-nompi_hb72d44e_103.conda#975973a4350ab45ff1981fe535a12af5 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.1.0-pyha770c72_0.conda#30b3127c385ca2ed5ef87f3d53d466bc https://conda.anaconda.org/conda-forge/noarch/importlib_resources-5.12.0-pyhd8ed1ab_0.conda#e5fd2260a231ee63b6969f4801082f2b @@ -123,25 +126,25 @@ https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py38h26c90d9_1008. https://conda.anaconda.org/conda-forge/noarch/partd-1.3.0-pyhd8ed1ab_0.tar.bz2#af8c82d121e63082926062d61d9abb54 https://conda.anaconda.org/conda-forge/linux-64/pillow-9.4.0-py38h961100d_2.conda#26a5eb5d9f097e5011d54aa5cc1571c8 https://conda.anaconda.org/conda-forge/noarch/pip-23.0.1-pyhd8ed1ab_0.conda#8025ca83b8ba5430b640b83917c2a6f7 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.1.1-h8ffa02c_2.conda#c264aea0e16bba26afa0a0940e954492 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.2.0-h8ffa02c_0.conda#8b9dcfabec5c6bcac98e89889fffa64e 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/shapely-2.0.1-py38haaa171b_1.conda#fdd08c011257c5e4727cca36f04af74f https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.5.0-hd8ed1ab_0.conda#b3c594fde1a80a1fc3eb9cc4a5dfe392 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py38h0a891b7_1005.tar.bz2#e99e08812dfff30fdd17b3f8838e2759 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.1.1-py38h26c90d9_2.tar.bz2#0ea017e84efe45badce6c32f274dbf8e -https://conda.anaconda.org/conda-forge/linux-64/cryptography-39.0.2-py38h3d167d9_0.conda#6c60377f8bfa325a2cd80d603627a613 +https://conda.anaconda.org/conda-forge/linux-64/cryptography-40.0.1-py38h3d167d9_0.conda#c046be0e2eaf1f4076ff5633c538ee71 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-h9c3ff4c_1.tar.bz2#1192066d1296de9b492175a4cf43fe8a https://conda.anaconda.org/conda-forge/noarch/importlib-resources-5.12.0-pyhd8ed1ab_0.conda#3544c818f0720c89eb16ae6940ab440b https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.1.0-hd8ed1ab_0.conda#90bab1d97fdb6bb40c8e00207bf222dc -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_hf3f8848_102.conda#a13f03ed04521e5dc6bde90578ff4dd0 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.1.1-pyhd8ed1ab_0.conda#1d1a27f637808c76dd83e3f469aa6f7e -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.4.1-py38h58d5fe2_1.conda#5286eaec7e93586e4ae05e7d658cd3e2 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_hf3f8848_103.conda#c1014116efef918f438a88872ce46b4c +https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.2.0-pyhd8ed1ab_0.conda#f10c2cf447ca96f12a326b83c75b8e33 +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.5.0-py38h2f62729_1.conda#00785fd9270728fbfb82c80fc0229dc6 https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.3.2-pyhd8ed1ab_0.conda#a3552db3a43810551cc93f9a4272380e https://conda.anaconda.org/conda-forge/linux-64/jasper-4.0.0-h32699f2_1.conda#fdde5424ecef5f7ad310b4242229291c https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py38hd6c3c57_0.conda#3b8ba76acae09fbd4b2247c4ee4c0324 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.3-nompi_py38hd31e641_102.conda#1631559ac87f3f0742a8abd0ecd32e2d -https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.1.0-pyhd8ed1ab_0.conda#3a5b9d88c369e7960e3dde3229066908 +https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.1.1-pyhd8ed1ab_0.conda#0b34aa3ab7e7ccb1765a03dd9ed29938 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.29.0-h95353b9_3.conda#6d038ad12516161a8a20d3ec8b0090d3 https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.15-pyhd8ed1ab_0.conda#27db656619a55d727eaf5a6ece3d2fd6 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.5.1-py38h7e4f40d_0.conda#b12c8a72aef587f134f5ff048da0ed6f From e10442b93d351752d36ac94ee7f110ef2b55c27d Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 3 Apr 2023 12:36:31 +0100 Subject: [PATCH 221/583] Updated environment lockfiles (#333) Co-authored-by: Lockfile bot --- requirements/locks/py38-linux-64.lock | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/requirements/locks/py38-linux-64.lock b/requirements/locks/py38-linux-64.lock index 105503ae..b9273f7b 100644 --- a/requirements/locks/py38-linux-64.lock +++ b/requirements/locks/py38-linux-64.lock @@ -14,7 +14,6 @@ https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2# https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-12.2.0-h65d4601_19.tar.bz2#e4c94f80aef025c17ab0828cd85ef535 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.5.0-h27087fc_0.tar.bz2#c4fbad8d4bddeb3c085f18cbf97fbfad https://conda.anaconda.org/conda-forge/linux-64/geos-3.11.2-hcb278e6_0.conda#3b8e364995e3575e57960d29c1e5ab14 https://conda.anaconda.org/conda-forge/linux-64/icu-72.1-hcb278e6_0.conda#7c8d20d847bb45f56bd941578fcfa146 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 @@ -23,6 +22,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libaec-1.0.6-hcb278e6_1.conda#0f https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.0.9-h166bdaf_8.tar.bz2#9194c9bf9428035a05352d031462eae4 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.18-h0b41bf4_0.conda#6aa9c9de5542ecb07fdda9ca626252d8 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h516909a_1.tar.bz2#6f8720dff19e17ce5d48cfe7f3d2f0a3 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.5.0-hcb278e6_1.conda#6305a3dd2752c76335295da4e581f2fd https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-he1b5a44_1001.tar.bz2#8208602aec4826053c116552369a394c https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-h166bdaf_0.tar.bz2#b62b52da46c39ee2bc3c162ac7f1804d @@ -47,6 +47,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.1-h0b41bf4_0.conda#e9c3bcf0e0c719431abec8ca447eee27 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae +https://conda.anaconda.org/conda-forge/linux-64/expat-2.5.0-hcb278e6_1.conda#8b9b5aca60558d02ddaa09d599e55920 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h501b40f_6.conda#c3e9338e15d90106f467377017352b97 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-16_linux64_openblas.tar.bz2#d9b7a8639171f6c6fa0a983edabcfe2b https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.0.9-h166bdaf_8.tar.bz2#4ae4d7795d33e02bd20f6b23d91caf82 @@ -61,7 +62,6 @@ https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.10.3-hfdac1af_6.conda# https://conda.anaconda.org/conda-forge/linux-64/libzip-1.9.2-hc929e4a_1.tar.bz2#5b122b50e738c4be5c3f2899f010d7cf https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 -https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-hc3e0081_0.tar.bz2#d4c341e0379c31e9e781d4f204726867 https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-h3eb15da_6.conda#6b63daed8feeca47be78f323e793d555 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.3-hafa529b_0.conda#bcf0664a2dbbbb86cbd4c1e6ff10ddd6 @@ -73,12 +73,13 @@ https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-16_linux64_openb https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.5.0-ha587672_6.conda#4e5ee4b062c21519efbee7e2ae608748 https://conda.anaconda.org/conda-forge/linux-64/python-3.8.16-he550d4f_1_cpython.conda#9de84cccfbc5f8350a3667bb6ef6fc30 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.40.0-h4ff8645_0.tar.bz2#bb11803129cbbb53ed56f9506ff74145 +https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-hc3e0081_0.tar.bz2#d4c341e0379c31e9e781d4f204726867 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.4-h0b41bf4_0.conda#ea8fbfeb976ac49cbeb594e985393514 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/attrs-22.2.0-pyh71513ae_0.conda#8b76db7818a4e401ed4486c4c1635cd9 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_8.tar.bz2#2ff08978892a3e8b954397c461f18418 https://conda.anaconda.org/conda-forge/noarch/certifi-2022.12.7-pyhd8ed1ab_0.conda#fb9addc3db06e56abe03e0e9f21a63e6 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-2.1.1-pyhd8ed1ab_0.tar.bz2#c1d5b294fbf9a795dec349a6f4d8be8e +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.1.0-pyhd8ed1ab_0.conda#7fcff9f6f123696e940bda77bd4d6551 https://conda.anaconda.org/conda-forge/noarch/click-8.1.3-unix_pyhd8ed1ab_2.tar.bz2#20e4087407c7cb04a40817114b333dbf https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.1-pyhd8ed1ab_0.conda#b325bfc4cff7d7f8a868f1f7ecc4ed16 https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb @@ -148,7 +149,7 @@ https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.1.1-pyhd8ed1ab_0.cond https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.29.0-h95353b9_3.conda#6d038ad12516161a8a20d3ec8b0090d3 https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.15-pyhd8ed1ab_0.conda#27db656619a55d727eaf5a6ece3d2fd6 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.5.1-py38h7e4f40d_0.conda#b12c8a72aef587f134f5ff048da0ed6f -https://conda.anaconda.org/conda-forge/noarch/requests-2.28.2-pyhd8ed1ab_0.conda#11d178fc55199482ee48d6812ea83983 +https://conda.anaconda.org/conda-forge/noarch/requests-2.28.2-pyhd8ed1ab_1.conda#3bfbd6ead1d7299ed46dab3a7bf0bc8c https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyha770c72_3.conda#5936894aade8240c867d292aa0d980c6 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.10.1-py38h10c12cc_0.conda#1cbc47bb9a600ce4a49d8da797d375bf https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.21.1-py38h1abf878_1.conda#4d102cd1e6db10034a6c97df4444833f From 93eb3a279f78474d7f6bb44d7f557d466a1a8e96 Mon Sep 17 00:00:00 2001 From: Martin Yeo <40734014+trexfeathers@users.noreply.github.com> Date: Thu, 6 Jul 2023 15:37:49 +0100 Subject: [PATCH 222/583] NEP 29 changes - py39 minimum (#339) * NEP 29 changes - py3.9/10/11 * Updated CML files, from SciTools/iris#5235 --- .cirrus.yml | 26 ++- docs/ref/release_notes.rst | 40 +++-- .../callback/TestCallbacks/load_callback.cml | 56 +++--- .../grid_complex_spatial_differencing.cml | 27 +-- .../data_section/TestGDT30/lambert.cml | 17 +- .../data_section/TestGDT40/reduced.cml | 14 +- .../data_section/TestGDT40/regular.cml | 13 +- .../data_section/TestImport/gdt1.cml | 10 +- .../TestImport/gdt90_with_bitmap.cml | 14 +- .../sample_file_loads/3_layer.cml | 80 +++++---- .../sample_file_loads/earth_shape_0.cml | 56 +++--- .../sample_file_loads/earth_shape_1.cml | 56 +++--- .../sample_file_loads/earth_shape_2.cml | 56 +++--- .../sample_file_loads/earth_shape_3.cml | 56 +++--- .../sample_file_loads/earth_shape_4.cml | 56 +++--- .../sample_file_loads/earth_shape_5.cml | 56 +++--- .../sample_file_loads/earth_shape_6.cml | 56 +++--- .../sample_file_loads/earth_shape_7.cml | 56 +++--- .../sample_file_loads/earth_shape_grib1.cml | 11 +- .../sample_file_loads/ineg_jneg.cml | 57 +++--- .../sample_file_loads/ineg_jpos.cml | 57 +++--- .../sample_file_loads/ipos_jneg.cml | 56 +++--- .../sample_file_loads/ipos_jpos.cml | 56 +++--- .../sample_file_loads/lambert_grib1.cml | 15 +- .../sample_file_loads/lambert_grib2.cml | 17 +- .../missing_values_grib2.cml | 27 +-- .../sample_file_loads/polar_stereo_grib1.cml | 16 +- .../sample_file_loads/reduced_gg_grib2.cml | 14 +- .../sample_file_loads/reduced_ll_grib1.cml | 4 +- .../sample_file_loads/regular_gg_grib1.cml | 11 +- .../sample_file_loads/regular_gg_grib2.cml | 13 +- .../sample_file_loads/rotated.cml | 10 +- .../sample_file_loads/time_bound_grib1.cml | 13 +- .../sample_file_loads/time_bound_grib2.cml | 56 +++--- .../NAMEII/0_TRACER_AIR_CONCENTRATION.cml | 12 +- .../name_grib/NAMEII/1_TRACER_DOSAGE.cml | 12 +- .../NAMEII/3_TRACER_DRY_DEPOSITION.cml | 10 +- .../NAMEII/4_TRACER_TOTAL_DEPOSITION.cml | 10 +- .../NAMEIII/0_TRACER_AIR_CONCENTRATION.cml | 10 +- .../NAMEIII/1_TRACER_AIR_CONCENTRATION.cml | 10 +- .../NAMEIII/2_TRACER_DRY_DEPOSITION.cml | 10 +- .../NAMEIII/3_TRACER_WET_DEPOSITION.cml | 10 +- .../name_grib/NAMEIII/4_TRACER_DEPOSITION.cml | 10 +- .../load_cubes/load_cubes/reduced_raw.cml | 14 +- noxfile.py | 2 +- requirements/iris-grib.yml | 2 +- requirements/locks/py310-linux-64.lock | 154 ++++++++++++++++ requirements/locks/py311-linux-64.lock | 153 ++++++++++++++++ ...{py38-linux-64.lock => py39-linux-64.lock} | 168 +++++++++--------- requirements/py310.yml | 25 +++ requirements/py311.yml | 25 +++ requirements/{py38.yml => py39.yml} | 2 +- requirements/readthedocs.yml | 2 +- setup.py | 4 +- 54 files changed, 1149 insertions(+), 674 deletions(-) create mode 100644 requirements/locks/py310-linux-64.lock create mode 100644 requirements/locks/py311-linux-64.lock rename requirements/locks/{py38-linux-64.lock => py39-linux-64.lock} (55%) create mode 100644 requirements/py310.yml create mode 100644 requirements/py311.yml rename requirements/{py38.yml => py39.yml} (94%) diff --git a/.cirrus.yml b/.cirrus.yml index 203ed889..ae52df1d 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -11,7 +11,7 @@ # Global defaults. # container: - image: python:3.8 + image: python:3.11 cpu: 2 memory: 4G @@ -33,7 +33,7 @@ env: # # Linting -# [2021-03-01] jamesp: Currently not black compliant. +# [2021-03-01] jamesp: Currently not black compliant. # GitHub issue open #251 lint_task: auto_cancellation: true @@ -62,7 +62,7 @@ linux_task_template: &LINUX_TASK_TEMPLATE container: image: gcc:latest cpu: 6 - memory: 8G + memory: 8G conda_cache: folder: ${HOME}/miniconda fingerprint_script: @@ -93,17 +93,25 @@ linux_task_template: &LINUX_TASK_TEMPLATE - wget --quiet https://github.com/SciTools/iris-test-data/archive/v${IRIS_TEST_DATA_REF}.zip -O iris-test-data.zip - unzip -q iris-test-data.zip - mv iris-test-data-$(echo "${IRIS_TEST_DATA_REF}" | sed "s/^v//") ${IRIS_TEST_DATA_DIR} - + tests_task: matrix: - - name: "${CIRRUS_OS} tests: iris=repo-main python=3.8" + - name: "${CIRRUS_OS} tests: iris=conda-release python=3.9" env: - PY_VER: 3.8 - IRIS_SOURCE: "source" - - name: "${CIRRUS_OS} tests: iris=conda-release python=3.8" + PY_VER: 3.9 + IRIS_SOURCE: "conda-forge" + - name: "${CIRRUS_OS} tests: iris=conda-release python=3.10" env: - PY_VER: 3.8 + PY_VER: 3.10 IRIS_SOURCE: "conda-forge" + - name: "${CIRRUS_OS} tests: iris=conda-release python=3.11" + env: + PY_VER: 3.11 + IRIS_SOURCE: "conda-forge" + - name: "${CIRRUS_OS} tests: iris=repo-main python=3.11" + env: + PY_VER: 3.11 + IRIS_SOURCE: "source" << : *LINUX_TASK_TEMPLATE tests_script: diff --git a/docs/ref/release_notes.rst b/docs/ref/release_notes.rst index a200bb12..b3d98cfc 100644 --- a/docs/ref/release_notes.rst +++ b/docs/ref/release_notes.rst @@ -10,17 +10,21 @@ What's new in iris-grib v0.19.0 Bugs Fixed ^^^^^^^^^^ -* `@lbdreyer `_ and - `@pp-mo `_ (reviewer) modified the GRIB1 loading - code so that it no longer assumes a spherical Earth with radius of 6371229 m +* `@lbdreyer `_ and + `@pp-mo `_ (reviewer) modified the GRIB1 loading + code so that it no longer assumes a spherical Earth with radius of 6371229 m and instead uses the resolutionAndComponentFlag to determine the shape of the - Earth. This can either be a spherical Earth with radius of 6367470 m or an + Earth. This can either be a spherical Earth with radius of 6367470 m or an oblate spheroid, the latter of which is not supported. Note that this change - in Earth's radius will result in a different coordinate system and may also + in Earth's radius will result in a different coordinate system and may also affect the coordinate values. `(PR#316) `_ +Dependencies +^^^^^^^^^^^^ +* now requires Python version >= 3.9 + What's new in iris-grib v0.18.0 ------------------------------- @@ -30,11 +34,11 @@ What's new in iris-grib v0.18.0 Bugs Fixed ^^^^^^^^^^ -* `@lbdreyer `_ made various updates to allow - iris-grib to work with the latest versions of +* `@lbdreyer `_ made various updates to allow + iris-grib to work with the latest versions of `iris `_, `cf-units `_, - `ecCodes `_ and + `ecCodes `_ and `cartopy `_, including casting the usage of :meth:`cf_units.Unit.date2num` as float. setting and setting the values of some missing keys using ``gribapi.GRIB_MISSING_LONG``. @@ -49,7 +53,7 @@ Dependencies Internal ^^^^^^^^ * `@TomDufall `_ updated the code so that it was - `flake8 `_ compliant and enabled flake8 + `flake8 `_ compliant and enabled flake8 checks to the CI. `(PR#271) `_ @@ -64,7 +68,7 @@ Bugs Fixed ^^^^^^^^^^ * `@TomDufall `_ removed the empty slice - handling (originally added in v0.15.1) as this used + handling (originally added in v0.15.1) as this used iris.util._array_slice_ifempty which was removed in Iris v3.0.2 and is no longer necessary. `(PR#270) `_ @@ -88,12 +92,12 @@ What's new in iris-grib v0.17 Features ^^^^^^^^ -* `@m1dr `_ added support for GRIB regulation 92.1.8 +* `@m1dr `_ added support for GRIB regulation 92.1.8 for loading GRIB files where the longitude increment is not given. `(PR#261) `_ -* `@lbdreyer `_ added support for loading grid - point and spectral data with CCSDS recommended lossless compression, i.e. +* `@lbdreyer `_ added support for loading grid + point and spectral data with CCSDS recommended lossless compression, i.e. data representation template 42. `(PR#264) `_ @@ -153,7 +157,7 @@ Bugs Fixed * `@pp-mo `_ fixed loading of grid definition template 3.90, "Space view perspective or orthographic grid", which was **broken since Iris 2.3**. This now produces data with an iris - `Geostationary `_ + `Geostationary `_ coordinate system. Prior to Iris 2.3, what is now the Iris 'Geostationary' class was (incorrectly) named "VerticalPerspective" : When that was `corrected in Iris 2.3 `_ , it @@ -161,7 +165,7 @@ Bugs Fixed assigned the "new-style" Iris `VerticalPerspective `_ coordinate system, equivalent to the Cartopy - `NearsidePerspective `_ + `NearsidePerspective `_ and Proj `"nsper" `_ . The plotting behaviour of this is now **the same again as before Iris 2.3** : @@ -270,8 +274,8 @@ Features Bug Fixes ^^^^^^^^^ -* Reverted a bug that was fixed in v0.13 related to loading hybrid pressure - levels. It was agreed that the initial behaviour was correct +* Reverted a bug that was fixed in v0.13 related to loading hybrid pressure + levels. It was agreed that the initial behaviour was correct Dependencies ^^^^^^^^^^^^ @@ -338,7 +342,7 @@ Bug Fixes ^^^^^^^^^ * Fixed a bug with loading data on Hybrid Pressure levels (surface types 105 - and 119 in code table 4.5). + and 119 in code table 4.5). Previously, *all* hybrid coordinate values, in both 'level_pressure' and 'sigma' coordinates, were loaded from the next level up, i.e. (model_level_number + 1). diff --git a/iris_grib/tests/results/integration/iris_integration/callback/TestCallbacks/load_callback.cml b/iris_grib/tests/results/integration/iris_integration/callback/TestCallbacks/load_callback.cml index 9ca506d6..77275cf1 100644 --- a/iris_grib/tests/results/integration/iris_integration/callback/TestCallbacks/load_callback.cml +++ b/iris_grib/tests/results/integration/iris_integration/callback/TestCallbacks/load_callback.cml @@ -9,45 +9,51 @@ - + - + - + - + - + - + diff --git a/iris_grib/tests/results/integration/load_convert/data_section/TestDRT3/grid_complex_spatial_differencing.cml b/iris_grib/tests/results/integration/load_convert/data_section/TestDRT3/grid_complex_spatial_differencing.cml index 5b2df9cb..b4335f91 100644 --- a/iris_grib/tests/results/integration/load_convert/data_section/TestDRT3/grid_complex_spatial_differencing.cml +++ b/iris_grib/tests/results/integration/load_convert/data_section/TestDRT3/grid_complex_spatial_differencing.cml @@ -9,29 +9,30 @@ - + - + - + - + diff --git a/iris_grib/tests/results/integration/load_convert/data_section/TestGDT30/lambert.cml b/iris_grib/tests/results/integration/load_convert/data_section/TestGDT30/lambert.cml index d540797f..b0033869 100644 --- a/iris_grib/tests/results/integration/load_convert/data_section/TestGDT30/lambert.cml +++ b/iris_grib/tests/results/integration/load_convert/data_section/TestGDT30/lambert.cml @@ -9,26 +9,27 @@ - + - + - + - + - + diff --git a/iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/reduced.cml b/iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/reduced.cml index 97cd48db..f497934b 100644 --- a/iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/reduced.cml +++ b/iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/reduced.cml @@ -10,19 +10,19 @@ - + - + - + - + @@ -34,10 +34,10 @@ - + - + diff --git a/iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/regular.cml b/iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/regular.cml index 899e7c1a..94d6a732 100644 --- a/iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/regular.cml +++ b/iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/regular.cml @@ -9,24 +9,25 @@ - + - + - + - + - + diff --git a/iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt1.cml b/iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt1.cml index f1fc667a..b5d42292 100644 --- a/iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt1.cml +++ b/iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt1.cml @@ -9,25 +9,25 @@ - + + 19.199289, 19.309287, 19.419285]" shape="(360,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float64"> + 391.886383, 391.996377, 392.106371]" shape="(600,)" standard_name="grid_longitude" units="Unit('degrees')" value_type="float64"> - + - + diff --git a/iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt90_with_bitmap.cml b/iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt90_with_bitmap.cml index 6abba28a..c1a87056 100644 --- a/iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt90_with_bitmap.cml +++ b/iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt90_with_bitmap.cml @@ -9,16 +9,14 @@ - + - + @@ -29,10 +27,10 @@ - + - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/3_layer.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/3_layer.cml index d7dd8851..d1ea768e 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/3_layer.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/3_layer.cml @@ -9,25 +9,25 @@ - + + 19.199289, 19.309287, 19.419285]" shape="(360,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float64"> + 391.886383, 391.996377, 392.106371]" shape="(600,)" standard_name="grid_longitude" units="Unit('degrees')" value_type="float64"> - + - + @@ -39,45 +39,51 @@ - + - + - + - + - + - + @@ -93,28 +99,28 @@ - + - + - + + 364.559641, 364.59564 , 364.631639]" shape="(288,)" standard_name="grid_longitude" units="Unit('degrees')" value_type="float64"> - + - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_0.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_0.cml index d7dc7e27..a8227f04 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_0.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_0.cml @@ -6,45 +6,51 @@ - + - + - + - + - + - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_1.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_1.cml index 3db83ea9..a8a5c0b4 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_1.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_1.cml @@ -6,45 +6,51 @@ - + - + - + - + - + - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_2.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_2.cml index 783291a0..881c8480 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_2.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_2.cml @@ -6,45 +6,51 @@ - + - + - + - + - + - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_3.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_3.cml index c086c34a..8e11eac3 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_3.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_3.cml @@ -6,45 +6,51 @@ - + - + - + - + - + - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_4.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_4.cml index 3759b3c3..1aaa91b1 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_4.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_4.cml @@ -6,45 +6,51 @@ - + - + - + - + - + - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_5.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_5.cml index c2e3cfa6..07900456 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_5.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_5.cml @@ -6,45 +6,51 @@ - + - + - + - + - + - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_6.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_6.cml index c09149c3..294049a1 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_6.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_6.cml @@ -6,45 +6,51 @@ - + - + - + - + - + - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_7.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_7.cml index 1dd59645..7da7934f 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_7.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_7.cml @@ -6,45 +6,51 @@ - + - + - + - + - + - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_grib1.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_grib1.cml index eeab2992..e323b841 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_grib1.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_grib1.cml @@ -6,24 +6,25 @@ - + - + - + - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/ineg_jneg.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/ineg_jneg.cml index c21bb515..45fb86c7 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/ineg_jneg.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/ineg_jneg.cml @@ -6,45 +6,52 @@ - + - + - + - + - + - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/ineg_jpos.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/ineg_jpos.cml index 93305eb9..3f02eeea 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/ineg_jpos.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/ineg_jpos.cml @@ -6,45 +6,52 @@ - + - + - + - + - + - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/ipos_jneg.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/ipos_jneg.cml index d7dc7e27..a8227f04 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/ipos_jneg.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/ipos_jneg.cml @@ -6,45 +6,51 @@ - + - + - + - + - + - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/ipos_jpos.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/ipos_jpos.cml index b5a5dce2..2e2015f3 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/ipos_jpos.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/ipos_jpos.cml @@ -6,45 +6,51 @@ - + - + - + - + - + - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib1.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib1.cml index 9f002e3d..32b73ff7 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib1.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib1.cml @@ -13,23 +13,24 @@ - + - + - + - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib2.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib2.cml index 212d670f..45e18f80 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib2.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib2.cml @@ -9,26 +9,27 @@ - + - + - + - + - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/missing_values_grib2.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/missing_values_grib2.cml index dbaf177f..60d1dc9b 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/missing_values_grib2.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/missing_values_grib2.cml @@ -9,29 +9,30 @@ - + - + - + - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/polar_stereo_grib1.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/polar_stereo_grib1.cml index 427b5db6..c590e237 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/polar_stereo_grib1.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/polar_stereo_grib1.cml @@ -3,25 +3,27 @@ - + - + - + - + - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_gg_grib2.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_gg_grib2.cml index a0a32bfb..cecb3c6a 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_gg_grib2.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_gg_grib2.cml @@ -10,19 +10,19 @@ - + - + - + - + @@ -34,10 +34,10 @@ - + - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_ll_grib1.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_ll_grib1.cml index ebb87124..095e9d2f 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_ll_grib1.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_ll_grib1.cml @@ -6,13 +6,13 @@ - + - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/regular_gg_grib1.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/regular_gg_grib1.cml index 102918f0..8b811c4f 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/regular_gg_grib1.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/regular_gg_grib1.cml @@ -6,24 +6,25 @@ - + - + - + - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/regular_gg_grib2.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/regular_gg_grib2.cml index f51cddff..8cb2fdfe 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/regular_gg_grib2.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/regular_gg_grib2.cml @@ -9,24 +9,25 @@ - + - + - + - + - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/rotated.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/rotated.cml index 28c5d834..abb27107 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/rotated.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/rotated.cml @@ -6,23 +6,25 @@ - + - + - + - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_bound_grib1.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_bound_grib1.cml index 6dbb1f63..023f0f62 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_bound_grib1.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_bound_grib1.cml @@ -3,24 +3,25 @@ - + - + - + - + - + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_bound_grib2.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_bound_grib2.cml index d7dc7e27..a8227f04 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_bound_grib2.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_bound_grib2.cml @@ -6,45 +6,51 @@ - + - + - + - + - + - + diff --git a/iris_grib/tests/results/integration/name_grib/NAMEII/0_TRACER_AIR_CONCENTRATION.cml b/iris_grib/tests/results/integration/name_grib/NAMEII/0_TRACER_AIR_CONCENTRATION.cml index 9a4c1d4f..54ad7c8b 100644 --- a/iris_grib/tests/results/integration/name_grib/NAMEII/0_TRACER_AIR_CONCENTRATION.cml +++ b/iris_grib/tests/results/integration/name_grib/NAMEII/0_TRACER_AIR_CONCENTRATION.cml @@ -6,10 +6,10 @@ - + - + @@ -17,18 +17,18 @@ + 52.58609 , 52.587196]" shape="(200,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"> - + - + diff --git a/iris_grib/tests/results/integration/name_grib/NAMEII/1_TRACER_DOSAGE.cml b/iris_grib/tests/results/integration/name_grib/NAMEII/1_TRACER_DOSAGE.cml index e950bcf0..4d2ab1e4 100644 --- a/iris_grib/tests/results/integration/name_grib/NAMEII/1_TRACER_DOSAGE.cml +++ b/iris_grib/tests/results/integration/name_grib/NAMEII/1_TRACER_DOSAGE.cml @@ -6,10 +6,10 @@ - + - + @@ -17,18 +17,18 @@ + 52.58609 , 52.587196]" shape="(200,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"> - + - + diff --git a/iris_grib/tests/results/integration/name_grib/NAMEII/3_TRACER_DRY_DEPOSITION.cml b/iris_grib/tests/results/integration/name_grib/NAMEII/3_TRACER_DRY_DEPOSITION.cml index e2b605f2..f6621d97 100644 --- a/iris_grib/tests/results/integration/name_grib/NAMEII/3_TRACER_DRY_DEPOSITION.cml +++ b/iris_grib/tests/results/integration/name_grib/NAMEII/3_TRACER_DRY_DEPOSITION.cml @@ -6,22 +6,22 @@ - + + 52.58609 , 52.587196]" shape="(200,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"> - + - + diff --git a/iris_grib/tests/results/integration/name_grib/NAMEII/4_TRACER_TOTAL_DEPOSITION.cml b/iris_grib/tests/results/integration/name_grib/NAMEII/4_TRACER_TOTAL_DEPOSITION.cml index e2b605f2..f6621d97 100644 --- a/iris_grib/tests/results/integration/name_grib/NAMEII/4_TRACER_TOTAL_DEPOSITION.cml +++ b/iris_grib/tests/results/integration/name_grib/NAMEII/4_TRACER_TOTAL_DEPOSITION.cml @@ -6,22 +6,22 @@ - + + 52.58609 , 52.587196]" shape="(200,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"> - + - + diff --git a/iris_grib/tests/results/integration/name_grib/NAMEIII/0_TRACER_AIR_CONCENTRATION.cml b/iris_grib/tests/results/integration/name_grib/NAMEIII/0_TRACER_AIR_CONCENTRATION.cml index e48a0898..c9771765 100644 --- a/iris_grib/tests/results/integration/name_grib/NAMEIII/0_TRACER_AIR_CONCENTRATION.cml +++ b/iris_grib/tests/results/integration/name_grib/NAMEIII/0_TRACER_AIR_CONCENTRATION.cml @@ -6,22 +6,22 @@ - + - + + 356.6782, 356.68 ]" shape="(200,)" standard_name="longitude" units="Unit('degrees')" value_type="float64"> - + diff --git a/iris_grib/tests/results/integration/name_grib/NAMEIII/1_TRACER_AIR_CONCENTRATION.cml b/iris_grib/tests/results/integration/name_grib/NAMEIII/1_TRACER_AIR_CONCENTRATION.cml index 776bd084..5ffe86fb 100644 --- a/iris_grib/tests/results/integration/name_grib/NAMEIII/1_TRACER_AIR_CONCENTRATION.cml +++ b/iris_grib/tests/results/integration/name_grib/NAMEIII/1_TRACER_AIR_CONCENTRATION.cml @@ -6,22 +6,22 @@ - + - + + 356.6782, 356.68 ]" shape="(200,)" standard_name="longitude" units="Unit('degrees')" value_type="float64"> - + diff --git a/iris_grib/tests/results/integration/name_grib/NAMEIII/2_TRACER_DRY_DEPOSITION.cml b/iris_grib/tests/results/integration/name_grib/NAMEIII/2_TRACER_DRY_DEPOSITION.cml index a5f12ebc..f7d7b8ff 100644 --- a/iris_grib/tests/results/integration/name_grib/NAMEIII/2_TRACER_DRY_DEPOSITION.cml +++ b/iris_grib/tests/results/integration/name_grib/NAMEIII/2_TRACER_DRY_DEPOSITION.cml @@ -6,22 +6,22 @@ - + - + + 356.6782, 356.68 ]" shape="(200,)" standard_name="longitude" units="Unit('degrees')" value_type="float64"> - + diff --git a/iris_grib/tests/results/integration/name_grib/NAMEIII/3_TRACER_WET_DEPOSITION.cml b/iris_grib/tests/results/integration/name_grib/NAMEIII/3_TRACER_WET_DEPOSITION.cml index f57bdc7a..65c9a85f 100644 --- a/iris_grib/tests/results/integration/name_grib/NAMEIII/3_TRACER_WET_DEPOSITION.cml +++ b/iris_grib/tests/results/integration/name_grib/NAMEIII/3_TRACER_WET_DEPOSITION.cml @@ -6,22 +6,22 @@ - + - + + 356.6782, 356.68 ]" shape="(200,)" standard_name="longitude" units="Unit('degrees')" value_type="float64"> - + diff --git a/iris_grib/tests/results/integration/name_grib/NAMEIII/4_TRACER_DEPOSITION.cml b/iris_grib/tests/results/integration/name_grib/NAMEIII/4_TRACER_DEPOSITION.cml index 6e4e1017..193b0325 100644 --- a/iris_grib/tests/results/integration/name_grib/NAMEIII/4_TRACER_DEPOSITION.cml +++ b/iris_grib/tests/results/integration/name_grib/NAMEIII/4_TRACER_DEPOSITION.cml @@ -6,22 +6,22 @@ - + - + + 356.6782, 356.68 ]" shape="(200,)" standard_name="longitude" units="Unit('degrees')" value_type="float64"> - + diff --git a/iris_grib/tests/results/unit/load_cubes/load_cubes/reduced_raw.cml b/iris_grib/tests/results/unit/load_cubes/load_cubes/reduced_raw.cml index 5d687f24..d2315613 100644 --- a/iris_grib/tests/results/unit/load_cubes/load_cubes/reduced_raw.cml +++ b/iris_grib/tests/results/unit/load_cubes/load_cubes/reduced_raw.cml @@ -10,19 +10,19 @@ - + - + - + - + @@ -34,10 +34,10 @@ - + - + diff --git a/noxfile.py b/noxfile.py index 81bd7b95..a29fcf2e 100644 --- a/noxfile.py +++ b/noxfile.py @@ -25,7 +25,7 @@ PACKAGE = str("iris_grib") #: Cirrus-CI environment variable hook. -PY_VER = os.environ.get("PY_VER", ["3.7", "3.8"]) +PY_VER = os.environ.get("PY_VER", ["3.9", "3.10", "3.11"]) IRIS_SOURCE = os.environ.get("IRIS_SOURCE", ['source', 'conda-forge']) #: Default cartopy cache directory. diff --git a/requirements/iris-grib.yml b/requirements/iris-grib.yml index a76932b5..b0c50b8b 120000 --- a/requirements/iris-grib.yml +++ b/requirements/iris-grib.yml @@ -1 +1 @@ -py38.yml \ No newline at end of file +py311.yml \ No newline at end of file diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock new file mode 100644 index 00000000..580289d9 --- /dev/null +++ b/requirements/locks/py310-linux-64.lock @@ -0,0 +1,154 @@ +# Generated by conda-lock. +# platform: linux-64 +# input_hash: e0e9f15873aa1fc2dd47cf10a59a130baadd2548cadda686cffb335c1073dabf +@EXPLICIT +https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.5.7-hbcca054_0.conda#f5c65075fc34438d5b456c7f3f5ab695 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.1.0-h15d22d2_0.conda#afb656a334c409dd9805508af1c89c7a +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.1.0-hfd8a6a1_0.conda#067bcc23164642f4c226da631f2a2e1d +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-3_cp310.conda#4eb33d14d794b0f4be116443ffed3853 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2023c-h71feb2d_0.conda#939e3e74d8be4dac89ce83b20de2492a +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.1.0-h69a702a_0.conda#506dc07710dd5b0ba63cbf134897fc10 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.1.0-he5830b7_0.conda#56ca14d57ac29a75d23a39eb3ee0ddeb +https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.1.0-he5830b7_0.conda#cd93f779ff018dd85c7544c015c9db3c +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.19.1-hd590300_0.conda#e8c18d865be43e2fb3f7a145b6adf1f5 +https://conda.anaconda.org/conda-forge/linux-64/geos-3.11.2-hcb278e6_0.conda#3b8e364995e3575e57960d29c1e5ab14 +https://conda.anaconda.org/conda-forge/linux-64/icu-72.1-hcb278e6_0.conda#7c8d20d847bb45f56bd941578fcfa146 +https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 +https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f +https://conda.anaconda.org/conda-forge/linux-64/libaec-1.0.6-hcb278e6_1.conda#0f683578378cddb223e7fd24f785ab2a +https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.0.9-h166bdaf_9.conda#61641e239f96eae2b8492dc7e755828c +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.18-h0b41bf4_0.conda#6aa9c9de5542ecb07fdda9ca626252d8 +https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h516909a_1.tar.bz2#6f8720dff19e17ce5d48cfe7f3d2f0a3 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.5.0-hcb278e6_1.conda#6305a3dd2752c76335295da4e581f2fd +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 +https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-h166bdaf_0.tar.bz2#b62b52da46c39ee2bc3c162ac7f1804d +https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-2.1.5.1-h0b41bf4_0.conda#1edd9e67bdb90d78cea97733ff6b54e6 +https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d +https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.0-h7f98852_0.tar.bz2#39b1328babf85c7c3a61636d9cd50206 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.23-pthreads_h80387f5_0.conda#9c5ea51ccb8ffae7d06c645869d24ce6 +https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b +https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.1-hd590300_0.conda#82bf6f63eb15ef719b556b63feec3a77 +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad +https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-hcb278e6_0.conda#681105bccc2a3f7f1a837d47d39c9179 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.1.1-hd590300_1.conda#2e1d7b458ac8f1e3ca4e18b77add6277 +https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 +https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-h9fff704_0.conda#e6d228cd0bb74a51dd18f5bfce0b4115 +https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b +https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda#2c80dc38fface310c9bd81b17037fee5 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2#be93aabceefa2fac576e971aef407908 +https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h0b41bf4_1003.conda#bce9f945da8ad2ae9b1d7165a64d0f87 +https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007.tar.bz2#b4a4381d54784606820704f7b5f05a15 +https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.1-h0b41bf4_0.conda#e9c3bcf0e0c719431abec8ca447eee27 +https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 +https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae +https://conda.anaconda.org/conda-forge/linux-64/expat-2.5.0-hcb278e6_1.conda#8b9b5aca60558d02ddaa09d599e55920 +https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h501b40f_6.conda#c3e9338e15d90106f467377017352b97 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-17_linux64_openblas.conda#57fb44770b1bc832fb2dbefa1bd502de +https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.0.9-h166bdaf_9.conda#081aa22f4581c08e4372b0b6c2f8478e +https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.0.9-h166bdaf_9.conda#1f0a03af852a9659ed2bf08f2f1704fd +https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 +https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.52.0-h61bc06f_0.conda#613955a50485812985c059e7b269f42e +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.39-h753d276_0.conda#e1c890aebdebbfbf87e2c917187b4416 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.42.0-h2797004_0.conda#fdaae20a1cf7cd62130a0973190a31b7 +https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe +https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.11.4-h0d562d8_0.conda#e46fad17d5fb57316b956f88dca765e4 +https://conda.anaconda.org/conda-forge/linux-64/libzip-1.9.2-hc929e4a_1.tar.bz2#5b122b50e738c4be5c3f2899f010d7cf +https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 +https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-h3eb15da_6.conda#6b63daed8feeca47be78f323e793d555 +https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.4-h0f2a231_0.conda#876286b5941933a0f558777e57d883cc +https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_9.conda#d47dee1856d9cb955b8076eeff304a5b +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-hca18f0e_1.conda#e1232042de76d24539a436d37597eb06 +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.20.1-h81ceb04_0.conda#89a41adce7106749573d883b2f657d78 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-17_linux64_openblas.conda#7ef0969b00fe3d6eef56a8151d3afb29 +https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1002.conda#4c4dce87e96b321308f81ba2c10d2897 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-17_linux64_openblas.conda#a2103882c46492e26500fcb56c03de8b +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.5.1-h8b53f26_0.conda#8ad377fb60abab446a9f02c62b3c2190 +https://conda.anaconda.org/conda-forge/linux-64/python-3.10.12-hd12c33a_0_cpython.conda#eb6f1df105f37daedd6dca78523baa75 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.42.0-h2c6b66d_0.conda#1192f6ec654a5bc4ee1d64bdc4a3e5cc +https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-hc3e0081_0.tar.bz2#d4c341e0379c31e9e781d4f204726867 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.6-h8ee46fc_0.conda#7590b76c3d11d21caa44f3fc38ac584a +https://conda.anaconda.org/conda-forge/linux-64/antlr-python-runtime-4.7.2-py310hff52083_1003.tar.bz2#8324f8fff866055d4b32eb25e091fe31 +https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda#3edfead7cedd1ab4400a6c588f3e75f8 +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_9.conda#4601544b4982ba1861fa9b9c607b2c06 +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.0.9-py310hd8f1fbe_9.conda#e2047ad2af52c01845f58b580c6cbd5c +https://conda.anaconda.org/conda-forge/noarch/certifi-2023.5.7-pyhd8ed1ab_0.conda#5d1b71c942b8421285934dad1d891ebc +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.1.0-pyhd8ed1ab_0.conda#7fcff9f6f123696e940bda77bd4d6551 +https://conda.anaconda.org/conda-forge/noarch/click-8.1.3-unix_pyhd8ed1ab_2.tar.bz2#20e4087407c7cb04a40817114b333dbf +https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.1-pyhd8ed1ab_0.conda#b325bfc4cff7d7f8a868f1f7ecc4ed16 +https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb +https://conda.anaconda.org/conda-forge/noarch/filelock-3.12.2-pyhd8ed1ab_0.conda#53522ec72e6adae42bd373ef58357230 +https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db +https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.6.0-pyh1a96a4e_0.conda#50ea2067ec92dfcc38b4f07992d7e235 +https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.4-py310hbf28c38_1.tar.bz2#ad5647e517ba68e2868ef2e6e6ff7723 +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-haa2dc70_1.conda#980d8aca0bc23ca73fa8caa3e7c84c28 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.1.2-h409715c_0.conda#50c873c9660ed116707ae15b663928d8 +https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py310h2372a71_0.conda#5597d9f9778af6883ae64f0e7d39416c +https://conda.anaconda.org/conda-forge/noarch/mock-5.0.2-pyhd8ed1ab_0.conda#541e4834b1e46ed786829dc63e4d4ca2 +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 +https://conda.anaconda.org/conda-forge/linux-64/numpy-1.25.0-py310ha4c1d20_0.conda#03319f78e5c9c8d90c0110e2c6ed24f6 +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-hfec8fc6_2.conda#5ce6a42505c6e9e6151c54c3ec8d68ea +https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda#91cda59e66e1e4afe9476f8ef98f5c30 +https://conda.anaconda.org/conda-forge/noarch/pep8-1.7.1-py_0.tar.bz2#d0b5bc3aebbffcb175bf8a1d419acb79 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.0-pyhd8ed1ab_0.conda#d3ed087d1f7f8f5590e8e87b57a8ce64 +https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 +https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.2.0-py310h1fa729e_0.conda#8d155ac95b1dfe585bcb6bec6a91c73b +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py310h5764c6d_5.tar.bz2#9e68d2ff6d98737c855b65f48dd3c597 +https://conda.anaconda.org/conda-forge/noarch/setuptools-68.0.0-pyhd8ed1ab_0.conda#5a7739d0f57ee64133c9d32e6507c46d +https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 +https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.7.1-pyha770c72_0.conda#c39d6a09fe819de4951c2642629d9115 +https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.0.0-py310h5764c6d_0.tar.bz2#e972c5a1f472561cf4a91962cb01f4b4 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.40.0-pyhd8ed1ab_0.conda#49bb0d9e60ce1db25e151780331bb5f3 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a +https://conda.anaconda.org/conda-forge/noarch/zipp-3.15.0-pyhd8ed1ab_0.conda#13018819ca8f5b7cc675a8faf1f5fedf +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py310h255011f_3.conda#800596144bb613cd7ac58b80900ce835 +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py310hde88566_1.tar.bz2#94ce7a76b0c912279f6958e0b6b21d2b +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.1.0-py310hd41b1e2_0.conda#684399f9ddc0b9d6f3b6164f6107098e +https://conda.anaconda.org/conda-forge/linux-64/curl-8.1.2-h409715c_0.conda#9f88cfb15b7d08b25880b138f91e0eb4 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.40.0-py310h2372a71_0.conda#d3d83b419c81ac718a9221442707882b +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.1-nompi_h4f84152_100.conda#ff9ae10aa224826c07da7ef26cb0b717 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.7.0-pyha770c72_0.conda#ba3786c6846e46038fe60c785d46dc81 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 +https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py310hde88566_1008.tar.bz2#f9dd8a7a2fcc23eb2cd95cd817c949e7 +https://conda.anaconda.org/conda-forge/noarch/partd-1.4.0-pyhd8ed1ab_0.conda#721dab5803ea92ce02ddc4ee50aa0c48 +https://conda.anaconda.org/conda-forge/linux-64/pillow-10.0.0-py310h582fbeb_0.conda#adcc7ea52e4d39d0a93f6a2ef36c7fd4 +https://conda.anaconda.org/conda-forge/noarch/pip-23.1.2-pyhd8ed1ab_0.conda#7288da0d36821349cf1126e8670292df +https://conda.anaconda.org/conda-forge/linux-64/proj-9.2.1-ha643af7_0.conda#e992387307f4403ba0ec07d009032550 +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/shapely-2.0.1-py310h056c13c_1.conda#32d925cfd330e0cbb72b7618558a44e8 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.7.1-hd8ed1ab_0.conda#f96688577f1faa58096d06a45136afa2 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.3-pyhd8ed1ab_1.conda#89efeecbb24c62e2f1ed0b8ca959ec69 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py310h278f3c1_0.conda#f2d3f2542a2467f479e809ac7b901ac2 +https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.7.0-hd8ed1ab_0.conda#27a4cec373ec84d1c1aa02a1e37f8eaf +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h78c856c_106.conda#47665bf3dec451455474556ecd940ed2 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py310he60537e_0.conda#68b2dd34c69d08b05a9db5e3596fe3ee +https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.8.0-pyhd8ed1ab_0.conda#3e4aca765371893ad848397794600632 +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.0-py310h24ef57a_1.conda#a689e86d7bbab67f889fc384aa72b088 +https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b +https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.6.1-pyhd8ed1ab_0.conda#ec55ad569dd8b9184266e0d3db0b3bc7 +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.0.0-h32699f2_1.conda#fdde5424ecef5f7ad310b4242229291c +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py310h6f5dce6_101.conda#0d50bea104512f2728676a8bff8840d3 +https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyha770c72_3.conda#5936894aade8240c867d292aa0d980c6 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.30.2-h73bf81c_1.conda#12065974059e8a6292610e39d5e2b415 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.1-py310ha4c1d20_0.conda#300d3b434872eb84965864f0fcc5b5da +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.21.1-py310h7eb24ba_1.conda#e727db22a14344608c2caeccaa9e9d2b +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.5.2-py310h278f3c1_0.conda#ca7b86ade6b57bf4539342d31a1b40cf +https://conda.anaconda.org/conda-forge/noarch/iris-3.6.1-pyha770c72_0.conda#36d615b339058273520990fc78239116 + diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock new file mode 100644 index 00000000..f34db360 --- /dev/null +++ b/requirements/locks/py311-linux-64.lock @@ -0,0 +1,153 @@ +# Generated by conda-lock. +# platform: linux-64 +# input_hash: 3ba568027ca22990322f816ccef334c58bb3bd902c79cceded82285400ac7c13 +@EXPLICIT +https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.5.7-hbcca054_0.conda#f5c65075fc34438d5b456c7f3f5ab695 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.1.0-h15d22d2_0.conda#afb656a334c409dd9805508af1c89c7a +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.1.0-hfd8a6a1_0.conda#067bcc23164642f4c226da631f2a2e1d +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-3_cp311.conda#c2e2630ddb68cf52eec74dc7dfab20b5 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2023c-h71feb2d_0.conda#939e3e74d8be4dac89ce83b20de2492a +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.1.0-h69a702a_0.conda#506dc07710dd5b0ba63cbf134897fc10 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.1.0-he5830b7_0.conda#56ca14d57ac29a75d23a39eb3ee0ddeb +https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.1.0-he5830b7_0.conda#cd93f779ff018dd85c7544c015c9db3c +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.19.1-hd590300_0.conda#e8c18d865be43e2fb3f7a145b6adf1f5 +https://conda.anaconda.org/conda-forge/linux-64/geos-3.11.2-hcb278e6_0.conda#3b8e364995e3575e57960d29c1e5ab14 +https://conda.anaconda.org/conda-forge/linux-64/icu-72.1-hcb278e6_0.conda#7c8d20d847bb45f56bd941578fcfa146 +https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 +https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f +https://conda.anaconda.org/conda-forge/linux-64/libaec-1.0.6-hcb278e6_1.conda#0f683578378cddb223e7fd24f785ab2a +https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.0.9-h166bdaf_9.conda#61641e239f96eae2b8492dc7e755828c +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.18-h0b41bf4_0.conda#6aa9c9de5542ecb07fdda9ca626252d8 +https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h516909a_1.tar.bz2#6f8720dff19e17ce5d48cfe7f3d2f0a3 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.5.0-hcb278e6_1.conda#6305a3dd2752c76335295da4e581f2fd +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 +https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-h166bdaf_0.tar.bz2#b62b52da46c39ee2bc3c162ac7f1804d +https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-2.1.5.1-h0b41bf4_0.conda#1edd9e67bdb90d78cea97733ff6b54e6 +https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d +https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.0-h7f98852_0.tar.bz2#39b1328babf85c7c3a61636d9cd50206 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.23-pthreads_h80387f5_0.conda#9c5ea51ccb8ffae7d06c645869d24ce6 +https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b +https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.1-hd590300_0.conda#82bf6f63eb15ef719b556b63feec3a77 +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad +https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-hcb278e6_0.conda#681105bccc2a3f7f1a837d47d39c9179 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.1.1-hd590300_1.conda#2e1d7b458ac8f1e3ca4e18b77add6277 +https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 +https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-h9fff704_0.conda#e6d228cd0bb74a51dd18f5bfce0b4115 +https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b +https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda#2c80dc38fface310c9bd81b17037fee5 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2#be93aabceefa2fac576e971aef407908 +https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h0b41bf4_1003.conda#bce9f945da8ad2ae9b1d7165a64d0f87 +https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007.tar.bz2#b4a4381d54784606820704f7b5f05a15 +https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.1-h0b41bf4_0.conda#e9c3bcf0e0c719431abec8ca447eee27 +https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 +https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae +https://conda.anaconda.org/conda-forge/linux-64/expat-2.5.0-hcb278e6_1.conda#8b9b5aca60558d02ddaa09d599e55920 +https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h501b40f_6.conda#c3e9338e15d90106f467377017352b97 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-17_linux64_openblas.conda#57fb44770b1bc832fb2dbefa1bd502de +https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.0.9-h166bdaf_9.conda#081aa22f4581c08e4372b0b6c2f8478e +https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.0.9-h166bdaf_9.conda#1f0a03af852a9659ed2bf08f2f1704fd +https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 +https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.52.0-h61bc06f_0.conda#613955a50485812985c059e7b269f42e +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.39-h753d276_0.conda#e1c890aebdebbfbf87e2c917187b4416 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.42.0-h2797004_0.conda#fdaae20a1cf7cd62130a0973190a31b7 +https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe +https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.11.4-h0d562d8_0.conda#e46fad17d5fb57316b956f88dca765e4 +https://conda.anaconda.org/conda-forge/linux-64/libzip-1.9.2-hc929e4a_1.tar.bz2#5b122b50e738c4be5c3f2899f010d7cf +https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 +https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-h3eb15da_6.conda#6b63daed8feeca47be78f323e793d555 +https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.4-h0f2a231_0.conda#876286b5941933a0f558777e57d883cc +https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_9.conda#d47dee1856d9cb955b8076eeff304a5b +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-hca18f0e_1.conda#e1232042de76d24539a436d37597eb06 +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.20.1-h81ceb04_0.conda#89a41adce7106749573d883b2f657d78 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-17_linux64_openblas.conda#7ef0969b00fe3d6eef56a8151d3afb29 +https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1002.conda#4c4dce87e96b321308f81ba2c10d2897 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-17_linux64_openblas.conda#a2103882c46492e26500fcb56c03de8b +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.5.1-h8b53f26_0.conda#8ad377fb60abab446a9f02c62b3c2190 +https://conda.anaconda.org/conda-forge/linux-64/python-3.11.4-hab00c5b_0_cpython.conda#1c628861a2a126b9fc9363ca1b7d014e +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.42.0-h2c6b66d_0.conda#1192f6ec654a5bc4ee1d64bdc4a3e5cc +https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-hc3e0081_0.tar.bz2#d4c341e0379c31e9e781d4f204726867 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.6-h8ee46fc_0.conda#7590b76c3d11d21caa44f3fc38ac584a +https://conda.anaconda.org/conda-forge/linux-64/antlr-python-runtime-4.7.2-py311h38be061_1003.tar.bz2#0ab8f8f0cae99343907fe68cda11baea +https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda#3edfead7cedd1ab4400a6c588f3e75f8 +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_9.conda#4601544b4982ba1861fa9b9c607b2c06 +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.0.9-py311ha362b79_9.conda#ced5340f5dc6cff43a80deac8d0e398f +https://conda.anaconda.org/conda-forge/noarch/certifi-2023.5.7-pyhd8ed1ab_0.conda#5d1b71c942b8421285934dad1d891ebc +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.1.0-pyhd8ed1ab_0.conda#7fcff9f6f123696e940bda77bd4d6551 +https://conda.anaconda.org/conda-forge/noarch/click-8.1.3-unix_pyhd8ed1ab_2.tar.bz2#20e4087407c7cb04a40817114b333dbf +https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.1-pyhd8ed1ab_0.conda#b325bfc4cff7d7f8a868f1f7ecc4ed16 +https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb +https://conda.anaconda.org/conda-forge/noarch/filelock-3.12.2-pyhd8ed1ab_0.conda#53522ec72e6adae42bd373ef58357230 +https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db +https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.6.0-pyh1a96a4e_0.conda#50ea2067ec92dfcc38b4f07992d7e235 +https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.4-py311h4dd048b_1.tar.bz2#46d451f575392c01dc193069bd89766d +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-haa2dc70_1.conda#980d8aca0bc23ca73fa8caa3e7c84c28 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.1.2-h409715c_0.conda#50c873c9660ed116707ae15b663928d8 +https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py311h459d7ec_0.conda#9904dc4adb5d547cb21e136f98cb24b0 +https://conda.anaconda.org/conda-forge/noarch/mock-5.0.2-pyhd8ed1ab_0.conda#541e4834b1e46ed786829dc63e4d4ca2 +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 +https://conda.anaconda.org/conda-forge/linux-64/numpy-1.25.0-py311h64a7726_0.conda#4df60430eca64502eb01e02df92246bf +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-hfec8fc6_2.conda#5ce6a42505c6e9e6151c54c3ec8d68ea +https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda#91cda59e66e1e4afe9476f8ef98f5c30 +https://conda.anaconda.org/conda-forge/noarch/pep8-1.7.1-py_0.tar.bz2#d0b5bc3aebbffcb175bf8a1d419acb79 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.0-pyhd8ed1ab_0.conda#d3ed087d1f7f8f5590e8e87b57a8ce64 +https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 +https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.2.0-py311h2582759_0.conda#dfcc3e6e30d6ec2b2bb416fcd8ff4dc1 +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py311hd4cff14_5.tar.bz2#da8769492e423103c59f469f4f17f8d9 +https://conda.anaconda.org/conda-forge/noarch/setuptools-68.0.0-pyhd8ed1ab_0.conda#5a7739d0f57ee64133c9d32e6507c46d +https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 +https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.7.1-pyha770c72_0.conda#c39d6a09fe819de4951c2642629d9115 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.40.0-pyhd8ed1ab_0.conda#49bb0d9e60ce1db25e151780331bb5f3 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a +https://conda.anaconda.org/conda-forge/noarch/zipp-3.15.0-pyhd8ed1ab_0.conda#13018819ca8f5b7cc675a8faf1f5fedf +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py311h409f033_3.conda#9025d0786dbbe4bc91fd8e85502decce +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py311h4c7f6c3_1.tar.bz2#c7e54004ffd03f8db0a58ab949f2a00b +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.1.0-py311h9547e67_0.conda#daf3f23397ab2265d0cdfa339f3627ba +https://conda.anaconda.org/conda-forge/linux-64/curl-8.1.2-h409715c_0.conda#9f88cfb15b7d08b25880b138f91e0eb4 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.40.0-py311h459d7ec_0.conda#b19f671a6b221f922cf871d71a71c0fa +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.1-nompi_h4f84152_100.conda#ff9ae10aa224826c07da7ef26cb0b717 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.7.0-pyha770c72_0.conda#ba3786c6846e46038fe60c785d46dc81 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 +https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py311h4c7f6c3_1008.tar.bz2#5998dff78c3b82a07ad77f2ae1ec1c44 +https://conda.anaconda.org/conda-forge/noarch/partd-1.4.0-pyhd8ed1ab_0.conda#721dab5803ea92ce02ddc4ee50aa0c48 +https://conda.anaconda.org/conda-forge/linux-64/pillow-10.0.0-py311h0b84326_0.conda#4b24acdc1fbbae9da03147e7d2cf8c8a +https://conda.anaconda.org/conda-forge/noarch/pip-23.1.2-pyhd8ed1ab_0.conda#7288da0d36821349cf1126e8670292df +https://conda.anaconda.org/conda-forge/linux-64/proj-9.2.1-ha643af7_0.conda#e992387307f4403ba0ec07d009032550 +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/shapely-2.0.1-py311h54d622a_1.conda#a894c65b48676c4973e9ee8b59bceb9e +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.7.1-hd8ed1ab_0.conda#f96688577f1faa58096d06a45136afa2 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.3-pyhd8ed1ab_1.conda#89efeecbb24c62e2f1ed0b8ca959ec69 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h1f0f07a_0.conda#43a71a823583d75308eaf3a06c8f150b +https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.7.0-hd8ed1ab_0.conda#27a4cec373ec84d1c1aa02a1e37f8eaf +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h78c856c_106.conda#47665bf3dec451455474556ecd940ed2 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py311h8597a09_0.conda#70c3b734ffe82c16b6d121aaa11929a8 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.8.0-pyhd8ed1ab_0.conda#3e4aca765371893ad848397794600632 +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.0-py311ha169711_1.conda#92633556d37e88ce45193374d408072c +https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b +https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.6.1-pyhd8ed1ab_0.conda#ec55ad569dd8b9184266e0d3db0b3bc7 +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.0.0-h32699f2_1.conda#fdde5424ecef5f7ad310b4242229291c +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py311h9a7c333_101.conda#1dc70c7c3352c0ff1f861d866860db37 +https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyha770c72_3.conda#5936894aade8240c867d292aa0d980c6 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.30.2-h73bf81c_1.conda#12065974059e8a6292610e39d5e2b415 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.1-py311h64a7726_0.conda#356da36102fc1eeb8a81e6d79e53bc7e +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.21.1-py311hd88b842_1.conda#f19feb9440890ccb806a367ea9ae0654 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.5.2-py311h1f0f07a_0.conda#5346e127ae52857ab1805a7cb8a89ab6 +https://conda.anaconda.org/conda-forge/noarch/iris-3.6.1-pyha770c72_0.conda#36d615b339058273520990fc78239116 + diff --git a/requirements/locks/py38-linux-64.lock b/requirements/locks/py39-linux-64.lock similarity index 55% rename from requirements/locks/py38-linux-64.lock rename to requirements/locks/py39-linux-64.lock index b9273f7b..9c7c3b51 100644 --- a/requirements/locks/py38-linux-64.lock +++ b/requirements/locks/py39-linux-64.lock @@ -1,46 +1,46 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 5d1f8c55ed222f05f64baa37a9f6b110189c50ca5fb7ffb4607bb76ffbb75226 +# input_hash: bc9e2db41b8a4b40c22615794ea0344a86f88250e8939b613a5a4051037471fd @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2022.12.7-ha878542_0.conda#ff9f73d45c4a07d6f424495288a26080 +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.5.7-hbcca054_0.conda#f5c65075fc34438d5b456c7f3f5ab695 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-12.2.0-h337968e_19.tar.bz2#164b4b1acaedc47ee7e658ae6b308ca3 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-12.2.0-h46fd767_19.tar.bz2#1030b1f38c129f2634eae026f704fe60 -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.8-3_cp38.conda#2f3f7af062b42d664117662612022204 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-12.2.0-h69a702a_19.tar.bz2#cd7a806282c16e1f2d39a7e80d3a3e0d -https://conda.anaconda.org/conda-forge/linux-64/libgomp-12.2.0-h65d4601_19.tar.bz2#cedcee7c064c01c403f962c9e8d3c373 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.1.0-h15d22d2_0.conda#afb656a334c409dd9805508af1c89c7a +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.1.0-hfd8a6a1_0.conda#067bcc23164642f4c226da631f2a2e1d +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.9-3_cp39.conda#0dd193187d54e585cac7eab942a8847e +https://conda.anaconda.org/conda-forge/noarch/tzdata-2023c-h71feb2d_0.conda#939e3e74d8be4dac89ce83b20de2492a +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.1.0-h69a702a_0.conda#506dc07710dd5b0ba63cbf134897fc10 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.1.0-he5830b7_0.conda#56ca14d57ac29a75d23a39eb3ee0ddeb https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-12.2.0-h65d4601_19.tar.bz2#e4c94f80aef025c17ab0828cd85ef535 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.1.0-he5830b7_0.conda#cd93f779ff018dd85c7544c015c9db3c 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/c-ares-1.19.1-hd590300_0.conda#e8c18d865be43e2fb3f7a145b6adf1f5 https://conda.anaconda.org/conda-forge/linux-64/geos-3.11.2-hcb278e6_0.conda#3b8e364995e3575e57960d29c1e5ab14 https://conda.anaconda.org/conda-forge/linux-64/icu-72.1-hcb278e6_0.conda#7c8d20d847bb45f56bd941578fcfa146 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libaec-1.0.6-hcb278e6_1.conda#0f683578378cddb223e7fd24f785ab2a -https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.0.9-h166bdaf_8.tar.bz2#9194c9bf9428035a05352d031462eae4 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.0.9-h166bdaf_9.conda#61641e239f96eae2b8492dc7e755828c https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.18-h0b41bf4_0.conda#6aa9c9de5542ecb07fdda9ca626252d8 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h516909a_1.tar.bz2#6f8720dff19e17ce5d48cfe7f3d2f0a3 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.5.0-hcb278e6_1.conda#6305a3dd2752c76335295da4e581f2fd https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 -https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-he1b5a44_1001.tar.bz2#8208602aec4826053c116552369a394c https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-h166bdaf_0.tar.bz2#b62b52da46c39ee2bc3c162ac7f1804d https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-2.1.5.1-h0b41bf4_0.conda#1edd9e67bdb90d78cea97733ff6b54e6 https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.0-h7f98852_0.tar.bz2#39b1328babf85c7c3a61636d9cd50206 -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.21-pthreads_h78a6416_3.tar.bz2#8c5963a49b6035c40646a763293fbb35 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.23-pthreads_h80387f5_0.conda#9c5ea51ccb8ffae7d06c645869d24ce6 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b -https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.0-h0b41bf4_0.conda#0d4a7508d8c6c65314f2b9c1f56ad408 -https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h166bdaf_4.tar.bz2#f3f9de449d32ca9b9c66a22863c96f41 +https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.1-hd590300_0.conda#82bf6f63eb15ef719b556b63feec3a77 +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.3-h27087fc_1.tar.bz2#4acfc691e64342b9dae57cf2adc63238 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.1.0-h0b41bf4_0.conda#2d833be81a21128e317325a01326d36f +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-hcb278e6_0.conda#681105bccc2a3f7f1a837d47d39c9179 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.1.1-hd590300_1.conda#2e1d7b458ac8f1e3ca4e18b77add6277 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-h9fff704_0.conda#e6d228cd0bb74a51dd18f5bfce0b4115 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.9-h7f98852_0.tar.bz2#bf6f803a544f26ebbdc3bfff272eb179 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda#2c80dc38fface310c9bd81b17037fee5 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2#be93aabceefa2fac576e971aef407908 https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h0b41bf4_1003.conda#bce9f945da8ad2ae9b1d7165a64d0f87 https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007.tar.bz2#b4a4381d54784606820704f7b5f05a15 @@ -49,108 +49,108 @@ https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae https://conda.anaconda.org/conda-forge/linux-64/expat-2.5.0-hcb278e6_1.conda#8b9b5aca60558d02ddaa09d599e55920 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h501b40f_6.conda#c3e9338e15d90106f467377017352b97 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-16_linux64_openblas.tar.bz2#d9b7a8639171f6c6fa0a983edabcfe2b -https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.0.9-h166bdaf_8.tar.bz2#4ae4d7795d33e02bd20f6b23d91caf82 -https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.0.9-h166bdaf_8.tar.bz2#04bac51ba35ea023dc48af73c1c88c25 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-17_linux64_openblas.conda#57fb44770b1bc832fb2dbefa1bd502de +https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.0.9-h166bdaf_9.conda#081aa22f4581c08e4372b0b6c2f8478e +https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.0.9-h166bdaf_9.conda#1f0a03af852a9659ed2bf08f2f1704fd https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.52.0-h61bc06f_0.conda#613955a50485812985c059e7b269f42e https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.39-h753d276_0.conda#e1c890aebdebbfbf87e2c917187b4416 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.40.0-h753d276_0.tar.bz2#2e5f9a37d487e1019fd4d8113adb2f9f -https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.10.0-hf14f497_3.tar.bz2#d85acad4b47dff4e3def14a769a97906 -https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.13-h7f98852_1004.tar.bz2#b3653fdc58d03face9724f602218a904 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.10.3-hfdac1af_6.conda#7eecaadc2eaeef464c5fe17702f17c86 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.42.0-h2797004_0.conda#fdaae20a1cf7cd62130a0973190a31b7 +https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe +https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.11.4-h0d562d8_0.conda#e46fad17d5fb57316b956f88dca765e4 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.9.2-hc929e4a_1.tar.bz2#5b122b50e738c4be5c3f2899f010d7cf https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-h3eb15da_6.conda#6b63daed8feeca47be78f323e793d555 -https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.3-hafa529b_0.conda#bcf0664a2dbbbb86cbd4c1e6ff10ddd6 -https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_8.tar.bz2#e5613f2bc717e9945840ff474419b8e4 +https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.4-h0f2a231_0.conda#876286b5941933a0f558777e57d883cc +https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_9.conda#d47dee1856d9cb955b8076eeff304a5b https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-hca18f0e_1.conda#e1232042de76d24539a436d37597eb06 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.20.1-h81ceb04_0.conda#89a41adce7106749573d883b2f657d78 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-16_linux64_openblas.tar.bz2#20bae26d0a1db73f758fc3754cab4719 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-16_linux64_openblas.tar.bz2#955d993f41f9354bf753d29864ea20ad -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.5.0-ha587672_6.conda#4e5ee4b062c21519efbee7e2ae608748 -https://conda.anaconda.org/conda-forge/linux-64/python-3.8.16-he550d4f_1_cpython.conda#9de84cccfbc5f8350a3667bb6ef6fc30 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.40.0-h4ff8645_0.tar.bz2#bb11803129cbbb53ed56f9506ff74145 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-17_linux64_openblas.conda#7ef0969b00fe3d6eef56a8151d3afb29 +https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1002.conda#4c4dce87e96b321308f81ba2c10d2897 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-17_linux64_openblas.conda#a2103882c46492e26500fcb56c03de8b +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.5.1-h8b53f26_0.conda#8ad377fb60abab446a9f02c62b3c2190 +https://conda.anaconda.org/conda-forge/linux-64/python-3.9.16-h2782a2a_0_cpython.conda#95c9b7c96a7fd7342e0c9d0a917b8f78 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.42.0-h2c6b66d_0.conda#1192f6ec654a5bc4ee1d64bdc4a3e5cc https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-hc3e0081_0.tar.bz2#d4c341e0379c31e9e781d4f204726867 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.4-h0b41bf4_0.conda#ea8fbfeb976ac49cbeb594e985393514 -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/attrs-22.2.0-pyh71513ae_0.conda#8b76db7818a4e401ed4486c4c1635cd9 -https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_8.tar.bz2#2ff08978892a3e8b954397c461f18418 -https://conda.anaconda.org/conda-forge/noarch/certifi-2022.12.7-pyhd8ed1ab_0.conda#fb9addc3db06e56abe03e0e9f21a63e6 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.6-h8ee46fc_0.conda#7590b76c3d11d21caa44f3fc38ac584a +https://conda.anaconda.org/conda-forge/linux-64/antlr-python-runtime-4.7.2-py39hf3d152e_1003.tar.bz2#5e8330e806e50bd6137ebd125f4bc1bb +https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda#3edfead7cedd1ab4400a6c588f3e75f8 +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_9.conda#4601544b4982ba1861fa9b9c607b2c06 +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.0.9-py39h5a03fae_9.conda#d1601752c6f47af7bedf838be3d8ca6b +https://conda.anaconda.org/conda-forge/noarch/certifi-2023.5.7-pyhd8ed1ab_0.conda#5d1b71c942b8421285934dad1d891ebc https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.1.0-pyhd8ed1ab_0.conda#7fcff9f6f123696e940bda77bd4d6551 https://conda.anaconda.org/conda-forge/noarch/click-8.1.3-unix_pyhd8ed1ab_2.tar.bz2#20e4087407c7cb04a40817114b333dbf https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.1-pyhd8ed1ab_0.conda#b325bfc4cff7d7f8a868f1f7ecc4ed16 https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb -https://conda.anaconda.org/conda-forge/noarch/filelock-3.10.7-pyhd8ed1ab_0.conda#6a0601f92717ce555d79d83d693b6fa3 -https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.2-pyhd8ed1ab_0.tar.bz2#c2a60dd9f1210b8ee2037f7d0ec6251a -https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.3.0-pyhd8ed1ab_1.conda#0db48a2f5a68e28e5af8d3df276f2255 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.12.2-pyhd8ed1ab_0.conda#53522ec72e6adae42bd373ef58357230 +https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db +https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.6.0-pyh1a96a4e_0.conda#50ea2067ec92dfcc38b4f07992d7e235 https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed -https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.4-py38h43d8883_1.tar.bz2#41ca56d5cac7bfc7eb4fcdbee878eb84 +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.4-py39hf939315_1.tar.bz2#41679a052a8ce841c74df1ebc802e411 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-haa2dc70_1.conda#980d8aca0bc23ca73fa8caa3e7c84c28 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-7.88.1-hdc1c0ab_1.conda#3d1189864d1c0ed2a5919cb067b5903d +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.1.2-h409715c_0.conda#50c873c9660ed116707ae15b663928d8 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.2-py38h1de0b5d_0.conda#6d97b5d6f06933ab653f1862ddf6e33e -https://conda.anaconda.org/conda-forge/noarch/mock-5.0.1-pyhd8ed1ab_0.conda#2938496cc6ab759a14be351c5a4cc76d +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py39hd1e30aa_0.conda#9c858d105816f454c6b64f3e19184b60 +https://conda.anaconda.org/conda-forge/noarch/mock-5.0.2-pyhd8ed1ab_0.conda#541e4834b1e46ed786829dc63e4d4ca2 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 -https://conda.anaconda.org/conda-forge/linux-64/numpy-1.24.2-py38h10c12cc_0.conda#05592c85b9f6931dc2df1e80c0d56294 +https://conda.anaconda.org/conda-forge/linux-64/numpy-1.25.0-py39h6183b62_0.conda#02b87fef8e4c72be8256435ed59fe8de https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-hfec8fc6_2.conda#5ce6a42505c6e9e6151c54c3ec8d68ea -https://conda.anaconda.org/conda-forge/noarch/packaging-23.0-pyhd8ed1ab_0.conda#1ff2e3ca41f0ce16afec7190db28288b +https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda#91cda59e66e1e4afe9476f8ef98f5c30 https://conda.anaconda.org/conda-forge/noarch/pep8-1.7.1-py_0.tar.bz2#d0b5bc3aebbffcb175bf8a1d419acb79 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.0.9-pyhd8ed1ab_0.tar.bz2#e8fbc1b54b25f4b08281467bc13b70cc +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.0-pyhd8ed1ab_0.conda#d3ed087d1f7f8f5590e8e87b57a8ce64 https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 -https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.2.0-py38h1de0b5d_0.conda#7db73572d4f7e10a759bad609a228ad0 -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py38h0a891b7_5.tar.bz2#0856c59f9ddb710c640dc0428d66b1b7 -https://conda.anaconda.org/conda-forge/noarch/setuptools-67.6.1-pyhd8ed1ab_0.conda#6c443cccff3daa3d83b2b807b0a298ce +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.2.0-py39h72bdee0_0.conda#18927f971926b7271600368de71de557 +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py39hb9d737c_5.tar.bz2#ef9db3c38ae7275f6b14491cfe61a248 +https://conda.anaconda.org/conda-forge/noarch/setuptools-68.0.0-pyhd8ed1ab_0.conda#5a7739d0f57ee64133c9d32e6507c46d https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.5.0-pyha770c72_0.conda#43e7d9e50261fb11deb76e17d8431aac -https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.0.0-py38h0a891b7_0.tar.bz2#44421904760e9f5ae2035193e04360f0 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.7.1-pyha770c72_0.conda#c39d6a09fe819de4951c2642629d9115 +https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.0.0-py39hb9d737c_0.tar.bz2#230d65004135bf312504a1bbcb0c7a08 https://conda.anaconda.org/conda-forge/noarch/wheel-0.40.0-pyhd8ed1ab_0.conda#49bb0d9e60ce1db25e151780331bb5f3 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/noarch/zipp-3.15.0-pyhd8ed1ab_0.conda#13018819ca8f5b7cc675a8faf1f5fedf -https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py38h4a40e3a_3.conda#3ac112151c6b6cfe457e976de41af0c5 -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py38h26c90d9_1.tar.bz2#dcc025a7bb54374979c500c2e161fac9 -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.0.7-py38hfbd4bf9_0.conda#638537863b298151635c05c762a997ab -https://conda.anaconda.org/conda-forge/linux-64/curl-7.88.1-hdc1c0ab_1.conda#2016c398f234cfa354ea704c6731b5d5 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.39.3-py38h1de0b5d_0.conda#34449fe6e3949956fac2236c9a9a3d3b -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.0-nompi_hb72d44e_103.conda#975973a4350ab45ff1981fe535a12af5 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.1.0-pyha770c72_0.conda#30b3127c385ca2ed5ef87f3d53d466bc +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py39he91dace_3.conda#20080319ef73fbad74dcd6d62f2a3ffe +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py39h2ae25f5_1.tar.bz2#c943fb9a2818ecc5be1e0ecc8b7738f1 +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.1.0-py39h7633fee_0.conda#54e6f32e448fdc273606011f0940d076 +https://conda.anaconda.org/conda-forge/linux-64/curl-8.1.2-h409715c_0.conda#9f88cfb15b7d08b25880b138f91e0eb4 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.40.0-py39hd1e30aa_0.conda#5f7c468bf9d9551a80187db7e809ef1f +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.1-nompi_h4f84152_100.conda#ff9ae10aa224826c07da7ef26cb0b717 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.7.0-pyha770c72_0.conda#ba3786c6846e46038fe60c785d46dc81 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-5.12.0-pyhd8ed1ab_0.conda#e5fd2260a231ee63b6969f4801082f2b https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 -https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py38h26c90d9_1008.tar.bz2#6bc8cd29312f4fc77156b78124e165cd -https://conda.anaconda.org/conda-forge/noarch/partd-1.3.0-pyhd8ed1ab_0.tar.bz2#af8c82d121e63082926062d61d9abb54 -https://conda.anaconda.org/conda-forge/linux-64/pillow-9.4.0-py38h961100d_2.conda#26a5eb5d9f097e5011d54aa5cc1571c8 -https://conda.anaconda.org/conda-forge/noarch/pip-23.0.1-pyhd8ed1ab_0.conda#8025ca83b8ba5430b640b83917c2a6f7 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.2.0-h8ffa02c_0.conda#8b9dcfabec5c6bcac98e89889fffa64e +https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py39h2ae25f5_1008.tar.bz2#d90acb3804f16c63eb6726652e4e25b3 +https://conda.anaconda.org/conda-forge/noarch/partd-1.4.0-pyhd8ed1ab_0.conda#721dab5803ea92ce02ddc4ee50aa0c48 +https://conda.anaconda.org/conda-forge/linux-64/pillow-10.0.0-py39haaeba84_0.conda#f97a95fab7c69678ebf6b57396b1323e +https://conda.anaconda.org/conda-forge/noarch/pip-23.1.2-pyhd8ed1ab_0.conda#7288da0d36821349cf1126e8670292df +https://conda.anaconda.org/conda-forge/linux-64/proj-9.2.1-ha643af7_0.conda#e992387307f4403ba0ec07d009032550 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/shapely-2.0.1-py38haaa171b_1.conda#fdd08c011257c5e4727cca36f04af74f -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.5.0-hd8ed1ab_0.conda#b3c594fde1a80a1fc3eb9cc4a5dfe392 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.1-py39hf1c3bca_1.conda#ae6bfe65e81d9b59a71cc01a2858650f +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.7.1-hd8ed1ab_0.conda#f96688577f1faa58096d06a45136afa2 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.3-pyhd8ed1ab_1.conda#89efeecbb24c62e2f1ed0b8ca959ec69 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 -https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py38h0a891b7_1005.tar.bz2#e99e08812dfff30fdd17b3f8838e2759 -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.1.1-py38h26c90d9_2.tar.bz2#0ea017e84efe45badce6c32f274dbf8e -https://conda.anaconda.org/conda-forge/linux-64/cryptography-40.0.1-py38h3d167d9_0.conda#c046be0e2eaf1f4076ff5633c538ee71 -https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-h9c3ff4c_1.tar.bz2#1192066d1296de9b492175a4cf43fe8a +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py39h0f8d45d_0.conda#180d4312005bc93f257e2997a8ee41cb +https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/importlib-resources-5.12.0-pyhd8ed1ab_0.conda#3544c818f0720c89eb16ae6940ab440b -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.1.0-hd8ed1ab_0.conda#90bab1d97fdb6bb40c8e00207bf222dc -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_hf3f8848_103.conda#c1014116efef918f438a88872ce46b4c -https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.2.0-pyhd8ed1ab_0.conda#f10c2cf447ca96f12a326b83c75b8e33 -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.5.0-py38h2f62729_1.conda#00785fd9270728fbfb82c80fc0229dc6 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.3.2-pyhd8ed1ab_0.conda#a3552db3a43810551cc93f9a4272380e +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.7.0-hd8ed1ab_0.conda#27a4cec373ec84d1c1aa02a1e37f8eaf +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h78c856c_106.conda#47665bf3dec451455474556ecd940ed2 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.8.0-pyhd8ed1ab_0.conda#3e4aca765371893ad848397794600632 +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.0-py39h5ed0f51_1.conda#9c455b3b3b55f13b2094932740cd3efb +https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b +https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.6.1-pyhd8ed1ab_0.conda#ec55ad569dd8b9184266e0d3db0b3bc7 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.0.0-h32699f2_1.conda#fdde5424ecef5f7ad310b4242229291c -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py38hd6c3c57_0.conda#3b8ba76acae09fbd4b2247c4ee4c0324 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.3-nompi_py38hd31e641_102.conda#1631559ac87f3f0742a8abd0ecd32e2d -https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.1.1-pyhd8ed1ab_0.conda#0b34aa3ab7e7ccb1765a03dd9ed29938 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.29.0-h95353b9_3.conda#6d038ad12516161a8a20d3ec8b0090d3 -https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.15-pyhd8ed1ab_0.conda#27db656619a55d727eaf5a6ece3d2fd6 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.5.1-py38h7e4f40d_0.conda#b12c8a72aef587f134f5ff048da0ed6f -https://conda.anaconda.org/conda-forge/noarch/requests-2.28.2-pyhd8ed1ab_1.conda#3bfbd6ead1d7299ed46dab3a7bf0bc8c +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py39he190548_0.conda#f2a931db797bb58bd335f4a857b4c898 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py39h4218a78_101.conda#8f5c25bb7accd1954d8b7fc689c5975c https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyha770c72_3.conda#5936894aade8240c867d292aa0d980c6 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.10.1-py38h10c12cc_0.conda#1cbc47bb9a600ce4a49d8da797d375bf -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.21.1-py38h1abf878_1.conda#4d102cd1e6db10034a6c97df4444833f -https://conda.anaconda.org/conda-forge/noarch/iris-3.4.1-pyhd8ed1ab_0.conda#4dcbc9255798749fb7e0f5f443d4b22a +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.30.2-h73bf81c_1.conda#12065974059e8a6292610e39d5e2b415 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.1-py39h6183b62_0.conda#81212684c03e970520656f1a62ab9d39 +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.21.1-py39h4bd5d67_1.conda#a60d65263a8ddbff5381ed91d4f6953e +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.5.2-py39h0f8d45d_0.conda#3743bb4450e2ae76b88ca49d92b10131 +https://conda.anaconda.org/conda-forge/noarch/iris-3.6.1-pyha770c72_0.conda#36d615b339058273520990fc78239116 + diff --git a/requirements/py310.yml b/requirements/py310.yml new file mode 100644 index 00000000..88f4183f --- /dev/null +++ b/requirements/py310.yml @@ -0,0 +1,25 @@ +name: iris-grib-dev + +channels: + - conda-forge + +dependencies: + - python=3.10 + +# Setup dependencies. + - setuptools + +# Core dependencies. + - iris>=3.0.2 + - python-eccodes + +# Optional dependencies. + - mo_pack + - pip + +# Test dependencies. + - mock + - filelock + - pep8 + - requests + - nose diff --git a/requirements/py311.yml b/requirements/py311.yml new file mode 100644 index 00000000..b97ee151 --- /dev/null +++ b/requirements/py311.yml @@ -0,0 +1,25 @@ +name: iris-grib-dev + +channels: + - conda-forge + +dependencies: + - python=3.11 + +# Setup dependencies. + - setuptools + +# Core dependencies. + - iris>=3.0.2 + - python-eccodes + +# Optional dependencies. + - mo_pack + - pip + +# Test dependencies. + - mock + - filelock + - pep8 + - requests + - nose diff --git a/requirements/py38.yml b/requirements/py39.yml similarity index 94% rename from requirements/py38.yml rename to requirements/py39.yml index 5fa58bb1..64d9c475 100644 --- a/requirements/py38.yml +++ b/requirements/py39.yml @@ -4,7 +4,7 @@ channels: - conda-forge dependencies: - - python=3.8 + - python=3.9 # Setup dependencies. - setuptools diff --git a/requirements/readthedocs.yml b/requirements/readthedocs.yml index 2239061d..b0c50b8b 120000 --- a/requirements/readthedocs.yml +++ b/requirements/readthedocs.yml @@ -1 +1 @@ -iris-grib.yml \ No newline at end of file +py311.yml \ No newline at end of file diff --git a/setup.py b/setup.py index b2b0fba2..d63511d1 100644 --- a/setup.py +++ b/setup.py @@ -84,7 +84,9 @@ def file_walk_relative(top, remove=''): keywords = ['iris', 'GRIB'], classifiers=[ 'Programming Language :: Python', - 'Programming Language :: Python :: 3.8', + 'Programming Language :: Python :: 3.9', + 'Programming Language :: Python :: 3.10', + 'Programming Language :: Python :: 3.11', 'Programming Language :: Python :: 3 :: Only', ], # NOTE: The Python 3 bindings to eccodes (eccodes-python) is available on From 00a95b265b0084a74df8ac8beced2e4216fb6731 Mon Sep 17 00:00:00 2001 From: david-bentley <75838121+david-bentley@users.noreply.github.com> Date: Fri, 7 Jul 2023 11:28:28 +0100 Subject: [PATCH 223/583] alter calculation of offset (#287) * alter calculation of offset * update test to mock grib_get_message_offset * swap gribapi for eccodes * correct arguments to fix failing tests --- iris_grib/__init__.py | 11 ++--------- iris_grib/message.py | 7 +++---- iris_grib/tests/unit/test_GribWrapper.py | 17 ++++++++++++----- 3 files changed, 17 insertions(+), 18 deletions(-) diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index 118886dd..c22f59aa 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -145,11 +145,7 @@ def __init__(self, grib_message, grib_fh=None): # Store the file pointer and message length from the current # grib message before it's changed by calls to the grib-api. if deferred: - # Note that, the grib-api has already read this message and - # advanced the file pointer to the end of the message. - offset = grib_fh.tell() - message_length = eccodes.codes_get_long( - grib_message, 'totalLength') + offset = eccodes.codes_get_message_offset(grib_message) # Initialise the key-extension dictionary. # NOTE: this attribute *must* exist, or the the __getattr__ overload @@ -170,11 +166,8 @@ def __init__(self, grib_message, grib_fh=None): if deferred: # Wrap the reference to the data payload within the data proxy # in order to support deferred data loading. - # The byte offset requires to be reset back to the first byte - # of this message. The file pointer offset is always at the end - # of the current message due to the grib-api reading the message. proxy = GribDataProxy(shape, np.array([0.]).dtype, grib_fh.name, - offset - message_length) + offset) self._data = as_lazy_data(proxy) else: self.data = _message_values(grib_message, shape) diff --git a/iris_grib/message.py b/iris_grib/message.py index 41d7db1c..4d673ed9 100644 --- a/iris_grib/message.py +++ b/iris_grib/message.py @@ -59,12 +59,11 @@ def messages_from_filename(filename): file_ref = _OpenFileRef(grib_fh) while True: - offset = grib_fh.tell() - grib_id = eccodes.codes_new_from_file( - grib_fh, eccodes.CODES_PRODUCT_GRIB - ) + grib_id = eccodes.codes_new_from_file(grib_fh, + eccodes.CODES_PRODUCT_GRIB) if grib_id is None: break + offset = eccodes.codes_get_message_offset(grib_id) raw_message = _RawGribMessage(grib_id) recreate_raw = _MessageLocation(filename, offset) yield GribMessage(raw_message, recreate_raw, file_ref=file_ref) diff --git a/iris_grib/tests/unit/test_GribWrapper.py b/iris_grib/tests/unit/test_GribWrapper.py index 48f703b7..d3d5964e 100644 --- a/iris_grib/tests/unit/test_GribWrapper.py +++ b/iris_grib/tests/unit/test_GribWrapper.py @@ -21,6 +21,7 @@ from iris_grib import GribWrapper, _load_generate +_offset = 0 _message_length = 1000 @@ -50,6 +51,10 @@ def _mock_codes_get_native_type(grib_message, key): return result +def _mock_codes_get_message_offset(grib_message): + return _offset + + class Test_edition(tests.IrisGribTest): def setUp(self): self.patch('iris_grib.GribWrapper._confirm_in_scope') @@ -58,7 +63,8 @@ def setUp(self): self.patch('eccodes.codes_get_string', _mock_codes_get_string) self.patch('eccodes.codes_get_native_type', _mock_codes_get_native_type) - self.tell = mock.Mock(side_effect=[_message_length]) + self.patch('eccodes.codes_get_message_offset', + _mock_codes_get_message_offset) def test_not_edition_1(self): def func(grib_message, key): @@ -71,7 +77,7 @@ def func(grib_message, key): def test_edition_1(self): grib_message = 'regular_ll' - grib_fh = mock.Mock(tell=self.tell) + grib_fh = mock.Mock() wrapper = GribWrapper(grib_message, grib_fh) self.assertEqual(wrapper.grib_message, grib_message) @@ -99,9 +105,10 @@ def setUp(self): self.patch('eccodes.codes_get_string', _mock_codes_get_string) self.patch('eccodes.codes_get_native_type', _mock_codes_get_native_type) - tell_tale = np.arange(1, 5) * _message_length - self.expected = tell_tale - _message_length - self.grib_fh = mock.Mock(tell=mock.Mock(side_effect=tell_tale)) + self.patch('eccodes.codes_get_message_offset', + _mock_codes_get_message_offset) + self.expected = np.atleast_1d(_offset) + self.grib_fh = mock.Mock() self.dtype = np.float64 self.path = self.grib_fh.name self.lookup = _mock_codes_get_long From 3fa468ca6a6821569e02f8c3739a66c7fcd3159b Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 10 Jul 2023 08:23:09 +0100 Subject: [PATCH 224/583] Updated environment lockfiles (#341) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 18 ++++++++---------- requirements/locks/py311-linux-64.lock | 18 ++++++++---------- requirements/locks/py39-linux-64.lock | 26 ++++++++++++-------------- 3 files changed, 28 insertions(+), 34 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 580289d9..aebd3e43 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: e0e9f15873aa1fc2dd47cf10a59a130baadd2548cadda686cffb335c1073dabf +# input_hash: da23d6f576283f7c8ba63dcf289b084779626cba812e6219f67b673ee4011fe4 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.5.7-hbcca054_0.conda#f5c65075fc34438d5b456c7f3f5ab695 @@ -63,7 +63,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libzip-1.9.2-hc929e4a_1.tar.bz2# https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 -https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-h3eb15da_6.conda#6b63daed8feeca47be78f323e793d555 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-hfc55251_7.conda#32ae18eb2a687912fc9e92a501c0a11b https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.4-h0f2a231_0.conda#876286b5941933a0f558777e57d883cc https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_9.conda#d47dee1856d9cb955b8076eeff304a5b https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-hca18f0e_1.conda#e1232042de76d24539a436d37597eb06 @@ -82,7 +82,7 @@ https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_9.conda#46 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.0.9-py310hd8f1fbe_9.conda#e2047ad2af52c01845f58b580c6cbd5c https://conda.anaconda.org/conda-forge/noarch/certifi-2023.5.7-pyhd8ed1ab_0.conda#5d1b71c942b8421285934dad1d891ebc https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.1.0-pyhd8ed1ab_0.conda#7fcff9f6f123696e940bda77bd4d6551 -https://conda.anaconda.org/conda-forge/noarch/click-8.1.3-unix_pyhd8ed1ab_2.tar.bz2#20e4087407c7cb04a40817114b333dbf +https://conda.anaconda.org/conda-forge/noarch/click-8.1.4-unix_pyh707e725_0.conda#fcae73fbdce7981fd500c626bb1ba6ab https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.1-pyhd8ed1ab_0.conda#b325bfc4cff7d7f8a868f1f7ecc4ed16 https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb https://conda.anaconda.org/conda-forge/noarch/filelock-3.12.2-pyhd8ed1ab_0.conda#53522ec72e6adae42bd373ef58357230 @@ -119,10 +119,9 @@ https://conda.anaconda.org/conda-forge/noarch/zipp-3.15.0-pyhd8ed1ab_0.conda#130 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py310h255011f_3.conda#800596144bb613cd7ac58b80900ce835 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py310hde88566_1.tar.bz2#94ce7a76b0c912279f6958e0b6b21d2b https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.1.0-py310hd41b1e2_0.conda#684399f9ddc0b9d6f3b6164f6107098e -https://conda.anaconda.org/conda-forge/linux-64/curl-8.1.2-h409715c_0.conda#9f88cfb15b7d08b25880b138f91e0eb4 https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.40.0-py310h2372a71_0.conda#d3d83b419c81ac718a9221442707882b https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.1-nompi_h4f84152_100.conda#ff9ae10aa224826c07da7ef26cb0b717 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.7.0-pyha770c72_0.conda#ba3786c6846e46038fe60c785d46dc81 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda#4e9f59a060c3be52bc4ddc46ee9b6946 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py310hde88566_1008.tar.bz2#f9dd8a7a2fcc23eb2cd95cd817c949e7 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.0-pyhd8ed1ab_0.conda#721dab5803ea92ce02ddc4ee50aa0c48 @@ -136,13 +135,13 @@ https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.3-pyhd8ed1ab_1.conda#8 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py310h278f3c1_0.conda#f2d3f2542a2467f479e809ac7b901ac2 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.7.0-hd8ed1ab_0.conda#27a4cec373ec84d1c1aa02a1e37f8eaf -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h78c856c_106.conda#47665bf3dec451455474556ecd940ed2 +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.8.0-hd8ed1ab_0.conda#b279b07ce18058034e5b3606ba103a8b +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_he09a3a9_107.conda#56b9982aec30923b1949e07466f275ae https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py310he60537e_0.conda#68b2dd34c69d08b05a9db5e3596fe3ee -https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.8.0-pyhd8ed1ab_0.conda#3e4aca765371893ad848397794600632 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.8.1-pyhd8ed1ab_0.conda#e76070baecfaca6ecdb5fbd5af7c9309 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.0-py310h24ef57a_1.conda#a689e86d7bbab67f889fc384aa72b088 https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b -https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.6.1-pyhd8ed1ab_0.conda#ec55ad569dd8b9184266e0d3db0b3bc7 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.7.0-pyhd8ed1ab_0.conda#f92e9296a1e838000e9df124c7a39bbc https://conda.anaconda.org/conda-forge/linux-64/jasper-4.0.0-h32699f2_1.conda#fdde5424ecef5f7ad310b4242229291c https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py310h6f5dce6_101.conda#0d50bea104512f2728676a8bff8840d3 https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyha770c72_3.conda#5936894aade8240c867d292aa0d980c6 @@ -151,4 +150,3 @@ https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.1-py310ha4c1d20_0.con https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.21.1-py310h7eb24ba_1.conda#e727db22a14344608c2caeccaa9e9d2b https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.5.2-py310h278f3c1_0.conda#ca7b86ade6b57bf4539342d31a1b40cf https://conda.anaconda.org/conda-forge/noarch/iris-3.6.1-pyha770c72_0.conda#36d615b339058273520990fc78239116 - diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index f34db360..7945798c 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 3ba568027ca22990322f816ccef334c58bb3bd902c79cceded82285400ac7c13 +# input_hash: 7ba8dd0ea14f6731b227a9f412cf87a9038d72cc8ce6b75cfe3c6f1d6b2e94f7 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.5.7-hbcca054_0.conda#f5c65075fc34438d5b456c7f3f5ab695 @@ -63,7 +63,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libzip-1.9.2-hc929e4a_1.tar.bz2# https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 -https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-h3eb15da_6.conda#6b63daed8feeca47be78f323e793d555 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-hfc55251_7.conda#32ae18eb2a687912fc9e92a501c0a11b https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.4-h0f2a231_0.conda#876286b5941933a0f558777e57d883cc https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_9.conda#d47dee1856d9cb955b8076eeff304a5b https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-hca18f0e_1.conda#e1232042de76d24539a436d37597eb06 @@ -82,7 +82,7 @@ https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_9.conda#46 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.0.9-py311ha362b79_9.conda#ced5340f5dc6cff43a80deac8d0e398f https://conda.anaconda.org/conda-forge/noarch/certifi-2023.5.7-pyhd8ed1ab_0.conda#5d1b71c942b8421285934dad1d891ebc https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.1.0-pyhd8ed1ab_0.conda#7fcff9f6f123696e940bda77bd4d6551 -https://conda.anaconda.org/conda-forge/noarch/click-8.1.3-unix_pyhd8ed1ab_2.tar.bz2#20e4087407c7cb04a40817114b333dbf +https://conda.anaconda.org/conda-forge/noarch/click-8.1.4-unix_pyh707e725_0.conda#fcae73fbdce7981fd500c626bb1ba6ab https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.1-pyhd8ed1ab_0.conda#b325bfc4cff7d7f8a868f1f7ecc4ed16 https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb https://conda.anaconda.org/conda-forge/noarch/filelock-3.12.2-pyhd8ed1ab_0.conda#53522ec72e6adae42bd373ef58357230 @@ -118,10 +118,9 @@ https://conda.anaconda.org/conda-forge/noarch/zipp-3.15.0-pyhd8ed1ab_0.conda#130 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py311h409f033_3.conda#9025d0786dbbe4bc91fd8e85502decce https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py311h4c7f6c3_1.tar.bz2#c7e54004ffd03f8db0a58ab949f2a00b https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.1.0-py311h9547e67_0.conda#daf3f23397ab2265d0cdfa339f3627ba -https://conda.anaconda.org/conda-forge/linux-64/curl-8.1.2-h409715c_0.conda#9f88cfb15b7d08b25880b138f91e0eb4 https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.40.0-py311h459d7ec_0.conda#b19f671a6b221f922cf871d71a71c0fa https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.1-nompi_h4f84152_100.conda#ff9ae10aa224826c07da7ef26cb0b717 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.7.0-pyha770c72_0.conda#ba3786c6846e46038fe60c785d46dc81 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda#4e9f59a060c3be52bc4ddc46ee9b6946 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py311h4c7f6c3_1008.tar.bz2#5998dff78c3b82a07ad77f2ae1ec1c44 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.0-pyhd8ed1ab_0.conda#721dab5803ea92ce02ddc4ee50aa0c48 @@ -135,13 +134,13 @@ https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.3-pyhd8ed1ab_1.conda#8 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h1f0f07a_0.conda#43a71a823583d75308eaf3a06c8f150b https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.7.0-hd8ed1ab_0.conda#27a4cec373ec84d1c1aa02a1e37f8eaf -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h78c856c_106.conda#47665bf3dec451455474556ecd940ed2 +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.8.0-hd8ed1ab_0.conda#b279b07ce18058034e5b3606ba103a8b +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_he09a3a9_107.conda#56b9982aec30923b1949e07466f275ae https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py311h8597a09_0.conda#70c3b734ffe82c16b6d121aaa11929a8 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.8.0-pyhd8ed1ab_0.conda#3e4aca765371893ad848397794600632 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.8.1-pyhd8ed1ab_0.conda#e76070baecfaca6ecdb5fbd5af7c9309 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.0-py311ha169711_1.conda#92633556d37e88ce45193374d408072c https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b -https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.6.1-pyhd8ed1ab_0.conda#ec55ad569dd8b9184266e0d3db0b3bc7 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.7.0-pyhd8ed1ab_0.conda#f92e9296a1e838000e9df124c7a39bbc https://conda.anaconda.org/conda-forge/linux-64/jasper-4.0.0-h32699f2_1.conda#fdde5424ecef5f7ad310b4242229291c https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py311h9a7c333_101.conda#1dc70c7c3352c0ff1f861d866860db37 https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyha770c72_3.conda#5936894aade8240c867d292aa0d980c6 @@ -150,4 +149,3 @@ https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.1-py311h64a7726_0.con https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.21.1-py311hd88b842_1.conda#f19feb9440890ccb806a367ea9ae0654 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.5.2-py311h1f0f07a_0.conda#5346e127ae52857ab1805a7cb8a89ab6 https://conda.anaconda.org/conda-forge/noarch/iris-3.6.1-pyha770c72_0.conda#36d615b339058273520990fc78239116 - diff --git a/requirements/locks/py39-linux-64.lock b/requirements/locks/py39-linux-64.lock index 9c7c3b51..b35dacfa 100644 --- a/requirements/locks/py39-linux-64.lock +++ b/requirements/locks/py39-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: bc9e2db41b8a4b40c22615794ea0344a86f88250e8939b613a5a4051037471fd +# input_hash: 127b02bcf9b2a0ba5f66b9f1dac937376ec9d7bfb70f94747a1451c820db2128 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.5.7-hbcca054_0.conda#f5c65075fc34438d5b456c7f3f5ab695 @@ -63,7 +63,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libzip-1.9.2-hc929e4a_1.tar.bz2# https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 -https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-h3eb15da_6.conda#6b63daed8feeca47be78f323e793d555 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-hfc55251_7.conda#32ae18eb2a687912fc9e92a501c0a11b https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.4-h0f2a231_0.conda#876286b5941933a0f558777e57d883cc https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_9.conda#d47dee1856d9cb955b8076eeff304a5b https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-hca18f0e_1.conda#e1232042de76d24539a436d37597eb06 @@ -82,7 +82,7 @@ https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_9.conda#46 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.0.9-py39h5a03fae_9.conda#d1601752c6f47af7bedf838be3d8ca6b https://conda.anaconda.org/conda-forge/noarch/certifi-2023.5.7-pyhd8ed1ab_0.conda#5d1b71c942b8421285934dad1d891ebc https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.1.0-pyhd8ed1ab_0.conda#7fcff9f6f123696e940bda77bd4d6551 -https://conda.anaconda.org/conda-forge/noarch/click-8.1.3-unix_pyhd8ed1ab_2.tar.bz2#20e4087407c7cb04a40817114b333dbf +https://conda.anaconda.org/conda-forge/noarch/click-8.1.4-unix_pyh707e725_0.conda#fcae73fbdce7981fd500c626bb1ba6ab https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.1-pyhd8ed1ab_0.conda#b325bfc4cff7d7f8a868f1f7ecc4ed16 https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb https://conda.anaconda.org/conda-forge/noarch/filelock-3.12.2-pyhd8ed1ab_0.conda#53522ec72e6adae42bd373ef58357230 @@ -102,7 +102,7 @@ https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-hfec8fc6_2.conda# https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda#91cda59e66e1e4afe9476f8ef98f5c30 https://conda.anaconda.org/conda-forge/noarch/pep8-1.7.1-py_0.tar.bz2#d0b5bc3aebbffcb175bf8a1d419acb79 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.0-pyhd8ed1ab_0.conda#d3ed087d1f7f8f5590e8e87b57a8ce64 +https://conda.anaconda.org/conda-forge/noarch/pyparsing-2.4.7-pyhd8ed1ab_1.tar.bz2#49cdb8bb03aab9dd1e9e1b30ee2e970c https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.2.0-py39h72bdee0_0.conda#18927f971926b7271600368de71de557 @@ -119,11 +119,10 @@ https://conda.anaconda.org/conda-forge/noarch/zipp-3.15.0-pyhd8ed1ab_0.conda#130 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py39he91dace_3.conda#20080319ef73fbad74dcd6d62f2a3ffe https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py39h2ae25f5_1.tar.bz2#c943fb9a2818ecc5be1e0ecc8b7738f1 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.1.0-py39h7633fee_0.conda#54e6f32e448fdc273606011f0940d076 -https://conda.anaconda.org/conda-forge/linux-64/curl-8.1.2-h409715c_0.conda#9f88cfb15b7d08b25880b138f91e0eb4 https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.40.0-py39hd1e30aa_0.conda#5f7c468bf9d9551a80187db7e809ef1f https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.1-nompi_h4f84152_100.conda#ff9ae10aa224826c07da7ef26cb0b717 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.7.0-pyha770c72_0.conda#ba3786c6846e46038fe60c785d46dc81 -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-5.12.0-pyhd8ed1ab_0.conda#e5fd2260a231ee63b6969f4801082f2b +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda#4e9f59a060c3be52bc4ddc46ee9b6946 +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-5.13.0-pyhd8ed1ab_0.conda#748955a096313b51b314263402b83250 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py39h2ae25f5_1008.tar.bz2#d90acb3804f16c63eb6726652e4e25b3 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.0-pyhd8ed1ab_0.conda#721dab5803ea92ce02ddc4ee50aa0c48 @@ -137,15 +136,15 @@ https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.3-pyhd8ed1ab_1.conda#8 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py39h0f8d45d_0.conda#180d4312005bc93f257e2997a8ee41cb https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 -https://conda.anaconda.org/conda-forge/noarch/importlib-resources-5.12.0-pyhd8ed1ab_0.conda#3544c818f0720c89eb16ae6940ab440b -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.7.0-hd8ed1ab_0.conda#27a4cec373ec84d1c1aa02a1e37f8eaf -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h78c856c_106.conda#47665bf3dec451455474556ecd940ed2 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.8.0-pyhd8ed1ab_0.conda#3e4aca765371893ad848397794600632 +https://conda.anaconda.org/conda-forge/noarch/importlib-resources-5.13.0-pyhd8ed1ab_0.conda#5facf625dd29f34c73733030a10a62a0 +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.8.0-hd8ed1ab_0.conda#b279b07ce18058034e5b3606ba103a8b +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_he09a3a9_107.conda#56b9982aec30923b1949e07466f275ae +https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.8.1-pyhd8ed1ab_0.conda#e76070baecfaca6ecdb5fbd5af7c9309 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.0-py39h5ed0f51_1.conda#9c455b3b3b55f13b2094932740cd3efb https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b -https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.6.1-pyhd8ed1ab_0.conda#ec55ad569dd8b9184266e0d3db0b3bc7 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.7.0-pyhd8ed1ab_0.conda#f92e9296a1e838000e9df124c7a39bbc https://conda.anaconda.org/conda-forge/linux-64/jasper-4.0.0-h32699f2_1.conda#fdde5424ecef5f7ad310b4242229291c -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py39he190548_0.conda#f2a931db797bb58bd335f4a857b4c898 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.2-py39h0126182_0.conda#61cee808ff7830fcceeb4f336cc738b1 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py39h4218a78_101.conda#8f5c25bb7accd1954d8b7fc689c5975c https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyha770c72_3.conda#5936894aade8240c867d292aa0d980c6 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.30.2-h73bf81c_1.conda#12065974059e8a6292610e39d5e2b415 @@ -153,4 +152,3 @@ https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.1-py39h6183b62_0.cond https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.21.1-py39h4bd5d67_1.conda#a60d65263a8ddbff5381ed91d4f6953e https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.5.2-py39h0f8d45d_0.conda#3743bb4450e2ae76b88ca49d92b10131 https://conda.anaconda.org/conda-forge/noarch/iris-3.6.1-pyha770c72_0.conda#36d615b339058273520990fc78239116 - From 5ad350fde8d4be661a550ede9819322e42e11a92 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Thu, 20 Jul 2023 12:23:55 +0100 Subject: [PATCH 225/583] Updated environment lockfiles (#342) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 18 +++++++++--------- requirements/locks/py311-linux-64.lock | 18 +++++++++--------- requirements/locks/py39-linux-64.lock | 26 +++++++++++++------------- 3 files changed, 31 insertions(+), 31 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index aebd3e43..6cdb4b86 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -67,7 +67,7 @@ https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-hfc55251_7.conda#32ae https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.4-h0f2a231_0.conda#876286b5941933a0f558777e57d883cc https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_9.conda#d47dee1856d9cb955b8076eeff304a5b https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-hca18f0e_1.conda#e1232042de76d24539a436d37597eb06 -https://conda.anaconda.org/conda-forge/linux-64/krb5-1.20.1-h81ceb04_0.conda#89a41adce7106749573d883b2f657d78 +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.1-h659d440_0.conda#1b5126ec25763eb17ef74c8763d26e84 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-17_linux64_openblas.conda#7ef0969b00fe3d6eef56a8151d3afb29 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1002.conda#4c4dce87e96b321308f81ba2c10d2897 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-17_linux64_openblas.conda#a2103882c46492e26500fcb56c03de8b @@ -81,8 +81,8 @@ https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda#3e https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_9.conda#4601544b4982ba1861fa9b9c607b2c06 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.0.9-py310hd8f1fbe_9.conda#e2047ad2af52c01845f58b580c6cbd5c https://conda.anaconda.org/conda-forge/noarch/certifi-2023.5.7-pyhd8ed1ab_0.conda#5d1b71c942b8421285934dad1d891ebc -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.1.0-pyhd8ed1ab_0.conda#7fcff9f6f123696e940bda77bd4d6551 -https://conda.anaconda.org/conda-forge/noarch/click-8.1.4-unix_pyh707e725_0.conda#fcae73fbdce7981fd500c626bb1ba6ab +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.2.0-pyhd8ed1ab_0.conda#313516e9a4b08b12dfb1e1cd390a96e3 +https://conda.anaconda.org/conda-forge/noarch/click-8.1.5-unix_pyh707e725_0.conda#4f63f3e01a26e7058eabfa5f984cd6f3 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.1-pyhd8ed1ab_0.conda#b325bfc4cff7d7f8a868f1f7ecc4ed16 https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb https://conda.anaconda.org/conda-forge/noarch/filelock-3.12.2-pyhd8ed1ab_0.conda#53522ec72e6adae42bd373ef58357230 @@ -91,13 +91,13 @@ https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.6.0-pyh1a96a4e_0.conda https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.4-py310hbf28c38_1.tar.bz2#ad5647e517ba68e2868ef2e6e6ff7723 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-haa2dc70_1.conda#980d8aca0bc23ca73fa8caa3e7c84c28 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.1.2-h409715c_0.conda#50c873c9660ed116707ae15b663928d8 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.1.2-hca28451_1.conda#b3bcefde107f8ac4f114574df0e1972e https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py310h2372a71_0.conda#5597d9f9778af6883ae64f0e7d39416c -https://conda.anaconda.org/conda-forge/noarch/mock-5.0.2-pyhd8ed1ab_0.conda#541e4834b1e46ed786829dc63e4d4ca2 +https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda#926c67c0310094cf421ad13f7d3f38e5 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 -https://conda.anaconda.org/conda-forge/linux-64/numpy-1.25.0-py310ha4c1d20_0.conda#03319f78e5c9c8d90c0110e2c6ed24f6 +https://conda.anaconda.org/conda-forge/linux-64/numpy-1.25.1-py310ha4c1d20_0.conda#3810cbf2635cb1d0edb97715d4ad74e7 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-hfec8fc6_2.conda#5ce6a42505c6e9e6151c54c3ec8d68ea https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda#91cda59e66e1e4afe9476f8ef98f5c30 https://conda.anaconda.org/conda-forge/noarch/pep8-1.7.1-py_0.tar.bz2#d0b5bc3aebbffcb175bf8a1d419acb79 @@ -115,11 +115,11 @@ https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.0.0-py310h5764c6 https://conda.anaconda.org/conda-forge/noarch/wheel-0.40.0-pyhd8ed1ab_0.conda#49bb0d9e60ce1db25e151780331bb5f3 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a -https://conda.anaconda.org/conda-forge/noarch/zipp-3.15.0-pyhd8ed1ab_0.conda#13018819ca8f5b7cc675a8faf1f5fedf +https://conda.anaconda.org/conda-forge/noarch/zipp-3.16.2-pyhd8ed1ab_0.conda#2da0451b54c4563c32490cb1b7cf68a1 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py310h255011f_3.conda#800596144bb613cd7ac58b80900ce835 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py310hde88566_1.tar.bz2#94ce7a76b0c912279f6958e0b6b21d2b https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.1.0-py310hd41b1e2_0.conda#684399f9ddc0b9d6f3b6164f6107098e -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.40.0-py310h2372a71_0.conda#d3d83b419c81ac718a9221442707882b +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.41.0-py310h2372a71_0.conda#606aea800172f81896b21cabc5575206 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.1-nompi_h4f84152_100.conda#ff9ae10aa224826c07da7ef26cb0b717 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda#4e9f59a060c3be52bc4ddc46ee9b6946 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 @@ -145,7 +145,7 @@ https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.7.0-pyhd8ed1ab_0.co https://conda.anaconda.org/conda-forge/linux-64/jasper-4.0.0-h32699f2_1.conda#fdde5424ecef5f7ad310b4242229291c https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py310h6f5dce6_101.conda#0d50bea104512f2728676a8bff8840d3 https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyha770c72_3.conda#5936894aade8240c867d292aa0d980c6 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.30.2-h73bf81c_1.conda#12065974059e8a6292610e39d5e2b415 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.31.0-h73bf81c_0.conda#ffb754859219f4d8fbd9b7cc3337dd27 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.1-py310ha4c1d20_0.conda#300d3b434872eb84965864f0fcc5b5da https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.21.1-py310h7eb24ba_1.conda#e727db22a14344608c2caeccaa9e9d2b https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.5.2-py310h278f3c1_0.conda#ca7b86ade6b57bf4539342d31a1b40cf diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 7945798c..22b29e19 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -67,7 +67,7 @@ https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-hfc55251_7.conda#32ae https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.4-h0f2a231_0.conda#876286b5941933a0f558777e57d883cc https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_9.conda#d47dee1856d9cb955b8076eeff304a5b https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-hca18f0e_1.conda#e1232042de76d24539a436d37597eb06 -https://conda.anaconda.org/conda-forge/linux-64/krb5-1.20.1-h81ceb04_0.conda#89a41adce7106749573d883b2f657d78 +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.1-h659d440_0.conda#1b5126ec25763eb17ef74c8763d26e84 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-17_linux64_openblas.conda#7ef0969b00fe3d6eef56a8151d3afb29 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1002.conda#4c4dce87e96b321308f81ba2c10d2897 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-17_linux64_openblas.conda#a2103882c46492e26500fcb56c03de8b @@ -81,8 +81,8 @@ https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda#3e https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_9.conda#4601544b4982ba1861fa9b9c607b2c06 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.0.9-py311ha362b79_9.conda#ced5340f5dc6cff43a80deac8d0e398f https://conda.anaconda.org/conda-forge/noarch/certifi-2023.5.7-pyhd8ed1ab_0.conda#5d1b71c942b8421285934dad1d891ebc -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.1.0-pyhd8ed1ab_0.conda#7fcff9f6f123696e940bda77bd4d6551 -https://conda.anaconda.org/conda-forge/noarch/click-8.1.4-unix_pyh707e725_0.conda#fcae73fbdce7981fd500c626bb1ba6ab +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.2.0-pyhd8ed1ab_0.conda#313516e9a4b08b12dfb1e1cd390a96e3 +https://conda.anaconda.org/conda-forge/noarch/click-8.1.5-unix_pyh707e725_0.conda#4f63f3e01a26e7058eabfa5f984cd6f3 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.1-pyhd8ed1ab_0.conda#b325bfc4cff7d7f8a868f1f7ecc4ed16 https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb https://conda.anaconda.org/conda-forge/noarch/filelock-3.12.2-pyhd8ed1ab_0.conda#53522ec72e6adae42bd373ef58357230 @@ -91,13 +91,13 @@ https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.6.0-pyh1a96a4e_0.conda https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.4-py311h4dd048b_1.tar.bz2#46d451f575392c01dc193069bd89766d https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-haa2dc70_1.conda#980d8aca0bc23ca73fa8caa3e7c84c28 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.1.2-h409715c_0.conda#50c873c9660ed116707ae15b663928d8 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.1.2-hca28451_1.conda#b3bcefde107f8ac4f114574df0e1972e https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py311h459d7ec_0.conda#9904dc4adb5d547cb21e136f98cb24b0 -https://conda.anaconda.org/conda-forge/noarch/mock-5.0.2-pyhd8ed1ab_0.conda#541e4834b1e46ed786829dc63e4d4ca2 +https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda#926c67c0310094cf421ad13f7d3f38e5 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 -https://conda.anaconda.org/conda-forge/linux-64/numpy-1.25.0-py311h64a7726_0.conda#4df60430eca64502eb01e02df92246bf +https://conda.anaconda.org/conda-forge/linux-64/numpy-1.25.1-py311h64a7726_0.conda#b32456e3b3b4d375860ce12163f20122 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-hfec8fc6_2.conda#5ce6a42505c6e9e6151c54c3ec8d68ea https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda#91cda59e66e1e4afe9476f8ef98f5c30 https://conda.anaconda.org/conda-forge/noarch/pep8-1.7.1-py_0.tar.bz2#d0b5bc3aebbffcb175bf8a1d419acb79 @@ -114,11 +114,11 @@ https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.7.1-pyha770c72 https://conda.anaconda.org/conda-forge/noarch/wheel-0.40.0-pyhd8ed1ab_0.conda#49bb0d9e60ce1db25e151780331bb5f3 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a -https://conda.anaconda.org/conda-forge/noarch/zipp-3.15.0-pyhd8ed1ab_0.conda#13018819ca8f5b7cc675a8faf1f5fedf +https://conda.anaconda.org/conda-forge/noarch/zipp-3.16.2-pyhd8ed1ab_0.conda#2da0451b54c4563c32490cb1b7cf68a1 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py311h409f033_3.conda#9025d0786dbbe4bc91fd8e85502decce https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py311h4c7f6c3_1.tar.bz2#c7e54004ffd03f8db0a58ab949f2a00b https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.1.0-py311h9547e67_0.conda#daf3f23397ab2265d0cdfa339f3627ba -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.40.0-py311h459d7ec_0.conda#b19f671a6b221f922cf871d71a71c0fa +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.41.0-py311h459d7ec_0.conda#dbe23d19ab7f05bb08dd7d1838dc5547 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.1-nompi_h4f84152_100.conda#ff9ae10aa224826c07da7ef26cb0b717 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda#4e9f59a060c3be52bc4ddc46ee9b6946 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 @@ -144,7 +144,7 @@ https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.7.0-pyhd8ed1ab_0.co https://conda.anaconda.org/conda-forge/linux-64/jasper-4.0.0-h32699f2_1.conda#fdde5424ecef5f7ad310b4242229291c https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py311h9a7c333_101.conda#1dc70c7c3352c0ff1f861d866860db37 https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyha770c72_3.conda#5936894aade8240c867d292aa0d980c6 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.30.2-h73bf81c_1.conda#12065974059e8a6292610e39d5e2b415 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.31.0-h73bf81c_0.conda#ffb754859219f4d8fbd9b7cc3337dd27 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.1-py311h64a7726_0.conda#356da36102fc1eeb8a81e6d79e53bc7e https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.21.1-py311hd88b842_1.conda#f19feb9440890ccb806a367ea9ae0654 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.5.2-py311h1f0f07a_0.conda#5346e127ae52857ab1805a7cb8a89ab6 diff --git a/requirements/locks/py39-linux-64.lock b/requirements/locks/py39-linux-64.lock index b35dacfa..2f25b6ea 100644 --- a/requirements/locks/py39-linux-64.lock +++ b/requirements/locks/py39-linux-64.lock @@ -67,7 +67,7 @@ https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-hfc55251_7.conda#32ae https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.4-h0f2a231_0.conda#876286b5941933a0f558777e57d883cc https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_9.conda#d47dee1856d9cb955b8076eeff304a5b https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-hca18f0e_1.conda#e1232042de76d24539a436d37597eb06 -https://conda.anaconda.org/conda-forge/linux-64/krb5-1.20.1-h81ceb04_0.conda#89a41adce7106749573d883b2f657d78 +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.1-h659d440_0.conda#1b5126ec25763eb17ef74c8763d26e84 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-17_linux64_openblas.conda#7ef0969b00fe3d6eef56a8151d3afb29 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1002.conda#4c4dce87e96b321308f81ba2c10d2897 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-17_linux64_openblas.conda#a2103882c46492e26500fcb56c03de8b @@ -81,8 +81,8 @@ https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda#3e https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_9.conda#4601544b4982ba1861fa9b9c607b2c06 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.0.9-py39h5a03fae_9.conda#d1601752c6f47af7bedf838be3d8ca6b https://conda.anaconda.org/conda-forge/noarch/certifi-2023.5.7-pyhd8ed1ab_0.conda#5d1b71c942b8421285934dad1d891ebc -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.1.0-pyhd8ed1ab_0.conda#7fcff9f6f123696e940bda77bd4d6551 -https://conda.anaconda.org/conda-forge/noarch/click-8.1.4-unix_pyh707e725_0.conda#fcae73fbdce7981fd500c626bb1ba6ab +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.2.0-pyhd8ed1ab_0.conda#313516e9a4b08b12dfb1e1cd390a96e3 +https://conda.anaconda.org/conda-forge/noarch/click-8.1.5-unix_pyh707e725_0.conda#4f63f3e01a26e7058eabfa5f984cd6f3 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.1-pyhd8ed1ab_0.conda#b325bfc4cff7d7f8a868f1f7ecc4ed16 https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb https://conda.anaconda.org/conda-forge/noarch/filelock-3.12.2-pyhd8ed1ab_0.conda#53522ec72e6adae42bd373ef58357230 @@ -91,18 +91,18 @@ https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.6.0-pyh1a96a4e_0.conda https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.4-py39hf939315_1.tar.bz2#41679a052a8ce841c74df1ebc802e411 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-haa2dc70_1.conda#980d8aca0bc23ca73fa8caa3e7c84c28 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.1.2-h409715c_0.conda#50c873c9660ed116707ae15b663928d8 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.1.2-hca28451_1.conda#b3bcefde107f8ac4f114574df0e1972e https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py39hd1e30aa_0.conda#9c858d105816f454c6b64f3e19184b60 -https://conda.anaconda.org/conda-forge/noarch/mock-5.0.2-pyhd8ed1ab_0.conda#541e4834b1e46ed786829dc63e4d4ca2 +https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda#926c67c0310094cf421ad13f7d3f38e5 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 -https://conda.anaconda.org/conda-forge/linux-64/numpy-1.25.0-py39h6183b62_0.conda#02b87fef8e4c72be8256435ed59fe8de +https://conda.anaconda.org/conda-forge/linux-64/numpy-1.25.1-py39h6183b62_0.conda#d3e2ec4b400a6ad93057a29b7e3cb701 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-hfec8fc6_2.conda#5ce6a42505c6e9e6151c54c3ec8d68ea https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda#91cda59e66e1e4afe9476f8ef98f5c30 https://conda.anaconda.org/conda-forge/noarch/pep8-1.7.1-py_0.tar.bz2#d0b5bc3aebbffcb175bf8a1d419acb79 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff -https://conda.anaconda.org/conda-forge/noarch/pyparsing-2.4.7-pyhd8ed1ab_1.tar.bz2#49cdb8bb03aab9dd1e9e1b30ee2e970c +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.0-pyhd8ed1ab_0.conda#d3ed087d1f7f8f5590e8e87b57a8ce64 https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.2.0-py39h72bdee0_0.conda#18927f971926b7271600368de71de557 @@ -115,14 +115,14 @@ https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.0.0-py39hb9d737c https://conda.anaconda.org/conda-forge/noarch/wheel-0.40.0-pyhd8ed1ab_0.conda#49bb0d9e60ce1db25e151780331bb5f3 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a -https://conda.anaconda.org/conda-forge/noarch/zipp-3.15.0-pyhd8ed1ab_0.conda#13018819ca8f5b7cc675a8faf1f5fedf +https://conda.anaconda.org/conda-forge/noarch/zipp-3.16.2-pyhd8ed1ab_0.conda#2da0451b54c4563c32490cb1b7cf68a1 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py39he91dace_3.conda#20080319ef73fbad74dcd6d62f2a3ffe https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py39h2ae25f5_1.tar.bz2#c943fb9a2818ecc5be1e0ecc8b7738f1 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.1.0-py39h7633fee_0.conda#54e6f32e448fdc273606011f0940d076 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.40.0-py39hd1e30aa_0.conda#5f7c468bf9d9551a80187db7e809ef1f +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.41.0-py39hd1e30aa_0.conda#2de1f1007cb53e2d8e062cabea02f883 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.1-nompi_h4f84152_100.conda#ff9ae10aa224826c07da7ef26cb0b717 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda#4e9f59a060c3be52bc4ddc46ee9b6946 -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-5.13.0-pyhd8ed1ab_0.conda#748955a096313b51b314263402b83250 +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.0.0-pyhd8ed1ab_1.conda#a08b6be5bf18b9d2a927d3457750f82e https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py39h2ae25f5_1008.tar.bz2#d90acb3804f16c63eb6726652e4e25b3 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.0-pyhd8ed1ab_0.conda#721dab5803ea92ce02ddc4ee50aa0c48 @@ -136,7 +136,7 @@ https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.3-pyhd8ed1ab_1.conda#8 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py39h0f8d45d_0.conda#180d4312005bc93f257e2997a8ee41cb https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 -https://conda.anaconda.org/conda-forge/noarch/importlib-resources-5.13.0-pyhd8ed1ab_0.conda#5facf625dd29f34c73733030a10a62a0 +https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.0.0-pyhd8ed1ab_1.conda#d69f29916f934f30adb1dd5fff4d9a8b https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.8.0-hd8ed1ab_0.conda#b279b07ce18058034e5b3606ba103a8b https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_he09a3a9_107.conda#56b9982aec30923b1949e07466f275ae https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.8.1-pyhd8ed1ab_0.conda#e76070baecfaca6ecdb5fbd5af7c9309 @@ -144,10 +144,10 @@ https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.0-py39h5ed0f51_1.cond https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.7.0-pyhd8ed1ab_0.conda#f92e9296a1e838000e9df124c7a39bbc https://conda.anaconda.org/conda-forge/linux-64/jasper-4.0.0-h32699f2_1.conda#fdde5424ecef5f7ad310b4242229291c -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.2-py39h0126182_0.conda#61cee808ff7830fcceeb4f336cc738b1 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py39he190548_0.conda#f2a931db797bb58bd335f4a857b4c898 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py39h4218a78_101.conda#8f5c25bb7accd1954d8b7fc689c5975c https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyha770c72_3.conda#5936894aade8240c867d292aa0d980c6 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.30.2-h73bf81c_1.conda#12065974059e8a6292610e39d5e2b415 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.31.0-h73bf81c_0.conda#ffb754859219f4d8fbd9b7cc3337dd27 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.1-py39h6183b62_0.conda#81212684c03e970520656f1a62ab9d39 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.21.1-py39h4bd5d67_1.conda#a60d65263a8ddbff5381ed91d4f6953e https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.5.2-py39h0f8d45d_0.conda#3743bb4450e2ae76b88ca49d92b10131 From 376ab00d6b5954209de49cb1edc929148c777e15 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 31 Jul 2023 11:20:57 +0100 Subject: [PATCH 226/583] Updated environment lockfiles (#346) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 42 +++++++++++++++++--------- requirements/locks/py311-linux-64.lock | 42 +++++++++++++++++--------- requirements/locks/py39-linux-64.lock | 42 +++++++++++++++++--------- 3 files changed, 84 insertions(+), 42 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 6cdb4b86..15735ac4 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -3,7 +3,7 @@ # input_hash: da23d6f576283f7c8ba63dcf289b084779626cba812e6219f67b673ee4011fe4 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.5.7-hbcca054_0.conda#f5c65075fc34438d5b456c7f3f5ab695 +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.7.22-hbcca054_0.conda#a73ecd2988327ad4c8f2c331482917f2 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.1.0-h15d22d2_0.conda#afb656a334c409dd9805508af1c89c7a https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.1.0-hfd8a6a1_0.conda#067bcc23164642f4c226da631f2a2e1d @@ -13,6 +13,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.1.0-h69a702a_0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.1.0-he5830b7_0.conda#56ca14d57ac29a75d23a39eb3ee0ddeb https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.1.0-he5830b7_0.conda#cd93f779ff018dd85c7544c015c9db3c +https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.8.23-hd590300_0.conda#cc4f06f7eedb1523f3b83fd0fb3942ff 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.19.1-hd590300_0.conda#e8c18d865be43e2fb3f7a145b6adf1f5 https://conda.anaconda.org/conda-forge/linux-64/geos-3.11.2-hcb278e6_0.conda#3b8e364995e3575e57960d29c1e5ab14 @@ -47,6 +48,10 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.1-h0b41bf4_0.conda#e9c3bcf0e0c719431abec8ca447eee27 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae +https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.6.0-h93469e0_0.conda#580a52a05f5be28ce00764149017c6d4 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.17-h862ab75_1.conda#0013fcee7acb3cfc801c5929824feb3c +https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.11-h862ab75_1.conda#6fbc9bd49434eb36d3a59c5020f4af95 +https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.16-h862ab75_1.conda#f883d61afbc95c50f7b3f62546da4235 https://conda.anaconda.org/conda-forge/linux-64/expat-2.5.0-hcb278e6_1.conda#8b9b5aca60558d02ddaa09d599e55920 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h501b40f_6.conda#c3e9338e15d90106f467377017352b97 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-17_linux64_openblas.conda#57fb44770b1bc832fb2dbefa1bd502de @@ -61,9 +66,11 @@ https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#332 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.11.4-h0d562d8_0.conda#e46fad17d5fb57316b956f88dca765e4 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.9.2-hc929e4a_1.tar.bz2#5b122b50e738c4be5c3f2899f010d7cf https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 +https://conda.anaconda.org/conda-forge/linux-64/s2n-1.3.46-h06160fa_0.conda#413d96a0b655c8f8aacc36473a2dbb04 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-hfc55251_7.conda#32ae18eb2a687912fc9e92a501c0a11b +https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.13.28-h3870b5a_0.conda#b775667301ab249f94ad2bea91fc4223 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.4-h0f2a231_0.conda#876286b5941933a0f558777e57d883cc https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_9.conda#d47dee1856d9cb955b8076eeff304a5b https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-hca18f0e_1.conda#e1232042de76d24539a436d37597eb06 @@ -78,11 +85,13 @@ https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-hc3e0081_0.tar.b https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.6-h8ee46fc_0.conda#7590b76c3d11d21caa44f3fc38ac584a https://conda.anaconda.org/conda-forge/linux-64/antlr-python-runtime-4.7.2-py310hff52083_1003.tar.bz2#8324f8fff866055d4b32eb25e091fe31 https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda#3edfead7cedd1ab4400a6c588f3e75f8 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.3.1-h9599702_1.conda#a8820ce2dbe6f7d54f6540d9a3a0028a +https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.7.11-hbe98c3e_0.conda#067641478d8f706b80a5a434a22b82be https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_9.conda#4601544b4982ba1861fa9b9c607b2c06 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.0.9-py310hd8f1fbe_9.conda#e2047ad2af52c01845f58b580c6cbd5c -https://conda.anaconda.org/conda-forge/noarch/certifi-2023.5.7-pyhd8ed1ab_0.conda#5d1b71c942b8421285934dad1d891ebc +https://conda.anaconda.org/conda-forge/noarch/certifi-2023.7.22-pyhd8ed1ab_0.conda#7f3dbc9179b4dde7da98dfb151d0ad22 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.2.0-pyhd8ed1ab_0.conda#313516e9a4b08b12dfb1e1cd390a96e3 -https://conda.anaconda.org/conda-forge/noarch/click-8.1.5-unix_pyh707e725_0.conda#4f63f3e01a26e7058eabfa5f984cd6f3 +https://conda.anaconda.org/conda-forge/noarch/click-8.1.6-unix_pyh707e725_0.conda#64dbb3b205546691a61204d1cfb208e3 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.1-pyhd8ed1ab_0.conda#b325bfc4cff7d7f8a868f1f7ecc4ed16 https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb https://conda.anaconda.org/conda-forge/noarch/filelock-3.12.2-pyhd8ed1ab_0.conda#53522ec72e6adae42bd373ef58357230 @@ -91,7 +100,7 @@ https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.6.0-pyh1a96a4e_0.conda https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.4-py310hbf28c38_1.tar.bz2#ad5647e517ba68e2868ef2e6e6ff7723 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-haa2dc70_1.conda#980d8aca0bc23ca73fa8caa3e7c84c28 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.1.2-hca28451_1.conda#b3bcefde107f8ac4f114574df0e1972e +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.2.1-hca28451_0.conda#96aec6156d58591f5a4e67056521ce1b https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py310h2372a71_0.conda#5597d9f9778af6883ae64f0e7d39416c https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda#926c67c0310094cf421ad13f7d3f38e5 @@ -112,41 +121,46 @@ https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.7.1-pyha770c72_0.conda#c39d6a09fe819de4951c2642629d9115 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.0.0-py310h5764c6d_0.tar.bz2#e972c5a1f472561cf4a91962cb01f4b4 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.40.0-pyhd8ed1ab_0.conda#49bb0d9e60ce1db25e151780331bb5f3 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.41.0-pyhd8ed1ab_0.conda#66beb36a1fa7e0dc9d9bf843a80eb82c https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/noarch/zipp-3.16.2-pyhd8ed1ab_0.conda#2da0451b54c4563c32490cb1b7cf68a1 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.0-hf8751d9_2.conda#deb12196f0c64c441bb3d083d06d0cf8 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.8.14-h2e270ba_2.conda#58bbee5fd6cf2d4fffbead1bc33a5d3b https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py310h255011f_3.conda#800596144bb613cd7ac58b80900ce835 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py310hde88566_1.tar.bz2#94ce7a76b0c912279f6958e0b6b21d2b https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.1.0-py310hd41b1e2_0.conda#684399f9ddc0b9d6f3b6164f6107098e -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.41.0-py310h2372a71_0.conda#606aea800172f81896b21cabc5575206 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.41.1-py310h2372a71_0.conda#069bfb5db1e67f62e9ffad0629b3d860 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.1-nompi_h4f84152_100.conda#ff9ae10aa224826c07da7ef26cb0b717 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda#4e9f59a060c3be52bc4ddc46ee9b6946 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py310hde88566_1008.tar.bz2#f9dd8a7a2fcc23eb2cd95cd817c949e7 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.0-pyhd8ed1ab_0.conda#721dab5803ea92ce02ddc4ee50aa0c48 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.0.0-py310h582fbeb_0.conda#adcc7ea52e4d39d0a93f6a2ef36c7fd4 -https://conda.anaconda.org/conda-forge/noarch/pip-23.1.2-pyhd8ed1ab_0.conda#7288da0d36821349cf1126e8670292df +https://conda.anaconda.org/conda-forge/noarch/pip-23.2.1-pyhd8ed1ab_0.conda#e2783aa3f9235225eec92f9081c5b801 https://conda.anaconda.org/conda-forge/linux-64/proj-9.2.1-ha643af7_0.conda#e992387307f4403ba0ec07d009032550 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/shapely-2.0.1-py310h056c13c_1.conda#32d925cfd330e0cbb72b7618558a44e8 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.7.1-hd8ed1ab_0.conda#f96688577f1faa58096d06a45136afa2 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.3-pyhd8ed1ab_1.conda#89efeecbb24c62e2f1ed0b8ca959ec69 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.4-pyhd8ed1ab_0.conda#18badd8fa3648d1beb1fcc7f2e0f756e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.3.13-heb0bb06_2.conda#c0866da05d5e7bb3a3f6b68bcbf7537b https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py310h278f3c1_0.conda#f2d3f2542a2467f479e809ac7b901ac2 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.8.0-hd8ed1ab_0.conda#b279b07ce18058034e5b3606ba103a8b -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_he09a3a9_107.conda#56b9982aec30923b1949e07466f275ae https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py310he60537e_0.conda#68b2dd34c69d08b05a9db5e3596fe3ee -https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.8.1-pyhd8ed1ab_0.conda#e76070baecfaca6ecdb5fbd5af7c9309 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.9.1-pyhd8ed1ab_0.conda#044e7a1e0ad42c4e67110bd078150a63 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.0-py310h24ef57a_1.conda#a689e86d7bbab67f889fc384aa72b088 https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b -https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.7.0-pyhd8ed1ab_0.conda#f92e9296a1e838000e9df124c7a39bbc +https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.20.3-he9c0e7f_4.conda#7695770e1d722ce9029a2ea30c060a3d +https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.7.1-pyhd8ed1ab_0.conda#c680b05515f9692a3ba253dfa7d85465 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.0.0-h32699f2_1.conda#fdde5424ecef5f7ad310b4242229291c -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py310h6f5dce6_101.conda#0d50bea104512f2728676a8bff8840d3 https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyha770c72_3.conda#5936894aade8240c867d292aa0d980c6 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.31.0-h73bf81c_0.conda#ffb754859219f4d8fbd9b7cc3337dd27 +https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.10.57-hbc2ea52_17.conda#452c7b08c21eea2ef01f4fd364d6affc https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.1-py310ha4c1d20_0.conda#300d3b434872eb84965864f0fcc5b5da https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.21.1-py310h7eb24ba_1.conda#e727db22a14344608c2caeccaa9e9d2b -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.5.2-py310h278f3c1_0.conda#ca7b86ade6b57bf4539342d31a1b40cf +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h7e745eb_109.conda#9e208615247477427acbd0900ca7038f +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.31.0-h73bf81c_0.conda#ffb754859219f4d8fbd9b7cc3337dd27 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py310h6f5dce6_101.conda#0d50bea104512f2728676a8bff8840d3 https://conda.anaconda.org/conda-forge/noarch/iris-3.6.1-pyha770c72_0.conda#36d615b339058273520990fc78239116 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.6.0-py310h278f3c1_0.conda#82225061491482514b0e057e69c6dda4 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 22b29e19..a6fa2205 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -3,7 +3,7 @@ # input_hash: 7ba8dd0ea14f6731b227a9f412cf87a9038d72cc8ce6b75cfe3c6f1d6b2e94f7 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.5.7-hbcca054_0.conda#f5c65075fc34438d5b456c7f3f5ab695 +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.7.22-hbcca054_0.conda#a73ecd2988327ad4c8f2c331482917f2 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.1.0-h15d22d2_0.conda#afb656a334c409dd9805508af1c89c7a https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.1.0-hfd8a6a1_0.conda#067bcc23164642f4c226da631f2a2e1d @@ -13,6 +13,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.1.0-h69a702a_0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.1.0-he5830b7_0.conda#56ca14d57ac29a75d23a39eb3ee0ddeb https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.1.0-he5830b7_0.conda#cd93f779ff018dd85c7544c015c9db3c +https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.8.23-hd590300_0.conda#cc4f06f7eedb1523f3b83fd0fb3942ff 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.19.1-hd590300_0.conda#e8c18d865be43e2fb3f7a145b6adf1f5 https://conda.anaconda.org/conda-forge/linux-64/geos-3.11.2-hcb278e6_0.conda#3b8e364995e3575e57960d29c1e5ab14 @@ -47,6 +48,10 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.1-h0b41bf4_0.conda#e9c3bcf0e0c719431abec8ca447eee27 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae +https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.6.0-h93469e0_0.conda#580a52a05f5be28ce00764149017c6d4 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.17-h862ab75_1.conda#0013fcee7acb3cfc801c5929824feb3c +https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.11-h862ab75_1.conda#6fbc9bd49434eb36d3a59c5020f4af95 +https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.16-h862ab75_1.conda#f883d61afbc95c50f7b3f62546da4235 https://conda.anaconda.org/conda-forge/linux-64/expat-2.5.0-hcb278e6_1.conda#8b9b5aca60558d02ddaa09d599e55920 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h501b40f_6.conda#c3e9338e15d90106f467377017352b97 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-17_linux64_openblas.conda#57fb44770b1bc832fb2dbefa1bd502de @@ -61,9 +66,11 @@ https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#332 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.11.4-h0d562d8_0.conda#e46fad17d5fb57316b956f88dca765e4 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.9.2-hc929e4a_1.tar.bz2#5b122b50e738c4be5c3f2899f010d7cf https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 +https://conda.anaconda.org/conda-forge/linux-64/s2n-1.3.46-h06160fa_0.conda#413d96a0b655c8f8aacc36473a2dbb04 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-hfc55251_7.conda#32ae18eb2a687912fc9e92a501c0a11b +https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.13.28-h3870b5a_0.conda#b775667301ab249f94ad2bea91fc4223 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.4-h0f2a231_0.conda#876286b5941933a0f558777e57d883cc https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_9.conda#d47dee1856d9cb955b8076eeff304a5b https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-hca18f0e_1.conda#e1232042de76d24539a436d37597eb06 @@ -78,11 +85,13 @@ https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-hc3e0081_0.tar.b https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.6-h8ee46fc_0.conda#7590b76c3d11d21caa44f3fc38ac584a https://conda.anaconda.org/conda-forge/linux-64/antlr-python-runtime-4.7.2-py311h38be061_1003.tar.bz2#0ab8f8f0cae99343907fe68cda11baea https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda#3edfead7cedd1ab4400a6c588f3e75f8 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.3.1-h9599702_1.conda#a8820ce2dbe6f7d54f6540d9a3a0028a +https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.7.11-hbe98c3e_0.conda#067641478d8f706b80a5a434a22b82be https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_9.conda#4601544b4982ba1861fa9b9c607b2c06 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.0.9-py311ha362b79_9.conda#ced5340f5dc6cff43a80deac8d0e398f -https://conda.anaconda.org/conda-forge/noarch/certifi-2023.5.7-pyhd8ed1ab_0.conda#5d1b71c942b8421285934dad1d891ebc +https://conda.anaconda.org/conda-forge/noarch/certifi-2023.7.22-pyhd8ed1ab_0.conda#7f3dbc9179b4dde7da98dfb151d0ad22 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.2.0-pyhd8ed1ab_0.conda#313516e9a4b08b12dfb1e1cd390a96e3 -https://conda.anaconda.org/conda-forge/noarch/click-8.1.5-unix_pyh707e725_0.conda#4f63f3e01a26e7058eabfa5f984cd6f3 +https://conda.anaconda.org/conda-forge/noarch/click-8.1.6-unix_pyh707e725_0.conda#64dbb3b205546691a61204d1cfb208e3 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.1-pyhd8ed1ab_0.conda#b325bfc4cff7d7f8a868f1f7ecc4ed16 https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb https://conda.anaconda.org/conda-forge/noarch/filelock-3.12.2-pyhd8ed1ab_0.conda#53522ec72e6adae42bd373ef58357230 @@ -91,7 +100,7 @@ https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.6.0-pyh1a96a4e_0.conda https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.4-py311h4dd048b_1.tar.bz2#46d451f575392c01dc193069bd89766d https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-haa2dc70_1.conda#980d8aca0bc23ca73fa8caa3e7c84c28 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.1.2-hca28451_1.conda#b3bcefde107f8ac4f114574df0e1972e +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.2.1-hca28451_0.conda#96aec6156d58591f5a4e67056521ce1b https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py311h459d7ec_0.conda#9904dc4adb5d547cb21e136f98cb24b0 https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda#926c67c0310094cf421ad13f7d3f38e5 @@ -111,41 +120,46 @@ https://conda.anaconda.org/conda-forge/noarch/setuptools-68.0.0-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.7.1-pyha770c72_0.conda#c39d6a09fe819de4951c2642629d9115 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.40.0-pyhd8ed1ab_0.conda#49bb0d9e60ce1db25e151780331bb5f3 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.41.0-pyhd8ed1ab_0.conda#66beb36a1fa7e0dc9d9bf843a80eb82c https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/noarch/zipp-3.16.2-pyhd8ed1ab_0.conda#2da0451b54c4563c32490cb1b7cf68a1 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.0-hf8751d9_2.conda#deb12196f0c64c441bb3d083d06d0cf8 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.8.14-h2e270ba_2.conda#58bbee5fd6cf2d4fffbead1bc33a5d3b https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py311h409f033_3.conda#9025d0786dbbe4bc91fd8e85502decce https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py311h4c7f6c3_1.tar.bz2#c7e54004ffd03f8db0a58ab949f2a00b https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.1.0-py311h9547e67_0.conda#daf3f23397ab2265d0cdfa339f3627ba -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.41.0-py311h459d7ec_0.conda#dbe23d19ab7f05bb08dd7d1838dc5547 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.41.1-py311h459d7ec_0.conda#343fff1650d07ab6956dbb35a124f89d https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.1-nompi_h4f84152_100.conda#ff9ae10aa224826c07da7ef26cb0b717 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda#4e9f59a060c3be52bc4ddc46ee9b6946 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py311h4c7f6c3_1008.tar.bz2#5998dff78c3b82a07ad77f2ae1ec1c44 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.0-pyhd8ed1ab_0.conda#721dab5803ea92ce02ddc4ee50aa0c48 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.0.0-py311h0b84326_0.conda#4b24acdc1fbbae9da03147e7d2cf8c8a -https://conda.anaconda.org/conda-forge/noarch/pip-23.1.2-pyhd8ed1ab_0.conda#7288da0d36821349cf1126e8670292df +https://conda.anaconda.org/conda-forge/noarch/pip-23.2.1-pyhd8ed1ab_0.conda#e2783aa3f9235225eec92f9081c5b801 https://conda.anaconda.org/conda-forge/linux-64/proj-9.2.1-ha643af7_0.conda#e992387307f4403ba0ec07d009032550 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/shapely-2.0.1-py311h54d622a_1.conda#a894c65b48676c4973e9ee8b59bceb9e https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.7.1-hd8ed1ab_0.conda#f96688577f1faa58096d06a45136afa2 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.3-pyhd8ed1ab_1.conda#89efeecbb24c62e2f1ed0b8ca959ec69 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.4-pyhd8ed1ab_0.conda#18badd8fa3648d1beb1fcc7f2e0f756e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.3.13-heb0bb06_2.conda#c0866da05d5e7bb3a3f6b68bcbf7537b https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h1f0f07a_0.conda#43a71a823583d75308eaf3a06c8f150b https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.8.0-hd8ed1ab_0.conda#b279b07ce18058034e5b3606ba103a8b -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_he09a3a9_107.conda#56b9982aec30923b1949e07466f275ae https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py311h8597a09_0.conda#70c3b734ffe82c16b6d121aaa11929a8 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.8.1-pyhd8ed1ab_0.conda#e76070baecfaca6ecdb5fbd5af7c9309 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.9.1-pyhd8ed1ab_0.conda#044e7a1e0ad42c4e67110bd078150a63 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.0-py311ha169711_1.conda#92633556d37e88ce45193374d408072c https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b -https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.7.0-pyhd8ed1ab_0.conda#f92e9296a1e838000e9df124c7a39bbc +https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.20.3-he9c0e7f_4.conda#7695770e1d722ce9029a2ea30c060a3d +https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.7.1-pyhd8ed1ab_0.conda#c680b05515f9692a3ba253dfa7d85465 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.0.0-h32699f2_1.conda#fdde5424ecef5f7ad310b4242229291c -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py311h9a7c333_101.conda#1dc70c7c3352c0ff1f861d866860db37 https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyha770c72_3.conda#5936894aade8240c867d292aa0d980c6 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.31.0-h73bf81c_0.conda#ffb754859219f4d8fbd9b7cc3337dd27 +https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.10.57-hbc2ea52_17.conda#452c7b08c21eea2ef01f4fd364d6affc https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.1-py311h64a7726_0.conda#356da36102fc1eeb8a81e6d79e53bc7e https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.21.1-py311hd88b842_1.conda#f19feb9440890ccb806a367ea9ae0654 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.5.2-py311h1f0f07a_0.conda#5346e127ae52857ab1805a7cb8a89ab6 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h7e745eb_109.conda#9e208615247477427acbd0900ca7038f +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.31.0-h73bf81c_0.conda#ffb754859219f4d8fbd9b7cc3337dd27 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py311h9a7c333_101.conda#1dc70c7c3352c0ff1f861d866860db37 https://conda.anaconda.org/conda-forge/noarch/iris-3.6.1-pyha770c72_0.conda#36d615b339058273520990fc78239116 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.6.0-py311h1f0f07a_0.conda#c1a8ed764bff88bba46dbc6566016187 diff --git a/requirements/locks/py39-linux-64.lock b/requirements/locks/py39-linux-64.lock index 2f25b6ea..51d16b7b 100644 --- a/requirements/locks/py39-linux-64.lock +++ b/requirements/locks/py39-linux-64.lock @@ -3,7 +3,7 @@ # input_hash: 127b02bcf9b2a0ba5f66b9f1dac937376ec9d7bfb70f94747a1451c820db2128 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.5.7-hbcca054_0.conda#f5c65075fc34438d5b456c7f3f5ab695 +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.7.22-hbcca054_0.conda#a73ecd2988327ad4c8f2c331482917f2 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.1.0-h15d22d2_0.conda#afb656a334c409dd9805508af1c89c7a https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.1.0-hfd8a6a1_0.conda#067bcc23164642f4c226da631f2a2e1d @@ -13,6 +13,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.1.0-h69a702a_0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.1.0-he5830b7_0.conda#56ca14d57ac29a75d23a39eb3ee0ddeb https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.1.0-he5830b7_0.conda#cd93f779ff018dd85c7544c015c9db3c +https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.8.23-hd590300_0.conda#cc4f06f7eedb1523f3b83fd0fb3942ff 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.19.1-hd590300_0.conda#e8c18d865be43e2fb3f7a145b6adf1f5 https://conda.anaconda.org/conda-forge/linux-64/geos-3.11.2-hcb278e6_0.conda#3b8e364995e3575e57960d29c1e5ab14 @@ -47,6 +48,10 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.1-h0b41bf4_0.conda#e9c3bcf0e0c719431abec8ca447eee27 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae +https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.6.0-h93469e0_0.conda#580a52a05f5be28ce00764149017c6d4 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.17-h862ab75_1.conda#0013fcee7acb3cfc801c5929824feb3c +https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.11-h862ab75_1.conda#6fbc9bd49434eb36d3a59c5020f4af95 +https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.16-h862ab75_1.conda#f883d61afbc95c50f7b3f62546da4235 https://conda.anaconda.org/conda-forge/linux-64/expat-2.5.0-hcb278e6_1.conda#8b9b5aca60558d02ddaa09d599e55920 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h501b40f_6.conda#c3e9338e15d90106f467377017352b97 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-17_linux64_openblas.conda#57fb44770b1bc832fb2dbefa1bd502de @@ -61,9 +66,11 @@ https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#332 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.11.4-h0d562d8_0.conda#e46fad17d5fb57316b956f88dca765e4 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.9.2-hc929e4a_1.tar.bz2#5b122b50e738c4be5c3f2899f010d7cf https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 +https://conda.anaconda.org/conda-forge/linux-64/s2n-1.3.46-h06160fa_0.conda#413d96a0b655c8f8aacc36473a2dbb04 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-hfc55251_7.conda#32ae18eb2a687912fc9e92a501c0a11b +https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.13.28-h3870b5a_0.conda#b775667301ab249f94ad2bea91fc4223 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.4-h0f2a231_0.conda#876286b5941933a0f558777e57d883cc https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_9.conda#d47dee1856d9cb955b8076eeff304a5b https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-hca18f0e_1.conda#e1232042de76d24539a436d37597eb06 @@ -78,11 +85,13 @@ https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-hc3e0081_0.tar.b https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.6-h8ee46fc_0.conda#7590b76c3d11d21caa44f3fc38ac584a https://conda.anaconda.org/conda-forge/linux-64/antlr-python-runtime-4.7.2-py39hf3d152e_1003.tar.bz2#5e8330e806e50bd6137ebd125f4bc1bb https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda#3edfead7cedd1ab4400a6c588f3e75f8 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.3.1-h9599702_1.conda#a8820ce2dbe6f7d54f6540d9a3a0028a +https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.7.11-hbe98c3e_0.conda#067641478d8f706b80a5a434a22b82be https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_9.conda#4601544b4982ba1861fa9b9c607b2c06 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.0.9-py39h5a03fae_9.conda#d1601752c6f47af7bedf838be3d8ca6b -https://conda.anaconda.org/conda-forge/noarch/certifi-2023.5.7-pyhd8ed1ab_0.conda#5d1b71c942b8421285934dad1d891ebc +https://conda.anaconda.org/conda-forge/noarch/certifi-2023.7.22-pyhd8ed1ab_0.conda#7f3dbc9179b4dde7da98dfb151d0ad22 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.2.0-pyhd8ed1ab_0.conda#313516e9a4b08b12dfb1e1cd390a96e3 -https://conda.anaconda.org/conda-forge/noarch/click-8.1.5-unix_pyh707e725_0.conda#4f63f3e01a26e7058eabfa5f984cd6f3 +https://conda.anaconda.org/conda-forge/noarch/click-8.1.6-unix_pyh707e725_0.conda#64dbb3b205546691a61204d1cfb208e3 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.1-pyhd8ed1ab_0.conda#b325bfc4cff7d7f8a868f1f7ecc4ed16 https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb https://conda.anaconda.org/conda-forge/noarch/filelock-3.12.2-pyhd8ed1ab_0.conda#53522ec72e6adae42bd373ef58357230 @@ -91,7 +100,7 @@ https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.6.0-pyh1a96a4e_0.conda https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.4-py39hf939315_1.tar.bz2#41679a052a8ce841c74df1ebc802e411 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-haa2dc70_1.conda#980d8aca0bc23ca73fa8caa3e7c84c28 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.1.2-hca28451_1.conda#b3bcefde107f8ac4f114574df0e1972e +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.2.1-hca28451_0.conda#96aec6156d58591f5a4e67056521ce1b https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py39hd1e30aa_0.conda#9c858d105816f454c6b64f3e19184b60 https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda#926c67c0310094cf421ad13f7d3f38e5 @@ -112,14 +121,16 @@ https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.7.1-pyha770c72_0.conda#c39d6a09fe819de4951c2642629d9115 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.0.0-py39hb9d737c_0.tar.bz2#230d65004135bf312504a1bbcb0c7a08 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.40.0-pyhd8ed1ab_0.conda#49bb0d9e60ce1db25e151780331bb5f3 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.41.0-pyhd8ed1ab_0.conda#66beb36a1fa7e0dc9d9bf843a80eb82c https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/noarch/zipp-3.16.2-pyhd8ed1ab_0.conda#2da0451b54c4563c32490cb1b7cf68a1 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.0-hf8751d9_2.conda#deb12196f0c64c441bb3d083d06d0cf8 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.8.14-h2e270ba_2.conda#58bbee5fd6cf2d4fffbead1bc33a5d3b https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py39he91dace_3.conda#20080319ef73fbad74dcd6d62f2a3ffe https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py39h2ae25f5_1.tar.bz2#c943fb9a2818ecc5be1e0ecc8b7738f1 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.1.0-py39h7633fee_0.conda#54e6f32e448fdc273606011f0940d076 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.41.0-py39hd1e30aa_0.conda#2de1f1007cb53e2d8e062cabea02f883 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.41.1-py39hd1e30aa_0.conda#c4d3bada7f301485049354c1e2a05067 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.1-nompi_h4f84152_100.conda#ff9ae10aa224826c07da7ef26cb0b717 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda#4e9f59a060c3be52bc4ddc46ee9b6946 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.0.0-pyhd8ed1ab_1.conda#a08b6be5bf18b9d2a927d3457750f82e @@ -127,28 +138,31 @@ https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2# https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py39h2ae25f5_1008.tar.bz2#d90acb3804f16c63eb6726652e4e25b3 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.0-pyhd8ed1ab_0.conda#721dab5803ea92ce02ddc4ee50aa0c48 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.0.0-py39haaeba84_0.conda#f97a95fab7c69678ebf6b57396b1323e -https://conda.anaconda.org/conda-forge/noarch/pip-23.1.2-pyhd8ed1ab_0.conda#7288da0d36821349cf1126e8670292df +https://conda.anaconda.org/conda-forge/noarch/pip-23.2.1-pyhd8ed1ab_0.conda#e2783aa3f9235225eec92f9081c5b801 https://conda.anaconda.org/conda-forge/linux-64/proj-9.2.1-ha643af7_0.conda#e992387307f4403ba0ec07d009032550 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/shapely-2.0.1-py39hf1c3bca_1.conda#ae6bfe65e81d9b59a71cc01a2858650f https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.7.1-hd8ed1ab_0.conda#f96688577f1faa58096d06a45136afa2 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.3-pyhd8ed1ab_1.conda#89efeecbb24c62e2f1ed0b8ca959ec69 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.4-pyhd8ed1ab_0.conda#18badd8fa3648d1beb1fcc7f2e0f756e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.3.13-heb0bb06_2.conda#c0866da05d5e7bb3a3f6b68bcbf7537b https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py39h0f8d45d_0.conda#180d4312005bc93f257e2997a8ee41cb https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.0.0-pyhd8ed1ab_1.conda#d69f29916f934f30adb1dd5fff4d9a8b https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.8.0-hd8ed1ab_0.conda#b279b07ce18058034e5b3606ba103a8b -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_he09a3a9_107.conda#56b9982aec30923b1949e07466f275ae -https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.8.1-pyhd8ed1ab_0.conda#e76070baecfaca6ecdb5fbd5af7c9309 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.9.1-pyhd8ed1ab_0.conda#044e7a1e0ad42c4e67110bd078150a63 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.0-py39h5ed0f51_1.conda#9c455b3b3b55f13b2094932740cd3efb https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b -https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.7.0-pyhd8ed1ab_0.conda#f92e9296a1e838000e9df124c7a39bbc +https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.20.3-he9c0e7f_4.conda#7695770e1d722ce9029a2ea30c060a3d +https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.7.1-pyhd8ed1ab_0.conda#c680b05515f9692a3ba253dfa7d85465 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.0.0-h32699f2_1.conda#fdde5424ecef5f7ad310b4242229291c https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py39he190548_0.conda#f2a931db797bb58bd335f4a857b4c898 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py39h4218a78_101.conda#8f5c25bb7accd1954d8b7fc689c5975c https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyha770c72_3.conda#5936894aade8240c867d292aa0d980c6 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.31.0-h73bf81c_0.conda#ffb754859219f4d8fbd9b7cc3337dd27 +https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.10.57-hbc2ea52_17.conda#452c7b08c21eea2ef01f4fd364d6affc https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.1-py39h6183b62_0.conda#81212684c03e970520656f1a62ab9d39 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.21.1-py39h4bd5d67_1.conda#a60d65263a8ddbff5381ed91d4f6953e -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.5.2-py39h0f8d45d_0.conda#3743bb4450e2ae76b88ca49d92b10131 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h7e745eb_109.conda#9e208615247477427acbd0900ca7038f +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.31.0-h73bf81c_0.conda#ffb754859219f4d8fbd9b7cc3337dd27 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py39h4218a78_101.conda#8f5c25bb7accd1954d8b7fc689c5975c https://conda.anaconda.org/conda-forge/noarch/iris-3.6.1-pyha770c72_0.conda#36d615b339058273520990fc78239116 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.6.0-py39h0f8d45d_0.conda#37f4c199171dd388337f6c8080230f44 From 00666369fe5c6e87e8f38bcb4a362f1c4de3a0ef Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Fri, 4 Aug 2023 11:53:53 +0100 Subject: [PATCH 227/583] Update README.rst (#281) --- README.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.rst b/README.rst index 6e379cb0..c0b9e618 100644 --- a/README.rst +++ b/README.rst @@ -19,11 +19,11 @@ terms of its `GNU LGPLv3 license `_. \(C) British Crown Copyright 2010 - 2021, Met Office -.. |CirrusCI| image:: https://api.cirrus-ci.com/github/SciTools/iris-grib.svg?branch=master +.. |CirrusCI| image:: https://api.cirrus-ci.com/github/SciTools/iris-grib.svg?branch=main .. _CirrusCI: https://cirrus-ci.com/github/SciTools/iris-grib -.. |Coveralls| image:: https://coveralls.io/repos/github/SciTools/iris-grib/badge.svg?branch=master -.. _Coveralls: https://coveralls.io/github/SciTools/iris-grib?branch=master +.. |Coveralls| image:: https://coveralls.io/repos/github/SciTools/iris-grib/badge.svg?branch=main +.. _Coveralls: https://coveralls.io/github/SciTools/iris-grib?branch=main .. |conda-forge| image:: https://img.shields.io/conda/vn/conda-forge/iris-grib?color=orange&label=conda-forge&logo=conda-forge&logoColor=white .. _conda-forge: https://anaconda.org/conda-forge/iris-grib @@ -32,10 +32,10 @@ terms of its `GNU LGPLv3 license `_. .. _pypi: https://pypi.org/project/iris-grib .. |License| image:: https://img.shields.io/github/license/SciTools/iris-grib?style=plastic -.. _License: https://github.com/SciTools/iris-grib/blob/master/COPYING +.. _License: https://github.com/SciTools/iris-grib/blob/main/COPYING .. |Contributors| image:: https://img.shields.io/github/contributors/SciTools/iris-grib?style=plastic .. _Contributors: https://github.com/SciTools/iris-grib/graphs/contributors .. |Commits| image:: https://img.shields.io/github/commits-since/SciTools/iris-grib/latest.svg?style=plastic -.. _Commits: https://github.com/SciTools/iris-grib/commits/master \ No newline at end of file +.. _Commits: https://github.com/SciTools/iris-grib/commits/main From db52904ced42bbeb495e2143b46b272d25aa230d Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Sat, 5 Aug 2023 09:34:31 +0100 Subject: [PATCH 228/583] Updated environment lockfiles (#347) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 10 +++++----- requirements/locks/py311-linux-64.lock | 10 +++++----- requirements/locks/py39-linux-64.lock | 12 ++++++------ 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 15735ac4..d5bf5189 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -36,7 +36,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.1-hd590300_0.co https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-hcb278e6_0.conda#681105bccc2a3f7f1a837d47d39c9179 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.1.1-hd590300_1.conda#2e1d7b458ac8f1e3ca4e18b77add6277 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.1.2-hd590300_0.conda#e5ac5227582d6c83ccf247288c0eb095 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-h9fff704_0.conda#e6d228cd0bb74a51dd18f5bfce0b4115 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b @@ -106,12 +106,12 @@ https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py310h2372a71_0 https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda#926c67c0310094cf421ad13f7d3f38e5 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 -https://conda.anaconda.org/conda-forge/linux-64/numpy-1.25.1-py310ha4c1d20_0.conda#3810cbf2635cb1d0edb97715d4ad74e7 +https://conda.anaconda.org/conda-forge/linux-64/numpy-1.25.2-py310ha4c1d20_0.conda#188e72aa313da668464e35309e9a32b0 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-hfec8fc6_2.conda#5ce6a42505c6e9e6151c54c3ec8d68ea https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda#91cda59e66e1e4afe9476f8ef98f5c30 https://conda.anaconda.org/conda-forge/noarch/pep8-1.7.1-py_0.tar.bz2#d0b5bc3aebbffcb175bf8a1d419acb79 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.0-pyhd8ed1ab_0.conda#d3ed087d1f7f8f5590e8e87b57a8ce64 +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.1-pyhd8ed1ab_0.conda#176f7d56f0cfe9008bdf1bccd7de02fb https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.2.0-py310h1fa729e_0.conda#8d155ac95b1dfe585bcb6bec6a91c73b @@ -130,7 +130,7 @@ https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.8.14-h2e270ba_2.con https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py310h255011f_3.conda#800596144bb613cd7ac58b80900ce835 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py310hde88566_1.tar.bz2#94ce7a76b0c912279f6958e0b6b21d2b https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.1.0-py310hd41b1e2_0.conda#684399f9ddc0b9d6f3b6164f6107098e -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.41.1-py310h2372a71_0.conda#069bfb5db1e67f62e9ffad0629b3d860 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.42.0-py310h2372a71_0.conda#f939fe2998c888a77b310926a6c666f3 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.1-nompi_h4f84152_100.conda#ff9ae10aa224826c07da7ef26cb0b717 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda#4e9f59a060c3be52bc4ddc46ee9b6946 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 @@ -149,7 +149,7 @@ https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py310h278f3c1_0.c https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.8.0-hd8ed1ab_0.conda#b279b07ce18058034e5b3606ba103a8b https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py310he60537e_0.conda#68b2dd34c69d08b05a9db5e3596fe3ee -https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.9.1-pyhd8ed1ab_0.conda#044e7a1e0ad42c4e67110bd078150a63 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.10.0-pyhd8ed1ab_0.conda#0809187ef9b89a3d94a5c24d13936236 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.0-py310h24ef57a_1.conda#a689e86d7bbab67f889fc384aa72b088 https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.20.3-he9c0e7f_4.conda#7695770e1d722ce9029a2ea30c060a3d diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index a6fa2205..bacd618a 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -36,7 +36,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.1-hd590300_0.co https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-hcb278e6_0.conda#681105bccc2a3f7f1a837d47d39c9179 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.1.1-hd590300_1.conda#2e1d7b458ac8f1e3ca4e18b77add6277 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.1.2-hd590300_0.conda#e5ac5227582d6c83ccf247288c0eb095 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-h9fff704_0.conda#e6d228cd0bb74a51dd18f5bfce0b4115 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b @@ -106,12 +106,12 @@ https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py311h459d7ec_0 https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda#926c67c0310094cf421ad13f7d3f38e5 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 -https://conda.anaconda.org/conda-forge/linux-64/numpy-1.25.1-py311h64a7726_0.conda#b32456e3b3b4d375860ce12163f20122 +https://conda.anaconda.org/conda-forge/linux-64/numpy-1.25.2-py311h64a7726_0.conda#71fd6f1734a0fa64d8f852ae7156ec45 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-hfec8fc6_2.conda#5ce6a42505c6e9e6151c54c3ec8d68ea https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda#91cda59e66e1e4afe9476f8ef98f5c30 https://conda.anaconda.org/conda-forge/noarch/pep8-1.7.1-py_0.tar.bz2#d0b5bc3aebbffcb175bf8a1d419acb79 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.0-pyhd8ed1ab_0.conda#d3ed087d1f7f8f5590e8e87b57a8ce64 +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.1-pyhd8ed1ab_0.conda#176f7d56f0cfe9008bdf1bccd7de02fb https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.2.0-py311h2582759_0.conda#dfcc3e6e30d6ec2b2bb416fcd8ff4dc1 @@ -129,7 +129,7 @@ https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.8.14-h2e270ba_2.con https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py311h409f033_3.conda#9025d0786dbbe4bc91fd8e85502decce https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py311h4c7f6c3_1.tar.bz2#c7e54004ffd03f8db0a58ab949f2a00b https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.1.0-py311h9547e67_0.conda#daf3f23397ab2265d0cdfa339f3627ba -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.41.1-py311h459d7ec_0.conda#343fff1650d07ab6956dbb35a124f89d +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.42.0-py311h459d7ec_0.conda#8c1ac2c00995248898220c4c1a9d81ab https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.1-nompi_h4f84152_100.conda#ff9ae10aa224826c07da7ef26cb0b717 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda#4e9f59a060c3be52bc4ddc46ee9b6946 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 @@ -148,7 +148,7 @@ https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h1f0f07a_0.c https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.8.0-hd8ed1ab_0.conda#b279b07ce18058034e5b3606ba103a8b https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py311h8597a09_0.conda#70c3b734ffe82c16b6d121aaa11929a8 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.9.1-pyhd8ed1ab_0.conda#044e7a1e0ad42c4e67110bd078150a63 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.10.0-pyhd8ed1ab_0.conda#0809187ef9b89a3d94a5c24d13936236 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.0-py311ha169711_1.conda#92633556d37e88ce45193374d408072c https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.20.3-he9c0e7f_4.conda#7695770e1d722ce9029a2ea30c060a3d diff --git a/requirements/locks/py39-linux-64.lock b/requirements/locks/py39-linux-64.lock index 51d16b7b..98f34e83 100644 --- a/requirements/locks/py39-linux-64.lock +++ b/requirements/locks/py39-linux-64.lock @@ -36,7 +36,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.1-hd590300_0.co https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-hcb278e6_0.conda#681105bccc2a3f7f1a837d47d39c9179 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.1.1-hd590300_1.conda#2e1d7b458ac8f1e3ca4e18b77add6277 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.1.2-hd590300_0.conda#e5ac5227582d6c83ccf247288c0eb095 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-h9fff704_0.conda#e6d228cd0bb74a51dd18f5bfce0b4115 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b @@ -106,12 +106,12 @@ https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py39hd1e30aa_0. https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda#926c67c0310094cf421ad13f7d3f38e5 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 -https://conda.anaconda.org/conda-forge/linux-64/numpy-1.25.1-py39h6183b62_0.conda#d3e2ec4b400a6ad93057a29b7e3cb701 +https://conda.anaconda.org/conda-forge/linux-64/numpy-1.25.2-py39h6183b62_0.conda#f1c358d06344bd7f9a293f9af4b9b8fc https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-hfec8fc6_2.conda#5ce6a42505c6e9e6151c54c3ec8d68ea https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda#91cda59e66e1e4afe9476f8ef98f5c30 https://conda.anaconda.org/conda-forge/noarch/pep8-1.7.1-py_0.tar.bz2#d0b5bc3aebbffcb175bf8a1d419acb79 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.0-pyhd8ed1ab_0.conda#d3ed087d1f7f8f5590e8e87b57a8ce64 +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.0.9-pyhd8ed1ab_0.tar.bz2#e8fbc1b54b25f4b08281467bc13b70cc https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.2.0-py39h72bdee0_0.conda#18927f971926b7271600368de71de557 @@ -130,7 +130,7 @@ https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.8.14-h2e270ba_2.con https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py39he91dace_3.conda#20080319ef73fbad74dcd6d62f2a3ffe https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py39h2ae25f5_1.tar.bz2#c943fb9a2818ecc5be1e0ecc8b7738f1 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.1.0-py39h7633fee_0.conda#54e6f32e448fdc273606011f0940d076 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.41.1-py39hd1e30aa_0.conda#c4d3bada7f301485049354c1e2a05067 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.42.0-py39hd1e30aa_0.conda#03e44d84ea9dd2432a633407401e5688 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.1-nompi_h4f84152_100.conda#ff9ae10aa224826c07da7ef26cb0b717 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda#4e9f59a060c3be52bc4ddc46ee9b6946 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.0.0-pyhd8ed1ab_1.conda#a08b6be5bf18b9d2a927d3457750f82e @@ -150,13 +150,13 @@ https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py39h0f8d45d_0.co https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.0.0-pyhd8ed1ab_1.conda#d69f29916f934f30adb1dd5fff4d9a8b https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.8.0-hd8ed1ab_0.conda#b279b07ce18058034e5b3606ba103a8b -https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.9.1-pyhd8ed1ab_0.conda#044e7a1e0ad42c4e67110bd078150a63 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.10.0-pyhd8ed1ab_0.conda#0809187ef9b89a3d94a5c24d13936236 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.0-py39h5ed0f51_1.conda#9c455b3b3b55f13b2094932740cd3efb https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.20.3-he9c0e7f_4.conda#7695770e1d722ce9029a2ea30c060a3d https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.7.1-pyhd8ed1ab_0.conda#c680b05515f9692a3ba253dfa7d85465 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.0.0-h32699f2_1.conda#fdde5424ecef5f7ad310b4242229291c -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py39he190548_0.conda#f2a931db797bb58bd335f4a857b4c898 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.2-py39h0126182_0.conda#61cee808ff7830fcceeb4f336cc738b1 https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyha770c72_3.conda#5936894aade8240c867d292aa0d980c6 https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.10.57-hbc2ea52_17.conda#452c7b08c21eea2ef01f4fd364d6affc https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.1-py39h6183b62_0.conda#81212684c03e970520656f1a62ab9d39 From a1a188136992fda050cc4b3d1d3588bbd64242a4 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 14 Aug 2023 11:45:33 +0100 Subject: [PATCH 229/583] Updated environment lockfiles (#348) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 28 +++++-------------- requirements/locks/py311-linux-64.lock | 28 +++++-------------- requirements/locks/py39-linux-64.lock | 38 ++++++++------------------ 3 files changed, 26 insertions(+), 68 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index d5bf5189..4d092c53 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -13,7 +13,6 @@ https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.1.0-h69a702a_0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.1.0-he5830b7_0.conda#56ca14d57ac29a75d23a39eb3ee0ddeb https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.1.0-he5830b7_0.conda#cd93f779ff018dd85c7544c015c9db3c -https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.8.23-hd590300_0.conda#cc4f06f7eedb1523f3b83fd0fb3942ff 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.19.1-hd590300_0.conda#e8c18d865be43e2fb3f7a145b6adf1f5 https://conda.anaconda.org/conda-forge/linux-64/geos-3.11.2-hcb278e6_0.conda#3b8e364995e3575e57960d29c1e5ab14 @@ -48,10 +47,6 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.1-h0b41bf4_0.conda#e9c3bcf0e0c719431abec8ca447eee27 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae -https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.6.0-h93469e0_0.conda#580a52a05f5be28ce00764149017c6d4 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.17-h862ab75_1.conda#0013fcee7acb3cfc801c5929824feb3c -https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.11-h862ab75_1.conda#6fbc9bd49434eb36d3a59c5020f4af95 -https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.16-h862ab75_1.conda#f883d61afbc95c50f7b3f62546da4235 https://conda.anaconda.org/conda-forge/linux-64/expat-2.5.0-hcb278e6_1.conda#8b9b5aca60558d02ddaa09d599e55920 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h501b40f_6.conda#c3e9338e15d90106f467377017352b97 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-17_linux64_openblas.conda#57fb44770b1bc832fb2dbefa1bd502de @@ -63,14 +58,12 @@ https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.39-h753d276_0.conda#e https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.42.0-h2797004_0.conda#fdaae20a1cf7cd62130a0973190a31b7 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.11.4-h0d562d8_0.conda#e46fad17d5fb57316b956f88dca765e4 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.11.5-h0d562d8_0.conda#558ab736404275d7df61c473c1af35aa https://conda.anaconda.org/conda-forge/linux-64/libzip-1.9.2-hc929e4a_1.tar.bz2#5b122b50e738c4be5c3f2899f010d7cf https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 -https://conda.anaconda.org/conda-forge/linux-64/s2n-1.3.46-h06160fa_0.conda#413d96a0b655c8f8aacc36473a2dbb04 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-hfc55251_7.conda#32ae18eb2a687912fc9e92a501c0a11b -https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.13.28-h3870b5a_0.conda#b775667301ab249f94ad2bea91fc4223 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.4-h0f2a231_0.conda#876286b5941933a0f558777e57d883cc https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_9.conda#d47dee1856d9cb955b8076eeff304a5b https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-hca18f0e_1.conda#e1232042de76d24539a436d37597eb06 @@ -85,8 +78,6 @@ https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-hc3e0081_0.tar.b https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.6-h8ee46fc_0.conda#7590b76c3d11d21caa44f3fc38ac584a https://conda.anaconda.org/conda-forge/linux-64/antlr-python-runtime-4.7.2-py310hff52083_1003.tar.bz2#8324f8fff866055d4b32eb25e091fe31 https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda#3edfead7cedd1ab4400a6c588f3e75f8 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.3.1-h9599702_1.conda#a8820ce2dbe6f7d54f6540d9a3a0028a -https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.7.11-hbe98c3e_0.conda#067641478d8f706b80a5a434a22b82be https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_9.conda#4601544b4982ba1861fa9b9c607b2c06 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.0.9-py310hd8f1fbe_9.conda#e2047ad2af52c01845f58b580c6cbd5c https://conda.anaconda.org/conda-forge/noarch/certifi-2023.7.22-pyhd8ed1ab_0.conda#7f3dbc9179b4dde7da98dfb151d0ad22 @@ -121,12 +112,10 @@ https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.7.1-pyha770c72_0.conda#c39d6a09fe819de4951c2642629d9115 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.0.0-py310h5764c6d_0.tar.bz2#e972c5a1f472561cf4a91962cb01f4b4 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.41.0-pyhd8ed1ab_0.conda#66beb36a1fa7e0dc9d9bf843a80eb82c +https://conda.anaconda.org/conda-forge/noarch/wheel-0.41.1-pyhd8ed1ab_0.conda#8f467ba2db2b5470d297953d9c1f9c7d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/noarch/zipp-3.16.2-pyhd8ed1ab_0.conda#2da0451b54c4563c32490cb1b7cf68a1 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.0-hf8751d9_2.conda#deb12196f0c64c441bb3d083d06d0cf8 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.8.14-h2e270ba_2.conda#58bbee5fd6cf2d4fffbead1bc33a5d3b https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py310h255011f_3.conda#800596144bb613cd7ac58b80900ce835 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py310hde88566_1.tar.bz2#94ce7a76b0c912279f6958e0b6b21d2b https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.1.0-py310hd41b1e2_0.conda#684399f9ddc0b9d6f3b6164f6107098e @@ -144,23 +133,20 @@ https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.1-py310h056c13c_1.co https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.7.1-hd8ed1ab_0.conda#f96688577f1faa58096d06a45136afa2 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.4-pyhd8ed1ab_0.conda#18badd8fa3648d1beb1fcc7f2e0f756e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.3.13-heb0bb06_2.conda#c0866da05d5e7bb3a3f6b68bcbf7537b https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py310h278f3c1_0.conda#f2d3f2542a2467f479e809ac7b901ac2 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.8.0-hd8ed1ab_0.conda#b279b07ce18058034e5b3606ba103a8b +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_he09a3a9_107.conda#56b9982aec30923b1949e07466f275ae https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py310he60537e_0.conda#68b2dd34c69d08b05a9db5e3596fe3ee https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.10.0-pyhd8ed1ab_0.conda#0809187ef9b89a3d94a5c24d13936236 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.0-py310h24ef57a_1.conda#a689e86d7bbab67f889fc384aa72b088 https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b -https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.20.3-he9c0e7f_4.conda#7695770e1d722ce9029a2ea30c060a3d -https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.7.1-pyhd8ed1ab_0.conda#c680b05515f9692a3ba253dfa7d85465 +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py310h7cbd5c2_0.conda#7bfbace0788f477da1c26e10a358692d +https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.8.0-pyhd8ed1ab_0.conda#160a92928fc4a0ca40a64b586a2cf671 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.0.0-h32699f2_1.conda#fdde5424ecef5f7ad310b4242229291c +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py310h6f5dce6_101.conda#0d50bea104512f2728676a8bff8840d3 https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyha770c72_3.conda#5936894aade8240c867d292aa0d980c6 -https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.10.57-hbc2ea52_17.conda#452c7b08c21eea2ef01f4fd364d6affc -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.1-py310ha4c1d20_0.conda#300d3b434872eb84965864f0fcc5b5da -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.21.1-py310h7eb24ba_1.conda#e727db22a14344608c2caeccaa9e9d2b -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h7e745eb_109.conda#9e208615247477427acbd0900ca7038f https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.31.0-h73bf81c_0.conda#ffb754859219f4d8fbd9b7cc3337dd27 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py310h6f5dce6_101.conda#0d50bea104512f2728676a8bff8840d3 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.1-py310ha4c1d20_0.conda#300d3b434872eb84965864f0fcc5b5da https://conda.anaconda.org/conda-forge/noarch/iris-3.6.1-pyha770c72_0.conda#36d615b339058273520990fc78239116 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.6.0-py310h278f3c1_0.conda#82225061491482514b0e057e69c6dda4 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index bacd618a..84688222 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -13,7 +13,6 @@ https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.1.0-h69a702a_0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.1.0-he5830b7_0.conda#56ca14d57ac29a75d23a39eb3ee0ddeb https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.1.0-he5830b7_0.conda#cd93f779ff018dd85c7544c015c9db3c -https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.8.23-hd590300_0.conda#cc4f06f7eedb1523f3b83fd0fb3942ff 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.19.1-hd590300_0.conda#e8c18d865be43e2fb3f7a145b6adf1f5 https://conda.anaconda.org/conda-forge/linux-64/geos-3.11.2-hcb278e6_0.conda#3b8e364995e3575e57960d29c1e5ab14 @@ -48,10 +47,6 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.1-h0b41bf4_0.conda#e9c3bcf0e0c719431abec8ca447eee27 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae -https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.6.0-h93469e0_0.conda#580a52a05f5be28ce00764149017c6d4 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.17-h862ab75_1.conda#0013fcee7acb3cfc801c5929824feb3c -https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.11-h862ab75_1.conda#6fbc9bd49434eb36d3a59c5020f4af95 -https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.16-h862ab75_1.conda#f883d61afbc95c50f7b3f62546da4235 https://conda.anaconda.org/conda-forge/linux-64/expat-2.5.0-hcb278e6_1.conda#8b9b5aca60558d02ddaa09d599e55920 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h501b40f_6.conda#c3e9338e15d90106f467377017352b97 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-17_linux64_openblas.conda#57fb44770b1bc832fb2dbefa1bd502de @@ -63,14 +58,12 @@ https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.39-h753d276_0.conda#e https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.42.0-h2797004_0.conda#fdaae20a1cf7cd62130a0973190a31b7 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.11.4-h0d562d8_0.conda#e46fad17d5fb57316b956f88dca765e4 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.11.5-h0d562d8_0.conda#558ab736404275d7df61c473c1af35aa https://conda.anaconda.org/conda-forge/linux-64/libzip-1.9.2-hc929e4a_1.tar.bz2#5b122b50e738c4be5c3f2899f010d7cf https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 -https://conda.anaconda.org/conda-forge/linux-64/s2n-1.3.46-h06160fa_0.conda#413d96a0b655c8f8aacc36473a2dbb04 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-hfc55251_7.conda#32ae18eb2a687912fc9e92a501c0a11b -https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.13.28-h3870b5a_0.conda#b775667301ab249f94ad2bea91fc4223 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.4-h0f2a231_0.conda#876286b5941933a0f558777e57d883cc https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_9.conda#d47dee1856d9cb955b8076eeff304a5b https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-hca18f0e_1.conda#e1232042de76d24539a436d37597eb06 @@ -85,8 +78,6 @@ https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-hc3e0081_0.tar.b https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.6-h8ee46fc_0.conda#7590b76c3d11d21caa44f3fc38ac584a https://conda.anaconda.org/conda-forge/linux-64/antlr-python-runtime-4.7.2-py311h38be061_1003.tar.bz2#0ab8f8f0cae99343907fe68cda11baea https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda#3edfead7cedd1ab4400a6c588f3e75f8 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.3.1-h9599702_1.conda#a8820ce2dbe6f7d54f6540d9a3a0028a -https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.7.11-hbe98c3e_0.conda#067641478d8f706b80a5a434a22b82be https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_9.conda#4601544b4982ba1861fa9b9c607b2c06 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.0.9-py311ha362b79_9.conda#ced5340f5dc6cff43a80deac8d0e398f https://conda.anaconda.org/conda-forge/noarch/certifi-2023.7.22-pyhd8ed1ab_0.conda#7f3dbc9179b4dde7da98dfb151d0ad22 @@ -120,12 +111,10 @@ https://conda.anaconda.org/conda-forge/noarch/setuptools-68.0.0-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.7.1-pyha770c72_0.conda#c39d6a09fe819de4951c2642629d9115 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.41.0-pyhd8ed1ab_0.conda#66beb36a1fa7e0dc9d9bf843a80eb82c +https://conda.anaconda.org/conda-forge/noarch/wheel-0.41.1-pyhd8ed1ab_0.conda#8f467ba2db2b5470d297953d9c1f9c7d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/noarch/zipp-3.16.2-pyhd8ed1ab_0.conda#2da0451b54c4563c32490cb1b7cf68a1 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.0-hf8751d9_2.conda#deb12196f0c64c441bb3d083d06d0cf8 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.8.14-h2e270ba_2.conda#58bbee5fd6cf2d4fffbead1bc33a5d3b https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py311h409f033_3.conda#9025d0786dbbe4bc91fd8e85502decce https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py311h4c7f6c3_1.tar.bz2#c7e54004ffd03f8db0a58ab949f2a00b https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.1.0-py311h9547e67_0.conda#daf3f23397ab2265d0cdfa339f3627ba @@ -143,23 +132,20 @@ https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.1-py311h54d622a_1.co https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.7.1-hd8ed1ab_0.conda#f96688577f1faa58096d06a45136afa2 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.4-pyhd8ed1ab_0.conda#18badd8fa3648d1beb1fcc7f2e0f756e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.3.13-heb0bb06_2.conda#c0866da05d5e7bb3a3f6b68bcbf7537b https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h1f0f07a_0.conda#43a71a823583d75308eaf3a06c8f150b https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.8.0-hd8ed1ab_0.conda#b279b07ce18058034e5b3606ba103a8b +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_he09a3a9_107.conda#56b9982aec30923b1949e07466f275ae https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py311h8597a09_0.conda#70c3b734ffe82c16b6d121aaa11929a8 https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.10.0-pyhd8ed1ab_0.conda#0809187ef9b89a3d94a5c24d13936236 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.0-py311ha169711_1.conda#92633556d37e88ce45193374d408072c https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b -https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.20.3-he9c0e7f_4.conda#7695770e1d722ce9029a2ea30c060a3d -https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.7.1-pyhd8ed1ab_0.conda#c680b05515f9692a3ba253dfa7d85465 +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py311h320fe9a_0.conda#1271b2375735e2aaa6d6770dbe2ad087 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.8.0-pyhd8ed1ab_0.conda#160a92928fc4a0ca40a64b586a2cf671 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.0.0-h32699f2_1.conda#fdde5424ecef5f7ad310b4242229291c +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py311h9a7c333_101.conda#1dc70c7c3352c0ff1f861d866860db37 https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyha770c72_3.conda#5936894aade8240c867d292aa0d980c6 -https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.10.57-hbc2ea52_17.conda#452c7b08c21eea2ef01f4fd364d6affc -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.1-py311h64a7726_0.conda#356da36102fc1eeb8a81e6d79e53bc7e -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.21.1-py311hd88b842_1.conda#f19feb9440890ccb806a367ea9ae0654 -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h7e745eb_109.conda#9e208615247477427acbd0900ca7038f https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.31.0-h73bf81c_0.conda#ffb754859219f4d8fbd9b7cc3337dd27 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py311h9a7c333_101.conda#1dc70c7c3352c0ff1f861d866860db37 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.1-py311h64a7726_0.conda#356da36102fc1eeb8a81e6d79e53bc7e https://conda.anaconda.org/conda-forge/noarch/iris-3.6.1-pyha770c72_0.conda#36d615b339058273520990fc78239116 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.6.0-py311h1f0f07a_0.conda#c1a8ed764bff88bba46dbc6566016187 diff --git a/requirements/locks/py39-linux-64.lock b/requirements/locks/py39-linux-64.lock index 98f34e83..815c8a85 100644 --- a/requirements/locks/py39-linux-64.lock +++ b/requirements/locks/py39-linux-64.lock @@ -13,7 +13,6 @@ https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.1.0-h69a702a_0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.1.0-he5830b7_0.conda#56ca14d57ac29a75d23a39eb3ee0ddeb https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.1.0-he5830b7_0.conda#cd93f779ff018dd85c7544c015c9db3c -https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.8.23-hd590300_0.conda#cc4f06f7eedb1523f3b83fd0fb3942ff 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.19.1-hd590300_0.conda#e8c18d865be43e2fb3f7a145b6adf1f5 https://conda.anaconda.org/conda-forge/linux-64/geos-3.11.2-hcb278e6_0.conda#3b8e364995e3575e57960d29c1e5ab14 @@ -48,10 +47,6 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.1-h0b41bf4_0.conda#e9c3bcf0e0c719431abec8ca447eee27 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae -https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.6.0-h93469e0_0.conda#580a52a05f5be28ce00764149017c6d4 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.17-h862ab75_1.conda#0013fcee7acb3cfc801c5929824feb3c -https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.11-h862ab75_1.conda#6fbc9bd49434eb36d3a59c5020f4af95 -https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.16-h862ab75_1.conda#f883d61afbc95c50f7b3f62546da4235 https://conda.anaconda.org/conda-forge/linux-64/expat-2.5.0-hcb278e6_1.conda#8b9b5aca60558d02ddaa09d599e55920 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h501b40f_6.conda#c3e9338e15d90106f467377017352b97 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-17_linux64_openblas.conda#57fb44770b1bc832fb2dbefa1bd502de @@ -63,14 +58,12 @@ https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.39-h753d276_0.conda#e https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.42.0-h2797004_0.conda#fdaae20a1cf7cd62130a0973190a31b7 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.11.4-h0d562d8_0.conda#e46fad17d5fb57316b956f88dca765e4 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.11.5-h0d562d8_0.conda#558ab736404275d7df61c473c1af35aa https://conda.anaconda.org/conda-forge/linux-64/libzip-1.9.2-hc929e4a_1.tar.bz2#5b122b50e738c4be5c3f2899f010d7cf https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 -https://conda.anaconda.org/conda-forge/linux-64/s2n-1.3.46-h06160fa_0.conda#413d96a0b655c8f8aacc36473a2dbb04 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-hfc55251_7.conda#32ae18eb2a687912fc9e92a501c0a11b -https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.13.28-h3870b5a_0.conda#b775667301ab249f94ad2bea91fc4223 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.4-h0f2a231_0.conda#876286b5941933a0f558777e57d883cc https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_9.conda#d47dee1856d9cb955b8076eeff304a5b https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-hca18f0e_1.conda#e1232042de76d24539a436d37597eb06 @@ -79,14 +72,12 @@ https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-17_linux64_openbl https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1002.conda#4c4dce87e96b321308f81ba2c10d2897 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-17_linux64_openblas.conda#a2103882c46492e26500fcb56c03de8b https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.5.1-h8b53f26_0.conda#8ad377fb60abab446a9f02c62b3c2190 -https://conda.anaconda.org/conda-forge/linux-64/python-3.9.16-h2782a2a_0_cpython.conda#95c9b7c96a7fd7342e0c9d0a917b8f78 +https://conda.anaconda.org/conda-forge/linux-64/python-3.9.17-h0755675_0_cpython.conda#384886ac3580bba3541ce65c992eb192 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.42.0-h2c6b66d_0.conda#1192f6ec654a5bc4ee1d64bdc4a3e5cc https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-hc3e0081_0.tar.bz2#d4c341e0379c31e9e781d4f204726867 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.6-h8ee46fc_0.conda#7590b76c3d11d21caa44f3fc38ac584a https://conda.anaconda.org/conda-forge/linux-64/antlr-python-runtime-4.7.2-py39hf3d152e_1003.tar.bz2#5e8330e806e50bd6137ebd125f4bc1bb https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda#3edfead7cedd1ab4400a6c588f3e75f8 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.3.1-h9599702_1.conda#a8820ce2dbe6f7d54f6540d9a3a0028a -https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.7.11-hbe98c3e_0.conda#067641478d8f706b80a5a434a22b82be https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_9.conda#4601544b4982ba1861fa9b9c607b2c06 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.0.9-py39h5a03fae_9.conda#d1601752c6f47af7bedf838be3d8ca6b https://conda.anaconda.org/conda-forge/noarch/certifi-2023.7.22-pyhd8ed1ab_0.conda#7f3dbc9179b4dde7da98dfb151d0ad22 @@ -111,7 +102,7 @@ https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-hfec8fc6_2.conda# https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda#91cda59e66e1e4afe9476f8ef98f5c30 https://conda.anaconda.org/conda-forge/noarch/pep8-1.7.1-py_0.tar.bz2#d0b5bc3aebbffcb175bf8a1d419acb79 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.0.9-pyhd8ed1ab_0.tar.bz2#e8fbc1b54b25f4b08281467bc13b70cc +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.1-pyhd8ed1ab_0.conda#176f7d56f0cfe9008bdf1bccd7de02fb https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.2.0-py39h72bdee0_0.conda#18927f971926b7271600368de71de557 @@ -121,19 +112,17 @@ https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.7.1-pyha770c72_0.conda#c39d6a09fe819de4951c2642629d9115 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.0.0-py39hb9d737c_0.tar.bz2#230d65004135bf312504a1bbcb0c7a08 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.41.0-pyhd8ed1ab_0.conda#66beb36a1fa7e0dc9d9bf843a80eb82c +https://conda.anaconda.org/conda-forge/noarch/wheel-0.41.1-pyhd8ed1ab_0.conda#8f467ba2db2b5470d297953d9c1f9c7d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/noarch/zipp-3.16.2-pyhd8ed1ab_0.conda#2da0451b54c4563c32490cb1b7cf68a1 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.0-hf8751d9_2.conda#deb12196f0c64c441bb3d083d06d0cf8 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.8.14-h2e270ba_2.conda#58bbee5fd6cf2d4fffbead1bc33a5d3b https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py39he91dace_3.conda#20080319ef73fbad74dcd6d62f2a3ffe https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py39h2ae25f5_1.tar.bz2#c943fb9a2818ecc5be1e0ecc8b7738f1 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.1.0-py39h7633fee_0.conda#54e6f32e448fdc273606011f0940d076 https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.42.0-py39hd1e30aa_0.conda#03e44d84ea9dd2432a633407401e5688 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.1-nompi_h4f84152_100.conda#ff9ae10aa224826c07da7ef26cb0b717 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda#4e9f59a060c3be52bc4ddc46ee9b6946 -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.0.0-pyhd8ed1ab_1.conda#a08b6be5bf18b9d2a927d3457750f82e +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.0.1-pyhd8ed1ab_0.conda#d978c61aa5fc2c69380d53ad56b5ae86 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py39h2ae25f5_1008.tar.bz2#d90acb3804f16c63eb6726652e4e25b3 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.0-pyhd8ed1ab_0.conda#721dab5803ea92ce02ddc4ee50aa0c48 @@ -145,24 +134,21 @@ https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.1-py39hf1c3bca_1.con https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.7.1-hd8ed1ab_0.conda#f96688577f1faa58096d06a45136afa2 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.4-pyhd8ed1ab_0.conda#18badd8fa3648d1beb1fcc7f2e0f756e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.3.13-heb0bb06_2.conda#c0866da05d5e7bb3a3f6b68bcbf7537b https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py39h0f8d45d_0.conda#180d4312005bc93f257e2997a8ee41cb https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 -https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.0.0-pyhd8ed1ab_1.conda#d69f29916f934f30adb1dd5fff4d9a8b +https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.0.1-pyhd8ed1ab_0.conda#54661981fd331e20847d8a49543dd9af https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.8.0-hd8ed1ab_0.conda#b279b07ce18058034e5b3606ba103a8b +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_he09a3a9_107.conda#56b9982aec30923b1949e07466f275ae https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.10.0-pyhd8ed1ab_0.conda#0809187ef9b89a3d94a5c24d13936236 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.0-py39h5ed0f51_1.conda#9c455b3b3b55f13b2094932740cd3efb https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b -https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.20.3-he9c0e7f_4.conda#7695770e1d722ce9029a2ea30c060a3d -https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.7.1-pyhd8ed1ab_0.conda#c680b05515f9692a3ba253dfa7d85465 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.8.0-pyhd8ed1ab_0.conda#160a92928fc4a0ca40a64b586a2cf671 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.0.0-h32699f2_1.conda#fdde5424ecef5f7ad310b4242229291c -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.2-py39h0126182_0.conda#61cee808ff7830fcceeb4f336cc738b1 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py39he190548_0.conda#f2a931db797bb58bd335f4a857b4c898 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py39h4218a78_101.conda#8f5c25bb7accd1954d8b7fc689c5975c https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyha770c72_3.conda#5936894aade8240c867d292aa0d980c6 -https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.10.57-hbc2ea52_17.conda#452c7b08c21eea2ef01f4fd364d6affc -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.1-py39h6183b62_0.conda#81212684c03e970520656f1a62ab9d39 -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.21.1-py39h4bd5d67_1.conda#a60d65263a8ddbff5381ed91d4f6953e -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h7e745eb_109.conda#9e208615247477427acbd0900ca7038f +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py39h40cae4c_0.conda#24b4bf92e26a46217e37e5928927116b https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.31.0-h73bf81c_0.conda#ffb754859219f4d8fbd9b7cc3337dd27 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py39h4218a78_101.conda#8f5c25bb7accd1954d8b7fc689c5975c +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.1-py39h6183b62_0.conda#81212684c03e970520656f1a62ab9d39 https://conda.anaconda.org/conda-forge/noarch/iris-3.6.1-pyha770c72_0.conda#36d615b339058273520990fc78239116 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.6.0-py39h0f8d45d_0.conda#37f4c199171dd388337f6c8080230f44 From 941a7d5e4ed4cd5675dc5d8777180202e684bfe6 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Tue, 22 Aug 2023 13:36:38 +0100 Subject: [PATCH 230/583] Updated environment lockfiles (#349) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 32 ++++++++++++++++++-------- requirements/locks/py311-linux-64.lock | 32 ++++++++++++++++++-------- requirements/locks/py39-linux-64.lock | 32 ++++++++++++++++++-------- 3 files changed, 69 insertions(+), 27 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 4d092c53..03b5cecf 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -13,6 +13,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.1.0-h69a702a_0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.1.0-he5830b7_0.conda#56ca14d57ac29a75d23a39eb3ee0ddeb https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.1.0-he5830b7_0.conda#cd93f779ff018dd85c7544c015c9db3c +https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.0-hd590300_0.conda#71b89db63b5b504e7afc8ad901172e1e 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.19.1-hd590300_0.conda#e8c18d865be43e2fb3f7a145b6adf1f5 https://conda.anaconda.org/conda-forge/linux-64/geos-3.11.2-hcb278e6_0.conda#3b8e364995e3575e57960d29c1e5ab14 @@ -44,9 +45,13 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2#be93aabceefa2fac576e971aef407908 https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h0b41bf4_1003.conda#bce9f945da8ad2ae9b1d7165a64d0f87 https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007.tar.bz2#b4a4381d54784606820704f7b5f05a15 -https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.1-h0b41bf4_0.conda#e9c3bcf0e0c719431abec8ca447eee27 +https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae +https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.6.1-hc309b26_1.conda#cc09293a2c2b7fd77aff284f370c12c0 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.17-h4d4d85c_2.conda#9ca99452635fe03eb5fa937f5ae604b0 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.12-h4d4d85c_1.conda#eba092fc6de212a01de0065f38fe8bbb +https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.17-h4d4d85c_1.conda#30f9df85ce23cd14faa9a4dfa50cca2b https://conda.anaconda.org/conda-forge/linux-64/expat-2.5.0-hcb278e6_1.conda#8b9b5aca60558d02ddaa09d599e55920 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h501b40f_6.conda#c3e9338e15d90106f467377017352b97 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-17_linux64_openblas.conda#57fb44770b1bc832fb2dbefa1bd502de @@ -61,13 +66,15 @@ https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#332 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.11.5-h0d562d8_0.conda#558ab736404275d7df61c473c1af35aa https://conda.anaconda.org/conda-forge/linux-64/libzip-1.9.2-hc929e4a_1.tar.bz2#5b122b50e738c4be5c3f2899f010d7cf https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 +https://conda.anaconda.org/conda-forge/linux-64/s2n-1.3.48-h06160fa_0.conda#f6d996f514756660c3d97eb0a49cba25 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-hfc55251_7.conda#32ae18eb2a687912fc9e92a501c0a11b +https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.13.32-h4a1a131_0.conda#313b9d0df6705beb45f424eb420ac21c https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.4-h0f2a231_0.conda#876286b5941933a0f558777e57d883cc https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_9.conda#d47dee1856d9cb955b8076eeff304a5b https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-hca18f0e_1.conda#e1232042de76d24539a436d37597eb06 -https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.1-h659d440_0.conda#1b5126ec25763eb17ef74c8763d26e84 +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-17_linux64_openblas.conda#7ef0969b00fe3d6eef56a8151d3afb29 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1002.conda#4c4dce87e96b321308f81ba2c10d2897 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-17_linux64_openblas.conda#a2103882c46492e26500fcb56c03de8b @@ -78,11 +85,13 @@ https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-hc3e0081_0.tar.b https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.6-h8ee46fc_0.conda#7590b76c3d11d21caa44f3fc38ac584a https://conda.anaconda.org/conda-forge/linux-64/antlr-python-runtime-4.7.2-py310hff52083_1003.tar.bz2#8324f8fff866055d4b32eb25e091fe31 https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda#3edfead7cedd1ab4400a6c588f3e75f8 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.3.1-h2e3709c_4.conda#2cf21b1cbc1c096a28ffa2892257a2c1 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.7.11-h00aa349_4.conda#cb932dff7328ff620ce8059c9968b095 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_9.conda#4601544b4982ba1861fa9b9c607b2c06 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.0.9-py310hd8f1fbe_9.conda#e2047ad2af52c01845f58b580c6cbd5c https://conda.anaconda.org/conda-forge/noarch/certifi-2023.7.22-pyhd8ed1ab_0.conda#7f3dbc9179b4dde7da98dfb151d0ad22 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.2.0-pyhd8ed1ab_0.conda#313516e9a4b08b12dfb1e1cd390a96e3 -https://conda.anaconda.org/conda-forge/noarch/click-8.1.6-unix_pyh707e725_0.conda#64dbb3b205546691a61204d1cfb208e3 +https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.1-pyhd8ed1ab_0.conda#b325bfc4cff7d7f8a868f1f7ecc4ed16 https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb https://conda.anaconda.org/conda-forge/noarch/filelock-3.12.2-pyhd8ed1ab_0.conda#53522ec72e6adae42bd373ef58357230 @@ -105,9 +114,9 @@ https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.1-pyhd8ed1ab_0.conda#176f7d56f0cfe9008bdf1bccd7de02fb https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 -https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.2.0-py310h1fa729e_0.conda#8d155ac95b1dfe585bcb6bec6a91c73b +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.3.0-py310h2372a71_0.conda#75e60ce53c01a121039b3050c9e1f759 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py310h5764c6d_5.tar.bz2#9e68d2ff6d98737c855b65f48dd3c597 -https://conda.anaconda.org/conda-forge/noarch/setuptools-68.0.0-pyhd8ed1ab_0.conda#5a7739d0f57ee64133c9d32e6507c46d +https://conda.anaconda.org/conda-forge/noarch/setuptools-68.1.2-pyhd8ed1ab_0.conda#4fe12573bf499ff85a0a364e00cc5c53 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.7.1-pyha770c72_0.conda#c39d6a09fe819de4951c2642629d9115 @@ -116,6 +125,8 @@ https://conda.anaconda.org/conda-forge/noarch/wheel-0.41.1-pyhd8ed1ab_0.conda#8f https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/noarch/zipp-3.16.2-pyhd8ed1ab_0.conda#2da0451b54c4563c32490cb1b7cf68a1 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.3-h28f7589_1.conda#97503d3e565004697f1651753aa95b9e +https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.9.3-hb447be9_1.conda#c520669eb0be9269a5f0d8ef62531882 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py310h255011f_3.conda#800596144bb613cd7ac58b80900ce835 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py310hde88566_1.tar.bz2#94ce7a76b0c912279f6958e0b6b21d2b https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.1.0-py310hd41b1e2_0.conda#684399f9ddc0b9d6f3b6164f6107098e @@ -133,20 +144,23 @@ https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.1-py310h056c13c_1.co https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.7.1-hd8ed1ab_0.conda#f96688577f1faa58096d06a45136afa2 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.4-pyhd8ed1ab_0.conda#18badd8fa3648d1beb1fcc7f2e0f756e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.3.14-hf3aad02_1.conda#a968ffa7e9fe0c257628033d393e512f https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py310h278f3c1_0.conda#f2d3f2542a2467f479e809ac7b901ac2 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.8.0-hd8ed1ab_0.conda#b279b07ce18058034e5b3606ba103a8b -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_he09a3a9_107.conda#56b9982aec30923b1949e07466f275ae https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py310he60537e_0.conda#68b2dd34c69d08b05a9db5e3596fe3ee https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.10.0-pyhd8ed1ab_0.conda#0809187ef9b89a3d94a5c24d13936236 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.0-py310h24ef57a_1.conda#a689e86d7bbab67f889fc384aa72b088 https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b +https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.21.0-hb942446_5.conda#07d92ed5403ad7b5c66ffd7d5b8f7e57 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py310h7cbd5c2_0.conda#7bfbace0788f477da1c26e10a358692d -https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.8.0-pyhd8ed1ab_0.conda#160a92928fc4a0ca40a64b586a2cf671 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.8.1-pyhd8ed1ab_0.conda#cda1fad481e5a7d5489c0cc44d099b9d https://conda.anaconda.org/conda-forge/linux-64/jasper-4.0.0-h32699f2_1.conda#fdde5424ecef5f7ad310b4242229291c -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py310h6f5dce6_101.conda#0d50bea104512f2728676a8bff8840d3 https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyha770c72_3.conda#5936894aade8240c867d292aa0d980c6 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.31.0-h73bf81c_0.conda#ffb754859219f4d8fbd9b7cc3337dd27 +https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.10.57-h85b1a90_19.conda#0605d3d60857fc07bd6a11e878fe0f08 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.1-py310ha4c1d20_0.conda#300d3b434872eb84965864f0fcc5b5da +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h7e745eb_109.conda#9e208615247477427acbd0900ca7038f +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.31.0-h73bf81c_0.conda#ffb754859219f4d8fbd9b7cc3337dd27 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py310h6f5dce6_101.conda#0d50bea104512f2728676a8bff8840d3 https://conda.anaconda.org/conda-forge/noarch/iris-3.6.1-pyha770c72_0.conda#36d615b339058273520990fc78239116 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.6.0-py310h278f3c1_0.conda#82225061491482514b0e057e69c6dda4 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 84688222..f36d60e8 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -13,6 +13,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.1.0-h69a702a_0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.1.0-he5830b7_0.conda#56ca14d57ac29a75d23a39eb3ee0ddeb https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.1.0-he5830b7_0.conda#cd93f779ff018dd85c7544c015c9db3c +https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.0-hd590300_0.conda#71b89db63b5b504e7afc8ad901172e1e 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.19.1-hd590300_0.conda#e8c18d865be43e2fb3f7a145b6adf1f5 https://conda.anaconda.org/conda-forge/linux-64/geos-3.11.2-hcb278e6_0.conda#3b8e364995e3575e57960d29c1e5ab14 @@ -44,9 +45,13 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2#be93aabceefa2fac576e971aef407908 https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h0b41bf4_1003.conda#bce9f945da8ad2ae9b1d7165a64d0f87 https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007.tar.bz2#b4a4381d54784606820704f7b5f05a15 -https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.1-h0b41bf4_0.conda#e9c3bcf0e0c719431abec8ca447eee27 +https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae +https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.6.1-hc309b26_1.conda#cc09293a2c2b7fd77aff284f370c12c0 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.17-h4d4d85c_2.conda#9ca99452635fe03eb5fa937f5ae604b0 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.12-h4d4d85c_1.conda#eba092fc6de212a01de0065f38fe8bbb +https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.17-h4d4d85c_1.conda#30f9df85ce23cd14faa9a4dfa50cca2b https://conda.anaconda.org/conda-forge/linux-64/expat-2.5.0-hcb278e6_1.conda#8b9b5aca60558d02ddaa09d599e55920 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h501b40f_6.conda#c3e9338e15d90106f467377017352b97 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-17_linux64_openblas.conda#57fb44770b1bc832fb2dbefa1bd502de @@ -61,13 +66,15 @@ https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#332 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.11.5-h0d562d8_0.conda#558ab736404275d7df61c473c1af35aa https://conda.anaconda.org/conda-forge/linux-64/libzip-1.9.2-hc929e4a_1.tar.bz2#5b122b50e738c4be5c3f2899f010d7cf https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 +https://conda.anaconda.org/conda-forge/linux-64/s2n-1.3.48-h06160fa_0.conda#f6d996f514756660c3d97eb0a49cba25 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-hfc55251_7.conda#32ae18eb2a687912fc9e92a501c0a11b +https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.13.32-h4a1a131_0.conda#313b9d0df6705beb45f424eb420ac21c https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.4-h0f2a231_0.conda#876286b5941933a0f558777e57d883cc https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_9.conda#d47dee1856d9cb955b8076eeff304a5b https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-hca18f0e_1.conda#e1232042de76d24539a436d37597eb06 -https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.1-h659d440_0.conda#1b5126ec25763eb17ef74c8763d26e84 +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-17_linux64_openblas.conda#7ef0969b00fe3d6eef56a8151d3afb29 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1002.conda#4c4dce87e96b321308f81ba2c10d2897 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-17_linux64_openblas.conda#a2103882c46492e26500fcb56c03de8b @@ -78,11 +85,13 @@ https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-hc3e0081_0.tar.b https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.6-h8ee46fc_0.conda#7590b76c3d11d21caa44f3fc38ac584a https://conda.anaconda.org/conda-forge/linux-64/antlr-python-runtime-4.7.2-py311h38be061_1003.tar.bz2#0ab8f8f0cae99343907fe68cda11baea https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda#3edfead7cedd1ab4400a6c588f3e75f8 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.3.1-h2e3709c_4.conda#2cf21b1cbc1c096a28ffa2892257a2c1 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.7.11-h00aa349_4.conda#cb932dff7328ff620ce8059c9968b095 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_9.conda#4601544b4982ba1861fa9b9c607b2c06 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.0.9-py311ha362b79_9.conda#ced5340f5dc6cff43a80deac8d0e398f https://conda.anaconda.org/conda-forge/noarch/certifi-2023.7.22-pyhd8ed1ab_0.conda#7f3dbc9179b4dde7da98dfb151d0ad22 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.2.0-pyhd8ed1ab_0.conda#313516e9a4b08b12dfb1e1cd390a96e3 -https://conda.anaconda.org/conda-forge/noarch/click-8.1.6-unix_pyh707e725_0.conda#64dbb3b205546691a61204d1cfb208e3 +https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.1-pyhd8ed1ab_0.conda#b325bfc4cff7d7f8a868f1f7ecc4ed16 https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb https://conda.anaconda.org/conda-forge/noarch/filelock-3.12.2-pyhd8ed1ab_0.conda#53522ec72e6adae42bd373ef58357230 @@ -105,9 +114,9 @@ https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.1-pyhd8ed1ab_0.conda#176f7d56f0cfe9008bdf1bccd7de02fb https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 -https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.2.0-py311h2582759_0.conda#dfcc3e6e30d6ec2b2bb416fcd8ff4dc1 +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.3.0-py311h459d7ec_0.conda#87b306459b81b7a7aaad37222d537a4f https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py311hd4cff14_5.tar.bz2#da8769492e423103c59f469f4f17f8d9 -https://conda.anaconda.org/conda-forge/noarch/setuptools-68.0.0-pyhd8ed1ab_0.conda#5a7739d0f57ee64133c9d32e6507c46d +https://conda.anaconda.org/conda-forge/noarch/setuptools-68.1.2-pyhd8ed1ab_0.conda#4fe12573bf499ff85a0a364e00cc5c53 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.7.1-pyha770c72_0.conda#c39d6a09fe819de4951c2642629d9115 @@ -115,6 +124,8 @@ https://conda.anaconda.org/conda-forge/noarch/wheel-0.41.1-pyhd8ed1ab_0.conda#8f https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/noarch/zipp-3.16.2-pyhd8ed1ab_0.conda#2da0451b54c4563c32490cb1b7cf68a1 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.3-h28f7589_1.conda#97503d3e565004697f1651753aa95b9e +https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.9.3-hb447be9_1.conda#c520669eb0be9269a5f0d8ef62531882 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py311h409f033_3.conda#9025d0786dbbe4bc91fd8e85502decce https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py311h4c7f6c3_1.tar.bz2#c7e54004ffd03f8db0a58ab949f2a00b https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.1.0-py311h9547e67_0.conda#daf3f23397ab2265d0cdfa339f3627ba @@ -132,20 +143,23 @@ https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.1-py311h54d622a_1.co https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.7.1-hd8ed1ab_0.conda#f96688577f1faa58096d06a45136afa2 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.4-pyhd8ed1ab_0.conda#18badd8fa3648d1beb1fcc7f2e0f756e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.3.14-hf3aad02_1.conda#a968ffa7e9fe0c257628033d393e512f https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h1f0f07a_0.conda#43a71a823583d75308eaf3a06c8f150b https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.8.0-hd8ed1ab_0.conda#b279b07ce18058034e5b3606ba103a8b -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_he09a3a9_107.conda#56b9982aec30923b1949e07466f275ae https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py311h8597a09_0.conda#70c3b734ffe82c16b6d121aaa11929a8 https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.10.0-pyhd8ed1ab_0.conda#0809187ef9b89a3d94a5c24d13936236 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.0-py311ha169711_1.conda#92633556d37e88ce45193374d408072c https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b +https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.21.0-hb942446_5.conda#07d92ed5403ad7b5c66ffd7d5b8f7e57 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py311h320fe9a_0.conda#1271b2375735e2aaa6d6770dbe2ad087 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.8.0-pyhd8ed1ab_0.conda#160a92928fc4a0ca40a64b586a2cf671 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.8.1-pyhd8ed1ab_0.conda#cda1fad481e5a7d5489c0cc44d099b9d https://conda.anaconda.org/conda-forge/linux-64/jasper-4.0.0-h32699f2_1.conda#fdde5424ecef5f7ad310b4242229291c -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py311h9a7c333_101.conda#1dc70c7c3352c0ff1f861d866860db37 https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyha770c72_3.conda#5936894aade8240c867d292aa0d980c6 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.31.0-h73bf81c_0.conda#ffb754859219f4d8fbd9b7cc3337dd27 +https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.10.57-h85b1a90_19.conda#0605d3d60857fc07bd6a11e878fe0f08 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.1-py311h64a7726_0.conda#356da36102fc1eeb8a81e6d79e53bc7e +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h7e745eb_109.conda#9e208615247477427acbd0900ca7038f +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.31.0-h73bf81c_0.conda#ffb754859219f4d8fbd9b7cc3337dd27 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py311h9a7c333_101.conda#1dc70c7c3352c0ff1f861d866860db37 https://conda.anaconda.org/conda-forge/noarch/iris-3.6.1-pyha770c72_0.conda#36d615b339058273520990fc78239116 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.6.0-py311h1f0f07a_0.conda#c1a8ed764bff88bba46dbc6566016187 diff --git a/requirements/locks/py39-linux-64.lock b/requirements/locks/py39-linux-64.lock index 815c8a85..8e94cf57 100644 --- a/requirements/locks/py39-linux-64.lock +++ b/requirements/locks/py39-linux-64.lock @@ -13,6 +13,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.1.0-h69a702a_0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.1.0-he5830b7_0.conda#56ca14d57ac29a75d23a39eb3ee0ddeb https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.1.0-he5830b7_0.conda#cd93f779ff018dd85c7544c015c9db3c +https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.0-hd590300_0.conda#71b89db63b5b504e7afc8ad901172e1e 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.19.1-hd590300_0.conda#e8c18d865be43e2fb3f7a145b6adf1f5 https://conda.anaconda.org/conda-forge/linux-64/geos-3.11.2-hcb278e6_0.conda#3b8e364995e3575e57960d29c1e5ab14 @@ -44,9 +45,13 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2#be93aabceefa2fac576e971aef407908 https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h0b41bf4_1003.conda#bce9f945da8ad2ae9b1d7165a64d0f87 https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007.tar.bz2#b4a4381d54784606820704f7b5f05a15 -https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.1-h0b41bf4_0.conda#e9c3bcf0e0c719431abec8ca447eee27 +https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae +https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.6.1-hc309b26_1.conda#cc09293a2c2b7fd77aff284f370c12c0 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.17-h4d4d85c_2.conda#9ca99452635fe03eb5fa937f5ae604b0 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.12-h4d4d85c_1.conda#eba092fc6de212a01de0065f38fe8bbb +https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.17-h4d4d85c_1.conda#30f9df85ce23cd14faa9a4dfa50cca2b https://conda.anaconda.org/conda-forge/linux-64/expat-2.5.0-hcb278e6_1.conda#8b9b5aca60558d02ddaa09d599e55920 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h501b40f_6.conda#c3e9338e15d90106f467377017352b97 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-17_linux64_openblas.conda#57fb44770b1bc832fb2dbefa1bd502de @@ -61,13 +66,15 @@ https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#332 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.11.5-h0d562d8_0.conda#558ab736404275d7df61c473c1af35aa https://conda.anaconda.org/conda-forge/linux-64/libzip-1.9.2-hc929e4a_1.tar.bz2#5b122b50e738c4be5c3f2899f010d7cf https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 +https://conda.anaconda.org/conda-forge/linux-64/s2n-1.3.48-h06160fa_0.conda#f6d996f514756660c3d97eb0a49cba25 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-hfc55251_7.conda#32ae18eb2a687912fc9e92a501c0a11b +https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.13.32-h4a1a131_0.conda#313b9d0df6705beb45f424eb420ac21c https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.4-h0f2a231_0.conda#876286b5941933a0f558777e57d883cc https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_9.conda#d47dee1856d9cb955b8076eeff304a5b https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-hca18f0e_1.conda#e1232042de76d24539a436d37597eb06 -https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.1-h659d440_0.conda#1b5126ec25763eb17ef74c8763d26e84 +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-17_linux64_openblas.conda#7ef0969b00fe3d6eef56a8151d3afb29 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1002.conda#4c4dce87e96b321308f81ba2c10d2897 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-17_linux64_openblas.conda#a2103882c46492e26500fcb56c03de8b @@ -78,11 +85,13 @@ https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-hc3e0081_0.tar.b https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.6-h8ee46fc_0.conda#7590b76c3d11d21caa44f3fc38ac584a https://conda.anaconda.org/conda-forge/linux-64/antlr-python-runtime-4.7.2-py39hf3d152e_1003.tar.bz2#5e8330e806e50bd6137ebd125f4bc1bb https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda#3edfead7cedd1ab4400a6c588f3e75f8 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.3.1-h2e3709c_4.conda#2cf21b1cbc1c096a28ffa2892257a2c1 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.7.11-h00aa349_4.conda#cb932dff7328ff620ce8059c9968b095 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_9.conda#4601544b4982ba1861fa9b9c607b2c06 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.0.9-py39h5a03fae_9.conda#d1601752c6f47af7bedf838be3d8ca6b https://conda.anaconda.org/conda-forge/noarch/certifi-2023.7.22-pyhd8ed1ab_0.conda#7f3dbc9179b4dde7da98dfb151d0ad22 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.2.0-pyhd8ed1ab_0.conda#313516e9a4b08b12dfb1e1cd390a96e3 -https://conda.anaconda.org/conda-forge/noarch/click-8.1.6-unix_pyh707e725_0.conda#64dbb3b205546691a61204d1cfb208e3 +https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.1-pyhd8ed1ab_0.conda#b325bfc4cff7d7f8a868f1f7ecc4ed16 https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb https://conda.anaconda.org/conda-forge/noarch/filelock-3.12.2-pyhd8ed1ab_0.conda#53522ec72e6adae42bd373ef58357230 @@ -105,9 +114,9 @@ https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.1-pyhd8ed1ab_0.conda#176f7d56f0cfe9008bdf1bccd7de02fb https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 -https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.2.0-py39h72bdee0_0.conda#18927f971926b7271600368de71de557 +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.3.0-py39hd1e30aa_0.conda#41841cc1d7387bb7a30cdde4d88afbf4 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py39hb9d737c_5.tar.bz2#ef9db3c38ae7275f6b14491cfe61a248 -https://conda.anaconda.org/conda-forge/noarch/setuptools-68.0.0-pyhd8ed1ab_0.conda#5a7739d0f57ee64133c9d32e6507c46d +https://conda.anaconda.org/conda-forge/noarch/setuptools-68.1.2-pyhd8ed1ab_0.conda#4fe12573bf499ff85a0a364e00cc5c53 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.7.1-pyha770c72_0.conda#c39d6a09fe819de4951c2642629d9115 @@ -116,6 +125,8 @@ https://conda.anaconda.org/conda-forge/noarch/wheel-0.41.1-pyhd8ed1ab_0.conda#8f https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/noarch/zipp-3.16.2-pyhd8ed1ab_0.conda#2da0451b54c4563c32490cb1b7cf68a1 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.3-h28f7589_1.conda#97503d3e565004697f1651753aa95b9e +https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.9.3-hb447be9_1.conda#c520669eb0be9269a5f0d8ef62531882 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py39he91dace_3.conda#20080319ef73fbad74dcd6d62f2a3ffe https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py39h2ae25f5_1.tar.bz2#c943fb9a2818ecc5be1e0ecc8b7738f1 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.1.0-py39h7633fee_0.conda#54e6f32e448fdc273606011f0940d076 @@ -134,21 +145,24 @@ https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.1-py39hf1c3bca_1.con https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.7.1-hd8ed1ab_0.conda#f96688577f1faa58096d06a45136afa2 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.4-pyhd8ed1ab_0.conda#18badd8fa3648d1beb1fcc7f2e0f756e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.3.14-hf3aad02_1.conda#a968ffa7e9fe0c257628033d393e512f https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py39h0f8d45d_0.conda#180d4312005bc93f257e2997a8ee41cb https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.0.1-pyhd8ed1ab_0.conda#54661981fd331e20847d8a49543dd9af https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.8.0-hd8ed1ab_0.conda#b279b07ce18058034e5b3606ba103a8b -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_he09a3a9_107.conda#56b9982aec30923b1949e07466f275ae https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.10.0-pyhd8ed1ab_0.conda#0809187ef9b89a3d94a5c24d13936236 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.0-py39h5ed0f51_1.conda#9c455b3b3b55f13b2094932740cd3efb https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b -https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.8.0-pyhd8ed1ab_0.conda#160a92928fc4a0ca40a64b586a2cf671 +https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.21.0-hb942446_5.conda#07d92ed5403ad7b5c66ffd7d5b8f7e57 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.8.1-pyhd8ed1ab_0.conda#cda1fad481e5a7d5489c0cc44d099b9d https://conda.anaconda.org/conda-forge/linux-64/jasper-4.0.0-h32699f2_1.conda#fdde5424ecef5f7ad310b4242229291c https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py39he190548_0.conda#f2a931db797bb58bd335f4a857b4c898 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py39h4218a78_101.conda#8f5c25bb7accd1954d8b7fc689c5975c https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyha770c72_3.conda#5936894aade8240c867d292aa0d980c6 +https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.10.57-h85b1a90_19.conda#0605d3d60857fc07bd6a11e878fe0f08 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py39h40cae4c_0.conda#24b4bf92e26a46217e37e5928927116b -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.31.0-h73bf81c_0.conda#ffb754859219f4d8fbd9b7cc3337dd27 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.1-py39h6183b62_0.conda#81212684c03e970520656f1a62ab9d39 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h7e745eb_109.conda#9e208615247477427acbd0900ca7038f +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.31.0-h73bf81c_0.conda#ffb754859219f4d8fbd9b7cc3337dd27 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py39h4218a78_101.conda#8f5c25bb7accd1954d8b7fc689c5975c https://conda.anaconda.org/conda-forge/noarch/iris-3.6.1-pyha770c72_0.conda#36d615b339058273520990fc78239116 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.6.0-py39h0f8d45d_0.conda#37f4c199171dd388337f6c8080230f44 From d6ea9c6e775b8b9d6555819fd3397570f5d9a717 Mon Sep 17 00:00:00 2001 From: lbdreyer Date: Thu, 24 Aug 2023 16:52:57 +0100 Subject: [PATCH 231/583] Add loading+saving for non-supported fixed surfaces (#318) * Add loading+saving for non-supported fixed surfaces." * Fix tests, rename attribute, add whatsnew * Review actions * Get tests working * Update iris_grib/tests/unit/load_convert/test_vertical_coords.py Co-authored-by: Patrick Peglar * Fix tests * Fix test --------- Co-authored-by: Patrick Peglar --- docs/ref/release_notes.rst | 12 +++ iris_grib/_load_convert.py | 99 +++++++++---------- iris_grib/_save_rules.py | 44 ++++++--- .../grid_complex_spatial_differencing.cml | 7 ++ .../missing_values_grib2.cml | 7 ++ .../unit/load_convert/test_vertical_coords.py | 60 ++++++++--- .../save_rules/test_set_fixed_surfaces.py | 78 ++++++++++++++- 7 files changed, 228 insertions(+), 79 deletions(-) diff --git a/docs/ref/release_notes.rst b/docs/ref/release_notes.rst index b3d98cfc..c8d9db83 100644 --- a/docs/ref/release_notes.rst +++ b/docs/ref/release_notes.rst @@ -8,6 +8,18 @@ What's new in iris-grib v0.19.0 :Release: 0.19.0 :Date: [unreleased] + +======= +Features +^^^^^^^^ +* `@lbdreyer `_ and + `@pp-mo `_ (reviewer) modified the loading of GRIB + messages with an unrecognised fixed surface type. These are now loaded in as + an unnamed coordinate with an attribute called GRIB_fixed_surface_type. + iris-grib will also save out cubes with this attribute as the given fixed + surface type.`(PR#318) `_ + + Bugs Fixed ^^^^^^^^^^ * `@lbdreyer `_ and diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index 0d6a50c8..b470c843 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -1630,63 +1630,58 @@ def vertical_coords(section, metadata): else: # Generate vertical coordinate. typeOfFirstFixedSurface = section['typeOfFirstFixedSurface'] - key = 'scaledValueOfFirstFixedSurface' - scaledValueOfFirstFixedSurface = section[key] - fixed_surface = _FIXED_SURFACE.get(typeOfFirstFixedSurface) - - if fixed_surface is None: - if typeOfFirstFixedSurface != _TYPE_OF_FIXED_SURFACE_MISSING: - if scaledValueOfFirstFixedSurface == _MDI: - if options.warn_on_unsupported: - msg = 'Unable to translate type of first fixed ' \ - 'surface with missing scaled value.' - warnings.warn(msg) - else: - if options.warn_on_unsupported: - msg = 'Unable to translate type of first fixed ' \ - 'surface with scaled value.' - warnings.warn(msg) - else: - key = 'scaleFactorOfFirstFixedSurface' - scaleFactorOfFirstFixedSurface = section[key] - typeOfSecondFixedSurface = section['typeOfSecondFixedSurface'] - - if typeOfSecondFixedSurface != _TYPE_OF_FIXED_SURFACE_MISSING: - if typeOfFirstFixedSurface != typeOfSecondFixedSurface: - msg = 'Product definition section 4 has different ' \ - 'types of first and second fixed surface' - raise TranslationError(msg) - - key = 'scaledValueOfSecondFixedSurface' - scaledValueOfSecondFixedSurface = section[key] - - if scaledValueOfSecondFixedSurface == _MDI: - msg = 'Product definition section 4 has missing ' \ - 'scaled value of second fixed surface' - raise TranslationError(msg) + + # We treat fixed surface level type=1 as having no vertical coordinate. + # See https://github.com/SciTools/iris/issues/519 + if typeOfFirstFixedSurface not in [_TYPE_OF_FIXED_SURFACE_MISSING, 1]: + key = 'scaledValueOfFirstFixedSurface' + scaledValueOfFirstFixedSurface = section[key] + if scaledValueOfFirstFixedSurface == _MDI: + if options.warn_on_unsupported: + msg = 'Unable to translate type of first fixed ' \ + 'surface with missing scaled value.' + warnings.warn(msg) + else: + fixed_surface_missing = FixedSurface(None, None, None) + fixed_surface = _FIXED_SURFACE.get( + typeOfFirstFixedSurface, fixed_surface_missing) + key = 'scaleFactorOfFirstFixedSurface' + scaleFactorOfFirstFixedSurface = section[key] + typeOfSecondFixedSurface = section['typeOfSecondFixedSurface'] + if typeOfSecondFixedSurface != _TYPE_OF_FIXED_SURFACE_MISSING: + if typeOfFirstFixedSurface != typeOfSecondFixedSurface: + msg = 'Product definition section 4 has different ' \ + 'types of first and second fixed surface' + raise TranslationError(msg) + key = 'scaledValueOfSecondFixedSurface' + scaledValueOfSecondFixedSurface = section[key] + + if scaledValueOfSecondFixedSurface == _MDI: + msg = 'Product definition section 4 has missing ' \ + 'scaled value of second fixed surface' + raise TranslationError(msg) + else: + key = 'scaleFactorOfSecondFixedSurface' + scaleFactorOfSecondFixedSurface = section[key] + first = unscale(scaledValueOfFirstFixedSurface, + scaleFactorOfFirstFixedSurface) + second = unscale(scaledValueOfSecondFixedSurface, + scaleFactorOfSecondFixedSurface) + point = 0.5 * (first + second) + bounds = [first, second] else: - key = 'scaleFactorOfSecondFixedSurface' - scaleFactorOfSecondFixedSurface = section[key] - first = unscale(scaledValueOfFirstFixedSurface, + point = unscale(scaledValueOfFirstFixedSurface, scaleFactorOfFirstFixedSurface) - second = unscale(scaledValueOfSecondFixedSurface, - scaleFactorOfSecondFixedSurface) - point = 0.5 * (first + second) - bounds = [first, second] - coord = DimCoord(point, - standard_name=fixed_surface.standard_name, - long_name=fixed_surface.long_name, - units=fixed_surface.units, - bounds=bounds) - # Add the vertical coordinate to metadata aux coords. - metadata['aux_coords_and_dims'].append((coord, None)) - else: - point = unscale(scaledValueOfFirstFixedSurface, - scaleFactorOfFirstFixedSurface) + bounds = None coord = DimCoord(point, standard_name=fixed_surface.standard_name, long_name=fixed_surface.long_name, - units=fixed_surface.units) + units=fixed_surface.units, + bounds=bounds) + if fixed_surface == fixed_surface_missing: + coord.attributes['GRIB_fixed_surface_type'] = \ + typeOfFirstFixedSurface + # Add the vertical coordinate to metadata aux coords. metadata['aux_coords_and_dims'].append((coord, None)) diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index 116304c6..a0b26c50 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -911,15 +911,27 @@ def set_fixed_surfaces(cube, grib, full3d_cube=None): # unknown / absent else: - # check for *ANY* height coords at all... - v_coords = cube.coords(axis='z') - if v_coords: - # There are vertical coordinate(s), but we don't understand them... - v_coords_str = ' ,'.join(["'{}'".format(c.name()) - for c in v_coords]) - raise TranslationError( - 'The vertical-axis coordinate(s) ({}) ' - 'are not recognised or handled.'.format(v_coords_str)) + fs_v_coords = [coord for coord in cube.coords() if + 'GRIB_fixed_surface_type' in coord.attributes] + if len(fs_v_coords) > 1: + fs_types = [c.attributes['GRIB_fixed_surface_type'] + for c in fs_v_coords] + raise ValueError("Multiple vertical-axis coordinates were found " + f"of fixed surface type: {fs_types}") + elif len(fs_v_coords) == 1: + v_coord = fs_v_coords[0] + grib_v_code = v_coord.attributes['GRIB_fixed_surface_type'] + else: + # check for *ANY* height coords at all... + v_coords = cube.coords(axis='z') + if v_coords: + # There are vertical coordinate(s), but we don't understand + # them... + v_coords_str = ' ,'.join(["'{}'".format(c.name()) + for c in v_coords]) + raise TranslationError( + 'The vertical-axis coordinate(s) ({}) ' + 'are not recognised or handled.'.format(v_coords_str)) # What did we find? if v_coord is None: @@ -932,12 +944,15 @@ def set_fixed_surfaces(cube, grib, full3d_cube=None): eccodes.codes_set(grib, "scaledValueOfFirstFixedSurface", 0) # Set secondary surface = 'missing'. eccodes.codes_set(grib, "typeOfSecondFixedSurface", 255) - eccodes.codes_set(grib, "scaleFactorOfSecondFixedSurface", 255) + eccodes.codes_set(grib, "scaleFactorOfSecondFixedSurface", + GRIB_MISSING_LONG) eccodes.codes_set(grib, "scaledValueOfSecondFixedSurface", GRIB_MISSING_LONG) elif not v_coord.has_bounds(): # No second surface - output_v = v_coord.units.convert(v_coord.points[0], output_unit) + output_v = v_coord.points[0] + if output_unit: + output_v = v_coord.units.convert(output_v, output_unit) if output_v - abs(output_v): warnings.warn("Vertical level encoding problem: scaling required.") output_v = int(round(output_v)) @@ -946,12 +961,15 @@ def set_fixed_surfaces(cube, grib, full3d_cube=None): eccodes.codes_set(grib, "scaleFactorOfFirstFixedSurface", 0) eccodes.codes_set(grib, "scaledValueOfFirstFixedSurface", output_v) eccodes.codes_set(grib, "typeOfSecondFixedSurface", 255) - eccodes.codes_set(grib, "scaleFactorOfSecondFixedSurface", 255) + eccodes.codes_set(grib, "scaleFactorOfSecondFixedSurface", + GRIB_MISSING_LONG) eccodes.codes_set(grib, "scaledValueOfSecondFixedSurface", GRIB_MISSING_LONG) else: # bounded : set lower+upper surfaces - output_v = v_coord.units.convert(v_coord.bounds[0], output_unit) + output_v = v_coord.bounds[0] + if output_unit: + output_v = v_coord.units.convert(output_v, output_unit) if output_v[0] - abs(output_v[0]) or output_v[1] - abs(output_v[1]): warnings.warn("Vertical level encoding problem: scaling required.") eccodes.codes_set(grib, "typeOfFirstFixedSurface", grib_v_code) diff --git a/iris_grib/tests/results/integration/load_convert/data_section/TestDRT3/grid_complex_spatial_differencing.cml b/iris_grib/tests/results/integration/load_convert/data_section/TestDRT3/grid_complex_spatial_differencing.cml index b4335f91..e6191c14 100644 --- a/iris_grib/tests/results/integration/load_convert/data_section/TestDRT3/grid_complex_spatial_differencing.cml +++ b/iris_grib/tests/results/integration/load_convert/data_section/TestDRT3/grid_complex_spatial_differencing.cml @@ -34,6 +34,13 @@ + + + + + + + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/missing_values_grib2.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/missing_values_grib2.cml index 60d1dc9b..41c8f46c 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/missing_values_grib2.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/missing_values_grib2.cml @@ -34,6 +34,13 @@ + + + + + + + diff --git a/iris_grib/tests/unit/load_convert/test_vertical_coords.py b/iris_grib/tests/unit/load_convert/test_vertical_coords.py index 8de79f4e..e7455297 100644 --- a/iris_grib/tests/unit/load_convert/test_vertical_coords.py +++ b/iris_grib/tests/unit/load_convert/test_vertical_coords.py @@ -53,7 +53,19 @@ def test_no_first_fixed_surface(self): vertical_coords(section, metadata) self.assertEqual(metadata, self.metadata) - def _check(self, value, msg): + def test_fixed_surface_type_1(self): + metadata = deepcopy(self.metadata) + section = {'NV': 0, + 'typeOfFirstFixedSurface': 1, + 'scaledValueOfFirstFixedSurface': 0, + 'scaleFactorOfFirstFixedSurface': 0, + 'typeOfSecondFixedSurface': 255} + vertical_coords(section, metadata) + # No metadata change, as surfaceType=1 translates to "no vertical + # coord" without error or warning. + self.assertEqual(metadata, self.metadata) + + def test_unknown_first_fixed_surface_with_missing_scaled_value(self): this = 'iris_grib._load_convert.options' with mock.patch('warnings.warn') as warn: with mock.patch(this) as options: @@ -62,22 +74,48 @@ def _check(self, value, msg): metadata = deepcopy(self.metadata) section = {'NV': 0, 'typeOfFirstFixedSurface': 0, - 'scaledValueOfFirstFixedSurface': value} + 'scaledValueOfFirstFixedSurface': MISSING_LEVEL} # The call being tested. vertical_coords(section, metadata) self.assertEqual(metadata, self.metadata) if request_warning: self.assertEqual(len(warn.mock_calls), 1) args, _ = warn.call_args - self.assertIn(msg, args[0]) + self.assertIn('surface with missing scaled value', + args[0]) else: self.assertEqual(len(warn.mock_calls), 0) - def test_unknown_first_fixed_surface_with_missing_scaled_value(self): - self._check(MISSING_LEVEL, 'surface with missing scaled value') + def test_unknown_first_fixed_surface(self): + metadata = deepcopy(self.metadata) + expected = deepcopy(self.metadata) + coord = DimCoord(600.0, attributes={'GRIB_fixed_surface_type': 106}) + expected['aux_coords_and_dims'].append((coord, None)) + + section = {'NV': 0, + 'typeOfFirstFixedSurface': 106, + 'scaledValueOfFirstFixedSurface': 600, + 'scaleFactorOfFirstFixedSurface': 0, + 'typeOfSecondFixedSurface': MISSING_SURFACE} + vertical_coords(section, metadata) + self.assertEqual(metadata, expected) - def test_unknown_first_fixed_surface_with_scaled_value(self): - self._check(0, 'surface with scaled value') + def test_unknown_first_fixed_surface_with_second_fixed_surface(self): + metadata = deepcopy(self.metadata) + expected = deepcopy(self.metadata) + coord = DimCoord(9000.0, bounds=[18000, 0], + attributes={'GRIB_fixed_surface_type': 108}) + expected['aux_coords_and_dims'].append((coord, None)) + + section = {'NV': 0, + 'typeOfFirstFixedSurface': 108, + 'scaledValueOfFirstFixedSurface': 18000, + 'scaleFactorOfFirstFixedSurface': 0, + 'typeOfSecondFixedSurface': 108, + 'scaledValueOfSecondFixedSurface': 0, + 'scaleFactorOfSecondFixedSurface': 0} + vertical_coords(section, metadata) + self.assertEqual(metadata, expected) def test_pressure_with_no_second_fixed_surface(self): metadata = deepcopy(self.metadata) @@ -108,8 +146,8 @@ def test_height_with_no_second_fixed_surface(self): def test_different_fixed_surfaces(self): section = {'NV': 0, 'typeOfFirstFixedSurface': 100, - 'scaledValueOfFirstFixedSurface': None, - 'scaleFactorOfFirstFixedSurface': None, + 'scaledValueOfFirstFixedSurface': 10, + 'scaleFactorOfFirstFixedSurface': 1, 'typeOfSecondFixedSurface': 0} emsg = 'different types of first and second fixed surface' with self.assertRaisesRegex(TranslationError, emsg): @@ -118,8 +156,8 @@ def test_different_fixed_surfaces(self): def test_same_fixed_surfaces_missing_second_scaled_value(self): section = {'NV': 0, 'typeOfFirstFixedSurface': 100, - 'scaledValueOfFirstFixedSurface': None, - 'scaleFactorOfFirstFixedSurface': None, + 'scaledValueOfFirstFixedSurface': 10, + 'scaleFactorOfFirstFixedSurface': 1, 'typeOfSecondFixedSurface': 100, 'scaledValueOfSecondFixedSurface': MISSING_LEVEL} emsg = 'missing scaled value of second fixed surface' diff --git a/iris_grib/tests/unit/save_rules/test_set_fixed_surfaces.py b/iris_grib/tests/unit/save_rules/test_set_fixed_surfaces.py index aa37a62f..13c3ef6d 100644 --- a/iris_grib/tests/unit/save_rules/test_set_fixed_surfaces.py +++ b/iris_grib/tests/unit/save_rules/test_set_fixed_surfaces.py @@ -20,6 +20,7 @@ import iris.cube import iris.coords +from iris.exceptions import TranslationError from iris_grib._save_rules import set_fixed_surfaces @@ -102,7 +103,7 @@ def test_altitude_point(self, mock_set): 12345) mock_set.assert_any_call(grib, "typeOfSecondFixedSurface", 255) mock_set.assert_any_call(grib, "scaleFactorOfSecondFixedSurface", - 255) + GRIB_MISSING_LONG) mock_set.assert_any_call(grib, "scaledValueOfSecondFixedSurface", GRIB_MISSING_LONG) @@ -118,10 +119,80 @@ def test_height_point(self, mock_set): mock_set.assert_any_call(grib, "scaleFactorOfFirstFixedSurface", 0) mock_set.assert_any_call(grib, "scaledValueOfFirstFixedSurface", 12345) mock_set.assert_any_call(grib, "typeOfSecondFixedSurface", 255) - mock_set.assert_any_call(grib, "scaleFactorOfSecondFixedSurface", 255) + mock_set.assert_any_call(grib, "scaleFactorOfSecondFixedSurface", + GRIB_MISSING_LONG) mock_set.assert_any_call(grib, "scaledValueOfSecondFixedSurface", GRIB_MISSING_LONG) + def test_unknown_vertical_unbounded(self): + cube = iris.cube.Cube([0]) + cube.add_aux_coord( + iris.coords.AuxCoord([1], + attributes={'GRIB_fixed_surface_type': 151})) + grib = eccodes.codes_grib_new_from_samples("GRIB2") + set_fixed_surfaces(cube, grib) + + self.assertEqual(eccodes.codes_get_long( + grib, "typeOfFirstFixedSurface"), 151) + self.assertEqual(eccodes.codes_get_double( + grib, "scaledValueOfFirstFixedSurface"), 1) + self.assertEqual(eccodes.codes_get_double( + grib, "scaleFactorOfFirstFixedSurface"), 0) + self.assertEqual(eccodes.codes_get_long( + grib, "typeOfSecondFixedSurface"), 255) + self.assertEqual(eccodes.codes_get_long( + grib, "scaledValueOfSecondFixedSurface"), GRIB_MISSING_LONG) + self.assertEqual(eccodes.codes_get_long( + grib, "scaleFactorOfSecondFixedSurface"), GRIB_MISSING_LONG) + + def test_unknown_vertical_bounded(self): + cube = iris.cube.Cube([0]) + cube.add_aux_coord( + iris.coords.AuxCoord([700], bounds=np.array([900.0, 500.0]), + attributes={'GRIB_fixed_surface_type': 108})) + grib = eccodes.codes_grib_new_from_samples("GRIB2") + set_fixed_surfaces(cube, grib) + + self.assertEqual( + eccodes.codes_get_long(grib, "typeOfFirstFixedSurface"), 108) + self.assertEqual( + eccodes.codes_get_double(grib, "scaledValueOfFirstFixedSurface"), + 900) + self.assertEqual( + eccodes.codes_get_double(grib, "scaleFactorOfFirstFixedSurface"), + 0) + self.assertEqual( + eccodes.codes_get_long(grib, "typeOfSecondFixedSurface"), 108) + self.assertEqual( + eccodes.codes_get_long(grib, "scaledValueOfSecondFixedSurface"), + 500) + self.assertEqual( + eccodes.codes_get_long(grib, "scaleFactorOfSecondFixedSurface"), + 0) + + def test_multiple_unknown_vertical_coords(self): + grib = None + cube = iris.cube.Cube([0]) + cube.add_aux_coord( + iris.coords.AuxCoord([1], + attributes={'GRIB_fixed_surface_type': 151})) + cube.add_aux_coord( + iris.coords.AuxCoord([450], bounds=np.array([900.0, 0.0]), + attributes={'GRIB_fixed_surface_type': 108})) + msg = r"coordinates were found of fixed surface type: \[151, 108\]" + with self.assertRaisesRegex(ValueError, msg): + set_fixed_surfaces(cube, grib) + + def test_unhandled_vertical_axis(self): + grib = None + cube = iris.cube.Cube([0]) + cube.add_aux_coord( + iris.coords.AuxCoord([450], attributes={'positive': 'up'})) + msg = r"vertical-axis coordinate\(s\) \('unknown'\) are not " \ + "recognised or handled." + with self.assertRaisesRegex(TranslationError, msg): + set_fixed_surfaces(cube, grib) + @mock.patch.object(eccodes, "codes_set") def test_no_vertical(self, mock_set): grib = None @@ -131,7 +202,8 @@ def test_no_vertical(self, mock_set): mock_set.assert_any_call(grib, "scaleFactorOfFirstFixedSurface", 0) mock_set.assert_any_call(grib, "scaledValueOfFirstFixedSurface", 0) mock_set.assert_any_call(grib, "typeOfSecondFixedSurface", 255) - mock_set.assert_any_call(grib, "scaleFactorOfSecondFixedSurface", 255) + mock_set.assert_any_call(grib, "scaleFactorOfSecondFixedSurface", + GRIB_MISSING_LONG) mock_set.assert_any_call(grib, "scaledValueOfSecondFixedSurface", GRIB_MISSING_LONG) From 003ac177532d3284fd558d1b719d17da6e647a98 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Sat, 26 Aug 2023 23:52:22 +0100 Subject: [PATCH 232/583] Updated environment lockfiles (#350) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 46 +++++++++++++------------- requirements/locks/py311-linux-64.lock | 46 +++++++++++++------------- requirements/locks/py39-linux-64.lock | 46 +++++++++++++------------- 3 files changed, 69 insertions(+), 69 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 03b5cecf..92033bf7 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -16,8 +16,8 @@ https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.1.0-he5830b7_0.cond https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.0-hd590300_0.conda#71b89db63b5b504e7afc8ad901172e1e 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.19.1-hd590300_0.conda#e8c18d865be43e2fb3f7a145b6adf1f5 -https://conda.anaconda.org/conda-forge/linux-64/geos-3.11.2-hcb278e6_0.conda#3b8e364995e3575e57960d29c1e5ab14 -https://conda.anaconda.org/conda-forge/linux-64/icu-72.1-hcb278e6_0.conda#7c8d20d847bb45f56bd941578fcfa146 +https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.0-h59595ed_0.conda#3fdf79ef322c8379ae83be491d805369 +https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libaec-1.0.6-hcb278e6_1.conda#0f683578378cddb223e7fd24f785ab2a @@ -48,7 +48,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae -https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.6.1-hc309b26_1.conda#cc09293a2c2b7fd77aff284f370c12c0 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.6.2-hc309b26_0.conda#93b55df578f8c552e9480bae939daf36 https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.17-h4d4d85c_2.conda#9ca99452635fe03eb5fa937f5ae604b0 https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.12-h4d4d85c_1.conda#eba092fc6de212a01de0065f38fe8bbb https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.17-h4d4d85c_1.conda#30f9df85ce23cd14faa9a4dfa50cca2b @@ -60,17 +60,17 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.0.9-h166bdaf_9.co https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.52.0-h61bc06f_0.conda#613955a50485812985c059e7b269f42e https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.39-h753d276_0.conda#e1c890aebdebbfbf87e2c917187b4416 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.42.0-h2797004_0.conda#fdaae20a1cf7cd62130a0973190a31b7 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.43.0-h2797004_0.conda#903fa782a9067d5934210df6d79220f6 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.11.5-h0d562d8_0.conda#558ab736404275d7df61c473c1af35aa -https://conda.anaconda.org/conda-forge/linux-64/libzip-1.9.2-hc929e4a_1.tar.bz2#5b122b50e738c4be5c3f2899f010d7cf +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.11.5-h232c23b_1.conda#f3858448893839820d4bcfb14ad3ecdf +https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_0.conda#d597567092897b1f1c7350f32e03944e https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 -https://conda.anaconda.org/conda-forge/linux-64/s2n-1.3.48-h06160fa_0.conda#f6d996f514756660c3d97eb0a49cba25 +https://conda.anaconda.org/conda-forge/linux-64/s2n-1.3.49-h06160fa_0.conda#1d78349eb26366ecc034a4afe70a8534 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-hfc55251_7.conda#32ae18eb2a687912fc9e92a501c0a11b -https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.13.32-h4a1a131_0.conda#313b9d0df6705beb45f424eb420ac21c +https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.13.32-h019f825_2.conda#cfb2918b63e33374a5f19330bcd21c6a https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.4-h0f2a231_0.conda#876286b5941933a0f558777e57d883cc https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_9.conda#d47dee1856d9cb955b8076eeff304a5b https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-hca18f0e_1.conda#e1232042de76d24539a436d37597eb06 @@ -78,15 +78,15 @@ https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd9 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-17_linux64_openblas.conda#7ef0969b00fe3d6eef56a8151d3afb29 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1002.conda#4c4dce87e96b321308f81ba2c10d2897 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-17_linux64_openblas.conda#a2103882c46492e26500fcb56c03de8b -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.5.1-h8b53f26_0.conda#8ad377fb60abab446a9f02c62b3c2190 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.5.1-h8b53f26_1.conda#5b09e13d732dda1a2bc9adc711164f4d https://conda.anaconda.org/conda-forge/linux-64/python-3.10.12-hd12c33a_0_cpython.conda#eb6f1df105f37daedd6dca78523baa75 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.42.0-h2c6b66d_0.conda#1192f6ec654a5bc4ee1d64bdc4a3e5cc +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.43.0-h2c6b66d_0.conda#713f9eac95d051abe14c3774376854fe https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-hc3e0081_0.tar.bz2#d4c341e0379c31e9e781d4f204726867 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.6-h8ee46fc_0.conda#7590b76c3d11d21caa44f3fc38ac584a https://conda.anaconda.org/conda-forge/linux-64/antlr-python-runtime-4.7.2-py310hff52083_1003.tar.bz2#8324f8fff866055d4b32eb25e091fe31 https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda#3edfead7cedd1ab4400a6c588f3e75f8 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.3.1-h2e3709c_4.conda#2cf21b1cbc1c096a28ffa2892257a2c1 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.7.11-h00aa349_4.conda#cb932dff7328ff620ce8059c9968b095 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.3.2-h2e3709c_0.conda#749f3bb860c2b5e23f807bedf10fe05b +https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.7.12-hc865f51_1.conda#dca45458adcf2a29be153d39f885aadb https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_9.conda#4601544b4982ba1861fa9b9c607b2c06 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.0.9-py310hd8f1fbe_9.conda#e2047ad2af52c01845f58b580c6cbd5c https://conda.anaconda.org/conda-forge/noarch/certifi-2023.7.22-pyhd8ed1ab_0.conda#7f3dbc9179b4dde7da98dfb151d0ad22 @@ -98,7 +98,7 @@ https://conda.anaconda.org/conda-forge/noarch/filelock-3.12.2-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.6.0-pyh1a96a4e_0.conda#50ea2067ec92dfcc38b4f07992d7e235 https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed -https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.4-py310hbf28c38_1.tar.bz2#ad5647e517ba68e2868ef2e6e6ff7723 +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py310hd41b1e2_0.conda#741385a84f6a1b6623eb39226cc669e8 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-haa2dc70_1.conda#980d8aca0bc23ca73fa8caa3e7c84c28 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.2.1-hca28451_0.conda#96aec6156d58591f5a4e67056521ce1b https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 @@ -115,22 +115,22 @@ https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.1-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.3.0-py310h2372a71_0.conda#75e60ce53c01a121039b3050c9e1f759 -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py310h5764c6d_5.tar.bz2#9e68d2ff6d98737c855b65f48dd3c597 +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py310h2372a71_0.conda#511120451bf728d52bb37c73d4069e57 https://conda.anaconda.org/conda-forge/noarch/setuptools-68.1.2-pyhd8ed1ab_0.conda#4fe12573bf499ff85a0a364e00cc5c53 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.7.1-pyha770c72_0.conda#c39d6a09fe819de4951c2642629d9115 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.0.0-py310h5764c6d_0.tar.bz2#e972c5a1f472561cf4a91962cb01f4b4 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.41.1-pyhd8ed1ab_0.conda#8f467ba2db2b5470d297953d9c1f9c7d +https://conda.anaconda.org/conda-forge/noarch/wheel-0.41.2-pyhd8ed1ab_0.conda#1ccd092478b3e0ee10d7a891adbf8a4f https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/noarch/zipp-3.16.2-pyhd8ed1ab_0.conda#2da0451b54c4563c32490cb1b7cf68a1 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.3-h28f7589_1.conda#97503d3e565004697f1651753aa95b9e -https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.9.3-hb447be9_1.conda#c520669eb0be9269a5f0d8ef62531882 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.3-he2921ad_3.conda#29f36ec5e9d3c5384e10395f7e189542 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.9.5-h3a0376c_1.conda#4cfef5eeaa843749252c94324004075e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py310h255011f_3.conda#800596144bb613cd7ac58b80900ce835 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py310hde88566_1.tar.bz2#94ce7a76b0c912279f6958e0b6b21d2b https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.1.0-py310hd41b1e2_0.conda#684399f9ddc0b9d6f3b6164f6107098e -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.42.0-py310h2372a71_0.conda#f939fe2998c888a77b310926a6c666f3 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.42.1-py310h2372a71_0.conda#1f18231ffab82f236ce074b2aaa07e54 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.1-nompi_h4f84152_100.conda#ff9ae10aa224826c07da7ef26cb0b717 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda#4e9f59a060c3be52bc4ddc46ee9b6946 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 @@ -140,11 +140,11 @@ https://conda.anaconda.org/conda-forge/linux-64/pillow-10.0.0-py310h582fbeb_0.co https://conda.anaconda.org/conda-forge/noarch/pip-23.2.1-pyhd8ed1ab_0.conda#e2783aa3f9235225eec92f9081c5b801 https://conda.anaconda.org/conda-forge/linux-64/proj-9.2.1-ha643af7_0.conda#e992387307f4403ba0ec07d009032550 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/shapely-2.0.1-py310h056c13c_1.conda#32d925cfd330e0cbb72b7618558a44e8 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.1-py310h7dcad9a_2.conda#a46061c83ed37bfa05d1ee96ec2fbb08 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.7.1-hd8ed1ab_0.conda#f96688577f1faa58096d06a45136afa2 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.4-pyhd8ed1ab_0.conda#18badd8fa3648d1beb1fcc7f2e0f756e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.3.14-hf3aad02_1.conda#a968ffa7e9fe0c257628033d393e512f +https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.3.14-h1678ad6_3.conda#5418f1a44b5bc75892d898e8fb5d180b https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py310h278f3c1_0.conda#f2d3f2542a2467f479e809ac7b901ac2 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.8.0-hd8ed1ab_0.conda#b279b07ce18058034e5b3606ba103a8b @@ -152,13 +152,13 @@ https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py310he605 https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.10.0-pyhd8ed1ab_0.conda#0809187ef9b89a3d94a5c24d13936236 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.0-py310h24ef57a_1.conda#a689e86d7bbab67f889fc384aa72b088 https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b -https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.21.0-hb942446_5.conda#07d92ed5403ad7b5c66ffd7d5b8f7e57 +https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.23.0-h40cdbb9_5.conda#c7f91f564b5066671dc38df5728b5dee https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py310h7cbd5c2_0.conda#7bfbace0788f477da1c26e10a358692d https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.8.1-pyhd8ed1ab_0.conda#cda1fad481e5a7d5489c0cc44d099b9d https://conda.anaconda.org/conda-forge/linux-64/jasper-4.0.0-h32699f2_1.conda#fdde5424ecef5f7ad310b4242229291c https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyha770c72_3.conda#5936894aade8240c867d292aa0d980c6 -https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.10.57-h85b1a90_19.conda#0605d3d60857fc07bd6a11e878fe0f08 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.1-py310ha4c1d20_0.conda#300d3b434872eb84965864f0fcc5b5da +https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.10.57-h6f6b8fa_21.conda#5932a9d1b381873f837ca84481587577 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.2-py310ha4c1d20_0.conda#d1ec73b85cb90900c40c7fbcd36059e8 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h7e745eb_109.conda#9e208615247477427acbd0900ca7038f https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.31.0-h73bf81c_0.conda#ffb754859219f4d8fbd9b7cc3337dd27 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py310h6f5dce6_101.conda#0d50bea104512f2728676a8bff8840d3 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index f36d60e8..33fd9230 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -16,8 +16,8 @@ https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.1.0-he5830b7_0.cond https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.0-hd590300_0.conda#71b89db63b5b504e7afc8ad901172e1e 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.19.1-hd590300_0.conda#e8c18d865be43e2fb3f7a145b6adf1f5 -https://conda.anaconda.org/conda-forge/linux-64/geos-3.11.2-hcb278e6_0.conda#3b8e364995e3575e57960d29c1e5ab14 -https://conda.anaconda.org/conda-forge/linux-64/icu-72.1-hcb278e6_0.conda#7c8d20d847bb45f56bd941578fcfa146 +https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.0-h59595ed_0.conda#3fdf79ef322c8379ae83be491d805369 +https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libaec-1.0.6-hcb278e6_1.conda#0f683578378cddb223e7fd24f785ab2a @@ -48,7 +48,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae -https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.6.1-hc309b26_1.conda#cc09293a2c2b7fd77aff284f370c12c0 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.6.2-hc309b26_0.conda#93b55df578f8c552e9480bae939daf36 https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.17-h4d4d85c_2.conda#9ca99452635fe03eb5fa937f5ae604b0 https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.12-h4d4d85c_1.conda#eba092fc6de212a01de0065f38fe8bbb https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.17-h4d4d85c_1.conda#30f9df85ce23cd14faa9a4dfa50cca2b @@ -60,17 +60,17 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.0.9-h166bdaf_9.co https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.52.0-h61bc06f_0.conda#613955a50485812985c059e7b269f42e https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.39-h753d276_0.conda#e1c890aebdebbfbf87e2c917187b4416 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.42.0-h2797004_0.conda#fdaae20a1cf7cd62130a0973190a31b7 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.43.0-h2797004_0.conda#903fa782a9067d5934210df6d79220f6 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.11.5-h0d562d8_0.conda#558ab736404275d7df61c473c1af35aa -https://conda.anaconda.org/conda-forge/linux-64/libzip-1.9.2-hc929e4a_1.tar.bz2#5b122b50e738c4be5c3f2899f010d7cf +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.11.5-h232c23b_1.conda#f3858448893839820d4bcfb14ad3ecdf +https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_0.conda#d597567092897b1f1c7350f32e03944e https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 -https://conda.anaconda.org/conda-forge/linux-64/s2n-1.3.48-h06160fa_0.conda#f6d996f514756660c3d97eb0a49cba25 +https://conda.anaconda.org/conda-forge/linux-64/s2n-1.3.49-h06160fa_0.conda#1d78349eb26366ecc034a4afe70a8534 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-hfc55251_7.conda#32ae18eb2a687912fc9e92a501c0a11b -https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.13.32-h4a1a131_0.conda#313b9d0df6705beb45f424eb420ac21c +https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.13.32-h019f825_2.conda#cfb2918b63e33374a5f19330bcd21c6a https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.4-h0f2a231_0.conda#876286b5941933a0f558777e57d883cc https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_9.conda#d47dee1856d9cb955b8076eeff304a5b https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-hca18f0e_1.conda#e1232042de76d24539a436d37597eb06 @@ -78,15 +78,15 @@ https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd9 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-17_linux64_openblas.conda#7ef0969b00fe3d6eef56a8151d3afb29 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1002.conda#4c4dce87e96b321308f81ba2c10d2897 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-17_linux64_openblas.conda#a2103882c46492e26500fcb56c03de8b -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.5.1-h8b53f26_0.conda#8ad377fb60abab446a9f02c62b3c2190 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.5.1-h8b53f26_1.conda#5b09e13d732dda1a2bc9adc711164f4d https://conda.anaconda.org/conda-forge/linux-64/python-3.11.4-hab00c5b_0_cpython.conda#1c628861a2a126b9fc9363ca1b7d014e -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.42.0-h2c6b66d_0.conda#1192f6ec654a5bc4ee1d64bdc4a3e5cc +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.43.0-h2c6b66d_0.conda#713f9eac95d051abe14c3774376854fe https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-hc3e0081_0.tar.bz2#d4c341e0379c31e9e781d4f204726867 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.6-h8ee46fc_0.conda#7590b76c3d11d21caa44f3fc38ac584a https://conda.anaconda.org/conda-forge/linux-64/antlr-python-runtime-4.7.2-py311h38be061_1003.tar.bz2#0ab8f8f0cae99343907fe68cda11baea https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda#3edfead7cedd1ab4400a6c588f3e75f8 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.3.1-h2e3709c_4.conda#2cf21b1cbc1c096a28ffa2892257a2c1 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.7.11-h00aa349_4.conda#cb932dff7328ff620ce8059c9968b095 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.3.2-h2e3709c_0.conda#749f3bb860c2b5e23f807bedf10fe05b +https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.7.12-hc865f51_1.conda#dca45458adcf2a29be153d39f885aadb https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_9.conda#4601544b4982ba1861fa9b9c607b2c06 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.0.9-py311ha362b79_9.conda#ced5340f5dc6cff43a80deac8d0e398f https://conda.anaconda.org/conda-forge/noarch/certifi-2023.7.22-pyhd8ed1ab_0.conda#7f3dbc9179b4dde7da98dfb151d0ad22 @@ -98,7 +98,7 @@ https://conda.anaconda.org/conda-forge/noarch/filelock-3.12.2-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.6.0-pyh1a96a4e_0.conda#50ea2067ec92dfcc38b4f07992d7e235 https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed -https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.4-py311h4dd048b_1.tar.bz2#46d451f575392c01dc193069bd89766d +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py311h9547e67_0.conda#f53903649188b99e6b44c560c69f5b23 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-haa2dc70_1.conda#980d8aca0bc23ca73fa8caa3e7c84c28 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.2.1-hca28451_0.conda#96aec6156d58591f5a4e67056521ce1b https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 @@ -115,21 +115,21 @@ https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.1-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.3.0-py311h459d7ec_0.conda#87b306459b81b7a7aaad37222d537a4f -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py311hd4cff14_5.tar.bz2#da8769492e423103c59f469f4f17f8d9 +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py311h459d7ec_0.conda#30eaaf31141e785a445bf1ede6235fe3 https://conda.anaconda.org/conda-forge/noarch/setuptools-68.1.2-pyhd8ed1ab_0.conda#4fe12573bf499ff85a0a364e00cc5c53 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.7.1-pyha770c72_0.conda#c39d6a09fe819de4951c2642629d9115 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.41.1-pyhd8ed1ab_0.conda#8f467ba2db2b5470d297953d9c1f9c7d +https://conda.anaconda.org/conda-forge/noarch/wheel-0.41.2-pyhd8ed1ab_0.conda#1ccd092478b3e0ee10d7a891adbf8a4f https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/noarch/zipp-3.16.2-pyhd8ed1ab_0.conda#2da0451b54c4563c32490cb1b7cf68a1 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.3-h28f7589_1.conda#97503d3e565004697f1651753aa95b9e -https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.9.3-hb447be9_1.conda#c520669eb0be9269a5f0d8ef62531882 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.3-he2921ad_3.conda#29f36ec5e9d3c5384e10395f7e189542 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.9.5-h3a0376c_1.conda#4cfef5eeaa843749252c94324004075e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py311h409f033_3.conda#9025d0786dbbe4bc91fd8e85502decce https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py311h4c7f6c3_1.tar.bz2#c7e54004ffd03f8db0a58ab949f2a00b https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.1.0-py311h9547e67_0.conda#daf3f23397ab2265d0cdfa339f3627ba -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.42.0-py311h459d7ec_0.conda#8c1ac2c00995248898220c4c1a9d81ab +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.42.1-py311h459d7ec_0.conda#fc327c0ea015db3b6484eabb37d44e60 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.1-nompi_h4f84152_100.conda#ff9ae10aa224826c07da7ef26cb0b717 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda#4e9f59a060c3be52bc4ddc46ee9b6946 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 @@ -139,11 +139,11 @@ https://conda.anaconda.org/conda-forge/linux-64/pillow-10.0.0-py311h0b84326_0.co https://conda.anaconda.org/conda-forge/noarch/pip-23.2.1-pyhd8ed1ab_0.conda#e2783aa3f9235225eec92f9081c5b801 https://conda.anaconda.org/conda-forge/linux-64/proj-9.2.1-ha643af7_0.conda#e992387307f4403ba0ec07d009032550 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/shapely-2.0.1-py311h54d622a_1.conda#a894c65b48676c4973e9ee8b59bceb9e +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.1-py311he06c224_2.conda#10a1953d2f74d292b5de093ceea104b2 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.7.1-hd8ed1ab_0.conda#f96688577f1faa58096d06a45136afa2 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.4-pyhd8ed1ab_0.conda#18badd8fa3648d1beb1fcc7f2e0f756e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.3.14-hf3aad02_1.conda#a968ffa7e9fe0c257628033d393e512f +https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.3.14-h1678ad6_3.conda#5418f1a44b5bc75892d898e8fb5d180b https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h1f0f07a_0.conda#43a71a823583d75308eaf3a06c8f150b https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.8.0-hd8ed1ab_0.conda#b279b07ce18058034e5b3606ba103a8b @@ -151,13 +151,13 @@ https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py311h8597 https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.10.0-pyhd8ed1ab_0.conda#0809187ef9b89a3d94a5c24d13936236 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.0-py311ha169711_1.conda#92633556d37e88ce45193374d408072c https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b -https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.21.0-hb942446_5.conda#07d92ed5403ad7b5c66ffd7d5b8f7e57 +https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.23.0-h40cdbb9_5.conda#c7f91f564b5066671dc38df5728b5dee https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py311h320fe9a_0.conda#1271b2375735e2aaa6d6770dbe2ad087 https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.8.1-pyhd8ed1ab_0.conda#cda1fad481e5a7d5489c0cc44d099b9d https://conda.anaconda.org/conda-forge/linux-64/jasper-4.0.0-h32699f2_1.conda#fdde5424ecef5f7ad310b4242229291c https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyha770c72_3.conda#5936894aade8240c867d292aa0d980c6 -https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.10.57-h85b1a90_19.conda#0605d3d60857fc07bd6a11e878fe0f08 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.1-py311h64a7726_0.conda#356da36102fc1eeb8a81e6d79e53bc7e +https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.10.57-h6f6b8fa_21.conda#5932a9d1b381873f837ca84481587577 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.2-py311h64a7726_0.conda#18d094fb8e4ac52f93a4f4857a8f1e8f https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h7e745eb_109.conda#9e208615247477427acbd0900ca7038f https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.31.0-h73bf81c_0.conda#ffb754859219f4d8fbd9b7cc3337dd27 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py311h9a7c333_101.conda#1dc70c7c3352c0ff1f861d866860db37 diff --git a/requirements/locks/py39-linux-64.lock b/requirements/locks/py39-linux-64.lock index 8e94cf57..9e0f7d53 100644 --- a/requirements/locks/py39-linux-64.lock +++ b/requirements/locks/py39-linux-64.lock @@ -16,8 +16,8 @@ https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.1.0-he5830b7_0.cond https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.0-hd590300_0.conda#71b89db63b5b504e7afc8ad901172e1e 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.19.1-hd590300_0.conda#e8c18d865be43e2fb3f7a145b6adf1f5 -https://conda.anaconda.org/conda-forge/linux-64/geos-3.11.2-hcb278e6_0.conda#3b8e364995e3575e57960d29c1e5ab14 -https://conda.anaconda.org/conda-forge/linux-64/icu-72.1-hcb278e6_0.conda#7c8d20d847bb45f56bd941578fcfa146 +https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.0-h59595ed_0.conda#3fdf79ef322c8379ae83be491d805369 +https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libaec-1.0.6-hcb278e6_1.conda#0f683578378cddb223e7fd24f785ab2a @@ -48,7 +48,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae -https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.6.1-hc309b26_1.conda#cc09293a2c2b7fd77aff284f370c12c0 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.6.2-hc309b26_0.conda#93b55df578f8c552e9480bae939daf36 https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.17-h4d4d85c_2.conda#9ca99452635fe03eb5fa937f5ae604b0 https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.12-h4d4d85c_1.conda#eba092fc6de212a01de0065f38fe8bbb https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.17-h4d4d85c_1.conda#30f9df85ce23cd14faa9a4dfa50cca2b @@ -60,17 +60,17 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.0.9-h166bdaf_9.co https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.52.0-h61bc06f_0.conda#613955a50485812985c059e7b269f42e https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.39-h753d276_0.conda#e1c890aebdebbfbf87e2c917187b4416 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.42.0-h2797004_0.conda#fdaae20a1cf7cd62130a0973190a31b7 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.43.0-h2797004_0.conda#903fa782a9067d5934210df6d79220f6 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.11.5-h0d562d8_0.conda#558ab736404275d7df61c473c1af35aa -https://conda.anaconda.org/conda-forge/linux-64/libzip-1.9.2-hc929e4a_1.tar.bz2#5b122b50e738c4be5c3f2899f010d7cf +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.11.5-h232c23b_1.conda#f3858448893839820d4bcfb14ad3ecdf +https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_0.conda#d597567092897b1f1c7350f32e03944e https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 -https://conda.anaconda.org/conda-forge/linux-64/s2n-1.3.48-h06160fa_0.conda#f6d996f514756660c3d97eb0a49cba25 +https://conda.anaconda.org/conda-forge/linux-64/s2n-1.3.49-h06160fa_0.conda#1d78349eb26366ecc034a4afe70a8534 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-hfc55251_7.conda#32ae18eb2a687912fc9e92a501c0a11b -https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.13.32-h4a1a131_0.conda#313b9d0df6705beb45f424eb420ac21c +https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.13.32-h019f825_2.conda#cfb2918b63e33374a5f19330bcd21c6a https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.4-h0f2a231_0.conda#876286b5941933a0f558777e57d883cc https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_9.conda#d47dee1856d9cb955b8076eeff304a5b https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-hca18f0e_1.conda#e1232042de76d24539a436d37597eb06 @@ -78,15 +78,15 @@ https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd9 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-17_linux64_openblas.conda#7ef0969b00fe3d6eef56a8151d3afb29 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1002.conda#4c4dce87e96b321308f81ba2c10d2897 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-17_linux64_openblas.conda#a2103882c46492e26500fcb56c03de8b -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.5.1-h8b53f26_0.conda#8ad377fb60abab446a9f02c62b3c2190 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.5.1-h8b53f26_1.conda#5b09e13d732dda1a2bc9adc711164f4d https://conda.anaconda.org/conda-forge/linux-64/python-3.9.17-h0755675_0_cpython.conda#384886ac3580bba3541ce65c992eb192 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.42.0-h2c6b66d_0.conda#1192f6ec654a5bc4ee1d64bdc4a3e5cc +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.43.0-h2c6b66d_0.conda#713f9eac95d051abe14c3774376854fe https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-hc3e0081_0.tar.bz2#d4c341e0379c31e9e781d4f204726867 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.6-h8ee46fc_0.conda#7590b76c3d11d21caa44f3fc38ac584a https://conda.anaconda.org/conda-forge/linux-64/antlr-python-runtime-4.7.2-py39hf3d152e_1003.tar.bz2#5e8330e806e50bd6137ebd125f4bc1bb https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda#3edfead7cedd1ab4400a6c588f3e75f8 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.3.1-h2e3709c_4.conda#2cf21b1cbc1c096a28ffa2892257a2c1 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.7.11-h00aa349_4.conda#cb932dff7328ff620ce8059c9968b095 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.3.2-h2e3709c_0.conda#749f3bb860c2b5e23f807bedf10fe05b +https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.7.12-hc865f51_1.conda#dca45458adcf2a29be153d39f885aadb https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_9.conda#4601544b4982ba1861fa9b9c607b2c06 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.0.9-py39h5a03fae_9.conda#d1601752c6f47af7bedf838be3d8ca6b https://conda.anaconda.org/conda-forge/noarch/certifi-2023.7.22-pyhd8ed1ab_0.conda#7f3dbc9179b4dde7da98dfb151d0ad22 @@ -98,7 +98,7 @@ https://conda.anaconda.org/conda-forge/noarch/filelock-3.12.2-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.6.0-pyh1a96a4e_0.conda#50ea2067ec92dfcc38b4f07992d7e235 https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed -https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.4-py39hf939315_1.tar.bz2#41679a052a8ce841c74df1ebc802e411 +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py39h7633fee_0.conda#3822b0ae733e022c10469c0e46bdddc4 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-haa2dc70_1.conda#980d8aca0bc23ca73fa8caa3e7c84c28 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.2.1-hca28451_0.conda#96aec6156d58591f5a4e67056521ce1b https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 @@ -115,22 +115,22 @@ https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.1-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.3.0-py39hd1e30aa_0.conda#41841cc1d7387bb7a30cdde4d88afbf4 -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py39hb9d737c_5.tar.bz2#ef9db3c38ae7275f6b14491cfe61a248 +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py39hd1e30aa_0.conda#ccecb3196b3678e9b5fc8441d681c203 https://conda.anaconda.org/conda-forge/noarch/setuptools-68.1.2-pyhd8ed1ab_0.conda#4fe12573bf499ff85a0a364e00cc5c53 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.7.1-pyha770c72_0.conda#c39d6a09fe819de4951c2642629d9115 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.0.0-py39hb9d737c_0.tar.bz2#230d65004135bf312504a1bbcb0c7a08 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.41.1-pyhd8ed1ab_0.conda#8f467ba2db2b5470d297953d9c1f9c7d +https://conda.anaconda.org/conda-forge/noarch/wheel-0.41.2-pyhd8ed1ab_0.conda#1ccd092478b3e0ee10d7a891adbf8a4f https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/noarch/zipp-3.16.2-pyhd8ed1ab_0.conda#2da0451b54c4563c32490cb1b7cf68a1 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.3-h28f7589_1.conda#97503d3e565004697f1651753aa95b9e -https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.9.3-hb447be9_1.conda#c520669eb0be9269a5f0d8ef62531882 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.3-he2921ad_3.conda#29f36ec5e9d3c5384e10395f7e189542 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.9.5-h3a0376c_1.conda#4cfef5eeaa843749252c94324004075e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py39he91dace_3.conda#20080319ef73fbad74dcd6d62f2a3ffe https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py39h2ae25f5_1.tar.bz2#c943fb9a2818ecc5be1e0ecc8b7738f1 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.1.0-py39h7633fee_0.conda#54e6f32e448fdc273606011f0940d076 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.42.0-py39hd1e30aa_0.conda#03e44d84ea9dd2432a633407401e5688 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.42.1-py39hd1e30aa_0.conda#de06dc7edaddbd3b60c050f3a95d6fe6 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.1-nompi_h4f84152_100.conda#ff9ae10aa224826c07da7ef26cb0b717 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda#4e9f59a060c3be52bc4ddc46ee9b6946 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.0.1-pyhd8ed1ab_0.conda#d978c61aa5fc2c69380d53ad56b5ae86 @@ -141,11 +141,11 @@ https://conda.anaconda.org/conda-forge/linux-64/pillow-10.0.0-py39haaeba84_0.con https://conda.anaconda.org/conda-forge/noarch/pip-23.2.1-pyhd8ed1ab_0.conda#e2783aa3f9235225eec92f9081c5b801 https://conda.anaconda.org/conda-forge/linux-64/proj-9.2.1-ha643af7_0.conda#e992387307f4403ba0ec07d009032550 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/shapely-2.0.1-py39hf1c3bca_1.conda#ae6bfe65e81d9b59a71cc01a2858650f +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.1-py39h1bc45ef_2.conda#d79ed0ee1738151284ebd97092a6a210 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.7.1-hd8ed1ab_0.conda#f96688577f1faa58096d06a45136afa2 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.4-pyhd8ed1ab_0.conda#18badd8fa3648d1beb1fcc7f2e0f756e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.3.14-hf3aad02_1.conda#a968ffa7e9fe0c257628033d393e512f +https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.3.14-h1678ad6_3.conda#5418f1a44b5bc75892d898e8fb5d180b https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py39h0f8d45d_0.conda#180d4312005bc93f257e2997a8ee41cb https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.0.1-pyhd8ed1ab_0.conda#54661981fd331e20847d8a49543dd9af @@ -153,14 +153,14 @@ https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.8.0-hd8ed1ab_ https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.10.0-pyhd8ed1ab_0.conda#0809187ef9b89a3d94a5c24d13936236 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.0-py39h5ed0f51_1.conda#9c455b3b3b55f13b2094932740cd3efb https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b -https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.21.0-hb942446_5.conda#07d92ed5403ad7b5c66ffd7d5b8f7e57 +https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.23.0-h40cdbb9_5.conda#c7f91f564b5066671dc38df5728b5dee https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.8.1-pyhd8ed1ab_0.conda#cda1fad481e5a7d5489c0cc44d099b9d https://conda.anaconda.org/conda-forge/linux-64/jasper-4.0.0-h32699f2_1.conda#fdde5424ecef5f7ad310b4242229291c https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py39he190548_0.conda#f2a931db797bb58bd335f4a857b4c898 https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyha770c72_3.conda#5936894aade8240c867d292aa0d980c6 -https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.10.57-h85b1a90_19.conda#0605d3d60857fc07bd6a11e878fe0f08 +https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.10.57-h6f6b8fa_21.conda#5932a9d1b381873f837ca84481587577 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py39h40cae4c_0.conda#24b4bf92e26a46217e37e5928927116b -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.1-py39h6183b62_0.conda#81212684c03e970520656f1a62ab9d39 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.2-py39h6183b62_0.conda#c7074f28bd86170a8235ddc995b4ee57 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h7e745eb_109.conda#9e208615247477427acbd0900ca7038f https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.31.0-h73bf81c_0.conda#ffb754859219f4d8fbd9b7cc3337dd27 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py39h4218a78_101.conda#8f5c25bb7accd1954d8b7fc689c5975c From 032b4586b2a86b0140c30c2a32adf11ec5d6f928 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 4 Sep 2023 10:28:41 +0100 Subject: [PATCH 233/583] Updated environment lockfiles (#351) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 45 +++++++++--------------- requirements/locks/py311-linux-64.lock | 47 ++++++++++---------------- requirements/locks/py39-linux-64.lock | 47 ++++++++++---------------- 3 files changed, 50 insertions(+), 89 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 92033bf7..514d3a64 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -13,7 +13,6 @@ https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.1.0-h69a702a_0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.1.0-he5830b7_0.conda#56ca14d57ac29a75d23a39eb3ee0ddeb https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.1.0-he5830b7_0.conda#cd93f779ff018dd85c7544c015c9db3c -https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.0-hd590300_0.conda#71b89db63b5b504e7afc8ad901172e1e 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.19.1-hd590300_0.conda#e8c18d865be43e2fb3f7a145b6adf1f5 https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.0-h59595ed_0.conda#3fdf79ef322c8379ae83be491d805369 @@ -21,7 +20,7 @@ https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libaec-1.0.6-hcb278e6_1.conda#0f683578378cddb223e7fd24f785ab2a -https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.0.9-h166bdaf_9.conda#61641e239f96eae2b8492dc7e755828c +https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_0.conda#e805cbec4c29feb22e019245f7e47b6c https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.18-h0b41bf4_0.conda#6aa9c9de5542ecb07fdda9ca626252d8 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h516909a_1.tar.bz2#6f8720dff19e17ce5d48cfe7f3d2f0a3 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.5.0-hcb278e6_1.conda#6305a3dd2752c76335295da4e581f2fd @@ -48,15 +47,11 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae -https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.6.2-hc309b26_0.conda#93b55df578f8c552e9480bae939daf36 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.17-h4d4d85c_2.conda#9ca99452635fe03eb5fa937f5ae604b0 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.12-h4d4d85c_1.conda#eba092fc6de212a01de0065f38fe8bbb -https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.17-h4d4d85c_1.conda#30f9df85ce23cd14faa9a4dfa50cca2b https://conda.anaconda.org/conda-forge/linux-64/expat-2.5.0-hcb278e6_1.conda#8b9b5aca60558d02ddaa09d599e55920 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h501b40f_6.conda#c3e9338e15d90106f467377017352b97 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-17_linux64_openblas.conda#57fb44770b1bc832fb2dbefa1bd502de -https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.0.9-h166bdaf_9.conda#081aa22f4581c08e4372b0b6c2f8478e -https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.0.9-h166bdaf_9.conda#1f0a03af852a9659ed2bf08f2f1704fd +https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_0.conda#43017394a280a42b48d11d2a6e169901 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_0.conda#8e3e1cb77c4b355a3776bdfb74095bed https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.52.0-h61bc06f_0.conda#613955a50485812985c059e7b269f42e https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.39-h753d276_0.conda#e1c890aebdebbfbf87e2c917187b4416 @@ -66,13 +61,12 @@ https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#332 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.11.5-h232c23b_1.conda#f3858448893839820d4bcfb14ad3ecdf https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_0.conda#d597567092897b1f1c7350f32e03944e https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 -https://conda.anaconda.org/conda-forge/linux-64/s2n-1.3.49-h06160fa_0.conda#1d78349eb26366ecc034a4afe70a8534 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 -https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-hfc55251_7.conda#32ae18eb2a687912fc9e92a501c0a11b -https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.13.32-h019f825_2.conda#cfb2918b63e33374a5f19330bcd21c6a +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda#68c34ec6149623be41a1933ab996a209 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.5-hfc55251_0.conda#04b88013080254850d6c01ed54810589 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.4-h0f2a231_0.conda#876286b5941933a0f558777e57d883cc -https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_9.conda#d47dee1856d9cb955b8076eeff304a5b +https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_0.conda#aeafb07a327e3f14a796bf081ea07472 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-hca18f0e_1.conda#e1232042de76d24539a436d37597eb06 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-17_linux64_openblas.conda#7ef0969b00fe3d6eef56a8151d3afb29 @@ -85,16 +79,14 @@ https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-hc3e0081_0.tar.b https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.6-h8ee46fc_0.conda#7590b76c3d11d21caa44f3fc38ac584a https://conda.anaconda.org/conda-forge/linux-64/antlr-python-runtime-4.7.2-py310hff52083_1003.tar.bz2#8324f8fff866055d4b32eb25e091fe31 https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda#3edfead7cedd1ab4400a6c588f3e75f8 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.3.2-h2e3709c_0.conda#749f3bb860c2b5e23f807bedf10fe05b -https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.7.12-hc865f51_1.conda#dca45458adcf2a29be153d39f885aadb -https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_9.conda#4601544b4982ba1861fa9b9c607b2c06 -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.0.9-py310hd8f1fbe_9.conda#e2047ad2af52c01845f58b580c6cbd5c +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_0.conda#3db48055eab680e43a122e2c7494e7ae +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hc6cd4ac_0.conda#fb6201eb1daa3a3a2f91a4833bdf27c7 https://conda.anaconda.org/conda-forge/noarch/certifi-2023.7.22-pyhd8ed1ab_0.conda#7f3dbc9179b4dde7da98dfb151d0ad22 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.2.0-pyhd8ed1ab_0.conda#313516e9a4b08b12dfb1e1cd390a96e3 https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.1-pyhd8ed1ab_0.conda#b325bfc4cff7d7f8a868f1f7ecc4ed16 https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb -https://conda.anaconda.org/conda-forge/noarch/filelock-3.12.2-pyhd8ed1ab_0.conda#53522ec72e6adae42bd373ef58357230 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.12.3-pyhd8ed1ab_0.conda#3104cf0ab9fb9de393051bf92b10dbe9 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.6.0-pyh1a96a4e_0.conda#50ea2067ec92dfcc38b4f07992d7e235 https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed @@ -125,13 +117,11 @@ https://conda.anaconda.org/conda-forge/noarch/wheel-0.41.2-pyhd8ed1ab_0.conda#1c https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/noarch/zipp-3.16.2-pyhd8ed1ab_0.conda#2da0451b54c4563c32490cb1b7cf68a1 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.3-he2921ad_3.conda#29f36ec5e9d3c5384e10395f7e189542 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.9.5-h3a0376c_1.conda#4cfef5eeaa843749252c94324004075e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py310h255011f_3.conda#800596144bb613cd7ac58b80900ce835 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py310hde88566_1.tar.bz2#94ce7a76b0c912279f6958e0b6b21d2b https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.1.0-py310hd41b1e2_0.conda#684399f9ddc0b9d6f3b6164f6107098e https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.42.1-py310h2372a71_0.conda#1f18231ffab82f236ce074b2aaa07e54 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.1-nompi_h4f84152_100.conda#ff9ae10aa224826c07da7ef26cb0b717 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.2-nompi_h4f84152_100.conda#2de6a9bc8083b49f09b2f6eb28d3ba3c https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda#4e9f59a060c3be52bc4ddc46ee9b6946 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py310hde88566_1008.tar.bz2#f9dd8a7a2fcc23eb2cd95cd817c949e7 @@ -144,23 +134,20 @@ https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.1-py310h7dcad9a_2.co https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.7.1-hd8ed1ab_0.conda#f96688577f1faa58096d06a45136afa2 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.4-pyhd8ed1ab_0.conda#18badd8fa3648d1beb1fcc7f2e0f756e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.3.14-h1678ad6_3.conda#5418f1a44b5bc75892d898e8fb5d180b https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py310h278f3c1_0.conda#f2d3f2542a2467f479e809ac7b901ac2 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.8.0-hd8ed1ab_0.conda#b279b07ce18058034e5b3606ba103a8b +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h80fb2b6_112.conda#a19fa6cacf80c8a366572853d5890eb4 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py310he60537e_0.conda#68b2dd34c69d08b05a9db5e3596fe3ee https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.10.0-pyhd8ed1ab_0.conda#0809187ef9b89a3d94a5c24d13936236 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.0-py310h24ef57a_1.conda#a689e86d7bbab67f889fc384aa72b088 https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b -https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.23.0-h40cdbb9_5.conda#c7f91f564b5066671dc38df5728b5dee https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py310h7cbd5c2_0.conda#7bfbace0788f477da1c26e10a358692d -https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.8.1-pyhd8ed1ab_0.conda#cda1fad481e5a7d5489c0cc44d099b9d +https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.9.0-pyhd8ed1ab_0.conda#7bcadb3fcbb9fadeb53abef5b53b1f98 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.0.0-h32699f2_1.conda#fdde5424ecef5f7ad310b4242229291c +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py310hba70d50_102.conda#6025039727a049ab4c0f2aab842c01cb https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyha770c72_3.conda#5936894aade8240c867d292aa0d980c6 -https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.10.57-h6f6b8fa_21.conda#5932a9d1b381873f837ca84481587577 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.31.0-h35c6de3_1.conda#22b243bd3c8aae15cb399178c4161faa https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.2-py310ha4c1d20_0.conda#d1ec73b85cb90900c40c7fbcd36059e8 -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h7e745eb_109.conda#9e208615247477427acbd0900ca7038f -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.31.0-h73bf81c_0.conda#ffb754859219f4d8fbd9b7cc3337dd27 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py310h6f5dce6_101.conda#0d50bea104512f2728676a8bff8840d3 -https://conda.anaconda.org/conda-forge/noarch/iris-3.6.1-pyha770c72_0.conda#36d615b339058273520990fc78239116 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.6.0-py310h278f3c1_0.conda#82225061491482514b0e057e69c6dda4 +https://conda.anaconda.org/conda-forge/noarch/iris-3.7.0-pyha770c72_0.conda#dccc1f660bf455c239adaabf56b91dc9 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.6.0-py310h1f7b6fc_1.conda#694c566683fdbbe46ad6d8e39bc18b71 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 33fd9230..8190c85f 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -13,7 +13,6 @@ https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.1.0-h69a702a_0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.1.0-he5830b7_0.conda#56ca14d57ac29a75d23a39eb3ee0ddeb https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.1.0-he5830b7_0.conda#cd93f779ff018dd85c7544c015c9db3c -https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.0-hd590300_0.conda#71b89db63b5b504e7afc8ad901172e1e 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.19.1-hd590300_0.conda#e8c18d865be43e2fb3f7a145b6adf1f5 https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.0-h59595ed_0.conda#3fdf79ef322c8379ae83be491d805369 @@ -21,7 +20,7 @@ https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libaec-1.0.6-hcb278e6_1.conda#0f683578378cddb223e7fd24f785ab2a -https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.0.9-h166bdaf_9.conda#61641e239f96eae2b8492dc7e755828c +https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_0.conda#e805cbec4c29feb22e019245f7e47b6c https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.18-h0b41bf4_0.conda#6aa9c9de5542ecb07fdda9ca626252d8 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h516909a_1.tar.bz2#6f8720dff19e17ce5d48cfe7f3d2f0a3 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.5.0-hcb278e6_1.conda#6305a3dd2752c76335295da4e581f2fd @@ -48,15 +47,11 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae -https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.6.2-hc309b26_0.conda#93b55df578f8c552e9480bae939daf36 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.17-h4d4d85c_2.conda#9ca99452635fe03eb5fa937f5ae604b0 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.12-h4d4d85c_1.conda#eba092fc6de212a01de0065f38fe8bbb -https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.17-h4d4d85c_1.conda#30f9df85ce23cd14faa9a4dfa50cca2b https://conda.anaconda.org/conda-forge/linux-64/expat-2.5.0-hcb278e6_1.conda#8b9b5aca60558d02ddaa09d599e55920 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h501b40f_6.conda#c3e9338e15d90106f467377017352b97 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-17_linux64_openblas.conda#57fb44770b1bc832fb2dbefa1bd502de -https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.0.9-h166bdaf_9.conda#081aa22f4581c08e4372b0b6c2f8478e -https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.0.9-h166bdaf_9.conda#1f0a03af852a9659ed2bf08f2f1704fd +https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_0.conda#43017394a280a42b48d11d2a6e169901 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_0.conda#8e3e1cb77c4b355a3776bdfb74095bed https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.52.0-h61bc06f_0.conda#613955a50485812985c059e7b269f42e https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.39-h753d276_0.conda#e1c890aebdebbfbf87e2c917187b4416 @@ -66,35 +61,32 @@ https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#332 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.11.5-h232c23b_1.conda#f3858448893839820d4bcfb14ad3ecdf https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_0.conda#d597567092897b1f1c7350f32e03944e https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 -https://conda.anaconda.org/conda-forge/linux-64/s2n-1.3.49-h06160fa_0.conda#1d78349eb26366ecc034a4afe70a8534 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 -https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-hfc55251_7.conda#32ae18eb2a687912fc9e92a501c0a11b -https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.13.32-h019f825_2.conda#cfb2918b63e33374a5f19330bcd21c6a +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda#68c34ec6149623be41a1933ab996a209 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.5-hfc55251_0.conda#04b88013080254850d6c01ed54810589 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.4-h0f2a231_0.conda#876286b5941933a0f558777e57d883cc -https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_9.conda#d47dee1856d9cb955b8076eeff304a5b +https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_0.conda#aeafb07a327e3f14a796bf081ea07472 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-hca18f0e_1.conda#e1232042de76d24539a436d37597eb06 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-17_linux64_openblas.conda#7ef0969b00fe3d6eef56a8151d3afb29 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1002.conda#4c4dce87e96b321308f81ba2c10d2897 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-17_linux64_openblas.conda#a2103882c46492e26500fcb56c03de8b https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.5.1-h8b53f26_1.conda#5b09e13d732dda1a2bc9adc711164f4d -https://conda.anaconda.org/conda-forge/linux-64/python-3.11.4-hab00c5b_0_cpython.conda#1c628861a2a126b9fc9363ca1b7d014e +https://conda.anaconda.org/conda-forge/linux-64/python-3.11.5-hab00c5b_0_cpython.conda#f0288cb82594b1cbc71111d1cd3c5422 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.43.0-h2c6b66d_0.conda#713f9eac95d051abe14c3774376854fe https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-hc3e0081_0.tar.bz2#d4c341e0379c31e9e781d4f204726867 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.6-h8ee46fc_0.conda#7590b76c3d11d21caa44f3fc38ac584a https://conda.anaconda.org/conda-forge/linux-64/antlr-python-runtime-4.7.2-py311h38be061_1003.tar.bz2#0ab8f8f0cae99343907fe68cda11baea https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda#3edfead7cedd1ab4400a6c588f3e75f8 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.3.2-h2e3709c_0.conda#749f3bb860c2b5e23f807bedf10fe05b -https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.7.12-hc865f51_1.conda#dca45458adcf2a29be153d39f885aadb -https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_9.conda#4601544b4982ba1861fa9b9c607b2c06 -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.0.9-py311ha362b79_9.conda#ced5340f5dc6cff43a80deac8d0e398f +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_0.conda#3db48055eab680e43a122e2c7494e7ae +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hb755f60_0.conda#b8128d083dbf6abd472b1a3e98b0b83d https://conda.anaconda.org/conda-forge/noarch/certifi-2023.7.22-pyhd8ed1ab_0.conda#7f3dbc9179b4dde7da98dfb151d0ad22 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.2.0-pyhd8ed1ab_0.conda#313516e9a4b08b12dfb1e1cd390a96e3 https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.1-pyhd8ed1ab_0.conda#b325bfc4cff7d7f8a868f1f7ecc4ed16 https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb -https://conda.anaconda.org/conda-forge/noarch/filelock-3.12.2-pyhd8ed1ab_0.conda#53522ec72e6adae42bd373ef58357230 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.12.3-pyhd8ed1ab_0.conda#3104cf0ab9fb9de393051bf92b10dbe9 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.6.0-pyh1a96a4e_0.conda#50ea2067ec92dfcc38b4f07992d7e235 https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed @@ -124,13 +116,11 @@ https://conda.anaconda.org/conda-forge/noarch/wheel-0.41.2-pyhd8ed1ab_0.conda#1c https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/noarch/zipp-3.16.2-pyhd8ed1ab_0.conda#2da0451b54c4563c32490cb1b7cf68a1 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.3-he2921ad_3.conda#29f36ec5e9d3c5384e10395f7e189542 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.9.5-h3a0376c_1.conda#4cfef5eeaa843749252c94324004075e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py311h409f033_3.conda#9025d0786dbbe4bc91fd8e85502decce https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py311h4c7f6c3_1.tar.bz2#c7e54004ffd03f8db0a58ab949f2a00b https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.1.0-py311h9547e67_0.conda#daf3f23397ab2265d0cdfa339f3627ba https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.42.1-py311h459d7ec_0.conda#fc327c0ea015db3b6484eabb37d44e60 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.1-nompi_h4f84152_100.conda#ff9ae10aa224826c07da7ef26cb0b717 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.2-nompi_h4f84152_100.conda#2de6a9bc8083b49f09b2f6eb28d3ba3c https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda#4e9f59a060c3be52bc4ddc46ee9b6946 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py311h4c7f6c3_1008.tar.bz2#5998dff78c3b82a07ad77f2ae1ec1c44 @@ -143,23 +133,20 @@ https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.1-py311he06c224_2.co https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.7.1-hd8ed1ab_0.conda#f96688577f1faa58096d06a45136afa2 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.4-pyhd8ed1ab_0.conda#18badd8fa3648d1beb1fcc7f2e0f756e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.3.14-h1678ad6_3.conda#5418f1a44b5bc75892d898e8fb5d180b https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h1f0f07a_0.conda#43a71a823583d75308eaf3a06c8f150b https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.8.0-hd8ed1ab_0.conda#b279b07ce18058034e5b3606ba103a8b +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h80fb2b6_112.conda#a19fa6cacf80c8a366572853d5890eb4 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py311h8597a09_0.conda#70c3b734ffe82c16b6d121aaa11929a8 https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.10.0-pyhd8ed1ab_0.conda#0809187ef9b89a3d94a5c24d13936236 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.0-py311ha169711_1.conda#92633556d37e88ce45193374d408072c https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b -https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.23.0-h40cdbb9_5.conda#c7f91f564b5066671dc38df5728b5dee https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py311h320fe9a_0.conda#1271b2375735e2aaa6d6770dbe2ad087 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.8.1-pyhd8ed1ab_0.conda#cda1fad481e5a7d5489c0cc44d099b9d +https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.9.0-pyhd8ed1ab_0.conda#7bcadb3fcbb9fadeb53abef5b53b1f98 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.0.0-h32699f2_1.conda#fdde5424ecef5f7ad310b4242229291c +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py311he8ad708_102.conda#b48083ba918347f30efa94f7dc694919 https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyha770c72_3.conda#5936894aade8240c867d292aa0d980c6 -https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.10.57-h6f6b8fa_21.conda#5932a9d1b381873f837ca84481587577 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.31.0-h35c6de3_1.conda#22b243bd3c8aae15cb399178c4161faa https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.2-py311h64a7726_0.conda#18d094fb8e4ac52f93a4f4857a8f1e8f -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h7e745eb_109.conda#9e208615247477427acbd0900ca7038f -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.31.0-h73bf81c_0.conda#ffb754859219f4d8fbd9b7cc3337dd27 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py311h9a7c333_101.conda#1dc70c7c3352c0ff1f861d866860db37 -https://conda.anaconda.org/conda-forge/noarch/iris-3.6.1-pyha770c72_0.conda#36d615b339058273520990fc78239116 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.6.0-py311h1f0f07a_0.conda#c1a8ed764bff88bba46dbc6566016187 +https://conda.anaconda.org/conda-forge/noarch/iris-3.7.0-pyha770c72_0.conda#dccc1f660bf455c239adaabf56b91dc9 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.6.0-py311h1f0f07a_1.conda#0a7a6ea21a46cc2857d748ffdbd76dc7 diff --git a/requirements/locks/py39-linux-64.lock b/requirements/locks/py39-linux-64.lock index 9e0f7d53..d495f73b 100644 --- a/requirements/locks/py39-linux-64.lock +++ b/requirements/locks/py39-linux-64.lock @@ -13,7 +13,6 @@ https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.1.0-h69a702a_0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.1.0-he5830b7_0.conda#56ca14d57ac29a75d23a39eb3ee0ddeb https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.1.0-he5830b7_0.conda#cd93f779ff018dd85c7544c015c9db3c -https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.0-hd590300_0.conda#71b89db63b5b504e7afc8ad901172e1e 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.19.1-hd590300_0.conda#e8c18d865be43e2fb3f7a145b6adf1f5 https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.0-h59595ed_0.conda#3fdf79ef322c8379ae83be491d805369 @@ -21,7 +20,7 @@ https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libaec-1.0.6-hcb278e6_1.conda#0f683578378cddb223e7fd24f785ab2a -https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.0.9-h166bdaf_9.conda#61641e239f96eae2b8492dc7e755828c +https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_0.conda#e805cbec4c29feb22e019245f7e47b6c https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.18-h0b41bf4_0.conda#6aa9c9de5542ecb07fdda9ca626252d8 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h516909a_1.tar.bz2#6f8720dff19e17ce5d48cfe7f3d2f0a3 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.5.0-hcb278e6_1.conda#6305a3dd2752c76335295da4e581f2fd @@ -48,15 +47,11 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae -https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.6.2-hc309b26_0.conda#93b55df578f8c552e9480bae939daf36 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.17-h4d4d85c_2.conda#9ca99452635fe03eb5fa937f5ae604b0 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.12-h4d4d85c_1.conda#eba092fc6de212a01de0065f38fe8bbb -https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.17-h4d4d85c_1.conda#30f9df85ce23cd14faa9a4dfa50cca2b https://conda.anaconda.org/conda-forge/linux-64/expat-2.5.0-hcb278e6_1.conda#8b9b5aca60558d02ddaa09d599e55920 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h501b40f_6.conda#c3e9338e15d90106f467377017352b97 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-17_linux64_openblas.conda#57fb44770b1bc832fb2dbefa1bd502de -https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.0.9-h166bdaf_9.conda#081aa22f4581c08e4372b0b6c2f8478e -https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.0.9-h166bdaf_9.conda#1f0a03af852a9659ed2bf08f2f1704fd +https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_0.conda#43017394a280a42b48d11d2a6e169901 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_0.conda#8e3e1cb77c4b355a3776bdfb74095bed https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.52.0-h61bc06f_0.conda#613955a50485812985c059e7b269f42e https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.39-h753d276_0.conda#e1c890aebdebbfbf87e2c917187b4416 @@ -66,35 +61,32 @@ https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#332 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.11.5-h232c23b_1.conda#f3858448893839820d4bcfb14ad3ecdf https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_0.conda#d597567092897b1f1c7350f32e03944e https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 -https://conda.anaconda.org/conda-forge/linux-64/s2n-1.3.49-h06160fa_0.conda#1d78349eb26366ecc034a4afe70a8534 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 -https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-hfc55251_7.conda#32ae18eb2a687912fc9e92a501c0a11b -https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.13.32-h019f825_2.conda#cfb2918b63e33374a5f19330bcd21c6a +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda#68c34ec6149623be41a1933ab996a209 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.5-hfc55251_0.conda#04b88013080254850d6c01ed54810589 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.4-h0f2a231_0.conda#876286b5941933a0f558777e57d883cc -https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_9.conda#d47dee1856d9cb955b8076eeff304a5b +https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_0.conda#aeafb07a327e3f14a796bf081ea07472 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-hca18f0e_1.conda#e1232042de76d24539a436d37597eb06 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-17_linux64_openblas.conda#7ef0969b00fe3d6eef56a8151d3afb29 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1002.conda#4c4dce87e96b321308f81ba2c10d2897 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-17_linux64_openblas.conda#a2103882c46492e26500fcb56c03de8b https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.5.1-h8b53f26_1.conda#5b09e13d732dda1a2bc9adc711164f4d -https://conda.anaconda.org/conda-forge/linux-64/python-3.9.17-h0755675_0_cpython.conda#384886ac3580bba3541ce65c992eb192 +https://conda.anaconda.org/conda-forge/linux-64/python-3.9.18-h0755675_0_cpython.conda#3ede353bc605068d9677e700b1847382 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.43.0-h2c6b66d_0.conda#713f9eac95d051abe14c3774376854fe https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-hc3e0081_0.tar.bz2#d4c341e0379c31e9e781d4f204726867 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.6-h8ee46fc_0.conda#7590b76c3d11d21caa44f3fc38ac584a https://conda.anaconda.org/conda-forge/linux-64/antlr-python-runtime-4.7.2-py39hf3d152e_1003.tar.bz2#5e8330e806e50bd6137ebd125f4bc1bb https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda#3edfead7cedd1ab4400a6c588f3e75f8 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.3.2-h2e3709c_0.conda#749f3bb860c2b5e23f807bedf10fe05b -https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.7.12-hc865f51_1.conda#dca45458adcf2a29be153d39f885aadb -https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_9.conda#4601544b4982ba1861fa9b9c607b2c06 -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.0.9-py39h5a03fae_9.conda#d1601752c6f47af7bedf838be3d8ca6b +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_0.conda#3db48055eab680e43a122e2c7494e7ae +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py39h3d6467e_0.conda#8a1b6b1f5e230aaf6408d6b0aef3492f https://conda.anaconda.org/conda-forge/noarch/certifi-2023.7.22-pyhd8ed1ab_0.conda#7f3dbc9179b4dde7da98dfb151d0ad22 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.2.0-pyhd8ed1ab_0.conda#313516e9a4b08b12dfb1e1cd390a96e3 https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.1-pyhd8ed1ab_0.conda#b325bfc4cff7d7f8a868f1f7ecc4ed16 https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb -https://conda.anaconda.org/conda-forge/noarch/filelock-3.12.2-pyhd8ed1ab_0.conda#53522ec72e6adae42bd373ef58357230 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.12.3-pyhd8ed1ab_0.conda#3104cf0ab9fb9de393051bf92b10dbe9 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.6.0-pyh1a96a4e_0.conda#50ea2067ec92dfcc38b4f07992d7e235 https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed @@ -125,13 +117,11 @@ https://conda.anaconda.org/conda-forge/noarch/wheel-0.41.2-pyhd8ed1ab_0.conda#1c https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/noarch/zipp-3.16.2-pyhd8ed1ab_0.conda#2da0451b54c4563c32490cb1b7cf68a1 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.3-he2921ad_3.conda#29f36ec5e9d3c5384e10395f7e189542 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.9.5-h3a0376c_1.conda#4cfef5eeaa843749252c94324004075e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py39he91dace_3.conda#20080319ef73fbad74dcd6d62f2a3ffe https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py39h2ae25f5_1.tar.bz2#c943fb9a2818ecc5be1e0ecc8b7738f1 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.1.0-py39h7633fee_0.conda#54e6f32e448fdc273606011f0940d076 https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.42.1-py39hd1e30aa_0.conda#de06dc7edaddbd3b60c050f3a95d6fe6 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.1-nompi_h4f84152_100.conda#ff9ae10aa224826c07da7ef26cb0b717 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.2-nompi_h4f84152_100.conda#2de6a9bc8083b49f09b2f6eb28d3ba3c https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda#4e9f59a060c3be52bc4ddc46ee9b6946 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.0.1-pyhd8ed1ab_0.conda#d978c61aa5fc2c69380d53ad56b5ae86 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 @@ -145,24 +135,21 @@ https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.1-py39h1bc45ef_2.con https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.7.1-hd8ed1ab_0.conda#f96688577f1faa58096d06a45136afa2 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.4-pyhd8ed1ab_0.conda#18badd8fa3648d1beb1fcc7f2e0f756e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.3.14-h1678ad6_3.conda#5418f1a44b5bc75892d898e8fb5d180b https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py39h0f8d45d_0.conda#180d4312005bc93f257e2997a8ee41cb https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.0.1-pyhd8ed1ab_0.conda#54661981fd331e20847d8a49543dd9af https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.8.0-hd8ed1ab_0.conda#b279b07ce18058034e5b3606ba103a8b +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h80fb2b6_112.conda#a19fa6cacf80c8a366572853d5890eb4 https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.10.0-pyhd8ed1ab_0.conda#0809187ef9b89a3d94a5c24d13936236 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.0-py39h5ed0f51_1.conda#9c455b3b3b55f13b2094932740cd3efb https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b -https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.23.0-h40cdbb9_5.conda#c7f91f564b5066671dc38df5728b5dee -https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.8.1-pyhd8ed1ab_0.conda#cda1fad481e5a7d5489c0cc44d099b9d +https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.9.0-pyhd8ed1ab_0.conda#7bcadb3fcbb9fadeb53abef5b53b1f98 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.0.0-h32699f2_1.conda#fdde5424ecef5f7ad310b4242229291c https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py39he190548_0.conda#f2a931db797bb58bd335f4a857b4c898 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py39h4282601_102.conda#05390bd5ad0ddc2f719392d087673344 https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyha770c72_3.conda#5936894aade8240c867d292aa0d980c6 -https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.10.57-h6f6b8fa_21.conda#5932a9d1b381873f837ca84481587577 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py39h40cae4c_0.conda#24b4bf92e26a46217e37e5928927116b +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.31.0-h35c6de3_1.conda#22b243bd3c8aae15cb399178c4161faa https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.2-py39h6183b62_0.conda#c7074f28bd86170a8235ddc995b4ee57 -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h7e745eb_109.conda#9e208615247477427acbd0900ca7038f -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.31.0-h73bf81c_0.conda#ffb754859219f4d8fbd9b7cc3337dd27 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py39h4218a78_101.conda#8f5c25bb7accd1954d8b7fc689c5975c -https://conda.anaconda.org/conda-forge/noarch/iris-3.6.1-pyha770c72_0.conda#36d615b339058273520990fc78239116 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.6.0-py39h0f8d45d_0.conda#37f4c199171dd388337f6c8080230f44 +https://conda.anaconda.org/conda-forge/noarch/iris-3.7.0-pyha770c72_0.conda#dccc1f660bf455c239adaabf56b91dc9 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.6.0-py39h44dd56e_1.conda#31245eac5106c3c37518d0f0e4f92419 From 1bc56f6e698472b8dc159b0a5581c9c9dc1b1e25 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 18 Sep 2023 10:29:17 +0100 Subject: [PATCH 234/583] Updated environment lockfiles (#352) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 48 ++++++++++++-------------- requirements/locks/py311-linux-64.lock | 48 ++++++++++++-------------- requirements/locks/py39-linux-64.lock | 48 ++++++++++++-------------- 3 files changed, 66 insertions(+), 78 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 514d3a64..0e5a912a 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -5,14 +5,14 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.7.22-hbcca054_0.conda#a73ecd2988327ad4c8f2c331482917f2 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.1.0-h15d22d2_0.conda#afb656a334c409dd9805508af1c89c7a -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.1.0-hfd8a6a1_0.conda#067bcc23164642f4c226da631f2a2e1d +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_0.conda#aa3ee989b0eba634e47197adbaa84fdd +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_0.conda#47d33bfb38632133412c20d1dee8eeae https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-3_cp310.conda#4eb33d14d794b0f4be116443ffed3853 https://conda.anaconda.org/conda-forge/noarch/tzdata-2023c-h71feb2d_0.conda#939e3e74d8be4dac89ce83b20de2492a -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.1.0-h69a702a_0.conda#506dc07710dd5b0ba63cbf134897fc10 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.1.0-he5830b7_0.conda#56ca14d57ac29a75d23a39eb3ee0ddeb +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_0.conda#bdaebefa4f6c436741187c8a304681a5 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_0.conda#33c2353e425610c69ad58a8e29694724 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.1.0-he5830b7_0.conda#cd93f779ff018dd85c7544c015c9db3c +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_0.conda#3934dca6107fad668d036a4cafca1015 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.19.1-hd590300_0.conda#e8c18d865be43e2fb3f7a145b6adf1f5 https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.0-h59595ed_0.conda#3fdf79ef322c8379ae83be491d805369 @@ -26,12 +26,12 @@ https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h516909a_1.tar.bz2#6f https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.5.0-hcb278e6_1.conda#6305a3dd2752c76335295da4e581f2fd https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-h166bdaf_0.tar.bz2#b62b52da46c39ee2bc3c162ac7f1804d -https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-2.1.5.1-h0b41bf4_0.conda#1edd9e67bdb90d78cea97733ff6b54e6 +https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-2.1.5.1-hd590300_1.conda#323e90742f0f48fc22bea908735f55e6 https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.0-h7f98852_0.tar.bz2#39b1328babf85c7c3a61636d9cd50206 -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.23-pthreads_h80387f5_0.conda#9c5ea51ccb8ffae7d06c645869d24ce6 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.24-pthreads_h413a1c8_0.conda#6e4ef6ca28655124dcde9bd500e44c32 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b -https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.1-hd590300_0.conda#82bf6f63eb15ef719b556b63feec3a77 +https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_0.conda#30de3fd9b3b602f7473f30e684eeea8c https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-hcb278e6_0.conda#681105bccc2a3f7f1a837d47d39c9179 @@ -49,7 +49,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae https://conda.anaconda.org/conda-forge/linux-64/expat-2.5.0-hcb278e6_1.conda#8b9b5aca60558d02ddaa09d599e55920 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h501b40f_6.conda#c3e9338e15d90106f467377017352b97 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-17_linux64_openblas.conda#57fb44770b1bc832fb2dbefa1bd502de +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-18_linux64_openblas.conda#bcddbb497582ece559465b9cd11042e7 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_0.conda#43017394a280a42b48d11d2a6e169901 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_0.conda#8e3e1cb77c4b355a3776bdfb74095bed https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 @@ -59,19 +59,18 @@ https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.43.0-h2797004_0.cond https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.11.5-h232c23b_1.conda#f3858448893839820d4bcfb14ad3ecdf -https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_0.conda#d597567092897b1f1c7350f32e03944e +https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda#68c34ec6149623be41a1933ab996a209 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.5-hfc55251_0.conda#04b88013080254850d6c01ed54810589 -https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.4-h0f2a231_0.conda#876286b5941933a0f558777e57d883cc +https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-h0f2a231_0.conda#009521b7ed97cca25f8f997f9e745976 https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_0.conda#aeafb07a327e3f14a796bf081ea07472 -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-hca18f0e_1.conda#e1232042de76d24539a436d37597eb06 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-17_linux64_openblas.conda#7ef0969b00fe3d6eef56a8151d3afb29 -https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1002.conda#4c4dce87e96b321308f81ba2c10d2897 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-17_linux64_openblas.conda#a2103882c46492e26500fcb56c03de8b +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-18_linux64_openblas.conda#93dd9ab275ad888ed8113953769af78c +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-18_linux64_openblas.conda#a1244707531e5b143c420c70573c8ec5 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.5.1-h8b53f26_1.conda#5b09e13d732dda1a2bc9adc711164f4d https://conda.anaconda.org/conda-forge/linux-64/python-3.10.12-hd12c33a_0_cpython.conda#eb6f1df105f37daedd6dca78523baa75 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.43.0-h2c6b66d_0.conda#713f9eac95d051abe14c3774376854fe @@ -86,13 +85,13 @@ https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.2.0-pyhd8ed1a https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.1-pyhd8ed1ab_0.conda#b325bfc4cff7d7f8a868f1f7ecc4ed16 https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb -https://conda.anaconda.org/conda-forge/noarch/filelock-3.12.3-pyhd8ed1ab_0.conda#3104cf0ab9fb9de393051bf92b10dbe9 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.12.4-pyhd8ed1ab_0.conda#5173d4b8267a0699a43d73231e0b6596 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.6.0-pyh1a96a4e_0.conda#50ea2067ec92dfcc38b4f07992d7e235 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.9.0-pyh1a96a4e_0.conda#b4a3c7bb3f45d47e085764ff096fa259 https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py310hd41b1e2_0.conda#741385a84f6a1b6623eb39226cc669e8 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-haa2dc70_1.conda#980d8aca0bc23ca73fa8caa3e7c84c28 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.2.1-hca28451_0.conda#96aec6156d58591f5a4e67056521ce1b +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.3.0-hca28451_0.conda#4ab41bee09a2d2e08de5f09d6f1eef62 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py310h2372a71_0.conda#5597d9f9778af6883ae64f0e7d39416c https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda#926c67c0310094cf421ad13f7d3f38e5 @@ -108,10 +107,9 @@ https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#9 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.3.0-py310h2372a71_0.conda#75e60ce53c01a121039b3050c9e1f759 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py310h2372a71_0.conda#511120451bf728d52bb37c73d4069e57 -https://conda.anaconda.org/conda-forge/noarch/setuptools-68.1.2-pyhd8ed1ab_0.conda#4fe12573bf499ff85a0a364e00cc5c53 +https://conda.anaconda.org/conda-forge/noarch/setuptools-68.2.2-pyhd8ed1ab_0.conda#fc2166155db840c634a1291a5c35a709 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.7.1-pyha770c72_0.conda#c39d6a09fe819de4951c2642629d9115 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.0.0-py310h5764c6d_0.tar.bz2#e972c5a1f472561cf4a91962cb01f4b4 https://conda.anaconda.org/conda-forge/noarch/wheel-0.41.2-pyhd8ed1ab_0.conda#1ccd092478b3e0ee10d7a891adbf8a4f https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec @@ -124,14 +122,15 @@ https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.42.1-py310h2372a71_0 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.2-nompi_h4f84152_100.conda#2de6a9bc8083b49f09b2f6eb28d3ba3c https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda#4e9f59a060c3be52bc4ddc46ee9b6946 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 +https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py310hde88566_1008.tar.bz2#f9dd8a7a2fcc23eb2cd95cd817c949e7 -https://conda.anaconda.org/conda-forge/noarch/partd-1.4.0-pyhd8ed1ab_0.conda#721dab5803ea92ce02ddc4ee50aa0c48 +https://conda.anaconda.org/conda-forge/noarch/partd-1.4.0-pyhd8ed1ab_1.conda#6ceb4e000cbe0b56b290180aea8520e8 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.0.0-py310h582fbeb_0.conda#adcc7ea52e4d39d0a93f6a2ef36c7fd4 https://conda.anaconda.org/conda-forge/noarch/pip-23.2.1-pyhd8ed1ab_0.conda#e2783aa3f9235225eec92f9081c5b801 https://conda.anaconda.org/conda-forge/linux-64/proj-9.2.1-ha643af7_0.conda#e992387307f4403ba0ec07d009032550 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/scipy-1.11.2-py310hb13e2d6_1.conda#4f522fc9cb8ecfa25e39f5c2ea65b16b https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.1-py310h7dcad9a_2.conda#a46061c83ed37bfa05d1ee96ec2fbb08 -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.7.1-hd8ed1ab_0.conda#f96688577f1faa58096d06a45136afa2 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.4-pyhd8ed1ab_0.conda#18badd8fa3648d1beb1fcc7f2e0f756e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py310h278f3c1_0.conda#f2d3f2542a2467f479e809ac7b901ac2 @@ -139,15 +138,12 @@ https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda# https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.8.0-hd8ed1ab_0.conda#b279b07ce18058034e5b3606ba103a8b https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h80fb2b6_112.conda#a19fa6cacf80c8a366572853d5890eb4 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py310he60537e_0.conda#68b2dd34c69d08b05a9db5e3596fe3ee -https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.10.0-pyhd8ed1ab_0.conda#0809187ef9b89a3d94a5c24d13936236 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.0-py310h24ef57a_1.conda#a689e86d7bbab67f889fc384aa72b088 https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py310h7cbd5c2_0.conda#7bfbace0788f477da1c26e10a358692d -https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.9.0-pyhd8ed1ab_0.conda#7bcadb3fcbb9fadeb53abef5b53b1f98 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.9.2-pyhd8ed1ab_0.conda#cce7eeb7eda0124af186a5e9ce9b0fca https://conda.anaconda.org/conda-forge/linux-64/jasper-4.0.0-h32699f2_1.conda#fdde5424ecef5f7ad310b4242229291c https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py310hba70d50_102.conda#6025039727a049ab4c0f2aab842c01cb -https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyha770c72_3.conda#5936894aade8240c867d292aa0d980c6 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.31.0-h35c6de3_1.conda#22b243bd3c8aae15cb399178c4161faa -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.2-py310ha4c1d20_0.conda#d1ec73b85cb90900c40c7fbcd36059e8 https://conda.anaconda.org/conda-forge/noarch/iris-3.7.0-pyha770c72_0.conda#dccc1f660bf455c239adaabf56b91dc9 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.6.0-py310h1f7b6fc_1.conda#694c566683fdbbe46ad6d8e39bc18b71 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 8190c85f..e5603b4a 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -5,14 +5,14 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.7.22-hbcca054_0.conda#a73ecd2988327ad4c8f2c331482917f2 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.1.0-h15d22d2_0.conda#afb656a334c409dd9805508af1c89c7a -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.1.0-hfd8a6a1_0.conda#067bcc23164642f4c226da631f2a2e1d +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_0.conda#aa3ee989b0eba634e47197adbaa84fdd +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_0.conda#47d33bfb38632133412c20d1dee8eeae https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-3_cp311.conda#c2e2630ddb68cf52eec74dc7dfab20b5 https://conda.anaconda.org/conda-forge/noarch/tzdata-2023c-h71feb2d_0.conda#939e3e74d8be4dac89ce83b20de2492a -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.1.0-h69a702a_0.conda#506dc07710dd5b0ba63cbf134897fc10 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.1.0-he5830b7_0.conda#56ca14d57ac29a75d23a39eb3ee0ddeb +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_0.conda#bdaebefa4f6c436741187c8a304681a5 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_0.conda#33c2353e425610c69ad58a8e29694724 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.1.0-he5830b7_0.conda#cd93f779ff018dd85c7544c015c9db3c +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_0.conda#3934dca6107fad668d036a4cafca1015 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.19.1-hd590300_0.conda#e8c18d865be43e2fb3f7a145b6adf1f5 https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.0-h59595ed_0.conda#3fdf79ef322c8379ae83be491d805369 @@ -26,12 +26,12 @@ https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h516909a_1.tar.bz2#6f https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.5.0-hcb278e6_1.conda#6305a3dd2752c76335295da4e581f2fd https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-h166bdaf_0.tar.bz2#b62b52da46c39ee2bc3c162ac7f1804d -https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-2.1.5.1-h0b41bf4_0.conda#1edd9e67bdb90d78cea97733ff6b54e6 +https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-2.1.5.1-hd590300_1.conda#323e90742f0f48fc22bea908735f55e6 https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.0-h7f98852_0.tar.bz2#39b1328babf85c7c3a61636d9cd50206 -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.23-pthreads_h80387f5_0.conda#9c5ea51ccb8ffae7d06c645869d24ce6 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.24-pthreads_h413a1c8_0.conda#6e4ef6ca28655124dcde9bd500e44c32 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b -https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.1-hd590300_0.conda#82bf6f63eb15ef719b556b63feec3a77 +https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_0.conda#30de3fd9b3b602f7473f30e684eeea8c https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-hcb278e6_0.conda#681105bccc2a3f7f1a837d47d39c9179 @@ -49,7 +49,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae https://conda.anaconda.org/conda-forge/linux-64/expat-2.5.0-hcb278e6_1.conda#8b9b5aca60558d02ddaa09d599e55920 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h501b40f_6.conda#c3e9338e15d90106f467377017352b97 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-17_linux64_openblas.conda#57fb44770b1bc832fb2dbefa1bd502de +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-18_linux64_openblas.conda#bcddbb497582ece559465b9cd11042e7 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_0.conda#43017394a280a42b48d11d2a6e169901 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_0.conda#8e3e1cb77c4b355a3776bdfb74095bed https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 @@ -59,19 +59,18 @@ https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.43.0-h2797004_0.cond https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.11.5-h232c23b_1.conda#f3858448893839820d4bcfb14ad3ecdf -https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_0.conda#d597567092897b1f1c7350f32e03944e +https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda#68c34ec6149623be41a1933ab996a209 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.5-hfc55251_0.conda#04b88013080254850d6c01ed54810589 -https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.4-h0f2a231_0.conda#876286b5941933a0f558777e57d883cc +https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-h0f2a231_0.conda#009521b7ed97cca25f8f997f9e745976 https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_0.conda#aeafb07a327e3f14a796bf081ea07472 -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-hca18f0e_1.conda#e1232042de76d24539a436d37597eb06 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-17_linux64_openblas.conda#7ef0969b00fe3d6eef56a8151d3afb29 -https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1002.conda#4c4dce87e96b321308f81ba2c10d2897 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-17_linux64_openblas.conda#a2103882c46492e26500fcb56c03de8b +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-18_linux64_openblas.conda#93dd9ab275ad888ed8113953769af78c +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-18_linux64_openblas.conda#a1244707531e5b143c420c70573c8ec5 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.5.1-h8b53f26_1.conda#5b09e13d732dda1a2bc9adc711164f4d https://conda.anaconda.org/conda-forge/linux-64/python-3.11.5-hab00c5b_0_cpython.conda#f0288cb82594b1cbc71111d1cd3c5422 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.43.0-h2c6b66d_0.conda#713f9eac95d051abe14c3774376854fe @@ -86,13 +85,13 @@ https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.2.0-pyhd8ed1a https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.1-pyhd8ed1ab_0.conda#b325bfc4cff7d7f8a868f1f7ecc4ed16 https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb -https://conda.anaconda.org/conda-forge/noarch/filelock-3.12.3-pyhd8ed1ab_0.conda#3104cf0ab9fb9de393051bf92b10dbe9 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.12.4-pyhd8ed1ab_0.conda#5173d4b8267a0699a43d73231e0b6596 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.6.0-pyh1a96a4e_0.conda#50ea2067ec92dfcc38b4f07992d7e235 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.9.0-pyh1a96a4e_0.conda#b4a3c7bb3f45d47e085764ff096fa259 https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py311h9547e67_0.conda#f53903649188b99e6b44c560c69f5b23 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-haa2dc70_1.conda#980d8aca0bc23ca73fa8caa3e7c84c28 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.2.1-hca28451_0.conda#96aec6156d58591f5a4e67056521ce1b +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.3.0-hca28451_0.conda#4ab41bee09a2d2e08de5f09d6f1eef62 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py311h459d7ec_0.conda#9904dc4adb5d547cb21e136f98cb24b0 https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda#926c67c0310094cf421ad13f7d3f38e5 @@ -108,10 +107,9 @@ https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#9 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.3.0-py311h459d7ec_0.conda#87b306459b81b7a7aaad37222d537a4f https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py311h459d7ec_0.conda#30eaaf31141e785a445bf1ede6235fe3 -https://conda.anaconda.org/conda-forge/noarch/setuptools-68.1.2-pyhd8ed1ab_0.conda#4fe12573bf499ff85a0a364e00cc5c53 +https://conda.anaconda.org/conda-forge/noarch/setuptools-68.2.2-pyhd8ed1ab_0.conda#fc2166155db840c634a1291a5c35a709 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.7.1-pyha770c72_0.conda#c39d6a09fe819de4951c2642629d9115 https://conda.anaconda.org/conda-forge/noarch/wheel-0.41.2-pyhd8ed1ab_0.conda#1ccd092478b3e0ee10d7a891adbf8a4f https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a @@ -123,14 +121,15 @@ https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.42.1-py311h459d7ec_0 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.2-nompi_h4f84152_100.conda#2de6a9bc8083b49f09b2f6eb28d3ba3c https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda#4e9f59a060c3be52bc4ddc46ee9b6946 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 +https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py311h4c7f6c3_1008.tar.bz2#5998dff78c3b82a07ad77f2ae1ec1c44 -https://conda.anaconda.org/conda-forge/noarch/partd-1.4.0-pyhd8ed1ab_0.conda#721dab5803ea92ce02ddc4ee50aa0c48 +https://conda.anaconda.org/conda-forge/noarch/partd-1.4.0-pyhd8ed1ab_1.conda#6ceb4e000cbe0b56b290180aea8520e8 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.0.0-py311h0b84326_0.conda#4b24acdc1fbbae9da03147e7d2cf8c8a https://conda.anaconda.org/conda-forge/noarch/pip-23.2.1-pyhd8ed1ab_0.conda#e2783aa3f9235225eec92f9081c5b801 https://conda.anaconda.org/conda-forge/linux-64/proj-9.2.1-ha643af7_0.conda#e992387307f4403ba0ec07d009032550 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/scipy-1.11.2-py311h64a7726_1.conda#58af16843fc4469770bdbaf45d3a19de https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.1-py311he06c224_2.conda#10a1953d2f74d292b5de093ceea104b2 -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.7.1-hd8ed1ab_0.conda#f96688577f1faa58096d06a45136afa2 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.4-pyhd8ed1ab_0.conda#18badd8fa3648d1beb1fcc7f2e0f756e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h1f0f07a_0.conda#43a71a823583d75308eaf3a06c8f150b @@ -138,15 +137,12 @@ https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda# https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.8.0-hd8ed1ab_0.conda#b279b07ce18058034e5b3606ba103a8b https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h80fb2b6_112.conda#a19fa6cacf80c8a366572853d5890eb4 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py311h8597a09_0.conda#70c3b734ffe82c16b6d121aaa11929a8 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.10.0-pyhd8ed1ab_0.conda#0809187ef9b89a3d94a5c24d13936236 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.0-py311ha169711_1.conda#92633556d37e88ce45193374d408072c https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py311h320fe9a_0.conda#1271b2375735e2aaa6d6770dbe2ad087 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.9.0-pyhd8ed1ab_0.conda#7bcadb3fcbb9fadeb53abef5b53b1f98 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.9.2-pyhd8ed1ab_0.conda#cce7eeb7eda0124af186a5e9ce9b0fca https://conda.anaconda.org/conda-forge/linux-64/jasper-4.0.0-h32699f2_1.conda#fdde5424ecef5f7ad310b4242229291c https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py311he8ad708_102.conda#b48083ba918347f30efa94f7dc694919 -https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyha770c72_3.conda#5936894aade8240c867d292aa0d980c6 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.31.0-h35c6de3_1.conda#22b243bd3c8aae15cb399178c4161faa -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.2-py311h64a7726_0.conda#18d094fb8e4ac52f93a4f4857a8f1e8f https://conda.anaconda.org/conda-forge/noarch/iris-3.7.0-pyha770c72_0.conda#dccc1f660bf455c239adaabf56b91dc9 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.6.0-py311h1f0f07a_1.conda#0a7a6ea21a46cc2857d748ffdbd76dc7 diff --git a/requirements/locks/py39-linux-64.lock b/requirements/locks/py39-linux-64.lock index d495f73b..9219bf70 100644 --- a/requirements/locks/py39-linux-64.lock +++ b/requirements/locks/py39-linux-64.lock @@ -5,14 +5,14 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.7.22-hbcca054_0.conda#a73ecd2988327ad4c8f2c331482917f2 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.1.0-h15d22d2_0.conda#afb656a334c409dd9805508af1c89c7a -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.1.0-hfd8a6a1_0.conda#067bcc23164642f4c226da631f2a2e1d +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_0.conda#aa3ee989b0eba634e47197adbaa84fdd +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_0.conda#47d33bfb38632133412c20d1dee8eeae https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.9-3_cp39.conda#0dd193187d54e585cac7eab942a8847e https://conda.anaconda.org/conda-forge/noarch/tzdata-2023c-h71feb2d_0.conda#939e3e74d8be4dac89ce83b20de2492a -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.1.0-h69a702a_0.conda#506dc07710dd5b0ba63cbf134897fc10 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.1.0-he5830b7_0.conda#56ca14d57ac29a75d23a39eb3ee0ddeb +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_0.conda#bdaebefa4f6c436741187c8a304681a5 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_0.conda#33c2353e425610c69ad58a8e29694724 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.1.0-he5830b7_0.conda#cd93f779ff018dd85c7544c015c9db3c +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_0.conda#3934dca6107fad668d036a4cafca1015 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.19.1-hd590300_0.conda#e8c18d865be43e2fb3f7a145b6adf1f5 https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.0-h59595ed_0.conda#3fdf79ef322c8379ae83be491d805369 @@ -26,12 +26,12 @@ https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h516909a_1.tar.bz2#6f https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.5.0-hcb278e6_1.conda#6305a3dd2752c76335295da4e581f2fd https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-h166bdaf_0.tar.bz2#b62b52da46c39ee2bc3c162ac7f1804d -https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-2.1.5.1-h0b41bf4_0.conda#1edd9e67bdb90d78cea97733ff6b54e6 +https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-2.1.5.1-hd590300_1.conda#323e90742f0f48fc22bea908735f55e6 https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.0-h7f98852_0.tar.bz2#39b1328babf85c7c3a61636d9cd50206 -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.23-pthreads_h80387f5_0.conda#9c5ea51ccb8ffae7d06c645869d24ce6 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.24-pthreads_h413a1c8_0.conda#6e4ef6ca28655124dcde9bd500e44c32 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b -https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.1-hd590300_0.conda#82bf6f63eb15ef719b556b63feec3a77 +https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_0.conda#30de3fd9b3b602f7473f30e684eeea8c https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-hcb278e6_0.conda#681105bccc2a3f7f1a837d47d39c9179 @@ -49,7 +49,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae https://conda.anaconda.org/conda-forge/linux-64/expat-2.5.0-hcb278e6_1.conda#8b9b5aca60558d02ddaa09d599e55920 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h501b40f_6.conda#c3e9338e15d90106f467377017352b97 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-17_linux64_openblas.conda#57fb44770b1bc832fb2dbefa1bd502de +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-18_linux64_openblas.conda#bcddbb497582ece559465b9cd11042e7 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_0.conda#43017394a280a42b48d11d2a6e169901 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_0.conda#8e3e1cb77c4b355a3776bdfb74095bed https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 @@ -59,19 +59,18 @@ https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.43.0-h2797004_0.cond https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.11.5-h232c23b_1.conda#f3858448893839820d4bcfb14ad3ecdf -https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_0.conda#d597567092897b1f1c7350f32e03944e +https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda#68c34ec6149623be41a1933ab996a209 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.5-hfc55251_0.conda#04b88013080254850d6c01ed54810589 -https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.4-h0f2a231_0.conda#876286b5941933a0f558777e57d883cc +https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-h0f2a231_0.conda#009521b7ed97cca25f8f997f9e745976 https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_0.conda#aeafb07a327e3f14a796bf081ea07472 -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-hca18f0e_1.conda#e1232042de76d24539a436d37597eb06 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-17_linux64_openblas.conda#7ef0969b00fe3d6eef56a8151d3afb29 -https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1002.conda#4c4dce87e96b321308f81ba2c10d2897 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-17_linux64_openblas.conda#a2103882c46492e26500fcb56c03de8b +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-18_linux64_openblas.conda#93dd9ab275ad888ed8113953769af78c +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-18_linux64_openblas.conda#a1244707531e5b143c420c70573c8ec5 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.5.1-h8b53f26_1.conda#5b09e13d732dda1a2bc9adc711164f4d https://conda.anaconda.org/conda-forge/linux-64/python-3.9.18-h0755675_0_cpython.conda#3ede353bc605068d9677e700b1847382 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.43.0-h2c6b66d_0.conda#713f9eac95d051abe14c3774376854fe @@ -86,13 +85,13 @@ https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.2.0-pyhd8ed1a https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.1-pyhd8ed1ab_0.conda#b325bfc4cff7d7f8a868f1f7ecc4ed16 https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb -https://conda.anaconda.org/conda-forge/noarch/filelock-3.12.3-pyhd8ed1ab_0.conda#3104cf0ab9fb9de393051bf92b10dbe9 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.12.4-pyhd8ed1ab_0.conda#5173d4b8267a0699a43d73231e0b6596 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.6.0-pyh1a96a4e_0.conda#50ea2067ec92dfcc38b4f07992d7e235 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.9.0-pyh1a96a4e_0.conda#b4a3c7bb3f45d47e085764ff096fa259 https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py39h7633fee_0.conda#3822b0ae733e022c10469c0e46bdddc4 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-haa2dc70_1.conda#980d8aca0bc23ca73fa8caa3e7c84c28 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.2.1-hca28451_0.conda#96aec6156d58591f5a4e67056521ce1b +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.3.0-hca28451_0.conda#4ab41bee09a2d2e08de5f09d6f1eef62 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py39hd1e30aa_0.conda#9c858d105816f454c6b64f3e19184b60 https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda#926c67c0310094cf421ad13f7d3f38e5 @@ -108,10 +107,9 @@ https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#9 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.3.0-py39hd1e30aa_0.conda#41841cc1d7387bb7a30cdde4d88afbf4 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py39hd1e30aa_0.conda#ccecb3196b3678e9b5fc8441d681c203 -https://conda.anaconda.org/conda-forge/noarch/setuptools-68.1.2-pyhd8ed1ab_0.conda#4fe12573bf499ff85a0a364e00cc5c53 +https://conda.anaconda.org/conda-forge/noarch/setuptools-68.2.2-pyhd8ed1ab_0.conda#fc2166155db840c634a1291a5c35a709 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.7.1-pyha770c72_0.conda#c39d6a09fe819de4951c2642629d9115 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.0.0-py39hb9d737c_0.tar.bz2#230d65004135bf312504a1bbcb0c7a08 https://conda.anaconda.org/conda-forge/noarch/wheel-0.41.2-pyhd8ed1ab_0.conda#1ccd092478b3e0ee10d7a891adbf8a4f https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec @@ -125,14 +123,15 @@ https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.2-nompi_h4f84152_100.c https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda#4e9f59a060c3be52bc4ddc46ee9b6946 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.0.1-pyhd8ed1ab_0.conda#d978c61aa5fc2c69380d53ad56b5ae86 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 +https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py39h2ae25f5_1008.tar.bz2#d90acb3804f16c63eb6726652e4e25b3 -https://conda.anaconda.org/conda-forge/noarch/partd-1.4.0-pyhd8ed1ab_0.conda#721dab5803ea92ce02ddc4ee50aa0c48 +https://conda.anaconda.org/conda-forge/noarch/partd-1.4.0-pyhd8ed1ab_1.conda#6ceb4e000cbe0b56b290180aea8520e8 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.0.0-py39haaeba84_0.conda#f97a95fab7c69678ebf6b57396b1323e https://conda.anaconda.org/conda-forge/noarch/pip-23.2.1-pyhd8ed1ab_0.conda#e2783aa3f9235225eec92f9081c5b801 https://conda.anaconda.org/conda-forge/linux-64/proj-9.2.1-ha643af7_0.conda#e992387307f4403ba0ec07d009032550 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/scipy-1.11.2-py39h474f0d3_1.conda#f62409d868e23c1f97ae2b0db5658385 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.1-py39h1bc45ef_2.conda#d79ed0ee1738151284ebd97092a6a210 -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.7.1-hd8ed1ab_0.conda#f96688577f1faa58096d06a45136afa2 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.4-pyhd8ed1ab_0.conda#18badd8fa3648d1beb1fcc7f2e0f756e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py39h0f8d45d_0.conda#180d4312005bc93f257e2997a8ee41cb @@ -140,16 +139,13 @@ https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda# https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.0.1-pyhd8ed1ab_0.conda#54661981fd331e20847d8a49543dd9af https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.8.0-hd8ed1ab_0.conda#b279b07ce18058034e5b3606ba103a8b https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h80fb2b6_112.conda#a19fa6cacf80c8a366572853d5890eb4 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.10.0-pyhd8ed1ab_0.conda#0809187ef9b89a3d94a5c24d13936236 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.0-py39h5ed0f51_1.conda#9c455b3b3b55f13b2094932740cd3efb https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b -https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.9.0-pyhd8ed1ab_0.conda#7bcadb3fcbb9fadeb53abef5b53b1f98 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.9.2-pyhd8ed1ab_0.conda#cce7eeb7eda0124af186a5e9ce9b0fca https://conda.anaconda.org/conda-forge/linux-64/jasper-4.0.0-h32699f2_1.conda#fdde5424ecef5f7ad310b4242229291c https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py39he190548_0.conda#f2a931db797bb58bd335f4a857b4c898 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py39h4282601_102.conda#05390bd5ad0ddc2f719392d087673344 -https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyha770c72_3.conda#5936894aade8240c867d292aa0d980c6 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py39h40cae4c_0.conda#24b4bf92e26a46217e37e5928927116b https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.31.0-h35c6de3_1.conda#22b243bd3c8aae15cb399178c4161faa -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.2-py39h6183b62_0.conda#c7074f28bd86170a8235ddc995b4ee57 https://conda.anaconda.org/conda-forge/noarch/iris-3.7.0-pyha770c72_0.conda#dccc1f660bf455c239adaabf56b91dc9 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.6.0-py39h44dd56e_1.conda#31245eac5106c3c37518d0f0e4f92419 From 89a69fbcc3e734beee8f69fe53cb7c344633d5ef Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 25 Sep 2023 09:21:39 +0100 Subject: [PATCH 235/583] Updated environment lockfiles (#353) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 79 +++++++++++++------------ requirements/locks/py311-linux-64.lock | 77 ++++++++++++------------ requirements/locks/py39-linux-64.lock | 81 +++++++++++++------------- 3 files changed, 117 insertions(+), 120 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 0e5a912a..06ae057f 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -5,14 +5,12 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.7.22-hbcca054_0.conda#a73ecd2988327ad4c8f2c331482917f2 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_0.conda#aa3ee989b0eba634e47197adbaa84fdd -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_0.conda#47d33bfb38632133412c20d1dee8eeae -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-3_cp310.conda#4eb33d14d794b0f4be116443ffed3853 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_2.conda#9172c297304f2a20134fc56c97fbe229 +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-4_cp310.conda#26322ec5d7712c3ded99dd656142b8ce https://conda.anaconda.org/conda-forge/noarch/tzdata-2023c-h71feb2d_0.conda#939e3e74d8be4dac89ce83b20de2492a -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_0.conda#bdaebefa4f6c436741187c8a304681a5 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_0.conda#33c2353e425610c69ad58a8e29694724 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_2.conda#e2042154faafe61969556f28bade94b9 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_0.conda#3934dca6107fad668d036a4cafca1015 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_2.conda#c28003b0be0494f9a7664389146716ff 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.19.1-hd590300_0.conda#e8c18d865be43e2fb3f7a145b6adf1f5 https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.0-h59595ed_0.conda#3fdf79ef322c8379ae83be491d805369 @@ -21,21 +19,21 @@ https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libaec-1.0.6-hcb278e6_1.conda#0f683578378cddb223e7fd24f785ab2a https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_0.conda#e805cbec4c29feb22e019245f7e47b6c -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.18-h0b41bf4_0.conda#6aa9c9de5542ecb07fdda9ca626252d8 +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.19-hd590300_0.conda#1635570038840ee3f9c71d22aa5b8b6d https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h516909a_1.tar.bz2#6f8720dff19e17ce5d48cfe7f3d2f0a3 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.5.0-hcb278e6_1.conda#6305a3dd2752c76335295da4e581f2fd https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_2.conda#78fdab09d9138851dde2b5fe2a11019e https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-h166bdaf_0.tar.bz2#b62b52da46c39ee2bc3c162ac7f1804d https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-2.1.5.1-hd590300_1.conda#323e90742f0f48fc22bea908735f55e6 https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.0-h7f98852_0.tar.bz2#39b1328babf85c7c3a61636d9cd50206 -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.24-pthreads_h413a1c8_0.conda#6e4ef6ca28655124dcde9bd500e44c32 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_0.conda#30de3fd9b3b602f7473f30e684eeea8c https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-hcb278e6_0.conda#681105bccc2a3f7f1a837d47d39c9179 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.1.2-hd590300_0.conda#e5ac5227582d6c83ccf247288c0eb095 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.1.3-hd590300_0.conda#7bb88ce04c8deb9f7d763ae04a1da72f https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-h9fff704_0.conda#e6d228cd0bb74a51dd18f5bfce0b4115 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b @@ -47,12 +45,11 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae -https://conda.anaconda.org/conda-forge/linux-64/expat-2.5.0-hcb278e6_1.conda#8b9b5aca60558d02ddaa09d599e55920 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h501b40f_6.conda#c3e9338e15d90106f467377017352b97 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-18_linux64_openblas.conda#bcddbb497582ece559465b9cd11042e7 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_0.conda#43017394a280a42b48d11d2a6e169901 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_0.conda#8e3e1cb77c4b355a3776bdfb74095bed https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_2.conda#e75a75a6eaf6f318dae2631158c46575 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.52.0-h61bc06f_0.conda#613955a50485812985c059e7b269f42e https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.39-h753d276_0.conda#e1c890aebdebbfbf87e2c917187b4416 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.43.0-h2797004_0.conda#903fa782a9067d5934210df6d79220f6 @@ -62,6 +59,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.11.5-h232c23b_1.conda# https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 +https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_1.conda#85552d64cb49f12781668779efc738ec https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda#68c34ec6149623be41a1933ab996a209 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.5-hfc55251_0.conda#04b88013080254850d6c01ed54810589 @@ -69,12 +67,10 @@ https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-h0f2a231_0.conda#00 https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_0.conda#aeafb07a327e3f14a796bf081ea07472 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-18_linux64_openblas.conda#93dd9ab275ad888ed8113953769af78c -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-18_linux64_openblas.conda#a1244707531e5b143c420c70573c8ec5 -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.5.1-h8b53f26_1.conda#5b09e13d732dda1a2bc9adc711164f4d +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.24-pthreads_h413a1c8_0.conda#6e4ef6ca28655124dcde9bd500e44c32 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h29866fb_1.conda#4e9afd30f4ccb2f98645e51005f82236 https://conda.anaconda.org/conda-forge/linux-64/python-3.10.12-hd12c33a_0_cpython.conda#eb6f1df105f37daedd6dca78523baa75 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.43.0-h2c6b66d_0.conda#713f9eac95d051abe14c3774376854fe -https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-hc3e0081_0.tar.bz2#d4c341e0379c31e9e781d4f204726867 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.6-h8ee46fc_0.conda#7590b76c3d11d21caa44f3fc38ac584a https://conda.anaconda.org/conda-forge/linux-64/antlr-python-runtime-4.7.2-py310hff52083_1003.tar.bz2#8324f8fff866055d4b32eb25e091fe31 https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda#3edfead7cedd1ab4400a6c588f3e75f8 @@ -87,63 +83,66 @@ https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.1-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb https://conda.anaconda.org/conda-forge/noarch/filelock-3.12.4-pyhd8ed1ab_0.conda#5173d4b8267a0699a43d73231e0b6596 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.9.0-pyh1a96a4e_0.conda#b4a3c7bb3f45d47e085764ff096fa259 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.9.2-pyh1a96a4e_0.conda#9d15cd3a0e944594ab528da37dc72ecc https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed -https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py310hd41b1e2_0.conda#741385a84f6a1b6623eb39226cc669e8 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-haa2dc70_1.conda#980d8aca0bc23ca73fa8caa3e7c84c28 +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py310hd41b1e2_1.conda#b8d67603d43b23ce7e988a5d81a7ab79 +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-h7f713cb_2.conda#9ab79924a3760f85a799f21bc99bd655 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-18_linux64_openblas.conda#bcddbb497582ece559465b9cd11042e7 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.3.0-hca28451_0.conda#4ab41bee09a2d2e08de5f09d6f1eef62 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py310h2372a71_0.conda#5597d9f9778af6883ae64f0e7d39416c +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py310h2372a71_1.conda#b74e07a054c479e45a83a83fc5be713c https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda#926c67c0310094cf421ad13f7d3f38e5 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 -https://conda.anaconda.org/conda-forge/linux-64/numpy-1.25.2-py310ha4c1d20_0.conda#188e72aa313da668464e35309e9a32b0 -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-hfec8fc6_2.conda#5ce6a42505c6e9e6151c54c3ec8d68ea +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-h488ebb8_3.conda#128c25b7fe6a25286a48f3a6a9b5b6f3 https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda#91cda59e66e1e4afe9476f8ef98f5c30 https://conda.anaconda.org/conda-forge/noarch/pep8-1.7.1-py_0.tar.bz2#d0b5bc3aebbffcb175bf8a1d419acb79 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.1-pyhd8ed1ab_0.conda#176f7d56f0cfe9008bdf1bccd7de02fb https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 -https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.3.0-py310h2372a71_0.conda#75e60ce53c01a121039b3050c9e1f759 -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py310h2372a71_0.conda#511120451bf728d52bb37c73d4069e57 +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.3.0-py310h2372a71_1.conda#708d39474e54ba0f1832afb551633338 +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py310h2372a71_1.conda#bb010e368de4940771368bc3dc4c63e7 https://conda.anaconda.org/conda-forge/noarch/setuptools-68.2.2-pyhd8ed1ab_0.conda#fc2166155db840c634a1291a5c35a709 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 -https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.0.0-py310h5764c6d_0.tar.bz2#e972c5a1f472561cf4a91962cb01f4b4 +https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.0.0-py310h2372a71_1.conda#cd944e0f7a4d1529c6707bd65423bd64 https://conda.anaconda.org/conda-forge/noarch/wheel-0.41.2-pyhd8ed1ab_0.conda#1ccd092478b3e0ee10d7a891adbf8a4f https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a -https://conda.anaconda.org/conda-forge/noarch/zipp-3.16.2-pyhd8ed1ab_0.conda#2da0451b54c4563c32490cb1b7cf68a1 -https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py310h255011f_3.conda#800596144bb613cd7ac58b80900ce835 -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py310hde88566_1.tar.bz2#94ce7a76b0c912279f6958e0b6b21d2b -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.1.0-py310hd41b1e2_0.conda#684399f9ddc0b9d6f3b6164f6107098e +https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py310h2fee648_5.conda#fef75d6c60d8a1cc7e6d1707f470a4e2 https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.42.1-py310h2372a71_0.conda#1f18231ffab82f236ce074b2aaa07e54 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.2-nompi_h4f84152_100.conda#2de6a9bc8083b49f09b2f6eb28d3ba3c https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda#4e9f59a060c3be52bc4ddc46ee9b6946 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-18_linux64_openblas.conda#93dd9ab275ad888ed8113953769af78c https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca -https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py310hde88566_1008.tar.bz2#f9dd8a7a2fcc23eb2cd95cd817c949e7 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-18_linux64_openblas.conda#a1244707531e5b143c420c70573c8ec5 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.0-pyhd8ed1ab_1.conda#6ceb4e000cbe0b56b290180aea8520e8 -https://conda.anaconda.org/conda-forge/linux-64/pillow-10.0.0-py310h582fbeb_0.conda#adcc7ea52e4d39d0a93f6a2ef36c7fd4 +https://conda.anaconda.org/conda-forge/linux-64/pillow-10.0.1-py310h29da1c1_1.conda#8e93b1c69cddf89fd412178d3d418bae https://conda.anaconda.org/conda-forge/noarch/pip-23.2.1-pyhd8ed1ab_0.conda#e2783aa3f9235225eec92f9081c5b801 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.2.1-ha643af7_0.conda#e992387307f4403ba0ec07d009032550 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.0-h1d62c97_1.conda#900fd11ac61d4415d515583fcb570207 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/scipy-1.11.2-py310hb13e2d6_1.conda#4f522fc9cb8ecfa25e39f5c2ea65b16b -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.1-py310h7dcad9a_2.conda#a46061c83ed37bfa05d1ee96ec2fbb08 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.4-pyhd8ed1ab_0.conda#18badd8fa3648d1beb1fcc7f2e0f756e +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.5-pyhd8ed1ab_0.conda#3bda70bbeb2920f44db5375af2e5fe38 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py310h278f3c1_0.conda#f2d3f2542a2467f479e809ac7b901ac2 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.8.0-hd8ed1ab_0.conda#b279b07ce18058034e5b3606ba103a8b https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h80fb2b6_112.conda#a19fa6cacf80c8a366572853d5890eb4 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py310he60537e_0.conda#68b2dd34c69d08b05a9db5e3596fe3ee -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.0-py310h24ef57a_1.conda#a689e86d7bbab67f889fc384aa72b088 +https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.0-py310hb13e2d6_0.conda#ac3b67e928cc71548efad9b522d42fef +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py310h32c33b7_1.conda#453939b9853937e80c94e9eb3da75981 https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py310h7cbd5c2_0.conda#7bfbace0788f477da1c26e10a358692d +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py310hde88566_1.tar.bz2#94ce7a76b0c912279f6958e0b6b21d2b +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.1.1-py310hd41b1e2_0.conda#e00d52a8657a79b0a7c8c10559784759 https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.9.2-pyhd8ed1ab_0.conda#cce7eeb7eda0124af186a5e9ce9b0fca https://conda.anaconda.org/conda-forge/linux-64/jasper-4.0.0-h32699f2_1.conda#fdde5424ecef5f7ad310b4242229291c -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py310hba70d50_102.conda#6025039727a049ab4c0f2aab842c01cb +https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py310hde88566_1008.tar.bz2#f9dd8a7a2fcc23eb2cd95cd817c949e7 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.2-py310hb13e2d6_1.conda#4f522fc9cb8ecfa25e39f5c2ea65b16b +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.1-py310h7dcad9a_2.conda#a46061c83ed37bfa05d1ee96ec2fbb08 +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py310h278f3c1_0.conda#f2d3f2542a2467f479e809ac7b901ac2 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.31.0-h35c6de3_1.conda#22b243bd3c8aae15cb399178c4161faa -https://conda.anaconda.org/conda-forge/noarch/iris-3.7.0-pyha770c72_0.conda#dccc1f660bf455c239adaabf56b91dc9 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.0-py310h62c0568_1.conda#d6fe03e8d9e80b6e20b7ae60bf4f88b0 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py310hba70d50_102.conda#6025039727a049ab4c0f2aab842c01cb +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py310h7cbd5c2_0.conda#7bfbace0788f477da1c26e10a358692d https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.6.0-py310h1f7b6fc_1.conda#694c566683fdbbe46ad6d8e39bc18b71 +https://conda.anaconda.org/conda-forge/noarch/iris-3.7.0-pyha770c72_0.conda#dccc1f660bf455c239adaabf56b91dc9 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index e5603b4a..1f9760d1 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -5,14 +5,12 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.7.22-hbcca054_0.conda#a73ecd2988327ad4c8f2c331482917f2 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_0.conda#aa3ee989b0eba634e47197adbaa84fdd -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_0.conda#47d33bfb38632133412c20d1dee8eeae -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-3_cp311.conda#c2e2630ddb68cf52eec74dc7dfab20b5 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_2.conda#9172c297304f2a20134fc56c97fbe229 +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-4_cp311.conda#d786502c97404c94d7d58d258a445a65 https://conda.anaconda.org/conda-forge/noarch/tzdata-2023c-h71feb2d_0.conda#939e3e74d8be4dac89ce83b20de2492a -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_0.conda#bdaebefa4f6c436741187c8a304681a5 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_0.conda#33c2353e425610c69ad58a8e29694724 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_2.conda#e2042154faafe61969556f28bade94b9 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_0.conda#3934dca6107fad668d036a4cafca1015 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_2.conda#c28003b0be0494f9a7664389146716ff 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.19.1-hd590300_0.conda#e8c18d865be43e2fb3f7a145b6adf1f5 https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.0-h59595ed_0.conda#3fdf79ef322c8379ae83be491d805369 @@ -21,21 +19,21 @@ https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libaec-1.0.6-hcb278e6_1.conda#0f683578378cddb223e7fd24f785ab2a https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_0.conda#e805cbec4c29feb22e019245f7e47b6c -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.18-h0b41bf4_0.conda#6aa9c9de5542ecb07fdda9ca626252d8 +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.19-hd590300_0.conda#1635570038840ee3f9c71d22aa5b8b6d https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h516909a_1.tar.bz2#6f8720dff19e17ce5d48cfe7f3d2f0a3 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.5.0-hcb278e6_1.conda#6305a3dd2752c76335295da4e581f2fd https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_2.conda#78fdab09d9138851dde2b5fe2a11019e https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-h166bdaf_0.tar.bz2#b62b52da46c39ee2bc3c162ac7f1804d https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-2.1.5.1-hd590300_1.conda#323e90742f0f48fc22bea908735f55e6 https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.0-h7f98852_0.tar.bz2#39b1328babf85c7c3a61636d9cd50206 -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.24-pthreads_h413a1c8_0.conda#6e4ef6ca28655124dcde9bd500e44c32 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_0.conda#30de3fd9b3b602f7473f30e684eeea8c https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-hcb278e6_0.conda#681105bccc2a3f7f1a837d47d39c9179 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.1.2-hd590300_0.conda#e5ac5227582d6c83ccf247288c0eb095 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.1.3-hd590300_0.conda#7bb88ce04c8deb9f7d763ae04a1da72f https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-h9fff704_0.conda#e6d228cd0bb74a51dd18f5bfce0b4115 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b @@ -47,12 +45,11 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae -https://conda.anaconda.org/conda-forge/linux-64/expat-2.5.0-hcb278e6_1.conda#8b9b5aca60558d02ddaa09d599e55920 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h501b40f_6.conda#c3e9338e15d90106f467377017352b97 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-18_linux64_openblas.conda#bcddbb497582ece559465b9cd11042e7 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_0.conda#43017394a280a42b48d11d2a6e169901 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_0.conda#8e3e1cb77c4b355a3776bdfb74095bed https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_2.conda#e75a75a6eaf6f318dae2631158c46575 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.52.0-h61bc06f_0.conda#613955a50485812985c059e7b269f42e https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.39-h753d276_0.conda#e1c890aebdebbfbf87e2c917187b4416 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.43.0-h2797004_0.conda#903fa782a9067d5934210df6d79220f6 @@ -62,6 +59,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.11.5-h232c23b_1.conda# https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 +https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_1.conda#85552d64cb49f12781668779efc738ec https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda#68c34ec6149623be41a1933ab996a209 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.5-hfc55251_0.conda#04b88013080254850d6c01ed54810589 @@ -69,12 +67,10 @@ https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-h0f2a231_0.conda#00 https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_0.conda#aeafb07a327e3f14a796bf081ea07472 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-18_linux64_openblas.conda#93dd9ab275ad888ed8113953769af78c -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-18_linux64_openblas.conda#a1244707531e5b143c420c70573c8ec5 -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.5.1-h8b53f26_1.conda#5b09e13d732dda1a2bc9adc711164f4d +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.24-pthreads_h413a1c8_0.conda#6e4ef6ca28655124dcde9bd500e44c32 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h29866fb_1.conda#4e9afd30f4ccb2f98645e51005f82236 https://conda.anaconda.org/conda-forge/linux-64/python-3.11.5-hab00c5b_0_cpython.conda#f0288cb82594b1cbc71111d1cd3c5422 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.43.0-h2c6b66d_0.conda#713f9eac95d051abe14c3774376854fe -https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-hc3e0081_0.tar.bz2#d4c341e0379c31e9e781d4f204726867 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.6-h8ee46fc_0.conda#7590b76c3d11d21caa44f3fc38ac584a https://conda.anaconda.org/conda-forge/linux-64/antlr-python-runtime-4.7.2-py311h38be061_1003.tar.bz2#0ab8f8f0cae99343907fe68cda11baea https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda#3edfead7cedd1ab4400a6c588f3e75f8 @@ -87,62 +83,65 @@ https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.1-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb https://conda.anaconda.org/conda-forge/noarch/filelock-3.12.4-pyhd8ed1ab_0.conda#5173d4b8267a0699a43d73231e0b6596 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.9.0-pyh1a96a4e_0.conda#b4a3c7bb3f45d47e085764ff096fa259 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.9.2-pyh1a96a4e_0.conda#9d15cd3a0e944594ab528da37dc72ecc https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed -https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py311h9547e67_0.conda#f53903649188b99e6b44c560c69f5b23 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-haa2dc70_1.conda#980d8aca0bc23ca73fa8caa3e7c84c28 +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py311h9547e67_1.conda#2c65bdf442b0d37aad080c8a4e0d452f +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-h7f713cb_2.conda#9ab79924a3760f85a799f21bc99bd655 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-18_linux64_openblas.conda#bcddbb497582ece559465b9cd11042e7 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.3.0-hca28451_0.conda#4ab41bee09a2d2e08de5f09d6f1eef62 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py311h459d7ec_0.conda#9904dc4adb5d547cb21e136f98cb24b0 +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py311h459d7ec_1.conda#71120b5155a0c500826cf81536721a15 https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda#926c67c0310094cf421ad13f7d3f38e5 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 -https://conda.anaconda.org/conda-forge/linux-64/numpy-1.25.2-py311h64a7726_0.conda#71fd6f1734a0fa64d8f852ae7156ec45 -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-hfec8fc6_2.conda#5ce6a42505c6e9e6151c54c3ec8d68ea +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-h488ebb8_3.conda#128c25b7fe6a25286a48f3a6a9b5b6f3 https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda#91cda59e66e1e4afe9476f8ef98f5c30 https://conda.anaconda.org/conda-forge/noarch/pep8-1.7.1-py_0.tar.bz2#d0b5bc3aebbffcb175bf8a1d419acb79 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.1-pyhd8ed1ab_0.conda#176f7d56f0cfe9008bdf1bccd7de02fb https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 -https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.3.0-py311h459d7ec_0.conda#87b306459b81b7a7aaad37222d537a4f -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py311h459d7ec_0.conda#30eaaf31141e785a445bf1ede6235fe3 +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.3.0-py311h459d7ec_1.conda#7e2181758f84a9c7e776af10fbb2f1a0 +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py311h459d7ec_1.conda#52719a74ad130de8fb5d047dc91f247a https://conda.anaconda.org/conda-forge/noarch/setuptools-68.2.2-pyhd8ed1ab_0.conda#fc2166155db840c634a1291a5c35a709 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 https://conda.anaconda.org/conda-forge/noarch/wheel-0.41.2-pyhd8ed1ab_0.conda#1ccd092478b3e0ee10d7a891adbf8a4f https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a -https://conda.anaconda.org/conda-forge/noarch/zipp-3.16.2-pyhd8ed1ab_0.conda#2da0451b54c4563c32490cb1b7cf68a1 -https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py311h409f033_3.conda#9025d0786dbbe4bc91fd8e85502decce -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py311h4c7f6c3_1.tar.bz2#c7e54004ffd03f8db0a58ab949f2a00b -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.1.0-py311h9547e67_0.conda#daf3f23397ab2265d0cdfa339f3627ba +https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py311hb3a22ac_5.conda#75d52ef1d318d18e554aadd13ce91b9d https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.42.1-py311h459d7ec_0.conda#fc327c0ea015db3b6484eabb37d44e60 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.2-nompi_h4f84152_100.conda#2de6a9bc8083b49f09b2f6eb28d3ba3c https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda#4e9f59a060c3be52bc4ddc46ee9b6946 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-18_linux64_openblas.conda#93dd9ab275ad888ed8113953769af78c https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca -https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py311h4c7f6c3_1008.tar.bz2#5998dff78c3b82a07ad77f2ae1ec1c44 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-18_linux64_openblas.conda#a1244707531e5b143c420c70573c8ec5 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.0-pyhd8ed1ab_1.conda#6ceb4e000cbe0b56b290180aea8520e8 -https://conda.anaconda.org/conda-forge/linux-64/pillow-10.0.0-py311h0b84326_0.conda#4b24acdc1fbbae9da03147e7d2cf8c8a +https://conda.anaconda.org/conda-forge/linux-64/pillow-10.0.1-py311h8aef010_1.conda#4d66ee2081a7cd444ff6f30d95873eef https://conda.anaconda.org/conda-forge/noarch/pip-23.2.1-pyhd8ed1ab_0.conda#e2783aa3f9235225eec92f9081c5b801 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.2.1-ha643af7_0.conda#e992387307f4403ba0ec07d009032550 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.0-h1d62c97_1.conda#900fd11ac61d4415d515583fcb570207 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/scipy-1.11.2-py311h64a7726_1.conda#58af16843fc4469770bdbaf45d3a19de -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.1-py311he06c224_2.conda#10a1953d2f74d292b5de093ceea104b2 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.4-pyhd8ed1ab_0.conda#18badd8fa3648d1beb1fcc7f2e0f756e +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.5-pyhd8ed1ab_0.conda#3bda70bbeb2920f44db5375af2e5fe38 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h1f0f07a_0.conda#43a71a823583d75308eaf3a06c8f150b https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.8.0-hd8ed1ab_0.conda#b279b07ce18058034e5b3606ba103a8b https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h80fb2b6_112.conda#a19fa6cacf80c8a366572853d5890eb4 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py311h8597a09_0.conda#70c3b734ffe82c16b6d121aaa11929a8 -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.0-py311ha169711_1.conda#92633556d37e88ce45193374d408072c +https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.0-py311h64a7726_0.conda#bf16a9f625126e378302f08e7ed67517 +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311h1facc83_1.conda#2e48207ebbd3e25ad14881a27e51fa1e https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py311h320fe9a_0.conda#1271b2375735e2aaa6d6770dbe2ad087 +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py311h4c7f6c3_1.tar.bz2#c7e54004ffd03f8db0a58ab949f2a00b +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.1.1-py311h9547e67_0.conda#db5b3b0093d0d4565e5c89578108402e https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.9.2-pyhd8ed1ab_0.conda#cce7eeb7eda0124af186a5e9ce9b0fca https://conda.anaconda.org/conda-forge/linux-64/jasper-4.0.0-h32699f2_1.conda#fdde5424ecef5f7ad310b4242229291c -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py311he8ad708_102.conda#b48083ba918347f30efa94f7dc694919 +https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py311h4c7f6c3_1008.tar.bz2#5998dff78c3b82a07ad77f2ae1ec1c44 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.2-py311h64a7726_1.conda#58af16843fc4469770bdbaf45d3a19de +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.1-py311he06c224_2.conda#10a1953d2f74d292b5de093ceea104b2 +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h1f0f07a_0.conda#43a71a823583d75308eaf3a06c8f150b https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.31.0-h35c6de3_1.conda#22b243bd3c8aae15cb399178c4161faa -https://conda.anaconda.org/conda-forge/noarch/iris-3.7.0-pyha770c72_0.conda#dccc1f660bf455c239adaabf56b91dc9 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.0-py311h54ef318_1.conda#20d79e2fe53b49b399f3d36977b05abb +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py311he8ad708_102.conda#b48083ba918347f30efa94f7dc694919 +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py311h320fe9a_0.conda#1271b2375735e2aaa6d6770dbe2ad087 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.6.0-py311h1f0f07a_1.conda#0a7a6ea21a46cc2857d748ffdbd76dc7 +https://conda.anaconda.org/conda-forge/noarch/iris-3.7.0-pyha770c72_0.conda#dccc1f660bf455c239adaabf56b91dc9 diff --git a/requirements/locks/py39-linux-64.lock b/requirements/locks/py39-linux-64.lock index 9219bf70..121476e3 100644 --- a/requirements/locks/py39-linux-64.lock +++ b/requirements/locks/py39-linux-64.lock @@ -5,14 +5,12 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.7.22-hbcca054_0.conda#a73ecd2988327ad4c8f2c331482917f2 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_0.conda#aa3ee989b0eba634e47197adbaa84fdd -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_0.conda#47d33bfb38632133412c20d1dee8eeae -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.9-3_cp39.conda#0dd193187d54e585cac7eab942a8847e +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_2.conda#9172c297304f2a20134fc56c97fbe229 +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.9-4_cp39.conda#bfe4b3259a8ac6cdf0037752904da6a7 https://conda.anaconda.org/conda-forge/noarch/tzdata-2023c-h71feb2d_0.conda#939e3e74d8be4dac89ce83b20de2492a -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_0.conda#bdaebefa4f6c436741187c8a304681a5 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_0.conda#33c2353e425610c69ad58a8e29694724 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_2.conda#e2042154faafe61969556f28bade94b9 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_0.conda#3934dca6107fad668d036a4cafca1015 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_2.conda#c28003b0be0494f9a7664389146716ff 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.19.1-hd590300_0.conda#e8c18d865be43e2fb3f7a145b6adf1f5 https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.0-h59595ed_0.conda#3fdf79ef322c8379ae83be491d805369 @@ -21,21 +19,21 @@ https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libaec-1.0.6-hcb278e6_1.conda#0f683578378cddb223e7fd24f785ab2a https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_0.conda#e805cbec4c29feb22e019245f7e47b6c -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.18-h0b41bf4_0.conda#6aa9c9de5542ecb07fdda9ca626252d8 +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.19-hd590300_0.conda#1635570038840ee3f9c71d22aa5b8b6d https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h516909a_1.tar.bz2#6f8720dff19e17ce5d48cfe7f3d2f0a3 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.5.0-hcb278e6_1.conda#6305a3dd2752c76335295da4e581f2fd https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_2.conda#78fdab09d9138851dde2b5fe2a11019e https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-h166bdaf_0.tar.bz2#b62b52da46c39ee2bc3c162ac7f1804d https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-2.1.5.1-hd590300_1.conda#323e90742f0f48fc22bea908735f55e6 https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.0-h7f98852_0.tar.bz2#39b1328babf85c7c3a61636d9cd50206 -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.24-pthreads_h413a1c8_0.conda#6e4ef6ca28655124dcde9bd500e44c32 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_0.conda#30de3fd9b3b602f7473f30e684eeea8c https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-hcb278e6_0.conda#681105bccc2a3f7f1a837d47d39c9179 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.1.2-hd590300_0.conda#e5ac5227582d6c83ccf247288c0eb095 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.1.3-hd590300_0.conda#7bb88ce04c8deb9f7d763ae04a1da72f https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-h9fff704_0.conda#e6d228cd0bb74a51dd18f5bfce0b4115 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b @@ -47,12 +45,11 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae -https://conda.anaconda.org/conda-forge/linux-64/expat-2.5.0-hcb278e6_1.conda#8b9b5aca60558d02ddaa09d599e55920 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h501b40f_6.conda#c3e9338e15d90106f467377017352b97 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-18_linux64_openblas.conda#bcddbb497582ece559465b9cd11042e7 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_0.conda#43017394a280a42b48d11d2a6e169901 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_0.conda#8e3e1cb77c4b355a3776bdfb74095bed https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_2.conda#e75a75a6eaf6f318dae2631158c46575 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.52.0-h61bc06f_0.conda#613955a50485812985c059e7b269f42e https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.39-h753d276_0.conda#e1c890aebdebbfbf87e2c917187b4416 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.43.0-h2797004_0.conda#903fa782a9067d5934210df6d79220f6 @@ -62,6 +59,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.11.5-h232c23b_1.conda# https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 +https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_1.conda#85552d64cb49f12781668779efc738ec https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda#68c34ec6149623be41a1933ab996a209 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.5-hfc55251_0.conda#04b88013080254850d6c01ed54810589 @@ -69,12 +67,10 @@ https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-h0f2a231_0.conda#00 https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_0.conda#aeafb07a327e3f14a796bf081ea07472 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-18_linux64_openblas.conda#93dd9ab275ad888ed8113953769af78c -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-18_linux64_openblas.conda#a1244707531e5b143c420c70573c8ec5 -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.5.1-h8b53f26_1.conda#5b09e13d732dda1a2bc9adc711164f4d +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.24-pthreads_h413a1c8_0.conda#6e4ef6ca28655124dcde9bd500e44c32 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h29866fb_1.conda#4e9afd30f4ccb2f98645e51005f82236 https://conda.anaconda.org/conda-forge/linux-64/python-3.9.18-h0755675_0_cpython.conda#3ede353bc605068d9677e700b1847382 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.43.0-h2c6b66d_0.conda#713f9eac95d051abe14c3774376854fe -https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-hc3e0081_0.tar.bz2#d4c341e0379c31e9e781d4f204726867 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.6-h8ee46fc_0.conda#7590b76c3d11d21caa44f3fc38ac584a https://conda.anaconda.org/conda-forge/linux-64/antlr-python-runtime-4.7.2-py39hf3d152e_1003.tar.bz2#5e8330e806e50bd6137ebd125f4bc1bb https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda#3edfead7cedd1ab4400a6c588f3e75f8 @@ -87,65 +83,68 @@ https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.1-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb https://conda.anaconda.org/conda-forge/noarch/filelock-3.12.4-pyhd8ed1ab_0.conda#5173d4b8267a0699a43d73231e0b6596 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.9.0-pyh1a96a4e_0.conda#b4a3c7bb3f45d47e085764ff096fa259 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.9.2-pyh1a96a4e_0.conda#9d15cd3a0e944594ab528da37dc72ecc https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed -https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py39h7633fee_0.conda#3822b0ae733e022c10469c0e46bdddc4 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-haa2dc70_1.conda#980d8aca0bc23ca73fa8caa3e7c84c28 +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py39h7633fee_1.conda#c9f74d717e5a2847a9f8b779c54130f2 +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-h7f713cb_2.conda#9ab79924a3760f85a799f21bc99bd655 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-18_linux64_openblas.conda#bcddbb497582ece559465b9cd11042e7 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.3.0-hca28451_0.conda#4ab41bee09a2d2e08de5f09d6f1eef62 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py39hd1e30aa_0.conda#9c858d105816f454c6b64f3e19184b60 +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py39hd1e30aa_1.conda#ee2b4665b852ec6ff2758f3c1b91233d https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda#926c67c0310094cf421ad13f7d3f38e5 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 -https://conda.anaconda.org/conda-forge/linux-64/numpy-1.25.2-py39h6183b62_0.conda#f1c358d06344bd7f9a293f9af4b9b8fc -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-hfec8fc6_2.conda#5ce6a42505c6e9e6151c54c3ec8d68ea +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-h488ebb8_3.conda#128c25b7fe6a25286a48f3a6a9b5b6f3 https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda#91cda59e66e1e4afe9476f8ef98f5c30 https://conda.anaconda.org/conda-forge/noarch/pep8-1.7.1-py_0.tar.bz2#d0b5bc3aebbffcb175bf8a1d419acb79 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.1-pyhd8ed1ab_0.conda#176f7d56f0cfe9008bdf1bccd7de02fb https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 -https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.3.0-py39hd1e30aa_0.conda#41841cc1d7387bb7a30cdde4d88afbf4 -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py39hd1e30aa_0.conda#ccecb3196b3678e9b5fc8441d681c203 +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.3.0-py39hd1e30aa_1.conda#6295f6164ced8634e3d95cd5d08ad95d +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py39hd1e30aa_1.conda#37218233bcdc310e4fde6453bc1b40d8 https://conda.anaconda.org/conda-forge/noarch/setuptools-68.2.2-pyhd8ed1ab_0.conda#fc2166155db840c634a1291a5c35a709 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 -https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.0.0-py39hb9d737c_0.tar.bz2#230d65004135bf312504a1bbcb0c7a08 +https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.0.0-py39hd1e30aa_1.conda#7c7ab84210a972d9efe49655802e904c https://conda.anaconda.org/conda-forge/noarch/wheel-0.41.2-pyhd8ed1ab_0.conda#1ccd092478b3e0ee10d7a891adbf8a4f https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a -https://conda.anaconda.org/conda-forge/noarch/zipp-3.16.2-pyhd8ed1ab_0.conda#2da0451b54c4563c32490cb1b7cf68a1 -https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py39he91dace_3.conda#20080319ef73fbad74dcd6d62f2a3ffe -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py39h2ae25f5_1.tar.bz2#c943fb9a2818ecc5be1e0ecc8b7738f1 -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.1.0-py39h7633fee_0.conda#54e6f32e448fdc273606011f0940d076 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py39h7a31438_5.conda#a2271dc58a5291d18b42fa4d45d42218 https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.42.1-py39hd1e30aa_0.conda#de06dc7edaddbd3b60c050f3a95d6fe6 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.2-nompi_h4f84152_100.conda#2de6a9bc8083b49f09b2f6eb28d3ba3c https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda#4e9f59a060c3be52bc4ddc46ee9b6946 -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.0.1-pyhd8ed1ab_0.conda#d978c61aa5fc2c69380d53ad56b5ae86 +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.1.0-pyhd8ed1ab_0.conda#48b0d98e0c0ec810d3ccc2a0926c8c0e https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-18_linux64_openblas.conda#93dd9ab275ad888ed8113953769af78c https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca -https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py39h2ae25f5_1008.tar.bz2#d90acb3804f16c63eb6726652e4e25b3 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-18_linux64_openblas.conda#a1244707531e5b143c420c70573c8ec5 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.0-pyhd8ed1ab_1.conda#6ceb4e000cbe0b56b290180aea8520e8 -https://conda.anaconda.org/conda-forge/linux-64/pillow-10.0.0-py39haaeba84_0.conda#f97a95fab7c69678ebf6b57396b1323e +https://conda.anaconda.org/conda-forge/linux-64/pillow-10.0.1-py39h444a776_1.conda#52ad49ce520bec37ff0423b16c8bb052 https://conda.anaconda.org/conda-forge/noarch/pip-23.2.1-pyhd8ed1ab_0.conda#e2783aa3f9235225eec92f9081c5b801 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.2.1-ha643af7_0.conda#e992387307f4403ba0ec07d009032550 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.0-h1d62c97_1.conda#900fd11ac61d4415d515583fcb570207 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/scipy-1.11.2-py39h474f0d3_1.conda#f62409d868e23c1f97ae2b0db5658385 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.1-py39h1bc45ef_2.conda#d79ed0ee1738151284ebd97092a6a210 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.4-pyhd8ed1ab_0.conda#18badd8fa3648d1beb1fcc7f2e0f756e +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.5-pyhd8ed1ab_0.conda#3bda70bbeb2920f44db5375af2e5fe38 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py39h0f8d45d_0.conda#180d4312005bc93f257e2997a8ee41cb https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 -https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.0.1-pyhd8ed1ab_0.conda#54661981fd331e20847d8a49543dd9af +https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.1.0-pyhd8ed1ab_0.conda#6a62c2cc25376a0d050b3d1d221c3ee9 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.8.0-hd8ed1ab_0.conda#b279b07ce18058034e5b3606ba103a8b https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h80fb2b6_112.conda#a19fa6cacf80c8a366572853d5890eb4 -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.0-py39h5ed0f51_1.conda#9c455b3b3b55f13b2094932740cd3efb +https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.0-py39h474f0d3_0.conda#62f1d2e05327bf62728afa448f2a9261 +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py39hce394fd_1.conda#b5188eeb7df815911a7c8db0fc16b89b https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py39h2ae25f5_1.tar.bz2#c943fb9a2818ecc5be1e0ecc8b7738f1 +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.1.1-py39h7633fee_0.conda#b673f03c191683996e66c881f90aff2b https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.9.2-pyhd8ed1ab_0.conda#cce7eeb7eda0124af186a5e9ce9b0fca https://conda.anaconda.org/conda-forge/linux-64/jasper-4.0.0-h32699f2_1.conda#fdde5424ecef5f7ad310b4242229291c -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py39he190548_0.conda#f2a931db797bb58bd335f4a857b4c898 +https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py39h2ae25f5_1008.tar.bz2#d90acb3804f16c63eb6726652e4e25b3 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.2-py39h474f0d3_1.conda#f62409d868e23c1f97ae2b0db5658385 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.1-py39h1bc45ef_2.conda#d79ed0ee1738151284ebd97092a6a210 +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py39h0f8d45d_0.conda#180d4312005bc93f257e2997a8ee41cb +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.31.0-h35c6de3_1.conda#22b243bd3c8aae15cb399178c4161faa +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.0-py39he9076e7_1.conda#3337ebf55443f31a1148f3ca6f1d9673 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py39h4282601_102.conda#05390bd5ad0ddc2f719392d087673344 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py39h40cae4c_0.conda#24b4bf92e26a46217e37e5928927116b -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.31.0-h35c6de3_1.conda#22b243bd3c8aae15cb399178c4161faa -https://conda.anaconda.org/conda-forge/noarch/iris-3.7.0-pyha770c72_0.conda#dccc1f660bf455c239adaabf56b91dc9 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.6.0-py39h44dd56e_1.conda#31245eac5106c3c37518d0f0e4f92419 +https://conda.anaconda.org/conda-forge/noarch/iris-3.7.0-pyha770c72_0.conda#dccc1f660bf455c239adaabf56b91dc9 From 60f4187ec63816a9fd08247e19be685a05519700 Mon Sep 17 00:00:00 2001 From: lbdreyer Date: Mon, 13 Nov 2023 13:24:32 +0000 Subject: [PATCH 236/583] Relicense from LGPL-3 to BSD-3 (#359) --- COPYING | 674 ------------------ COPYING.LESSER | 165 ----- LICENSE | 29 + README.rst | 18 +- iris_grib/__init__.py | 5 +- iris_grib/_grib1_load_rules.py | 5 +- iris_grib/_grib_cf_map.py | 5 +- iris_grib/_iris_mercator_support.py | 5 +- iris_grib/_load_convert.py | 5 +- iris_grib/_save_rules.py | 5 +- iris_grib/grib_phenom_translation.py | 5 +- iris_grib/message.py | 5 +- iris_grib/tests/__init__.py | 5 +- iris_grib/tests/integration/__init__.py | 5 +- .../integration/format_interop/__init__.py | 5 +- .../format_interop/test_name_grib.py | 5 +- .../format_interop/test_pp_grib.py | 5 +- .../integration/iris_integration/__init__.py | 5 +- .../iris_integration/test_callback.py | 5 +- .../iris_integration/test_pickle_message.py | 5 +- .../integration/load_convert/__init__.py | 5 +- .../load_convert/test_data_section.py | 5 +- .../load_convert/test_load_hybrid_coords.py | 5 +- .../test_product_definition_section.py | 5 +- .../load_convert/test_sample_file_loads.py | 5 +- .../tests/integration/round_trip/__init__.py | 5 +- .../test_WAFC_mapping_round_trip.py | 5 +- .../test_grid_definition_section.py | 5 +- .../test_hybrid_coords_round_trip.py | 5 +- .../test_product_definition_section.py | 5 +- .../tests/integration/save_rules/__init__.py | 5 +- .../integration/save_rules/test_grib_save.py | 5 +- .../test_grid_definition_section.py | 5 +- .../save_rules/test_save_hybrid_coords.py | 5 +- iris_grib/tests/runner/__init__.py | 5 +- iris_grib/tests/runner/__main__.py | 5 +- iris_grib/tests/runner/_runner.py | 5 +- iris_grib/tests/test_license_headers.py | 10 +- iris_grib/tests/test_pep8.py | 5 +- iris_grib/tests/unit/__init__.py | 5 +- .../tests/unit/grib1_load_rules/__init__.py | 5 +- .../grib1_load_rules/test_grib1_convert.py | 5 +- .../test_grib1_load_translations.py | 5 +- .../unit/grib_phenom_translation/__init__.py | 5 +- .../test_grib_phenom_translation.py | 5 +- iris_grib/tests/unit/load_convert/__init__.py | 5 +- .../unit/load_convert/test__hindcast_fix.py | 5 +- .../unit/load_convert/test_bitmap_section.py | 5 +- .../load_convert/test_calculate_increment.py | 5 +- .../tests/unit/load_convert/test_convert.py | 5 +- .../unit/load_convert/test_data_cutoff.py | 5 +- .../test_data_representation_section.py | 5 +- .../tests/unit/load_convert/test_ellipsoid.py | 5 +- .../load_convert/test_ellipsoid_geometry.py | 5 +- .../load_convert/test_ensemble_identifier.py | 5 +- .../test_fixup_float32_from_int32.py | 5 +- .../test_fixup_int32_from_uint32.py | 5 +- .../test_forecast_period_coord.py | 5 +- .../load_convert/test_generating_process.py | 5 +- .../unit/load_convert/test_grib2_convert.py | 5 +- .../test_grid_definition_template_0_and_1.py | 5 +- .../test_grid_definition_template_10.py | 5 +- .../test_grid_definition_template_12.py | 5 +- .../test_grid_definition_template_140.py | 5 +- .../test_grid_definition_template_20.py | 5 +- .../test_grid_definition_template_30.py | 5 +- .../test_grid_definition_template_40.py | 5 +- .../test_grid_definition_template_4_and_5.py | 5 +- .../test_grid_definition_template_5.py | 5 +- .../test_grid_definition_template_90.py | 5 +- .../load_convert/test_other_time_coord.py | 5 +- .../test_product_definition_section.py | 5 +- .../test_product_definition_template_0.py | 5 +- .../test_product_definition_template_1.py | 5 +- .../test_product_definition_template_10.py | 5 +- .../test_product_definition_template_11.py | 5 +- .../test_product_definition_template_15.py | 5 +- .../test_product_definition_template_31.py | 5 +- .../test_product_definition_template_32.py | 5 +- .../test_product_definition_template_40.py | 5 +- .../test_product_definition_template_8.py | 5 +- .../test_product_definition_template_9.py | 5 +- .../load_convert/test_projection_centre.py | 5 +- .../load_convert/test_reference_time_coord.py | 5 +- .../load_convert/test_resolution_flags.py | 5 +- .../load_convert/test_satellite_common.py | 5 +- .../unit/load_convert/test_scanning_mode.py | 5 +- .../test_statistical_cell_method.py | 5 +- .../test_statistical_forecast_period_coord.py | 5 +- .../unit/load_convert/test_time_range_unit.py | 5 +- .../load_convert/test_translate_phenomenon.py | 5 +- .../tests/unit/load_convert/test_unscale.py | 5 +- .../load_convert/test_validity_time_coord.py | 5 +- .../unit/load_convert/test_vertical_coords.py | 5 +- iris_grib/tests/unit/message/__init__.py | 5 +- .../tests/unit/message/test_GribMessage.py | 5 +- iris_grib/tests/unit/message/test_Section.py | 5 +- .../tests/unit/message/test__DataProxy.py | 5 +- .../unit/message/test__MessageLocation.py | 5 +- .../unit/message/test__RawGribMessage.py | 5 +- iris_grib/tests/unit/save_rules/__init__.py | 5 +- .../test__missing_forecast_period.py | 5 +- .../test__non_missing_forecast_period.py | 5 +- ...product_definition_template_8_10_and_11.py | 5 +- .../unit/save_rules/test_data_section.py | 5 +- .../save_rules/test_fixup_float32_as_int32.py | 5 +- .../save_rules/test_fixup_int32_as_uint32.py | 5 +- .../test_grid_definition_template_0.py | 5 +- .../test_grid_definition_template_1.py | 5 +- .../test_grid_definition_template_10.py | 5 +- .../test_grid_definition_template_12.py | 5 +- .../test_grid_definition_template_30.py | 5 +- .../test_grid_definition_template_4.py | 5 +- .../test_grid_definition_template_5.py | 5 +- .../unit/save_rules/test_identification.py | 5 +- .../test_product_definition_template_1.py | 5 +- .../test_product_definition_template_10.py | 5 +- .../test_product_definition_template_11.py | 5 +- .../test_product_definition_template_15.py | 5 +- .../test_product_definition_template_40.py | 5 +- .../test_product_definition_template_8.py | 5 +- .../unit/save_rules/test_reference_time.py | 5 +- .../test_set_discipline_and_parameter.py | 5 +- .../save_rules/test_set_fixed_surfaces.py | 5 +- .../save_rules/test_set_time_increment.py | 5 +- .../unit/save_rules/test_set_time_range.py | 5 +- iris_grib/tests/unit/test_GribWrapper.py | 5 +- iris_grib/tests/unit/test__load_generate.py | 5 +- iris_grib/tests/unit/test_load_cubes.py | 5 +- .../tests/unit/test_load_pairs_from_fields.py | 5 +- iris_grib/tests/unit/test_save_grib2.py | 5 +- iris_grib/tests/unit/test_save_messages.py | 5 +- noxfile.py | 5 +- setup.py | 2 +- 134 files changed, 293 insertions(+), 1245 deletions(-) delete mode 100644 COPYING delete mode 100644 COPYING.LESSER create mode 100644 LICENSE diff --git a/COPYING b/COPYING deleted file mode 100644 index 94a9ed02..00000000 --- a/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/COPYING.LESSER b/COPYING.LESSER deleted file mode 100644 index 65c5ca88..00000000 --- a/COPYING.LESSER +++ /dev/null @@ -1,165 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..2d1d23e1 --- /dev/null +++ b/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2010, Met Office. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.rst b/README.rst index c0b9e618..fb0c6d94 100644 --- a/README.rst +++ b/README.rst @@ -5,19 +5,7 @@ iris-grib GRIB interface for `Iris `_. -Code ----- -iris-grib is licenced under the GNU Lesser General Public License (LGPLv3). - -The full text of the licence can be found in the COPYING and COPYING.LESSER -files. - -Copyright and licence ---------------------- -iris-grib may be freely distributed, modified and used commercially under the -terms of its `GNU LGPLv3 license `_. - -\(C) British Crown Copyright 2010 - 2021, Met Office +iris-grib is licensed under the BSD-3 license. .. |CirrusCI| image:: https://api.cirrus-ci.com/github/SciTools/iris-grib.svg?branch=main .. _CirrusCI: https://cirrus-ci.com/github/SciTools/iris-grib @@ -31,8 +19,8 @@ terms of its `GNU LGPLv3 license `_. .. |pypi| image:: https://img.shields.io/pypi/v/iris-grib?color=orange&label=pypi&logo=python&logoColor=white .. _pypi: https://pypi.org/project/iris-grib -.. |License| image:: https://img.shields.io/github/license/SciTools/iris-grib?style=plastic -.. _License: https://github.com/SciTools/iris-grib/blob/main/COPYING +.. |License| image:: https://img.shields.io/badge/BSD-3?style=plastic&label=License +.. _License: https://github.com/SciTools/iris-grib/blob/main/LICENSE .. |Contributors| image:: https://img.shields.io/github/contributors/SciTools/iris-grib?style=plastic .. _Contributors: https://github.com/SciTools/iris-grib/graphs/contributors diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index c22f59aa..31992724 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Conversion of cubes to/from GRIB. diff --git a/iris_grib/_grib1_load_rules.py b/iris_grib/_grib1_load_rules.py index 8a82d10a..73afe5aa 100644 --- a/iris_grib/_grib1_load_rules.py +++ b/iris_grib/_grib1_load_rules.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. # Historically this was auto-generated from # SciTools/iris-code-generators:tools/gen_rules.py diff --git a/iris_grib/_grib_cf_map.py b/iris_grib/_grib_cf_map.py index eb830635..554be6ea 100644 --- a/iris_grib/_grib_cf_map.py +++ b/iris_grib/_grib_cf_map.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Provides GRIB/CF phenomenon translations. diff --git a/iris_grib/_iris_mercator_support.py b/iris_grib/_iris_mercator_support.py index 1e25758e..741ef26d 100644 --- a/iris_grib/_iris_mercator_support.py +++ b/iris_grib/_iris_mercator_support.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Temporary module to check for the extended Mercator class in Iris, which iris-grib requires for its Mercator support. diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index b470c843..940beae7 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Module to support the loading and convertion of a GRIB2 message into cube metadata. diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index a0b26c50..ceb2602d 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Grib save implementation. diff --git a/iris_grib/grib_phenom_translation.py b/iris_grib/grib_phenom_translation.py index 9a814db6..56f98017 100644 --- a/iris_grib/grib_phenom_translation.py +++ b/iris_grib/grib_phenom_translation.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. ''' Provide grib 1 and 2 phenomenon translations to + from CF terms. diff --git a/iris_grib/message.py b/iris_grib/message.py index 4d673ed9..2b78494b 100644 --- a/iris_grib/message.py +++ b/iris_grib/message.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Defines a lightweight wrapper class to wrap a single GRIB message. diff --git a/iris_grib/tests/__init__.py b/iris_grib/tests/__init__.py index 7242a6fd..b33d72c8 100644 --- a/iris_grib/tests/__init__.py +++ b/iris_grib/tests/__init__.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Provides testing capabilities and customisations specific to iris-grib. diff --git a/iris_grib/tests/integration/__init__.py b/iris_grib/tests/integration/__init__.py index bd0dcb75..1fed643a 100644 --- a/iris_grib/tests/integration/__init__.py +++ b/iris_grib/tests/integration/__init__.py @@ -1,6 +1,5 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """Integration tests for the :mod:`iris_grib` package.""" diff --git a/iris_grib/tests/integration/format_interop/__init__.py b/iris_grib/tests/integration/format_interop/__init__.py index 4596852a..9693b501 100644 --- a/iris_grib/tests/integration/format_interop/__init__.py +++ b/iris_grib/tests/integration/format_interop/__init__.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Integration tests for format interoperability. diff --git a/iris_grib/tests/integration/format_interop/test_name_grib.py b/iris_grib/tests/integration/format_interop/test_name_grib.py index 15b82142..eb5366c4 100644 --- a/iris_grib/tests/integration/format_interop/test_name_grib.py +++ b/iris_grib/tests/integration/format_interop/test_name_grib.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """Integration tests for NAME to GRIB2 interoperability.""" # Import iris_grib.tests first so that some things can be initialised before diff --git a/iris_grib/tests/integration/format_interop/test_pp_grib.py b/iris_grib/tests/integration/format_interop/test_pp_grib.py index 59b8ce54..a4e031f4 100644 --- a/iris_grib/tests/integration/format_interop/test_pp_grib.py +++ b/iris_grib/tests/integration/format_interop/test_pp_grib.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """Integration tests for PP/GRIB interoperability.""" # Import iris_grib.tests first so that some things can be initialised before diff --git a/iris_grib/tests/integration/iris_integration/__init__.py b/iris_grib/tests/integration/iris_integration/__init__.py index c565a437..3ef39cbf 100644 --- a/iris_grib/tests/integration/iris_integration/__init__.py +++ b/iris_grib/tests/integration/iris_integration/__init__.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Integration tests confirming that iris functionality is working with GRIB files. diff --git a/iris_grib/tests/integration/iris_integration/test_callback.py b/iris_grib/tests/integration/iris_integration/test_callback.py index ca2d739c..c523de3a 100644 --- a/iris_grib/tests/integration/iris_integration/test_callback.py +++ b/iris_grib/tests/integration/iris_integration/test_callback.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Test that iris load callbacks work with iris-grib. diff --git a/iris_grib/tests/integration/iris_integration/test_pickle_message.py b/iris_grib/tests/integration/iris_integration/test_pickle_message.py index b44444b0..bbd0c4b0 100644 --- a/iris_grib/tests/integration/iris_integration/test_pickle_message.py +++ b/iris_grib/tests/integration/iris_integration/test_pickle_message.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """Check that a GribMessage can be pickled.""" # Import iris_grib.tests first so that some things can be initialised before diff --git a/iris_grib/tests/integration/load_convert/__init__.py b/iris_grib/tests/integration/load_convert/__init__.py index a64cb041..c732201a 100644 --- a/iris_grib/tests/integration/load_convert/__init__.py +++ b/iris_grib/tests/integration/load_convert/__init__.py @@ -1,6 +1,5 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """Integration tests for the :mod:`iris_grib._load_convert` package.""" diff --git a/iris_grib/tests/integration/load_convert/test_data_section.py b/iris_grib/tests/integration/load_convert/test_data_section.py index 9aa8583e..9631cae7 100644 --- a/iris_grib/tests/integration/load_convert/test_data_section.py +++ b/iris_grib/tests/integration/load_convert/test_data_section.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Integration tests to confirm data is loaded correctly. diff --git a/iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py b/iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py index b2f42e8f..184b618c 100644 --- a/iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py +++ b/iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Integration test for loading hybrid height data. diff --git a/iris_grib/tests/integration/load_convert/test_product_definition_section.py b/iris_grib/tests/integration/load_convert/test_product_definition_section.py index 741a4d63..b7a81b03 100644 --- a/iris_grib/tests/integration/load_convert/test_product_definition_section.py +++ b/iris_grib/tests/integration/load_convert/test_product_definition_section.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Integration tests for loading various production definitions. diff --git a/iris_grib/tests/integration/load_convert/test_sample_file_loads.py b/iris_grib/tests/integration/load_convert/test_sample_file_loads.py index a947d69e..3f07082b 100644 --- a/iris_grib/tests/integration/load_convert/test_sample_file_loads.py +++ b/iris_grib/tests/integration/load_convert/test_sample_file_loads.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Integration tests for grib2 file loading. diff --git a/iris_grib/tests/integration/round_trip/__init__.py b/iris_grib/tests/integration/round_trip/__init__.py index 9339eb23..f14beb58 100644 --- a/iris_grib/tests/integration/round_trip/__init__.py +++ b/iris_grib/tests/integration/round_trip/__init__.py @@ -1,6 +1,5 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """Round-trip integration tests for the :mod:`iris-grib` package.""" diff --git a/iris_grib/tests/integration/round_trip/test_WAFC_mapping_round_trip.py b/iris_grib/tests/integration/round_trip/test_WAFC_mapping_round_trip.py index 82d8e845..ac76c89c 100644 --- a/iris_grib/tests/integration/round_trip/test_WAFC_mapping_round_trip.py +++ b/iris_grib/tests/integration/round_trip/test_WAFC_mapping_round_trip.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Integration test for round-trip loading and saving of hybrid height and hybrid pressure cubes. diff --git a/iris_grib/tests/integration/round_trip/test_grid_definition_section.py b/iris_grib/tests/integration/round_trip/test_grid_definition_section.py index 7a3c508c..06cfd342 100644 --- a/iris_grib/tests/integration/round_trip/test_grid_definition_section.py +++ b/iris_grib/tests/integration/round_trip/test_grid_definition_section.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Integration test for round-trip loading and saving of various grids. diff --git a/iris_grib/tests/integration/round_trip/test_hybrid_coords_round_trip.py b/iris_grib/tests/integration/round_trip/test_hybrid_coords_round_trip.py index bf053fe4..578eaee7 100644 --- a/iris_grib/tests/integration/round_trip/test_hybrid_coords_round_trip.py +++ b/iris_grib/tests/integration/round_trip/test_hybrid_coords_round_trip.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Integration test for round-trip loading and saving of hybrid height and hybrid pressure cubes. diff --git a/iris_grib/tests/integration/round_trip/test_product_definition_section.py b/iris_grib/tests/integration/round_trip/test_product_definition_section.py index 72721380..0b33fdc5 100644 --- a/iris_grib/tests/integration/round_trip/test_product_definition_section.py +++ b/iris_grib/tests/integration/round_trip/test_product_definition_section.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Integration tests for round-trip loading and saving various product definitions. diff --git a/iris_grib/tests/integration/save_rules/__init__.py b/iris_grib/tests/integration/save_rules/__init__.py index fdaf4485..c1cf7ae8 100644 --- a/iris_grib/tests/integration/save_rules/__init__.py +++ b/iris_grib/tests/integration/save_rules/__init__.py @@ -1,6 +1,5 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """Unit tests for the :mod:`iris_grib._save_rules` package.""" diff --git a/iris_grib/tests/integration/save_rules/test_grib_save.py b/iris_grib/tests/integration/save_rules/test_grib_save.py index 2a71eacb..0d5f7c90 100644 --- a/iris_grib/tests/integration/save_rules/test_grib_save.py +++ b/iris_grib/tests/integration/save_rules/test_grib_save.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Tests for specific implementation aspects of the grib saver. Ported here from 'iris.tests.integration.test_grib_save'. diff --git a/iris_grib/tests/integration/save_rules/test_grid_definition_section.py b/iris_grib/tests/integration/save_rules/test_grid_definition_section.py index 64de2775..3f5f586f 100644 --- a/iris_grib/tests/integration/save_rules/test_grid_definition_section.py +++ b/iris_grib/tests/integration/save_rules/test_grid_definition_section.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Integration tests for :func:`iris_grib._save_rules.grid_definition_section` to confirm that the correct grid_definition_template is being selected. diff --git a/iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py b/iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py index 9b1525b7..5ed377f1 100644 --- a/iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py +++ b/iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Unit tests for :func:`iris_grib._save_rules.data_section`. diff --git a/iris_grib/tests/runner/__init__.py b/iris_grib/tests/runner/__init__.py index c9ef7b89..c3bac50a 100644 --- a/iris_grib/tests/runner/__init__.py +++ b/iris_grib/tests/runner/__init__.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Empty file to allow import. diff --git a/iris_grib/tests/runner/__main__.py b/iris_grib/tests/runner/__main__.py index cb44fc10..bc24db19 100644 --- a/iris_grib/tests/runner/__main__.py +++ b/iris_grib/tests/runner/__main__.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Provides testing capabilities for installed copies of iris-grib. diff --git a/iris_grib/tests/runner/_runner.py b/iris_grib/tests/runner/_runner.py index 4648c436..7c13c8e8 100644 --- a/iris_grib/tests/runner/_runner.py +++ b/iris_grib/tests/runner/_runner.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Provides testing capabilities for installed copies of iris-grib. diff --git a/iris_grib/tests/test_license_headers.py b/iris_grib/tests/test_license_headers.py index 68bffb01..1ac0d92d 100644 --- a/iris_grib/tests/test_license_headers.py +++ b/iris_grib/tests/test_license_headers.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Unit tests for iris-grib license header conformance. @@ -19,9 +18,8 @@ LICENSE_TEMPLATE = """# Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details.""" +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details.""" # Guess iris-grib repo directory of Iris-grib - realpath is used to mitigate # against Python finding the iris-grib package via a symlink. diff --git a/iris_grib/tests/test_pep8.py b/iris_grib/tests/test_pep8.py index 05ef4a39..228aa0d4 100644 --- a/iris_grib/tests/test_pep8.py +++ b/iris_grib/tests/test_pep8.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Unit tests for iris-grib pep8 conformance. diff --git a/iris_grib/tests/unit/__init__.py b/iris_grib/tests/unit/__init__.py index 8af062e3..27f39ec1 100644 --- a/iris_grib/tests/unit/__init__.py +++ b/iris_grib/tests/unit/__init__.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """Unit tests for the :mod:`iris_grib` package.""" # import iris_grib.tests first so that some things can be initialised diff --git a/iris_grib/tests/unit/grib1_load_rules/__init__.py b/iris_grib/tests/unit/grib1_load_rules/__init__.py index 310c6b68..6cefe241 100644 --- a/iris_grib/tests/unit/grib1_load_rules/__init__.py +++ b/iris_grib/tests/unit/grib1_load_rules/__init__.py @@ -1,6 +1,5 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """Unit tests for the :mod:`iris_grib._grib1_load_rules` module.""" diff --git a/iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py b/iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py index f99525ad..327f6b65 100644 --- a/iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py +++ b/iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """Unit tests for :func:`iris_grib._grib1_load_rules.grib1_convert`.""" # Import iris_grib.tests first so that some things can be initialised before diff --git a/iris_grib/tests/unit/grib1_load_rules/test_grib1_load_translations.py b/iris_grib/tests/unit/grib1_load_rules/test_grib1_load_translations.py index 82471943..6f63a1cd 100644 --- a/iris_grib/tests/unit/grib1_load_rules/test_grib1_load_translations.py +++ b/iris_grib/tests/unit/grib1_load_rules/test_grib1_load_translations.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Tests for specific implementation aspects of the grib loaders. Old, and GRIB-1 specific. diff --git a/iris_grib/tests/unit/grib_phenom_translation/__init__.py b/iris_grib/tests/unit/grib_phenom_translation/__init__.py index 049526a1..a0167a36 100644 --- a/iris_grib/tests/unit/grib_phenom_translation/__init__.py +++ b/iris_grib/tests/unit/grib_phenom_translation/__init__.py @@ -1,6 +1,5 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """Unit tests for the :mod:`iris_grib.grib_phenom_translation` package.""" diff --git a/iris_grib/tests/unit/grib_phenom_translation/test_grib_phenom_translation.py b/iris_grib/tests/unit/grib_phenom_translation/test_grib_phenom_translation.py index 88a6e627..519d7638 100644 --- a/iris_grib/tests/unit/grib_phenom_translation/test_grib_phenom_translation.py +++ b/iris_grib/tests/unit/grib_phenom_translation/test_grib_phenom_translation.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. ''' Unit tests for the mod:`iris_grib.grib_phenom_translation` module. diff --git a/iris_grib/tests/unit/load_convert/__init__.py b/iris_grib/tests/unit/load_convert/__init__.py index 782689ab..4fecf59e 100644 --- a/iris_grib/tests/unit/load_convert/__init__.py +++ b/iris_grib/tests/unit/load_convert/__init__.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """Unit tests for the :mod:`iris_grib._load_convert` package.""" # import iris_grib.tests first so that some things can be initialised diff --git a/iris_grib/tests/unit/load_convert/test__hindcast_fix.py b/iris_grib/tests/unit/load_convert/test__hindcast_fix.py index 3bfbc533..1d611fba 100644 --- a/iris_grib/tests/unit/load_convert/test__hindcast_fix.py +++ b/iris_grib/tests/unit/load_convert/test__hindcast_fix.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Tests for function :func:`iris_grib._load_convert._hindcast_fix`. diff --git a/iris_grib/tests/unit/load_convert/test_bitmap_section.py b/iris_grib/tests/unit/load_convert/test_bitmap_section.py index 2656d5f9..64a24bd5 100644 --- a/iris_grib/tests/unit/load_convert/test_bitmap_section.py +++ b/iris_grib/tests/unit/load_convert/test_bitmap_section.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Test function :func:`iris_grib._load_convert.bitmap_section.` diff --git a/iris_grib/tests/unit/load_convert/test_calculate_increment.py b/iris_grib/tests/unit/load_convert/test_calculate_increment.py index e43d93d9..71dc27d4 100644 --- a/iris_grib/tests/unit/load_convert/test_calculate_increment.py +++ b/iris_grib/tests/unit/load_convert/test_calculate_increment.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Unit tests for `iris_grib._load_convert._calculate_increment`. diff --git a/iris_grib/tests/unit/load_convert/test_convert.py b/iris_grib/tests/unit/load_convert/test_convert.py index 3a507152..b50f669c 100644 --- a/iris_grib/tests/unit/load_convert/test_convert.py +++ b/iris_grib/tests/unit/load_convert/test_convert.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """Test function :func:`iris_grib._load_convert.convert`.""" # import iris_grib.tests first so that some things can be initialised diff --git a/iris_grib/tests/unit/load_convert/test_data_cutoff.py b/iris_grib/tests/unit/load_convert/test_data_cutoff.py index be166c43..03a4911e 100644 --- a/iris_grib/tests/unit/load_convert/test_data_cutoff.py +++ b/iris_grib/tests/unit/load_convert/test_data_cutoff.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Tests for function :func:`iris_grib._load_convert.data_cutoff`. diff --git a/iris_grib/tests/unit/load_convert/test_data_representation_section.py b/iris_grib/tests/unit/load_convert/test_data_representation_section.py index e4992ed5..094aa91f 100644 --- a/iris_grib/tests/unit/load_convert/test_data_representation_section.py +++ b/iris_grib/tests/unit/load_convert/test_data_representation_section.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Test function :func:`iris_grib._load_convert.data_representation_section.` diff --git a/iris_grib/tests/unit/load_convert/test_ellipsoid.py b/iris_grib/tests/unit/load_convert/test_ellipsoid.py index 222e706e..bf3c3d2f 100644 --- a/iris_grib/tests/unit/load_convert/test_ellipsoid.py +++ b/iris_grib/tests/unit/load_convert/test_ellipsoid.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Test function :func:`iris_grib._load_convert.ellipsoid. diff --git a/iris_grib/tests/unit/load_convert/test_ellipsoid_geometry.py b/iris_grib/tests/unit/load_convert/test_ellipsoid_geometry.py index f755022b..3f7e8b74 100644 --- a/iris_grib/tests/unit/load_convert/test_ellipsoid_geometry.py +++ b/iris_grib/tests/unit/load_convert/test_ellipsoid_geometry.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Test function :func:`iris_grib._load_convert.ellipsoid_geometry. diff --git a/iris_grib/tests/unit/load_convert/test_ensemble_identifier.py b/iris_grib/tests/unit/load_convert/test_ensemble_identifier.py index 97cd7ca1..11ae5edd 100644 --- a/iris_grib/tests/unit/load_convert/test_ensemble_identifier.py +++ b/iris_grib/tests/unit/load_convert/test_ensemble_identifier.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Test function :func:`iris_grib._load_convert.ensemble_identifier`. diff --git a/iris_grib/tests/unit/load_convert/test_fixup_float32_from_int32.py b/iris_grib/tests/unit/load_convert/test_fixup_float32_from_int32.py index 422a32c8..da02b154 100644 --- a/iris_grib/tests/unit/load_convert/test_fixup_float32_from_int32.py +++ b/iris_grib/tests/unit/load_convert/test_fixup_float32_from_int32.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Unit tests for `iris_grib._load_convert.fixup_float32_from_int32`. diff --git a/iris_grib/tests/unit/load_convert/test_fixup_int32_from_uint32.py b/iris_grib/tests/unit/load_convert/test_fixup_int32_from_uint32.py index 898e2350..6b444568 100644 --- a/iris_grib/tests/unit/load_convert/test_fixup_int32_from_uint32.py +++ b/iris_grib/tests/unit/load_convert/test_fixup_int32_from_uint32.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Unit tests for `iris_grib._load_convert.fixup_int32_from_uint32`. diff --git a/iris_grib/tests/unit/load_convert/test_forecast_period_coord.py b/iris_grib/tests/unit/load_convert/test_forecast_period_coord.py index 2c76c7b3..a932428d 100644 --- a/iris_grib/tests/unit/load_convert/test_forecast_period_coord.py +++ b/iris_grib/tests/unit/load_convert/test_forecast_period_coord.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Test function :func:`iris_grib._load_convert.forecast_period_coord. diff --git a/iris_grib/tests/unit/load_convert/test_generating_process.py b/iris_grib/tests/unit/load_convert/test_generating_process.py index 701c48e0..eca8e15d 100644 --- a/iris_grib/tests/unit/load_convert/test_generating_process.py +++ b/iris_grib/tests/unit/load_convert/test_generating_process.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Tests for function :func:`iris_grib._load_convert.generating_process`. diff --git a/iris_grib/tests/unit/load_convert/test_grib2_convert.py b/iris_grib/tests/unit/load_convert/test_grib2_convert.py index 0c115273..4463195c 100644 --- a/iris_grib/tests/unit/load_convert/test_grib2_convert.py +++ b/iris_grib/tests/unit/load_convert/test_grib2_convert.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """Test function :func:`iris_grib._load_convert.grib2_convert`.""" # import iris_grib.tests first so that some things can be initialised diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_0_and_1.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_0_and_1.py index c1487ff2..8d8be13b 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_0_and_1.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_0_and_1.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Test function :func:`iris_grib._load_convert.grid_definition_template_0_and_1`. diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_10.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_10.py index e2f6a53d..13d17a73 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_10.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_10.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Unit tests for :func:`iris_grib._load_convert.grid_definition_template_10`. diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_12.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_12.py index 6e21230b..f75b63ae 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_12.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_12.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Unit tests for :func:`iris_grib._load_convert.grid_definition_template_12`. diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_140.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_140.py index 9abf0c7a..95e4328b 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_140.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_140.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Unit tests for :func:`iris_grib._load_convert.grid_definition_template_140`. diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_20.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_20.py index 2cfb62be..3eb17c25 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_20.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_20.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Unit tests for :func:`iris_grib._load_convert.grid_definition_template_20`. diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_30.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_30.py index e42a41d9..a52a33e2 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_30.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_30.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Unit tests for :func:`iris_grib._load_convert.grid_definition_template_30`. diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_40.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_40.py index 441d01e3..a05d4181 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_40.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_40.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Unit tests for :func:`iris_grib._load_convert.grid_definition_template_40`. diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_4_and_5.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_4_and_5.py index 913e1d1f..c7114e65 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_4_and_5.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_4_and_5.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Test function :func:`iris_grib._load_convert.grid_definition_template_4_and_5`. diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_5.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_5.py index 059c8e24..90994294 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_5.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_5.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Test function :func:`iris_grib._load_convert.grid_definition_template_5`. diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_90.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_90.py index 5d1e2f50..cdbf0fd9 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_90.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_90.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Unit tests for :func:`iris_grib._load_convert.grid_definition_template_90`. diff --git a/iris_grib/tests/unit/load_convert/test_other_time_coord.py b/iris_grib/tests/unit/load_convert/test_other_time_coord.py index 0e5ccc70..ecac767c 100644 --- a/iris_grib/tests/unit/load_convert/test_other_time_coord.py +++ b/iris_grib/tests/unit/load_convert/test_other_time_coord.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Test function :func:`iris_grib._load_convert.other_time_coord. diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_section.py b/iris_grib/tests/unit/load_convert/test_product_definition_section.py index a1b3ea93..b3164cff 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_section.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_section.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Tests for `iris_grib._load_convert.product_definition_section`. diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_0.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_0.py index ca0e3ca9..42593b54 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_0.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_0.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Test function :func:`iris_grib._load_convert.product_definition_template_0`. diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_1.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_1.py index b0dc55ad..2c607ba1 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_1.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_1.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Test function :func:`iris_grib._load_convert.product_definition_template_1`. diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_10.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_10.py index fadabb5a..741ed85f 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_10.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_10.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Test function :func:`iris_grib._load_convert.product_definition_template_10`. diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_11.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_11.py index f35f30ef..5df27d71 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_11.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_11.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Test function :func:`iris_grib._load_convert.product_definition_template_11`. diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py index 92a703b2..5ac92f69 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Test function :func:`iris_grib._load_convert.product_definition_template_15`. diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_31.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_31.py index dcb935b2..05a2ab08 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_31.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_31.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Tests for `iris_grib._load_convert.product_definition_template_31`. diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_32.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_32.py index be992d3b..c60e98c5 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_32.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_32.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Tests for `iris_grib._load_convert.product_definition_template_32`. diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_40.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_40.py index f436e741..8e9275d4 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_40.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_40.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Test function :func:`iris_grib._load_convert.product_definition_template_40`. diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_8.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_8.py index 311c9c0c..e2ab0e48 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_8.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_8.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Tests for function :func:`iris_grib._load_convert.product_definition_template_8`. diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_9.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_9.py index 1254e72d..83bfbe30 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_9.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_9.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Tests for function :func:`iris_grib._load_convert.product_definition_template_9`. diff --git a/iris_grib/tests/unit/load_convert/test_projection_centre.py b/iris_grib/tests/unit/load_convert/test_projection_centre.py index 41dddeb4..e2c18d6b 100644 --- a/iris_grib/tests/unit/load_convert/test_projection_centre.py +++ b/iris_grib/tests/unit/load_convert/test_projection_centre.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Test function :func:`iris_grib._load_convert.projection centre. diff --git a/iris_grib/tests/unit/load_convert/test_reference_time_coord.py b/iris_grib/tests/unit/load_convert/test_reference_time_coord.py index 813ce367..76e4c36c 100644 --- a/iris_grib/tests/unit/load_convert/test_reference_time_coord.py +++ b/iris_grib/tests/unit/load_convert/test_reference_time_coord.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Test function :func:`iris_grib._load_convert.reference_time_coord. diff --git a/iris_grib/tests/unit/load_convert/test_resolution_flags.py b/iris_grib/tests/unit/load_convert/test_resolution_flags.py index c409b5bb..dc47e36d 100644 --- a/iris_grib/tests/unit/load_convert/test_resolution_flags.py +++ b/iris_grib/tests/unit/load_convert/test_resolution_flags.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Test function :func:`iris_grib._load_convert.resolution_flags.` diff --git a/iris_grib/tests/unit/load_convert/test_satellite_common.py b/iris_grib/tests/unit/load_convert/test_satellite_common.py index 50c3b5fc..3e1e3dde 100644 --- a/iris_grib/tests/unit/load_convert/test_satellite_common.py +++ b/iris_grib/tests/unit/load_convert/test_satellite_common.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Tests for `iris_grib._load_convert.satellite_common`. diff --git a/iris_grib/tests/unit/load_convert/test_scanning_mode.py b/iris_grib/tests/unit/load_convert/test_scanning_mode.py index add0c839..da554f53 100644 --- a/iris_grib/tests/unit/load_convert/test_scanning_mode.py +++ b/iris_grib/tests/unit/load_convert/test_scanning_mode.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Test function :func:`iris_grib._load_convert.scanning_mode. diff --git a/iris_grib/tests/unit/load_convert/test_statistical_cell_method.py b/iris_grib/tests/unit/load_convert/test_statistical_cell_method.py index 6f6973bd..551b1826 100644 --- a/iris_grib/tests/unit/load_convert/test_statistical_cell_method.py +++ b/iris_grib/tests/unit/load_convert/test_statistical_cell_method.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Tests for function :func:`iris_grib._load_convert.statistical_cell_method`. diff --git a/iris_grib/tests/unit/load_convert/test_statistical_forecast_period_coord.py b/iris_grib/tests/unit/load_convert/test_statistical_forecast_period_coord.py index 7bfc8b82..1873597d 100644 --- a/iris_grib/tests/unit/load_convert/test_statistical_forecast_period_coord.py +++ b/iris_grib/tests/unit/load_convert/test_statistical_forecast_period_coord.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Tests for function :func:`iris_grib._load_convert.statistical_forecast_period`. diff --git a/iris_grib/tests/unit/load_convert/test_time_range_unit.py b/iris_grib/tests/unit/load_convert/test_time_range_unit.py index a87de483..ffe09250 100644 --- a/iris_grib/tests/unit/load_convert/test_time_range_unit.py +++ b/iris_grib/tests/unit/load_convert/test_time_range_unit.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Test function :func:`iris_grib._load_convert.time_range_unit. diff --git a/iris_grib/tests/unit/load_convert/test_translate_phenomenon.py b/iris_grib/tests/unit/load_convert/test_translate_phenomenon.py index 49c30f85..5c3ea934 100644 --- a/iris_grib/tests/unit/load_convert/test_translate_phenomenon.py +++ b/iris_grib/tests/unit/load_convert/test_translate_phenomenon.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Tests for function :func:`iris_grib._load_convert.translate_phenomenon`. diff --git a/iris_grib/tests/unit/load_convert/test_unscale.py b/iris_grib/tests/unit/load_convert/test_unscale.py index c7098b17..a3f615bb 100644 --- a/iris_grib/tests/unit/load_convert/test_unscale.py +++ b/iris_grib/tests/unit/load_convert/test_unscale.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Test function :func:`iris_grib._load_convert.unscale. diff --git a/iris_grib/tests/unit/load_convert/test_validity_time_coord.py b/iris_grib/tests/unit/load_convert/test_validity_time_coord.py index e6aa84aa..e3ba9c69 100644 --- a/iris_grib/tests/unit/load_convert/test_validity_time_coord.py +++ b/iris_grib/tests/unit/load_convert/test_validity_time_coord.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Test function :func:`iris_grib._load_convert.validity_time_coord. diff --git a/iris_grib/tests/unit/load_convert/test_vertical_coords.py b/iris_grib/tests/unit/load_convert/test_vertical_coords.py index e7455297..2f77c0b8 100644 --- a/iris_grib/tests/unit/load_convert/test_vertical_coords.py +++ b/iris_grib/tests/unit/load_convert/test_vertical_coords.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Test function :func:`iris_grib._load_convert.vertical_coords`. diff --git a/iris_grib/tests/unit/message/__init__.py b/iris_grib/tests/unit/message/__init__.py index 3903dabb..64aa75a8 100644 --- a/iris_grib/tests/unit/message/__init__.py +++ b/iris_grib/tests/unit/message/__init__.py @@ -1,6 +1,5 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """Unit tests for the :mod:`iris_grib.message` package.""" diff --git a/iris_grib/tests/unit/message/test_GribMessage.py b/iris_grib/tests/unit/message/test_GribMessage.py index f4062754..12318b93 100644 --- a/iris_grib/tests/unit/message/test_GribMessage.py +++ b/iris_grib/tests/unit/message/test_GribMessage.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Unit tests for the `iris_grib.message.GribMessage` class. diff --git a/iris_grib/tests/unit/message/test_Section.py b/iris_grib/tests/unit/message/test_Section.py index 76e9e043..b2f842fa 100644 --- a/iris_grib/tests/unit/message/test_Section.py +++ b/iris_grib/tests/unit/message/test_Section.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Unit tests for `iris_grib.message.Section`. diff --git a/iris_grib/tests/unit/message/test__DataProxy.py b/iris_grib/tests/unit/message/test__DataProxy.py index d2de3266..3b3c103b 100644 --- a/iris_grib/tests/unit/message/test__DataProxy.py +++ b/iris_grib/tests/unit/message/test__DataProxy.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Unit tests for the `iris.message._DataProxy` class. diff --git a/iris_grib/tests/unit/message/test__MessageLocation.py b/iris_grib/tests/unit/message/test__MessageLocation.py index 420de95a..890a1a87 100644 --- a/iris_grib/tests/unit/message/test__MessageLocation.py +++ b/iris_grib/tests/unit/message/test__MessageLocation.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Unit tests for the `iris.message._MessageLocation` class. diff --git a/iris_grib/tests/unit/message/test__RawGribMessage.py b/iris_grib/tests/unit/message/test__RawGribMessage.py index cb839b8b..9f35ba0f 100644 --- a/iris_grib/tests/unit/message/test__RawGribMessage.py +++ b/iris_grib/tests/unit/message/test__RawGribMessage.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Unit tests for the `iris_grib.message._RawGribMessage` class. diff --git a/iris_grib/tests/unit/save_rules/__init__.py b/iris_grib/tests/unit/save_rules/__init__.py index 0d42e82c..7ccfb2ac 100644 --- a/iris_grib/tests/unit/save_rules/__init__.py +++ b/iris_grib/tests/unit/save_rules/__init__.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """Unit tests for the :mod:`iris_grib.grib_save_rules` module.""" # Import iris_grib.tests first so that some things can be initialised before diff --git a/iris_grib/tests/unit/save_rules/test__missing_forecast_period.py b/iris_grib/tests/unit/save_rules/test__missing_forecast_period.py index 46775502..6e427f00 100644 --- a/iris_grib/tests/unit/save_rules/test__missing_forecast_period.py +++ b/iris_grib/tests/unit/save_rules/test__missing_forecast_period.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Unit tests for :func:`iris_grib._save_rules._missing_forecast_period.` diff --git a/iris_grib/tests/unit/save_rules/test__non_missing_forecast_period.py b/iris_grib/tests/unit/save_rules/test__non_missing_forecast_period.py index cced408f..2595526b 100644 --- a/iris_grib/tests/unit/save_rules/test__non_missing_forecast_period.py +++ b/iris_grib/tests/unit/save_rules/test__non_missing_forecast_period.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """Unit tests for module-level functions.""" # Import iris_grib.tests first so that some things can be initialised before diff --git a/iris_grib/tests/unit/save_rules/test__product_definition_template_8_10_and_11.py b/iris_grib/tests/unit/save_rules/test__product_definition_template_8_10_and_11.py index 0e55f271..82a3c7f9 100644 --- a/iris_grib/tests/unit/save_rules/test__product_definition_template_8_10_and_11.py +++ b/iris_grib/tests/unit/save_rules/test__product_definition_template_8_10_and_11.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Unit tests for :func:`iris_grib._save_rules._product_definition_template_8_10_and_11` diff --git a/iris_grib/tests/unit/save_rules/test_data_section.py b/iris_grib/tests/unit/save_rules/test_data_section.py index 0b3f1ab0..22add2e6 100644 --- a/iris_grib/tests/unit/save_rules/test_data_section.py +++ b/iris_grib/tests/unit/save_rules/test_data_section.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Unit tests for :func:`iris_grib._save_rules.data_section`. diff --git a/iris_grib/tests/unit/save_rules/test_fixup_float32_as_int32.py b/iris_grib/tests/unit/save_rules/test_fixup_float32_as_int32.py index 0357e6f4..3354a6b5 100644 --- a/iris_grib/tests/unit/save_rules/test_fixup_float32_as_int32.py +++ b/iris_grib/tests/unit/save_rules/test_fixup_float32_as_int32.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Unit tests for `iris_grib._save_rules.fixup_float32_as_int32`. diff --git a/iris_grib/tests/unit/save_rules/test_fixup_int32_as_uint32.py b/iris_grib/tests/unit/save_rules/test_fixup_int32_as_uint32.py index b885be15..a9928eee 100644 --- a/iris_grib/tests/unit/save_rules/test_fixup_int32_as_uint32.py +++ b/iris_grib/tests/unit/save_rules/test_fixup_int32_as_uint32.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Unit tests for `iris_grib._save_rules.fixup_int32_as_uint32`. diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_0.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_0.py index 4784cfa3..83075d87 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_template_0.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_0.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Unit tests for :meth:`iris_grib._save_rules.grid_definition_template_0`. diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_1.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_1.py index f1ce1215..53d1ce89 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_template_1.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_1.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Unit tests for :meth:`iris_grib._save_rules.grid_definition_template_1`. diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py index e509a4f1..d83e420d 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Unit tests for :meth:`iris_grib._save_rules.grid_definition_template_10`. diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_12.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_12.py index 2cead106..caad0a99 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_template_12.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_12.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Unit tests for :meth:`iris_grib._save_rules.grid_definition_template_12`. diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_30.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_30.py index 8437ca31..49a627cf 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_template_30.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_30.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Unit tests for :meth:`iris_grib._save_rules.grid_definition_template_30`. diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_4.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_4.py index ebb707fe..6a07f776 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_template_4.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_4.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Unit tests for :func:`iris_grib._save_rules.grid_definition_template_4`. diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_5.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_5.py index a47e3100..ae105785 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_template_5.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_5.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Unit tests for :meth:`iris_grib._save_rules.grid_definition_template_5`. diff --git a/iris_grib/tests/unit/save_rules/test_identification.py b/iris_grib/tests/unit/save_rules/test_identification.py index c3676e15..63ef01ef 100644 --- a/iris_grib/tests/unit/save_rules/test_identification.py +++ b/iris_grib/tests/unit/save_rules/test_identification.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """Unit tests for `iris_grib.grib_save_rules.identification`.""" # Import iris_grib.tests first so that some things can be initialised before diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_1.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_1.py index 3f8d84ff..fad9f5cd 100644 --- a/iris_grib/tests/unit/save_rules/test_product_definition_template_1.py +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_1.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Unit tests for :func:`iris_grib._save_rules.product_definition_template_1` diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_10.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_10.py index 42acbe7f..93355da8 100644 --- a/iris_grib/tests/unit/save_rules/test_product_definition_template_10.py +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_10.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Unit tests for :func:`iris_grib._save_rules.product_definition_template_10` diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_11.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_11.py index 82e56af7..6c0c2dc0 100644 --- a/iris_grib/tests/unit/save_rules/test_product_definition_template_11.py +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_11.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Unit tests for :func:`iris_grib._save_rules.product_definition_template_11` diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py index 8286bd7d..8da31e0a 100644 --- a/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Unit tests for :func:`iris_grib._save_rules.product_definition_template_15` diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_40.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_40.py index 0f6d34e3..f247d32b 100644 --- a/iris_grib/tests/unit/save_rules/test_product_definition_template_40.py +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_40.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Unit tests for :func:`iris_grib._save_rules.product_definition_template_40` diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_8.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_8.py index 3c539e2f..2c5ba3ef 100644 --- a/iris_grib/tests/unit/save_rules/test_product_definition_template_8.py +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_8.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Unit tests for :func:`iris_grib._save_rules.product_definition_template_8` diff --git a/iris_grib/tests/unit/save_rules/test_reference_time.py b/iris_grib/tests/unit/save_rules/test_reference_time.py index d5cf6197..3c31f11d 100644 --- a/iris_grib/tests/unit/save_rules/test_reference_time.py +++ b/iris_grib/tests/unit/save_rules/test_reference_time.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """Unit tests for `iris_grib.grib_save_rules.reference_time`.""" # Import iris_grib.tests first so that some things can be initialised before diff --git a/iris_grib/tests/unit/save_rules/test_set_discipline_and_parameter.py b/iris_grib/tests/unit/save_rules/test_set_discipline_and_parameter.py index 83728084..9daa8bf3 100644 --- a/iris_grib/tests/unit/save_rules/test_set_discipline_and_parameter.py +++ b/iris_grib/tests/unit/save_rules/test_set_discipline_and_parameter.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """Unit tests for `iris_grib.grib_save_rules.set_discipline_and_parameter`.""" # Import iris_grib.tests first so that some things can be initialised before # importing anything else. diff --git a/iris_grib/tests/unit/save_rules/test_set_fixed_surfaces.py b/iris_grib/tests/unit/save_rules/test_set_fixed_surfaces.py index 13c3ef6d..262da42f 100644 --- a/iris_grib/tests/unit/save_rules/test_set_fixed_surfaces.py +++ b/iris_grib/tests/unit/save_rules/test_set_fixed_surfaces.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Unit tests for :func:`iris_grib._save_rules.set_fixed_surfaces`. diff --git a/iris_grib/tests/unit/save_rules/test_set_time_increment.py b/iris_grib/tests/unit/save_rules/test_set_time_increment.py index ec0272d4..4ff6f14e 100644 --- a/iris_grib/tests/unit/save_rules/test_set_time_increment.py +++ b/iris_grib/tests/unit/save_rules/test_set_time_increment.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Unit tests for :func:`iris_grib._save_rules.set_time_increment` diff --git a/iris_grib/tests/unit/save_rules/test_set_time_range.py b/iris_grib/tests/unit/save_rules/test_set_time_range.py index cadbb58a..a7e0bace 100644 --- a/iris_grib/tests/unit/save_rules/test_set_time_range.py +++ b/iris_grib/tests/unit/save_rules/test_set_time_range.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Unit tests for :func:`iris_grib._save_rules.set_time_range` diff --git a/iris_grib/tests/unit/test_GribWrapper.py b/iris_grib/tests/unit/test_GribWrapper.py index d3d5964e..1b775298 100644 --- a/iris_grib/tests/unit/test_GribWrapper.py +++ b/iris_grib/tests/unit/test_GribWrapper.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Unit tests for the `iris_grib.GribWrapper` class. diff --git a/iris_grib/tests/unit/test__load_generate.py b/iris_grib/tests/unit/test__load_generate.py index ed2610f8..882d5b02 100644 --- a/iris_grib/tests/unit/test__load_generate.py +++ b/iris_grib/tests/unit/test__load_generate.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """Unit tests for the `iris_grib._load_generate` function.""" import iris_grib.tests as tests diff --git a/iris_grib/tests/unit/test_load_cubes.py b/iris_grib/tests/unit/test_load_cubes.py index 440e2707..32f6efba 100644 --- a/iris_grib/tests/unit/test_load_cubes.py +++ b/iris_grib/tests/unit/test_load_cubes.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """Unit tests for the `iris_grib.load_cubes` function.""" import iris_grib.tests as tests diff --git a/iris_grib/tests/unit/test_load_pairs_from_fields.py b/iris_grib/tests/unit/test_load_pairs_from_fields.py index 9f429154..344e893b 100644 --- a/iris_grib/tests/unit/test_load_pairs_from_fields.py +++ b/iris_grib/tests/unit/test_load_pairs_from_fields.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """Unit tests for the `iris_grib.load_pairs_from_fields` function.""" import iris_grib.tests as tests diff --git a/iris_grib/tests/unit/test_save_grib2.py b/iris_grib/tests/unit/test_save_grib2.py index 9b449c0b..9b8f6423 100644 --- a/iris_grib/tests/unit/test_save_grib2.py +++ b/iris_grib/tests/unit/test_save_grib2.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """Unit tests for the `iris_grib.save_grib2` function.""" # Import iris_grib.tests first so that some things can be initialised before diff --git a/iris_grib/tests/unit/test_save_messages.py b/iris_grib/tests/unit/test_save_messages.py index 4b42272b..37c3f71e 100644 --- a/iris_grib/tests/unit/test_save_messages.py +++ b/iris_grib/tests/unit/test_save_messages.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """Unit tests for the `iris_grib.save_messages` function.""" # Import iris_grib.tests first so that some things can be initialised before diff --git a/noxfile.py b/noxfile.py index a29fcf2e..9e7e41b6 100644 --- a/noxfile.py +++ b/noxfile.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Perform test automation with nox. diff --git a/setup.py b/setup.py index d63511d1..6b2d02b1 100644 --- a/setup.py +++ b/setup.py @@ -79,7 +79,7 @@ def file_walk_relative(top, remove=''): url = 'https://github.com/SciTools/iris-grib', author = 'UK Met Office', author_email = 'scitools-iris@googlegroups.com', - license = 'LGPL', + license = 'BSD', platforms = "Linux, Mac OS X, Windows", keywords = ['iris', 'GRIB'], classifiers=[ From e4946a5fb936b76f961d9b3dc917484caab5a493 Mon Sep 17 00:00:00 2001 From: Valeriu Predoi Date: Mon, 13 Nov 2023 13:41:59 +0000 Subject: [PATCH 237/583] replace deprecated eccodes-python package with new eccodes (#357) --- requirements/core.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/core.txt b/requirements/core.txt index f96770b2..61feef7f 100644 --- a/requirements/core.txt +++ b/requirements/core.txt @@ -1,4 +1,4 @@ # Core dependencies. scitools-iris>=3.0.2 -eccodes-python +eccodes From 0935c04d576f067317f16c4845a7c8902c1aa469 Mon Sep 17 00:00:00 2001 From: Bill Little Date: Wed, 15 Nov 2023 12:29:41 +0000 Subject: [PATCH 238/583] Drop distutils.version for packaging.version (#360) --- iris_grib/_iris_mercator_support.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iris_grib/_iris_mercator_support.py b/iris_grib/_iris_mercator_support.py index 741ef26d..6d23831f 100644 --- a/iris_grib/_iris_mercator_support.py +++ b/iris_grib/_iris_mercator_support.py @@ -8,7 +8,7 @@ """ -import distutils.version +from packaging.version import Version import iris @@ -18,8 +18,8 @@ def confirm_extended_mercator_supported(): # support in the Mercator coord-system. # This is a temporary fix allowing us to state Iris>=2.0 as a dependency, # required for this release because Iris 2.1 is not yet available. - iris_version = distutils.version.LooseVersion(iris.__version__) - min_mercator_version = '2.1.0' + iris_version = Version(iris.__version__) + min_mercator_version = Version('2.1.0') if iris_version < min_mercator_version: msg = 'Support for Mercator projections requires Iris version >= {}' raise ValueError(msg.format(min_mercator_version)) From 8a13288a858ff4cfbbbfbc278168c1355ba00836 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Thu, 16 Nov 2023 13:02:09 +0000 Subject: [PATCH 239/583] [CI Bot] environment lockfiles auto-update (#354) * Updated environment lockfiles * Fix for eccodes>=2.32.1 and python-eccodes>=1.6.1 (#361) * Fix for eccodes>=2.32.1 and python-eccodes>=1.6.1 * Update iris_grib/message.py Co-authored-by: Patrick Peglar --------- Co-authored-by: Patrick Peglar --------- Co-authored-by: Lockfile bot Co-authored-by: Bill Little Co-authored-by: Patrick Peglar --- iris_grib/_save_rules.py | 4 +- iris_grib/message.py | 21 +++- .../test_grid_definition_template_4.py | 4 +- .../test_grid_definition_template_5.py | 4 +- requirements/core.txt | 2 +- requirements/locks/py310-linux-64.lock | 115 ++++++++--------- requirements/locks/py311-linux-64.lock | 113 ++++++++--------- requirements/locks/py39-linux-64.lock | 117 +++++++++--------- requirements/py310.yml | 3 +- requirements/py311.yml | 3 +- requirements/py39.yml | 3 +- 11 files changed, 205 insertions(+), 184 deletions(-) diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index ceb2602d..7e8e2647 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -314,9 +314,9 @@ def latlon_points_irregular(cube, grib): # So, this only works at present if the x and y dimensions are **equal**. lon_values = x_coord.points / _DEFAULT_DEGREES_UNITS lat_values = y_coord.points / _DEFAULT_DEGREES_UNITS - eccodes.codes_set_array(grib, 'longitudes', + eccodes.codes_set_array(grib, 'longitude', np.array(np.round(lon_values), dtype=np.int64)) - eccodes.codes_set_array(grib, 'latitudes', + eccodes.codes_set_array(grib, 'latitude', np.array(np.round(lat_values), dtype=np.int64)) diff --git a/iris_grib/message.py b/iris_grib/message.py index 2b78494b..cf4e9b34 100644 --- a/iris_grib/message.py +++ b/iris_grib/message.py @@ -19,6 +19,14 @@ _SUPPORTED_GRID_DEFINITIONS = (0, 1, 5, 10, 12, 20, 30, 40, 90, 140) +# Alias names for eccodes spatial computed keys. +KEY_ALIAS = { + 'latitude': 'latitudes', + 'longitude': 'longitudes', + 'latitudes': 'latitude', + 'longitudes': 'longitude', +} + class _OpenFileRef: """ @@ -403,12 +411,18 @@ def __getitem__(self, key): if key not in self._cache: if key == 'numberOfSection': value = self._number - elif key not in self._keys: - raise KeyError('{!r} not defined in section {}'.format( - key, self._number)) else: + if key not in self._keys: + key2 = KEY_ALIAS.get(key) + if key2 and key2 in self._keys: + key = key2 + else: + emsg = f"{key} not defined in section {self._number}" + raise KeyError(emsg) value = self._get_key_value(key) + self._cache[key] = value + return self._cache[key] def __setitem__(self, key, value): @@ -436,6 +450,7 @@ def _get_key_value(self, key): 'satelliteNumber', 'instrumentType', 'scaleFactorOfCentralWaveNumber', 'scaledValueOfCentralWaveNumber', + 'longitude', 'latitude', 'longitudes', 'latitudes') if key in vector_keys: res = eccodes.codes_get_array(self._message_id, key) diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_4.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_4.py index 6a07f776..3d5c4f4c 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_template_4.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_4.py @@ -61,8 +61,8 @@ def test__grid_points(self): grid_definition_template_4(test_cube, self.mock_grib) x_longs = np.array(np.round(1e6 * x_floats), dtype=int) y_longs = np.array(np.round(1e6 * y_floats), dtype=int) - self._check_key("longitudes", x_longs) - self._check_key("latitudes", y_longs) + self._check_key("longitude", x_longs) + self._check_key("latitude", y_longs) def test__scanmode(self): grid_definition_template_4(self.test_cube, self.mock_grib) diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_5.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_5.py index ae105785..9d74f8c0 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_template_5.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_5.py @@ -111,8 +111,8 @@ def test__grid_points(self): grid_definition_template_5(test_cube, self.mock_grib) x_longs = np.array(np.round(1e6 * x_floats), dtype=int) y_longs = np.array(np.round(1e6 * y_floats), dtype=int) - self._check_key("longitudes", x_longs) - self._check_key("latitudes", y_longs) + self._check_key("longitude", x_longs) + self._check_key("latitude", y_longs) def test__true_winds_orientation(self): self.test_cube.rename('eastward_wind') diff --git a/requirements/core.txt b/requirements/core.txt index 61feef7f..142dd757 100644 --- a/requirements/core.txt +++ b/requirements/core.txt @@ -1,4 +1,4 @@ # Core dependencies. scitools-iris>=3.0.2 -eccodes +eccodes>=1.6.1 \ No newline at end of file diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 06ae057f..f784bbd7 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -11,29 +11,29 @@ https://conda.anaconda.org/conda-forge/noarch/tzdata-2023c-h71feb2d_0.conda#939e https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_2.conda#e2042154faafe61969556f28bade94b9 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_2.conda#c28003b0be0494f9a7664389146716ff -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.19.1-hd590300_0.conda#e8c18d865be43e2fb3f7a145b6adf1f5 +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.21.0-hd590300_0.conda#c06fa0440048270817b9e3142cc661bf https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.0-h59595ed_0.conda#3fdf79ef322c8379ae83be491d805369 https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f -https://conda.anaconda.org/conda-forge/linux-64/libaec-1.0.6-hcb278e6_1.conda#0f683578378cddb223e7fd24f785ab2a -https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_0.conda#e805cbec4c29feb22e019245f7e47b6c +https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.2-h59595ed_1.conda#127b0be54c1c90760d7fe02ea7a56426 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.19-hd590300_0.conda#1635570038840ee3f9c71d22aa5b8b6d https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h516909a_1.tar.bz2#6f8720dff19e17ce5d48cfe7f3d2f0a3 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.5.0-hcb278e6_1.conda#6305a3dd2752c76335295da4e581f2fd https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_2.conda#78fdab09d9138851dde2b5fe2a11019e https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-h166bdaf_0.tar.bz2#b62b52da46c39ee2bc3c162ac7f1804d -https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-2.1.5.1-hd590300_1.conda#323e90742f0f48fc22bea908735f55e6 +https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d -https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.0-h7f98852_0.tar.bz2#39b1328babf85c7c3a61636d9cd50206 +https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_0.conda#30de3fd9b3b602f7473f30e684eeea8c https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-hcb278e6_0.conda#681105bccc2a3f7f1a837d47d39c9179 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.1.3-hd590300_0.conda#7bb88ce04c8deb9f7d763ae04a1da72f +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-h59595ed_2.conda#7dbaa197d7ba6032caf7ae7f32c1efa0 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.1.4-hd590300_0.conda#412ba6938c3e2abaca8b1129ea82e238 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-h9fff704_0.conda#e6d228cd0bb74a51dd18f5bfce0b4115 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b @@ -45,104 +45,105 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae -https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h501b40f_6.conda#c3e9338e15d90106f467377017352b97 -https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_0.conda#43017394a280a42b48d11d2a6e169901 -https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_0.conda#8e3e1cb77c4b355a3776bdfb74095bed +https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f +https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_2.conda#e75a75a6eaf6f318dae2631158c46575 -https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.52.0-h61bc06f_0.conda#613955a50485812985c059e7b269f42e +https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_0.conda#9b13d5ee90fc9f09d54fd403247342b4 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.39-h753d276_0.conda#e1c890aebdebbfbf87e2c917187b4416 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.43.0-h2797004_0.conda#903fa782a9067d5934210df6d79220f6 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.44.0-h2797004_0.conda#b58e6816d137f3aabf77d341dd5d732b https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe +https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.11.5-h232c23b_1.conda#f3858448893839820d4bcfb14ad3ecdf https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 -https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 -https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_1.conda#85552d64cb49f12781668779efc738ec +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda#68c34ec6149623be41a1933ab996a209 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.5-hfc55251_0.conda#04b88013080254850d6c01ed54810589 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-h0f2a231_0.conda#009521b7ed97cca25f8f997f9e745976 -https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_0.conda#aeafb07a327e3f14a796bf081ea07472 +https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda#39f910d205726805a958da408ca194ba https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.24-pthreads_h413a1c8_0.conda#6e4ef6ca28655124dcde9bd500e44c32 -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h29866fb_1.conda#4e9afd30f4ccb2f98645e51005f82236 -https://conda.anaconda.org/conda-forge/linux-64/python-3.10.12-hd12c33a_0_cpython.conda#eb6f1df105f37daedd6dca78523baa75 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.43.0-h2c6b66d_0.conda#713f9eac95d051abe14c3774376854fe -https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.6-h8ee46fc_0.conda#7590b76c3d11d21caa44f3fc38ac584a +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-ha9c0a0a_2.conda#55ed21669b2015f77c180feb1dd41930 +https://conda.anaconda.org/conda-forge/linux-64/python-3.10.13-hd12c33a_0_cpython.conda#f3a8c32aa764c3e7188b4b810fc9d6ce +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.44.0-h2c6b66d_0.conda#df56c636df4a98990462d66ac7be2330 +https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.7-h8ee46fc_0.conda#49e482d882669206653b095f5206c05b https://conda.anaconda.org/conda-forge/linux-64/antlr-python-runtime-4.7.2-py310hff52083_1003.tar.bz2#8324f8fff866055d4b32eb25e091fe31 https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda#3edfead7cedd1ab4400a6c588f3e75f8 -https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_0.conda#3db48055eab680e43a122e2c7494e7ae -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hc6cd4ac_0.conda#fb6201eb1daa3a3a2f91a4833bdf27c7 +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hc6cd4ac_1.conda#1f95722c94f00b69af69a066c7433714 https://conda.anaconda.org/conda-forge/noarch/certifi-2023.7.22-pyhd8ed1ab_0.conda#7f3dbc9179b4dde7da98dfb151d0ad22 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.2.0-pyhd8ed1ab_0.conda#313516e9a4b08b12dfb1e1cd390a96e3 +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca -https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.1-pyhd8ed1ab_0.conda#b325bfc4cff7d7f8a868f1f7ecc4ed16 -https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb -https://conda.anaconda.org/conda-forge/noarch/filelock-3.12.4-pyhd8ed1ab_0.conda#5173d4b8267a0699a43d73231e0b6596 +https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.conda#753d29fe41bb881e4b9c004f0abf973f +https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.1-pyhd8ed1ab_0.conda#0c1729b74a8152fde6a38ba0a2ab9f45 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.9.2-pyh1a96a4e_0.conda#9d15cd3a0e944594ab528da37dc72ecc +https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.10.0-pyhca7485f_0.conda#5b86cf1ceaaa9be2ec4627377e538db1 https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py310hd41b1e2_1.conda#b8d67603d43b23ce7e988a5d81a7ab79 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-h7f713cb_2.conda#9ab79924a3760f85a799f21bc99bd655 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-18_linux64_openblas.conda#bcddbb497582ece559465b9cd11042e7 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.3.0-hca28451_0.conda#4ab41bee09a2d2e08de5f09d6f1eef62 +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-hb7c19ff_3.conda#e96637dd92c5f340215c753a5c9a22d7 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-19_linux64_openblas.conda#420f4e9be59d0dc9133a0f43f7bab3f3 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.4.0-hca28451_0.conda#1158ac1d2613b28685644931f11ee807 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py310h2372a71_1.conda#b74e07a054c479e45a83a83fc5be713c https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda#926c67c0310094cf421ad13f7d3f38e5 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 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-h488ebb8_3.conda#128c25b7fe6a25286a48f3a6a9b5b6f3 -https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda#91cda59e66e1e4afe9476f8ef98f5c30 +https://conda.anaconda.org/conda-forge/noarch/packaging-23.2-pyhd8ed1ab_0.conda#79002079284aa895f883c6b7f3f88fd6 https://conda.anaconda.org/conda-forge/noarch/pep8-1.7.1-py_0.tar.bz2#d0b5bc3aebbffcb175bf8a1d419acb79 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.1-pyhd8ed1ab_0.conda#176f7d56f0cfe9008bdf1bccd7de02fb https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 -https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.3.0-py310h2372a71_1.conda#708d39474e54ba0f1832afb551633338 +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py310h2372a71_0.conda#b631b889b0b4bc2fca7b8b977ca484b2 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py310h2372a71_1.conda#bb010e368de4940771368bc3dc4c63e7 https://conda.anaconda.org/conda-forge/noarch/setuptools-68.2.2-pyhd8ed1ab_0.conda#fc2166155db840c634a1291a5c35a709 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 -https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.0.0-py310h2372a71_1.conda#cd944e0f7a4d1529c6707bd65423bd64 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.41.2-pyhd8ed1ab_0.conda#1ccd092478b3e0ee10d7a891adbf8a4f +https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py310h2372a71_0.conda#72637c58d36d9475fda24700c9796f19 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.41.3-pyhd8ed1ab_0.conda#3fc026b9c87d091c4b34a6c997324ae8 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a -https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py310h2fee648_5.conda#fef75d6c60d8a1cc7e6d1707f470a4e2 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.42.1-py310h2372a71_0.conda#1f18231ffab82f236ce074b2aaa07e54 +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py310h2fee648_0.conda#45846a970e71ac98fd327da5d40a0a2c +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.44.0-py310h2372a71_0.conda#3d1677945147b2d6eb0fef35e98e650f https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.2-nompi_h4f84152_100.conda#2de6a9bc8083b49f09b2f6eb28d3ba3c https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda#4e9f59a060c3be52bc4ddc46ee9b6946 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-18_linux64_openblas.conda#93dd9ab275ad888ed8113953769af78c +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-19_linux64_openblas.conda#d12374af44575413fbbd4a217d46ea33 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-18_linux64_openblas.conda#a1244707531e5b143c420c70573c8ec5 -https://conda.anaconda.org/conda-forge/noarch/partd-1.4.0-pyhd8ed1ab_1.conda#6ceb4e000cbe0b56b290180aea8520e8 -https://conda.anaconda.org/conda-forge/linux-64/pillow-10.0.1-py310h29da1c1_1.conda#8e93b1c69cddf89fd412178d3d418bae -https://conda.anaconda.org/conda-forge/noarch/pip-23.2.1-pyhd8ed1ab_0.conda#e2783aa3f9235225eec92f9081c5b801 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.0-h1d62c97_1.conda#900fd11ac61d4415d515583fcb570207 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-19_linux64_openblas.conda#9f100edf65436e3eabc2a51fc00b2c37 +https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 +https://conda.anaconda.org/conda-forge/linux-64/pillow-10.1.0-py310h01dd4db_0.conda#95d87a906d88b5824d7d36eeef091dba +https://conda.anaconda.org/conda-forge/noarch/pip-23.3.1-pyhd8ed1ab_0.conda#2400c0b86889f43aa52067161e1fb108 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.0-h1d62c97_2.conda#b5e57a0c643da391bef850922963eece https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.5-pyhd8ed1ab_0.conda#3bda70bbeb2920f44db5375af2e5fe38 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.7-pyhd8ed1ab_0.conda#270e71c14d37074b1d066ee21cf0c4a6 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.8.0-hd8ed1ab_0.conda#b279b07ce18058034e5b3606ba103a8b https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h80fb2b6_112.conda#a19fa6cacf80c8a366572853d5890eb4 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.0-py310hb13e2d6_0.conda#ac3b67e928cc71548efad9b522d42fef -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py310h32c33b7_1.conda#453939b9853937e80c94e9eb3da75981 +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py310h32c33b7_4.conda#124211262afed349430d9a3de6b51e8f https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py310hde88566_1.tar.bz2#94ce7a76b0c912279f6958e0b6b21d2b -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.1.1-py310hd41b1e2_0.conda#e00d52a8657a79b0a7c8c10559784759 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.9.2-pyhd8ed1ab_0.conda#cce7eeb7eda0124af186a5e9ce9b0fca -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.0.0-h32699f2_1.conda#fdde5424ecef5f7ad310b4242229291c -https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py310hde88566_1008.tar.bz2#f9dd8a7a2fcc23eb2cd95cd817c949e7 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.2-py310hb13e2d6_1.conda#4f522fc9cb8ecfa25e39f5c2ea65b16b -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.1-py310h7dcad9a_2.conda#a46061c83ed37bfa05d1ee96ec2fbb08 -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py310h278f3c1_0.conda#f2d3f2542a2467f479e809ac7b901ac2 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.31.0-h35c6de3_1.conda#22b243bd3c8aae15cb399178c4161faa -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.0-py310h62c0568_1.conda#d6fe03e8d9e80b6e20b7ae60bf4f88b0 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py310hba70d50_102.conda#6025039727a049ab4c0f2aab842c01cb -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py310h7cbd5c2_0.conda#7bfbace0788f477da1c26e10a358692d -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.6.0-py310h1f7b6fc_1.conda#694c566683fdbbe46ad6d8e39bc18b71 +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py310h1f7b6fc_0.conda#31beda75384647959d5792a1a7dc571a +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py310hd41b1e2_0.conda#85d2aaa7af046528d339da1e813c3a9f +https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.11.0-pyhd8ed1ab_0.conda#3bf8f5c3fbab9e0cfffdf5914f021854 +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.1.0-he6dfbbe_0.conda#548cd4a0a160a7c89f10352ab53bfe90 +https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py310h2372a71_1.conda#dfcf64f67961eb9686676f96fdb4b4d1 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.3-py310hb13e2d6_1.conda#4260b359d8fbeab4f789a8b0f968079f +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.2-py310h7dcad9a_0.conda#0d7c35fe5cc1f436e368ddd500deb979 +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py310h1f7b6fc_1.conda#3e0ee847bf68ed9085ac74b4615f5ce9 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.32.1-h35c6de3_0.conda#09d044f9206700e021916675a16d1e4d +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.1-py310h62c0568_0.conda#e650bd952e5618050ccb088bc0c6dfb4 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py310hba70d50_100.conda#e19392760c7e4da3b9cb0ee5bf61bc4b +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py310hcc13569_1.conda#31ef447724fb19066a9d00a660dab1bd +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.6.1-py310h1f7b6fc_1.conda#eee8d291cab9c673142ce54c5d561fa8 https://conda.anaconda.org/conda-forge/noarch/iris-3.7.0-pyha770c72_0.conda#dccc1f660bf455c239adaabf56b91dc9 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 1f9760d1..85770396 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -11,29 +11,29 @@ https://conda.anaconda.org/conda-forge/noarch/tzdata-2023c-h71feb2d_0.conda#939e https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_2.conda#e2042154faafe61969556f28bade94b9 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_2.conda#c28003b0be0494f9a7664389146716ff -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.19.1-hd590300_0.conda#e8c18d865be43e2fb3f7a145b6adf1f5 +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.21.0-hd590300_0.conda#c06fa0440048270817b9e3142cc661bf https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.0-h59595ed_0.conda#3fdf79ef322c8379ae83be491d805369 https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f -https://conda.anaconda.org/conda-forge/linux-64/libaec-1.0.6-hcb278e6_1.conda#0f683578378cddb223e7fd24f785ab2a -https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_0.conda#e805cbec4c29feb22e019245f7e47b6c +https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.2-h59595ed_1.conda#127b0be54c1c90760d7fe02ea7a56426 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.19-hd590300_0.conda#1635570038840ee3f9c71d22aa5b8b6d https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h516909a_1.tar.bz2#6f8720dff19e17ce5d48cfe7f3d2f0a3 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.5.0-hcb278e6_1.conda#6305a3dd2752c76335295da4e581f2fd https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_2.conda#78fdab09d9138851dde2b5fe2a11019e https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-h166bdaf_0.tar.bz2#b62b52da46c39ee2bc3c162ac7f1804d -https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-2.1.5.1-hd590300_1.conda#323e90742f0f48fc22bea908735f55e6 +https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d -https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.0-h7f98852_0.tar.bz2#39b1328babf85c7c3a61636d9cd50206 +https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_0.conda#30de3fd9b3b602f7473f30e684eeea8c https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-hcb278e6_0.conda#681105bccc2a3f7f1a837d47d39c9179 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.1.3-hd590300_0.conda#7bb88ce04c8deb9f7d763ae04a1da72f +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-h59595ed_2.conda#7dbaa197d7ba6032caf7ae7f32c1efa0 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.1.4-hd590300_0.conda#412ba6938c3e2abaca8b1129ea82e238 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-h9fff704_0.conda#e6d228cd0bb74a51dd18f5bfce0b4115 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b @@ -45,103 +45,104 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae -https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h501b40f_6.conda#c3e9338e15d90106f467377017352b97 -https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_0.conda#43017394a280a42b48d11d2a6e169901 -https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_0.conda#8e3e1cb77c4b355a3776bdfb74095bed +https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f +https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_2.conda#e75a75a6eaf6f318dae2631158c46575 -https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.52.0-h61bc06f_0.conda#613955a50485812985c059e7b269f42e +https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_0.conda#9b13d5ee90fc9f09d54fd403247342b4 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.39-h753d276_0.conda#e1c890aebdebbfbf87e2c917187b4416 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.43.0-h2797004_0.conda#903fa782a9067d5934210df6d79220f6 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.44.0-h2797004_0.conda#b58e6816d137f3aabf77d341dd5d732b https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe +https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.11.5-h232c23b_1.conda#f3858448893839820d4bcfb14ad3ecdf https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 -https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 -https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_1.conda#85552d64cb49f12781668779efc738ec +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda#68c34ec6149623be41a1933ab996a209 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.5-hfc55251_0.conda#04b88013080254850d6c01ed54810589 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-h0f2a231_0.conda#009521b7ed97cca25f8f997f9e745976 -https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_0.conda#aeafb07a327e3f14a796bf081ea07472 +https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda#39f910d205726805a958da408ca194ba https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.24-pthreads_h413a1c8_0.conda#6e4ef6ca28655124dcde9bd500e44c32 -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h29866fb_1.conda#4e9afd30f4ccb2f98645e51005f82236 -https://conda.anaconda.org/conda-forge/linux-64/python-3.11.5-hab00c5b_0_cpython.conda#f0288cb82594b1cbc71111d1cd3c5422 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.43.0-h2c6b66d_0.conda#713f9eac95d051abe14c3774376854fe -https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.6-h8ee46fc_0.conda#7590b76c3d11d21caa44f3fc38ac584a +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-ha9c0a0a_2.conda#55ed21669b2015f77c180feb1dd41930 +https://conda.anaconda.org/conda-forge/linux-64/python-3.11.6-hab00c5b_0_cpython.conda#b0dfbe2fcbfdb097d321bfd50ecddab1 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.44.0-h2c6b66d_0.conda#df56c636df4a98990462d66ac7be2330 +https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.7-h8ee46fc_0.conda#49e482d882669206653b095f5206c05b https://conda.anaconda.org/conda-forge/linux-64/antlr-python-runtime-4.7.2-py311h38be061_1003.tar.bz2#0ab8f8f0cae99343907fe68cda11baea https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda#3edfead7cedd1ab4400a6c588f3e75f8 -https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_0.conda#3db48055eab680e43a122e2c7494e7ae -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hb755f60_0.conda#b8128d083dbf6abd472b1a3e98b0b83d +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hb755f60_1.conda#cce9e7c3f1c307f2a5fb08a2922d6164 https://conda.anaconda.org/conda-forge/noarch/certifi-2023.7.22-pyhd8ed1ab_0.conda#7f3dbc9179b4dde7da98dfb151d0ad22 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.2.0-pyhd8ed1ab_0.conda#313516e9a4b08b12dfb1e1cd390a96e3 +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca -https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.1-pyhd8ed1ab_0.conda#b325bfc4cff7d7f8a868f1f7ecc4ed16 -https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb -https://conda.anaconda.org/conda-forge/noarch/filelock-3.12.4-pyhd8ed1ab_0.conda#5173d4b8267a0699a43d73231e0b6596 +https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.conda#753d29fe41bb881e4b9c004f0abf973f +https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.1-pyhd8ed1ab_0.conda#0c1729b74a8152fde6a38ba0a2ab9f45 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.9.2-pyh1a96a4e_0.conda#9d15cd3a0e944594ab528da37dc72ecc +https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.10.0-pyhca7485f_0.conda#5b86cf1ceaaa9be2ec4627377e538db1 https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py311h9547e67_1.conda#2c65bdf442b0d37aad080c8a4e0d452f -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-h7f713cb_2.conda#9ab79924a3760f85a799f21bc99bd655 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-18_linux64_openblas.conda#bcddbb497582ece559465b9cd11042e7 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.3.0-hca28451_0.conda#4ab41bee09a2d2e08de5f09d6f1eef62 +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-hb7c19ff_3.conda#e96637dd92c5f340215c753a5c9a22d7 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-19_linux64_openblas.conda#420f4e9be59d0dc9133a0f43f7bab3f3 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.4.0-hca28451_0.conda#1158ac1d2613b28685644931f11ee807 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py311h459d7ec_1.conda#71120b5155a0c500826cf81536721a15 https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda#926c67c0310094cf421ad13f7d3f38e5 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 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-h488ebb8_3.conda#128c25b7fe6a25286a48f3a6a9b5b6f3 -https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda#91cda59e66e1e4afe9476f8ef98f5c30 +https://conda.anaconda.org/conda-forge/noarch/packaging-23.2-pyhd8ed1ab_0.conda#79002079284aa895f883c6b7f3f88fd6 https://conda.anaconda.org/conda-forge/noarch/pep8-1.7.1-py_0.tar.bz2#d0b5bc3aebbffcb175bf8a1d419acb79 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.1-pyhd8ed1ab_0.conda#176f7d56f0cfe9008bdf1bccd7de02fb https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 -https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.3.0-py311h459d7ec_1.conda#7e2181758f84a9c7e776af10fbb2f1a0 +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py311h459d7ec_0.conda#60b5332b3989fda37884b92c7afd6a91 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py311h459d7ec_1.conda#52719a74ad130de8fb5d047dc91f247a https://conda.anaconda.org/conda-forge/noarch/setuptools-68.2.2-pyhd8ed1ab_0.conda#fc2166155db840c634a1291a5c35a709 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.41.2-pyhd8ed1ab_0.conda#1ccd092478b3e0ee10d7a891adbf8a4f +https://conda.anaconda.org/conda-forge/noarch/wheel-0.41.3-pyhd8ed1ab_0.conda#3fc026b9c87d091c4b34a6c997324ae8 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a -https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py311hb3a22ac_5.conda#75d52ef1d318d18e554aadd13ce91b9d -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.42.1-py311h459d7ec_0.conda#fc327c0ea015db3b6484eabb37d44e60 +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py311hb3a22ac_0.conda#b3469563ac5e808b0cd92810d0697043 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.44.0-py311h459d7ec_0.conda#f12f4d7361178f94df1052d6b63fd868 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.2-nompi_h4f84152_100.conda#2de6a9bc8083b49f09b2f6eb28d3ba3c https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda#4e9f59a060c3be52bc4ddc46ee9b6946 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-18_linux64_openblas.conda#93dd9ab275ad888ed8113953769af78c +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-19_linux64_openblas.conda#d12374af44575413fbbd4a217d46ea33 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-18_linux64_openblas.conda#a1244707531e5b143c420c70573c8ec5 -https://conda.anaconda.org/conda-forge/noarch/partd-1.4.0-pyhd8ed1ab_1.conda#6ceb4e000cbe0b56b290180aea8520e8 -https://conda.anaconda.org/conda-forge/linux-64/pillow-10.0.1-py311h8aef010_1.conda#4d66ee2081a7cd444ff6f30d95873eef -https://conda.anaconda.org/conda-forge/noarch/pip-23.2.1-pyhd8ed1ab_0.conda#e2783aa3f9235225eec92f9081c5b801 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.0-h1d62c97_1.conda#900fd11ac61d4415d515583fcb570207 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-19_linux64_openblas.conda#9f100edf65436e3eabc2a51fc00b2c37 +https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 +https://conda.anaconda.org/conda-forge/linux-64/pillow-10.1.0-py311ha6c5da5_0.conda#83a988daf5c49e57f7d2086fb6781fe8 +https://conda.anaconda.org/conda-forge/noarch/pip-23.3.1-pyhd8ed1ab_0.conda#2400c0b86889f43aa52067161e1fb108 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.0-h1d62c97_2.conda#b5e57a0c643da391bef850922963eece https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.5-pyhd8ed1ab_0.conda#3bda70bbeb2920f44db5375af2e5fe38 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.7-pyhd8ed1ab_0.conda#270e71c14d37074b1d066ee21cf0c4a6 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.8.0-hd8ed1ab_0.conda#b279b07ce18058034e5b3606ba103a8b https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h80fb2b6_112.conda#a19fa6cacf80c8a366572853d5890eb4 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.0-py311h64a7726_0.conda#bf16a9f625126e378302f08e7ed67517 -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311h1facc83_1.conda#2e48207ebbd3e25ad14881a27e51fa1e +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311h1facc83_4.conda#75d504c6787edc377ebdba087a26a61b https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py311h4c7f6c3_1.tar.bz2#c7e54004ffd03f8db0a58ab949f2a00b -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.1.1-py311h9547e67_0.conda#db5b3b0093d0d4565e5c89578108402e -https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.9.2-pyhd8ed1ab_0.conda#cce7eeb7eda0124af186a5e9ce9b0fca -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.0.0-h32699f2_1.conda#fdde5424ecef5f7ad310b4242229291c -https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py311h4c7f6c3_1008.tar.bz2#5998dff78c3b82a07ad77f2ae1ec1c44 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.2-py311h64a7726_1.conda#58af16843fc4469770bdbaf45d3a19de -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.1-py311he06c224_2.conda#10a1953d2f74d292b5de093ceea104b2 -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h1f0f07a_0.conda#43a71a823583d75308eaf3a06c8f150b -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.31.0-h35c6de3_1.conda#22b243bd3c8aae15cb399178c4161faa -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.0-py311h54ef318_1.conda#20d79e2fe53b49b399f3d36977b05abb -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py311he8ad708_102.conda#b48083ba918347f30efa94f7dc694919 -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py311h320fe9a_0.conda#1271b2375735e2aaa6d6770dbe2ad087 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.6.0-py311h1f0f07a_1.conda#0a7a6ea21a46cc2857d748ffdbd76dc7 +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py311h1f0f07a_0.conda#b7e6d52b39e199238c3400cafaabafb3 +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py311h9547e67_0.conda#40828c5b36ef52433e21f89943e09f33 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.11.0-pyhd8ed1ab_0.conda#3bf8f5c3fbab9e0cfffdf5914f021854 +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.1.0-he6dfbbe_0.conda#548cd4a0a160a7c89f10352ab53bfe90 +https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py311h459d7ec_1.conda#45b8d355bbcdd27588c2d266bcfdff84 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.3-py311h64a7726_1.conda#e4b4d3b764e2d029477d0db88248a8b5 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.2-py311he06c224_0.conda#c90e2469d7512f3bba893533a82d7a02 +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h1f0f07a_1.conda#c667ac9fac7d0404d151fe9e4f22ab23 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.32.1-h35c6de3_0.conda#09d044f9206700e021916675a16d1e4d +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.1-py311h54ef318_0.conda#201fdabdb86bb8fb6e99fa3f0dab8122 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py311he8ad708_100.conda#597b1ad6cb7011b7561c20ea30295cae +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py311h320fe9a_1.conda#10d1806e20da040c58c36deddf51c70c +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.6.1-py311h1f0f07a_1.conda#fa4f6eb8d7f25c8525f25ff173a687b4 https://conda.anaconda.org/conda-forge/noarch/iris-3.7.0-pyha770c72_0.conda#dccc1f660bf455c239adaabf56b91dc9 diff --git a/requirements/locks/py39-linux-64.lock b/requirements/locks/py39-linux-64.lock index 121476e3..5b1f6f8f 100644 --- a/requirements/locks/py39-linux-64.lock +++ b/requirements/locks/py39-linux-64.lock @@ -11,29 +11,29 @@ https://conda.anaconda.org/conda-forge/noarch/tzdata-2023c-h71feb2d_0.conda#939e https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_2.conda#e2042154faafe61969556f28bade94b9 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_2.conda#c28003b0be0494f9a7664389146716ff -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.19.1-hd590300_0.conda#e8c18d865be43e2fb3f7a145b6adf1f5 +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.21.0-hd590300_0.conda#c06fa0440048270817b9e3142cc661bf https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.0-h59595ed_0.conda#3fdf79ef322c8379ae83be491d805369 https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f -https://conda.anaconda.org/conda-forge/linux-64/libaec-1.0.6-hcb278e6_1.conda#0f683578378cddb223e7fd24f785ab2a -https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_0.conda#e805cbec4c29feb22e019245f7e47b6c +https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.2-h59595ed_1.conda#127b0be54c1c90760d7fe02ea7a56426 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.19-hd590300_0.conda#1635570038840ee3f9c71d22aa5b8b6d https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h516909a_1.tar.bz2#6f8720dff19e17ce5d48cfe7f3d2f0a3 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.5.0-hcb278e6_1.conda#6305a3dd2752c76335295da4e581f2fd https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_2.conda#78fdab09d9138851dde2b5fe2a11019e https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-h166bdaf_0.tar.bz2#b62b52da46c39ee2bc3c162ac7f1804d -https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-2.1.5.1-hd590300_1.conda#323e90742f0f48fc22bea908735f55e6 +https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d -https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.0-h7f98852_0.tar.bz2#39b1328babf85c7c3a61636d9cd50206 +https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_0.conda#30de3fd9b3b602f7473f30e684eeea8c https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-hcb278e6_0.conda#681105bccc2a3f7f1a837d47d39c9179 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.1.3-hd590300_0.conda#7bb88ce04c8deb9f7d763ae04a1da72f +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-h59595ed_2.conda#7dbaa197d7ba6032caf7ae7f32c1efa0 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.1.4-hd590300_0.conda#412ba6938c3e2abaca8b1129ea82e238 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-h9fff704_0.conda#e6d228cd0bb74a51dd18f5bfce0b4115 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b @@ -45,106 +45,107 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae -https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h501b40f_6.conda#c3e9338e15d90106f467377017352b97 -https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_0.conda#43017394a280a42b48d11d2a6e169901 -https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_0.conda#8e3e1cb77c4b355a3776bdfb74095bed +https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f +https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_2.conda#e75a75a6eaf6f318dae2631158c46575 -https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.52.0-h61bc06f_0.conda#613955a50485812985c059e7b269f42e +https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_0.conda#9b13d5ee90fc9f09d54fd403247342b4 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.39-h753d276_0.conda#e1c890aebdebbfbf87e2c917187b4416 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.43.0-h2797004_0.conda#903fa782a9067d5934210df6d79220f6 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.44.0-h2797004_0.conda#b58e6816d137f3aabf77d341dd5d732b https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe +https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.11.5-h232c23b_1.conda#f3858448893839820d4bcfb14ad3ecdf https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 -https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 -https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_1.conda#85552d64cb49f12781668779efc738ec +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda#68c34ec6149623be41a1933ab996a209 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.5-hfc55251_0.conda#04b88013080254850d6c01ed54810589 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-h0f2a231_0.conda#009521b7ed97cca25f8f997f9e745976 -https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_0.conda#aeafb07a327e3f14a796bf081ea07472 +https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda#39f910d205726805a958da408ca194ba https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.24-pthreads_h413a1c8_0.conda#6e4ef6ca28655124dcde9bd500e44c32 -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h29866fb_1.conda#4e9afd30f4ccb2f98645e51005f82236 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-ha9c0a0a_2.conda#55ed21669b2015f77c180feb1dd41930 https://conda.anaconda.org/conda-forge/linux-64/python-3.9.18-h0755675_0_cpython.conda#3ede353bc605068d9677e700b1847382 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.43.0-h2c6b66d_0.conda#713f9eac95d051abe14c3774376854fe -https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.6-h8ee46fc_0.conda#7590b76c3d11d21caa44f3fc38ac584a +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.44.0-h2c6b66d_0.conda#df56c636df4a98990462d66ac7be2330 +https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.7-h8ee46fc_0.conda#49e482d882669206653b095f5206c05b https://conda.anaconda.org/conda-forge/linux-64/antlr-python-runtime-4.7.2-py39hf3d152e_1003.tar.bz2#5e8330e806e50bd6137ebd125f4bc1bb https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda#3edfead7cedd1ab4400a6c588f3e75f8 -https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_0.conda#3db48055eab680e43a122e2c7494e7ae -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py39h3d6467e_0.conda#8a1b6b1f5e230aaf6408d6b0aef3492f +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py39h3d6467e_1.conda#c48418c8b35f1d59ae9ae1174812b40a https://conda.anaconda.org/conda-forge/noarch/certifi-2023.7.22-pyhd8ed1ab_0.conda#7f3dbc9179b4dde7da98dfb151d0ad22 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.2.0-pyhd8ed1ab_0.conda#313516e9a4b08b12dfb1e1cd390a96e3 +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca -https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.1-pyhd8ed1ab_0.conda#b325bfc4cff7d7f8a868f1f7ecc4ed16 -https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb -https://conda.anaconda.org/conda-forge/noarch/filelock-3.12.4-pyhd8ed1ab_0.conda#5173d4b8267a0699a43d73231e0b6596 +https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.conda#753d29fe41bb881e4b9c004f0abf973f +https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.1-pyhd8ed1ab_0.conda#0c1729b74a8152fde6a38ba0a2ab9f45 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.9.2-pyh1a96a4e_0.conda#9d15cd3a0e944594ab528da37dc72ecc +https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.10.0-pyhca7485f_0.conda#5b86cf1ceaaa9be2ec4627377e538db1 https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py39h7633fee_1.conda#c9f74d717e5a2847a9f8b779c54130f2 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-h7f713cb_2.conda#9ab79924a3760f85a799f21bc99bd655 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-18_linux64_openblas.conda#bcddbb497582ece559465b9cd11042e7 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.3.0-hca28451_0.conda#4ab41bee09a2d2e08de5f09d6f1eef62 +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-hb7c19ff_3.conda#e96637dd92c5f340215c753a5c9a22d7 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-19_linux64_openblas.conda#420f4e9be59d0dc9133a0f43f7bab3f3 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.4.0-hca28451_0.conda#1158ac1d2613b28685644931f11ee807 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py39hd1e30aa_1.conda#ee2b4665b852ec6ff2758f3c1b91233d https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda#926c67c0310094cf421ad13f7d3f38e5 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 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-h488ebb8_3.conda#128c25b7fe6a25286a48f3a6a9b5b6f3 -https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda#91cda59e66e1e4afe9476f8ef98f5c30 +https://conda.anaconda.org/conda-forge/noarch/packaging-23.2-pyhd8ed1ab_0.conda#79002079284aa895f883c6b7f3f88fd6 https://conda.anaconda.org/conda-forge/noarch/pep8-1.7.1-py_0.tar.bz2#d0b5bc3aebbffcb175bf8a1d419acb79 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.1-pyhd8ed1ab_0.conda#176f7d56f0cfe9008bdf1bccd7de02fb https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 -https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.3.0-py39hd1e30aa_1.conda#6295f6164ced8634e3d95cd5d08ad95d +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py39hd1e30aa_0.conda#756cb152772a225587a05ca0ec68fc08 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py39hd1e30aa_1.conda#37218233bcdc310e4fde6453bc1b40d8 https://conda.anaconda.org/conda-forge/noarch/setuptools-68.2.2-pyhd8ed1ab_0.conda#fc2166155db840c634a1291a5c35a709 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 -https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.0.0-py39hd1e30aa_1.conda#7c7ab84210a972d9efe49655802e904c -https://conda.anaconda.org/conda-forge/noarch/wheel-0.41.2-pyhd8ed1ab_0.conda#1ccd092478b3e0ee10d7a891adbf8a4f +https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py39hd1e30aa_0.conda#1da984bbb6e765743e13388ba7b7b2c8 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.41.3-pyhd8ed1ab_0.conda#3fc026b9c87d091c4b34a6c997324ae8 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a -https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py39h7a31438_5.conda#a2271dc58a5291d18b42fa4d45d42218 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.42.1-py39hd1e30aa_0.conda#de06dc7edaddbd3b60c050f3a95d6fe6 +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py39h7a31438_0.conda#ac992767d7f8ed2cb27e71e78f0fb2d7 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.44.0-py39hd1e30aa_0.conda#bbfd1e3ef6f66b07e025fe872e854b0d https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.2-nompi_h4f84152_100.conda#2de6a9bc8083b49f09b2f6eb28d3ba3c https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda#4e9f59a060c3be52bc4ddc46ee9b6946 -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.1.0-pyhd8ed1ab_0.conda#48b0d98e0c0ec810d3ccc2a0926c8c0e +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.1.1-pyhd8ed1ab_0.conda#3d5fa25cf42f3f32a12b2d874ace8574 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-18_linux64_openblas.conda#93dd9ab275ad888ed8113953769af78c +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-19_linux64_openblas.conda#d12374af44575413fbbd4a217d46ea33 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-18_linux64_openblas.conda#a1244707531e5b143c420c70573c8ec5 -https://conda.anaconda.org/conda-forge/noarch/partd-1.4.0-pyhd8ed1ab_1.conda#6ceb4e000cbe0b56b290180aea8520e8 -https://conda.anaconda.org/conda-forge/linux-64/pillow-10.0.1-py39h444a776_1.conda#52ad49ce520bec37ff0423b16c8bb052 -https://conda.anaconda.org/conda-forge/noarch/pip-23.2.1-pyhd8ed1ab_0.conda#e2783aa3f9235225eec92f9081c5b801 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.0-h1d62c97_1.conda#900fd11ac61d4415d515583fcb570207 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-19_linux64_openblas.conda#9f100edf65436e3eabc2a51fc00b2c37 +https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 +https://conda.anaconda.org/conda-forge/linux-64/pillow-10.1.0-py39had0adad_0.conda#eeaa413fddccecb2ab7f747bdb55b07f +https://conda.anaconda.org/conda-forge/noarch/pip-23.3.1-pyhd8ed1ab_0.conda#2400c0b86889f43aa52067161e1fb108 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.0-h1d62c97_2.conda#b5e57a0c643da391bef850922963eece https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.5-pyhd8ed1ab_0.conda#3bda70bbeb2920f44db5375af2e5fe38 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.7-pyhd8ed1ab_0.conda#270e71c14d37074b1d066ee21cf0c4a6 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 -https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.1.0-pyhd8ed1ab_0.conda#6a62c2cc25376a0d050b3d1d221c3ee9 +https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.1.1-pyhd8ed1ab_0.conda#d04bd1b5bed9177dd7c3cef15e2b6710 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.8.0-hd8ed1ab_0.conda#b279b07ce18058034e5b3606ba103a8b https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h80fb2b6_112.conda#a19fa6cacf80c8a366572853d5890eb4 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.0-py39h474f0d3_0.conda#62f1d2e05327bf62728afa448f2a9261 -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py39hce394fd_1.conda#b5188eeb7df815911a7c8db0fc16b89b +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py39hce394fd_4.conda#4b6e79000ec3a495f429b2c1092ed63b https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py39h2ae25f5_1.tar.bz2#c943fb9a2818ecc5be1e0ecc8b7738f1 -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.1.1-py39h7633fee_0.conda#b673f03c191683996e66c881f90aff2b -https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.9.2-pyhd8ed1ab_0.conda#cce7eeb7eda0124af186a5e9ce9b0fca -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.0.0-h32699f2_1.conda#fdde5424ecef5f7ad310b4242229291c -https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py39h2ae25f5_1008.tar.bz2#d90acb3804f16c63eb6726652e4e25b3 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.2-py39h474f0d3_1.conda#f62409d868e23c1f97ae2b0db5658385 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.1-py39h1bc45ef_2.conda#d79ed0ee1738151284ebd97092a6a210 -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py39h0f8d45d_0.conda#180d4312005bc93f257e2997a8ee41cb -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.31.0-h35c6de3_1.conda#22b243bd3c8aae15cb399178c4161faa -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.0-py39he9076e7_1.conda#3337ebf55443f31a1148f3ca6f1d9673 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py39h4282601_102.conda#05390bd5ad0ddc2f719392d087673344 -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py39h40cae4c_0.conda#24b4bf92e26a46217e37e5928927116b -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.6.0-py39h44dd56e_1.conda#31245eac5106c3c37518d0f0e4f92419 +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py39h44dd56e_0.conda#baea2f5dfb3ab7b1c836385d2e1daca7 +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py39h7633fee_0.conda#ed71ad3e30eb03da363fb797419cce98 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.11.0-pyhd8ed1ab_0.conda#3bf8f5c3fbab9e0cfffdf5914f021854 +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.1.0-he6dfbbe_0.conda#548cd4a0a160a7c89f10352ab53bfe90 +https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py39hd1e30aa_1.conda#ca63612907462c8e36edcc9bbacc253e +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.3-py39h474f0d3_1.conda#55441724fedb3042d38ffa5220f00804 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.2-py39h1bc45ef_0.conda#ca067895d22f8a0d38f225a95184858e +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py39h44dd56e_1.conda#c35fc79261456cdda0c701329c6b7675 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.32.1-h35c6de3_0.conda#09d044f9206700e021916675a16d1e4d +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.1-py39he9076e7_0.conda#89615b866cb3b0d8ad4e2a11e2bcf9a0 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py39h4282601_100.conda#d2809fbf0d8ae7b8ca92c456cb44a7d4 +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py39hddac248_1.conda#8dd2eb1e7aa9a33a92a75bdcea3f0dd0 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.6.1-py39h44dd56e_1.conda#0ac51aa5d5ccdc8f0106176823fde146 https://conda.anaconda.org/conda-forge/noarch/iris-3.7.0-pyha770c72_0.conda#dccc1f660bf455c239adaabf56b91dc9 diff --git a/requirements/py310.yml b/requirements/py310.yml index 88f4183f..e0ad975c 100644 --- a/requirements/py310.yml +++ b/requirements/py310.yml @@ -11,7 +11,8 @@ dependencies: # Core dependencies. - iris>=3.0.2 - - python-eccodes + - python-eccodes>=1.6.1 + - eccodes>=2.32.1 # Optional dependencies. - mo_pack diff --git a/requirements/py311.yml b/requirements/py311.yml index b97ee151..4417eccd 100644 --- a/requirements/py311.yml +++ b/requirements/py311.yml @@ -11,7 +11,8 @@ dependencies: # Core dependencies. - iris>=3.0.2 - - python-eccodes + - python-eccodes>=1.6.1 + - eccodes>=2.32.1 # Optional dependencies. - mo_pack diff --git a/requirements/py39.yml b/requirements/py39.yml index 64d9c475..7cb40d3e 100644 --- a/requirements/py39.yml +++ b/requirements/py39.yml @@ -11,7 +11,8 @@ dependencies: # Core dependencies. - iris>=3.0.2 - - python-eccodes + - python-eccodes>=1.6.1 + - eccodes>=2.32.1 # Optional dependencies. - mo_pack From 70f30200e02840bd64f96fed05dc5646d7e02eae Mon Sep 17 00:00:00 2001 From: Bill Little Date: Thu, 16 Nov 2023 17:29:32 +0000 Subject: [PATCH 240/583] Auto-generate zero data for missing data payload (#362) * DataProxy auto-generate zero data * remove expectedFailure decorator for pickle tests * review actions --- .cirrus.yml | 4 +-- iris_grib/message.py | 19 ++++++++-- .../iris_integration/test_pickle_message.py | 4 --- .../load_convert/test_data_section.py | 16 +++++++++ .../data_representation__no_bitsPerValue.cml | 35 +++++++++++++++++++ 5 files changed, 70 insertions(+), 8 deletions(-) create mode 100644 iris_grib/tests/results/integration/load_convert/data_section/TestDataProxy/data_representation__no_bitsPerValue.cml diff --git a/.cirrus.yml b/.cirrus.yml index ae52df1d..1de7c187 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -28,8 +28,8 @@ env: PIP_CACHE_PACKAGES: "pip setuptools wheel nox pyyaml" # Base directory for the iris-test-data. IRIS_TEST_DATA_DIR: ${HOME}/iris-test-data - # Git commit hash for iris test data. - IRIS_TEST_DATA_REF: "2.0.0" + # Tagged release version of the iris-test-data. + IRIS_TEST_DATA_REF: "2.23" # # Linting diff --git a/iris_grib/message.py b/iris_grib/message.py index cf4e9b34..80a7f8b2 100644 --- a/iris_grib/message.py +++ b/iris_grib/message.py @@ -237,14 +237,29 @@ def _bitmap(self, bitmap_section): return bitmap def __getitem__(self, keys): - # NB. Currently assumes that the validity of this interpretation + # N.B. Assumes that the validity of this interpretation # is checked before this proxy is created. message = self.recreate_raw() sections = message.sections + data = None + + if 5 in sections: + # Data Representation Section. + if sections[5]["bitsPerValue"] == 0: + # Auto-generate zero data of the expected shape and dtype, as + # there is no data stored within the Data Section of this GRIB + # message. Also flatten the result to 1-D for potential bitmap + # post-processing. + data = np.ravel(np.zeros(self.shape, dtype=self.dtype)) + + if data is None: + # Data Section. + data = sections[7]["codedValues"] + + # Bit-map Section. bitmap_section = sections[6] bitmap = self._bitmap(bitmap_section) - data = sections[7]['codedValues'] if bitmap is not None: # Note that bitmap and data are both 1D arrays at this point. diff --git a/iris_grib/tests/integration/iris_integration/test_pickle_message.py b/iris_grib/tests/integration/iris_integration/test_pickle_message.py index bbd0c4b0..6a7a8253 100644 --- a/iris_grib/tests/integration/iris_integration/test_pickle_message.py +++ b/iris_grib/tests/integration/iris_integration/test_pickle_message.py @@ -9,7 +9,6 @@ import iris_grib.tests as tests import pickle -import unittest from iris.tests.integration.test_pickle import Common as PickleCommon @@ -39,15 +38,12 @@ def pickle_obj(self, obj): # These probably "ought" to work, but currently fail. # see https://github.com/SciTools/iris-grib/issues/202 - @unittest.expectedFailure def test_protocol_0(self): super().test_protocol_0() - @unittest.expectedFailure def test_protocol_1(self): super().test_protocol_1() - @unittest.expectedFailure def test_protocol_2(self): super().test_protocol_2() diff --git a/iris_grib/tests/integration/load_convert/test_data_section.py b/iris_grib/tests/integration/load_convert/test_data_section.py index 9631cae7..6c4aca1e 100644 --- a/iris_grib/tests/integration/load_convert/test_data_section.py +++ b/iris_grib/tests/integration/load_convert/test_data_section.py @@ -11,6 +11,7 @@ # before importing anything else. import iris_grib.tests as tests +import numpy as np import numpy.ma as ma from iris import load_cube @@ -68,5 +69,20 @@ def test_grid_complex_spatial_differencing(self): self.assertCMLApproxData(cube) +class TestDataProxy(tests.IrisGribTest): + def test_data_representation__no_bitsPerValue(self): + """Ensures that zero data is auto-generated.""" + # This test file contains one GRIB2 message with no data payload + # in Data Section [7], but has "bitsPerValue=0" in the Data + # Representation Section [5] to trigger auto-generation of zero + # data payload by the DataProxy. + path = tests.get_data_path( + ("GRIB", "missing_values", "ice_severity__no_bitsPerValue.grib2") + ) + cube = load_cube(path) + self.assertCML(cube) + self.assertEqual(0, np.sum(cube.data)) + + if __name__ == '__main__': tests.main() diff --git a/iris_grib/tests/results/integration/load_convert/data_section/TestDataProxy/data_representation__no_bitsPerValue.cml b/iris_grib/tests/results/integration/load_convert/data_section/TestDataProxy/data_representation__no_bitsPerValue.cml new file mode 100644 index 00000000..55eab1e1 --- /dev/null +++ b/iris_grib/tests/results/integration/load_convert/data_section/TestDataProxy/data_representation__no_bitsPerValue.cml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From f0427e21f18ca16d1de71aa03d2ee7c10c07a522 Mon Sep 17 00:00:00 2001 From: Bill Little Date: Thu, 16 Nov 2023 21:24:43 +0000 Subject: [PATCH 241/583] bump feature branch to release version 0.19.0 (#364) --- iris_grib/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index 31992724..17b433d0 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -30,7 +30,7 @@ from .message import GribMessage -__version__ = '0.19.dev0' +__version__ = '0.19.0' __all__ = ['load_cubes', 'save_grib2', 'load_pairs_from_fields', 'save_pairs_from_cube', 'save_messages'] From 58cb9ff1d000fa71b6a1efbf11a2bc7d3c88a17e Mon Sep 17 00:00:00 2001 From: abooton Date: Tue, 21 Nov 2023 14:09:13 +0000 Subject: [PATCH 242/583] Save LAEA grid (#343) * Add saving for the Lambert Azimuthual Equal Area grid * fix line length test_grid_definition_template_140.py * Fix LambertAzimuthalEqualArea import * flake8 * Altering names standardParallel to standardParallelInMicrodegrees and centralLongitude to centralLongitudeInMicrodegrees * Add: Raise execption if false_easting or false_northing is not zero * Fixing string comparison in __fail_false_easting_northing test --- iris_grib/_save_rules.py | 74 +++++++++- .../test_grid_definition_section.py | 13 +- .../test_grid_definition_template_140.py | 133 ++++++++++++++++++ 3 files changed, 218 insertions(+), 2 deletions(-) create mode 100644 iris_grib/tests/unit/save_rules/test_grid_definition_template_140.py diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index 7e8e2647..1a1e6aba 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -21,7 +21,8 @@ import iris from iris.aux_factory import HybridHeightFactory, HybridPressureFactory from iris.coord_systems import (GeogCS, RotatedGeogCS, Mercator, - TransverseMercator, LambertConformal) + TransverseMercator, LambertConformal, + LambertAzimuthalEqualArea) from iris.exceptions import TranslationError @@ -648,6 +649,72 @@ def grid_definition_template_30(cube, grib): eccodes.codes_set(grib, "longitudeOfSouthernPole", 0) +def grid_definition_template_140(cube, grib): + """ + Set keys within the provided grib message based on + Grid Definition Template 3.140. + + Template 3.140 is used to represent a Lambert Azimuthual Equal Area grid. + + """ + + eccodes.codes_set(grib, "gridDefinitionTemplateNumber", 140) + + # Retrieve some information from the cube. + y_coord = cube.coord(dimensions=[0]) + x_coord = cube.coord(dimensions=[1]) + cs = y_coord.coord_system + + # Normalise the coordinate values to millimetres - the resolution + # used in the GRIB message. + y_mm = points_in_unit(y_coord, 'mm') + x_mm = points_in_unit(x_coord, 'mm') + + # Encode the horizontal points. + + # NB. Since we're already in millimetres, our tolerance for + # discrepancy in the differences is 1. + try: + x_step = step(x_mm, atol=1) + y_step = step(y_mm, atol=1) + except ValueError: + msg = ('Irregular coordinates not supported for Lambert ' + 'Azimuthal Equal Area.') + raise TranslationError(msg) + eccodes.codes_set(grib, 'Dx', abs(x_step)) + eccodes.codes_set(grib, 'Dy', abs(y_step)) + + horizontal_grid_common(cube, grib, xy=True) + + # Transform first point into geographic CS + geog = cs.ellipsoid if cs.ellipsoid is not None else GeogCS(1) + first_x, first_y = geog.as_cartopy_crs().transform_point( + x_coord.points[0], + y_coord.points[0], + cs.as_cartopy_crs()) + first_x = first_x % 360 + central_lon = cs.longitude_of_projection_origin % 360 + central_lat = cs.latitude_of_projection_origin + + eccodes.codes_set(grib, "latitudeOfFirstGridPoint", + int(np.round(first_y / _DEFAULT_DEGREES_UNITS))) + eccodes.codes_set(grib, "longitudeOfFirstGridPoint", + int(np.round(first_x / _DEFAULT_DEGREES_UNITS))) + eccodes.codes_set(grib, 'standardParallelInMicrodegrees', + central_lat / _DEFAULT_DEGREES_UNITS) + eccodes.codes_set(grib, 'centralLongitudeInMicrodegrees', + central_lon / _DEFAULT_DEGREES_UNITS) + eccodes.codes_set(grib, 'resolutionAndComponentFlags', + 0x1 << _RESOLUTION_AND_COMPONENTS_GRID_WINDS_BIT) + if (not (np.isclose(cs.false_easting, 0.0, atol=1e-6)) or + not (np.isclose(cs.false_northing, 0.0, atol=1e-6))): + msg = ('non zero false easting ({:.2f}) or ' + 'non zero false northing ({:.2f})' + '; unsupported by GRIB Template 3.140' + '').format(cs.false_easting, cs.false_northing) + raise TranslationError(msg) + + def grid_definition_section(cube, grib): """ Set keys within the grid definition section of the provided grib message, @@ -684,6 +751,11 @@ def grid_definition_section(cube, grib): elif isinstance(cs, LambertConformal): # Lambert Conformal coordinate system (template 3.30). grid_definition_template_30(cube, grib) + + elif isinstance(cs, LambertAzimuthalEqualArea): + # Lambert Azimuthal Equal Area coordinate system (template 3.140). + grid_definition_template_140(cube, grib) + else: name = cs.grid_mapping_name.replace('_', ' ').title() emsg = 'Grib saving is not supported for coordinate system {!r}' diff --git a/iris_grib/tests/integration/save_rules/test_grid_definition_section.py b/iris_grib/tests/integration/save_rules/test_grid_definition_section.py index 3f5f586f..46512831 100644 --- a/iris_grib/tests/integration/save_rules/test_grid_definition_section.py +++ b/iris_grib/tests/integration/save_rules/test_grid_definition_section.py @@ -17,7 +17,8 @@ Mercator, TransverseMercator, LambertConformal, - AlbersEqualArea) + AlbersEqualArea, + LambertAzimuthalEqualArea) import numpy as np from iris_grib._save_rules import grid_definition_section @@ -99,6 +100,16 @@ def test_grid_definition_template_30(self): grid_definition_section(test_cube, self.mock_grib) self._check_key('gridDefinitionTemplateNumber', 30) + def test_grid_definition_template_140(self): + # Lambert Conformal grid. + x_points = np.arange(3) + y_points = np.arange(3) + coord_units = 'm' + cs = LambertAzimuthalEqualArea(ellipsoid=self.ellipsoid) + test_cube = self._make_test_cube(cs, x_points, y_points, coord_units) + grid_definition_section(test_cube, self.mock_grib) + self._check_key('gridDefinitionTemplateNumber', 140) + def test_coord_system_not_supported(self): # Test an unsupported grid - let's choose Albers Equal Area. x_points = np.arange(3) diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_140.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_140.py new file mode 100644 index 00000000..04b69117 --- /dev/null +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_140.py @@ -0,0 +1,133 @@ +# Copyright iris-grib contributors +# +# This file is part of iris-grib 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 :meth:`iris_grib._save_rules.grid_definition_template_140`. + +""" + +# Import iris_grib.tests first so that some things can be initialised before +# importing anything else. +import iris_grib.tests as tests + +import numpy as np + +import iris.coords +from iris.coord_systems import GeogCS, LambertAzimuthalEqualArea +from iris.exceptions import TranslationError + +from iris_grib._save_rules import ( + grid_definition_template_140 as grid_definition_template, +) +from iris_grib.tests.unit.save_rules import GdtTestMixin + + +class FakeGribError(Exception): + pass + + +class Test(tests.IrisGribTest, GdtTestMixin): + def setUp(self): + self.default_ellipsoid = GeogCS(semi_major_axis=6377563.396, + semi_minor_axis=6356256.909) + self.test_cube = self._make_test_cube() + + GdtTestMixin.setUp(self) + + def _make_test_cube(self, cs=None, x_points=None, y_points=None): + # Create a cube with given properties, or minimal defaults. + if cs is None: + cs = self._default_coord_system() + if x_points is None: + x_points = self._default_x_points() + if y_points is None: + y_points = self._default_y_points() + + x_coord = iris.coords.DimCoord(x_points, 'projection_x_coordinate', + units='m', coord_system=cs) + y_coord = iris.coords.DimCoord(y_points, 'projection_y_coordinate', + units='m', coord_system=cs) + test_cube = iris.cube.Cube(np.zeros((len(y_points), len(x_points)))) + test_cube.add_dim_coord(y_coord, 0) + test_cube.add_dim_coord(x_coord, 1) + return test_cube + + def _default_coord_system(self, false_easting=0, false_northing=0): + return LambertAzimuthalEqualArea(latitude_of_projection_origin=54.9, + longitude_of_projection_origin=-2.5, + false_easting=false_easting, + false_northing=false_northing, + ellipsoid=self.default_ellipsoid) + + def test__template_number(self): + grid_definition_template(self.test_cube, self.mock_grib) + self._check_key('gridDefinitionTemplateNumber', 140) + + def test__shape_of_earth(self): + grid_definition_template(self.test_cube, self.mock_grib) + self._check_key('shapeOfTheEarth', 7) + self._check_key('scaleFactorOfEarthMajorAxis', 0) + self._check_key('scaledValueOfEarthMajorAxis', 6377563.396) + self._check_key('scaleFactorOfEarthMinorAxis', 0) + self._check_key('scaledValueOfEarthMinorAxis', 6356256.909) + + def test__grid_shape(self): + test_cube = self._make_test_cube(x_points=np.arange(13), + y_points=np.arange(6)) + grid_definition_template(test_cube, self.mock_grib) + self._check_key('Nx', 13) + self._check_key('Ny', 6) + + def test__grid_points(self): + test_cube = self._make_test_cube(x_points=[1e6, 3e6, 5e6, 7e6], + y_points=[4e6, 9e6]) + grid_definition_template(test_cube, self.mock_grib) + self._check_key("latitudeOfFirstGridPoint", 81330008) + self._check_key("longitudeOfFirstGridPoint", 98799008) + self._check_key("Dx", 2e9) + self._check_key("Dy", 5e9) + + # specific to grid_definition_template_140 + def test__template_specifics(self): + grid_definition_template(self.test_cube, self.mock_grib) + self._check_key("standardParallelInMicrodegrees", 54900000) + self._check_key("centralLongitudeInMicrodegrees", 357500000) + + def test__scanmode(self): + grid_definition_template(self.test_cube, self.mock_grib) + self._check_key('iScansPositively', 1) + self._check_key('jScansPositively', 1) + + def test__scanmode_reverse(self): + test_cube = self._make_test_cube(x_points=np.arange(7e6, 0, -1e6)) + grid_definition_template(test_cube, self.mock_grib) + self._check_key('iScansPositively', 0) + self._check_key('jScansPositively', 1) + + def __fail_false_easting_northing(self, false_easting, false_northing): + cs = self._default_coord_system(false_easting=false_easting, + false_northing=false_northing) + test_cube = self._make_test_cube(cs=cs) + msg = (r'non zero false easting \(\d*\.\d{2}\) or ' + r'non zero false northing \(\d*\.\d{2}\)' + r'; unsupported by GRIB Template 3\.140' + r'') + with self.assertRaisesRegex( + TranslationError, + msg): + grid_definition_template(test_cube, self.mock_grib) + + def test__fail_false_easting(self): + self.__fail_false_easting_northing(10.0, 0.0) + + def test__fail_false_northing(self): + self.__fail_false_easting_northing(0.0, 10.0) + + def test__fail_false_easting_northing(self): + self.__fail_false_easting_northing(10.0, 10.0) + + +if __name__ == "__main__": + tests.main() From 33cada863285704e6c6e013767b8018208a287b4 Mon Sep 17 00:00:00 2001 From: tkknight <2108488+tkknight@users.noreply.github.com> Date: Tue, 28 Nov 2023 13:17:33 +0000 Subject: [PATCH 243/583] Fix the docs building on readthedocs (#366) * correct yml reference and rename * add fuller readthedocs config * wip * remove comments --- .readthedocs.yml | 19 +++++++++++++++++++ readthedocs.yml | 2 -- requirements/py311.yml | 4 ++++ 3 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 .readthedocs.yml delete mode 100644 readthedocs.yml diff --git a/.readthedocs.yml b/.readthedocs.yml new file mode 100644 index 00000000..f10f1852 --- /dev/null +++ b/.readthedocs.yml @@ -0,0 +1,19 @@ +conda: +version: 2 + +build: + os: ubuntu-20.04 + tools: + python: mambaforge-4.10 + +conda: + environment: requirements/readthedocs.yml + +sphinx: + configuration: docs/conf.py + fail_on_warning: false + +python: + install: + - method: pip + path: . diff --git a/readthedocs.yml b/readthedocs.yml deleted file mode 100644 index 4653044c..00000000 --- a/readthedocs.yml +++ /dev/null @@ -1,2 +0,0 @@ -conda: - file: requirements/ci/readthedocs.yml diff --git a/requirements/py311.yml b/requirements/py311.yml index 4417eccd..8df4d429 100644 --- a/requirements/py311.yml +++ b/requirements/py311.yml @@ -24,3 +24,7 @@ dependencies: - pep8 - requests - nose + +# Documentation dependencies. + - sphinx + - sphinx_rtd_theme \ No newline at end of file From 831ea257d82c3f0d7ec6a840f57654de9979b0a6 Mon Sep 17 00:00:00 2001 From: Bill Little Date: Thu, 30 Nov 2023 14:45:33 +0000 Subject: [PATCH 244/583] bump main version to 0.20.dev0 (#363) --- iris_grib/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index 31992724..40369b9b 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -30,7 +30,7 @@ from .message import GribMessage -__version__ = '0.19.dev0' +__version__ = '0.20.dev0' __all__ = ['load_cubes', 'save_grib2', 'load_pairs_from_fields', 'save_pairs_from_cube', 'save_messages'] From 72ef90ddd896ab43011b66e3b79b8d0134992eac Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Thu, 11 Jan 2024 16:30:05 +0000 Subject: [PATCH 245/583] v0x19 docs update (#370) * Fix the docs building on readthedocs (#366) * correct yml reference and rename * add fuller readthedocs config * wip * remove comments * Docs updates for the v0.19 release (not done in the original tagged release). * Remove redundant sphinx config causing warnings. * Fix presentation of release-page link. * Add v0.19.1 whatsnew, just to cover the docs update. * Update docs/conf.py Co-authored-by: Elias <110238618+ESadek-MO@users.noreply.github.com> * Update .readthedocs.yml * Update docs/conf.py Co-authored-by: Elias <110238618+ESadek-MO@users.noreply.github.com> --------- Co-authored-by: tkknight <2108488+tkknight@users.noreply.github.com> Co-authored-by: Elias <110238618+ESadek-MO@users.noreply.github.com> --- .readthedocs.yml | 18 +++++++++++++ docs/conf.py | 4 +-- docs/index.rst | 2 +- docs/ref/release_notes.rst | 52 +++++++++++++++++++++++++++++++++++--- readthedocs.yml | 2 -- requirements/py311.yml | 4 +++ 6 files changed, 73 insertions(+), 9 deletions(-) create mode 100644 .readthedocs.yml delete mode 100644 readthedocs.yml diff --git a/.readthedocs.yml b/.readthedocs.yml new file mode 100644 index 00000000..d9e6d5ce --- /dev/null +++ b/.readthedocs.yml @@ -0,0 +1,18 @@ +version: 2 + +build: + os: ubuntu-20.04 + tools: + python: mambaforge-4.10 + +conda: + environment: requirements/readthedocs.yml + +sphinx: + configuration: docs/conf.py + fail_on_warning: false + +python: + install: + - method: pip + path: . diff --git a/docs/conf.py b/docs/conf.py index db9a165b..1bea4638 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -65,7 +65,7 @@ # # This is also used if you do content translation via gettext catalogs. # Usually you set "language" from the command line for these cases. -language = None +# language = "en" # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: @@ -145,7 +145,7 @@ # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] +# html_static_path = ['_static'] # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied diff --git a/docs/index.rst b/docs/index.rst index d13f95cd..e98a5abf 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -3,7 +3,7 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -Iris-grib v0.18 +Iris-grib v0.19 =============== The library ``iris-grib`` provides functionality for converting between weather and diff --git a/docs/ref/release_notes.rst b/docs/ref/release_notes.rst index c8d9db83..f6b4dc55 100644 --- a/docs/ref/release_notes.rst +++ b/docs/ref/release_notes.rst @@ -1,24 +1,43 @@ Release Notes ============= +What's new in iris-grib v0.19.1 +------------------------------- + +:Release: 0.19.1 +:Date: 14 December 2023 + +Documentation +^^^^^^^^^^^^^ +* `@pp-mo `_ updated the release notes with v0.19 changes. + `(PR#370) `_ + What's new in iris-grib v0.19.0 ------------------------------- :Release: 0.19.0 -:Date: [unreleased] +:Date: 16 November 2023 +See also : +`GitHub v0.19.0 release page `_ -======= Features ^^^^^^^^ -* `@lbdreyer `_ and +* `@lbdreyer `_ and `@pp-mo `_ (reviewer) modified the loading of GRIB messages with an unrecognised fixed surface type. These are now loaded in as an unnamed coordinate with an attribute called GRIB_fixed_surface_type. iris-grib will also save out cubes with this attribute as the given fixed - surface type.`(PR#318) `_ + surface type. `(PR#318) `_ +* `@trexfeathers `_ extended Transverse Mercator + to support negative scanning. + `(PR#296) `_ + +* `@trexfeathers `_ added a number of new GRIB-CF + mappings, i.e. translations from GRIB parameters to CF standard names and vice-versa. + `(PR#297) `_ Bugs Fixed ^^^^^^^^^^ @@ -31,11 +50,36 @@ Bugs Fixed in Earth's radius will result in a different coordinate system and may also affect the coordinate values. `(PR#316) `_ +* `@s-boardman `_ corrected the calculation of bounded + forecast periods in GRIB1 loading. + `(PR#322) `_ +* `@david-bentley `_ fixed the calculation of message + file offsets to work in Windows as well as Linux, which was causing load failures. + `(PR#287) `_ +* `@bjlittle `_ fixed an error that occurred when a + message had all-missing data points. + `(PR#362) `_ + +Internal +^^^^^^^^ +* `@lbdreyer `_ relicensed the repo from LGPL-3 to BSD-3. + `(PR#359) `_ Dependencies ^^^^^^^^^^^^ * now requires Python version >= 3.9 +* replaced deprecated eccodes-python PyPI package with new eccodes by @valeriupredoi in #357 +* `@valeriupredoi `_ replaced the deprecated + eccodes-python PyPI package with eccodes. + `(PR#357) `_ + +New Contributors +^^^^^^^^^^^^^^^^ +Welcome to +* `@s-boardman `_ +* `@david-bentley `_ +* `@valeriupredoi `_ What's new in iris-grib v0.18.0 diff --git a/readthedocs.yml b/readthedocs.yml deleted file mode 100644 index 4653044c..00000000 --- a/readthedocs.yml +++ /dev/null @@ -1,2 +0,0 @@ -conda: - file: requirements/ci/readthedocs.yml diff --git a/requirements/py311.yml b/requirements/py311.yml index 4417eccd..8df4d429 100644 --- a/requirements/py311.yml +++ b/requirements/py311.yml @@ -24,3 +24,7 @@ dependencies: - pep8 - requests - nose + +# Documentation dependencies. + - sphinx + - sphinx_rtd_theme \ No newline at end of file From 3268c0a2372043a6e2917c1f4299cfbfa6adf8a8 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Fri, 12 Jan 2024 17:57:06 +0000 Subject: [PATCH 246/583] Fix licence header. (#374) --- .../unit/save_rules/test_grid_definition_template_140.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_140.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_140.py index 04b69117..7f888b5c 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_template_140.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_140.py @@ -1,8 +1,7 @@ # Copyright iris-grib contributors # -# This file is part of iris-grib and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. """ Unit tests for :meth:`iris_grib._save_rules.grid_definition_template_140`. From 75e5953042b6fbf477ed3bb4998571850ca1dddf Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Sat, 13 Jan 2024 15:59:48 +0000 Subject: [PATCH 247/583] Updated environment lockfiles (#367) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 101 ++++++++++----------- requirements/locks/py311-linux-64.lock | 118 ++++++++++++++----------- requirements/locks/py39-linux-64.lock | 101 ++++++++++----------- 3 files changed, 170 insertions(+), 150 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index f784bbd7..48bdb8ec 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -1,39 +1,40 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: da23d6f576283f7c8ba63dcf289b084779626cba812e6219f67b673ee4011fe4 +# input_hash: 42959e024947f87d87470694730c91b9c55299c19d403eaf64d89ea358614b6e @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.7.22-hbcca054_0.conda#a73ecd2988327ad4c8f2c331482917f2 +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.11.17-hbcca054_0.conda#01ffc8d36f9eba0ce0b3c1955fa780ee https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_2.conda#9172c297304f2a20134fc56c97fbe229 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_3.conda#937eaed008f6bf2191c5fe76f87755e9 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-4_cp310.conda#26322ec5d7712c3ded99dd656142b8ce -https://conda.anaconda.org/conda-forge/noarch/tzdata-2023c-h71feb2d_0.conda#939e3e74d8be4dac89ce83b20de2492a -https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_2.conda#e2042154faafe61969556f28bade94b9 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2023d-h0c530f3_0.conda#8dee24b8be2d9ff81e7bd4d7d97ff1b0 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_3.conda#7124cbb46b13d395bdde68f2d215c989 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_2.conda#c28003b0be0494f9a7664389146716ff +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_3.conda#23fdf1fef05baeb7eadc2aed5fb0011f https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.21.0-hd590300_0.conda#c06fa0440048270817b9e3142cc661bf -https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.0-h59595ed_0.conda#3fdf79ef322c8379ae83be491d805369 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.25.0-hd590300_0.conda#89e40af02dd3a0846c0c1131c5126706 +https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.2-h59595ed_1.conda#127b0be54c1c90760d7fe02ea7a56426 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.19-hd590300_0.conda#1635570038840ee3f9c71d22aa5b8b6d -https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h516909a_1.tar.bz2#6f8720dff19e17ce5d48cfe7f3d2f0a3 +https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.5.0-hcb278e6_1.conda#6305a3dd2752c76335295da4e581f2fd https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_2.conda#78fdab09d9138851dde2b5fe2a11019e -https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-h166bdaf_0.tar.bz2#b62b52da46c39ee2bc3c162ac7f1804d +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_3.conda#c714d905cdfa0e70200f68b80cc04764 +https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_0.conda#30de3fd9b3b602f7473f30e684eeea8c +https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-h59595ed_2.conda#7dbaa197d7ba6032caf7ae7f32c1efa0 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.1.4-hd590300_0.conda#412ba6938c3e2abaca8b1129ea82e238 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.0-hd590300_1.conda#603827b39ea2b835268adb8c821b8570 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-h9fff704_0.conda#e6d228cd0bb74a51dd18f5bfce0b4115 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b @@ -49,14 +50,14 @@ https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd7 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_2.conda#e75a75a6eaf6f318dae2631158c46575 -https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_0.conda#9b13d5ee90fc9f09d54fd403247342b4 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_3.conda#73031c79546ad06f1fe62e57fdd021bc +https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.39-h753d276_0.conda#e1c890aebdebbfbf87e2c917187b4416 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.44.0-h2797004_0.conda#b58e6816d137f3aabf77d341dd5d732b +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.44.2-h2797004_0.conda#3b6a9f225c3dbe0d24f4fedd4625c5bf https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.11.5-h232c23b_1.conda#f3858448893839820d4bcfb14ad3ecdf +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.3-h232c23b_0.conda#bc6ac4c0cea148d924f621985bc3892b https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc @@ -67,29 +68,29 @@ https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-h0f2a231_0.conda#00 https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda#39f910d205726805a958da408ca194ba https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.24-pthreads_h413a1c8_0.conda#6e4ef6ca28655124dcde9bd500e44c32 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.25-pthreads_h413a1c8_0.conda#d172b34a443b95f86089e8229ddc9a17 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-ha9c0a0a_2.conda#55ed21669b2015f77c180feb1dd41930 -https://conda.anaconda.org/conda-forge/linux-64/python-3.10.13-hd12c33a_0_cpython.conda#f3a8c32aa764c3e7188b4b810fc9d6ce -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.44.0-h2c6b66d_0.conda#df56c636df4a98990462d66ac7be2330 +https://conda.anaconda.org/conda-forge/linux-64/python-3.10.13-hd12c33a_1_cpython.conda#ed38140af93f81319ebc472fbcf16cca +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.44.2-h2c6b66d_0.conda#4f2892c672829693fd978d065db4e8be https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.7-h8ee46fc_0.conda#49e482d882669206653b095f5206c05b -https://conda.anaconda.org/conda-forge/linux-64/antlr-python-runtime-4.7.2-py310hff52083_1003.tar.bz2#8324f8fff866055d4b32eb25e091fe31 -https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda#3edfead7cedd1ab4400a6c588f3e75f8 +https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 +https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda#5e4c0743c70186509d1412e03c2d8dfa https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hc6cd4ac_1.conda#1f95722c94f00b69af69a066c7433714 -https://conda.anaconda.org/conda-forge/noarch/certifi-2023.7.22-pyhd8ed1ab_0.conda#7f3dbc9179b4dde7da98dfb151d0ad22 +https://conda.anaconda.org/conda-forge/noarch/certifi-2023.11.17-pyhd8ed1ab_0.conda#2011bcf45376341dd1d690263fdbc789 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.conda#753d29fe41bb881e4b9c004f0abf973f https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.1-pyhd8ed1ab_0.conda#0c1729b74a8152fde6a38ba0a2ab9f45 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.10.0-pyhca7485f_0.conda#5b86cf1ceaaa9be2ec4627377e538db1 -https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed +https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.12.2-pyhca7485f_0.conda#bf40f2a8835b78b1f91083d306b493d2 +https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda#1a76f09108576397c41c0b0c5bd84134 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py310hd41b1e2_1.conda#b8d67603d43b23ce7e988a5d81a7ab79 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-hb7c19ff_3.conda#e96637dd92c5f340215c753a5c9a22d7 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-19_linux64_openblas.conda#420f4e9be59d0dc9133a0f43f7bab3f3 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.4.0-hca28451_0.conda#1158ac1d2613b28685644931f11ee807 +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-20_linux64_openblas.conda#2b7bb4f7562c8cf334fc2e20c2d28abc +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.5.0-hca28451_0.conda#7144d5a828e2cae218e0e3c98d8a0aeb https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py310h2372a71_1.conda#b74e07a054c479e45a83a83fc5be713c https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda#926c67c0310094cf421ad13f7d3f38e5 @@ -104,45 +105,45 @@ https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#9 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py310h2372a71_0.conda#b631b889b0b4bc2fca7b8b977ca484b2 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py310h2372a71_1.conda#bb010e368de4940771368bc3dc4c63e7 -https://conda.anaconda.org/conda-forge/noarch/setuptools-68.2.2-pyhd8ed1ab_0.conda#fc2166155db840c634a1291a5c35a709 +https://conda.anaconda.org/conda-forge/noarch/setuptools-69.0.3-pyhd8ed1ab_0.conda#40695fdfd15a92121ed2922900d0308b https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py310h2372a71_0.conda#72637c58d36d9475fda24700c9796f19 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.41.3-pyhd8ed1ab_0.conda#3fc026b9c87d091c4b34a6c997324ae8 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.42.0-pyhd8ed1ab_0.conda#1cdea58981c5cbc17b51973bcaddcea7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py310h2fee648_0.conda#45846a970e71ac98fd327da5d40a0a2c -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.44.0-py310h2372a71_0.conda#3d1677945147b2d6eb0fef35e98e650f -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.2-nompi_h4f84152_100.conda#2de6a9bc8083b49f09b2f6eb28d3ba3c -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda#4e9f59a060c3be52bc4ddc46ee9b6946 -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-19_linux64_openblas.conda#d12374af44575413fbbd4a217d46ea33 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.47.2-py310h2372a71_0.conda#0688fca50c84de6ff0df1c6440941e0e +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_100.conda#d471a5c3abc984b662d9bae3bb7fd8a5 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.0.1-pyha770c72_0.conda#746623a787e06191d80a2133e5daff17 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda#e7d8df6509ba635247ff9aea31134262 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-20_linux64_openblas.conda#36d486d72ab64ffea932329a1d3729a3 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-19_linux64_openblas.conda#9f100edf65436e3eabc2a51fc00b2c37 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-20_linux64_openblas.conda#6fabc51f5e647d09cc010c40061557e0 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 -https://conda.anaconda.org/conda-forge/linux-64/pillow-10.1.0-py310h01dd4db_0.conda#95d87a906d88b5824d7d36eeef091dba -https://conda.anaconda.org/conda-forge/noarch/pip-23.3.1-pyhd8ed1ab_0.conda#2400c0b86889f43aa52067161e1fb108 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.0-h1d62c97_2.conda#b5e57a0c643da391bef850922963eece +https://conda.anaconda.org/conda-forge/linux-64/pillow-10.2.0-py310h01dd4db_0.conda#9ec32d0d90f7670eb29bbba18299cf29 +https://conda.anaconda.org/conda-forge/noarch/pip-23.3.2-pyhd8ed1ab_0.conda#8591c748f98dcc02253003533bc2e4b1 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.1-h1d62c97_0.conda#44ec51d0857d9be26158bb85caa74fdb https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.7-pyhd8ed1ab_0.conda#270e71c14d37074b1d066ee21cf0c4a6 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.1.0-pyhd8ed1ab_0.conda#f8ced8ee63830dec7ecc1be048d1470a https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.8.0-hd8ed1ab_0.conda#b279b07ce18058034e5b3606ba103a8b -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h80fb2b6_112.conda#a19fa6cacf80c8a366572853d5890eb4 -https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.0-py310hb13e2d6_0.conda#ac3b67e928cc71548efad9b522d42fef -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py310h32c33b7_4.conda#124211262afed349430d9a3de6b51e8f +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.0.1-hd8ed1ab_0.conda#4a2f43a20fa404b998859c6a470ba316 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h9612171_113.conda#b2414908e43c442ddc68e6148774a304 +https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.3-py310hb13e2d6_0.conda#e5e9c6f112d581cdf465b8ca861cb14f +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py310hd5c30f3_5.conda#dc2ee770a2299307f3c127af79160d25 https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py310h1f7b6fc_0.conda#31beda75384647959d5792a1a7dc571a https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py310hd41b1e2_0.conda#85d2aaa7af046528d339da1e813c3a9f -https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.11.0-pyhd8ed1ab_0.conda#3bf8f5c3fbab9e0cfffdf5914f021854 -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.1.0-he6dfbbe_0.conda#548cd4a0a160a7c89f10352ab53bfe90 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.1.0-pyhd8ed1ab_0.conda#cab4cec272dc1e30086f7d32faa4f130 +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.1.2-he6dfbbe_0.conda#1a6543c3190ecb27a4b2ed71e15afe6e https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py310h2372a71_1.conda#dfcf64f67961eb9686676f96fdb4b4d1 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.3-py310hb13e2d6_1.conda#4260b359d8fbeab4f789a8b0f968079f -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.2-py310h7dcad9a_0.conda#0d7c35fe5cc1f436e368ddd500deb979 -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py310h1f7b6fc_1.conda#3e0ee847bf68ed9085ac74b4615f5ce9 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.32.1-h35c6de3_0.conda#09d044f9206700e021916675a16d1e4d -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.1-py310h62c0568_0.conda#e650bd952e5618050ccb088bc0c6dfb4 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.4-py310hb13e2d6_0.conda#f0063b2885bfae11324a00a693f88781 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.2-py310hc3e127f_1.conda#fdaca8d27b3af78d617521eb37b1d055 +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py310h1f7b6fc_4.conda#0ca55ca20891d393846695354b32ebc5 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.33.0-he84ddb8_0.conda#41dfb7e5326466a1622fed133d50b61c +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.2-py310h62c0568_0.conda#3cbbc7d0b54df02c9a006d3de14911d9 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py310hba70d50_100.conda#e19392760c7e4da3b9cb0ee5bf61bc4b https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py310hcc13569_1.conda#31ef447724fb19066a9d00a660dab1bd https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.6.1-py310h1f7b6fc_1.conda#eee8d291cab9c673142ce54c5d561fa8 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 85770396..800a69f6 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -1,39 +1,40 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 7ba8dd0ea14f6731b227a9f412cf87a9038d72cc8ce6b75cfe3c6f1d6b2e94f7 +# input_hash: d850f77e09b05b44a812099bacb3a601086060a014e4c8a98ad37b3f3ccaa79b @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.7.22-hbcca054_0.conda#a73ecd2988327ad4c8f2c331482917f2 +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.11.17-hbcca054_0.conda#01ffc8d36f9eba0ce0b3c1955fa780ee https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_2.conda#9172c297304f2a20134fc56c97fbe229 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_3.conda#937eaed008f6bf2191c5fe76f87755e9 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-4_cp311.conda#d786502c97404c94d7d58d258a445a65 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2023c-h71feb2d_0.conda#939e3e74d8be4dac89ce83b20de2492a -https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_2.conda#e2042154faafe61969556f28bade94b9 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2023d-h0c530f3_0.conda#8dee24b8be2d9ff81e7bd4d7d97ff1b0 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_3.conda#7124cbb46b13d395bdde68f2d215c989 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_2.conda#c28003b0be0494f9a7664389146716ff +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_3.conda#23fdf1fef05baeb7eadc2aed5fb0011f https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.21.0-hd590300_0.conda#c06fa0440048270817b9e3142cc661bf -https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.0-h59595ed_0.conda#3fdf79ef322c8379ae83be491d805369 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.25.0-hd590300_0.conda#89e40af02dd3a0846c0c1131c5126706 +https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.2-h59595ed_1.conda#127b0be54c1c90760d7fe02ea7a56426 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.19-hd590300_0.conda#1635570038840ee3f9c71d22aa5b8b6d -https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h516909a_1.tar.bz2#6f8720dff19e17ce5d48cfe7f3d2f0a3 +https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.5.0-hcb278e6_1.conda#6305a3dd2752c76335295da4e581f2fd https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_2.conda#78fdab09d9138851dde2b5fe2a11019e -https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-h166bdaf_0.tar.bz2#b62b52da46c39ee2bc3c162ac7f1804d +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_3.conda#c714d905cdfa0e70200f68b80cc04764 +https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_0.conda#30de3fd9b3b602f7473f30e684eeea8c +https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-h59595ed_2.conda#7dbaa197d7ba6032caf7ae7f32c1efa0 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.1.4-hd590300_0.conda#412ba6938c3e2abaca8b1129ea82e238 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.0-hd590300_1.conda#603827b39ea2b835268adb8c821b8570 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-h9fff704_0.conda#e6d228cd0bb74a51dd18f5bfce0b4115 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b @@ -49,14 +50,14 @@ https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd7 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_2.conda#e75a75a6eaf6f318dae2631158c46575 -https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_0.conda#9b13d5ee90fc9f09d54fd403247342b4 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_3.conda#73031c79546ad06f1fe62e57fdd021bc +https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.39-h753d276_0.conda#e1c890aebdebbfbf87e2c917187b4416 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.44.0-h2797004_0.conda#b58e6816d137f3aabf77d341dd5d732b +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.44.2-h2797004_0.conda#3b6a9f225c3dbe0d24f4fedd4625c5bf https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.11.5-h232c23b_1.conda#f3858448893839820d4bcfb14ad3ecdf +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.3-h232c23b_0.conda#bc6ac4c0cea148d924f621985bc3892b https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc @@ -67,29 +68,33 @@ https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-h0f2a231_0.conda#00 https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda#39f910d205726805a958da408ca194ba https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.24-pthreads_h413a1c8_0.conda#6e4ef6ca28655124dcde9bd500e44c32 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.25-pthreads_h413a1c8_0.conda#d172b34a443b95f86089e8229ddc9a17 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-ha9c0a0a_2.conda#55ed21669b2015f77c180feb1dd41930 -https://conda.anaconda.org/conda-forge/linux-64/python-3.11.6-hab00c5b_0_cpython.conda#b0dfbe2fcbfdb097d321bfd50ecddab1 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.44.0-h2c6b66d_0.conda#df56c636df4a98990462d66ac7be2330 +https://conda.anaconda.org/conda-forge/linux-64/python-3.11.7-hab00c5b_1_cpython.conda#27cf681282c11dba7b0b1fd266e8f289 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.44.2-h2c6b66d_0.conda#4f2892c672829693fd978d065db4e8be https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.7-h8ee46fc_0.conda#49e482d882669206653b095f5206c05b -https://conda.anaconda.org/conda-forge/linux-64/antlr-python-runtime-4.7.2-py311h38be061_1003.tar.bz2#0ab8f8f0cae99343907fe68cda11baea -https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda#3edfead7cedd1ab4400a6c588f3e75f8 +https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb +https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 +https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda#5e4c0743c70186509d1412e03c2d8dfa https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hb755f60_1.conda#cce9e7c3f1c307f2a5fb08a2922d6164 -https://conda.anaconda.org/conda-forge/noarch/certifi-2023.7.22-pyhd8ed1ab_0.conda#7f3dbc9179b4dde7da98dfb151d0ad22 +https://conda.anaconda.org/conda-forge/noarch/certifi-2023.11.17-pyhd8ed1ab_0.conda#2011bcf45376341dd1d690263fdbc789 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.conda#753d29fe41bb881e4b9c004f0abf973f +https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 +https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py311h38be061_3.conda#1c33f55e5cdcc2a2b973c432b5225bfe https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.1-pyhd8ed1ab_0.conda#0c1729b74a8152fde6a38ba0a2ab9f45 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.10.0-pyhca7485f_0.conda#5b86cf1ceaaa9be2ec4627377e538db1 -https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed +https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.12.2-pyhca7485f_0.conda#bf40f2a8835b78b1f91083d306b493d2 +https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda#1a76f09108576397c41c0b0c5bd84134 +https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py311h9547e67_1.conda#2c65bdf442b0d37aad080c8a4e0d452f -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-hb7c19ff_3.conda#e96637dd92c5f340215c753a5c9a22d7 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-19_linux64_openblas.conda#420f4e9be59d0dc9133a0f43f7bab3f3 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.4.0-hca28451_0.conda#1158ac1d2613b28685644931f11ee807 +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-20_linux64_openblas.conda#2b7bb4f7562c8cf334fc2e20c2d28abc +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.5.0-hca28451_0.conda#7144d5a828e2cae218e0e3c98d8a0aeb https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py311h459d7ec_1.conda#71120b5155a0c500826cf81536721a15 https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda#926c67c0310094cf421ad13f7d3f38e5 @@ -99,50 +104,63 @@ https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-h488ebb8_3.conda# https://conda.anaconda.org/conda-forge/noarch/packaging-23.2-pyhd8ed1ab_0.conda#79002079284aa895f883c6b7f3f88fd6 https://conda.anaconda.org/conda-forge/noarch/pep8-1.7.1-py_0.tar.bz2#d0b5bc3aebbffcb175bf8a1d419acb79 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff +https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda#140a7f159396547e9799aa98f9f0742e https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.1-pyhd8ed1ab_0.conda#176f7d56f0cfe9008bdf1bccd7de02fb https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py311h459d7ec_0.conda#60b5332b3989fda37884b92c7afd6a91 +https://conda.anaconda.org/conda-forge/noarch/pytz-2023.3.post1-pyhd8ed1ab_0.conda#c93346b446cd08c169d843ae5fc0da97 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py311h459d7ec_1.conda#52719a74ad130de8fb5d047dc91f247a -https://conda.anaconda.org/conda-forge/noarch/setuptools-68.2.2-pyhd8ed1ab_0.conda#fc2166155db840c634a1291a5c35a709 +https://conda.anaconda.org/conda-forge/noarch/setuptools-69.0.3-pyhd8ed1ab_0.conda#40695fdfd15a92121ed2922900d0308b https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 +https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.41.3-pyhd8ed1ab_0.conda#3fc026b9c87d091c4b34a6c997324ae8 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.42.0-pyhd8ed1ab_0.conda#1cdea58981c5cbc17b51973bcaddcea7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a +https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py311hb3a22ac_0.conda#b3469563ac5e808b0cd92810d0697043 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.44.0-py311h459d7ec_0.conda#f12f4d7361178f94df1052d6b63fd868 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.2-nompi_h4f84152_100.conda#2de6a9bc8083b49f09b2f6eb28d3ba3c -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda#4e9f59a060c3be52bc4ddc46ee9b6946 -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-19_linux64_openblas.conda#d12374af44575413fbbd4a217d46ea33 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.47.2-py311h459d7ec_0.conda#166735a569ab42067b858ca0090a0d22 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_100.conda#d471a5c3abc984b662d9bae3bb7fd8a5 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.0.1-pyha770c72_0.conda#746623a787e06191d80a2133e5daff17 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda#e7d8df6509ba635247ff9aea31134262 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-20_linux64_openblas.conda#36d486d72ab64ffea932329a1d3729a3 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-19_linux64_openblas.conda#9f100edf65436e3eabc2a51fc00b2c37 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-20_linux64_openblas.conda#6fabc51f5e647d09cc010c40061557e0 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 -https://conda.anaconda.org/conda-forge/linux-64/pillow-10.1.0-py311ha6c5da5_0.conda#83a988daf5c49e57f7d2086fb6781fe8 -https://conda.anaconda.org/conda-forge/noarch/pip-23.3.1-pyhd8ed1ab_0.conda#2400c0b86889f43aa52067161e1fb108 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.0-h1d62c97_2.conda#b5e57a0c643da391bef850922963eece +https://conda.anaconda.org/conda-forge/linux-64/pillow-10.2.0-py311ha6c5da5_0.conda#a5ccd7f2271f28b7d2de0b02b64e3796 +https://conda.anaconda.org/conda-forge/noarch/pip-23.3.2-pyhd8ed1ab_0.conda#8591c748f98dcc02253003533bc2e4b1 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.1-h1d62c97_0.conda#44ec51d0857d9be26158bb85caa74fdb https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.7-pyhd8ed1ab_0.conda#270e71c14d37074b1d066ee21cf0c4a6 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.1.0-pyhd8ed1ab_0.conda#f8ced8ee63830dec7ecc1be048d1470a https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.8.0-hd8ed1ab_0.conda#b279b07ce18058034e5b3606ba103a8b -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h80fb2b6_112.conda#a19fa6cacf80c8a366572853d5890eb4 -https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.0-py311h64a7726_0.conda#bf16a9f625126e378302f08e7ed67517 -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311h1facc83_4.conda#75d504c6787edc377ebdba087a26a61b +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.0.1-hd8ed1ab_0.conda#4a2f43a20fa404b998859c6a470ba316 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h9612171_113.conda#b2414908e43c442ddc68e6148774a304 +https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.3-py311h64a7726_0.conda#231eef4f33640338f64ef9ab690ba08d +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311hca0b8b9_5.conda#cac429fcb9126d5e6f02c8ba61c2a811 https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py311h1f0f07a_0.conda#b7e6d52b39e199238c3400cafaabafb3 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py311h9547e67_0.conda#40828c5b36ef52433e21f89943e09f33 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.11.0-pyhd8ed1ab_0.conda#3bf8f5c3fbab9e0cfffdf5914f021854 -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.1.0-he6dfbbe_0.conda#548cd4a0a160a7c89f10352ab53bfe90 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.1.0-pyhd8ed1ab_0.conda#cab4cec272dc1e30086f7d32faa4f130 +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.1.2-he6dfbbe_0.conda#1a6543c3190ecb27a4b2ed71e15afe6e https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py311h459d7ec_1.conda#45b8d355bbcdd27588c2d266bcfdff84 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.3-py311h64a7726_1.conda#e4b4d3b764e2d029477d0db88248a8b5 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.2-py311he06c224_0.conda#c90e2469d7512f3bba893533a82d7a02 -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h1f0f07a_1.conda#c667ac9fac7d0404d151fe9e4f22ab23 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.32.1-h35c6de3_0.conda#09d044f9206700e021916675a16d1e4d -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.1-py311h54ef318_0.conda#201fdabdb86bb8fb6e99fa3f0dab8122 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.4-py311h64a7726_0.conda#9ac5334f1b5ed072d3dbc342503d7868 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.2-py311h2032efe_1.conda#4ba860ff851768615b1a25b788022750 +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h1f0f07a_4.conda#1e105c1a8ea2163507726144b401eb1b +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.33.0-he84ddb8_0.conda#41dfb7e5326466a1622fed133d50b61c +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.2-py311h54ef318_0.conda#9f80753bc008bfc9b95f39d9ff9f1694 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py311he8ad708_100.conda#597b1ad6cb7011b7561c20ea30295cae https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py311h320fe9a_1.conda#10d1806e20da040c58c36deddf51c70c https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.6.1-py311h1f0f07a_1.conda#fa4f6eb8d7f25c8525f25ff173a687b4 https://conda.anaconda.org/conda-forge/noarch/iris-3.7.0-pyha770c72_0.conda#dccc1f660bf455c239adaabf56b91dc9 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.7-pyhd8ed1ab_0.conda#aebfabcb60c33a89c1f9290cab49bc93 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.5-pyhd8ed1ab_0.conda#ebf08f5184d8eaa486697bc060031953 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.4-pyhd8ed1ab_0.conda#a9a89000dfd19656ad004b937eeb6828 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jquery-4.1-pyhd8ed1ab_0.conda#914897066d5873acfb13e75705276ad1 +https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-2.0.0-pyha770c72_0.conda#baf6d9a33df1a789ca55e3b404c7ea28 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.6-pyhd8ed1ab_0.conda#cf5c9649272c677a964a7313279e3a9b +https://conda.anaconda.org/conda-forge/noarch/sphinx-7.2.6-pyhd8ed1ab_0.conda#bbfd1120d1824d2d073bc65935f0e4c0 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.9-pyhd8ed1ab_0.conda#0612e497d7860728f2cda421ea2aec09 diff --git a/requirements/locks/py39-linux-64.lock b/requirements/locks/py39-linux-64.lock index 5b1f6f8f..1a186eec 100644 --- a/requirements/locks/py39-linux-64.lock +++ b/requirements/locks/py39-linux-64.lock @@ -1,39 +1,40 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 127b02bcf9b2a0ba5f66b9f1dac937376ec9d7bfb70f94747a1451c820db2128 +# input_hash: 10a1f89d4b3a91b45d631ce4b7f38b8272309126004da633bac5a0c94dfe47de @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.7.22-hbcca054_0.conda#a73ecd2988327ad4c8f2c331482917f2 +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.11.17-hbcca054_0.conda#01ffc8d36f9eba0ce0b3c1955fa780ee https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_2.conda#9172c297304f2a20134fc56c97fbe229 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_3.conda#937eaed008f6bf2191c5fe76f87755e9 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.9-4_cp39.conda#bfe4b3259a8ac6cdf0037752904da6a7 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2023c-h71feb2d_0.conda#939e3e74d8be4dac89ce83b20de2492a -https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_2.conda#e2042154faafe61969556f28bade94b9 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2023d-h0c530f3_0.conda#8dee24b8be2d9ff81e7bd4d7d97ff1b0 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_3.conda#7124cbb46b13d395bdde68f2d215c989 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_2.conda#c28003b0be0494f9a7664389146716ff +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_3.conda#23fdf1fef05baeb7eadc2aed5fb0011f https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.21.0-hd590300_0.conda#c06fa0440048270817b9e3142cc661bf -https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.0-h59595ed_0.conda#3fdf79ef322c8379ae83be491d805369 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.25.0-hd590300_0.conda#89e40af02dd3a0846c0c1131c5126706 +https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.2-h59595ed_1.conda#127b0be54c1c90760d7fe02ea7a56426 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.19-hd590300_0.conda#1635570038840ee3f9c71d22aa5b8b6d -https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h516909a_1.tar.bz2#6f8720dff19e17ce5d48cfe7f3d2f0a3 +https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.5.0-hcb278e6_1.conda#6305a3dd2752c76335295da4e581f2fd https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_2.conda#78fdab09d9138851dde2b5fe2a11019e -https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-h166bdaf_0.tar.bz2#b62b52da46c39ee2bc3c162ac7f1804d +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_3.conda#c714d905cdfa0e70200f68b80cc04764 +https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_0.conda#30de3fd9b3b602f7473f30e684eeea8c +https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-h59595ed_2.conda#7dbaa197d7ba6032caf7ae7f32c1efa0 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.1.4-hd590300_0.conda#412ba6938c3e2abaca8b1129ea82e238 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.0-hd590300_1.conda#603827b39ea2b835268adb8c821b8570 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-h9fff704_0.conda#e6d228cd0bb74a51dd18f5bfce0b4115 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b @@ -49,14 +50,14 @@ https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd7 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_2.conda#e75a75a6eaf6f318dae2631158c46575 -https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_0.conda#9b13d5ee90fc9f09d54fd403247342b4 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_3.conda#73031c79546ad06f1fe62e57fdd021bc +https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.39-h753d276_0.conda#e1c890aebdebbfbf87e2c917187b4416 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.44.0-h2797004_0.conda#b58e6816d137f3aabf77d341dd5d732b +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.44.2-h2797004_0.conda#3b6a9f225c3dbe0d24f4fedd4625c5bf https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.11.5-h232c23b_1.conda#f3858448893839820d4bcfb14ad3ecdf +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.3-h232c23b_0.conda#bc6ac4c0cea148d924f621985bc3892b https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc @@ -67,29 +68,29 @@ https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-h0f2a231_0.conda#00 https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda#39f910d205726805a958da408ca194ba https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.24-pthreads_h413a1c8_0.conda#6e4ef6ca28655124dcde9bd500e44c32 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.25-pthreads_h413a1c8_0.conda#d172b34a443b95f86089e8229ddc9a17 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-ha9c0a0a_2.conda#55ed21669b2015f77c180feb1dd41930 -https://conda.anaconda.org/conda-forge/linux-64/python-3.9.18-h0755675_0_cpython.conda#3ede353bc605068d9677e700b1847382 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.44.0-h2c6b66d_0.conda#df56c636df4a98990462d66ac7be2330 +https://conda.anaconda.org/conda-forge/linux-64/python-3.9.18-h0755675_1_cpython.conda#255a7002aeec7a067ff19b545aca6328 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.44.2-h2c6b66d_0.conda#4f2892c672829693fd978d065db4e8be https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.7-h8ee46fc_0.conda#49e482d882669206653b095f5206c05b -https://conda.anaconda.org/conda-forge/linux-64/antlr-python-runtime-4.7.2-py39hf3d152e_1003.tar.bz2#5e8330e806e50bd6137ebd125f4bc1bb -https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda#3edfead7cedd1ab4400a6c588f3e75f8 +https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 +https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda#5e4c0743c70186509d1412e03c2d8dfa https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py39h3d6467e_1.conda#c48418c8b35f1d59ae9ae1174812b40a -https://conda.anaconda.org/conda-forge/noarch/certifi-2023.7.22-pyhd8ed1ab_0.conda#7f3dbc9179b4dde7da98dfb151d0ad22 +https://conda.anaconda.org/conda-forge/noarch/certifi-2023.11.17-pyhd8ed1ab_0.conda#2011bcf45376341dd1d690263fdbc789 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.conda#753d29fe41bb881e4b9c004f0abf973f https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.1-pyhd8ed1ab_0.conda#0c1729b74a8152fde6a38ba0a2ab9f45 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.10.0-pyhca7485f_0.conda#5b86cf1ceaaa9be2ec4627377e538db1 -https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed +https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.12.2-pyhca7485f_0.conda#bf40f2a8835b78b1f91083d306b493d2 +https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda#1a76f09108576397c41c0b0c5bd84134 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py39h7633fee_1.conda#c9f74d717e5a2847a9f8b779c54130f2 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-hb7c19ff_3.conda#e96637dd92c5f340215c753a5c9a22d7 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-19_linux64_openblas.conda#420f4e9be59d0dc9133a0f43f7bab3f3 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.4.0-hca28451_0.conda#1158ac1d2613b28685644931f11ee807 +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-20_linux64_openblas.conda#2b7bb4f7562c8cf334fc2e20c2d28abc +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.5.0-hca28451_0.conda#7144d5a828e2cae218e0e3c98d8a0aeb https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py39hd1e30aa_1.conda#ee2b4665b852ec6ff2758f3c1b91233d https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda#926c67c0310094cf421ad13f7d3f38e5 @@ -104,47 +105,47 @@ https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#9 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py39hd1e30aa_0.conda#756cb152772a225587a05ca0ec68fc08 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py39hd1e30aa_1.conda#37218233bcdc310e4fde6453bc1b40d8 -https://conda.anaconda.org/conda-forge/noarch/setuptools-68.2.2-pyhd8ed1ab_0.conda#fc2166155db840c634a1291a5c35a709 +https://conda.anaconda.org/conda-forge/noarch/setuptools-69.0.3-pyhd8ed1ab_0.conda#40695fdfd15a92121ed2922900d0308b https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py39hd1e30aa_0.conda#1da984bbb6e765743e13388ba7b7b2c8 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.41.3-pyhd8ed1ab_0.conda#3fc026b9c87d091c4b34a6c997324ae8 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.42.0-pyhd8ed1ab_0.conda#1cdea58981c5cbc17b51973bcaddcea7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py39h7a31438_0.conda#ac992767d7f8ed2cb27e71e78f0fb2d7 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.44.0-py39hd1e30aa_0.conda#bbfd1e3ef6f66b07e025fe872e854b0d -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.2-nompi_h4f84152_100.conda#2de6a9bc8083b49f09b2f6eb28d3ba3c -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda#4e9f59a060c3be52bc4ddc46ee9b6946 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.47.2-py39hd1e30aa_0.conda#4e2b802b69be81944fdcd71018b74226 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_100.conda#d471a5c3abc984b662d9bae3bb7fd8a5 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.0.1-pyha770c72_0.conda#746623a787e06191d80a2133e5daff17 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.1.1-pyhd8ed1ab_0.conda#3d5fa25cf42f3f32a12b2d874ace8574 -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-19_linux64_openblas.conda#d12374af44575413fbbd4a217d46ea33 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda#e7d8df6509ba635247ff9aea31134262 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-20_linux64_openblas.conda#36d486d72ab64ffea932329a1d3729a3 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-19_linux64_openblas.conda#9f100edf65436e3eabc2a51fc00b2c37 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-20_linux64_openblas.conda#6fabc51f5e647d09cc010c40061557e0 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 -https://conda.anaconda.org/conda-forge/linux-64/pillow-10.1.0-py39had0adad_0.conda#eeaa413fddccecb2ab7f747bdb55b07f -https://conda.anaconda.org/conda-forge/noarch/pip-23.3.1-pyhd8ed1ab_0.conda#2400c0b86889f43aa52067161e1fb108 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.0-h1d62c97_2.conda#b5e57a0c643da391bef850922963eece +https://conda.anaconda.org/conda-forge/linux-64/pillow-10.2.0-py39had0adad_0.conda#2972754dc054bb079d1d121918b5126f +https://conda.anaconda.org/conda-forge/noarch/pip-23.3.2-pyhd8ed1ab_0.conda#8591c748f98dcc02253003533bc2e4b1 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.1-h1d62c97_0.conda#44ec51d0857d9be26158bb85caa74fdb https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.7-pyhd8ed1ab_0.conda#270e71c14d37074b1d066ee21cf0c4a6 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.1.0-pyhd8ed1ab_0.conda#f8ced8ee63830dec7ecc1be048d1470a https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.1.1-pyhd8ed1ab_0.conda#d04bd1b5bed9177dd7c3cef15e2b6710 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.8.0-hd8ed1ab_0.conda#b279b07ce18058034e5b3606ba103a8b -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h80fb2b6_112.conda#a19fa6cacf80c8a366572853d5890eb4 -https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.0-py39h474f0d3_0.conda#62f1d2e05327bf62728afa448f2a9261 -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py39hce394fd_4.conda#4b6e79000ec3a495f429b2c1092ed63b +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.0.1-hd8ed1ab_0.conda#4a2f43a20fa404b998859c6a470ba316 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h9612171_113.conda#b2414908e43c442ddc68e6148774a304 +https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.3-py39h474f0d3_0.conda#a1f1ad2d8ebf63f13f45fb21b7f49dfb +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py39h15b0fa6_5.conda#85e186c7ff673b0d0026782ec353fb2a https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py39h44dd56e_0.conda#baea2f5dfb3ab7b1c836385d2e1daca7 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py39h7633fee_0.conda#ed71ad3e30eb03da363fb797419cce98 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.11.0-pyhd8ed1ab_0.conda#3bf8f5c3fbab9e0cfffdf5914f021854 -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.1.0-he6dfbbe_0.conda#548cd4a0a160a7c89f10352ab53bfe90 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.1.0-pyhd8ed1ab_0.conda#cab4cec272dc1e30086f7d32faa4f130 +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.1.2-he6dfbbe_0.conda#1a6543c3190ecb27a4b2ed71e15afe6e https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py39hd1e30aa_1.conda#ca63612907462c8e36edcc9bbacc253e -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.3-py39h474f0d3_1.conda#55441724fedb3042d38ffa5220f00804 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.2-py39h1bc45ef_0.conda#ca067895d22f8a0d38f225a95184858e -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py39h44dd56e_1.conda#c35fc79261456cdda0c701329c6b7675 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.32.1-h35c6de3_0.conda#09d044f9206700e021916675a16d1e4d -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.1-py39he9076e7_0.conda#89615b866cb3b0d8ad4e2a11e2bcf9a0 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.4-py39h474f0d3_0.conda#4b401c1516417b4b14aa1249d2f7929d +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.2-py39h6404dd3_1.conda#05623249055d99c51cde021b525611db +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py39h44dd56e_4.conda#81310d21bf9d91754c1220c585bb72d6 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.33.0-he84ddb8_0.conda#41dfb7e5326466a1622fed133d50b61c +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.2-py39he9076e7_0.conda#6085411aa2f0b2b801d3b46e1d3b83c5 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py39h4282601_100.conda#d2809fbf0d8ae7b8ca92c456cb44a7d4 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py39hddac248_1.conda#8dd2eb1e7aa9a33a92a75bdcea3f0dd0 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.6.1-py39h44dd56e_1.conda#0ac51aa5d5ccdc8f0106176823fde146 From b0ae1760c477e778bcf64498cb2bc1605d8dd752 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 22 Jan 2024 09:19:48 +0000 Subject: [PATCH 248/583] Updated environment lockfiles (#375) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 4 ++-- requirements/locks/py311-linux-64.lock | 14 +++++++------- requirements/locks/py39-linux-64.lock | 4 ++-- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 48bdb8ec..6db20451 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 42959e024947f87d87470694730c91b9c55299c19d403eaf64d89ea358614b6e +# input_hash: ce88382ab030763c8e7602a9957739e8dbf27aa5b8d5ef4b3bf35e84e5b22731 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.11.17-hbcca054_0.conda#01ffc8d36f9eba0ce0b3c1955fa780ee @@ -57,7 +57,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.44.2-h2797004_0.cond https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.3-h232c23b_0.conda#bc6ac4c0cea148d924f621985bc3892b +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.4-h232c23b_1.conda#53e951fab78d7e3bab40745f7b3d1620 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 800a69f6..b9a952d1 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: d850f77e09b05b44a812099bacb3a601086060a014e4c8a98ad37b3f3ccaa79b +# input_hash: db79b267f56be2d551ff654e226018d317f3bd344a34dc77081608b7d9640f79 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.11.17-hbcca054_0.conda#01ffc8d36f9eba0ce0b3c1955fa780ee @@ -57,7 +57,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.44.2-h2797004_0.cond https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.3-h232c23b_0.conda#bc6ac4c0cea148d924f621985bc3892b +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.4-h232c23b_1.conda#53e951fab78d7e3bab40745f7b3d1620 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc @@ -156,11 +156,11 @@ https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py311he8ad70 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py311h320fe9a_1.conda#10d1806e20da040c58c36deddf51c70c https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.6.1-py311h1f0f07a_1.conda#fa4f6eb8d7f25c8525f25ff173a687b4 https://conda.anaconda.org/conda-forge/noarch/iris-3.7.0-pyha770c72_0.conda#dccc1f660bf455c239adaabf56b91dc9 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.7-pyhd8ed1ab_0.conda#aebfabcb60c33a89c1f9290cab49bc93 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.5-pyhd8ed1ab_0.conda#ebf08f5184d8eaa486697bc060031953 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.4-pyhd8ed1ab_0.conda#a9a89000dfd19656ad004b937eeb6828 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda#611a35a27914fac3aa37611a6fe40bb5 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.6-pyhd8ed1ab_0.conda#d7e4954df0d3aea2eacc7835ad12671d +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.5-pyhd8ed1ab_0.conda#7e1e7437273682ada2ed5e9e9714b140 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jquery-4.1-pyhd8ed1ab_0.conda#914897066d5873acfb13e75705276ad1 https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-2.0.0-pyha770c72_0.conda#baf6d9a33df1a789ca55e3b404c7ea28 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.6-pyhd8ed1ab_0.conda#cf5c9649272c677a964a7313279e3a9b +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.7-pyhd8ed1ab_0.conda#26acae54b06f178681bfb551760f5dd1 https://conda.anaconda.org/conda-forge/noarch/sphinx-7.2.6-pyhd8ed1ab_0.conda#bbfd1120d1824d2d073bc65935f0e4c0 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.9-pyhd8ed1ab_0.conda#0612e497d7860728f2cda421ea2aec09 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda#e507335cb4ca9cff4c3d0fa9cdab255e diff --git a/requirements/locks/py39-linux-64.lock b/requirements/locks/py39-linux-64.lock index 1a186eec..e7a723e3 100644 --- a/requirements/locks/py39-linux-64.lock +++ b/requirements/locks/py39-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 10a1f89d4b3a91b45d631ce4b7f38b8272309126004da633bac5a0c94dfe47de +# input_hash: 9a84caa315a4f7df475f894cdac749ef0095eafe17a9613eb8eb27c456914d85 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.11.17-hbcca054_0.conda#01ffc8d36f9eba0ce0b3c1955fa780ee @@ -57,7 +57,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.44.2-h2797004_0.cond https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.3-h232c23b_0.conda#bc6ac4c0cea148d924f621985bc3892b +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.4-h232c23b_1.conda#53e951fab78d7e3bab40745f7b3d1620 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc From d9aa97ea4a5a8c038dd0fcb2d9bf3225c2550dde Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 29 Jan 2024 09:39:21 +0000 Subject: [PATCH 249/583] Updated environment lockfiles (#376) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 18 +++++++++--------- requirements/locks/py311-linux-64.lock | 18 +++++++++--------- requirements/locks/py39-linux-64.lock | 18 +++++++++--------- 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 6db20451..eca13640 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -12,7 +12,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_3.conda# https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_3.conda#23fdf1fef05baeb7eadc2aed5fb0011f https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.25.0-hd590300_0.conda#89e40af02dd3a0846c0c1131c5126706 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.26.0-hd590300_0.conda#a86d90025198fd411845fc245ebc06c8 https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 @@ -68,7 +68,7 @@ https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-h0f2a231_0.conda#00 https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda#39f910d205726805a958da408ca194ba https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.25-pthreads_h413a1c8_0.conda#d172b34a443b95f86089e8229ddc9a17 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.26-pthreads_h413a1c8_0.conda#760ae35415f5ba8b15d09df5afe8b23a https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-ha9c0a0a_2.conda#55ed21669b2015f77c180feb1dd41930 https://conda.anaconda.org/conda-forge/linux-64/python-3.10.13-hd12c33a_1_cpython.conda#ed38140af93f81319ebc472fbcf16cca https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.44.2-h2c6b66d_0.conda#4f2892c672829693fd978d065db4e8be @@ -89,10 +89,10 @@ https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.12.2-pyhca7485f_0.cond https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda#1a76f09108576397c41c0b0c5bd84134 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py310hd41b1e2_1.conda#b8d67603d43b23ce7e988a5d81a7ab79 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-20_linux64_openblas.conda#2b7bb4f7562c8cf334fc2e20c2d28abc +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-21_linux64_openblas.conda#0ac9f44fc096772b0aa092119b00c3ca https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.5.0-hca28451_0.conda#7144d5a828e2cae218e0e3c98d8a0aeb https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py310h2372a71_1.conda#b74e07a054c479e45a83a83fc5be713c +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.4-py310h2372a71_0.conda#76cd8db42baacfc94aa4d3a2b8e9e453 https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda#926c67c0310094cf421ad13f7d3f38e5 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 @@ -107,7 +107,7 @@ https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py310h2372a7 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py310h2372a71_1.conda#bb010e368de4940771368bc3dc4c63e7 https://conda.anaconda.org/conda-forge/noarch/setuptools-69.0.3-pyhd8ed1ab_0.conda#40695fdfd15a92121ed2922900d0308b https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 -https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 +https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py310h2372a71_0.conda#72637c58d36d9475fda24700c9796f19 https://conda.anaconda.org/conda-forge/noarch/wheel-0.42.0-pyhd8ed1ab_0.conda#1cdea58981c5cbc17b51973bcaddcea7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec @@ -118,9 +118,9 @@ https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.47.2-py310h2372a71_0 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_100.conda#d471a5c3abc984b662d9bae3bb7fd8a5 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.0.1-pyha770c72_0.conda#746623a787e06191d80a2133e5daff17 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda#e7d8df6509ba635247ff9aea31134262 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-20_linux64_openblas.conda#36d486d72ab64ffea932329a1d3729a3 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-21_linux64_openblas.conda#4a3816d06451c4946e2db26b86472cb6 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-20_linux64_openblas.conda#6fabc51f5e647d09cc010c40061557e0 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-21_linux64_openblas.conda#1a42f305615c3867684e049e85927531 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.2.0-py310h01dd4db_0.conda#9ec32d0d90f7670eb29bbba18299cf29 https://conda.anaconda.org/conda-forge/noarch/pip-23.3.2-pyhd8ed1ab_0.conda#8591c748f98dcc02253003533bc2e4b1 @@ -136,10 +136,10 @@ https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py310hd5c30f3_5.con https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py310h1f7b6fc_0.conda#31beda75384647959d5792a1a7dc571a https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py310hd41b1e2_0.conda#85d2aaa7af046528d339da1e813c3a9f -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.1.0-pyhd8ed1ab_0.conda#cab4cec272dc1e30086f7d32faa4f130 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.1.1-pyhd8ed1ab_0.conda#1a92a5bd77b2430796696e25c3d8dbcb https://conda.anaconda.org/conda-forge/linux-64/jasper-4.1.2-he6dfbbe_0.conda#1a6543c3190ecb27a4b2ed71e15afe6e https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py310h2372a71_1.conda#dfcf64f67961eb9686676f96fdb4b4d1 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.4-py310hb13e2d6_0.conda#f0063b2885bfae11324a00a693f88781 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.12.0-py310hb13e2d6_2.conda#cd3baec470071490bc5ab05da64c52b5 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.2-py310hc3e127f_1.conda#fdaca8d27b3af78d617521eb37b1d055 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py310h1f7b6fc_4.conda#0ca55ca20891d393846695354b32ebc5 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.33.0-he84ddb8_0.conda#41dfb7e5326466a1622fed133d50b61c diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index b9a952d1..fd32f750 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -12,7 +12,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_3.conda# https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_3.conda#23fdf1fef05baeb7eadc2aed5fb0011f https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.25.0-hd590300_0.conda#89e40af02dd3a0846c0c1131c5126706 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.26.0-hd590300_0.conda#a86d90025198fd411845fc245ebc06c8 https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 @@ -68,7 +68,7 @@ https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-h0f2a231_0.conda#00 https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda#39f910d205726805a958da408ca194ba https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.25-pthreads_h413a1c8_0.conda#d172b34a443b95f86089e8229ddc9a17 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.26-pthreads_h413a1c8_0.conda#760ae35415f5ba8b15d09df5afe8b23a https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-ha9c0a0a_2.conda#55ed21669b2015f77c180feb1dd41930 https://conda.anaconda.org/conda-forge/linux-64/python-3.11.7-hab00c5b_1_cpython.conda#27cf681282c11dba7b0b1fd266e8f289 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.44.2-h2c6b66d_0.conda#4f2892c672829693fd978d065db4e8be @@ -93,10 +93,10 @@ https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda#1a76f0 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py311h9547e67_1.conda#2c65bdf442b0d37aad080c8a4e0d452f https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-20_linux64_openblas.conda#2b7bb4f7562c8cf334fc2e20c2d28abc +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-21_linux64_openblas.conda#0ac9f44fc096772b0aa092119b00c3ca https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.5.0-hca28451_0.conda#7144d5a828e2cae218e0e3c98d8a0aeb https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py311h459d7ec_1.conda#71120b5155a0c500826cf81536721a15 +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.4-py311h459d7ec_0.conda#ee1b39a6ad0c74155593176ff3664f15 https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda#926c67c0310094cf421ad13f7d3f38e5 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 @@ -115,7 +115,7 @@ https://conda.anaconda.org/conda-forge/noarch/setuptools-69.0.3-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 -https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 +https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 https://conda.anaconda.org/conda-forge/noarch/wheel-0.42.0-pyhd8ed1ab_0.conda#1cdea58981c5cbc17b51973bcaddcea7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a @@ -126,9 +126,9 @@ https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.47.2-py311h459d7ec_0 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_100.conda#d471a5c3abc984b662d9bae3bb7fd8a5 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.0.1-pyha770c72_0.conda#746623a787e06191d80a2133e5daff17 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda#e7d8df6509ba635247ff9aea31134262 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-20_linux64_openblas.conda#36d486d72ab64ffea932329a1d3729a3 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-21_linux64_openblas.conda#4a3816d06451c4946e2db26b86472cb6 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-20_linux64_openblas.conda#6fabc51f5e647d09cc010c40061557e0 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-21_linux64_openblas.conda#1a42f305615c3867684e049e85927531 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.2.0-py311ha6c5da5_0.conda#a5ccd7f2271f28b7d2de0b02b64e3796 https://conda.anaconda.org/conda-forge/noarch/pip-23.3.2-pyhd8ed1ab_0.conda#8591c748f98dcc02253003533bc2e4b1 @@ -144,10 +144,10 @@ https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311hca0b8b9_5.con https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py311h1f0f07a_0.conda#b7e6d52b39e199238c3400cafaabafb3 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py311h9547e67_0.conda#40828c5b36ef52433e21f89943e09f33 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.1.0-pyhd8ed1ab_0.conda#cab4cec272dc1e30086f7d32faa4f130 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.1.1-pyhd8ed1ab_0.conda#1a92a5bd77b2430796696e25c3d8dbcb https://conda.anaconda.org/conda-forge/linux-64/jasper-4.1.2-he6dfbbe_0.conda#1a6543c3190ecb27a4b2ed71e15afe6e https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py311h459d7ec_1.conda#45b8d355bbcdd27588c2d266bcfdff84 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.4-py311h64a7726_0.conda#9ac5334f1b5ed072d3dbc342503d7868 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.12.0-py311h64a7726_2.conda#24ca5107ab75c5521067b8ba505dfae5 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.2-py311h2032efe_1.conda#4ba860ff851768615b1a25b788022750 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h1f0f07a_4.conda#1e105c1a8ea2163507726144b401eb1b https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.33.0-he84ddb8_0.conda#41dfb7e5326466a1622fed133d50b61c diff --git a/requirements/locks/py39-linux-64.lock b/requirements/locks/py39-linux-64.lock index e7a723e3..7f3dce44 100644 --- a/requirements/locks/py39-linux-64.lock +++ b/requirements/locks/py39-linux-64.lock @@ -12,7 +12,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_3.conda# https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_3.conda#23fdf1fef05baeb7eadc2aed5fb0011f https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.25.0-hd590300_0.conda#89e40af02dd3a0846c0c1131c5126706 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.26.0-hd590300_0.conda#a86d90025198fd411845fc245ebc06c8 https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 @@ -68,7 +68,7 @@ https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-h0f2a231_0.conda#00 https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda#39f910d205726805a958da408ca194ba https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.25-pthreads_h413a1c8_0.conda#d172b34a443b95f86089e8229ddc9a17 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.26-pthreads_h413a1c8_0.conda#760ae35415f5ba8b15d09df5afe8b23a https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-ha9c0a0a_2.conda#55ed21669b2015f77c180feb1dd41930 https://conda.anaconda.org/conda-forge/linux-64/python-3.9.18-h0755675_1_cpython.conda#255a7002aeec7a067ff19b545aca6328 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.44.2-h2c6b66d_0.conda#4f2892c672829693fd978d065db4e8be @@ -89,10 +89,10 @@ https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.12.2-pyhca7485f_0.cond https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda#1a76f09108576397c41c0b0c5bd84134 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py39h7633fee_1.conda#c9f74d717e5a2847a9f8b779c54130f2 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-20_linux64_openblas.conda#2b7bb4f7562c8cf334fc2e20c2d28abc +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-21_linux64_openblas.conda#0ac9f44fc096772b0aa092119b00c3ca https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.5.0-hca28451_0.conda#7144d5a828e2cae218e0e3c98d8a0aeb https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py39hd1e30aa_1.conda#ee2b4665b852ec6ff2758f3c1b91233d +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.4-py39hd1e30aa_0.conda#847ad1c2bcbef1e2febfdaa3b199c2a4 https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda#926c67c0310094cf421ad13f7d3f38e5 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 @@ -107,7 +107,7 @@ https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py39hd1e30aa https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py39hd1e30aa_1.conda#37218233bcdc310e4fde6453bc1b40d8 https://conda.anaconda.org/conda-forge/noarch/setuptools-69.0.3-pyhd8ed1ab_0.conda#40695fdfd15a92121ed2922900d0308b https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 -https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 +https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py39hd1e30aa_0.conda#1da984bbb6e765743e13388ba7b7b2c8 https://conda.anaconda.org/conda-forge/noarch/wheel-0.42.0-pyhd8ed1ab_0.conda#1cdea58981c5cbc17b51973bcaddcea7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec @@ -119,9 +119,9 @@ https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_100.c https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.0.1-pyha770c72_0.conda#746623a787e06191d80a2133e5daff17 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.1.1-pyhd8ed1ab_0.conda#3d5fa25cf42f3f32a12b2d874ace8574 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda#e7d8df6509ba635247ff9aea31134262 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-20_linux64_openblas.conda#36d486d72ab64ffea932329a1d3729a3 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-21_linux64_openblas.conda#4a3816d06451c4946e2db26b86472cb6 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-20_linux64_openblas.conda#6fabc51f5e647d09cc010c40061557e0 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-21_linux64_openblas.conda#1a42f305615c3867684e049e85927531 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.2.0-py39had0adad_0.conda#2972754dc054bb079d1d121918b5126f https://conda.anaconda.org/conda-forge/noarch/pip-23.3.2-pyhd8ed1ab_0.conda#8591c748f98dcc02253003533bc2e4b1 @@ -138,10 +138,10 @@ https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py39h15b0fa6_5.cond https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py39h44dd56e_0.conda#baea2f5dfb3ab7b1c836385d2e1daca7 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py39h7633fee_0.conda#ed71ad3e30eb03da363fb797419cce98 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.1.0-pyhd8ed1ab_0.conda#cab4cec272dc1e30086f7d32faa4f130 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.1.1-pyhd8ed1ab_0.conda#1a92a5bd77b2430796696e25c3d8dbcb https://conda.anaconda.org/conda-forge/linux-64/jasper-4.1.2-he6dfbbe_0.conda#1a6543c3190ecb27a4b2ed71e15afe6e https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py39hd1e30aa_1.conda#ca63612907462c8e36edcc9bbacc253e -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.4-py39h474f0d3_0.conda#4b401c1516417b4b14aa1249d2f7929d +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.12.0-py39h474f0d3_2.conda#6ab241b2023730f6b41712dc1b503afa https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.2-py39h6404dd3_1.conda#05623249055d99c51cde021b525611db https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py39h44dd56e_4.conda#81310d21bf9d91754c1220c585bb72d6 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.33.0-he84ddb8_0.conda#41dfb7e5326466a1622fed133d50b61c From 1ddbfd903f3105557283daa7ce5be4b560d8b464 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 5 Feb 2024 10:42:52 +0000 Subject: [PATCH 250/583] Updated environment lockfiles (#377) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 22 +++++++++++----------- requirements/locks/py311-linux-64.lock | 24 ++++++++++++------------ requirements/locks/py39-linux-64.lock | 22 +++++++++++----------- 3 files changed, 34 insertions(+), 34 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index eca13640..2c005828 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -3,14 +3,14 @@ # input_hash: ce88382ab030763c8e7602a9957739e8dbf27aa5b8d5ef4b3bf35e84e5b22731 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.11.17-hbcca054_0.conda#01ffc8d36f9eba0ce0b3c1955fa780ee +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_3.conda#937eaed008f6bf2191c5fe76f87755e9 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_5.conda#f6f6600d18a4047b54f803cf708b868a https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-4_cp310.conda#26322ec5d7712c3ded99dd656142b8ce -https://conda.anaconda.org/conda-forge/noarch/tzdata-2023d-h0c530f3_0.conda#8dee24b8be2d9ff81e7bd4d7d97ff1b0 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_3.conda#7124cbb46b13d395bdde68f2d215c989 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_5.conda#d211c42b9ce49aee3734fdc828731689 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_3.conda#23fdf1fef05baeb7eadc2aed5fb0011f +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_5.conda#d4ff227c46917d3b4565302a2bbb276b https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.26.0-hd590300_0.conda#a86d90025198fd411845fc245ebc06c8 https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d @@ -23,7 +23,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.19-hd590300_0.conda https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.5.0-hcb278e6_1.conda#6305a3dd2752c76335295da4e581f2fd https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_3.conda#c714d905cdfa0e70200f68b80cc04764 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_5.conda#7a6bd7a12a4bd359e2afe6c0fa1acace https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d @@ -34,7 +34,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.cond https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-h59595ed_2.conda#7dbaa197d7ba6032caf7ae7f32c1efa0 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.0-hd590300_1.conda#603827b39ea2b835268adb8c821b8570 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.1-hd590300_0.conda#51a753e64a3027bd7e23a189b1f6e91e https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-h9fff704_0.conda#e6d228cd0bb74a51dd18f5bfce0b4115 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b @@ -50,9 +50,9 @@ https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd7 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_3.conda#73031c79546ad06f1fe62e57fdd021bc +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_5.conda#e73e9cfd1191783392131e6238bdb3e9 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.39-h753d276_0.conda#e1c890aebdebbfbf87e2c917187b4416 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.42-h2797004_0.conda#d67729828dc6ff7ba44a61062ad79880 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.44.2-h2797004_0.conda#3b6a9f225c3dbe0d24f4fedd4625c5bf https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 @@ -92,7 +92,7 @@ https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-21_linux64_openblas.conda#0ac9f44fc096772b0aa092119b00c3ca https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.5.0-hca28451_0.conda#7144d5a828e2cae218e0e3c98d8a0aeb https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.4-py310h2372a71_0.conda#76cd8db42baacfc94aa4d3a2b8e9e453 +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py310h2372a71_0.conda#f6703fa0214a00bf49d1bef6dc7672d0 https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda#926c67c0310094cf421ad13f7d3f38e5 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 @@ -126,7 +126,7 @@ https://conda.anaconda.org/conda-forge/linux-64/pillow-10.2.0-py310h01dd4db_0.co https://conda.anaconda.org/conda-forge/noarch/pip-23.3.2-pyhd8ed1ab_0.conda#8591c748f98dcc02253003533bc2e4b1 https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.1-h1d62c97_0.conda#44ec51d0857d9be26158bb85caa74fdb https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.1.0-pyhd8ed1ab_0.conda#f8ced8ee63830dec7ecc1be048d1470a +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.0-pyhd8ed1ab_0.conda#6a7e0694921f668a030d52f0c47baebd https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.0.1-hd8ed1ab_0.conda#4a2f43a20fa404b998859c6a470ba316 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index fd32f750..194b696f 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -3,14 +3,14 @@ # input_hash: db79b267f56be2d551ff654e226018d317f3bd344a34dc77081608b7d9640f79 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.11.17-hbcca054_0.conda#01ffc8d36f9eba0ce0b3c1955fa780ee +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_3.conda#937eaed008f6bf2191c5fe76f87755e9 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_5.conda#f6f6600d18a4047b54f803cf708b868a https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-4_cp311.conda#d786502c97404c94d7d58d258a445a65 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2023d-h0c530f3_0.conda#8dee24b8be2d9ff81e7bd4d7d97ff1b0 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_3.conda#7124cbb46b13d395bdde68f2d215c989 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_5.conda#d211c42b9ce49aee3734fdc828731689 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_3.conda#23fdf1fef05baeb7eadc2aed5fb0011f +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_5.conda#d4ff227c46917d3b4565302a2bbb276b https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.26.0-hd590300_0.conda#a86d90025198fd411845fc245ebc06c8 https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d @@ -23,7 +23,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.19-hd590300_0.conda https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.5.0-hcb278e6_1.conda#6305a3dd2752c76335295da4e581f2fd https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_3.conda#c714d905cdfa0e70200f68b80cc04764 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_5.conda#7a6bd7a12a4bd359e2afe6c0fa1acace https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d @@ -34,7 +34,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.cond https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-h59595ed_2.conda#7dbaa197d7ba6032caf7ae7f32c1efa0 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.0-hd590300_1.conda#603827b39ea2b835268adb8c821b8570 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.1-hd590300_0.conda#51a753e64a3027bd7e23a189b1f6e91e https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-h9fff704_0.conda#e6d228cd0bb74a51dd18f5bfce0b4115 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b @@ -50,9 +50,9 @@ https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd7 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_3.conda#73031c79546ad06f1fe62e57fdd021bc +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_5.conda#e73e9cfd1191783392131e6238bdb3e9 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.39-h753d276_0.conda#e1c890aebdebbfbf87e2c917187b4416 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.42-h2797004_0.conda#d67729828dc6ff7ba44a61062ad79880 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.44.2-h2797004_0.conda#3b6a9f225c3dbe0d24f4fedd4625c5bf https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 @@ -96,7 +96,7 @@ https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-21_linux64_openblas.conda#0ac9f44fc096772b0aa092119b00c3ca https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.5.0-hca28451_0.conda#7144d5a828e2cae218e0e3c98d8a0aeb https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.4-py311h459d7ec_0.conda#ee1b39a6ad0c74155593176ff3664f15 +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py311h459d7ec_0.conda#a322b4185121935c871d201ae00ac143 https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda#926c67c0310094cf421ad13f7d3f38e5 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 @@ -109,7 +109,7 @@ https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.1-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py311h459d7ec_0.conda#60b5332b3989fda37884b92c7afd6a91 -https://conda.anaconda.org/conda-forge/noarch/pytz-2023.3.post1-pyhd8ed1ab_0.conda#c93346b446cd08c169d843ae5fc0da97 +https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py311h459d7ec_1.conda#52719a74ad130de8fb5d047dc91f247a https://conda.anaconda.org/conda-forge/noarch/setuptools-69.0.3-pyhd8ed1ab_0.conda#40695fdfd15a92121ed2922900d0308b https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 @@ -134,7 +134,7 @@ https://conda.anaconda.org/conda-forge/linux-64/pillow-10.2.0-py311ha6c5da5_0.co https://conda.anaconda.org/conda-forge/noarch/pip-23.3.2-pyhd8ed1ab_0.conda#8591c748f98dcc02253003533bc2e4b1 https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.1-h1d62c97_0.conda#44ec51d0857d9be26158bb85caa74fdb https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.1.0-pyhd8ed1ab_0.conda#f8ced8ee63830dec7ecc1be048d1470a +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.0-pyhd8ed1ab_0.conda#6a7e0694921f668a030d52f0c47baebd https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.0.1-hd8ed1ab_0.conda#4a2f43a20fa404b998859c6a470ba316 diff --git a/requirements/locks/py39-linux-64.lock b/requirements/locks/py39-linux-64.lock index 7f3dce44..4969d3e8 100644 --- a/requirements/locks/py39-linux-64.lock +++ b/requirements/locks/py39-linux-64.lock @@ -3,14 +3,14 @@ # input_hash: 9a84caa315a4f7df475f894cdac749ef0095eafe17a9613eb8eb27c456914d85 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.11.17-hbcca054_0.conda#01ffc8d36f9eba0ce0b3c1955fa780ee +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_3.conda#937eaed008f6bf2191c5fe76f87755e9 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_5.conda#f6f6600d18a4047b54f803cf708b868a https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.9-4_cp39.conda#bfe4b3259a8ac6cdf0037752904da6a7 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2023d-h0c530f3_0.conda#8dee24b8be2d9ff81e7bd4d7d97ff1b0 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_3.conda#7124cbb46b13d395bdde68f2d215c989 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_5.conda#d211c42b9ce49aee3734fdc828731689 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_3.conda#23fdf1fef05baeb7eadc2aed5fb0011f +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_5.conda#d4ff227c46917d3b4565302a2bbb276b https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.26.0-hd590300_0.conda#a86d90025198fd411845fc245ebc06c8 https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d @@ -23,7 +23,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.19-hd590300_0.conda https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.5.0-hcb278e6_1.conda#6305a3dd2752c76335295da4e581f2fd https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_3.conda#c714d905cdfa0e70200f68b80cc04764 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_5.conda#7a6bd7a12a4bd359e2afe6c0fa1acace https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d @@ -34,7 +34,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.cond https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-h59595ed_2.conda#7dbaa197d7ba6032caf7ae7f32c1efa0 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.0-hd590300_1.conda#603827b39ea2b835268adb8c821b8570 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.1-hd590300_0.conda#51a753e64a3027bd7e23a189b1f6e91e https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-h9fff704_0.conda#e6d228cd0bb74a51dd18f5bfce0b4115 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b @@ -50,9 +50,9 @@ https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd7 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_3.conda#73031c79546ad06f1fe62e57fdd021bc +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_5.conda#e73e9cfd1191783392131e6238bdb3e9 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.39-h753d276_0.conda#e1c890aebdebbfbf87e2c917187b4416 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.42-h2797004_0.conda#d67729828dc6ff7ba44a61062ad79880 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.44.2-h2797004_0.conda#3b6a9f225c3dbe0d24f4fedd4625c5bf https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 @@ -92,7 +92,7 @@ https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-21_linux64_openblas.conda#0ac9f44fc096772b0aa092119b00c3ca https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.5.0-hca28451_0.conda#7144d5a828e2cae218e0e3c98d8a0aeb https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.4-py39hd1e30aa_0.conda#847ad1c2bcbef1e2febfdaa3b199c2a4 +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py39hd1e30aa_0.conda#9a9a22eb1f83c44953319ee3b027769f https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda#926c67c0310094cf421ad13f7d3f38e5 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 @@ -127,7 +127,7 @@ https://conda.anaconda.org/conda-forge/linux-64/pillow-10.2.0-py39had0adad_0.con https://conda.anaconda.org/conda-forge/noarch/pip-23.3.2-pyhd8ed1ab_0.conda#8591c748f98dcc02253003533bc2e4b1 https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.1-h1d62c97_0.conda#44ec51d0857d9be26158bb85caa74fdb https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.1.0-pyhd8ed1ab_0.conda#f8ced8ee63830dec7ecc1be048d1470a +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.0-pyhd8ed1ab_0.conda#6a7e0694921f668a030d52f0c47baebd https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.1.1-pyhd8ed1ab_0.conda#d04bd1b5bed9177dd7c3cef15e2b6710 From 9ee235723f81e43eb9554a9258fadd19cef3da67 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Tue, 13 Feb 2024 13:26:24 +0000 Subject: [PATCH 251/583] Updated environment lockfiles (#378) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 22 +++++++++++----------- requirements/locks/py311-linux-64.lock | 22 +++++++++++----------- requirements/locks/py39-linux-64.lock | 22 +++++++++++----------- 3 files changed, 33 insertions(+), 33 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 2c005828..dfb24bd2 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -53,11 +53,11 @@ https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2. https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_5.conda#e73e9cfd1191783392131e6238bdb3e9 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.42-h2797004_0.conda#d67729828dc6ff7ba44a61062ad79880 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.44.2-h2797004_0.conda#3b6a9f225c3dbe0d24f4fedd4625c5bf +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.1-h2797004_0.conda#fc4ccadfbf6d4784de88c41704792562 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.4-h232c23b_1.conda#53e951fab78d7e3bab40745f7b3d1620 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.5-h232c23b_0.conda#c442ebfda7a475f5e78f1c8e45f1e919 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc @@ -71,21 +71,21 @@ https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd9 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.26-pthreads_h413a1c8_0.conda#760ae35415f5ba8b15d09df5afe8b23a https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-ha9c0a0a_2.conda#55ed21669b2015f77c180feb1dd41930 https://conda.anaconda.org/conda-forge/linux-64/python-3.10.13-hd12c33a_1_cpython.conda#ed38140af93f81319ebc472fbcf16cca -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.44.2-h2c6b66d_0.conda#4f2892c672829693fd978d065db4e8be +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.1-h2c6b66d_0.conda#93acf31b379acebada263b9bce3dc6ed https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.7-h8ee46fc_0.conda#49e482d882669206653b095f5206c05b https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda#5e4c0743c70186509d1412e03c2d8dfa https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hc6cd4ac_1.conda#1f95722c94f00b69af69a066c7433714 -https://conda.anaconda.org/conda-forge/noarch/certifi-2023.11.17-pyhd8ed1ab_0.conda#2011bcf45376341dd1d690263fdbc789 +https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda#0876280e409658fc6f9e75d035960333 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.conda#753d29fe41bb881e4b9c004f0abf973f https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.1-pyhd8ed1ab_0.conda#0c1729b74a8152fde6a38ba0a2ab9f45 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.12.2-pyhca7485f_0.conda#bf40f2a8835b78b1f91083d306b493d2 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.2.0-pyhca7485f_0.conda#fad86b90138cf5d82c6f5a2ed6e683d9 https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda#1a76f09108576397c41c0b0c5bd84134 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py310hd41b1e2_1.conda#b8d67603d43b23ce7e988a5d81a7ab79 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 @@ -114,7 +114,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py310h2fee648_0.conda#45846a970e71ac98fd327da5d40a0a2c -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.47.2-py310h2372a71_0.conda#0688fca50c84de6ff0df1c6440941e0e +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.48.1-py310h2372a71_0.conda#480ff621e839c5f80a52975b167500d2 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_100.conda#d471a5c3abc984b662d9bae3bb7fd8a5 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.0.1-pyha770c72_0.conda#746623a787e06191d80a2133e5daff17 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda#e7d8df6509ba635247ff9aea31134262 @@ -123,7 +123,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-21_linux64_openblas.conda#1a42f305615c3867684e049e85927531 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.2.0-py310h01dd4db_0.conda#9ec32d0d90f7670eb29bbba18299cf29 -https://conda.anaconda.org/conda-forge/noarch/pip-23.3.2-pyhd8ed1ab_0.conda#8591c748f98dcc02253003533bc2e4b1 +https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.1-h1d62c97_0.conda#44ec51d0857d9be26158bb85caa74fdb https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.0-pyhd8ed1ab_0.conda#6a7e0694921f668a030d52f0c47baebd @@ -131,18 +131,18 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.0.1-hd8ed1ab_0.conda#4a2f43a20fa404b998859c6a470ba316 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h9612171_113.conda#b2414908e43c442ddc68e6148774a304 -https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.3-py310hb13e2d6_0.conda#e5e9c6f112d581cdf465b8ca861cb14f +https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py310hb13e2d6_0.conda#6593de64c935768b6bad3e19b3e978be https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py310hd5c30f3_5.conda#dc2ee770a2299307f3c127af79160d25 https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py310h1f7b6fc_0.conda#31beda75384647959d5792a1a7dc571a https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py310hd41b1e2_0.conda#85d2aaa7af046528d339da1e813c3a9f -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.1.1-pyhd8ed1ab_0.conda#1a92a5bd77b2430796696e25c3d8dbcb -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.1.2-he6dfbbe_0.conda#1a6543c3190ecb27a4b2ed71e15afe6e +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.2.0-pyhd8ed1ab_0.conda#5973bc565e2aea620c3a431cafdde032 +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.0-he6dfbbe_0.conda#ba48f3659627380d18e236312c65bd76 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py310h2372a71_1.conda#dfcf64f67961eb9686676f96fdb4b4d1 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.12.0-py310hb13e2d6_2.conda#cd3baec470071490bc5ab05da64c52b5 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.2-py310hc3e127f_1.conda#fdaca8d27b3af78d617521eb37b1d055 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py310h1f7b6fc_4.conda#0ca55ca20891d393846695354b32ebc5 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.33.0-he84ddb8_0.conda#41dfb7e5326466a1622fed133d50b61c +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.34.0-he84ddb8_0.conda#7bead4ebb77dc44f1b9b5d54b3aa90bd https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.2-py310h62c0568_0.conda#3cbbc7d0b54df02c9a006d3de14911d9 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py310hba70d50_100.conda#e19392760c7e4da3b9cb0ee5bf61bc4b https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py310hcc13569_1.conda#31ef447724fb19066a9d00a660dab1bd diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 194b696f..892264cd 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -53,11 +53,11 @@ https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2. https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_5.conda#e73e9cfd1191783392131e6238bdb3e9 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.42-h2797004_0.conda#d67729828dc6ff7ba44a61062ad79880 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.44.2-h2797004_0.conda#3b6a9f225c3dbe0d24f4fedd4625c5bf +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.1-h2797004_0.conda#fc4ccadfbf6d4784de88c41704792562 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.4-h232c23b_1.conda#53e951fab78d7e3bab40745f7b3d1620 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.5-h232c23b_0.conda#c442ebfda7a475f5e78f1c8e45f1e919 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc @@ -71,7 +71,7 @@ https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd9 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.26-pthreads_h413a1c8_0.conda#760ae35415f5ba8b15d09df5afe8b23a https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-ha9c0a0a_2.conda#55ed21669b2015f77c180feb1dd41930 https://conda.anaconda.org/conda-forge/linux-64/python-3.11.7-hab00c5b_1_cpython.conda#27cf681282c11dba7b0b1fd266e8f289 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.44.2-h2c6b66d_0.conda#4f2892c672829693fd978d065db4e8be +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.1-h2c6b66d_0.conda#93acf31b379acebada263b9bce3dc6ed https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.7-h8ee46fc_0.conda#49e482d882669206653b095f5206c05b https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb @@ -79,7 +79,7 @@ https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8e https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda#5e4c0743c70186509d1412e03c2d8dfa https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hb755f60_1.conda#cce9e7c3f1c307f2a5fb08a2922d6164 -https://conda.anaconda.org/conda-forge/noarch/certifi-2023.11.17-pyhd8ed1ab_0.conda#2011bcf45376341dd1d690263fdbc789 +https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda#0876280e409658fc6f9e75d035960333 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.conda#753d29fe41bb881e4b9c004f0abf973f @@ -88,7 +88,7 @@ https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py311h38be061_3.conda#1c33f55e5cdcc2a2b973c432b5225bfe https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.1-pyhd8ed1ab_0.conda#0c1729b74a8152fde6a38ba0a2ab9f45 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.12.2-pyhca7485f_0.conda#bf40f2a8835b78b1f91083d306b493d2 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.2.0-pyhca7485f_0.conda#fad86b90138cf5d82c6f5a2ed6e683d9 https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda#1a76f09108576397c41c0b0c5bd84134 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py311h9547e67_1.conda#2c65bdf442b0d37aad080c8a4e0d452f @@ -122,7 +122,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_10 https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py311hb3a22ac_0.conda#b3469563ac5e808b0cd92810d0697043 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.47.2-py311h459d7ec_0.conda#166735a569ab42067b858ca0090a0d22 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.48.1-py311h459d7ec_0.conda#36363685b6e56682b1b256eb0ad503f6 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_100.conda#d471a5c3abc984b662d9bae3bb7fd8a5 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.0.1-pyha770c72_0.conda#746623a787e06191d80a2133e5daff17 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda#e7d8df6509ba635247ff9aea31134262 @@ -131,7 +131,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-21_linux64_openblas.conda#1a42f305615c3867684e049e85927531 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.2.0-py311ha6c5da5_0.conda#a5ccd7f2271f28b7d2de0b02b64e3796 -https://conda.anaconda.org/conda-forge/noarch/pip-23.3.2-pyhd8ed1ab_0.conda#8591c748f98dcc02253003533bc2e4b1 +https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.1-h1d62c97_0.conda#44ec51d0857d9be26158bb85caa74fdb https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.0-pyhd8ed1ab_0.conda#6a7e0694921f668a030d52f0c47baebd @@ -139,18 +139,18 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.0.1-hd8ed1ab_0.conda#4a2f43a20fa404b998859c6a470ba316 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h9612171_113.conda#b2414908e43c442ddc68e6148774a304 -https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.3-py311h64a7726_0.conda#231eef4f33640338f64ef9ab690ba08d +https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.conda#a502d7aad449a1206efb366d6a12c52d https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311hca0b8b9_5.conda#cac429fcb9126d5e6f02c8ba61c2a811 https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py311h1f0f07a_0.conda#b7e6d52b39e199238c3400cafaabafb3 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py311h9547e67_0.conda#40828c5b36ef52433e21f89943e09f33 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.1.1-pyhd8ed1ab_0.conda#1a92a5bd77b2430796696e25c3d8dbcb -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.1.2-he6dfbbe_0.conda#1a6543c3190ecb27a4b2ed71e15afe6e +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.2.0-pyhd8ed1ab_0.conda#5973bc565e2aea620c3a431cafdde032 +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.0-he6dfbbe_0.conda#ba48f3659627380d18e236312c65bd76 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py311h459d7ec_1.conda#45b8d355bbcdd27588c2d266bcfdff84 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.12.0-py311h64a7726_2.conda#24ca5107ab75c5521067b8ba505dfae5 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.2-py311h2032efe_1.conda#4ba860ff851768615b1a25b788022750 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h1f0f07a_4.conda#1e105c1a8ea2163507726144b401eb1b -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.33.0-he84ddb8_0.conda#41dfb7e5326466a1622fed133d50b61c +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.34.0-he84ddb8_0.conda#7bead4ebb77dc44f1b9b5d54b3aa90bd https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.2-py311h54ef318_0.conda#9f80753bc008bfc9b95f39d9ff9f1694 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py311he8ad708_100.conda#597b1ad6cb7011b7561c20ea30295cae https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py311h320fe9a_1.conda#10d1806e20da040c58c36deddf51c70c diff --git a/requirements/locks/py39-linux-64.lock b/requirements/locks/py39-linux-64.lock index 4969d3e8..43ad258d 100644 --- a/requirements/locks/py39-linux-64.lock +++ b/requirements/locks/py39-linux-64.lock @@ -53,11 +53,11 @@ https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2. https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_5.conda#e73e9cfd1191783392131e6238bdb3e9 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.42-h2797004_0.conda#d67729828dc6ff7ba44a61062ad79880 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.44.2-h2797004_0.conda#3b6a9f225c3dbe0d24f4fedd4625c5bf +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.1-h2797004_0.conda#fc4ccadfbf6d4784de88c41704792562 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.4-h232c23b_1.conda#53e951fab78d7e3bab40745f7b3d1620 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.5-h232c23b_0.conda#c442ebfda7a475f5e78f1c8e45f1e919 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc @@ -71,21 +71,21 @@ https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd9 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.26-pthreads_h413a1c8_0.conda#760ae35415f5ba8b15d09df5afe8b23a https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-ha9c0a0a_2.conda#55ed21669b2015f77c180feb1dd41930 https://conda.anaconda.org/conda-forge/linux-64/python-3.9.18-h0755675_1_cpython.conda#255a7002aeec7a067ff19b545aca6328 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.44.2-h2c6b66d_0.conda#4f2892c672829693fd978d065db4e8be +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.1-h2c6b66d_0.conda#93acf31b379acebada263b9bce3dc6ed https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.7-h8ee46fc_0.conda#49e482d882669206653b095f5206c05b https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda#5e4c0743c70186509d1412e03c2d8dfa https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py39h3d6467e_1.conda#c48418c8b35f1d59ae9ae1174812b40a -https://conda.anaconda.org/conda-forge/noarch/certifi-2023.11.17-pyhd8ed1ab_0.conda#2011bcf45376341dd1d690263fdbc789 +https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda#0876280e409658fc6f9e75d035960333 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.conda#753d29fe41bb881e4b9c004f0abf973f https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.1-pyhd8ed1ab_0.conda#0c1729b74a8152fde6a38ba0a2ab9f45 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.12.2-pyhca7485f_0.conda#bf40f2a8835b78b1f91083d306b493d2 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.2.0-pyhca7485f_0.conda#fad86b90138cf5d82c6f5a2ed6e683d9 https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda#1a76f09108576397c41c0b0c5bd84134 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py39h7633fee_1.conda#c9f74d717e5a2847a9f8b779c54130f2 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 @@ -114,7 +114,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py39h7a31438_0.conda#ac992767d7f8ed2cb27e71e78f0fb2d7 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.47.2-py39hd1e30aa_0.conda#4e2b802b69be81944fdcd71018b74226 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.48.1-py39hd1e30aa_0.conda#402ef3d9608c7653187a3fd6fd45b445 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_100.conda#d471a5c3abc984b662d9bae3bb7fd8a5 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.0.1-pyha770c72_0.conda#746623a787e06191d80a2133e5daff17 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.1.1-pyhd8ed1ab_0.conda#3d5fa25cf42f3f32a12b2d874ace8574 @@ -124,7 +124,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-21_linux64_openblas.conda#1a42f305615c3867684e049e85927531 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.2.0-py39had0adad_0.conda#2972754dc054bb079d1d121918b5126f -https://conda.anaconda.org/conda-forge/noarch/pip-23.3.2-pyhd8ed1ab_0.conda#8591c748f98dcc02253003533bc2e4b1 +https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.1-h1d62c97_0.conda#44ec51d0857d9be26158bb85caa74fdb https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.0-pyhd8ed1ab_0.conda#6a7e0694921f668a030d52f0c47baebd @@ -133,18 +133,18 @@ https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda# https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.1.1-pyhd8ed1ab_0.conda#d04bd1b5bed9177dd7c3cef15e2b6710 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.0.1-hd8ed1ab_0.conda#4a2f43a20fa404b998859c6a470ba316 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h9612171_113.conda#b2414908e43c442ddc68e6148774a304 -https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.3-py39h474f0d3_0.conda#a1f1ad2d8ebf63f13f45fb21b7f49dfb +https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py39h474f0d3_0.conda#aa265f5697237aa13cc10f53fa8acc4f https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py39h15b0fa6_5.conda#85e186c7ff673b0d0026782ec353fb2a https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py39h44dd56e_0.conda#baea2f5dfb3ab7b1c836385d2e1daca7 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py39h7633fee_0.conda#ed71ad3e30eb03da363fb797419cce98 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.1.1-pyhd8ed1ab_0.conda#1a92a5bd77b2430796696e25c3d8dbcb -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.1.2-he6dfbbe_0.conda#1a6543c3190ecb27a4b2ed71e15afe6e +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.2.0-pyhd8ed1ab_0.conda#5973bc565e2aea620c3a431cafdde032 +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.0-he6dfbbe_0.conda#ba48f3659627380d18e236312c65bd76 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py39hd1e30aa_1.conda#ca63612907462c8e36edcc9bbacc253e https://conda.anaconda.org/conda-forge/linux-64/scipy-1.12.0-py39h474f0d3_2.conda#6ab241b2023730f6b41712dc1b503afa https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.2-py39h6404dd3_1.conda#05623249055d99c51cde021b525611db https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py39h44dd56e_4.conda#81310d21bf9d91754c1220c585bb72d6 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.33.0-he84ddb8_0.conda#41dfb7e5326466a1622fed133d50b61c +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.34.0-he84ddb8_0.conda#7bead4ebb77dc44f1b9b5d54b3aa90bd https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.2-py39he9076e7_0.conda#6085411aa2f0b2b801d3b46e1d3b83c5 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py39h4282601_100.conda#d2809fbf0d8ae7b8ca92c456cb44a7d4 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py39hddac248_1.conda#8dd2eb1e7aa9a33a92a75bdcea3f0dd0 From 20c62ef7be0fd42732e3ef19d569b513cc78f9e6 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 19 Feb 2024 14:01:51 +0000 Subject: [PATCH 252/583] Updated environment lockfiles (#380) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 4 ++-- requirements/locks/py311-linux-64.lock | 6 +++--- requirements/locks/py39-linux-64.lock | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index dfb24bd2..2501b441 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -114,7 +114,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py310h2fee648_0.conda#45846a970e71ac98fd327da5d40a0a2c -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.48.1-py310h2372a71_0.conda#480ff621e839c5f80a52975b167500d2 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.49.0-py310h2372a71_0.conda#e61ae80fde506b70a88e5e06376d2068 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_100.conda#d471a5c3abc984b662d9bae3bb7fd8a5 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.0.1-pyha770c72_0.conda#746623a787e06191d80a2133e5daff17 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda#e7d8df6509ba635247ff9aea31134262 @@ -143,7 +143,7 @@ https://conda.anaconda.org/conda-forge/linux-64/scipy-1.12.0-py310hb13e2d6_2.con https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.2-py310hc3e127f_1.conda#fdaca8d27b3af78d617521eb37b1d055 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py310h1f7b6fc_4.conda#0ca55ca20891d393846695354b32ebc5 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.34.0-he84ddb8_0.conda#7bead4ebb77dc44f1b9b5d54b3aa90bd -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.2-py310h62c0568_0.conda#3cbbc7d0b54df02c9a006d3de14911d9 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.3-py310h62c0568_0.conda#4a7296c0273eb01dfbed728dd6a6725a https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py310hba70d50_100.conda#e19392760c7e4da3b9cb0ee5bf61bc4b https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py310hcc13569_1.conda#31ef447724fb19066a9d00a660dab1bd https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.6.1-py310h1f7b6fc_1.conda#eee8d291cab9c673142ce54c5d561fa8 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 892264cd..5559c1e9 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -70,7 +70,7 @@ https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.26-pthreads_h413a1c8_0.conda#760ae35415f5ba8b15d09df5afe8b23a https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-ha9c0a0a_2.conda#55ed21669b2015f77c180feb1dd41930 -https://conda.anaconda.org/conda-forge/linux-64/python-3.11.7-hab00c5b_1_cpython.conda#27cf681282c11dba7b0b1fd266e8f289 +https://conda.anaconda.org/conda-forge/linux-64/python-3.11.8-hab00c5b_0_cpython.conda#2fdc314ee058eda0114738a9309d3683 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.1-h2c6b66d_0.conda#93acf31b379acebada263b9bce3dc6ed https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.7-h8ee46fc_0.conda#49e482d882669206653b095f5206c05b @@ -122,7 +122,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_10 https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py311hb3a22ac_0.conda#b3469563ac5e808b0cd92810d0697043 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.48.1-py311h459d7ec_0.conda#36363685b6e56682b1b256eb0ad503f6 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.49.0-py311h459d7ec_0.conda#d66c9e36ab104f94e35b015c86c2fcb4 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_100.conda#d471a5c3abc984b662d9bae3bb7fd8a5 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.0.1-pyha770c72_0.conda#746623a787e06191d80a2133e5daff17 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda#e7d8df6509ba635247ff9aea31134262 @@ -151,7 +151,7 @@ https://conda.anaconda.org/conda-forge/linux-64/scipy-1.12.0-py311h64a7726_2.con https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.2-py311h2032efe_1.conda#4ba860ff851768615b1a25b788022750 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h1f0f07a_4.conda#1e105c1a8ea2163507726144b401eb1b https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.34.0-he84ddb8_0.conda#7bead4ebb77dc44f1b9b5d54b3aa90bd -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.2-py311h54ef318_0.conda#9f80753bc008bfc9b95f39d9ff9f1694 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.3-py311h54ef318_0.conda#014c115be880802d2372ac6ed665f526 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py311he8ad708_100.conda#597b1ad6cb7011b7561c20ea30295cae https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py311h320fe9a_1.conda#10d1806e20da040c58c36deddf51c70c https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.6.1-py311h1f0f07a_1.conda#fa4f6eb8d7f25c8525f25ff173a687b4 diff --git a/requirements/locks/py39-linux-64.lock b/requirements/locks/py39-linux-64.lock index 43ad258d..a81fb38d 100644 --- a/requirements/locks/py39-linux-64.lock +++ b/requirements/locks/py39-linux-64.lock @@ -114,7 +114,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py39h7a31438_0.conda#ac992767d7f8ed2cb27e71e78f0fb2d7 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.48.1-py39hd1e30aa_0.conda#402ef3d9608c7653187a3fd6fd45b445 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.49.0-py39hd1e30aa_0.conda#dd1b02484cc8c31d4093111a82b6efb2 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_100.conda#d471a5c3abc984b662d9bae3bb7fd8a5 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.0.1-pyha770c72_0.conda#746623a787e06191d80a2133e5daff17 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.1.1-pyhd8ed1ab_0.conda#3d5fa25cf42f3f32a12b2d874ace8574 @@ -145,7 +145,7 @@ https://conda.anaconda.org/conda-forge/linux-64/scipy-1.12.0-py39h474f0d3_2.cond https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.2-py39h6404dd3_1.conda#05623249055d99c51cde021b525611db https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py39h44dd56e_4.conda#81310d21bf9d91754c1220c585bb72d6 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.34.0-he84ddb8_0.conda#7bead4ebb77dc44f1b9b5d54b3aa90bd -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.2-py39he9076e7_0.conda#6085411aa2f0b2b801d3b46e1d3b83c5 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.3-py39he9076e7_0.conda#5456bdfe5809ebf5689eda6c808b686e https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py39h4282601_100.conda#d2809fbf0d8ae7b8ca92c456cb44a7d4 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py39hddac248_1.conda#8dd2eb1e7aa9a33a92a75bdcea3f0dd0 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.6.1-py39h44dd56e_1.conda#0ac51aa5d5ccdc8f0106176823fde146 From c2c7f2f09ff057e87156a34131ddeb545d998db3 Mon Sep 17 00:00:00 2001 From: Martin Yeo <40734014+trexfeathers@users.noreply.github.com> Date: Thu, 22 Feb 2024 15:31:20 +0000 Subject: [PATCH 253/583] Update contributing guidelines in line with v5 SciTools CLA. (#371) --- CONTRIBUTING.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6275cf90..e03d71f9 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -22,11 +22,11 @@ Getting started Submitting changes ------------------ -1. Read and sign the Contributor Licence Agreement (CLA). - - See our [governance page](http://scitools.org.uk/governance.html) - for the CLA and what to do with it. -2. Push your branch to your fork of iris-grib. -3. Submit your pull request. +1. Push your branch to your fork of iris-grib. +2. Submit your pull request. +3. Note that all authors on pull requests will automatically be asked to sign the + [SciTools Contributor Licence Agreement](https://cla-assistant.io/SciTools/) + (CLA), if they have not already done so. 4. Sit back and wait for the core iris-grib development team to review your code. From 735877576cd5b79aefb6457492629226fc60543b Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Tue, 5 Mar 2024 14:15:05 +0000 Subject: [PATCH 254/583] Updated environment lockfiles (#382) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 24 +++++++++++----------- requirements/locks/py311-linux-64.lock | 24 +++++++++++----------- requirements/locks/py39-linux-64.lock | 28 +++++++++++++------------- 3 files changed, 38 insertions(+), 38 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 2501b441..b0dba1bd 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -12,7 +12,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_5.conda# https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_5.conda#d4ff227c46917d3b4565302a2bbb276b https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.26.0-hd590300_0.conda#a86d90025198fd411845fc245ebc06c8 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.27.0-hd590300_0.conda#f6afff0e9ee08d2f1b897881a4f38cdb https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 @@ -52,7 +52,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.co https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_5.conda#e73e9cfd1191783392131e6238bdb3e9 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.42-h2797004_0.conda#d67729828dc6ff7ba44a61062ad79880 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.1-h2797004_0.conda#fc4ccadfbf6d4784de88c41704792562 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 @@ -96,7 +96,7 @@ https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py310h2372a71_0 https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda#926c67c0310094cf421ad13f7d3f38e5 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 -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-h488ebb8_3.conda#128c25b7fe6a25286a48f3a6a9b5b6f3 +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 https://conda.anaconda.org/conda-forge/noarch/packaging-23.2-pyhd8ed1ab_0.conda#79002079284aa895f883c6b7f3f88fd6 https://conda.anaconda.org/conda-forge/noarch/pep8-1.7.1-py_0.tar.bz2#d0b5bc3aebbffcb175bf8a1d419acb79 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff @@ -105,7 +105,7 @@ https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#9 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py310h2372a71_0.conda#b631b889b0b4bc2fca7b8b977ca484b2 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py310h2372a71_1.conda#bb010e368de4940771368bc3dc4c63e7 -https://conda.anaconda.org/conda-forge/noarch/setuptools-69.0.3-pyhd8ed1ab_0.conda#40695fdfd15a92121ed2922900d0308b +https://conda.anaconda.org/conda-forge/noarch/setuptools-69.1.1-pyhd8ed1ab_0.conda#576de899521b7d43674ba3ef6eae9142 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py310h2372a71_0.conda#72637c58d36d9475fda24700c9796f19 @@ -125,8 +125,8 @@ https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf https://conda.anaconda.org/conda-forge/linux-64/pillow-10.2.0-py310h01dd4db_0.conda#9ec32d0d90f7670eb29bbba18299cf29 https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.1-h1d62c97_0.conda#44ec51d0857d9be26158bb85caa74fdb -https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.0-pyhd8ed1ab_0.conda#6a7e0694921f668a030d52f0c47baebd +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.0.1-hd8ed1ab_0.conda#4a2f43a20fa404b998859c6a470ba316 @@ -136,15 +136,15 @@ https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py310hd5c30f3_5.con https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py310h1f7b6fc_0.conda#31beda75384647959d5792a1a7dc571a https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py310hd41b1e2_0.conda#85d2aaa7af046528d339da1e813c3a9f -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.2.0-pyhd8ed1ab_0.conda#5973bc565e2aea620c3a431cafdde032 -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.0-he6dfbbe_0.conda#ba48f3659627380d18e236312c65bd76 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.2.1-pyhd8ed1ab_0.conda#72ac49d50b7af2159a8f4128bc1f856d +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.1-he6dfbbe_0.conda#ea6a10c0233c47162f24a602ed3ee9c5 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py310h2372a71_1.conda#dfcf64f67961eb9686676f96fdb4b4d1 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.12.0-py310hb13e2d6_2.conda#cd3baec470071490bc5ab05da64c52b5 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.2-py310hc3e127f_1.conda#fdaca8d27b3af78d617521eb37b1d055 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.3-py310hc3e127f_0.conda#fbc825d13cbcb2d5d3fbba22c83fd203 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py310h1f7b6fc_4.conda#0ca55ca20891d393846695354b32ebc5 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.34.0-he84ddb8_0.conda#7bead4ebb77dc44f1b9b5d54b3aa90bd +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.34.1-he84ddb8_0.conda#f12ca97c38833a5a179adc172155d15d https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.3-py310h62c0568_0.conda#4a7296c0273eb01dfbed728dd6a6725a https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py310hba70d50_100.conda#e19392760c7e4da3b9cb0ee5bf61bc4b https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py310hcc13569_1.conda#31ef447724fb19066a9d00a660dab1bd -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.6.1-py310h1f7b6fc_1.conda#eee8d291cab9c673142ce54c5d561fa8 -https://conda.anaconda.org/conda-forge/noarch/iris-3.7.0-pyha770c72_0.conda#dccc1f660bf455c239adaabf56b91dc9 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.0-py310h1f7b6fc_0.conda#2a4b3768e9a8de09fd643ea927d5d38b +https://conda.anaconda.org/conda-forge/noarch/iris-3.8.0-pyha770c72_0.conda#6a92f316e0c5fc52c9d7cff5fa348bc3 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 5559c1e9..559e74ba 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -12,7 +12,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_5.conda# https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_5.conda#d4ff227c46917d3b4565302a2bbb276b https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.26.0-hd590300_0.conda#a86d90025198fd411845fc245ebc06c8 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.27.0-hd590300_0.conda#f6afff0e9ee08d2f1b897881a4f38cdb https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 @@ -52,7 +52,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.co https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_5.conda#e73e9cfd1191783392131e6238bdb3e9 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.42-h2797004_0.conda#d67729828dc6ff7ba44a61062ad79880 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.1-h2797004_0.conda#fc4ccadfbf6d4784de88c41704792562 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 @@ -100,7 +100,7 @@ https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py311h459d7ec_0 https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda#926c67c0310094cf421ad13f7d3f38e5 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 -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-h488ebb8_3.conda#128c25b7fe6a25286a48f3a6a9b5b6f3 +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 https://conda.anaconda.org/conda-forge/noarch/packaging-23.2-pyhd8ed1ab_0.conda#79002079284aa895f883c6b7f3f88fd6 https://conda.anaconda.org/conda-forge/noarch/pep8-1.7.1-py_0.tar.bz2#d0b5bc3aebbffcb175bf8a1d419acb79 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff @@ -111,7 +111,7 @@ https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py311h459d7ec_0.conda#60b5332b3989fda37884b92c7afd6a91 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py311h459d7ec_1.conda#52719a74ad130de8fb5d047dc91f247a -https://conda.anaconda.org/conda-forge/noarch/setuptools-69.0.3-pyhd8ed1ab_0.conda#40695fdfd15a92121ed2922900d0308b +https://conda.anaconda.org/conda-forge/noarch/setuptools-69.1.1-pyhd8ed1ab_0.conda#576de899521b7d43674ba3ef6eae9142 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 @@ -133,8 +133,8 @@ https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf https://conda.anaconda.org/conda-forge/linux-64/pillow-10.2.0-py311ha6c5da5_0.conda#a5ccd7f2271f28b7d2de0b02b64e3796 https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.1-h1d62c97_0.conda#44ec51d0857d9be26158bb85caa74fdb -https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.0-pyhd8ed1ab_0.conda#6a7e0694921f668a030d52f0c47baebd +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.0.1-hd8ed1ab_0.conda#4a2f43a20fa404b998859c6a470ba316 @@ -144,18 +144,18 @@ https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311hca0b8b9_5.con https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py311h1f0f07a_0.conda#b7e6d52b39e199238c3400cafaabafb3 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py311h9547e67_0.conda#40828c5b36ef52433e21f89943e09f33 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.2.0-pyhd8ed1ab_0.conda#5973bc565e2aea620c3a431cafdde032 -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.0-he6dfbbe_0.conda#ba48f3659627380d18e236312c65bd76 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.2.1-pyhd8ed1ab_0.conda#72ac49d50b7af2159a8f4128bc1f856d +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.1-he6dfbbe_0.conda#ea6a10c0233c47162f24a602ed3ee9c5 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py311h459d7ec_1.conda#45b8d355bbcdd27588c2d266bcfdff84 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.12.0-py311h64a7726_2.conda#24ca5107ab75c5521067b8ba505dfae5 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.2-py311h2032efe_1.conda#4ba860ff851768615b1a25b788022750 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.3-py311h2032efe_0.conda#e982956906078eeac9feb3b8db10d011 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h1f0f07a_4.conda#1e105c1a8ea2163507726144b401eb1b -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.34.0-he84ddb8_0.conda#7bead4ebb77dc44f1b9b5d54b3aa90bd +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.34.1-he84ddb8_0.conda#f12ca97c38833a5a179adc172155d15d https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.3-py311h54ef318_0.conda#014c115be880802d2372ac6ed665f526 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py311he8ad708_100.conda#597b1ad6cb7011b7561c20ea30295cae https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py311h320fe9a_1.conda#10d1806e20da040c58c36deddf51c70c -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.6.1-py311h1f0f07a_1.conda#fa4f6eb8d7f25c8525f25ff173a687b4 -https://conda.anaconda.org/conda-forge/noarch/iris-3.7.0-pyha770c72_0.conda#dccc1f660bf455c239adaabf56b91dc9 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.0-py311h1f0f07a_0.conda#e4b24208eaa21d6ed65cf3b640bcd677 +https://conda.anaconda.org/conda-forge/noarch/iris-3.8.0-pyha770c72_0.conda#6a92f316e0c5fc52c9d7cff5fa348bc3 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda#611a35a27914fac3aa37611a6fe40bb5 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.6-pyhd8ed1ab_0.conda#d7e4954df0d3aea2eacc7835ad12671d https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.5-pyhd8ed1ab_0.conda#7e1e7437273682ada2ed5e9e9714b140 diff --git a/requirements/locks/py39-linux-64.lock b/requirements/locks/py39-linux-64.lock index a81fb38d..38bdcac0 100644 --- a/requirements/locks/py39-linux-64.lock +++ b/requirements/locks/py39-linux-64.lock @@ -12,7 +12,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_5.conda# https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_5.conda#d4ff227c46917d3b4565302a2bbb276b https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.26.0-hd590300_0.conda#a86d90025198fd411845fc245ebc06c8 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.27.0-hd590300_0.conda#f6afff0e9ee08d2f1b897881a4f38cdb https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 @@ -52,7 +52,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.co https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_5.conda#e73e9cfd1191783392131e6238bdb3e9 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.42-h2797004_0.conda#d67729828dc6ff7ba44a61062ad79880 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.1-h2797004_0.conda#fc4ccadfbf6d4784de88c41704792562 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 @@ -96,7 +96,7 @@ https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py39hd1e30aa_0. https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda#926c67c0310094cf421ad13f7d3f38e5 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 -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-h488ebb8_3.conda#128c25b7fe6a25286a48f3a6a9b5b6f3 +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 https://conda.anaconda.org/conda-forge/noarch/packaging-23.2-pyhd8ed1ab_0.conda#79002079284aa895f883c6b7f3f88fd6 https://conda.anaconda.org/conda-forge/noarch/pep8-1.7.1-py_0.tar.bz2#d0b5bc3aebbffcb175bf8a1d419acb79 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff @@ -105,7 +105,7 @@ https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#9 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py39hd1e30aa_0.conda#756cb152772a225587a05ca0ec68fc08 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py39hd1e30aa_1.conda#37218233bcdc310e4fde6453bc1b40d8 -https://conda.anaconda.org/conda-forge/noarch/setuptools-69.0.3-pyhd8ed1ab_0.conda#40695fdfd15a92121ed2922900d0308b +https://conda.anaconda.org/conda-forge/noarch/setuptools-69.1.1-pyhd8ed1ab_0.conda#576de899521b7d43674ba3ef6eae9142 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py39hd1e30aa_0.conda#1da984bbb6e765743e13388ba7b7b2c8 @@ -117,7 +117,7 @@ https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py39h7a31438_0.conda https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.49.0-py39hd1e30aa_0.conda#dd1b02484cc8c31d4093111a82b6efb2 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_100.conda#d471a5c3abc984b662d9bae3bb7fd8a5 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.0.1-pyha770c72_0.conda#746623a787e06191d80a2133e5daff17 -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.1.1-pyhd8ed1ab_0.conda#3d5fa25cf42f3f32a12b2d874ace8574 +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.1.2-pyhd8ed1ab_0.conda#6f4399795892835bd192ea210ca69447 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda#e7d8df6509ba635247ff9aea31134262 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-21_linux64_openblas.conda#4a3816d06451c4946e2db26b86472cb6 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca @@ -126,11 +126,11 @@ https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf https://conda.anaconda.org/conda-forge/linux-64/pillow-10.2.0-py39had0adad_0.conda#2972754dc054bb079d1d121918b5126f https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.1-h1d62c97_0.conda#44ec51d0857d9be26158bb85caa74fdb -https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.0-pyhd8ed1ab_0.conda#6a7e0694921f668a030d52f0c47baebd +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 -https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.1.1-pyhd8ed1ab_0.conda#d04bd1b5bed9177dd7c3cef15e2b6710 +https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.1.2-pyhd8ed1ab_0.conda#c69b222e1a89945b80feb249d57d8949 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.0.1-hd8ed1ab_0.conda#4a2f43a20fa404b998859c6a470ba316 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h9612171_113.conda#b2414908e43c442ddc68e6148774a304 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py39h474f0d3_0.conda#aa265f5697237aa13cc10f53fa8acc4f @@ -138,15 +138,15 @@ https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py39h15b0fa6_5.cond https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py39h44dd56e_0.conda#baea2f5dfb3ab7b1c836385d2e1daca7 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py39h7633fee_0.conda#ed71ad3e30eb03da363fb797419cce98 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.2.0-pyhd8ed1ab_0.conda#5973bc565e2aea620c3a431cafdde032 -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.0-he6dfbbe_0.conda#ba48f3659627380d18e236312c65bd76 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.2.1-pyhd8ed1ab_0.conda#72ac49d50b7af2159a8f4128bc1f856d +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.1-he6dfbbe_0.conda#ea6a10c0233c47162f24a602ed3ee9c5 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py39hd1e30aa_1.conda#ca63612907462c8e36edcc9bbacc253e https://conda.anaconda.org/conda-forge/linux-64/scipy-1.12.0-py39h474f0d3_2.conda#6ab241b2023730f6b41712dc1b503afa -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.2-py39h6404dd3_1.conda#05623249055d99c51cde021b525611db +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.3-py39h6404dd3_0.conda#1520f039123452cd2de847068449a618 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py39h44dd56e_4.conda#81310d21bf9d91754c1220c585bb72d6 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.34.0-he84ddb8_0.conda#7bead4ebb77dc44f1b9b5d54b3aa90bd +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.34.1-he84ddb8_0.conda#f12ca97c38833a5a179adc172155d15d https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.3-py39he9076e7_0.conda#5456bdfe5809ebf5689eda6c808b686e https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py39h4282601_100.conda#d2809fbf0d8ae7b8ca92c456cb44a7d4 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py39hddac248_1.conda#8dd2eb1e7aa9a33a92a75bdcea3f0dd0 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.6.1-py39h44dd56e_1.conda#0ac51aa5d5ccdc8f0106176823fde146 -https://conda.anaconda.org/conda-forge/noarch/iris-3.7.0-pyha770c72_0.conda#dccc1f660bf455c239adaabf56b91dc9 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.0-py39h44dd56e_0.conda#4b30f271c8da8ba92d078fade2918fa5 +https://conda.anaconda.org/conda-forge/noarch/iris-3.8.0-pyha770c72_0.conda#6a92f316e0c5fc52c9d7cff5fa348bc3 From 835517d9ec39e8f152b146e734d820eb94fa6a55 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 11 Mar 2024 09:42:39 +0000 Subject: [PATCH 255/583] Updated environment lockfiles (#383) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 10 +++++----- requirements/locks/py311-linux-64.lock | 10 +++++----- requirements/locks/py39-linux-64.lock | 14 +++++++------- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index b0dba1bd..9d8dde71 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -21,7 +21,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.2-h59595ed_1.conda#12 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.19-hd590300_0.conda#1635570038840ee3f9c71d22aa5b8b6d https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.5.0-hcb278e6_1.conda#6305a3dd2752c76335295da4e581f2fd +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.1-h59595ed_0.conda#476fb82aba5358a08d52ec44e286ce33 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_5.conda#7a6bd7a12a4bd359e2afe6c0fa1acace https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e @@ -100,7 +100,7 @@ https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda# https://conda.anaconda.org/conda-forge/noarch/packaging-23.2-pyhd8ed1ab_0.conda#79002079284aa895f883c6b7f3f88fd6 https://conda.anaconda.org/conda-forge/noarch/pep8-1.7.1-py_0.tar.bz2#d0b5bc3aebbffcb175bf8a1d419acb79 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.1-pyhd8ed1ab_0.conda#176f7d56f0cfe9008bdf1bccd7de02fb +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py310h2372a71_0.conda#b631b889b0b4bc2fca7b8b977ca484b2 @@ -116,7 +116,7 @@ https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py310h2fee648_0.conda#45846a970e71ac98fd327da5d40a0a2c https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.49.0-py310h2372a71_0.conda#e61ae80fde506b70a88e5e06376d2068 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_100.conda#d471a5c3abc984b662d9bae3bb7fd8a5 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.0.1-pyha770c72_0.conda#746623a787e06191d80a2133e5daff17 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.0.2-pyha770c72_0.conda#b050a4bb0e90ebd6e7fa4093d6346867 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda#e7d8df6509ba635247ff9aea31134262 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-21_linux64_openblas.conda#4a3816d06451c4946e2db26b86472cb6 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca @@ -129,7 +129,7 @@ https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.0.1-hd8ed1ab_0.conda#4a2f43a20fa404b998859c6a470ba316 +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.0.2-hd8ed1ab_0.conda#d11132727a247f2c1998779a2af743a1 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h9612171_113.conda#b2414908e43c442ddc68e6148774a304 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py310hb13e2d6_0.conda#6593de64c935768b6bad3e19b3e978be https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py310hd5c30f3_5.conda#dc2ee770a2299307f3c127af79160d25 @@ -147,4 +147,4 @@ https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.3-py310h62c0 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py310hba70d50_100.conda#e19392760c7e4da3b9cb0ee5bf61bc4b https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py310hcc13569_1.conda#31ef447724fb19066a9d00a660dab1bd https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.0-py310h1f7b6fc_0.conda#2a4b3768e9a8de09fd643ea927d5d38b -https://conda.anaconda.org/conda-forge/noarch/iris-3.8.0-pyha770c72_0.conda#6a92f316e0c5fc52c9d7cff5fa348bc3 +https://conda.anaconda.org/conda-forge/noarch/iris-3.8.1-pyha770c72_0.conda#b08a116ef1607e7e960a4caa902e3a90 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 559e74ba..e77b5a29 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -21,7 +21,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.2-h59595ed_1.conda#12 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.19-hd590300_0.conda#1635570038840ee3f9c71d22aa5b8b6d https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.5.0-hcb278e6_1.conda#6305a3dd2752c76335295da4e581f2fd +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.1-h59595ed_0.conda#476fb82aba5358a08d52ec44e286ce33 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_5.conda#7a6bd7a12a4bd359e2afe6c0fa1acace https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e @@ -105,7 +105,7 @@ https://conda.anaconda.org/conda-forge/noarch/packaging-23.2-pyhd8ed1ab_0.conda# https://conda.anaconda.org/conda-forge/noarch/pep8-1.7.1-py_0.tar.bz2#d0b5bc3aebbffcb175bf8a1d419acb79 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda#140a7f159396547e9799aa98f9f0742e -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.1-pyhd8ed1ab_0.conda#176f7d56f0cfe9008bdf1bccd7de02fb +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py311h459d7ec_0.conda#60b5332b3989fda37884b92c7afd6a91 @@ -124,7 +124,7 @@ https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#96 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py311hb3a22ac_0.conda#b3469563ac5e808b0cd92810d0697043 https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.49.0-py311h459d7ec_0.conda#d66c9e36ab104f94e35b015c86c2fcb4 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_100.conda#d471a5c3abc984b662d9bae3bb7fd8a5 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.0.1-pyha770c72_0.conda#746623a787e06191d80a2133e5daff17 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.0.2-pyha770c72_0.conda#b050a4bb0e90ebd6e7fa4093d6346867 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda#e7d8df6509ba635247ff9aea31134262 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-21_linux64_openblas.conda#4a3816d06451c4946e2db26b86472cb6 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca @@ -137,7 +137,7 @@ https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.0.1-hd8ed1ab_0.conda#4a2f43a20fa404b998859c6a470ba316 +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.0.2-hd8ed1ab_0.conda#d11132727a247f2c1998779a2af743a1 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h9612171_113.conda#b2414908e43c442ddc68e6148774a304 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.conda#a502d7aad449a1206efb366d6a12c52d https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311hca0b8b9_5.conda#cac429fcb9126d5e6f02c8ba61c2a811 @@ -155,7 +155,7 @@ https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.3-py311h54ef https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py311he8ad708_100.conda#597b1ad6cb7011b7561c20ea30295cae https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py311h320fe9a_1.conda#10d1806e20da040c58c36deddf51c70c https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.0-py311h1f0f07a_0.conda#e4b24208eaa21d6ed65cf3b640bcd677 -https://conda.anaconda.org/conda-forge/noarch/iris-3.8.0-pyha770c72_0.conda#6a92f316e0c5fc52c9d7cff5fa348bc3 +https://conda.anaconda.org/conda-forge/noarch/iris-3.8.1-pyha770c72_0.conda#b08a116ef1607e7e960a4caa902e3a90 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda#611a35a27914fac3aa37611a6fe40bb5 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.6-pyhd8ed1ab_0.conda#d7e4954df0d3aea2eacc7835ad12671d https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.5-pyhd8ed1ab_0.conda#7e1e7437273682ada2ed5e9e9714b140 diff --git a/requirements/locks/py39-linux-64.lock b/requirements/locks/py39-linux-64.lock index 38bdcac0..5774793b 100644 --- a/requirements/locks/py39-linux-64.lock +++ b/requirements/locks/py39-linux-64.lock @@ -21,7 +21,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.2-h59595ed_1.conda#12 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.19-hd590300_0.conda#1635570038840ee3f9c71d22aa5b8b6d https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.5.0-hcb278e6_1.conda#6305a3dd2752c76335295da4e581f2fd +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.1-h59595ed_0.conda#476fb82aba5358a08d52ec44e286ce33 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_5.conda#7a6bd7a12a4bd359e2afe6c0fa1acace https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e @@ -100,7 +100,7 @@ https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda# https://conda.anaconda.org/conda-forge/noarch/packaging-23.2-pyhd8ed1ab_0.conda#79002079284aa895f883c6b7f3f88fd6 https://conda.anaconda.org/conda-forge/noarch/pep8-1.7.1-py_0.tar.bz2#d0b5bc3aebbffcb175bf8a1d419acb79 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.1-pyhd8ed1ab_0.conda#176f7d56f0cfe9008bdf1bccd7de02fb +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py39hd1e30aa_0.conda#756cb152772a225587a05ca0ec68fc08 @@ -116,8 +116,8 @@ https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py39h7a31438_0.conda#ac992767d7f8ed2cb27e71e78f0fb2d7 https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.49.0-py39hd1e30aa_0.conda#dd1b02484cc8c31d4093111a82b6efb2 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_100.conda#d471a5c3abc984b662d9bae3bb7fd8a5 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.0.1-pyha770c72_0.conda#746623a787e06191d80a2133e5daff17 -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.1.2-pyhd8ed1ab_0.conda#6f4399795892835bd192ea210ca69447 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.0.2-pyha770c72_0.conda#b050a4bb0e90ebd6e7fa4093d6346867 +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.1.3-pyhd8ed1ab_0.conda#b865eadcceebf641fa833ee086756e8b https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda#e7d8df6509ba635247ff9aea31134262 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-21_linux64_openblas.conda#4a3816d06451c4946e2db26b86472cb6 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca @@ -130,8 +130,8 @@ https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 -https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.1.2-pyhd8ed1ab_0.conda#c69b222e1a89945b80feb249d57d8949 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.0.1-hd8ed1ab_0.conda#4a2f43a20fa404b998859c6a470ba316 +https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.1.3-pyhd8ed1ab_0.conda#26161ce50840a8b0ca8985e358fb7ba8 +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.0.2-hd8ed1ab_0.conda#d11132727a247f2c1998779a2af743a1 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h9612171_113.conda#b2414908e43c442ddc68e6148774a304 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py39h474f0d3_0.conda#aa265f5697237aa13cc10f53fa8acc4f https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py39h15b0fa6_5.conda#85e186c7ff673b0d0026782ec353fb2a @@ -149,4 +149,4 @@ https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.3-py39he9076 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py39h4282601_100.conda#d2809fbf0d8ae7b8ca92c456cb44a7d4 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py39hddac248_1.conda#8dd2eb1e7aa9a33a92a75bdcea3f0dd0 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.0-py39h44dd56e_0.conda#4b30f271c8da8ba92d078fade2918fa5 -https://conda.anaconda.org/conda-forge/noarch/iris-3.8.0-pyha770c72_0.conda#6a92f316e0c5fc52c9d7cff5fa348bc3 +https://conda.anaconda.org/conda-forge/noarch/iris-3.8.1-pyha770c72_0.conda#b08a116ef1607e7e960a4caa902e3a90 From 56d3070f11358e3055cddb3e9af7943a99063a9c Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 18 Mar 2024 09:58:33 +0000 Subject: [PATCH 256/583] Updated environment lockfiles (#385) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 14 +++++++------- requirements/locks/py311-linux-64.lock | 14 +++++++------- requirements/locks/py39-linux-64.lock | 18 +++++++++--------- 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 9d8dde71..6c9c304e 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -21,7 +21,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.2-h59595ed_1.conda#12 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.19-hd590300_0.conda#1635570038840ee3f9c71d22aa5b8b6d https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.1-h59595ed_0.conda#476fb82aba5358a08d52ec44e286ce33 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_5.conda#7a6bd7a12a4bd359e2afe6c0fa1acace https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e @@ -53,7 +53,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2. https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_5.conda#e73e9cfd1191783392131e6238bdb3e9 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.1-h2797004_0.conda#fc4ccadfbf6d4784de88c41704792562 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.2-h2797004_0.conda#866983a220e27a80cb75e85cb30466a1 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c @@ -71,7 +71,7 @@ https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd9 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.26-pthreads_h413a1c8_0.conda#760ae35415f5ba8b15d09df5afe8b23a https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-ha9c0a0a_2.conda#55ed21669b2015f77c180feb1dd41930 https://conda.anaconda.org/conda-forge/linux-64/python-3.10.13-hd12c33a_1_cpython.conda#ed38140af93f81319ebc472fbcf16cca -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.1-h2c6b66d_0.conda#93acf31b379acebada263b9bce3dc6ed +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.2-h2c6b66d_0.conda#1423efca06ed343c1da0fc429bae0779 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.7-h8ee46fc_0.conda#49e482d882669206653b095f5206c05b https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 @@ -97,7 +97,7 @@ https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda#926c 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 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 -https://conda.anaconda.org/conda-forge/noarch/packaging-23.2-pyhd8ed1ab_0.conda#79002079284aa895f883c6b7f3f88fd6 +https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#248f521b64ce055e7feae3105e7abeb8 https://conda.anaconda.org/conda-forge/noarch/pep8-1.7.1-py_0.tar.bz2#d0b5bc3aebbffcb175bf8a1d419acb79 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f @@ -105,7 +105,7 @@ https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#9 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py310h2372a71_0.conda#b631b889b0b4bc2fca7b8b977ca484b2 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py310h2372a71_1.conda#bb010e368de4940771368bc3dc4c63e7 -https://conda.anaconda.org/conda-forge/noarch/setuptools-69.1.1-pyhd8ed1ab_0.conda#576de899521b7d43674ba3ef6eae9142 +https://conda.anaconda.org/conda-forge/noarch/setuptools-69.2.0-pyhd8ed1ab_0.conda#da214ecd521a720a9d521c68047682dc https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py310h2372a71_0.conda#72637c58d36d9475fda24700c9796f19 @@ -136,8 +136,8 @@ https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py310hd5c30f3_5.con https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py310h1f7b6fc_0.conda#31beda75384647959d5792a1a7dc571a https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py310hd41b1e2_0.conda#85d2aaa7af046528d339da1e813c3a9f -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.2.1-pyhd8ed1ab_0.conda#72ac49d50b7af2159a8f4128bc1f856d -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.1-he6dfbbe_0.conda#ea6a10c0233c47162f24a602ed3ee9c5 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.3.1-pyhd8ed1ab_0.conda#52dd56ce3afa6a52c2f3d3116875ff32 +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.2-he6dfbbe_0.conda#629e33f68784c1fb678ac7e6f0d9b249 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py310h2372a71_1.conda#dfcf64f67961eb9686676f96fdb4b4d1 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.12.0-py310hb13e2d6_2.conda#cd3baec470071490bc5ab05da64c52b5 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.3-py310hc3e127f_0.conda#fbc825d13cbcb2d5d3fbba22c83fd203 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index e77b5a29..fab6ff65 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -21,7 +21,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.2-h59595ed_1.conda#12 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.19-hd590300_0.conda#1635570038840ee3f9c71d22aa5b8b6d https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.1-h59595ed_0.conda#476fb82aba5358a08d52ec44e286ce33 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_5.conda#7a6bd7a12a4bd359e2afe6c0fa1acace https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e @@ -53,7 +53,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2. https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_5.conda#e73e9cfd1191783392131e6238bdb3e9 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.1-h2797004_0.conda#fc4ccadfbf6d4784de88c41704792562 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.2-h2797004_0.conda#866983a220e27a80cb75e85cb30466a1 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c @@ -71,7 +71,7 @@ https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd9 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.26-pthreads_h413a1c8_0.conda#760ae35415f5ba8b15d09df5afe8b23a https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-ha9c0a0a_2.conda#55ed21669b2015f77c180feb1dd41930 https://conda.anaconda.org/conda-forge/linux-64/python-3.11.8-hab00c5b_0_cpython.conda#2fdc314ee058eda0114738a9309d3683 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.1-h2c6b66d_0.conda#93acf31b379acebada263b9bce3dc6ed +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.2-h2c6b66d_0.conda#1423efca06ed343c1da0fc429bae0779 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.7-h8ee46fc_0.conda#49e482d882669206653b095f5206c05b https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb @@ -101,7 +101,7 @@ https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda#926c 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 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 -https://conda.anaconda.org/conda-forge/noarch/packaging-23.2-pyhd8ed1ab_0.conda#79002079284aa895f883c6b7f3f88fd6 +https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#248f521b64ce055e7feae3105e7abeb8 https://conda.anaconda.org/conda-forge/noarch/pep8-1.7.1-py_0.tar.bz2#d0b5bc3aebbffcb175bf8a1d419acb79 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda#140a7f159396547e9799aa98f9f0742e @@ -111,7 +111,7 @@ https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py311h459d7ec_0.conda#60b5332b3989fda37884b92c7afd6a91 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py311h459d7ec_1.conda#52719a74ad130de8fb5d047dc91f247a -https://conda.anaconda.org/conda-forge/noarch/setuptools-69.1.1-pyhd8ed1ab_0.conda#576de899521b7d43674ba3ef6eae9142 +https://conda.anaconda.org/conda-forge/noarch/setuptools-69.2.0-pyhd8ed1ab_0.conda#da214ecd521a720a9d521c68047682dc https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 @@ -144,8 +144,8 @@ https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311hca0b8b9_5.con https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py311h1f0f07a_0.conda#b7e6d52b39e199238c3400cafaabafb3 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py311h9547e67_0.conda#40828c5b36ef52433e21f89943e09f33 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.2.1-pyhd8ed1ab_0.conda#72ac49d50b7af2159a8f4128bc1f856d -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.1-he6dfbbe_0.conda#ea6a10c0233c47162f24a602ed3ee9c5 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.3.1-pyhd8ed1ab_0.conda#52dd56ce3afa6a52c2f3d3116875ff32 +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.2-he6dfbbe_0.conda#629e33f68784c1fb678ac7e6f0d9b249 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py311h459d7ec_1.conda#45b8d355bbcdd27588c2d266bcfdff84 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.12.0-py311h64a7726_2.conda#24ca5107ab75c5521067b8ba505dfae5 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.3-py311h2032efe_0.conda#e982956906078eeac9feb3b8db10d011 diff --git a/requirements/locks/py39-linux-64.lock b/requirements/locks/py39-linux-64.lock index 5774793b..351ab76c 100644 --- a/requirements/locks/py39-linux-64.lock +++ b/requirements/locks/py39-linux-64.lock @@ -21,7 +21,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.2-h59595ed_1.conda#12 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.19-hd590300_0.conda#1635570038840ee3f9c71d22aa5b8b6d https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.1-h59595ed_0.conda#476fb82aba5358a08d52ec44e286ce33 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_5.conda#7a6bd7a12a4bd359e2afe6c0fa1acace https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e @@ -53,7 +53,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2. https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_5.conda#e73e9cfd1191783392131e6238bdb3e9 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.1-h2797004_0.conda#fc4ccadfbf6d4784de88c41704792562 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.2-h2797004_0.conda#866983a220e27a80cb75e85cb30466a1 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c @@ -71,7 +71,7 @@ https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd9 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.26-pthreads_h413a1c8_0.conda#760ae35415f5ba8b15d09df5afe8b23a https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-ha9c0a0a_2.conda#55ed21669b2015f77c180feb1dd41930 https://conda.anaconda.org/conda-forge/linux-64/python-3.9.18-h0755675_1_cpython.conda#255a7002aeec7a067ff19b545aca6328 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.1-h2c6b66d_0.conda#93acf31b379acebada263b9bce3dc6ed +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.2-h2c6b66d_0.conda#1423efca06ed343c1da0fc429bae0779 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.7-h8ee46fc_0.conda#49e482d882669206653b095f5206c05b https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 @@ -97,7 +97,7 @@ https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda#926c 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 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 -https://conda.anaconda.org/conda-forge/noarch/packaging-23.2-pyhd8ed1ab_0.conda#79002079284aa895f883c6b7f3f88fd6 +https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#248f521b64ce055e7feae3105e7abeb8 https://conda.anaconda.org/conda-forge/noarch/pep8-1.7.1-py_0.tar.bz2#d0b5bc3aebbffcb175bf8a1d419acb79 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f @@ -105,7 +105,7 @@ https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#9 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py39hd1e30aa_0.conda#756cb152772a225587a05ca0ec68fc08 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py39hd1e30aa_1.conda#37218233bcdc310e4fde6453bc1b40d8 -https://conda.anaconda.org/conda-forge/noarch/setuptools-69.1.1-pyhd8ed1ab_0.conda#576de899521b7d43674ba3ef6eae9142 +https://conda.anaconda.org/conda-forge/noarch/setuptools-69.2.0-pyhd8ed1ab_0.conda#da214ecd521a720a9d521c68047682dc https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py39hd1e30aa_0.conda#1da984bbb6e765743e13388ba7b7b2c8 @@ -117,7 +117,7 @@ https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py39h7a31438_0.conda https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.49.0-py39hd1e30aa_0.conda#dd1b02484cc8c31d4093111a82b6efb2 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_100.conda#d471a5c3abc984b662d9bae3bb7fd8a5 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.0.2-pyha770c72_0.conda#b050a4bb0e90ebd6e7fa4093d6346867 -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.1.3-pyhd8ed1ab_0.conda#b865eadcceebf641fa833ee086756e8b +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.3.0-pyhd8ed1ab_0.conda#18850e65ca439066484607b26ed09ecd https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda#e7d8df6509ba635247ff9aea31134262 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-21_linux64_openblas.conda#4a3816d06451c4946e2db26b86472cb6 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca @@ -130,7 +130,7 @@ https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 -https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.1.3-pyhd8ed1ab_0.conda#26161ce50840a8b0ca8985e358fb7ba8 +https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.3.0-pyhd8ed1ab_0.conda#828e394294c4a0e31872a9f420cf92f7 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.0.2-hd8ed1ab_0.conda#d11132727a247f2c1998779a2af743a1 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h9612171_113.conda#b2414908e43c442ddc68e6148774a304 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py39h474f0d3_0.conda#aa265f5697237aa13cc10f53fa8acc4f @@ -138,8 +138,8 @@ https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py39h15b0fa6_5.cond https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py39h44dd56e_0.conda#baea2f5dfb3ab7b1c836385d2e1daca7 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py39h7633fee_0.conda#ed71ad3e30eb03da363fb797419cce98 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.2.1-pyhd8ed1ab_0.conda#72ac49d50b7af2159a8f4128bc1f856d -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.1-he6dfbbe_0.conda#ea6a10c0233c47162f24a602ed3ee9c5 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.3.1-pyhd8ed1ab_0.conda#52dd56ce3afa6a52c2f3d3116875ff32 +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.2-he6dfbbe_0.conda#629e33f68784c1fb678ac7e6f0d9b249 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py39hd1e30aa_1.conda#ca63612907462c8e36edcc9bbacc253e https://conda.anaconda.org/conda-forge/linux-64/scipy-1.12.0-py39h474f0d3_2.conda#6ab241b2023730f6b41712dc1b503afa https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.3-py39h6404dd3_0.conda#1520f039123452cd2de847068449a618 From f109de19e9013c8d2e21d167a90c58d5bcc30808 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Tue, 26 Mar 2024 09:32:24 +0000 Subject: [PATCH 257/583] Updated environment lockfiles (#396) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 24 +++++++++++----------- requirements/locks/py311-linux-64.lock | 22 ++++++++++---------- requirements/locks/py39-linux-64.lock | 28 +++++++++++++------------- 3 files changed, 37 insertions(+), 37 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 6c9c304e..c8c08d25 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -17,7 +17,7 @@ https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0 https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f -https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.2-h59595ed_1.conda#127b0be54c1c90760d7fe02ea7a56426 +https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.19-hd590300_0.conda#1635570038840ee3f9c71d22aa5b8b6d https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 @@ -33,8 +33,8 @@ https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_0.co https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-h59595ed_2.conda#7dbaa197d7ba6032caf7ae7f32c1efa0 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.1-hd590300_0.conda#51a753e64a3027bd7e23a189b1f6e91e +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4.20240210-h59595ed_0.conda#97da8860a0da5413c7c98a3b3838a645 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.1-hd590300_1.conda#9d731343cff6ee2e5a25c4a091bf8e2a https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-h9fff704_0.conda#e6d228cd0bb74a51dd18f5bfce0b4115 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b @@ -57,7 +57,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.2-h2797004_0.cond https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.5-h232c23b_0.conda#c442ebfda7a475f5e78f1c8e45f1e919 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.6-h232c23b_0.conda#d86653ff5ccb88bf7f13833fdd8789e0 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc @@ -70,7 +70,7 @@ https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.26-pthreads_h413a1c8_0.conda#760ae35415f5ba8b15d09df5afe8b23a https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-ha9c0a0a_2.conda#55ed21669b2015f77c180feb1dd41930 -https://conda.anaconda.org/conda-forge/linux-64/python-3.10.13-hd12c33a_1_cpython.conda#ed38140af93f81319ebc472fbcf16cca +https://conda.anaconda.org/conda-forge/linux-64/python-3.10.14-hd12c33a_0_cpython.conda#2b4ba962994e8bd4be9ff5b64b75aff2 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.2-h2c6b66d_0.conda#1423efca06ed343c1da0fc429bae0779 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.7-h8ee46fc_0.conda#49e482d882669206653b095f5206c05b @@ -85,12 +85,12 @@ https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.1-pyhd8ed1ab_0.conda#0c1729b74a8152fde6a38ba0a2ab9f45 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.2.0-pyhca7485f_0.conda#fad86b90138cf5d82c6f5a2ed6e683d9 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.3.1-pyhca7485f_0.conda#b7f0662ef2c9d4404f0af9eef5ed2fde https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda#1a76f09108576397c41c0b0c5bd84134 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py310hd41b1e2_1.conda#b8d67603d43b23ce7e988a5d81a7ab79 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-21_linux64_openblas.conda#0ac9f44fc096772b0aa092119b00c3ca -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.5.0-hca28451_0.conda#7144d5a828e2cae218e0e3c98d8a0aeb +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.6.0-hca28451_0.conda#704739398d858872cb91610f49f0ef29 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py310h2372a71_0.conda#f6703fa0214a00bf49d1bef6dc7672d0 https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda#926c67c0310094cf421ad13f7d3f38e5 @@ -109,14 +109,14 @@ https://conda.anaconda.org/conda-forge/noarch/setuptools-69.2.0-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py310h2372a71_0.conda#72637c58d36d9475fda24700c9796f19 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.42.0-pyhd8ed1ab_0.conda#1cdea58981c5cbc17b51973bcaddcea7 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_0.conda#6e43a94e0ee67523b5e781f0faba5c45 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py310h2fee648_0.conda#45846a970e71ac98fd327da5d40a0a2c -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.49.0-py310h2372a71_0.conda#e61ae80fde506b70a88e5e06376d2068 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.50.0-py310h2372a71_0.conda#85c48c98c9f2b72b384fb11c9004920b https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_100.conda#d471a5c3abc984b662d9bae3bb7fd8a5 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.0.2-pyha770c72_0.conda#b050a4bb0e90ebd6e7fa4093d6346867 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda#0896606848b2dc5cebdf111b6543aa04 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda#e7d8df6509ba635247ff9aea31134262 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-21_linux64_openblas.conda#4a3816d06451c4946e2db26b86472cb6 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca @@ -129,7 +129,7 @@ https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.0.2-hd8ed1ab_0.conda#d11132727a247f2c1998779a2af743a1 +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.1.0-hd8ed1ab_0.conda#6ef2b72d291b39e479d7694efa2b2b98 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h9612171_113.conda#b2414908e43c442ddc68e6148774a304 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py310hb13e2d6_0.conda#6593de64c935768b6bad3e19b3e978be https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py310hd5c30f3_5.conda#dc2ee770a2299307f3c127af79160d25 @@ -146,5 +146,5 @@ https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.34.1-he84ddb8_0.conda# https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.3-py310h62c0568_0.conda#4a7296c0273eb01dfbed728dd6a6725a https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py310hba70d50_100.conda#e19392760c7e4da3b9cb0ee5bf61bc4b https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py310hcc13569_1.conda#31ef447724fb19066a9d00a660dab1bd -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.0-py310h1f7b6fc_0.conda#2a4b3768e9a8de09fd643ea927d5d38b +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.0-py310h1f7b6fc_1.conda#f020ac07b7df9c4b0bd0ece3055b5bd2 https://conda.anaconda.org/conda-forge/noarch/iris-3.8.1-pyha770c72_0.conda#b08a116ef1607e7e960a4caa902e3a90 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index fab6ff65..4d2027a5 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -17,7 +17,7 @@ https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0 https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f -https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.2-h59595ed_1.conda#127b0be54c1c90760d7fe02ea7a56426 +https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.19-hd590300_0.conda#1635570038840ee3f9c71d22aa5b8b6d https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 @@ -33,8 +33,8 @@ https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_0.co https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-h59595ed_2.conda#7dbaa197d7ba6032caf7ae7f32c1efa0 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.1-hd590300_0.conda#51a753e64a3027bd7e23a189b1f6e91e +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4.20240210-h59595ed_0.conda#97da8860a0da5413c7c98a3b3838a645 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.1-hd590300_1.conda#9d731343cff6ee2e5a25c4a091bf8e2a https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-h9fff704_0.conda#e6d228cd0bb74a51dd18f5bfce0b4115 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b @@ -57,7 +57,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.2-h2797004_0.cond https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.5-h232c23b_0.conda#c442ebfda7a475f5e78f1c8e45f1e919 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.6-h232c23b_0.conda#d86653ff5ccb88bf7f13833fdd8789e0 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc @@ -88,13 +88,13 @@ https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py311h38be061_3.conda#1c33f55e5cdcc2a2b973c432b5225bfe https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.1-pyhd8ed1ab_0.conda#0c1729b74a8152fde6a38ba0a2ab9f45 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.2.0-pyhca7485f_0.conda#fad86b90138cf5d82c6f5a2ed6e683d9 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.3.1-pyhca7485f_0.conda#b7f0662ef2c9d4404f0af9eef5ed2fde https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda#1a76f09108576397c41c0b0c5bd84134 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py311h9547e67_1.conda#2c65bdf442b0d37aad080c8a4e0d452f https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-21_linux64_openblas.conda#0ac9f44fc096772b0aa092119b00c3ca -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.5.0-hca28451_0.conda#7144d5a828e2cae218e0e3c98d8a0aeb +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.6.0-hca28451_0.conda#704739398d858872cb91610f49f0ef29 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py311h459d7ec_0.conda#a322b4185121935c871d201ae00ac143 https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda#926c67c0310094cf421ad13f7d3f38e5 @@ -116,15 +116,15 @@ https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.42.0-pyhd8ed1ab_0.conda#1cdea58981c5cbc17b51973bcaddcea7 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_0.conda#6e43a94e0ee67523b5e781f0faba5c45 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py311hb3a22ac_0.conda#b3469563ac5e808b0cd92810d0697043 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.49.0-py311h459d7ec_0.conda#d66c9e36ab104f94e35b015c86c2fcb4 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.50.0-py311h459d7ec_0.conda#fcdef52b45265eece45de756b164a9a7 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_100.conda#d471a5c3abc984b662d9bae3bb7fd8a5 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.0.2-pyha770c72_0.conda#b050a4bb0e90ebd6e7fa4093d6346867 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda#0896606848b2dc5cebdf111b6543aa04 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda#e7d8df6509ba635247ff9aea31134262 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-21_linux64_openblas.conda#4a3816d06451c4946e2db26b86472cb6 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca @@ -137,7 +137,7 @@ https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.0.2-hd8ed1ab_0.conda#d11132727a247f2c1998779a2af743a1 +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.1.0-hd8ed1ab_0.conda#6ef2b72d291b39e479d7694efa2b2b98 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h9612171_113.conda#b2414908e43c442ddc68e6148774a304 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.conda#a502d7aad449a1206efb366d6a12c52d https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311hca0b8b9_5.conda#cac429fcb9126d5e6f02c8ba61c2a811 @@ -154,7 +154,7 @@ https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.34.1-he84ddb8_0.conda# https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.3-py311h54ef318_0.conda#014c115be880802d2372ac6ed665f526 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py311he8ad708_100.conda#597b1ad6cb7011b7561c20ea30295cae https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py311h320fe9a_1.conda#10d1806e20da040c58c36deddf51c70c -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.0-py311h1f0f07a_0.conda#e4b24208eaa21d6ed65cf3b640bcd677 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.0-py311h1f0f07a_1.conda#74e551cef928303ec57f42828c51cf87 https://conda.anaconda.org/conda-forge/noarch/iris-3.8.1-pyha770c72_0.conda#b08a116ef1607e7e960a4caa902e3a90 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda#611a35a27914fac3aa37611a6fe40bb5 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.6-pyhd8ed1ab_0.conda#d7e4954df0d3aea2eacc7835ad12671d diff --git a/requirements/locks/py39-linux-64.lock b/requirements/locks/py39-linux-64.lock index 351ab76c..ac15f5b2 100644 --- a/requirements/locks/py39-linux-64.lock +++ b/requirements/locks/py39-linux-64.lock @@ -17,7 +17,7 @@ https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0 https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f -https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.2-h59595ed_1.conda#127b0be54c1c90760d7fe02ea7a56426 +https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.19-hd590300_0.conda#1635570038840ee3f9c71d22aa5b8b6d https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 @@ -33,8 +33,8 @@ https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_0.co https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-h59595ed_2.conda#7dbaa197d7ba6032caf7ae7f32c1efa0 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.1-hd590300_0.conda#51a753e64a3027bd7e23a189b1f6e91e +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4.20240210-h59595ed_0.conda#97da8860a0da5413c7c98a3b3838a645 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.1-hd590300_1.conda#9d731343cff6ee2e5a25c4a091bf8e2a https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-h9fff704_0.conda#e6d228cd0bb74a51dd18f5bfce0b4115 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b @@ -57,7 +57,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.2-h2797004_0.cond https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.5-h232c23b_0.conda#c442ebfda7a475f5e78f1c8e45f1e919 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.6-h232c23b_0.conda#d86653ff5ccb88bf7f13833fdd8789e0 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc @@ -70,7 +70,7 @@ https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.26-pthreads_h413a1c8_0.conda#760ae35415f5ba8b15d09df5afe8b23a https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-ha9c0a0a_2.conda#55ed21669b2015f77c180feb1dd41930 -https://conda.anaconda.org/conda-forge/linux-64/python-3.9.18-h0755675_1_cpython.conda#255a7002aeec7a067ff19b545aca6328 +https://conda.anaconda.org/conda-forge/linux-64/python-3.9.19-h0755675_0_cpython.conda#d9ee3647fbd9e8595b8df759b2bbefb8 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.2-h2c6b66d_0.conda#1423efca06ed343c1da0fc429bae0779 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.7-h8ee46fc_0.conda#49e482d882669206653b095f5206c05b @@ -85,12 +85,12 @@ https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.1-pyhd8ed1ab_0.conda#0c1729b74a8152fde6a38ba0a2ab9f45 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.2.0-pyhca7485f_0.conda#fad86b90138cf5d82c6f5a2ed6e683d9 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.3.1-pyhca7485f_0.conda#b7f0662ef2c9d4404f0af9eef5ed2fde https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda#1a76f09108576397c41c0b0c5bd84134 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py39h7633fee_1.conda#c9f74d717e5a2847a9f8b779c54130f2 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-21_linux64_openblas.conda#0ac9f44fc096772b0aa092119b00c3ca -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.5.0-hca28451_0.conda#7144d5a828e2cae218e0e3c98d8a0aeb +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.6.0-hca28451_0.conda#704739398d858872cb91610f49f0ef29 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py39hd1e30aa_0.conda#9a9a22eb1f83c44953319ee3b027769f https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda#926c67c0310094cf421ad13f7d3f38e5 @@ -109,15 +109,15 @@ https://conda.anaconda.org/conda-forge/noarch/setuptools-69.2.0-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py39hd1e30aa_0.conda#1da984bbb6e765743e13388ba7b7b2c8 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.42.0-pyhd8ed1ab_0.conda#1cdea58981c5cbc17b51973bcaddcea7 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_0.conda#6e43a94e0ee67523b5e781f0faba5c45 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py39h7a31438_0.conda#ac992767d7f8ed2cb27e71e78f0fb2d7 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.49.0-py39hd1e30aa_0.conda#dd1b02484cc8c31d4093111a82b6efb2 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.50.0-py39hd1e30aa_0.conda#8b689d531a6f99ef71212081c0126147 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_100.conda#d471a5c3abc984b662d9bae3bb7fd8a5 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.0.2-pyha770c72_0.conda#b050a4bb0e90ebd6e7fa4093d6346867 -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.3.0-pyhd8ed1ab_0.conda#18850e65ca439066484607b26ed09ecd +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda#0896606848b2dc5cebdf111b6543aa04 +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda#c5d3907ad8bd7bf557521a1833cf7e6d https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda#e7d8df6509ba635247ff9aea31134262 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-21_linux64_openblas.conda#4a3816d06451c4946e2db26b86472cb6 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca @@ -130,8 +130,8 @@ https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 -https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.3.0-pyhd8ed1ab_0.conda#828e394294c4a0e31872a9f420cf92f7 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.0.2-hd8ed1ab_0.conda#d11132727a247f2c1998779a2af743a1 +https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.4.0-pyhd8ed1ab_0.conda#dcbadab7a68738a028e195ab68ab2d2e +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.1.0-hd8ed1ab_0.conda#6ef2b72d291b39e479d7694efa2b2b98 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h9612171_113.conda#b2414908e43c442ddc68e6148774a304 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py39h474f0d3_0.conda#aa265f5697237aa13cc10f53fa8acc4f https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py39h15b0fa6_5.conda#85e186c7ff673b0d0026782ec353fb2a @@ -148,5 +148,5 @@ https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.34.1-he84ddb8_0.conda# https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.3-py39he9076e7_0.conda#5456bdfe5809ebf5689eda6c808b686e https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py39h4282601_100.conda#d2809fbf0d8ae7b8ca92c456cb44a7d4 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py39hddac248_1.conda#8dd2eb1e7aa9a33a92a75bdcea3f0dd0 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.0-py39h44dd56e_0.conda#4b30f271c8da8ba92d078fade2918fa5 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.0-py39h44dd56e_1.conda#629e8d066a330f729d0085d86681fd01 https://conda.anaconda.org/conda-forge/noarch/iris-3.8.1-pyha770c72_0.conda#b08a116ef1607e7e960a4caa902e3a90 From 4ef386fa7878628a8f3bb60bf2c930ed28dc3669 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Wed, 3 Apr 2024 10:26:12 +0100 Subject: [PATCH 258/583] Updated environment lockfiles (#397) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 14 +++++++------- requirements/locks/py311-linux-64.lock | 14 +++++++------- requirements/locks/py39-linux-64.lock | 14 +++++++------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index c8c08d25..7e5bdb1b 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -12,14 +12,14 @@ https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_5.conda# https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_5.conda#d4ff227c46917d3b4565302a2bbb276b https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.27.0-hd590300_0.conda#f6afff0e9ee08d2f1b897881a4f38cdb +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.28.0-hd590300_0.conda#a6d86d33ddb84cde21de214cce563823 https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.19-hd590300_0.conda#1635570038840ee3f9c71d22aa5b8b6d +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.20-hd590300_0.conda#8e88f9389f1165d7c0936fe40d9a9a79 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 @@ -57,7 +57,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.2-h2797004_0.cond https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.6-h232c23b_0.conda#d86653ff5ccb88bf7f13833fdd8789e0 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.6-h232c23b_1.conda#6853448e9ca1cfd5f15382afd2a6d123 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc @@ -69,7 +69,7 @@ https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.cond https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.26-pthreads_h413a1c8_0.conda#760ae35415f5ba8b15d09df5afe8b23a -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-ha9c0a0a_2.conda#55ed21669b2015f77c180feb1dd41930 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda#66f03896ffbe1a110ffda05c7a856504 https://conda.anaconda.org/conda-forge/linux-64/python-3.10.14-hd12c33a_0_cpython.conda#2b4ba962994e8bd4be9ff5b64b75aff2 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.2-h2c6b66d_0.conda#1423efca06ed343c1da0fc429bae0779 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 @@ -83,14 +83,14 @@ https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1a https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.conda#753d29fe41bb881e4b9c004f0abf973f https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 -https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.1-pyhd8ed1ab_0.conda#0c1729b74a8152fde6a38ba0a2ab9f45 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.3-pyhd8ed1ab_0.conda#ff15f46b0d34308f4d40c1c51df07592 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.3.1-pyhca7485f_0.conda#b7f0662ef2c9d4404f0af9eef5ed2fde https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda#1a76f09108576397c41c0b0c5bd84134 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py310hd41b1e2_1.conda#b8d67603d43b23ce7e988a5d81a7ab79 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-21_linux64_openblas.conda#0ac9f44fc096772b0aa092119b00c3ca -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.6.0-hca28451_0.conda#704739398d858872cb91610f49f0ef29 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.7.1-hca28451_0.conda#755c7f876815003337d2c61ff5d047e5 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py310h2372a71_0.conda#f6703fa0214a00bf49d1bef6dc7672d0 https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda#926c67c0310094cf421ad13f7d3f38e5 @@ -109,7 +109,7 @@ https://conda.anaconda.org/conda-forge/noarch/setuptools-69.2.0-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py310h2372a71_0.conda#72637c58d36d9475fda24700c9796f19 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_0.conda#6e43a94e0ee67523b5e781f0faba5c45 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda#0b5293a157c2b5cd513dd1b03d8d3aae https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 4d2027a5..f873d788 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -12,14 +12,14 @@ https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_5.conda# https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_5.conda#d4ff227c46917d3b4565302a2bbb276b https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.27.0-hd590300_0.conda#f6afff0e9ee08d2f1b897881a4f38cdb +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.28.0-hd590300_0.conda#a6d86d33ddb84cde21de214cce563823 https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.19-hd590300_0.conda#1635570038840ee3f9c71d22aa5b8b6d +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.20-hd590300_0.conda#8e88f9389f1165d7c0936fe40d9a9a79 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 @@ -57,7 +57,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.2-h2797004_0.cond https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.6-h232c23b_0.conda#d86653ff5ccb88bf7f13833fdd8789e0 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.6-h232c23b_1.conda#6853448e9ca1cfd5f15382afd2a6d123 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc @@ -69,7 +69,7 @@ https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.cond https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.26-pthreads_h413a1c8_0.conda#760ae35415f5ba8b15d09df5afe8b23a -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-ha9c0a0a_2.conda#55ed21669b2015f77c180feb1dd41930 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda#66f03896ffbe1a110ffda05c7a856504 https://conda.anaconda.org/conda-forge/linux-64/python-3.11.8-hab00c5b_0_cpython.conda#2fdc314ee058eda0114738a9309d3683 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.2-h2c6b66d_0.conda#1423efca06ed343c1da0fc429bae0779 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 @@ -86,7 +86,7 @@ https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py311h38be061_3.conda#1c33f55e5cdcc2a2b973c432b5225bfe -https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.1-pyhd8ed1ab_0.conda#0c1729b74a8152fde6a38ba0a2ab9f45 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.3-pyhd8ed1ab_0.conda#ff15f46b0d34308f4d40c1c51df07592 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.3.1-pyhca7485f_0.conda#b7f0662ef2c9d4404f0af9eef5ed2fde https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda#1a76f09108576397c41c0b0c5bd84134 @@ -94,7 +94,7 @@ https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.b https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py311h9547e67_1.conda#2c65bdf442b0d37aad080c8a4e0d452f https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-21_linux64_openblas.conda#0ac9f44fc096772b0aa092119b00c3ca -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.6.0-hca28451_0.conda#704739398d858872cb91610f49f0ef29 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.7.1-hca28451_0.conda#755c7f876815003337d2c61ff5d047e5 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py311h459d7ec_0.conda#a322b4185121935c871d201ae00ac143 https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda#926c67c0310094cf421ad13f7d3f38e5 @@ -116,7 +116,7 @@ https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_0.conda#6e43a94e0ee67523b5e781f0faba5c45 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda#0b5293a157c2b5cd513dd1b03d8d3aae https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a diff --git a/requirements/locks/py39-linux-64.lock b/requirements/locks/py39-linux-64.lock index ac15f5b2..cd57a4ee 100644 --- a/requirements/locks/py39-linux-64.lock +++ b/requirements/locks/py39-linux-64.lock @@ -12,14 +12,14 @@ https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_5.conda# https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_5.conda#d4ff227c46917d3b4565302a2bbb276b https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.27.0-hd590300_0.conda#f6afff0e9ee08d2f1b897881a4f38cdb +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.28.0-hd590300_0.conda#a6d86d33ddb84cde21de214cce563823 https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.19-hd590300_0.conda#1635570038840ee3f9c71d22aa5b8b6d +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.20-hd590300_0.conda#8e88f9389f1165d7c0936fe40d9a9a79 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 @@ -57,7 +57,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.2-h2797004_0.cond https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.6-h232c23b_0.conda#d86653ff5ccb88bf7f13833fdd8789e0 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.6-h232c23b_1.conda#6853448e9ca1cfd5f15382afd2a6d123 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc @@ -69,7 +69,7 @@ https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.cond https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.26-pthreads_h413a1c8_0.conda#760ae35415f5ba8b15d09df5afe8b23a -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-ha9c0a0a_2.conda#55ed21669b2015f77c180feb1dd41930 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda#66f03896ffbe1a110ffda05c7a856504 https://conda.anaconda.org/conda-forge/linux-64/python-3.9.19-h0755675_0_cpython.conda#d9ee3647fbd9e8595b8df759b2bbefb8 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.2-h2c6b66d_0.conda#1423efca06ed343c1da0fc429bae0779 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 @@ -83,14 +83,14 @@ https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1a https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.conda#753d29fe41bb881e4b9c004f0abf973f https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 -https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.1-pyhd8ed1ab_0.conda#0c1729b74a8152fde6a38ba0a2ab9f45 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.3-pyhd8ed1ab_0.conda#ff15f46b0d34308f4d40c1c51df07592 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.3.1-pyhca7485f_0.conda#b7f0662ef2c9d4404f0af9eef5ed2fde https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda#1a76f09108576397c41c0b0c5bd84134 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py39h7633fee_1.conda#c9f74d717e5a2847a9f8b779c54130f2 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-21_linux64_openblas.conda#0ac9f44fc096772b0aa092119b00c3ca -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.6.0-hca28451_0.conda#704739398d858872cb91610f49f0ef29 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.7.1-hca28451_0.conda#755c7f876815003337d2c61ff5d047e5 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py39hd1e30aa_0.conda#9a9a22eb1f83c44953319ee3b027769f https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda#926c67c0310094cf421ad13f7d3f38e5 @@ -109,7 +109,7 @@ https://conda.anaconda.org/conda-forge/noarch/setuptools-69.2.0-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py39hd1e30aa_0.conda#1da984bbb6e765743e13388ba7b7b2c8 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_0.conda#6e43a94e0ee67523b5e781f0faba5c45 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda#0b5293a157c2b5cd513dd1b03d8d3aae https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a From b620e2e461706f21ec48a9ea6160514b4303cea0 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 8 Apr 2024 11:12:21 +0100 Subject: [PATCH 259/583] Updated environment lockfiles (#399) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 14 +++++++------- requirements/locks/py311-linux-64.lock | 14 +++++++------- requirements/locks/py39-linux-64.lock | 14 +++++++------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 7e5bdb1b..290ce231 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -12,7 +12,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_5.conda# https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_5.conda#d4ff227c46917d3b4565302a2bbb276b https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.28.0-hd590300_0.conda#a6d86d33ddb84cde21de214cce563823 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.28.1-hd590300_0.conda#dcde58ff9a1f30b0037a2315d1846d1f https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 @@ -99,7 +99,7 @@ https://conda.anaconda.org/conda-forge/noarch/nose-1.3.7-py_1006.tar.bz2#382019d https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#248f521b64ce055e7feae3105e7abeb8 https://conda.anaconda.org/conda-forge/noarch/pep8-1.7.1-py_0.tar.bz2#d0b5bc3aebbffcb175bf8a1d419acb79 -https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 @@ -114,7 +114,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py310h2fee648_0.conda#45846a970e71ac98fd327da5d40a0a2c -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.50.0-py310h2372a71_0.conda#85c48c98c9f2b72b384fb11c9004920b +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.51.0-py310h2372a71_0.conda#1a4773624145c15b92820fe6c87c5fcd https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_100.conda#d471a5c3abc984b662d9bae3bb7fd8a5 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda#0896606848b2dc5cebdf111b6543aa04 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda#e7d8df6509ba635247ff9aea31134262 @@ -122,7 +122,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-21_linux64_openbl https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-21_linux64_openblas.conda#1a42f305615c3867684e049e85927531 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 -https://conda.anaconda.org/conda-forge/linux-64/pillow-10.2.0-py310h01dd4db_0.conda#9ec32d0d90f7670eb29bbba18299cf29 +https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py310hf73ecf8_0.conda#1de56cf017dfd02aa84093206a0141a8 https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.1-h1d62c97_0.conda#44ec51d0857d9be26158bb85caa74fdb https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c @@ -136,10 +136,10 @@ https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py310hd5c30f3_5.con https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py310h1f7b6fc_0.conda#31beda75384647959d5792a1a7dc571a https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py310hd41b1e2_0.conda#85d2aaa7af046528d339da1e813c3a9f -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.3.1-pyhd8ed1ab_0.conda#52dd56ce3afa6a52c2f3d3116875ff32 -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.2-he6dfbbe_0.conda#629e33f68784c1fb678ac7e6f0d9b249 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.4.1-pyhd8ed1ab_0.conda#52387f00fee8dcd5cf75f8886025293f +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.3-he6dfbbe_0.conda#05c1609de571f7a9a40e6d7d4116c21a https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py310h2372a71_1.conda#dfcf64f67961eb9686676f96fdb4b4d1 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.12.0-py310hb13e2d6_2.conda#cd3baec470071490bc5ab05da64c52b5 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py310hb13e2d6_0.conda#512cfc0369e247e3993a76030671cce0 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.3-py310hc3e127f_0.conda#fbc825d13cbcb2d5d3fbba22c83fd203 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py310h1f7b6fc_4.conda#0ca55ca20891d393846695354b32ebc5 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.34.1-he84ddb8_0.conda#f12ca97c38833a5a179adc172155d15d diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index f873d788..39b9f3fb 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -12,7 +12,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_5.conda# https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_5.conda#d4ff227c46917d3b4565302a2bbb276b https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.28.0-hd590300_0.conda#a6d86d33ddb84cde21de214cce563823 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.28.1-hd590300_0.conda#dcde58ff9a1f30b0037a2315d1846d1f https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 @@ -103,7 +103,7 @@ https://conda.anaconda.org/conda-forge/noarch/nose-1.3.7-py_1006.tar.bz2#382019d https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#248f521b64ce055e7feae3105e7abeb8 https://conda.anaconda.org/conda-forge/noarch/pep8-1.7.1-py_0.tar.bz2#d0b5bc3aebbffcb175bf8a1d419acb79 -https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda#140a7f159396547e9799aa98f9f0742e https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 @@ -122,7 +122,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_10 https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py311hb3a22ac_0.conda#b3469563ac5e808b0cd92810d0697043 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.50.0-py311h459d7ec_0.conda#fcdef52b45265eece45de756b164a9a7 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.51.0-py311h459d7ec_0.conda#17e1997cc17c571d5ad27bd0159f616c https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_100.conda#d471a5c3abc984b662d9bae3bb7fd8a5 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda#0896606848b2dc5cebdf111b6543aa04 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda#e7d8df6509ba635247ff9aea31134262 @@ -130,7 +130,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-21_linux64_openbl https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-21_linux64_openblas.conda#1a42f305615c3867684e049e85927531 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 -https://conda.anaconda.org/conda-forge/linux-64/pillow-10.2.0-py311ha6c5da5_0.conda#a5ccd7f2271f28b7d2de0b02b64e3796 +https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py311h18e6fac_0.conda#6c520a9d36c9d7270988c7a6c360d6d4 https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.1-h1d62c97_0.conda#44ec51d0857d9be26158bb85caa74fdb https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c @@ -144,10 +144,10 @@ https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311hca0b8b9_5.con https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py311h1f0f07a_0.conda#b7e6d52b39e199238c3400cafaabafb3 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py311h9547e67_0.conda#40828c5b36ef52433e21f89943e09f33 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.3.1-pyhd8ed1ab_0.conda#52dd56ce3afa6a52c2f3d3116875ff32 -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.2-he6dfbbe_0.conda#629e33f68784c1fb678ac7e6f0d9b249 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.4.1-pyhd8ed1ab_0.conda#52387f00fee8dcd5cf75f8886025293f +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.3-he6dfbbe_0.conda#05c1609de571f7a9a40e6d7d4116c21a https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py311h459d7ec_1.conda#45b8d355bbcdd27588c2d266bcfdff84 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.12.0-py311h64a7726_2.conda#24ca5107ab75c5521067b8ba505dfae5 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py311h64a7726_0.conda#d443c70b4a05f50236c70b9c79beff64 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.3-py311h2032efe_0.conda#e982956906078eeac9feb3b8db10d011 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h1f0f07a_4.conda#1e105c1a8ea2163507726144b401eb1b https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.34.1-he84ddb8_0.conda#f12ca97c38833a5a179adc172155d15d diff --git a/requirements/locks/py39-linux-64.lock b/requirements/locks/py39-linux-64.lock index cd57a4ee..50ef950f 100644 --- a/requirements/locks/py39-linux-64.lock +++ b/requirements/locks/py39-linux-64.lock @@ -12,7 +12,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_5.conda# https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_5.conda#d4ff227c46917d3b4565302a2bbb276b https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.28.0-hd590300_0.conda#a6d86d33ddb84cde21de214cce563823 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.28.1-hd590300_0.conda#dcde58ff9a1f30b0037a2315d1846d1f https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 @@ -99,7 +99,7 @@ https://conda.anaconda.org/conda-forge/noarch/nose-1.3.7-py_1006.tar.bz2#382019d https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#248f521b64ce055e7feae3105e7abeb8 https://conda.anaconda.org/conda-forge/noarch/pep8-1.7.1-py_0.tar.bz2#d0b5bc3aebbffcb175bf8a1d419acb79 -https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 @@ -114,7 +114,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py39h7a31438_0.conda#ac992767d7f8ed2cb27e71e78f0fb2d7 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.50.0-py39hd1e30aa_0.conda#8b689d531a6f99ef71212081c0126147 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.51.0-py39hd1e30aa_0.conda#79f5dd8778873faa54e8f7b2729fe8a6 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_100.conda#d471a5c3abc984b662d9bae3bb7fd8a5 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda#0896606848b2dc5cebdf111b6543aa04 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda#c5d3907ad8bd7bf557521a1833cf7e6d @@ -123,7 +123,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-21_linux64_openbl https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-21_linux64_openblas.conda#1a42f305615c3867684e049e85927531 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 -https://conda.anaconda.org/conda-forge/linux-64/pillow-10.2.0-py39had0adad_0.conda#2972754dc054bb079d1d121918b5126f +https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py39h90c7501_0.conda#1e3b6af9592be71ce19f0a6aae05d97b https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.1-h1d62c97_0.conda#44ec51d0857d9be26158bb85caa74fdb https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c @@ -138,10 +138,10 @@ https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py39h15b0fa6_5.cond https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py39h44dd56e_0.conda#baea2f5dfb3ab7b1c836385d2e1daca7 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py39h7633fee_0.conda#ed71ad3e30eb03da363fb797419cce98 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.3.1-pyhd8ed1ab_0.conda#52dd56ce3afa6a52c2f3d3116875ff32 -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.2-he6dfbbe_0.conda#629e33f68784c1fb678ac7e6f0d9b249 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.4.1-pyhd8ed1ab_0.conda#52387f00fee8dcd5cf75f8886025293f +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.3-he6dfbbe_0.conda#05c1609de571f7a9a40e6d7d4116c21a https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py39hd1e30aa_1.conda#ca63612907462c8e36edcc9bbacc253e -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.12.0-py39h474f0d3_2.conda#6ab241b2023730f6b41712dc1b503afa +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py39h474f0d3_0.conda#46ae0ecba9726ab4fa44c78fefa522cf https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.3-py39h6404dd3_0.conda#1520f039123452cd2de847068449a618 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py39h44dd56e_4.conda#81310d21bf9d91754c1220c585bb72d6 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.34.1-he84ddb8_0.conda#f12ca97c38833a5a179adc172155d15d From 91145ebc318dafdbc8225432f3aaa1c435be412b Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Tue, 9 Apr 2024 17:50:15 +0100 Subject: [PATCH 260/583] pdt6 & gdt140 take *three* (#401) * pdt6 & gdt140 * Fix PEP 8 failures. * Fix flake8 failures. * Updates + fixes. * Review changes. * Release note. --------- Co-authored-by: marqh Co-authored-by: Martin Yeo --- docs/ref/release_notes.rst | 16 +++++ iris_grib/_load_convert.py | 37 ++++++++++- iris_grib/_save_rules.py | 21 ++++++ .../test_product_definition_template_6.py | 65 +++++++++++++++++++ .../test_product_definition_template_6.py | 58 +++++++++++++++++ 5 files changed, 196 insertions(+), 1 deletion(-) create mode 100644 iris_grib/tests/unit/load_convert/test_product_definition_template_6.py create mode 100644 iris_grib/tests/unit/save_rules/test_product_definition_template_6.py diff --git a/docs/ref/release_notes.rst b/docs/ref/release_notes.rst index f6b4dc55..a58d6304 100644 --- a/docs/ref/release_notes.rst +++ b/docs/ref/release_notes.rst @@ -1,6 +1,22 @@ Release Notes ============= + +What's new in iris-grib v0.20.0 +------------------------------- + +:Release: 0.20.0 +:Date: [unreleased] + +Features +^^^^^^^^ +* `@trexfeathers `_, + `@mo-marqh `_ and + `@pp-mo `_ added support for production definition template + 4.6, i.e. percentile forecasts. + `(PR#401) `_ + + What's new in iris-grib v0.19.1 ------------------------------- diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index 940beae7..547dce4a 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -2061,7 +2061,7 @@ def product_definition_template_1(section, metadata, frt_coord): Dictionary of coded key/value pairs from section 4 of the message. * metadata: - :class:`collectins.OrderedDict` of metadata. + :class:`collections.OrderedDict` of metadata. * frt_coord: The scalar forecast reference time :class:`iris.coords.DimCoord`. @@ -2076,6 +2076,37 @@ def product_definition_template_1(section, metadata, frt_coord): metadata['aux_coords_and_dims'].append((realization, None)) +def product_definition_template_6(section, metadata, frt_coord): + """ + Translate template representing percentile forecast, + at a horizontal level or in a horizontal layer at a + point in time. + + Updates the metadata in-place with the translations. + + Args: + + * section: + Dictionary of coded key/value pairs from section 4 of the message. + + * metadata: + :class:`collections.OrderedDict` of metadata. + + * frt_coord: + The scalar forecast reference time :class:`iris.coords.DimCoord`. + + """ + # Perform identical message processing. + product_definition_template_0(section, metadata, frt_coord) + + percentile = DimCoord(section['percentileValue'], + long_name='percentile', + units='%') + + # Add the percentile coordinate to the metadata aux coords. + metadata['aux_coords_and_dims'].append((percentile, None)) + + def product_definition_template_8(section, metadata, frt_coord): """ Translate template representing average, accumulation and/or extreme values @@ -2455,6 +2486,10 @@ def product_definition_section(section, metadata, discipline, tablesVersion, # Process individual ensemble forecast, control and perturbed, at # a horizontal level or in a horizontal layer at a point in time. product_definition_template_1(section, metadata, rt_coord) + elif template == 6: + # Process percentile forecast, at a horizontal level or in a horizontal + # layer at a point in time. + product_definition_template_6(section, metadata, rt_coord) elif template == 8: # Process statistically processed values at a horizontal level or in a # horizontal layer in a continuous or non-continuous time interval. diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index 1a1e6aba..4e657ae0 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -1324,6 +1324,25 @@ def product_definition_template_1(cube, grib, full3d_cube=None): set_ensemble(cube, grib) +def product_definition_template_6(cube, grib, full3d_cube=None): + """ + Set keys within the provided grib message based on Product Definition + Template 4.6. + + Template 4.6 is used to represent a percentile forecast at a point in time + interval. + + """ + eccodes.codes_set(grib, "productDefinitionTemplateNumber", 6) + product_definition_template_common(cube, grib, full3d_cube) + if not (cube.coords('percentile') and + len(cube.coord('percentile').points) == 1): + raise ValueError("A cube 'percentile' coordinate with one " + "point is required, but not present.") + eccodes.codes_set(grib, "percentileValue", + int(cube.coord('percentile').points[0])) + + def product_definition_template_8(cube, grib, full3d_cube=None): """ Set keys within the provided grib message based on Product @@ -1518,6 +1537,8 @@ def product_definition_section(cube, grib, full3d_cube=None): elif 'spatial_processing_type' in cube.attributes: # spatial process (template 4.15) product_definition_template_15(cube, grib, full3d_cube) + elif cube.coords('percentile'): + product_definition_template_6(cube, grib, full3d_cube) else: # forecast (template 4.0) product_definition_template_0(cube, grib, full3d_cube) diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_6.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_6.py new file mode 100644 index 00000000..f8f21c69 --- /dev/null +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_6.py @@ -0,0 +1,65 @@ +# Copyright iris-grib contributors +# +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +""" +Test function +:func:`iris_grib._load_convert.product_definition_template_6`. + +""" + +# import iris_grib.tests first so that some things can be initialised +# before importing anything else. +import iris_grib.tests as tests + +from copy import deepcopy +from unittest import mock + +from iris.coords import DimCoord + +from iris_grib._load_convert import product_definition_template_6 + + +class Test(tests.IrisGribTest): + def setUp(self): + def func(s, m, f): + return m['cell_methods'].append(self.cell_method) + + module = 'iris_grib._load_convert' + self.patch('warnings.warn') + this = '{}.product_definition_template_0'.format(module) + self.cell_method = mock.sentinel.cell_method + self.patch(this, side_effect=func) + self.metadata = {'factories': [], 'references': [], + 'standard_name': None, + 'long_name': None, 'units': None, 'attributes': {}, + 'cell_methods': [], 'dim_coords_and_dims': [], + 'aux_coords_and_dims': []} + + def _check(self, request_warning): + this = 'iris_grib._load_convert.options' + with mock.patch(this, warn_on_unsupported=request_warning): + metadata = deepcopy(self.metadata) + percentile = 50 + section = {'percentileValue': percentile} + forecast_reference_time = mock.sentinel.forecast_reference_time + # The called being tested. + product_definition_template_6(section, metadata, + forecast_reference_time) + expected = deepcopy(self.metadata) + expected['cell_methods'].append(self.cell_method) + percentile = DimCoord(percentile, + long_name='percentile', + units='%') + expected['aux_coords_and_dims'].append((percentile, None)) + self.assertEqual(metadata, expected) + + def test_pdt_no_warn(self): + self._check(False) + + def test_pdt_warn(self): + self._check(True) + + +if __name__ == '__main__': + tests.main() diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_6.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_6.py new file mode 100644 index 00000000..0f39e1e0 --- /dev/null +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_6.py @@ -0,0 +1,58 @@ +# Copyright iris-grib contributors +# +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +""" +Unit tests for :func:`iris_grib._save_rules.product_definition_template_6` + +""" + +# Import iris_grib.tests first so that some things can be initialised before +# importing anything else. +import iris_grib.tests as tests + +from unittest import mock + +from cf_units import Unit +import eccodes + +from iris.coords import DimCoord +import iris.tests.stock as stock + +from iris_grib._save_rules import product_definition_template_6 + + +class TestRealizationIdentifier(tests.IrisGribTest): + def setUp(self): + self.cube = stock.lat_lon_cube() + # Rename cube to avoid warning about unknown discipline/parameter. + self.cube.rename('air_temperature') + coord = DimCoord([45], 'time', + units=Unit('days since epoch', calendar='standard')) + self.cube.add_aux_coord(coord) + + @mock.patch.object(eccodes, 'codes_set') + def test_percentile(self, mock_set): + cube = self.cube + coord = DimCoord(10, long_name='percentile', units='%') + cube.add_aux_coord(coord) + + product_definition_template_6(cube, mock.sentinel.grib) + mock_set.assert_any_call(mock.sentinel.grib, + "productDefinitionTemplateNumber", 6) + mock_set.assert_any_call(mock.sentinel.grib, + "percentileValue", 10) + + @mock.patch.object(eccodes, 'codes_set') + def test_multiple_percentile_values(self, mock_set): + cube = self.cube + coord = DimCoord([8, 9, 10], long_name='percentile', units='%') + cube.add_aux_coord(coord, 0) + + msg = "'percentile' coordinate with one point is required" + with self.assertRaisesRegex(ValueError, msg): + product_definition_template_6(cube, mock.sentinel.grib) + + +if __name__ == "__main__": + tests.main() From 9a15adc50d7c611e8c75a33db10da7af253033ae Mon Sep 17 00:00:00 2001 From: Martin Yeo <40734014+trexfeathers@users.noreply.github.com> Date: Wed, 10 Apr 2024 11:03:57 +0100 Subject: [PATCH 261/583] Add pre-commit config (#400) * Add pre-commit config. * Make ruff and numpydoc pending for now. --- .pre-commit-config.yaml | 71 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 .pre-commit-config.yaml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 00000000..74e411ed --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,71 @@ +# See https://pre-commit.com for more information +# See https://pre-commit.com/hooks.html for more hooks + +files: | + (?x)( + noxfile\.py| + setup\.py| + docs\/.+\.py| + benchmarks\/.+\.py| + iris_grib\/.+\.py + ) +minimum_pre_commit_version: 1.21.0 + +repos: +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.5.0 + hooks: + # Prevent giant files from being committed. + - id: check-added-large-files + # Check whether files parse as valid Python. + - id: check-ast + # Check for file name conflicts on case-insensitive filesytems. + - id: check-case-conflict + # Check for files that contain merge conflict strings. + - id: check-merge-conflict + # Check for debugger imports and py37+ `breakpoint()` calls in Python source. + - id: debug-statements + # Don't commit to main branch. + - id: no-commit-to-branch + +# TODO: pending the addition of ruff, including config file(s) - iris-grib#384 +#- repo: https://github.com/astral-sh/ruff-pre-commit +# rev: "v0.3.4" +# hooks: +# - id: ruff +# types: [file, python] +# args: [--fix, --show-fixes] +# - id: ruff-format +# types: [file, python] + +- repo: https://github.com/codespell-project/codespell + rev: "v2.2.6" + hooks: + - id: codespell + types_or: [asciidoc, python, markdown, rst] + additional_dependencies: [tomli] + +- repo: https://github.com/PyCQA/flake8 + rev: 7.0.0 + hooks: + - id: flake8 + types: [file, python] + +- repo: https://github.com/asottile/blacken-docs + rev: 1.16.0 + hooks: + - id: blacken-docs + types: [file, rst] + +- repo: https://github.com/aio-libs/sort-all + rev: v1.2.0 + hooks: + - id: sort-all + types: [file, python] + +# TODO: pending the addition of numpydoc, including config file(s). +#- repo: https://github.com/numpy/numpydoc +# rev: v1.7.0 +# hooks: +# - id: numpydoc-validation +# types: [file, python] \ No newline at end of file From 70cafb0054b75832984a5ba570bc1a7dee0bcc9f Mon Sep 17 00:00:00 2001 From: Martin Yeo <40734014+trexfeathers@users.noreply.github.com> Date: Wed, 10 Apr 2024 15:32:35 +0100 Subject: [PATCH 262/583] Improve pre-commit compliance (#406) * Improve Flake8 compliance. * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * More Flake8 fixes. * codespell fixes. --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- docs/conf.py | 108 +++++++++--------- iris_grib/__init__.py | 9 +- iris_grib/_load_convert.py | 10 +- iris_grib/_save_rules.py | 4 +- iris_grib/tests/runner/_runner.py | 2 +- .../test_grib1_load_translations.py | 4 +- .../test_product_definition_section.py | 2 +- setup.py | 31 ++--- 8 files changed, 88 insertions(+), 82 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 1bea4638..547a6846 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -12,6 +12,7 @@ # All configuration values have a default; values that are commented out # serve to show the default. +from importlib.metadata import version as get_version import sys import os @@ -23,7 +24,7 @@ # -- General configuration ------------------------------------------------ # If your documentation needs a minimal Sphinx version, state it here. -#needs_sphinx = '1.0' +# needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom @@ -43,7 +44,7 @@ source_suffix = '.rst' # The encoding of source files. -#source_encoding = 'utf-8-sig' +# source_encoding = 'utf-8-sig' # The master toctree document. master_doc = 'index' @@ -57,8 +58,7 @@ # |version| and |release|, also used in various other places throughout the # built documents. # -import iris_grib -release = iris_grib.__version__ +release = get_version("iris-grib") # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. @@ -69,9 +69,9 @@ # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: -#today = '' +# today = '' # Else, today_fmt is used as the format for a strftime call. -#today_fmt = '%B %d, %Y' +# today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. @@ -80,27 +80,27 @@ # The reST default role (used for this markup: `text`) to use for all # documents. -#default_role = None +# default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. -#add_function_parentheses = True +# add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). -#add_module_names = True +# add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. -#show_authors = False +# show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. -#modindex_common_prefix = [] +# modindex_common_prefix = [] # If true, keep warnings as "system message" paragraphs in the built documents. -#keep_warnings = False +# keep_warnings = False # If true, `todo` and `todoList` produce output, else they produce nothing. todo_include_todos = False @@ -121,26 +121,26 @@ # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. -#html_theme_options = {} +# html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. -#html_theme_path = [] +# html_theme_path = [] # The name for this set of Sphinx documents. # " v documentation" by default. -#html_title = u'iris-grib v0.1.0.dev0' +# html_title = u'iris-grib v0.1.0.dev0' # A shorter title for the navigation bar. Default is the same as html_title. -#html_short_title = None +# html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. -#html_logo = None +# html_logo = None # The name of an image file (relative to this directory) to use as a favicon of -# the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. -#html_favicon = None +# html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, @@ -150,64 +150,64 @@ # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied # directly to the root of the documentation. -#html_extra_path = [] +# html_extra_path = [] # If not None, a 'Last updated on:' timestamp is inserted at every page # bottom, using the given strftime format. # The empty string is equivalent to '%b %d, %Y'. -#html_last_updated_fmt = None +# html_last_updated_fmt = None # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. -#html_use_smartypants = True +# html_use_smartypants = True # Custom sidebar templates, maps document names to template names. -#html_sidebars = {} +# html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. -#html_additional_pages = {} +# html_additional_pages = {} # If false, no module index is generated. -#html_domain_indices = True +# html_domain_indices = True # If false, no index is generated. -#html_use_index = True +# html_use_index = True # If true, the index is split into individual pages for each letter. -#html_split_index = False +# html_split_index = False # If true, links to the reST sources are added to the pages. -#html_show_sourcelink = True +# html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. -#html_show_sphinx = True +# html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. -#html_show_copyright = True +# html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. -#html_use_opensearch = '' +# html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). -#html_file_suffix = None +# html_file_suffix = None # Language to be used for generating the HTML full-text search index. # Sphinx supports the following languages: # 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja' # 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr', 'zh' -#html_search_language = 'en' +# html_search_language = 'en' # A dictionary with options for the search language support, empty by default. # 'ja' uses this config value. # 'zh' user can custom change `jieba` dictionary path. -#html_search_options = {'type': 'default'} +# html_search_options = {'type': 'default'} # The name of a javascript file (relative to the configuration directory) that # implements a search results scorer. If empty, the default will be used. -#html_search_scorer = 'scorer.js' +# html_search_scorer = 'scorer.js' # Output file base name for HTML help builder. htmlhelp_basename = 'iris-gribdoc' @@ -215,17 +215,17 @@ # -- Options for LaTeX output --------------------------------------------- latex_elements = { -# The paper size ('letterpaper' or 'a4paper'). -#'papersize': 'letterpaper', + # The paper size ('letterpaper' or 'a4paper'). + # 'papersize': 'letterpaper', -# The font size ('10pt', '11pt' or '12pt'). -#'pointsize': '10pt', + # The font size ('10pt', '11pt' or '12pt'). + # 'pointsize': '10pt', -# Additional stuff for the LaTeX preamble. -#'preamble': '', + # Additional stuff for the LaTeX preamble. + # 'preamble': '', -# Latex figure (float) alignment -#'figure_align': 'htbp', + # Latex figure (float) alignment + # 'figure_align': 'htbp', } # Grouping the document tree into LaTeX files. List of tuples @@ -238,23 +238,23 @@ # The name of an image file (relative to this directory) to place at the top of # the title page. -#latex_logo = None +# latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. -#latex_use_parts = False +# latex_use_parts = False # If true, show page references after internal links. -#latex_show_pagerefs = False +# latex_show_pagerefs = False # If true, show URL addresses after external links. -#latex_show_urls = False +# latex_show_urls = False # Documents to append as an appendix to all manuals. -#latex_appendices = [] +# latex_appendices = [] # If false, no module index is generated. -#latex_domain_indices = True +# latex_domain_indices = True # -- Options for manual page output --------------------------------------- @@ -267,7 +267,7 @@ ] # If true, show URL addresses after external links. -#man_show_urls = False +# man_show_urls = False # -- Options for Texinfo output ------------------------------------------- @@ -282,16 +282,16 @@ ] # Documents to append as an appendix to all manuals. -#texinfo_appendices = [] +# texinfo_appendices = [] # If false, no module index is generated. -#texinfo_domain_indices = True +# texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. -#texinfo_show_urls = 'footnote' +# texinfo_show_urls = 'footnote' # If true, do not generate a @detailmenu in the "Top" node's menu. -#texinfo_no_detailmenu = False +# texinfo_no_detailmenu = False # Example configuration for intersphinx: refer to the Python standard library. diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index 40369b9b..17778c3e 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -32,8 +32,13 @@ __version__ = '0.20.dev0' -__all__ = ['load_cubes', 'save_grib2', 'load_pairs_from_fields', - 'save_pairs_from_cube', 'save_messages'] +__all__ = [ + "load_cubes", + "load_pairs_from_fields", + "save_grib2", + "save_messages", + "save_pairs_from_cube", +] CENTRE_TITLES = {'egrr': 'U.K. Met Office - Exeter', diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index 547dce4a..df4ba7e4 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -3,7 +3,7 @@ # This file is part of iris-grib and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """ -Module to support the loading and convertion of a GRIB2 message into +Module to support the loading and conversion of a GRIB2 message into cube metadata. """ @@ -35,7 +35,7 @@ # Restrict the names imported from this namespace. -__all__ = ['convert'] +__all__ = ["convert"] options = Namespace(warn_on_unsupported=False, @@ -652,7 +652,7 @@ def grid_definition_template_4_and_5(section, metadata, y_name, x_name, cs): Name of the X coordinate, e.g. 'longitude' or 'grid_longitude'. * cs: - The :class:`iris.coord_systems.CoordSystem` to use when createing + The :class:`iris.coord_systems.CoordSystem` to use when creating the X and Y coordinates. """ @@ -1217,7 +1217,7 @@ def grid_definition_template_90(section, metadata): height_above_centre = geog_cs.semi_major_axis * section['Nr'] / 1e6 height_above_ellipsoid = height_above_centre - geog_cs.semi_major_axis - # Figure out how large the Earth would appear in projection coodinates. + # Figure out how large the Earth would appear in projection coordinates. # For both the apparent equatorial and polar diameters this is a # two-step process: # 1) Determine the angle subtended by the visible surface. @@ -2432,7 +2432,7 @@ def product_definition_template_40(section, metadata, frt_coord): Dictionary of coded key/value pairs from section 4 of the message. * metadata: - :class:`collectins.OrderedDict` of metadata. + :class:`collections.OrderedDict` of metadata. * frt_coord: The scalar forecast reference time :class:`iris.coords.DimCoord`. diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index 4e657ae0..94af33dc 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -1053,7 +1053,7 @@ def set_fixed_surfaces(cube, grib, full3d_cube=None): int(round(output_v[1]))) if hybrid_factory is not None: - # Need to record ALL the level coefficents in a 'PV' vector. + # Need to record ALL the level coefficients in a 'PV' vector. level_delta_coord = hybrid_factory.delta sigma_coord = hybrid_factory.sigma model_levels = full3d_cube.coord('model_level_number').points @@ -1062,7 +1062,7 @@ def set_fixed_surfaces(cube, grib, full3d_cube=None): msg = 'model_level_number is not an integer: dtype={}.' raise ValueError(msg.format(model_levels.dtype)) if np.min(model_levels) < 1: - msg = 'model_level_number must be > 0: mininum value = {}.' + msg = 'model_level_number must be > 0: minimum value = {}.' raise ValueError(msg.format(np.min(model_levels))) # Need to save enough levels for indexes up to [max(model_levels)] n_levels = np.max(model_levels) diff --git a/iris_grib/tests/runner/_runner.py b/iris_grib/tests/runner/_runner.py index 7c13c8e8..ea797b7a 100644 --- a/iris_grib/tests/runner/_runner.py +++ b/iris_grib/tests/runner/_runner.py @@ -65,7 +65,7 @@ def initialize_options(self): self.create_missing = False def finalize_options(self): - # These enviroment variables will be propagated to all the + # These environment variables will be propagated to all the # processes that nose.run creates. if self.no_data: print("Running tests in no-data mode...") diff --git a/iris_grib/tests/unit/grib1_load_rules/test_grib1_load_translations.py b/iris_grib/tests/unit/grib1_load_rules/test_grib1_load_translations.py index 6f63a1cd..a430943d 100644 --- a/iris_grib/tests/unit/grib1_load_rules/test_grib1_load_translations.py +++ b/iris_grib/tests/unit/grib1_load_rules/test_grib1_load_translations.py @@ -302,11 +302,11 @@ def test_warn_unknown_pdts(self): # Load the message from the file as a cube. cube_generator = iris_grib.load_cubes(temp_gribfile_path) - with self.assertRaises(iris.exceptions.TranslationError) as te: + with self.assertRaises(iris.exceptions.TranslationError) as t_err: _ = next(cube_generator) self.assertEqual( "Product definition template [5]" " is not supported", - str(te.exception), + str(t_err.exception), ) diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_section.py b/iris_grib/tests/unit/load_convert/test_product_definition_section.py index b3164cff..409346f9 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_section.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_section.py @@ -75,7 +75,7 @@ def _check_fixed_surface(self, fs_is_expected, fs_is_present): del section_4[key] def run_function(): - # For re-use in every type of test below. + # For reuse in every type of test below. product_definition_section( section_4, self.metadata, self.discipline, self.tablesVersion, self.rt_coord) diff --git a/setup.py b/setup.py index 6b2d02b1..a9b007e3 100644 --- a/setup.py +++ b/setup.py @@ -68,21 +68,22 @@ def file_walk_relative(top, remove=''): setup_args = dict( - name = PYPI_NAME, - version = extract_version(), - packages = packages, - package_data = {'iris_grib': list(file_walk_relative('iris_grib/tests/results', - remove='iris_grib/'))}, - description = "GRIB loading for Iris", - long_description = long_description(), - long_description_content_type = "text/x-rst", - url = 'https://github.com/SciTools/iris-grib', - author = 'UK Met Office', - author_email = 'scitools-iris@googlegroups.com', - license = 'BSD', - platforms = "Linux, Mac OS X, Windows", - keywords = ['iris', 'GRIB'], - classifiers=[ + name = PYPI_NAME, # noqa: E221,E251,E501 + version = extract_version(), # noqa: E221,E251,E501 + packages = packages, # noqa: E221,E251,E501 + package_data = {'iris_grib': list( # noqa: E221,E251,E501 + file_walk_relative('iris_grib/tests/results', remove='iris_grib/')) + }, + description = "GRIB loading for Iris", # noqa: E221,E251,E501 + long_description = long_description(), # noqa: E221,E251,E501 + long_description_content_type = "text/x-rst", # noqa: E221,E251,E501 + url = 'https://github.com/SciTools/iris-grib', # noqa: E221,E251,E501 + author = 'UK Met Office', # noqa: E221,E251,E501 + author_email = 'scitools-iris@googlegroups.com', # noqa: E221,E251,E501 + license = 'BSD', # noqa: E221,E251,E501 + platforms = "Linux, Mac OS X, Windows", # noqa: E221,E251,E501 + keywords = ['iris', 'GRIB'], # noqa: E221,E251,E501 + classifiers=[ # noqa: E221,E251,E501 'Programming Language :: Python', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', From afd352695e002afa1c9e3051eb374e30b2b85ad2 Mon Sep 17 00:00:00 2001 From: Henry Wright <84939917+HGWright@users.noreply.github.com> Date: Thu, 11 Apr 2024 16:14:06 +0100 Subject: [PATCH 263/583] add pyproject.toml and remove setup.py (#408) * add pyproject.toml and remove setup.py * adding zip-safe * fix typo * fix version * add validation precommit hook * making suggested changes * fix precommit indents * change test to file * add pyproj to precommit files * Description based on SciTools/iris-grib#402. * Selection of keywords from SciTools/iris pyproject.toml. * Changed dev status classifier to reflect pre-v1 version. * Revert "Changed dev status classifier to reflect pre-v1 version." This reverts commit 6f99210b275050c96d62525055a631b1eaf34e37. --------- Co-authored-by: Martin Yeo --- .pre-commit-config.yaml | 6 +++ pyproject.toml | 86 ++++++++++++++++++++++++++++++++ setup.py | 106 ---------------------------------------- 3 files changed, 92 insertions(+), 106 deletions(-) create mode 100644 pyproject.toml delete mode 100644 setup.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 74e411ed..0892509b 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -5,6 +5,7 @@ files: | (?x)( noxfile\.py| setup\.py| + pyproject\.toml| docs\/.+\.py| benchmarks\/.+\.py| iris_grib\/.+\.py @@ -63,6 +64,11 @@ repos: - id: sort-all types: [file, python] +- repo: https://github.com/abravalheri/validate-pyproject + rev: "v0.16" + hooks: + - id: validate-pyproject + # TODO: pending the addition of numpydoc, including config file(s). #- repo: https://github.com/numpy/numpydoc # rev: v1.7.0 diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 00000000..6e8a4ac0 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,86 @@ +[build-system] +# Defined by PEP 518 +requires = [ + "setuptools>=64", + "wheel", +] +# Defined by PEP 517 +build-backend = "setuptools.build_meta" + +[project] +authors = [ + {name = "Iris-grib Contributors", email = "scitools.pub@gmail.com"} +] +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Science/Research", + "License :: OSI Approved :: BSD License", + "Operating System :: MacOS", + "Operating System :: POSIX", + "Operating System :: POSIX :: Linux", + "Operating System :: Unix", + "Programming Language :: Python", + "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: Implementation :: CPython", + "Topic :: Scientific/Engineering", + "Topic :: Scientific/Engineering :: Atmospheric Science", + "Topic :: Scientific/Engineering :: Visualization", +] +dynamic = [ + "dependencies", + "readme", + "version", +] +description = "Functionality for converting between weather/climate datasets stored as GRIB files and SciTools-Iris Cubes" +keywords = [ + "iris", + "GRIB", + "data-analysis", + "earth-science", + "meteorology", +] +license = {text = "BSD-3-Clause"} +name = "iris-grib" +requires-python = ">=3.9" + +[project.urls] +Code = "https://github.com/SciTools/iris-grib" +Discussions = "https://github.com/SciTools/iris-grib/discussions" +Documentation = "https://iris-grib.readthedocs.io/en/stable/" +Issues = "https://github.com/SciTools/iris-grib/issues" + +[tool.setuptools] +license-files = ["LICENSE"] + +[tool.setuptools.dynamic] +dependencies = {file = "requirements/core.txt"} +readme = {file = "README.rst", content-type = "text/x-rst"} +version = {attr = "iris_grib.__version__"} +optional-dependencies.all = {file = "requirements/all.txt"} +optional-dependencies.test = {file = "requirements/test.txt"} + +[tool.setuptools.packages.find] +include = ["iris_grib*"] + +[tool.coverage.run] +branch = true +source = [ + "iris_grib", +] +omit = [ + "iris_grib/tests/*", +] + +[tool.coverage.report] +exclude_lines = [ + "pragma: no cover", + "if __name__ == .__main__.:" +] + +[tool.codespell] +ignore-words-list = "alpha-numeric,degreee,discontiguities,lazyness,meaned,nin" +skip = "_build,*.css,*.ipynb,*.js,*.html,*.svg,*.xml,.git,generated" + diff --git a/setup.py b/setup.py deleted file mode 100644 index a9b007e3..00000000 --- a/setup.py +++ /dev/null @@ -1,106 +0,0 @@ -#!/usr/bin/env python - -import os -import os.path -from setuptools import setup - -NAME = 'iris_grib' -PYPI_NAME = 'iris-grib' -PACKAGE_DIR = os.path.abspath(os.path.dirname(__file__)) -PACKAGE_ROOT = os.path.join(PACKAGE_DIR, NAME) - -packages = [] -for d, _, _ in os.walk(os.path.join(PACKAGE_DIR, NAME)): - if os.path.exists(os.path.join(d, '__init__.py')): - packages.append(d[len(PACKAGE_DIR) + 1:].replace(os.path.sep, '.')) - - -def pip_requirements(*args): - requirements = [] - for name in args: - fname = os.path.join( - PACKAGE_DIR, "requirements", "{}.txt".format(name) - ) - if not os.path.exists(fname): - emsg = ( - f"Unable to find the {name!r} requirements file at {fname!r}" - ) - raise RuntimeError(emsg) - with open(fname, "r") as fh: - for line in fh: - line = line.strip() - if not line or line.startswith("#"): - continue - requirements.append(line) - return requirements - - -def extract_version(): - version = None - fname = os.path.join(PACKAGE_DIR, 'iris_grib', '__init__.py') - with open(fname) as fi: - for line in fi: - if (line.startswith('__version__')): - _, version = line.split('=') - version = version.strip()[1:-1] # Remove quotations - break - return version - - -def long_description(): - fname = os.path.join(PACKAGE_DIR, "README.rst") - with open(fname, "rb") as fi: - result = fi.read().decode("utf-8") - return result - - -def file_walk_relative(top, remove=''): - """ - Returns a generator of files from the top of the tree, removing - the given prefix from the root/file result. - - """ - top = top.replace('/', os.path.sep) - remove = remove.replace('/', os.path.sep) - for root, dirs, files in os.walk(top): - for file in files: - yield os.path.join(root, file).replace(remove, '') - - -setup_args = dict( - name = PYPI_NAME, # noqa: E221,E251,E501 - version = extract_version(), # noqa: E221,E251,E501 - packages = packages, # noqa: E221,E251,E501 - package_data = {'iris_grib': list( # noqa: E221,E251,E501 - file_walk_relative('iris_grib/tests/results', remove='iris_grib/')) - }, - description = "GRIB loading for Iris", # noqa: E221,E251,E501 - long_description = long_description(), # noqa: E221,E251,E501 - long_description_content_type = "text/x-rst", # noqa: E221,E251,E501 - url = 'https://github.com/SciTools/iris-grib', # noqa: E221,E251,E501 - author = 'UK Met Office', # noqa: E221,E251,E501 - author_email = 'scitools-iris@googlegroups.com', # noqa: E221,E251,E501 - license = 'BSD', # noqa: E221,E251,E501 - platforms = "Linux, Mac OS X, Windows", # noqa: E221,E251,E501 - keywords = ['iris', 'GRIB'], # noqa: E221,E251,E501 - classifiers=[ # noqa: E221,E251,E501 - 'Programming Language :: Python', - 'Programming Language :: Python :: 3.9', - 'Programming Language :: Python :: 3.10', - 'Programming Language :: Python :: 3.11', - 'Programming Language :: Python :: 3 :: Only', - ], - # NOTE: The Python 3 bindings to eccodes (eccodes-python) is available on - # PyPI, but the user is required to install eccodes itself manually. See - # ECMWF ecCodes installation documentation for more information. - install_requires=pip_requirements("setup", "core"), - test_loader="unittest:TestLoader", - extras_require={ - "all": pip_requirements("all"), - "test": pip_requirements("test"), - }, -) - - -if __name__ == '__main__': - setup(**setup_args) From 73fa56867034a87f3ff54800e7352b2dbbbd2c42 Mon Sep 17 00:00:00 2001 From: stephenworsley <49274989+stephenworsley@users.noreply.github.com> Date: Fri, 12 Apr 2024 16:25:54 +0100 Subject: [PATCH 264/583] Configure for mypy (#407) * configure for mypy * shorten lines * add pre-commit hook * fix pre-commit hook * fix pre-commit hook * fix pre-commit hook * fix pre-commit hook * fix pre-commit hook * fix pre-commit hook * repo review suggestions * review suggestions --- .pre-commit-config.yaml | 6 ++ iris_grib/_save_rules.py | 18 +++--- iris_grib/grib_phenom_translation.py | 60 +++++++++---------- .../load_convert/test_translate_phenomenon.py | 4 +- pyproject.toml | 8 +++ 5 files changed, 57 insertions(+), 39 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0892509b..921d5cb0 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -64,6 +64,12 @@ repos: - id: sort-all types: [file, python] +- repo: https://github.com/pre-commit/mirrors-mypy + rev: 'v1.9.0' + hooks: + - id: mypy + exclude: 'noxfile\.py|docs/conf\.py' + - repo: https://github.com/abravalheri/validate-pyproject rev: "v0.16" hooks: diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index 94af33dc..df1be8d2 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -35,9 +35,11 @@ # Invert code tables from :mod:`iris_grib._load_convert`. -_STATISTIC_TYPE_NAMES = {val: key for key, val in - _STATISTIC_TYPE_NAMES.items()} -_TIME_RANGE_UNITS = {val: key for key, val in _TIME_RANGE_UNITS.items()} +_STATISTIC_TYPE_NAMES_INVERTED = {val: key for key, val in + _STATISTIC_TYPE_NAMES.items()} +_TIME_RANGE_UNITS_INVERTED = { + val: key for key, val in _TIME_RANGE_UNITS.items() +} def fixup_float32_as_int32(value): @@ -1110,7 +1112,7 @@ def set_time_range(time_coord, grib): # Set type to hours and convert period to this unit. eccodes.codes_set(grib, "indicatorOfUnitForTimeRange", - _TIME_RANGE_UNITS['hours']) + _TIME_RANGE_UNITS_INVERTED['hours']) hours_since_units = cf_units.Unit('hours since epoch', calendar=time_coord.units.calendar) start_hours, end_hours = time_coord.units.convert(time_coord.bounds[0], @@ -1150,7 +1152,7 @@ def set_time_increment(cell_method, grib): inc, units = interval.split() inc = float(inc) if units in ('hr', 'hour', 'hours'): - units_type = _TIME_RANGE_UNITS['hours'] + units_type = _TIME_RANGE_UNITS_INVERTED['hours'] else: raise ValueError('Unable to parse units of interval') except ValueError: @@ -1231,7 +1233,7 @@ def statistical_method_code(cell_method_name): """ Decode cell_method string as statistic code integer. """ - statistic_code = _STATISTIC_TYPE_NAMES.get(cell_method_name, None) + statistic_code = _STATISTIC_TYPE_NAMES_INVERTED.get(cell_method_name, None) if statistic_code is None: msg = ('Product definition section 4 contains an unsupported ' 'statistical process type [{}] ') @@ -1453,7 +1455,9 @@ def _product_definition_template_8_10_and_11(cube, grib, full3d_cube=None): cell_method.coord_names)) # Type of statistical process (see code table 4.10) - statistic_type = _STATISTIC_TYPE_NAMES.get(cell_method.method, 255) + statistic_type = _STATISTIC_TYPE_NAMES_INVERTED.get( + cell_method.method, 255 + ) eccodes.codes_set(grib, "typeOfStatisticalProcessing", statistic_type) # Time increment i.e. interval of cell method (if any) diff --git a/iris_grib/grib_phenom_translation.py b/iris_grib/grib_phenom_translation.py index 56f98017..a1680cbd 100644 --- a/iris_grib/grib_phenom_translation.py +++ b/iris_grib/grib_phenom_translation.py @@ -53,12 +53,12 @@ def __setitem__(self, key, value): # Define namedtuples for keys+values of the Grib1 lookup table. -_Grib1ToCfKeyClass = namedtuple( +Grib1CfKey = namedtuple( 'Grib1CfKey', ('table2_version', 'centre_number', 'param_number')) # NOTE: this form is currently used for both Grib1 *and* Grib2 -_GribToCfDataClass = namedtuple( +Grib1CfData = namedtuple( 'Grib1CfData', ('standard_name', 'long_name', 'units', 'set_height')) @@ -79,9 +79,9 @@ def _make_grib1_cf_entry(table2_version, centre_number, param_number, e.g. "2-metre tempererature". """ - grib1_key = _Grib1ToCfKeyClass(table2_version=int(table2_version), - centre_number=int(centre_number), - param_number=int(param_number)) + grib1_key = Grib1CfKey(table2_version=int(table2_version), + centre_number=int(centre_number), + param_number=int(param_number)) if standard_name is not None: if standard_name not in iris.std_names.STD_NAMES: warnings.warn('{} is not a recognised CF standard name ' @@ -89,10 +89,10 @@ def _make_grib1_cf_entry(table2_version, centre_number, param_number, return None # convert units string to iris Unit (i.e. mainly, check it is good) a_cf_unit = cf_units.Unit(units) - cf_data = _GribToCfDataClass(standard_name=standard_name, - long_name=long_name, - units=a_cf_unit, - set_height=set_height) + cf_data = Grib1CfData(standard_name=standard_name, + long_name=long_name, + units=a_cf_unit, + set_height=set_height) return (grib1_key, cf_data) # Interpret the imported Grib1-to-CF table. @@ -145,7 +145,7 @@ def _make_grib1_cf_entry(table2_version, centre_number, param_number, # Define a namedtuple for the keys of the Grib2 lookup table. -_Grib2ToCfKeyClass = namedtuple( +Grib2CfKey = namedtuple( 'Grib2CfKey', ('param_discipline', 'param_category', 'param_number')) @@ -166,9 +166,9 @@ def _make_grib2_cf_entry(param_discipline, param_category, param_number, e.g. "2-metre tempererature". """ - grib2_key = _Grib2ToCfKeyClass(param_discipline=int(param_discipline), - param_category=int(param_category), - param_number=int(param_number)) + grib2_key = Grib2CfKey(param_discipline=int(param_discipline), + param_category=int(param_category), + param_number=int(param_number)) if standard_name is not None: if standard_name not in iris.std_names.STD_NAMES: warnings.warn('{} is not a recognised CF standard name ' @@ -176,10 +176,10 @@ def _make_grib2_cf_entry(param_discipline, param_category, param_number, return None # convert units string to iris Unit (i.e. mainly, check it is good) a_cf_unit = cf_units.Unit(units) - cf_data = _GribToCfDataClass(standard_name=standard_name, - long_name=long_name, - units=a_cf_unit, - set_height=None) + cf_data = Grib1CfData(standard_name=standard_name, + long_name=long_name, + units=a_cf_unit, + set_height=None) return (grib2_key, cf_data) # Interpret the grib2 info from grib_cf_map @@ -204,11 +204,11 @@ def _make_grib2_cf_entry(param_discipline, param_category, param_number, # Define namedtuples for key+values of the cf-to-grib2 lookup table. -_CfToGrib2KeyClass = namedtuple( +CfGrib2Key = namedtuple( 'CfGrib2Key', ('standard_name', 'long_name')) -_CfToGrib2DataClass = namedtuple( +CfGrib2Data = namedtuple( 'CfGrib2Data', ('discipline', 'category', 'number', 'units')) @@ -233,13 +233,13 @@ def _make_cf_grib2_entry(standard_name, long_name, warnings.warn('{} is not a recognised CF standard name ' '(skipping).'.format(standard_name)) return None - cf_key = _CfToGrib2KeyClass(standard_name, long_name) + cf_key = CfGrib2Key(standard_name, long_name) # convert units string to iris Unit (i.e. mainly, check it is good) a_cf_unit = cf_units.Unit(units) - grib2_data = _CfToGrib2DataClass(discipline=int(param_discipline), - category=int(param_category), - number=int(param_number), - units=a_cf_unit) + grib2_data = CfGrib2Data(discipline=int(param_discipline), + category=int(param_category), + number=int(param_number), + units=a_cf_unit) return (cf_key, grib2_data) # Interpret the imported CF-to-Grib2 table into a lookup table @@ -277,9 +277,9 @@ def grib1_phenom_to_cf_info(table2_version, centre_number, param_number): * set_height : a scalar 'height' value , or None """ - grib1_key = _Grib1ToCfKeyClass(table2_version=table2_version, - centre_number=centre_number, - param_number=param_number) + grib1_key = Grib1CfKey(table2_version=table2_version, + centre_number=centre_number, + param_number=param_number) return _GRIB1_CF_TABLE[grib1_key] @@ -294,9 +294,9 @@ def grib2_phenom_to_cf_info(param_discipline, param_category, param_number): * units : a :class:`cf_units.Unit` """ - grib2_key = _Grib2ToCfKeyClass(param_discipline=int(param_discipline), - param_category=int(param_category), - param_number=int(param_number)) + grib2_key = Grib2CfKey(param_discipline=int(param_discipline), + param_category=int(param_category), + param_number=int(param_number)) return _GRIB2_CF_TABLE[grib2_key] diff --git a/iris_grib/tests/unit/load_convert/test_translate_phenomenon.py b/iris_grib/tests/unit/load_convert/test_translate_phenomenon.py index 5c3ea934..fed63e4d 100644 --- a/iris_grib/tests/unit/load_convert/test_translate_phenomenon.py +++ b/iris_grib/tests/unit/load_convert/test_translate_phenomenon.py @@ -15,7 +15,7 @@ from iris.coords import DimCoord from iris_grib._load_convert import Probability, translate_phenomenon -from iris_grib.grib_phenom_translation import _GribToCfDataClass, GRIBCode +from iris_grib.grib_phenom_translation import Grib1CfData, GRIBCode class Test_probability(tests.IrisGribTest): @@ -24,7 +24,7 @@ def setUp(self): target_module = 'iris_grib._load_convert' self.phenom_lookup_patch = self.patch( target_module + '.itranslation.grib2_phenom_to_cf_info', - return_value=_GribToCfDataClass('air_temperature', '', 'K', None)) + return_value=Grib1CfData('air_temperature', '', 'K', None)) # Construct dummy call arguments self.probability = Probability('', 22.0) self.metadata = {'aux_coords_and_dims': [], 'attributes': {}} diff --git a/pyproject.toml b/pyproject.toml index 6e8a4ac0..01beb97c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -84,3 +84,11 @@ exclude_lines = [ ignore-words-list = "alpha-numeric,degreee,discontiguities,lazyness,meaned,nin" skip = "_build,*.css,*.ipynb,*.js,*.html,*.svg,*.xml,.git,generated" +[tool.mypy] +ignore_missing_imports = true +warn_unused_configs = true +enable_error_code = ["ignore-without-code", "redundant-expr", "truthy-bool"] +exclude = [ + 'noxfile\.py', + 'docs/conf\.py' +] \ No newline at end of file From da2f1ad4d256594c21f0629f21cca8b02e37487d Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 15 Apr 2024 09:13:48 +0100 Subject: [PATCH 265/583] Updated environment lockfiles (#411) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 26 +++++++++++++------------- requirements/locks/py311-linux-64.lock | 26 +++++++++++++------------- requirements/locks/py39-linux-64.lock | 26 +++++++++++++------------- 3 files changed, 39 insertions(+), 39 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 290ce231..4aab7902 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -29,14 +29,14 @@ https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.c https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b -https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_0.conda#30de3fd9b3b602f7473f30e684eeea8c +https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_1.conda#049b7df8bae5e184d1de42cdf64855f8 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4.20240210-h59595ed_0.conda#97da8860a0da5413c7c98a3b3838a645 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.1-hd590300_1.conda#9d731343cff6ee2e5a25c4a091bf8e2a https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 -https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-h9fff704_0.conda#e6d228cd0bb74a51dd18f5bfce0b4115 +https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.0-hdb0a2a9_1.conda#843bbb8ace1d64ac50d64639ff38b014 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda#2c80dc38fface310c9bd81b17037fee5 @@ -64,16 +64,16 @@ https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.con https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda#68c34ec6149623be41a1933ab996a209 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.5-hfc55251_0.conda#04b88013080254850d6c01ed54810589 -https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-h0f2a231_0.conda#009521b7ed97cca25f8f997f9e745976 +https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-hc2324a3_1.conda#11d76bee958b1989bd1ac6ee7372ea6d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda#39f910d205726805a958da408ca194ba https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.26-pthreads_h413a1c8_0.conda#760ae35415f5ba8b15d09df5afe8b23a +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_h413a1c8_0.conda#a356024784da6dfd4683dc5ecf45b155 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda#66f03896ffbe1a110ffda05c7a856504 https://conda.anaconda.org/conda-forge/linux-64/python-3.10.14-hd12c33a_0_cpython.conda#2b4ba962994e8bd4be9ff5b64b75aff2 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.2-h2c6b66d_0.conda#1423efca06ed343c1da0fc429bae0779 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.7-h8ee46fc_0.conda#49e482d882669206653b095f5206c05b +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-h8ee46fc_0.conda#077b6e8ad6a3ddb741fce2496dd01bec https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda#5e4c0743c70186509d1412e03c2d8dfa https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f @@ -83,13 +83,13 @@ https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1a https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.conda#753d29fe41bb881e4b9c004f0abf973f https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 -https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.3-pyhd8ed1ab_0.conda#ff15f46b0d34308f4d40c1c51df07592 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.4-pyhd8ed1ab_0.conda#6baa2e7fc09bd2c7c82cb6662d5f1d36 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.3.1-pyhca7485f_0.conda#b7f0662ef2c9d4404f0af9eef5ed2fde https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda#1a76f09108576397c41c0b0c5bd84134 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py310hd41b1e2_1.conda#b8d67603d43b23ce7e988a5d81a7ab79 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-21_linux64_openblas.conda#0ac9f44fc096772b0aa092119b00c3ca +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-22_linux64_openblas.conda#1a2a0cd3153464fee6646f3dd6dad9b8 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.7.1-hca28451_0.conda#755c7f876815003337d2c61ff5d047e5 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py310h2372a71_0.conda#f6703fa0214a00bf49d1bef6dc7672d0 @@ -118,9 +118,9 @@ https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.51.0-py310h2372a71_0 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_100.conda#d471a5c3abc984b662d9bae3bb7fd8a5 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda#0896606848b2dc5cebdf111b6543aa04 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda#e7d8df6509ba635247ff9aea31134262 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-21_linux64_openblas.conda#4a3816d06451c4946e2db26b86472cb6 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda#4b31699e0ec5de64d5896e580389c9a1 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-21_linux64_openblas.conda#1a42f305615c3867684e049e85927531 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_openblas.conda#b083767b6c877e24ee597d93b87ab838 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py310hf73ecf8_0.conda#1de56cf017dfd02aa84093206a0141a8 https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 @@ -135,16 +135,16 @@ https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py310hb13e2d6_0.con https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py310hd5c30f3_5.conda#dc2ee770a2299307f3c127af79160d25 https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py310h1f7b6fc_0.conda#31beda75384647959d5792a1a7dc571a -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py310hd41b1e2_0.conda#85d2aaa7af046528d339da1e813c3a9f +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py310hd41b1e2_0.conda#60ee50b1968f802f2a487ba36d4cce0d https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.4.1-pyhd8ed1ab_0.conda#52387f00fee8dcd5cf75f8886025293f https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.3-he6dfbbe_0.conda#05c1609de571f7a9a40e6d7d4116c21a https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py310h2372a71_1.conda#dfcf64f67961eb9686676f96fdb4b4d1 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py310hb13e2d6_0.conda#512cfc0369e247e3993a76030671cce0 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.3-py310hc3e127f_0.conda#fbc825d13cbcb2d5d3fbba22c83fd203 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py310h1f7b6fc_4.conda#0ca55ca20891d393846695354b32ebc5 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.34.1-he84ddb8_0.conda#f12ca97c38833a5a179adc172155d15d -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.3-py310h62c0568_0.conda#4a7296c0273eb01dfbed728dd6a6725a +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.35.0-he84ddb8_0.conda#2d01dfbe537478e7a1a495b9639edd45 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py310h62c0568_0.conda#bdfa3aee52579c6b3dde12f52e266ef2 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py310hba70d50_100.conda#e19392760c7e4da3b9cb0ee5bf61bc4b -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py310hcc13569_1.conda#31ef447724fb19066a9d00a660dab1bd +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py310hcc13569_0.conda#89a13de526ea3008341e3a2aeab4da7e https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.0-py310h1f7b6fc_1.conda#f020ac07b7df9c4b0bd0ece3055b5bd2 https://conda.anaconda.org/conda-forge/noarch/iris-3.8.1-pyha770c72_0.conda#b08a116ef1607e7e960a4caa902e3a90 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 39b9f3fb..b7b7670a 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -29,14 +29,14 @@ https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.c https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b -https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_0.conda#30de3fd9b3b602f7473f30e684eeea8c +https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_1.conda#049b7df8bae5e184d1de42cdf64855f8 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4.20240210-h59595ed_0.conda#97da8860a0da5413c7c98a3b3838a645 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.1-hd590300_1.conda#9d731343cff6ee2e5a25c4a091bf8e2a https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 -https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-h9fff704_0.conda#e6d228cd0bb74a51dd18f5bfce0b4115 +https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.0-hdb0a2a9_1.conda#843bbb8ace1d64ac50d64639ff38b014 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda#2c80dc38fface310c9bd81b17037fee5 @@ -64,16 +64,16 @@ https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.con https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda#68c34ec6149623be41a1933ab996a209 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.5-hfc55251_0.conda#04b88013080254850d6c01ed54810589 -https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-h0f2a231_0.conda#009521b7ed97cca25f8f997f9e745976 +https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-hc2324a3_1.conda#11d76bee958b1989bd1ac6ee7372ea6d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda#39f910d205726805a958da408ca194ba https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.26-pthreads_h413a1c8_0.conda#760ae35415f5ba8b15d09df5afe8b23a +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_h413a1c8_0.conda#a356024784da6dfd4683dc5ecf45b155 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda#66f03896ffbe1a110ffda05c7a856504 https://conda.anaconda.org/conda-forge/linux-64/python-3.11.8-hab00c5b_0_cpython.conda#2fdc314ee058eda0114738a9309d3683 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.2-h2c6b66d_0.conda#1423efca06ed343c1da0fc429bae0779 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.7-h8ee46fc_0.conda#49e482d882669206653b095f5206c05b +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-h8ee46fc_0.conda#077b6e8ad6a3ddb741fce2496dd01bec https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda#5e4c0743c70186509d1412e03c2d8dfa @@ -86,14 +86,14 @@ https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py311h38be061_3.conda#1c33f55e5cdcc2a2b973c432b5225bfe -https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.3-pyhd8ed1ab_0.conda#ff15f46b0d34308f4d40c1c51df07592 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.4-pyhd8ed1ab_0.conda#6baa2e7fc09bd2c7c82cb6662d5f1d36 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.3.1-pyhca7485f_0.conda#b7f0662ef2c9d4404f0af9eef5ed2fde https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda#1a76f09108576397c41c0b0c5bd84134 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py311h9547e67_1.conda#2c65bdf442b0d37aad080c8a4e0d452f https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-21_linux64_openblas.conda#0ac9f44fc096772b0aa092119b00c3ca +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-22_linux64_openblas.conda#1a2a0cd3153464fee6646f3dd6dad9b8 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.7.1-hca28451_0.conda#755c7f876815003337d2c61ff5d047e5 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py311h459d7ec_0.conda#a322b4185121935c871d201ae00ac143 @@ -126,9 +126,9 @@ https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.51.0-py311h459d7ec_0 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_100.conda#d471a5c3abc984b662d9bae3bb7fd8a5 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda#0896606848b2dc5cebdf111b6543aa04 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda#e7d8df6509ba635247ff9aea31134262 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-21_linux64_openblas.conda#4a3816d06451c4946e2db26b86472cb6 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda#4b31699e0ec5de64d5896e580389c9a1 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-21_linux64_openblas.conda#1a42f305615c3867684e049e85927531 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_openblas.conda#b083767b6c877e24ee597d93b87ab838 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py311h18e6fac_0.conda#6c520a9d36c9d7270988c7a6c360d6d4 https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 @@ -143,17 +143,17 @@ https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.con https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311hca0b8b9_5.conda#cac429fcb9126d5e6f02c8ba61c2a811 https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py311h1f0f07a_0.conda#b7e6d52b39e199238c3400cafaabafb3 -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py311h9547e67_0.conda#40828c5b36ef52433e21f89943e09f33 +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py311h9547e67_0.conda#74ad0ae64f1ef565e27eda87fa749e84 https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.4.1-pyhd8ed1ab_0.conda#52387f00fee8dcd5cf75f8886025293f https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.3-he6dfbbe_0.conda#05c1609de571f7a9a40e6d7d4116c21a https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py311h459d7ec_1.conda#45b8d355bbcdd27588c2d266bcfdff84 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py311h64a7726_0.conda#d443c70b4a05f50236c70b9c79beff64 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.3-py311h2032efe_0.conda#e982956906078eeac9feb3b8db10d011 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h1f0f07a_4.conda#1e105c1a8ea2163507726144b401eb1b -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.34.1-he84ddb8_0.conda#f12ca97c38833a5a179adc172155d15d -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.3-py311h54ef318_0.conda#014c115be880802d2372ac6ed665f526 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.35.0-he84ddb8_0.conda#2d01dfbe537478e7a1a495b9639edd45 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py311h54ef318_0.conda#150186110f111b458f86c04361351337 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py311he8ad708_100.conda#597b1ad6cb7011b7561c20ea30295cae -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py311h320fe9a_1.conda#10d1806e20da040c58c36deddf51c70c +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py311h320fe9a_0.conda#fcda2652548238199b7de71dbde4e7fe https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.0-py311h1f0f07a_1.conda#74e551cef928303ec57f42828c51cf87 https://conda.anaconda.org/conda-forge/noarch/iris-3.8.1-pyha770c72_0.conda#b08a116ef1607e7e960a4caa902e3a90 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda#611a35a27914fac3aa37611a6fe40bb5 diff --git a/requirements/locks/py39-linux-64.lock b/requirements/locks/py39-linux-64.lock index 50ef950f..b8e04a07 100644 --- a/requirements/locks/py39-linux-64.lock +++ b/requirements/locks/py39-linux-64.lock @@ -29,14 +29,14 @@ https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.c https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b -https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_0.conda#30de3fd9b3b602f7473f30e684eeea8c +https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_1.conda#049b7df8bae5e184d1de42cdf64855f8 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4.20240210-h59595ed_0.conda#97da8860a0da5413c7c98a3b3838a645 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.1-hd590300_1.conda#9d731343cff6ee2e5a25c4a091bf8e2a https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 -https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-h9fff704_0.conda#e6d228cd0bb74a51dd18f5bfce0b4115 +https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.0-hdb0a2a9_1.conda#843bbb8ace1d64ac50d64639ff38b014 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda#2c80dc38fface310c9bd81b17037fee5 @@ -64,16 +64,16 @@ https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.con https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda#68c34ec6149623be41a1933ab996a209 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.5-hfc55251_0.conda#04b88013080254850d6c01ed54810589 -https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-h0f2a231_0.conda#009521b7ed97cca25f8f997f9e745976 +https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-hc2324a3_1.conda#11d76bee958b1989bd1ac6ee7372ea6d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda#39f910d205726805a958da408ca194ba https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.26-pthreads_h413a1c8_0.conda#760ae35415f5ba8b15d09df5afe8b23a +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_h413a1c8_0.conda#a356024784da6dfd4683dc5ecf45b155 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda#66f03896ffbe1a110ffda05c7a856504 https://conda.anaconda.org/conda-forge/linux-64/python-3.9.19-h0755675_0_cpython.conda#d9ee3647fbd9e8595b8df759b2bbefb8 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.2-h2c6b66d_0.conda#1423efca06ed343c1da0fc429bae0779 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.7-h8ee46fc_0.conda#49e482d882669206653b095f5206c05b +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-h8ee46fc_0.conda#077b6e8ad6a3ddb741fce2496dd01bec https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda#5e4c0743c70186509d1412e03c2d8dfa https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f @@ -83,13 +83,13 @@ https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1a https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.conda#753d29fe41bb881e4b9c004f0abf973f https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 -https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.3-pyhd8ed1ab_0.conda#ff15f46b0d34308f4d40c1c51df07592 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.4-pyhd8ed1ab_0.conda#6baa2e7fc09bd2c7c82cb6662d5f1d36 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.3.1-pyhca7485f_0.conda#b7f0662ef2c9d4404f0af9eef5ed2fde https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda#1a76f09108576397c41c0b0c5bd84134 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py39h7633fee_1.conda#c9f74d717e5a2847a9f8b779c54130f2 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-21_linux64_openblas.conda#0ac9f44fc096772b0aa092119b00c3ca +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-22_linux64_openblas.conda#1a2a0cd3153464fee6646f3dd6dad9b8 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.7.1-hca28451_0.conda#755c7f876815003337d2c61ff5d047e5 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py39hd1e30aa_0.conda#9a9a22eb1f83c44953319ee3b027769f @@ -119,9 +119,9 @@ https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_100.c https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda#0896606848b2dc5cebdf111b6543aa04 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda#c5d3907ad8bd7bf557521a1833cf7e6d https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda#e7d8df6509ba635247ff9aea31134262 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-21_linux64_openblas.conda#4a3816d06451c4946e2db26b86472cb6 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda#4b31699e0ec5de64d5896e580389c9a1 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-21_linux64_openblas.conda#1a42f305615c3867684e049e85927531 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_openblas.conda#b083767b6c877e24ee597d93b87ab838 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py39h90c7501_0.conda#1e3b6af9592be71ce19f0a6aae05d97b https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 @@ -137,16 +137,16 @@ https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py39h474f0d3_0.cond https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py39h15b0fa6_5.conda#85e186c7ff673b0d0026782ec353fb2a https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py39h44dd56e_0.conda#baea2f5dfb3ab7b1c836385d2e1daca7 -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py39h7633fee_0.conda#ed71ad3e30eb03da363fb797419cce98 +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py39h7633fee_0.conda#bdc188e59857d6efab332714e0d01d93 https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.4.1-pyhd8ed1ab_0.conda#52387f00fee8dcd5cf75f8886025293f https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.3-he6dfbbe_0.conda#05c1609de571f7a9a40e6d7d4116c21a https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py39hd1e30aa_1.conda#ca63612907462c8e36edcc9bbacc253e https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py39h474f0d3_0.conda#46ae0ecba9726ab4fa44c78fefa522cf https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.3-py39h6404dd3_0.conda#1520f039123452cd2de847068449a618 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py39h44dd56e_4.conda#81310d21bf9d91754c1220c585bb72d6 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.34.1-he84ddb8_0.conda#f12ca97c38833a5a179adc172155d15d -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.3-py39he9076e7_0.conda#5456bdfe5809ebf5689eda6c808b686e +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.35.0-he84ddb8_0.conda#2d01dfbe537478e7a1a495b9639edd45 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py39he9076e7_0.conda#1919384a8420e7bb25f6c3a582e0857c https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py39h4282601_100.conda#d2809fbf0d8ae7b8ca92c456cb44a7d4 -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py39hddac248_1.conda#8dd2eb1e7aa9a33a92a75bdcea3f0dd0 +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py39hddac248_0.conda#aa02350ccb542c83272f9cb7e4dfe15e https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.0-py39h44dd56e_1.conda#629e8d066a330f729d0085d86681fd01 https://conda.anaconda.org/conda-forge/noarch/iris-3.8.1-pyha770c72_0.conda#b08a116ef1607e7e960a4caa902e3a90 From 18618fc221b562d1aa9aed972e6431228d99982a Mon Sep 17 00:00:00 2001 From: Bill Little Date: Mon, 15 Apr 2024 11:50:37 +0100 Subject: [PATCH 266/583] add iris-sample-data test dependency (#413) --- requirements/py310.yml | 1 + requirements/py311.yml | 1 + requirements/py39.yml | 1 + requirements/test.txt | 2 ++ 4 files changed, 5 insertions(+) diff --git a/requirements/py310.yml b/requirements/py310.yml index e0ad975c..cd3141d3 100644 --- a/requirements/py310.yml +++ b/requirements/py310.yml @@ -24,3 +24,4 @@ dependencies: - pep8 - requests - nose + - iris-sample-data diff --git a/requirements/py311.yml b/requirements/py311.yml index 8df4d429..48e8ed15 100644 --- a/requirements/py311.yml +++ b/requirements/py311.yml @@ -24,6 +24,7 @@ dependencies: - pep8 - requests - nose + - iris-sample-data # Documentation dependencies. - sphinx diff --git a/requirements/py39.yml b/requirements/py39.yml index 7cb40d3e..bc12cdc9 100644 --- a/requirements/py39.yml +++ b/requirements/py39.yml @@ -24,3 +24,4 @@ dependencies: - pep8 - requests - nose + - iris-sample-data diff --git a/requirements/test.txt b/requirements/test.txt index 9249fdee..f930395f 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -4,3 +4,5 @@ mock filelock pep8 requests +iris-sample-data + From c5f53b9111e5a2dc8723cb41453fe2160e5b4c7f Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 15 Apr 2024 12:02:32 +0100 Subject: [PATCH 267/583] Updated environment lockfiles (#414) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 5 +++-- requirements/locks/py311-linux-64.lock | 5 +++-- requirements/locks/py39-linux-64.lock | 5 +++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 4aab7902..f3dd92cf 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: ce88382ab030763c8e7602a9957739e8dbf27aa5b8d5ef4b3bf35e84e5b22731 +# input_hash: b1906c2f1d4ce89b418ef6e05bfea8f3a310f5cf23088127efd61148a7e9f2be @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef @@ -87,6 +87,7 @@ https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.4-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.3.1-pyhca7485f_0.conda#b7f0662ef2c9d4404f0af9eef5ed2fde https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda#1a76f09108576397c41c0b0c5bd84134 +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/kiwisolver-1.4.5-py310hd41b1e2_1.conda#b8d67603d43b23ce7e988a5d81a7ab79 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-22_linux64_openblas.conda#1a2a0cd3153464fee6646f3dd6dad9b8 @@ -105,7 +106,7 @@ https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#9 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py310h2372a71_0.conda#b631b889b0b4bc2fca7b8b977ca484b2 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py310h2372a71_1.conda#bb010e368de4940771368bc3dc4c63e7 -https://conda.anaconda.org/conda-forge/noarch/setuptools-69.2.0-pyhd8ed1ab_0.conda#da214ecd521a720a9d521c68047682dc +https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda#7462280d81f639363e6e63c81276bd9e https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py310h2372a71_0.conda#72637c58d36d9475fda24700c9796f19 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index b7b7670a..eb0106e4 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: db79b267f56be2d551ff654e226018d317f3bd344a34dc77081608b7d9640f79 +# input_hash: 895464972044979e8a8d378a22ab1c5a0dd1c1d8d565cd2de73cd5e144aff662 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef @@ -91,6 +91,7 @@ https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda# https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.3.1-pyhca7485f_0.conda#b7f0662ef2c9d4404f0af9eef5ed2fde https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda#1a76f09108576397c41c0b0c5bd84134 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 +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/kiwisolver-1.4.5-py311h9547e67_1.conda#2c65bdf442b0d37aad080c8a4e0d452f https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-22_linux64_openblas.conda#1a2a0cd3153464fee6646f3dd6dad9b8 @@ -111,7 +112,7 @@ https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py311h459d7ec_0.conda#60b5332b3989fda37884b92c7afd6a91 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py311h459d7ec_1.conda#52719a74ad130de8fb5d047dc91f247a -https://conda.anaconda.org/conda-forge/noarch/setuptools-69.2.0-pyhd8ed1ab_0.conda#da214ecd521a720a9d521c68047682dc +https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda#7462280d81f639363e6e63c81276bd9e https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 diff --git a/requirements/locks/py39-linux-64.lock b/requirements/locks/py39-linux-64.lock index b8e04a07..573ae307 100644 --- a/requirements/locks/py39-linux-64.lock +++ b/requirements/locks/py39-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 9a84caa315a4f7df475f894cdac749ef0095eafe17a9613eb8eb27c456914d85 +# input_hash: b11d8b120c86045ee916cca99ba86b56b662585c49fbd8c994eb29dfb2ef8b40 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef @@ -87,6 +87,7 @@ https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.4-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.3.1-pyhca7485f_0.conda#b7f0662ef2c9d4404f0af9eef5ed2fde https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda#1a76f09108576397c41c0b0c5bd84134 +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/kiwisolver-1.4.5-py39h7633fee_1.conda#c9f74d717e5a2847a9f8b779c54130f2 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-22_linux64_openblas.conda#1a2a0cd3153464fee6646f3dd6dad9b8 @@ -105,7 +106,7 @@ https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#9 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py39hd1e30aa_0.conda#756cb152772a225587a05ca0ec68fc08 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py39hd1e30aa_1.conda#37218233bcdc310e4fde6453bc1b40d8 -https://conda.anaconda.org/conda-forge/noarch/setuptools-69.2.0-pyhd8ed1ab_0.conda#da214ecd521a720a9d521c68047682dc +https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda#7462280d81f639363e6e63c81276bd9e https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py39hd1e30aa_0.conda#1da984bbb6e765743e13388ba7b7b2c8 From 9a8b2f4541bbbedfc3e9d2306484e856d4c334cf Mon Sep 17 00:00:00 2001 From: Elias <110238618+ESadek-MO@users.noreply.github.com> Date: Mon, 15 Apr 2024 16:27:25 +0100 Subject: [PATCH 268/583] Convert tests and doctests from Cirrus to GHA (#415) * created ci-tests * added caches --- .cirrus.yml | 130 ----------------- .github/workflows/ci-tests.yml | 131 ++++++++++++++++++ .../composite/cartopy-cache/action.yml | 41 ++++++ .../composite/conda-env-cache/action.yml | 35 +++++ .../composite/conda-pkg-cache/action.yml | 22 +++ .../composite/iris-data-cache/action.yml | 30 ++++ .../workflows/composite/nox-cache/action.yml | 22 +++ 7 files changed, 281 insertions(+), 130 deletions(-) delete mode 100644 .cirrus.yml create mode 100644 .github/workflows/ci-tests.yml create mode 100644 .github/workflows/composite/cartopy-cache/action.yml create mode 100644 .github/workflows/composite/conda-env-cache/action.yml create mode 100644 .github/workflows/composite/conda-pkg-cache/action.yml create mode 100644 .github/workflows/composite/iris-data-cache/action.yml create mode 100644 .github/workflows/composite/nox-cache/action.yml diff --git a/.cirrus.yml b/.cirrus.yml deleted file mode 100644 index 1de7c187..00000000 --- a/.cirrus.yml +++ /dev/null @@ -1,130 +0,0 @@ -# Reference: -# - https://cirrus-ci.org/guide/writing-tasks/ -# - https://cirrus-ci.org/guide/tips-and-tricks/#sharing-configuration-between-tasks -# - https://cirrus-ci.org/guide/linux/ -# - https://cirrus-ci.org/guide/macOS/ -# - https://cirrus-ci.org/guide/windows/ -# - https://hub.docker.com/_/gcc/ -# - https://hub.docker.com/_/python/ - -# -# Global defaults. -# -container: - image: python:3.11 - cpu: 2 - memory: 4G - -env: - # Maximum cache period (in weeks) before forcing a new cache upload. - CACHE_PERIOD: "2" - # Increment the build number to force new conda cache upload. - CONDA_CACHE_BUILD: "98" - # Increment the build number to force new nox cache upload. - NOX_CACHE_BUILD: "98" - # Increment the build number to force new pip cache upload. - PIP_CACHE_BUILD: "98" - # Pip packages to be upgraded/installed. - PIP_CACHE_PACKAGES: "pip setuptools wheel nox pyyaml" - # Base directory for the iris-test-data. - IRIS_TEST_DATA_DIR: ${HOME}/iris-test-data - # Tagged release version of the iris-test-data. - IRIS_TEST_DATA_REF: "2.23" - -# -# Linting -# [2021-03-01] jamesp: Currently not black compliant. -# GitHub issue open #251 -lint_task: - auto_cancellation: true - name: "${CIRRUS_OS}: flake8" # and black - pip_cache: - folder: ~/.cache/pip - fingerprint_script: - - echo "${CIRRUS_TASK_NAME}" - - echo "$(date +%Y).$(expr $(date +%U) / ${CACHE_PERIOD}):${PIP_CACHE_BUILD} ${PIP_CACHE_PACKAGES}" - lint_script: - - pip list - - python -m pip install --retries 3 --upgrade ${PIP_CACHE_PACKAGES} - - pip list - - nox --session flake8 -# - nox --session black - - -# -# Testing (Linux) -# -linux_task_template: &LINUX_TASK_TEMPLATE - auto_cancellation: true - env: - PATH: ${HOME}/miniconda/bin:${PATH} - - container: - image: gcc:latest - cpu: 6 - memory: 8G - conda_cache: - folder: ${HOME}/miniconda - fingerprint_script: - - wget --quiet https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh - - echo "${CIRRUS_OS} $(sha256sum miniconda.sh)" - - echo "$(date +%Y).$(expr $(date +%U) / ${CACHE_PERIOD}):${CONDA_CACHE_BUILD}" - - uname -r - populate_script: - - export CONDA_OVERRIDE_LINUX="$(uname -r | cut -d'+' -f1)" - - bash miniconda.sh -b -p ${HOME}/miniconda - - conda config --set always_yes yes --set changeps1 no - - conda config --set show_channel_urls True - - conda config --add channels conda-forge - - conda update --quiet --name base conda - - conda install --quiet --name base nox pip coverage pyyaml - nox_cache: - folder: ${CIRRUS_WORKING_DIR}/.nox - reupload_on_changes: true - fingerprint_script: - - echo "${CIRRUS_TASK_NAME}" - - echo "${NOX_CACHE_BUILD}" - - echo "IRIS ${IRIS_SOURCE}" - data_cache: - folder: ${IRIS_TEST_DATA_DIR} - fingerprint_script: - - echo "${IRIS_TEST_DATA_REF}" - populate_script: - - wget --quiet https://github.com/SciTools/iris-test-data/archive/v${IRIS_TEST_DATA_REF}.zip -O iris-test-data.zip - - unzip -q iris-test-data.zip - - mv iris-test-data-$(echo "${IRIS_TEST_DATA_REF}" | sed "s/^v//") ${IRIS_TEST_DATA_DIR} - -tests_task: - matrix: - - name: "${CIRRUS_OS} tests: iris=conda-release python=3.9" - env: - PY_VER: 3.9 - IRIS_SOURCE: "conda-forge" - - name: "${CIRRUS_OS} tests: iris=conda-release python=3.10" - env: - PY_VER: 3.10 - IRIS_SOURCE: "conda-forge" - - name: "${CIRRUS_OS} tests: iris=conda-release python=3.11" - env: - PY_VER: 3.11 - IRIS_SOURCE: "conda-forge" - - name: "${CIRRUS_OS} tests: iris=repo-main python=3.11" - env: - PY_VER: 3.11 - IRIS_SOURCE: "source" - - << : *LINUX_TASK_TEMPLATE - tests_script: - - export CONDA_OVERRIDE_LINUX="$(uname -r | cut -d'+' -f1)" - - nox --session tests -- --test-data-dir ${IRIS_TEST_DATA_DIR}/test_data - -# [2021-06-07] lbdreyer: Doctests are failing, see Github Issue #274 -#doctest_task: -# matrix: -# env: -# PY_VER: 3.7 -# name: "${CIRRUS_OS}: py${PY_VER} tests" -# << : *LINUX_TASK_TEMPLATE -# tests_script: -# - export CONDA_OVERRIDE_LINUX="$(uname -r | cut -d'+' -f1)" -# - nox --session doctest -- --test-data-dir ${IRIS_TEST_DATA_DIR}/test_data diff --git a/.github/workflows/ci-tests.yml b/.github/workflows/ci-tests.yml new file mode 100644 index 00000000..47c49c5c --- /dev/null +++ b/.github/workflows/ci-tests.yml @@ -0,0 +1,131 @@ +# reference: +# - https://github.com/actions/cache +# - https://github.com/actions/checkout +# - https://github.com/marketplace/actions/setup-miniconda + +name: ci-tests + +on: + push: + branches: + - "main" + - "v*x" + tags: + - "v*" + pull_request: + branches: + - "*" + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + tests: + name: "${{ matrix.session }} (py${{ matrix.python-version }} ${{ matrix.os }}) [${{ matrix.iris-source }}]" + + runs-on: ${{ matrix.os }} + + defaults: + run: + shell: bash -l {0} + + strategy: + fail-fast: false + matrix: + os: ["ubuntu-latest"] + python-version: ["3.11"] + session: ["doctest"] + # conda-forge doesn't fit within nose char limits, change with pytest + iris-source : ["condaforge"] + include: + - os: "ubuntu-latest" + python-version: "3.11" + session: "tests" + iris-source: "condaforge" + - os: "ubuntu-latest" + python-version: "3.11" + session: "tests" + iris-source: "source" + - os: "ubuntu-latest" + python-version: "3.10" + session: "tests" + iris-source: "condaforge" + - os: "ubuntu-latest" + python-version: "3.9" + session: "tests" + iris-source: "condaforge" + + env: + IRIS_TEST_DATA_VERSION: "2.24" + ENV_NAME: "ci-tests" + + steps: + - name: "checkout" + uses: actions/checkout@v4 + + - name: "environment configure" + env: + # Maximum cache period (in weeks) before forcing a cache refresh. + CACHE_WEEKS: 2 + run: | + echo "CACHE_PERIOD=$(date +%Y).$(expr $(date +%U) / ${CACHE_WEEKS})" >> ${GITHUB_ENV} + echo "LOCK_FILE=requirements/locks/py$(echo ${{ matrix.python-version }} | tr -d '.')-linux-64.lock" >> ${GITHUB_ENV} + + - name: "data cache" + uses: ./.github/workflows/composite/iris-data-cache + with: + cache_build: 0 + env_name: ${{ env.ENV_NAME }} + version: ${{ env.IRIS_TEST_DATA_VERSION }} + + - name: "conda package cache" + uses: ./.github/workflows/composite/conda-pkg-cache + with: + cache_build: 0 + cache_period: ${{ env.CACHE_PERIOD }} + env_name: ${{ env.ENV_NAME }} + + - name: "conda install" + uses: conda-incubator/setup-miniconda@v3 + with: + miniforge-version: latest + channels: conda-forge,defaults + activate-environment: ${{ env.ENV_NAME }} + auto-update-conda: false + use-only-tar-bz2: true + + - name: "conda environment cache" + uses: ./.github/workflows/composite/conda-env-cache + with: + cache_build: 0 + cache_period: ${{ env.CACHE_PERIOD }} + env_name: ${{ env.ENV_NAME }} + install_packages: "cartopy nox pip" + + - name: "conda info" + run: | + conda info + conda list + + - name: "cartopy cache" + uses: ./.github/workflows/composite/cartopy-cache + with: + cache_build: 0 + cache_period: ${{ env.CACHE_PERIOD }} + env_name: ${{ env.ENV_NAME }} + + - name: "nox cache" + uses: ./.github/workflows/composite/nox-cache + with: + cache_build: 0 + env_name: ${{ env.ENV_NAME }} + lock_file: ${{ env.LOCK_FILE }} + + - name: "iris ${{ matrix.session }}" + env: + PY_VER: ${{ matrix.python-version }} + IRIS_SOURCE: ${{ matrix.iris-source }} + run: | + nox --session ${{ matrix.session }} -- --test-data-dir ${HOME}/iris-test-data/test_data \ No newline at end of file diff --git a/.github/workflows/composite/cartopy-cache/action.yml b/.github/workflows/composite/cartopy-cache/action.yml new file mode 100644 index 00000000..e41f575a --- /dev/null +++ b/.github/workflows/composite/cartopy-cache/action.yml @@ -0,0 +1,41 @@ +name: "cartopy-cache" +description: "create and cache cartopy assets" + +# +# Assumes the environment contains the following variables: +# - CONDA +# +inputs: + cache_build: + description: "conda environment cache build number" + required: false + default: "0" + cache_period: + description: "conda environment cache timestamp" + required: true + env_name: + description: "environment name" + required: true + +runs: + using: "composite" + steps: + - uses: actions/cache@v3 + id: cartopy-cache + with: + path: ~/.local/share/cartopy + key: ${{ runner.os }}-cartopy-${{ inputs.env_name }}-p${{ inputs.cache_period }}-b${{ inputs.cache_build }} + + - if: steps.cartopy-cache.outputs.cache-hit != 'true' + env: + CARTOPY_SHARE_DIR: ~/.local/share/cartopy + CARTOPY_FEATURE: https://raw.githubusercontent.com/SciTools/cartopy/v0.20.0/tools/cartopy_feature_download.py + shell: bash + run: | + # Require to explicitly activate the environment within the composite action. + source ${{ env.CONDA }}/etc/profile.d/conda.sh >/dev/null 2>&1 + conda activate ${{ inputs.env_name }} + wget --quiet ${CARTOPY_FEATURE} + mkdir -p ${CARTOPY_SHARE_DIR} + # Requires a pre-installed version of cartopy within the environment. + python cartopy_feature_download.py physical --output ${CARTOPY_SHARE_DIR} --no-warn \ No newline at end of file diff --git a/.github/workflows/composite/conda-env-cache/action.yml b/.github/workflows/composite/conda-env-cache/action.yml new file mode 100644 index 00000000..7a32a792 --- /dev/null +++ b/.github/workflows/composite/conda-env-cache/action.yml @@ -0,0 +1,35 @@ +name: "conda-env-cache" +description: "create and cache the conda environment" + +# +# Assumes the environment contains the following variables: +# - CONDA +# +inputs: + cache_build: + description: "conda environment cache build number" + required: false + default: "0" + cache_period: + description: "conda environment cache timestamp" + required: true + env_name: + description: "environment name" + required: true + install_packages: + description: "conda packages to install into environment" + required: true + +runs: + using: "composite" + steps: + - uses: actions/cache@v3 + id: conda-env-cache + with: + path: ${{ env.CONDA }}/envs/${{ inputs.env_name }} + key: ${{ runner.os }}-conda-env-${{ inputs.env_name }}-p${{ inputs.cache_period }}-b${{ inputs.cache_build }} + + - if: steps.conda-env-cache.outputs.cache-hit != 'true' + shell: bash + run: | + conda install --quiet --name ${{ inputs.env_name }} ${{ inputs.install_packages }} \ No newline at end of file diff --git a/.github/workflows/composite/conda-pkg-cache/action.yml b/.github/workflows/composite/conda-pkg-cache/action.yml new file mode 100644 index 00000000..d06c0941 --- /dev/null +++ b/.github/workflows/composite/conda-pkg-cache/action.yml @@ -0,0 +1,22 @@ +name: "conda-pkg-cache" +description: "cache the conda environment packages" + +inputs: + cache_build: + description: "conda environment cache build number" + required: false + default: "0" + cache_period: + description: "conda environment cache timestamp" + required: true + env_name: + description: "environment name" + required: true + +runs: + using: "composite" + steps: + - uses: actions/cache@v3 + with: + path: ~/conda_pkgs_dir + key: ${{ runner.os }}-conda-pkgs-${{ inputs.env_name }}-p${{ inputs.cache_period }}-b${{ inputs.cache_build }} \ No newline at end of file diff --git a/.github/workflows/composite/iris-data-cache/action.yml b/.github/workflows/composite/iris-data-cache/action.yml new file mode 100644 index 00000000..5869ab64 --- /dev/null +++ b/.github/workflows/composite/iris-data-cache/action.yml @@ -0,0 +1,30 @@ +name: "iris-data-cache" +description: "create and cache the iris test data" + +inputs: + cache_build: + description: "data cache build number" + required: false + default: "0" + env_name: + description: "environment name" + required: true + version: + description: "iris test data version" + required: true + +runs: + using: "composite" + steps: + - uses: actions/cache@v3 + id: data-cache + with: + path: ~/iris-test-data + key: ${{ runner.os }}-iris-test-data-${{ inputs.env_name }}-v${{ inputs.version }}-b${{ inputs.cache_build }} + + - if: steps.data-cache.outputs.cache-hit != 'true' + shell: bash + run: | + wget --quiet https://github.com/SciTools/iris-test-data/archive/v${{ inputs.version }}.zip -O iris-test-data.zip + unzip -q iris-test-data.zip + mv iris-test-data-${{ inputs.version }} ~/iris-test-data \ No newline at end of file diff --git a/.github/workflows/composite/nox-cache/action.yml b/.github/workflows/composite/nox-cache/action.yml new file mode 100644 index 00000000..23447f84 --- /dev/null +++ b/.github/workflows/composite/nox-cache/action.yml @@ -0,0 +1,22 @@ +name: "nox cache" +description: "cache the nox test environments" + +inputs: + cache_build: + description: "nox cache build number" + required: false + default: "0" + env_name: + description: "environment name" + required: true + lock_file: + description: "conda-lock environment requirements filename" + required: true + +runs: + using: "composite" + steps: + - uses: actions/cache@v3 + with: + path: ${{ github.workspace }}/.nox + key: ${{ runner.os }}-nox-${{ inputs.env_name }}-py${{ matrix.python-version }}-b${{ inputs.cache_build }}-${{ hashFiles(inputs.lock_file) }} \ No newline at end of file From 4d7b701522a4e836c87e8696bbfdd8945bedd52b Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 15 Apr 2024 20:04:41 +0100 Subject: [PATCH 269/583] [pre-commit.ci] pre-commit autoupdate (#416) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/pre-commit/pre-commit-hooks: v4.5.0 → v4.6.0](https://github.com/pre-commit/pre-commit-hooks/compare/v4.5.0...v4.6.0) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 921d5cb0..5032e66d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -14,7 +14,7 @@ minimum_pre_commit_version: 1.21.0 repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.5.0 + rev: v4.6.0 hooks: # Prevent giant files from being committed. - id: check-added-large-files From 12d9839d46cecf2038858888e63a1c89c2e987bb Mon Sep 17 00:00:00 2001 From: Martin Yeo <40734014+trexfeathers@users.noreply.github.com> Date: Tue, 16 Apr 2024 13:35:26 +0100 Subject: [PATCH 270/583] Remove PEP8 test (#419) * Remove PEP8 test. * Don't touch the lock files. * Update lock files. --- iris_grib/tests/test_pep8.py | 41 -------------------------- requirements/locks/py310-linux-64.lock | 6 ++-- requirements/locks/py311-linux-64.lock | 6 ++-- requirements/locks/py39-linux-64.lock | 6 ++-- requirements/py310.yml | 1 - requirements/py311.yml | 3 +- requirements/py39.yml | 1 - requirements/test.txt | 1 - 8 files changed, 10 insertions(+), 55 deletions(-) delete mode 100644 iris_grib/tests/test_pep8.py diff --git a/iris_grib/tests/test_pep8.py b/iris_grib/tests/test_pep8.py deleted file mode 100644 index 228aa0d4..00000000 --- a/iris_grib/tests/test_pep8.py +++ /dev/null @@ -1,41 +0,0 @@ -# Copyright iris-grib contributors -# -# This file is part of iris-grib and is released under the BSD license. -# See LICENSE in the root of the repository for full licensing details. -""" -Unit tests for iris-grib pep8 conformance. - -""" - -import os -import unittest - -import pep8 - -import iris_grib - - -class Test(unittest.TestCase): - def test_pep8_conformance(self): - pep8style = pep8.StyleGuide(quiet=False) - excluded = ['_grib_cf_map.py', '_grib1_load_rules.py'] - for fname in excluded: - path = '*{}{}'.format(os.path.sep, fname) - pep8style.options.exclude.append(path) - - extra_exclude_fname = os.path.join(os.path.dirname(__file__), - '.pep8_test_exclude.txt') - - if os.path.exists(extra_exclude_fname): - with open(extra_exclude_fname) as fh: - extra_exclude = [line.strip() for line in fh if line.strip()] - pep8style.options.exclude.extend(extra_exclude) - - root = os.path.dirname(os.path.abspath(iris_grib.__file__)) - result = pep8style.check_files([root]) - emsg = 'Found code pep8 errors (and warnings).' - self.assertEqual(result.total_errors, 0, emsg) - - -if __name__ == '__main__': - unittest.main() diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index f3dd92cf..b03ddedf 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: b1906c2f1d4ce89b418ef6e05bfea8f3a310f5cf23088127efd61148a7e9f2be +# input_hash: 2526a5d0d002791e04159711082965735b6b14b7b9f6e0fbcba61aff87a09e79 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef @@ -29,7 +29,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.c https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b -https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_1.conda#049b7df8bae5e184d1de42cdf64855f8 +https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 @@ -99,7 +99,6 @@ https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 https://conda.anaconda.org/conda-forge/noarch/nose-1.3.7-py_1006.tar.bz2#382019d5f8e9362ef6f60a8d4e7bce8f https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#248f521b64ce055e7feae3105e7abeb8 -https://conda.anaconda.org/conda-forge/noarch/pep8-1.7.1-py_0.tar.bz2#d0b5bc3aebbffcb175bf8a1d419acb79 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 @@ -149,3 +148,4 @@ https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py310hba70d5 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py310hcc13569_0.conda#89a13de526ea3008341e3a2aeab4da7e https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.0-py310h1f7b6fc_1.conda#f020ac07b7df9c4b0bd0ece3055b5bd2 https://conda.anaconda.org/conda-forge/noarch/iris-3.8.1-pyha770c72_0.conda#b08a116ef1607e7e960a4caa902e3a90 + diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index eb0106e4..a82f3504 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 895464972044979e8a8d378a22ab1c5a0dd1c1d8d565cd2de73cd5e144aff662 +# input_hash: 511946459ef14e966c9286ad613478241ad4307a3c433201f92dd2db7ebeb3d8 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef @@ -29,7 +29,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.c https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b -https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_1.conda#049b7df8bae5e184d1de42cdf64855f8 +https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 @@ -103,7 +103,6 @@ https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 https://conda.anaconda.org/conda-forge/noarch/nose-1.3.7-py_1006.tar.bz2#382019d5f8e9362ef6f60a8d4e7bce8f https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#248f521b64ce055e7feae3105e7abeb8 -https://conda.anaconda.org/conda-forge/noarch/pep8-1.7.1-py_0.tar.bz2#d0b5bc3aebbffcb175bf8a1d419acb79 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda#140a7f159396547e9799aa98f9f0742e https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f @@ -165,3 +164,4 @@ https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-2.0.0-pyha770c72_ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.7-pyhd8ed1ab_0.conda#26acae54b06f178681bfb551760f5dd1 https://conda.anaconda.org/conda-forge/noarch/sphinx-7.2.6-pyhd8ed1ab_0.conda#bbfd1120d1824d2d073bc65935f0e4c0 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda#e507335cb4ca9cff4c3d0fa9cdab255e + diff --git a/requirements/locks/py39-linux-64.lock b/requirements/locks/py39-linux-64.lock index 573ae307..1f6c32db 100644 --- a/requirements/locks/py39-linux-64.lock +++ b/requirements/locks/py39-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: b11d8b120c86045ee916cca99ba86b56b662585c49fbd8c994eb29dfb2ef8b40 +# input_hash: 027bdf1451c4201a0f40983d191bfd44af0252e03e29d7b25fbef86473eeee1d @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef @@ -29,7 +29,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.c https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b -https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_1.conda#049b7df8bae5e184d1de42cdf64855f8 +https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 @@ -99,7 +99,6 @@ https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 https://conda.anaconda.org/conda-forge/noarch/nose-1.3.7-py_1006.tar.bz2#382019d5f8e9362ef6f60a8d4e7bce8f https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#248f521b64ce055e7feae3105e7abeb8 -https://conda.anaconda.org/conda-forge/noarch/pep8-1.7.1-py_0.tar.bz2#d0b5bc3aebbffcb175bf8a1d419acb79 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 @@ -151,3 +150,4 @@ https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py39h4282601 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py39hddac248_0.conda#aa02350ccb542c83272f9cb7e4dfe15e https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.0-py39h44dd56e_1.conda#629e8d066a330f729d0085d86681fd01 https://conda.anaconda.org/conda-forge/noarch/iris-3.8.1-pyha770c72_0.conda#b08a116ef1607e7e960a4caa902e3a90 + diff --git a/requirements/py310.yml b/requirements/py310.yml index cd3141d3..ac092a9c 100644 --- a/requirements/py310.yml +++ b/requirements/py310.yml @@ -21,7 +21,6 @@ dependencies: # Test dependencies. - mock - filelock - - pep8 - requests - nose - iris-sample-data diff --git a/requirements/py311.yml b/requirements/py311.yml index 48e8ed15..c879b257 100644 --- a/requirements/py311.yml +++ b/requirements/py311.yml @@ -21,11 +21,10 @@ dependencies: # Test dependencies. - mock - filelock - - pep8 - requests - nose - iris-sample-data # Documentation dependencies. - - sphinx + - sphinx - sphinx_rtd_theme \ No newline at end of file diff --git a/requirements/py39.yml b/requirements/py39.yml index bc12cdc9..d6c6a55b 100644 --- a/requirements/py39.yml +++ b/requirements/py39.yml @@ -21,7 +21,6 @@ dependencies: # Test dependencies. - mock - filelock - - pep8 - requests - nose - iris-sample-data diff --git a/requirements/test.txt b/requirements/test.txt index f930395f..1d735f6a 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -2,7 +2,6 @@ mock filelock -pep8 requests iris-sample-data From 508474e0420543e898a709a9fa472465c1717cf0 Mon Sep 17 00:00:00 2001 From: Bill Little Date: Tue, 16 Apr 2024 15:21:13 +0100 Subject: [PATCH 271/583] Migrate to pytest (#420) * add pytest dependency * update locks * configure pytest * add pytest log_cli config * update locks after rebase (pep8 update) * review actions --- .github/workflows/ci-tests.yml | 5 +- docs/ref/release_notes.rst | 5 + iris_grib/tests/runner/__init__.py | 8 -- iris_grib/tests/runner/__main__.py | 39 ------- iris_grib/tests/runner/_runner.py | 143 ------------------------- noxfile.py | 7 +- pyproject.toml | 20 +++- requirements/locks/py310-linux-64.lock | 10 +- requirements/locks/py311-linux-64.lock | 9 +- requirements/locks/py39-linux-64.lock | 10 +- requirements/py310.yml | 3 +- requirements/py311.yml | 2 +- requirements/py39.yml | 3 +- requirements/test.txt | 2 +- 14 files changed, 56 insertions(+), 210 deletions(-) delete mode 100644 iris_grib/tests/runner/__init__.py delete mode 100644 iris_grib/tests/runner/__main__.py delete mode 100644 iris_grib/tests/runner/_runner.py diff --git a/.github/workflows/ci-tests.yml b/.github/workflows/ci-tests.yml index 47c49c5c..95c1c92a 100644 --- a/.github/workflows/ci-tests.yml +++ b/.github/workflows/ci-tests.yml @@ -125,7 +125,8 @@ jobs: - name: "iris ${{ matrix.session }}" env: - PY_VER: ${{ matrix.python-version }} IRIS_SOURCE: ${{ matrix.iris-source }} + PY_COLORS: 1 + PY_VER: ${{ matrix.python-version }} run: | - nox --session ${{ matrix.session }} -- --test-data-dir ${HOME}/iris-test-data/test_data \ No newline at end of file + nox --session ${{ matrix.session }} -- --test-data-dir ${HOME}/iris-test-data/test_data diff --git a/docs/ref/release_notes.rst b/docs/ref/release_notes.rst index a58d6304..66eea17a 100644 --- a/docs/ref/release_notes.rst +++ b/docs/ref/release_notes.rst @@ -16,6 +16,11 @@ Features 4.6, i.e. percentile forecasts. `(PR#401) `_ +Dependencies +^^^^^^^^^^^^ +* `@bjlittle `_ migrated to ``pytest``. + `(PR#420) `_ + What's new in iris-grib v0.19.1 ------------------------------- diff --git a/iris_grib/tests/runner/__init__.py b/iris_grib/tests/runner/__init__.py deleted file mode 100644 index c3bac50a..00000000 --- a/iris_grib/tests/runner/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -# Copyright iris-grib contributors -# -# This file is part of iris-grib and is released under the BSD license. -# See LICENSE in the root of the repository for full licensing details. -""" -Empty file to allow import. - -""" diff --git a/iris_grib/tests/runner/__main__.py b/iris_grib/tests/runner/__main__.py deleted file mode 100644 index bc24db19..00000000 --- a/iris_grib/tests/runner/__main__.py +++ /dev/null @@ -1,39 +0,0 @@ -# Copyright iris-grib contributors -# -# This file is part of iris-grib and is released under the BSD license. -# See LICENSE in the root of the repository for full licensing details. -""" -Provides testing capabilities for installed copies of iris-grib. - -""" - -import argparse - -from ._runner import TestRunner - - -parser = argparse.ArgumentParser( - "iris_grib.tests", description=TestRunner.description -) -for long_opt, short_opt, help_text in TestRunner.user_options: - long_opt = long_opt.strip("=") - if long_opt in TestRunner.boolean_options: - parser.add_argument( - "--" + long_opt, - "-" + short_opt, - action="store_true", - help=help_text, - ) - else: - parser.add_argument("--" + long_opt, "-" + short_opt, help=help_text) -args = parser.parse_args() - -runner = TestRunner() - -runner.initialize_options() -for long_opt, short_opt, help_text in TestRunner.user_options: - arg = long_opt.replace("-", "_").strip("=") - setattr(runner, arg, getattr(args, arg)) -runner.finalize_options() - -runner.run() diff --git a/iris_grib/tests/runner/_runner.py b/iris_grib/tests/runner/_runner.py deleted file mode 100644 index ea797b7a..00000000 --- a/iris_grib/tests/runner/_runner.py +++ /dev/null @@ -1,143 +0,0 @@ -# Copyright iris-grib contributors -# -# This file is part of iris-grib and is released under the BSD license. -# See LICENSE in the root of the repository for full licensing details. -""" -Provides testing capabilities for installed copies of iris-grib. - -""" - -# Because this file is imported by setup.py, there may be additional runtime -# imports later in the file. -import multiprocessing -import os - - -# NOTE: Do not inherit from object as distutils does not like it. -class TestRunner: - """Run the iris-grib tests under nose and multiprocessor for performance""" - - description = ( - "Run tests under nose and multiprocessor for performance. " - "Specifying one or more test flags will run *only* those " - "tests." - ) - user_options = [ - ( - "no-data", - "n", - "Override the paths to the data repositories so it " - "appears to the tests that it does not exist.", - ), - ("stop", "x", "Stop running tests after the first error or failure."), - ("unit-tests", "s", "Run the limited subset of unit tests."), - ("integration-tests", "i", "Run the integration tests."), - ("default-tests", "d", "Run the default tests."), - ( - "coding-tests", - "c", - "Run the coding standards tests. (These are a " - "subset of the default tests.)", - ), - ( - "num-processors=", - "p", - "The number of processors used for running " "the tests.", - ), - ("create-missing", "m", "Create missing test result files."), - ] - boolean_options = [ - "no-data", - "unit-tests", - "stop", - "default-tests", - "integration-tests", - "create-missing", - ] - - def initialize_options(self): - self.no_data = False - self.stop = False - self.unit_tests = False - self.default_tests = False - self.integration_tests = False - self.num_processors = None - self.create_missing = False - - def finalize_options(self): - # These environment variables will be propagated to all the - # processes that nose.run creates. - if self.no_data: - print("Running tests in no-data mode...") - import iris.config - - iris.config.TEST_DATA_DIR = None - if self.create_missing: - os.environ["IRIS_TEST_CREATE_MISSING"] = "true" - - tests = [] - if self.unit_tests: - tests.append("unit") - if self.default_tests: - tests.append("default") - if self.integration_tests: - tests.append("integration") - if not tests: - tests.append("default") - print("Running test suite(s): {}".format(", ".join(tests))) - if self.stop: - print("Stopping tests after the first error or failure") - if self.num_processors is None: - # Choose a magic number that works reasonably well for the default - # number of processes. - self.num_processors = (multiprocessing.cpu_count() + 1) // 4 + 1 - else: - self.num_processors = int(self.num_processors) - - def run(self): - import nose - - if hasattr(self, "distribution") and self.distribution.tests_require: - self.distribution.fetch_build_eggs(self.distribution.tests_require) - - tests = [] - if self.unit_tests: - tests.append("iris_grib.tests.unit") - if self.default_tests: - tests.append("iris_grib.tests") - if self.integration_tests: - tests.append("iris_grib.tests.integration") - - if not tests: - tests.append("iris_grib.tests") - - regexp_pat = r"--match=^([Tt]est(?![Mm]ixin)|[Ss]ystem)" - - n_processors = max(self.num_processors, 1) - - args = [ - "", - None, - "--processes=%s" % n_processors, - "--verbosity=2", - regexp_pat, - "--process-timeout=180", - ] - - if self.stop: - args.append("--stop") - - result = True - for test in tests: - args[1] = test - print() - print( - "Running test discovery on %s with %s processors." - % (test, n_processors) - ) - # run the tests at module level i.e. my_module.tests - # - test must start with test/Test and must not contain the - # word Mixin. - result &= nose.run(argv=args) - if result is False: - exit(1) diff --git a/noxfile.py b/noxfile.py index 9e7e41b6..687f463a 100644 --- a/noxfile.py +++ b/noxfile.py @@ -311,10 +311,9 @@ def tests(session: nox.sessions.Session, iris_source: str): session.run("python", "-m", "eccodes", "selfcheck") session.run( - "python", - "-m", - "iris_grib.tests.runner", - "--default-tests", + "pytest", + "--pyargs", + "iris_grib", ) diff --git a/pyproject.toml b/pyproject.toml index 01beb97c..5a054c51 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -91,4 +91,22 @@ enable_error_code = ["ignore-without-code", "redundant-expr", "truthy-bool"] exclude = [ 'noxfile\.py', 'docs/conf\.py' -] \ No newline at end of file +] + +[tool.pytest.ini_options] +addopts = [ + "--doctest-continue-on-failure", + "--doctest-modules", + "-ra", + "--strict-config", + "--strict-markers", + "-v", +] +doctest_optionflags = "NORMALIZE_WHITESPACE ELLIPSIS NUMBER" +# configure logging as recommended by repo-review +log_cli = "True" +log_cli_level = "INFO" +minversion = "6.0" +testpaths = "iris_grib" +xfail_strict = "True" + diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index b03ddedf..5a2215eb 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 2526a5d0d002791e04159711082965735b6b14b7b9f6e0fbcba61aff87a09e79 +# input_hash: 1d932b8d3274021fab62c4f076314526d5dfe70494cd975cc07a9a324867d8e7 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef @@ -82,11 +82,14 @@ https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.cond https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.conda#753d29fe41bb881e4b9c004f0abf973f +https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.4-pyhd8ed1ab_0.conda#6baa2e7fc09bd2c7c82cb6662d5f1d36 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.3.1-pyhca7485f_0.conda#b7f0662ef2c9d4404f0af9eef5ed2fde https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda#1a76f09108576397c41c0b0c5bd84134 +https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 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/kiwisolver-1.4.5-py310hd41b1e2_1.conda#b8d67603d43b23ce7e988a5d81a7ab79 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 @@ -96,9 +99,9 @@ https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2# https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py310h2372a71_0.conda#f6703fa0214a00bf49d1bef6dc7672d0 https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda#926c67c0310094cf421ad13f7d3f38e5 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 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#248f521b64ce055e7feae3105e7abeb8 +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.4.0-pyhd8ed1ab_0.conda#139e9feb65187e916162917bb2484976 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 @@ -107,6 +110,7 @@ https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py310h2372a7 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py310h2372a71_1.conda#bb010e368de4940771368bc3dc4c63e7 https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda#7462280d81f639363e6e63c81276bd9e https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 +https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py310h2372a71_0.conda#72637c58d36d9475fda24700c9796f19 https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda#0b5293a157c2b5cd513dd1b03d8d3aae @@ -125,6 +129,7 @@ https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py310hf73ecf8_0.conda#1de56cf017dfd02aa84093206a0141a8 https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.1-h1d62c97_0.conda#44ec51d0857d9be26158bb85caa74fdb +https://conda.anaconda.org/conda-forge/noarch/pytest-8.1.1-pyhd8ed1ab_0.conda#94ff09cdedcb7b17e9cd5097ee2cfcff https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 @@ -148,4 +153,3 @@ https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py310hba70d5 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py310hcc13569_0.conda#89a13de526ea3008341e3a2aeab4da7e https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.0-py310h1f7b6fc_1.conda#f020ac07b7df9c4b0bd0ece3055b5bd2 https://conda.anaconda.org/conda-forge/noarch/iris-3.8.1-pyha770c72_0.conda#b08a116ef1607e7e960a4caa902e3a90 - diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index a82f3504..30a46fd5 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 511946459ef14e966c9286ad613478241ad4307a3c433201f92dd2db7ebeb3d8 +# input_hash: c2e09c4aa88ff4e97f86383f01792ed1ae572a5ebf3ee2da38d438e64e36d371 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef @@ -86,11 +86,13 @@ https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py311h38be061_3.conda#1c33f55e5cdcc2a2b973c432b5225bfe +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.4-pyhd8ed1ab_0.conda#6baa2e7fc09bd2c7c82cb6662d5f1d36 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.3.1-pyhca7485f_0.conda#b7f0662ef2c9d4404f0af9eef5ed2fde https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda#1a76f09108576397c41c0b0c5bd84134 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 +https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 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/kiwisolver-1.4.5-py311h9547e67_1.conda#2c65bdf442b0d37aad080c8a4e0d452f https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 @@ -100,9 +102,9 @@ https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2# https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py311h459d7ec_0.conda#a322b4185121935c871d201ae00ac143 https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda#926c67c0310094cf421ad13f7d3f38e5 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 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#248f521b64ce055e7feae3105e7abeb8 +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.4.0-pyhd8ed1ab_0.conda#139e9feb65187e916162917bb2484976 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda#140a7f159396547e9799aa98f9f0742e https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f @@ -115,6 +117,7 @@ https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 +https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda#0b5293a157c2b5cd513dd1b03d8d3aae https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec @@ -133,6 +136,7 @@ https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py311h18e6fac_0.conda#6c520a9d36c9d7270988c7a6c360d6d4 https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.1-h1d62c97_0.conda#44ec51d0857d9be26158bb85caa74fdb +https://conda.anaconda.org/conda-forge/noarch/pytest-8.1.1-pyhd8ed1ab_0.conda#94ff09cdedcb7b17e9cd5097ee2cfcff https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 @@ -164,4 +168,3 @@ https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-2.0.0-pyha770c72_ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.7-pyhd8ed1ab_0.conda#26acae54b06f178681bfb551760f5dd1 https://conda.anaconda.org/conda-forge/noarch/sphinx-7.2.6-pyhd8ed1ab_0.conda#bbfd1120d1824d2d073bc65935f0e4c0 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda#e507335cb4ca9cff4c3d0fa9cdab255e - diff --git a/requirements/locks/py39-linux-64.lock b/requirements/locks/py39-linux-64.lock index 1f6c32db..552b59d3 100644 --- a/requirements/locks/py39-linux-64.lock +++ b/requirements/locks/py39-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 027bdf1451c4201a0f40983d191bfd44af0252e03e29d7b25fbef86473eeee1d +# input_hash: 689aca04830a5c80c1e31d43d99cb943e635ac0c6eff75c02a9c51fa2ba2591f @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef @@ -82,11 +82,14 @@ https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.cond https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.conda#753d29fe41bb881e4b9c004f0abf973f +https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.4-pyhd8ed1ab_0.conda#6baa2e7fc09bd2c7c82cb6662d5f1d36 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.3.1-pyhca7485f_0.conda#b7f0662ef2c9d4404f0af9eef5ed2fde https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda#1a76f09108576397c41c0b0c5bd84134 +https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 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/kiwisolver-1.4.5-py39h7633fee_1.conda#c9f74d717e5a2847a9f8b779c54130f2 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 @@ -96,9 +99,9 @@ https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2# https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py39hd1e30aa_0.conda#9a9a22eb1f83c44953319ee3b027769f https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda#926c67c0310094cf421ad13f7d3f38e5 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 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#248f521b64ce055e7feae3105e7abeb8 +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.4.0-pyhd8ed1ab_0.conda#139e9feb65187e916162917bb2484976 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 @@ -107,6 +110,7 @@ https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py39hd1e30aa https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py39hd1e30aa_1.conda#37218233bcdc310e4fde6453bc1b40d8 https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda#7462280d81f639363e6e63c81276bd9e https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 +https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py39hd1e30aa_0.conda#1da984bbb6e765743e13388ba7b7b2c8 https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda#0b5293a157c2b5cd513dd1b03d8d3aae @@ -126,6 +130,7 @@ https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py39h90c7501_0.conda#1e3b6af9592be71ce19f0a6aae05d97b https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.1-h1d62c97_0.conda#44ec51d0857d9be26158bb85caa74fdb +https://conda.anaconda.org/conda-forge/noarch/pytest-8.1.1-pyhd8ed1ab_0.conda#94ff09cdedcb7b17e9cd5097ee2cfcff https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 @@ -150,4 +155,3 @@ https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py39h4282601 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py39hddac248_0.conda#aa02350ccb542c83272f9cb7e4dfe15e https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.0-py39h44dd56e_1.conda#629e8d066a330f729d0085d86681fd01 https://conda.anaconda.org/conda-forge/noarch/iris-3.8.1-pyha770c72_0.conda#b08a116ef1607e7e960a4caa902e3a90 - diff --git a/requirements/py310.yml b/requirements/py310.yml index ac092a9c..bcefe256 100644 --- a/requirements/py310.yml +++ b/requirements/py310.yml @@ -22,5 +22,6 @@ dependencies: - mock - filelock - requests - - nose - iris-sample-data + - pytest + diff --git a/requirements/py311.yml b/requirements/py311.yml index c879b257..f4a65fba 100644 --- a/requirements/py311.yml +++ b/requirements/py311.yml @@ -22,8 +22,8 @@ dependencies: - mock - filelock - requests - - nose - iris-sample-data + - pytest # Documentation dependencies. - sphinx diff --git a/requirements/py39.yml b/requirements/py39.yml index d6c6a55b..078ae302 100644 --- a/requirements/py39.yml +++ b/requirements/py39.yml @@ -22,5 +22,6 @@ dependencies: - mock - filelock - requests - - nose - iris-sample-data + - pytest + diff --git a/requirements/test.txt b/requirements/test.txt index 1d735f6a..3a1d4d2e 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -4,4 +4,4 @@ mock filelock requests iris-sample-data - +pytest From ffa21335c502ee307146a1047ee66ba8780739a5 Mon Sep 17 00:00:00 2001 From: Bill Little Date: Tue, 16 Apr 2024 16:04:56 +0100 Subject: [PATCH 272/583] add pytest-mock dependency (#424) --- requirements/locks/py310-linux-64.lock | 4 ++-- requirements/locks/py311-linux-64.lock | 4 ++-- requirements/locks/py39-linux-64.lock | 4 ++-- requirements/py310.yml | 3 ++- requirements/py311.yml | 4 ++-- requirements/py39.yml | 2 +- requirements/test.txt | 2 +- 7 files changed, 12 insertions(+), 11 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 5a2215eb..af5cc02d 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 1d932b8d3274021fab62c4f076314526d5dfe70494cd975cc07a9a324867d8e7 +# input_hash: 9e797137467cb0eae651a9bc93dc4bec8f140aabfb83ba31bdbfd6e25e21a64e @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef @@ -97,7 +97,6 @@ https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-22_linux64_openbla https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.7.1-hca28451_0.conda#755c7f876815003337d2c61ff5d047e5 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py310h2372a71_0.conda#f6703fa0214a00bf49d1bef6dc7672d0 -https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda#926c67c0310094cf421ad13f7d3f38e5 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#248f521b64ce055e7feae3105e7abeb8 @@ -138,6 +137,7 @@ https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.1.0-hd8ed1ab_ https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h9612171_113.conda#b2414908e43c442ddc68e6148774a304 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py310hb13e2d6_0.conda#6593de64c935768b6bad3e19b3e978be https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py310hd5c30f3_5.conda#dc2ee770a2299307f3c127af79160d25 +https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py310h1f7b6fc_0.conda#31beda75384647959d5792a1a7dc571a https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py310hd41b1e2_0.conda#60ee50b1968f802f2a487ba36d4cce0d diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 30a46fd5..25664a3d 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: c2e09c4aa88ff4e97f86383f01792ed1ae572a5ebf3ee2da38d438e64e36d371 +# input_hash: 27ab0ac641e4e7eca8a844e030e7e96ae85c91bc70dc3c0682a6f08459719d5a @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef @@ -100,7 +100,6 @@ https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-22_linux64_openbla https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.7.1-hca28451_0.conda#755c7f876815003337d2c61ff5d047e5 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py311h459d7ec_0.conda#a322b4185121935c871d201ae00ac143 -https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda#926c67c0310094cf421ad13f7d3f38e5 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#248f521b64ce055e7feae3105e7abeb8 @@ -145,6 +144,7 @@ https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.1.0-hd8ed1ab_ https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h9612171_113.conda#b2414908e43c442ddc68e6148774a304 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.conda#a502d7aad449a1206efb366d6a12c52d https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311hca0b8b9_5.conda#cac429fcb9126d5e6f02c8ba61c2a811 +https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py311h1f0f07a_0.conda#b7e6d52b39e199238c3400cafaabafb3 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py311h9547e67_0.conda#74ad0ae64f1ef565e27eda87fa749e84 diff --git a/requirements/locks/py39-linux-64.lock b/requirements/locks/py39-linux-64.lock index 552b59d3..c3809e15 100644 --- a/requirements/locks/py39-linux-64.lock +++ b/requirements/locks/py39-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 689aca04830a5c80c1e31d43d99cb943e635ac0c6eff75c02a9c51fa2ba2591f +# input_hash: 0ea2e1429acfb3b6481755808a3eb8abce4ab84479aefa81da3fc40044655afb @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef @@ -97,7 +97,6 @@ https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-22_linux64_openbla https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.7.1-hca28451_0.conda#755c7f876815003337d2c61ff5d047e5 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py39hd1e30aa_0.conda#9a9a22eb1f83c44953319ee3b027769f -https://conda.anaconda.org/conda-forge/noarch/mock-5.1.0-pyhd8ed1ab_0.conda#926c67c0310094cf421ad13f7d3f38e5 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#248f521b64ce055e7feae3105e7abeb8 @@ -140,6 +139,7 @@ https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.1.0-hd8ed1ab_ https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h9612171_113.conda#b2414908e43c442ddc68e6148774a304 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py39h474f0d3_0.conda#aa265f5697237aa13cc10f53fa8acc4f https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py39h15b0fa6_5.conda#85e186c7ff673b0d0026782ec353fb2a +https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py39h44dd56e_0.conda#baea2f5dfb3ab7b1c836385d2e1daca7 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py39h7633fee_0.conda#bdc188e59857d6efab332714e0d01d93 diff --git a/requirements/py310.yml b/requirements/py310.yml index bcefe256..019bb5af 100644 --- a/requirements/py310.yml +++ b/requirements/py310.yml @@ -19,9 +19,10 @@ dependencies: - pip # Test dependencies. - - mock - filelock - requests - iris-sample-data - pytest + - pytest-mock + diff --git a/requirements/py311.yml b/requirements/py311.yml index f4a65fba..133ba2da 100644 --- a/requirements/py311.yml +++ b/requirements/py311.yml @@ -19,12 +19,12 @@ dependencies: - pip # Test dependencies. - - mock - filelock - requests - iris-sample-data - pytest + - pytest-mock # Documentation dependencies. - sphinx - - sphinx_rtd_theme \ No newline at end of file + - sphinx_rtd_theme diff --git a/requirements/py39.yml b/requirements/py39.yml index 078ae302..5aedb9fa 100644 --- a/requirements/py39.yml +++ b/requirements/py39.yml @@ -19,9 +19,9 @@ dependencies: - pip # Test dependencies. - - mock - filelock - requests - iris-sample-data - pytest + - pytest-mock diff --git a/requirements/test.txt b/requirements/test.txt index 3a1d4d2e..8fc06edb 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,7 +1,7 @@ # Test dependencies. -mock filelock requests iris-sample-data pytest +pytest-mock From ce94f2417eb7d5f15d690086847876f1e358212a Mon Sep 17 00:00:00 2001 From: Bill Little Date: Tue, 16 Apr 2024 16:38:25 +0100 Subject: [PATCH 273/583] fix ci-tests nose workaround (#425) --- .github/workflows/ci-tests.yml | 9 ++++----- noxfile.py | 6 +++--- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci-tests.yml b/.github/workflows/ci-tests.yml index 95c1c92a..638683a8 100644 --- a/.github/workflows/ci-tests.yml +++ b/.github/workflows/ci-tests.yml @@ -37,13 +37,12 @@ jobs: os: ["ubuntu-latest"] python-version: ["3.11"] session: ["doctest"] - # conda-forge doesn't fit within nose char limits, change with pytest - iris-source : ["condaforge"] + iris-source : ["conda-forge"] include: - os: "ubuntu-latest" python-version: "3.11" session: "tests" - iris-source: "condaforge" + iris-source: "conda-forge" - os: "ubuntu-latest" python-version: "3.11" session: "tests" @@ -51,11 +50,11 @@ jobs: - os: "ubuntu-latest" python-version: "3.10" session: "tests" - iris-source: "condaforge" + iris-source: "conda-forge" - os: "ubuntu-latest" python-version: "3.9" session: "tests" - iris-source: "condaforge" + iris-source: "conda-forge" env: IRIS_TEST_DATA_VERSION: "2.24" diff --git a/noxfile.py b/noxfile.py index 687f463a..ff2711e2 100644 --- a/noxfile.py +++ b/noxfile.py @@ -163,7 +163,7 @@ def _install_and_cache_venv(session: nox.sessions.Session) -> None: @contextmanager def prepare_venv( - session: nox.sessions.Session, iris_source: str = 'conda_forge' + session: nox.sessions.Session, iris_source: str = 'conda-forge' ) -> None: """ Create and cache the nox session conda environment, and additionally @@ -177,7 +177,7 @@ def prepare_venv( A `nox.sessions.Session` object. iris_source: str - Determines where Iris was sourced from. Either 'conda_forge' (the + Determines where Iris was sourced from. Either 'conda-forge' (the default), or 'source' which refers to the Iris main branch. Notes @@ -302,7 +302,7 @@ def tests(session: nox.sessions.Session, iris_source: str): A `nox.sessions.Session` object. iris_source: str - Either 'conda_forge' if using Iris from conda-forge, or 'source' if + Either 'conda-forge' if using Iris from conda-forge, or 'source' if installing Iris from the Iris' main branch. """ From e632a162a66a2f93ab3cfc6c89cfac5adbf3eb54 Mon Sep 17 00:00:00 2001 From: stephenworsley <49274989+stephenworsley@users.noreply.github.com> Date: Wed, 17 Apr 2024 14:59:28 +0100 Subject: [PATCH 274/583] improve pyproject.toml (#429) --- .coveragerc | 17 ----------------- pyproject.toml | 12 +++++++++++- 2 files changed, 11 insertions(+), 18 deletions(-) delete mode 100644 .coveragerc diff --git a/.coveragerc b/.coveragerc deleted file mode 100644 index 4548c2e2..00000000 --- a/.coveragerc +++ /dev/null @@ -1,17 +0,0 @@ -# -# .coveragerc to control coverage.py -# - -[run] -branch = True -omit = - setup.py - iris_grib/tests/* - .eggs/* - - -[report] -exclude_lines = - pragma: no cover - def __repr__ - if __name__ == .__main__.: diff --git a/pyproject.toml b/pyproject.toml index 5a054c51..115f6902 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,3 +1,5 @@ +# See https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html + [build-system] # Defined by PEP 518 requires = [ @@ -65,7 +67,10 @@ optional-dependencies.test = {file = "requirements/test.txt"} [tool.setuptools.packages.find] include = ["iris_grib*"] +#------------------------------------------------------------------------------ + [tool.coverage.run] +# See https://coverage.readthedocs.io/en/latest/config.html branch = true source = [ "iris_grib", @@ -77,14 +82,17 @@ omit = [ [tool.coverage.report] exclude_lines = [ "pragma: no cover", + "def __repr__", "if __name__ == .__main__.:" ] [tool.codespell] +# See https://github.com/codespell-project/codespell/tree/master?tab=readme-ov-file#using-a-config-file ignore-words-list = "alpha-numeric,degreee,discontiguities,lazyness,meaned,nin" skip = "_build,*.css,*.ipynb,*.js,*.html,*.svg,*.xml,.git,generated" [tool.mypy] +# See https://mypy.readthedocs.io/en/stable/config_file.html ignore_missing_imports = true warn_unused_configs = true enable_error_code = ["ignore-without-code", "redundant-expr", "truthy-bool"] @@ -92,8 +100,10 @@ exclude = [ 'noxfile\.py', 'docs/conf\.py' ] +strict = false # Default value, make true when introducing type hinting. [tool.pytest.ini_options] +# See https://docs.pytest.org/en/stable/reference/customize.html addopts = [ "--doctest-continue-on-failure", "--doctest-modules", @@ -103,7 +113,7 @@ addopts = [ "-v", ] doctest_optionflags = "NORMALIZE_WHITESPACE ELLIPSIS NUMBER" -# configure logging as recommended by repo-review +# configure settings as recommended by repo-review: log_cli = "True" log_cli_level = "INFO" minversion = "6.0" From d09f671597e38abef3fba94eb8d3ed939c1c610c Mon Sep 17 00:00:00 2001 From: stephenworsley <49274989+stephenworsley@users.noreply.github.com> Date: Wed, 17 Apr 2024 15:45:14 +0100 Subject: [PATCH 275/583] remove _iris_mercator_support.py (#433) --- iris_grib/_iris_mercator_support.py | 25 ------------------------- iris_grib/_load_convert.py | 4 ---- iris_grib/_save_rules.py | 4 ---- 3 files changed, 33 deletions(-) delete mode 100644 iris_grib/_iris_mercator_support.py diff --git a/iris_grib/_iris_mercator_support.py b/iris_grib/_iris_mercator_support.py deleted file mode 100644 index 6d23831f..00000000 --- a/iris_grib/_iris_mercator_support.py +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright iris-grib contributors -# -# This file is part of iris-grib and is released under the BSD license. -# See LICENSE in the root of the repository for full licensing details. -""" -Temporary module to check for the extended Mercator class in Iris, -which iris-grib requires for its Mercator support. - -""" - -from packaging.version import Version - -import iris - - -def confirm_extended_mercator_supported(): - # Check that Iris version is at least 2.1, required for 'standard_parallel' - # support in the Mercator coord-system. - # This is a temporary fix allowing us to state Iris>=2.0 as a dependency, - # required for this release because Iris 2.1 is not yet available. - iris_version = Version(iris.__version__) - min_mercator_version = Version('2.1.0') - if iris_version < min_mercator_version: - msg = 'Support for Mercator projections requires Iris version >= {}' - raise ValueError(msg.format(min_mercator_version)) diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index df4ba7e4..d0389565 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -30,7 +30,6 @@ ReferenceTarget from iris.util import _is_circular -from ._iris_mercator_support import confirm_extended_mercator_supported from ._grib1_load_rules import grib1_convert @@ -777,9 +776,6 @@ def grid_definition_template_10(section, metadata): # intersects the Earth standard_parallel = section['LaD'] * _GRID_ACCURACY_IN_DEGREES - # Check and raise a more intelligible error, if the Iris version is too old - # to support the Mercator 'standard_parallel' keyword. - confirm_extended_mercator_supported() cs = icoord_systems.Mercator(standard_parallel=standard_parallel, ellipsoid=geog_cs) diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index df1be8d2..9ade6b8e 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -26,7 +26,6 @@ from iris.exceptions import TranslationError -from ._iris_mercator_support import confirm_extended_mercator_supported from . import grib_phenom_translation as gptx from ._load_convert import (_STATISTIC_TYPE_NAMES, _TIME_RANGE_UNITS, _SPATIAL_PROCESSING_TYPES) @@ -498,9 +497,6 @@ def grid_definition_template_10(cube, grib): eccodes.codes_set(grib, "longitudeOfLastGridPoint", int(np.round(last_x / _DEFAULT_DEGREES_UNITS))) - # Check and raise a more intelligible error, if the Iris version is too old - # to support the Mercator 'standard_parallel' property. - confirm_extended_mercator_supported() # Encode the latitude at which the projection intersects the Earth. eccodes.codes_set(grib, 'LaD', cs.standard_parallel / _DEFAULT_DEGREES_UNITS) From 669a5daf1433a99766f0ecbf1513758f3c97e6d6 Mon Sep 17 00:00:00 2001 From: Henry Wright <84939917+HGWright@users.noreply.github.com> Date: Wed, 17 Apr 2024 22:20:34 +0100 Subject: [PATCH 276/583] Ruff adopt (#430) * add ruff and config * remove black formatting * ruff formatting and fixing checks * remove flake8 in all places * make changes and reformat * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .flake8 | 4 - .pre-commit-config.yaml | 23 +- .ruff.toml | 207 +++ docs/conf.py | 59 +- iris_grib/__init__.py | 381 +++-- iris_grib/_grib1_load_rules.py | 238 ++- iris_grib/_grib_cf_map.py | 521 ++++--- iris_grib/_iris_mercator_support.py | 25 + iris_grib/_load_convert.py | 1381 +++++++++-------- iris_grib/_save_rules.py | 712 +++++---- iris_grib/grib_phenom_translation.py | 237 +-- iris_grib/message.py | 142 +- iris_grib/tests/__init__.py | 38 +- .../format_interop/test_name_grib.py | 10 +- .../format_interop/test_pp_grib.py | 8 +- .../load_convert/test_data_section.py | 10 +- .../load_convert/test_load_hybrid_coords.py | 65 +- .../test_product_definition_section.py | 8 +- .../load_convert/test_sample_file_loads.py | 15 +- .../test_WAFC_mapping_round_trip.py | 20 +- .../test_grid_definition_section.py | 19 +- .../test_hybrid_coords_round_trip.py | 23 +- .../test_product_definition_section.py | 7 +- .../integration/save_rules/test_grib_save.py | 44 +- .../test_grid_definition_section.py | 54 +- .../save_rules/test_save_hybrid_coords.py | 64 +- iris_grib/tests/test_license_headers.py | 59 +- iris_grib/tests/unit/__init__.py | 128 +- .../grib1_load_rules/test_grib1_convert.py | 113 +- .../test_grib1_load_translations.py | 19 +- .../test_grib_phenom_translation.py | 216 +-- iris_grib/tests/unit/load_convert/__init__.py | 18 +- .../unit/load_convert/test__hindcast_fix.py | 16 +- .../unit/load_convert/test_bitmap_section.py | 7 +- .../load_convert/test_calculate_increment.py | 2 +- .../tests/unit/load_convert/test_convert.py | 20 +- .../unit/load_convert/test_data_cutoff.py | 8 +- .../test_data_representation_section.py | 10 +- .../tests/unit/load_convert/test_ellipsoid.py | 18 +- .../load_convert/test_ellipsoid_geometry.py | 16 +- .../load_convert/test_ensemble_identifier.py | 18 +- .../test_fixup_float32_from_int32.py | 6 +- .../test_fixup_int32_from_uint32.py | 2 +- .../test_forecast_period_coord.py | 25 +- .../load_convert/test_generating_process.py | 23 +- .../unit/load_convert/test_grib2_convert.py | 66 +- .../test_grid_definition_template_0_and_1.py | 163 +- .../test_grid_definition_template_10.py | 67 +- .../test_grid_definition_template_12.py | 114 +- .../test_grid_definition_template_140.py | 75 +- .../test_grid_definition_template_20.py | 86 +- .../test_grid_definition_template_30.py | 85 +- .../test_grid_definition_template_40.py | 189 ++- .../test_grid_definition_template_4_and_5.py | 131 +- .../test_grid_definition_template_5.py | 68 +- .../test_grid_definition_template_90.py | 161 +- .../load_convert/test_other_time_coord.py | 94 +- .../test_product_definition_section.py | 55 +- .../test_product_definition_template_0.py | 77 +- .../test_product_definition_template_1.py | 45 +- .../test_product_definition_template_10.py | 63 +- .../test_product_definition_template_11.py | 95 +- .../test_product_definition_template_15.py | 63 +- .../test_product_definition_template_31.py | 26 +- .../test_product_definition_template_32.py | 35 +- .../test_product_definition_template_40.py | 33 +- .../test_product_definition_template_6.py | 41 +- .../test_product_definition_template_8.py | 56 +- .../test_product_definition_template_9.py | 54 +- .../load_convert/test_projection_centre.py | 4 +- .../load_convert/test_reference_time_coord.py | 48 +- .../load_convert/test_resolution_flags.py | 2 +- .../load_convert/test_satellite_common.py | 38 +- .../unit/load_convert/test_scanning_mode.py | 17 +- .../test_statistical_cell_method.py | 74 +- .../test_statistical_forecast_period_coord.py | 37 +- .../unit/load_convert/test_time_range_unit.py | 20 +- .../load_convert/test_translate_phenomenon.py | 61 +- .../tests/unit/load_convert/test_unscale.py | 12 +- .../load_convert/test_validity_time_coord.py | 19 +- .../unit/load_convert/test_vertical_coords.py | 215 +-- .../tests/unit/message/test_GribMessage.py | 229 +-- iris_grib/tests/unit/message/test_Section.py | 53 +- .../tests/unit/message/test__DataProxy.py | 10 +- .../unit/message/test__MessageLocation.py | 12 +- .../unit/message/test__RawGribMessage.py | 14 +- iris_grib/tests/unit/save_rules/__init__.py | 25 +- .../test__missing_forecast_period.py | 35 +- .../test__non_missing_forecast_period.py | 12 +- ...product_definition_template_8_10_and_11.py | 164 +- .../unit/save_rules/test_data_section.py | 82 +- .../save_rules/test_fixup_float32_as_int32.py | 2 +- .../save_rules/test_fixup_int32_as_uint32.py | 2 +- .../test_grid_definition_template_0.py | 39 +- .../test_grid_definition_template_1.py | 82 +- .../test_grid_definition_template_10.py | 50 +- .../test_grid_definition_template_12.py | 74 +- .../test_grid_definition_template_140.py | 78 +- .../test_grid_definition_template_30.py | 71 +- .../test_grid_definition_template_4.py | 36 +- .../test_grid_definition_template_5.py | 87 +- .../unit/save_rules/test_identification.py | 17 +- .../test_product_definition_template_1.py | 31 +- .../test_product_definition_template_10.py | 31 +- .../test_product_definition_template_11.py | 30 +- .../test_product_definition_template_15.py | 139 +- .../test_product_definition_template_40.py | 21 +- .../test_product_definition_template_6.py | 23 +- .../test_product_definition_template_8.py | 19 +- .../unit/save_rules/test_reference_time.py | 15 +- .../test_set_discipline_and_parameter.py | 29 +- .../save_rules/test_set_fixed_surfaces.py | 204 +-- .../save_rules/test_set_time_increment.py | 84 +- .../unit/save_rules/test_set_time_range.py | 68 +- iris_grib/tests/unit/test_GribWrapper.py | 77 +- iris_grib/tests/unit/test__load_generate.py | 23 +- iris_grib/tests/unit/test_load_cubes.py | 6 +- iris_grib/tests/unit/test_save_grib2.py | 4 +- iris_grib/tests/unit/test_save_messages.py | 13 +- noxfile.py | 70 +- pyproject.toml | 42 + 121 files changed, 5259 insertions(+), 4372 deletions(-) delete mode 100644 .flake8 create mode 100644 .ruff.toml create mode 100644 iris_grib/_iris_mercator_support.py diff --git a/.flake8 b/.flake8 deleted file mode 100644 index 2a930a03..00000000 --- a/.flake8 +++ /dev/null @@ -1,4 +0,0 @@ -[flake8] -exclude = - # Auto-generated file - iris_grib/_grib_cf_map.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 5032e66d..9786d478 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -29,15 +29,14 @@ repos: # Don't commit to main branch. - id: no-commit-to-branch -# TODO: pending the addition of ruff, including config file(s) - iris-grib#384 -#- repo: https://github.com/astral-sh/ruff-pre-commit -# rev: "v0.3.4" -# hooks: -# - id: ruff -# types: [file, python] -# args: [--fix, --show-fixes] -# - id: ruff-format -# types: [file, python] +- repo: https://github.com/astral-sh/ruff-pre-commit + rev: "v0.3.4" + hooks: + - id: ruff + types: [file, python] + args: [--fix, --show-fixes] + - id: ruff-format + types: [file, python] - repo: https://github.com/codespell-project/codespell rev: "v2.2.6" @@ -46,12 +45,6 @@ repos: types_or: [asciidoc, python, markdown, rst] additional_dependencies: [tomli] -- repo: https://github.com/PyCQA/flake8 - rev: 7.0.0 - hooks: - - id: flake8 - types: [file, python] - - repo: https://github.com/asottile/blacken-docs rev: 1.16.0 hooks: diff --git a/.ruff.toml b/.ruff.toml new file mode 100644 index 00000000..a976ca9f --- /dev/null +++ b/.ruff.toml @@ -0,0 +1,207 @@ +extend = "pyproject.toml" + +lint.ignore = [ + # pydocstyle (D) + # https://docs.astral.sh/ruff/rules/#pydocstyle-d + "D100", # Missing docstring in public module + "D101", # Missing docstring in public class + "D102", # Missing docstring in public method + "D103", # Missing docstring in public function + "D105", # Missing docstring in magic method + "D200", # One-line docstring should fit on one line + "D202", # No blank lines allowed after function docstring + "D205", # 1 blank line required between summary line and description + "D212", # Multi-line docstring summary should start at the second line + "D300", # Use triple double quotes """ + "D301", # Use r""" if any backslashes in a docstring + "D400", # First line should end with a period + "D401", # First line of docstring should be in imperative mood + "D406", # Section name should end with a newline + "D407", # Missing dashed underline after section + + # isort (I) + # https://docs.astral.sh/ruff/rules/#isort-i + "I001", # Import block is un-sorted or un-formatted + + # Numpy-specific rules (NPY) + # https://docs.astral.sh/ruff/rules/#numpy-specific-rules-npy + "NPY002", + + # flake8-builtins (A) + # https://docs.astral.sh/ruff/rules/#flake8-builtins-a + "A001", + "A002", + + # flake8-annotations (ANN) + "ANN001", + "ANN002", + "ANN003", + "ANN101", + "ANN102", + "ANN201", + "ANN202", + "ANN204", + "ANN205", + "ANN206", + + # flake8-unused-arguments (ARG) + # https://docs.astral.sh/ruff/rules/#flake8-unused-arguments-arg + "ARG001", + "ARG002", + "ARG005", + + # flake8-bugbear (B) + # https://docs.astral.sh/ruff/rules/#flake8-bugbear-b + "B007", + "B018", + "B028", + "B904", + + # flake8-blind-except (BLE) + # https://docs.astral.sh/ruff/rules/#flake8-blind-except-ble + "BLE001", + + # flake8-comprehensions (C4) + # https://docs.astral.sh/ruff/rules/#flake8-comprehensions-c4 + "C408", + "C901", + + # flake8-datetimez (DTZ) + # https://docs.astral.sh/ruff/rules/#flake8-datetimez-dtz + "DTZ001", + "DTZ006", + + # flake8-errmsg (EM) + "EM101", + "EM102", + "EM103", + + # eradicate (ERA) + # https://docs.astral.sh/ruff/rules/#eradicate-era + "ERA001", + + # flake8-boolean-trap (FBT) + # https://docs.astral.sh/ruff/rules/#flake8-boolean-trap-fbt + "FBT001", + "FBT002", + "FBT003", + + # flake8-fixme (FIX) + # https://docs.astral.sh/ruff/rules/#flake8-fixme-fix + "FIX002", + "FIX003", + + # pep8-naming (N) + # https://docs.astral.sh/ruff/rules/#pep8-naming-n + "N801", + "N802", + "N803", + "N806", + "N999", + + # Perflint (PERF) + # https://docs.astral.sh/ruff/rules/#perflint-perf + "PERF203", + "PERF401", + + # Refactor (R) + # https://docs.astral.sh/ruff/rules/#refactor-r + "PLR0402", + "PLR0912", + "PLR0913", + "PLR0915", + "PLR1714", + "PLR1722", + "PLR2004", + "PLR5501", + + # Warning (W) + # https://docs.astral.sh/ruff/rules/#warning-w + "PLW0602", + "PLW2901", + + # flake8-pytest-style (PT) + "PT009", + "PT027", + + # flake8-use-pathlib (PTH) + # https://docs.astral.sh/ruff/rules/#flake8-use-pathlib-pth + "PTH100", + "PTH107", + "PTH110", + "PTH111", + "PTH112", + "PTH113", + "PTH118", + "PTH120", + "PTH122", + "PTH123", + + # flake8-pyi (PYI) + # https://docs.astral.sh/ruff/rules/#flake8-pyi-pyi + "PYI024", + + # flake8-return (RET) + # https://docs.astral.sh/ruff/rules/#flake8-return-ret + "RET503", + "RET504", + "RET505", + "RET506", + + # flake8-raise (RSE) + # https://docs.astral.sh/ruff/rules/#flake8-raise-rse + "RSE102", + + # Ruff-specific rules (RUF) + # https://docs.astral.sh/ruff/rules/#ruff-specific-rules-ruf + "RUF005", + "RUF012", + "RUF015", + + # flake8-bandit (S) + # https://docs.astral.sh/ruff/rules/#flake8-bandit-s + "S101", + "S110", + "S603", + "S607", + + # flake8-simplify (SIM) + # https://docs.astral.sh/ruff/rules/#flake8-simplify-sim + "SIM102", + "SIM108", + "SIM115", + "SIM117", + "SIM118", + + # flake8-self (SLF) + # https://docs.astral.sh/ruff/rules/#flake8-self-slf + "SLF001", + + # flake8-print (T20) + # https://docs.astral.sh/ruff/rules/#flake8-print-t20 + "T201", + + # flake8-todos (TD) + # https://docs.astral.sh/ruff/rules/#flake8-todos-td + "TD001", + "TD002", + "TD003", + "TD004", + "TD005", + "TD006", + + # tryceratops (TRY) + # https://docs.astral.sh/ruff/rules/#tryceratops-try + "TRY003", + "TRY004", + "TRY301", + + # pyupgrade (UP) + # https://docs.astral.sh/ruff/rules/#pyupgrade-up + "UP008", + "UP009", + "UP018", + "UP027", + "UP031", + "UP032", +] \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py index 547a6846..432e253d 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -19,7 +19,7 @@ # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. -sys.path.append(os.path.abspath('..')) +sys.path.append(os.path.abspath("..")) # -- General configuration ------------------------------------------------ @@ -30,29 +30,29 @@ # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ - 'sphinx.ext.autodoc', - 'sphinx.ext.doctest', - 'sphinx.ext.intersphinx', + "sphinx.ext.autodoc", + "sphinx.ext.doctest", + "sphinx.ext.intersphinx", ] # Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] +templates_path = ["_templates"] # The suffix(es) of source filenames. # You can specify multiple suffix as a list of string: # source_suffix = ['.rst', '.md'] -source_suffix = '.rst' +source_suffix = ".rst" # The encoding of source files. # source_encoding = 'utf-8-sig' # The master toctree document. -master_doc = 'index' +master_doc = "index" # General information about the project. -project = u'iris-grib' -copyright = u'2022, Met Office' -author = u'Met Office' +project = "iris-grib" +copyright = "2022, Met Office" +author = "Met Office" # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the @@ -76,7 +76,7 @@ # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This patterns also effect to html_static_path and html_extra_path -exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] +exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] # The reST default role (used for this markup: `text`) to use for all # documents. @@ -94,7 +94,7 @@ # show_authors = False # The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' +pygments_style = "sphinx" # A list of ignored prefixes for module index sorting. # modindex_common_prefix = [] @@ -108,15 +108,15 @@ # -- Autodoc ------------------------------------------------------------------ -autodoc_member_order = 'groupwise' -autodoc_default_flags = ['show-inheritance'] +autodoc_member_order = "groupwise" +autodoc_default_flags = ["show-inheritance"] # -- Options for HTML output ---------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. -html_theme = 'sphinx_rtd_theme' +html_theme = "sphinx_rtd_theme" # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the @@ -210,20 +210,17 @@ # html_search_scorer = 'scorer.js' # Output file base name for HTML help builder. -htmlhelp_basename = 'iris-gribdoc' +htmlhelp_basename = "iris-gribdoc" # -- Options for LaTeX output --------------------------------------------- latex_elements = { # The paper size ('letterpaper' or 'a4paper'). # 'papersize': 'letterpaper', - # The font size ('10pt', '11pt' or '12pt'). # 'pointsize': '10pt', - # Additional stuff for the LaTeX preamble. # 'preamble': '', - # Latex figure (float) alignment # 'figure_align': 'htbp', } @@ -232,8 +229,7 @@ # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ - (master_doc, 'iris-grib.tex', u'iris-grib Documentation', - u'Met Office', 'manual'), + (master_doc, "iris-grib.tex", "iris-grib Documentation", "Met Office", "manual"), ] # The name of an image file (relative to this directory) to place at the top of @@ -261,10 +257,7 @@ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). -man_pages = [ - (master_doc, 'iris-grib', u'iris-grib Documentation', - [author], 1) -] +man_pages = [(master_doc, "iris-grib", "iris-grib Documentation", [author], 1)] # If true, show URL addresses after external links. # man_show_urls = False @@ -276,9 +269,15 @@ # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - (master_doc, 'iris-grib', u'iris-grib Documentation', - author, 'iris-grib', 'One line description of project.', - 'Miscellaneous'), + ( + master_doc, + "iris-grib", + "iris-grib Documentation", + author, + "iris-grib", + "One line description of project.", + "Miscellaneous", + ), ] # Documents to append as an appendix to all manuals. @@ -296,6 +295,6 @@ # Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = { - 'python': ('https://docs.python.org/', None), - 'iris': ('https://scitools-iris.readthedocs.io/en/latest/', None), + "python": ("https://docs.python.org/", None), + "iris": ("https://scitools-iris.readthedocs.io/en/latest/", None), } diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index 17778c3e..7460286a 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -30,7 +30,7 @@ from .message import GribMessage -__version__ = '0.20.dev0' +__version__ = "0.20.dev0" __all__ = [ "load_cubes", @@ -41,31 +41,53 @@ ] -CENTRE_TITLES = {'egrr': 'U.K. Met Office - Exeter', - 'ecmf': 'European Centre for Medium Range Weather Forecasts', - 'rjtd': 'Tokyo, Japan Meteorological Agency', - '55': 'San Francisco', - 'kwbc': ('US National Weather Service, National Centres for ' - 'Environmental Prediction')} +CENTRE_TITLES = { + "egrr": "U.K. Met Office - Exeter", + "ecmf": "European Centre for Medium Range Weather Forecasts", + "rjtd": "Tokyo, Japan Meteorological Agency", + "55": "San Francisco", + "kwbc": ( + "US National Weather Service, National Centres for " "Environmental Prediction" + ), +} -TIME_RANGE_INDICATORS = {0: 'none', 1: 'none', 3: 'time mean', 4: 'time sum', - 5: 'time _difference', 10: 'none', - # TODO #567 Further exploration of following mappings - 51: 'time mean', 113: 'time mean', 114: 'time sum', - 115: 'time mean', 116: 'time sum', 117: 'time mean', - 118: 'time _covariance', 123: 'time mean', - 124: 'time sum', 125: 'time standard_deviation'} +TIME_RANGE_INDICATORS = { + 0: "none", + 1: "none", + 3: "time mean", + 4: "time sum", + 5: "time _difference", + 10: "none", + # TODO #567 Further exploration of following mappings + 51: "time mean", + 113: "time mean", + 114: "time sum", + 115: "time mean", + 116: "time sum", + 117: "time mean", + 118: "time _covariance", + 123: "time mean", + 124: "time sum", + 125: "time standard_deviation", +} -PROCESSING_TYPES = {0: 'time mean', 1: 'time sum', 2: 'time maximum', - 3: 'time minimum', 4: 'time _difference', - 5: 'time _root mean square', 6: 'time standard_deviation', - 7: 'time _convariance', 8: 'time _difference', - 9: 'time _ratio'} +PROCESSING_TYPES = { + 0: "time mean", + 1: "time sum", + 2: "time maximum", + 3: "time minimum", + 4: "time _difference", + 5: "time _root mean square", + 6: "time standard_deviation", + 7: "time _convariance", + 8: "time _difference", + 9: "time _ratio", +} TIME_CODES_EDITION1 = { - 0: ('minutes', 60), - 1: ('hours', 60*60), - 2: ('days', 24*60*60), + 0: ("minutes", 60), + 1: ("hours", 60 * 60), + 2: ("days", 24 * 60 * 60), # NOTE: do *not* support calendar-dependent units at all. # So the following possible keys remain unsupported: # 3: 'months', @@ -73,12 +95,12 @@ # 5: 'decades', # 6: '30 years', # 7: 'century', - 10: ('3 hours', 3*60*60), - 11: ('6 hours', 6*60*60), - 12: ('12 hours', 12*60*60), - 13: ('15 minutes', 15*60), - 14: ('30 minutes', 30*60), - 254: ('seconds', 1), + 10: ("3 hours", 3 * 60 * 60), + 11: ("6 hours", 6 * 60 * 60), + 12: ("12 hours", 12 * 60 * 60), + 13: ("15 minutes", 15 * 60), + 14: ("30 minutes", 30 * 60), + 254: ("seconds", 1), } unknown_string = "???" @@ -87,7 +109,7 @@ class GribDataProxy: """A reference to the data payload of a single Grib message.""" - __slots__ = ('shape', 'dtype', 'path', 'offset') + __slots__ = ("shape", "dtype", "path", "offset") def __init__(self, shape, dtype, path, offset): self.shape = shape @@ -100,7 +122,7 @@ def ndim(self): return len(self.shape) def __getitem__(self, keys): - with open(self.path, 'rb') as grib_fh: + with open(self.path, "rb") as grib_fh: grib_fh.seek(self.offset) grib_message = eccodes.codes_new_from_file( grib_fh, eccodes.CODES_PRODUCT_GRIB @@ -113,9 +135,11 @@ def __getitem__(self, keys): return result def __repr__(self): - msg = '<{self.__class__.__name__} shape={self.shape} ' \ - 'dtype={self.dtype!r} ' \ - 'path={self.path!r} offset={self.offset}>' + msg = ( + "<{self.__class__.__name__} shape={self.shape} " + "dtype={self.dtype!r} " + "path={self.path!r} offset={self.offset}>" + ) return msg.format(self=self) def __getstate__(self): @@ -140,9 +164,8 @@ def __init__(self, grib_message, grib_fh=None): self.grib_message = grib_message if self.edition != 1: - emsg = 'GRIB edition {} is not supported by {!r}.' - raise TranslationError(emsg.format(self.edition, - type(self).__name__)) + emsg = "GRIB edition {} is not supported by {!r}." + raise TranslationError(emsg.format(self.edition, type(self).__name__)) deferred = grib_fh is not None @@ -159,19 +182,17 @@ def __init__(self, grib_message, grib_fh=None): self._compute_extra_keys() # Calculate the data payload shape. - shape = (eccodes.codes_get_long(grib_message, 'numberOfValues'),) + shape = (eccodes.codes_get_long(grib_message, "numberOfValues"),) - if not self.gridType.startswith('reduced'): + if not self.gridType.startswith("reduced"): ni, nj = self.Ni, self.Nj - j_fast = eccodes.codes_get_long(grib_message, - 'jPointsAreConsecutive') + j_fast = eccodes.codes_get_long(grib_message, "jPointsAreConsecutive") shape = (nj, ni) if j_fast == 0 else (ni, nj) if deferred: # Wrap the reference to the data payload within the data proxy # in order to support deferred data loading. - proxy = GribDataProxy(shape, np.array([0.]).dtype, grib_fh.name, - offset) + proxy = GribDataProxy(shape, np.array([0.0]).dtype, grib_fh.name, offset) self._data = as_lazy_data(proxy) else: self.data = _message_values(grib_message, shape) @@ -193,23 +214,17 @@ def __getattr__(self, key): # array...special case here... if key in ["values", "pv", "latitudes", "longitudes"]: res = eccodes.codes_get_double_array(self.grib_message, key) - elif key in ('typeOfFirstFixedSurface', - 'typeOfSecondFixedSurface'): + elif key in ("typeOfFirstFixedSurface", "typeOfSecondFixedSurface"): res = np.int32(eccodes.codes_get_long(self.grib_message, key)) else: - key_type = eccodes.codes_get_native_type( - self.grib_message, key) + key_type = eccodes.codes_get_native_type(self.grib_message, key) if key_type == int: - res = np.int32(eccodes.codes_get_long(self.grib_message, - key)) + res = np.int32(eccodes.codes_get_long(self.grib_message, key)) elif key_type == float: # Because some computer keys are floats, like # longitudeOfFirstGridPointInDegrees, a float32 # is not always enough... - res = np.float64(eccodes.codes_get_double( - self.grib_message, key - ) - ) + res = np.float64(eccodes.codes_get_double(self.grib_message, key)) elif key_type == str: res = eccodes.codes_get_string(self.grib_message, key) else: @@ -232,8 +247,10 @@ def _timeunit_detail(self): """Return the (string, seconds) describing the message time unit.""" unit_code = self.indicatorOfUnitOfTimeRange if unit_code not in TIME_CODES_EDITION1: - message = 'Unhandled time unit for forecast ' \ - 'indicatorOfUnitOfTimeRange : ' + str(unit_code) + message = ( + "Unhandled time unit for forecast " + "indicatorOfUnitOfTimeRange : " + str(unit_code) + ) raise NotYetImplementedError(message) return TIME_CODES_EDITION1[unit_code] @@ -254,10 +271,8 @@ def _compute_extra_keys(self): # regular or rotated grid? try: - longitudeOfSouthernPoleInDegrees = \ - self.longitudeOfSouthernPoleInDegrees - latitudeOfSouthernPoleInDegrees = \ - self.latitudeOfSouthernPoleInDegrees + longitudeOfSouthernPoleInDegrees = self.longitudeOfSouthernPoleInDegrees + latitudeOfSouthernPoleInDegrees = self.latitudeOfSouthernPoleInDegrees except AttributeError: longitudeOfSouthernPoleInDegrees = 0.0 latitudeOfSouthernPoleInDegrees = 90.0 @@ -265,29 +280,31 @@ def _compute_extra_keys(self): centre = eccodes.codes_get_string(self.grib_message, "centre") # default values - self.extra_keys = {'_referenceDateTime': -1.0, - '_phenomenonDateTime': -1.0, - '_periodStartDateTime': -1.0, - '_periodEndDateTime': -1.0, - '_levelTypeName': unknown_string, - '_levelTypeUnits': unknown_string, - '_firstLevelTypeName': unknown_string, - '_firstLevelTypeUnits': unknown_string, - '_firstLevel': -1.0, - '_secondLevelTypeName': unknown_string, - '_secondLevel': -1.0, - '_originatingCentre': unknown_string, - '_forecastTime': None, - '_forecastTimeUnit': unknown_string, - '_coord_system': None, - '_x_circular': False, - '_x_coord_name': unknown_string, - '_y_coord_name': unknown_string, - # These are here to avoid repetition in the rules - # files, and reduce the very long line lengths. - '_x_points': None, - '_y_points': None, - '_cf_data': None} + self.extra_keys = { + "_referenceDateTime": -1.0, + "_phenomenonDateTime": -1.0, + "_periodStartDateTime": -1.0, + "_periodEndDateTime": -1.0, + "_levelTypeName": unknown_string, + "_levelTypeUnits": unknown_string, + "_firstLevelTypeName": unknown_string, + "_firstLevelTypeUnits": unknown_string, + "_firstLevel": -1.0, + "_secondLevelTypeName": unknown_string, + "_secondLevel": -1.0, + "_originatingCentre": unknown_string, + "_forecastTime": None, + "_forecastTimeUnit": unknown_string, + "_coord_system": None, + "_x_circular": False, + "_x_coord_name": unknown_string, + "_y_coord_name": unknown_string, + # These are here to avoid repetition in the rules + # files, and reduce the very long line lengths. + "_x_points": None, + "_y_points": None, + "_cf_data": None, + } # cf phenomenon translation # Get centre code (N.B. self.centre has default type = string) @@ -296,16 +313,21 @@ def _compute_extra_keys(self): cf_data = gptx.grib1_phenom_to_cf_info( table2_version=self.table2Version, centre_number=centre_number, - param_number=self.indicatorOfParameter) - self.extra_keys['_cf_data'] = cf_data + param_number=self.indicatorOfParameter, + ) + self.extra_keys["_cf_data"] = cf_data # reference date - self.extra_keys['_referenceDateTime'] = \ - datetime.datetime(int(self.year), int(self.month), int(self.day), - int(self.hour), int(self.minute)) + self.extra_keys["_referenceDateTime"] = datetime.datetime( + int(self.year), + int(self.month), + int(self.day), + int(self.hour), + int(self.minute), + ) # forecast time with workarounds - self.extra_keys['_forecastTime'] = forecastTime + self.extra_keys["_forecastTime"] = forecastTime # verification date processingDone = self._get_processing_done() @@ -320,24 +342,24 @@ def _compute_extra_keys(self): endMinute = int(validityTime[2:4]) # fixed forecastTime in hours - self.extra_keys['_periodStartDateTime'] = \ - (self.extra_keys['_referenceDateTime'] + - datetime.timedelta(hours=int(forecastTime))) - self.extra_keys['_periodEndDateTime'] = \ - datetime.datetime(endYear, endMonth, endDay, endHour, - endMinute) + self.extra_keys["_periodStartDateTime"] = self.extra_keys[ + "_referenceDateTime" + ] + datetime.timedelta(hours=int(forecastTime)) + self.extra_keys["_periodEndDateTime"] = datetime.datetime( + endYear, endMonth, endDay, endHour, endMinute + ) else: - self.extra_keys['_phenomenonDateTime'] = \ - self._get_verification_date() + self.extra_keys["_phenomenonDateTime"] = self._get_verification_date() # originating centre # TODO #574 Expand to include sub-centre - self.extra_keys['_originatingCentre'] = CENTRE_TITLES.get( - centre, "unknown centre %s" % centre) + self.extra_keys["_originatingCentre"] = CENTRE_TITLES.get( + centre, "unknown centre %s" % centre + ) # forecast time unit as a cm string # TODO #575 Do we want PP or GRIB style forecast delta? - self.extra_keys['_forecastTimeUnit'] = self._timeunit_string() + self.extra_keys["_forecastTimeUnit"] = self._timeunit_string() # shape of the Earth oblate_Earth = self.resolutionAndComponentFlags & 0b0100000 @@ -351,26 +373,26 @@ def _compute_extra_keys(self): gridType = eccodes.codes_get_string(self.grib_message, "gridType") - if gridType in ["regular_ll", "regular_gg", "reduced_ll", - "reduced_gg"]: - self.extra_keys['_x_coord_name'] = "longitude" - self.extra_keys['_y_coord_name'] = "latitude" - self.extra_keys['_coord_system'] = geoid - elif gridType == 'rotated_ll': + if gridType in ["regular_ll", "regular_gg", "reduced_ll", "reduced_gg"]: + self.extra_keys["_x_coord_name"] = "longitude" + self.extra_keys["_y_coord_name"] = "latitude" + self.extra_keys["_coord_system"] = geoid + elif gridType == "rotated_ll": # TODO: Confirm the translation from angleOfRotation to # north_pole_lon (usually 0 for both) - self.extra_keys['_x_coord_name'] = "grid_longitude" - self.extra_keys['_y_coord_name'] = "grid_latitude" + self.extra_keys["_x_coord_name"] = "grid_longitude" + self.extra_keys["_y_coord_name"] = "grid_latitude" southPoleLon = longitudeOfSouthernPoleInDegrees southPoleLat = latitudeOfSouthernPoleInDegrees - self.extra_keys['_coord_system'] = \ - coord_systems.RotatedGeogCS( - -southPoleLat, - math.fmod(southPoleLon + 180.0, 360.0), - self.angleOfRotation, geoid) - elif gridType == 'polar_stereographic': - self.extra_keys['_x_coord_name'] = "projection_x_coordinate" - self.extra_keys['_y_coord_name'] = "projection_y_coordinate" + self.extra_keys["_coord_system"] = coord_systems.RotatedGeogCS( + -southPoleLat, + math.fmod(southPoleLon + 180.0, 360.0), + self.angleOfRotation, + geoid, + ) + elif gridType == "polar_stereographic": + self.extra_keys["_x_coord_name"] = "projection_x_coordinate" + self.extra_keys["_y_coord_name"] = "projection_y_coordinate" if self.projectionCentreFlag == 0: pole_lat = 90 @@ -380,14 +402,18 @@ def _compute_extra_keys(self): raise TranslationError("Unhandled projectionCentreFlag") # Note: I think the grib api defaults LaDInDegrees to 60 for grib1. - self.extra_keys['_coord_system'] = \ - coord_systems.Stereographic( - pole_lat, self.orientationOfTheGridInDegrees, 0, 0, - self.LaDInDegrees, ellipsoid=geoid) + self.extra_keys["_coord_system"] = coord_systems.Stereographic( + pole_lat, + self.orientationOfTheGridInDegrees, + 0, + 0, + self.LaDInDegrees, + ellipsoid=geoid, + ) - elif gridType == 'lambert': - self.extra_keys['_x_coord_name'] = "projection_x_coordinate" - self.extra_keys['_y_coord_name'] = "projection_y_coordinate" + elif gridType == "lambert": + self.extra_keys["_x_coord_name"] = "projection_x_coordinate" + self.extra_keys["_y_coord_name"] = "projection_y_coordinate" flag_name = "projectionCenterFlag" @@ -399,10 +425,14 @@ def _compute_extra_keys(self): raise TranslationError("Unhandled projectionCentreFlag") LambertConformal = coord_systems.LambertConformal - self.extra_keys['_coord_system'] = LambertConformal( - self.LaDInDegrees, self.LoVInDegrees, 0, 0, + self.extra_keys["_coord_system"] = LambertConformal( + self.LaDInDegrees, + self.LoVInDegrees, + 0, + 0, secant_latitudes=(self.Latin1InDegrees, self.Latin2InDegrees), - ellipsoid=geoid) + ellipsoid=geoid, + ) else: raise TranslationError("unhandled grid type: {}".format(gridType)) @@ -411,17 +441,20 @@ def _compute_extra_keys(self): j_step = self.jDirectionIncrementInDegrees if not self.jScansPositively: j_step = -j_step - self._y_points = (np.arange(self.Nj, dtype=np.float64) * j_step + - self.latitudeOfFirstGridPointInDegrees) + self._y_points = ( + np.arange(self.Nj, dtype=np.float64) * j_step + + self.latitudeOfFirstGridPointInDegrees + ) - elif gridType in ['regular_gg']: + elif gridType in ["regular_gg"]: # longitude coordinate is straight-forward self._regular_longitude_common() # get the distinct latitudes, and make sure they are sorted # (south-to-north) and then put them in the right direction # depending on the scan direction latitude_points = eccodes.codes_get_double_array( - self.grib_message, 'distinctLatitudes').astype(np.float64) + self.grib_message, "distinctLatitudes" + ).astype(np.float64) latitude_points.sort() if not self.jScansPositively: # we require latitudes north-to-south @@ -431,20 +464,21 @@ def _compute_extra_keys(self): elif gridType in ["polar_stereographic", "lambert"]: # convert the starting latlon into meters - cartopy_crs = self.extra_keys['_coord_system'].as_cartopy_crs() + cartopy_crs = self.extra_keys["_coord_system"].as_cartopy_crs() x1, y1 = cartopy_crs.transform_point( self.longitudeOfFirstGridPointInDegrees, self.latitudeOfFirstGridPointInDegrees, - ccrs.Geodetic()) + ccrs.Geodetic(), + ) if not np.all(np.isfinite([x1, y1])): - raise TranslationError("Could not determine the first latitude" - " and/or longitude grid point.") + raise TranslationError( + "Could not determine the first latitude" + " and/or longitude grid point." + ) - self._x_points = x1 + self.DxInMetres * np.arange(self.Nx, - dtype=np.float64) - self._y_points = y1 + self.DyInMetres * np.arange(self.Ny, - dtype=np.float64) + self._x_points = x1 + self.DxInMetres * np.arange(self.Nx, dtype=np.float64) + self._y_points = y1 + self.DyInMetres * np.arange(self.Ny, dtype=np.float64) elif gridType in ["reduced_ll", "reduced_gg"]: self._x_points = self.longitudes @@ -458,18 +492,20 @@ def _regular_longitude_common(self): i_step = self.iDirectionIncrementInDegrees if self.iScansNegatively: i_step = -i_step - self._x_points = (np.arange(self.Ni, dtype=np.float64) * i_step + - self.longitudeOfFirstGridPointInDegrees) - if "longitude" in self.extra_keys['_x_coord_name'] and self.Ni > 1: + self._x_points = ( + np.arange(self.Ni, dtype=np.float64) * i_step + + self.longitudeOfFirstGridPointInDegrees + ) + if "longitude" in self.extra_keys["_x_coord_name"] and self.Ni > 1: if _longitude_is_cyclic(self._x_points): - self.extra_keys['_x_circular'] = True + self.extra_keys["_x_circular"] = True def _get_processing_done(self): """Determine the type of processing that was done on the data.""" - processingDone = 'unknown' + processingDone = "unknown" timeRangeIndicator = self.timeRangeIndicator - default = 'time _grib1_process_unknown_%i' % timeRangeIndicator + default = "time _grib1_process_unknown_%i" % timeRangeIndicator processingDone = TIME_RANGE_INDICATORS.get(timeRangeIndicator, default) return processingDone @@ -526,8 +562,9 @@ def _get_verification_date(self): # only at the time (hour, minute) given in the reference time, # for all the days included in the P2 period. The units of P2 # are given by the contents of octet 18 and Table 4. - raise TranslationError("unhandled grib1 timeRangeIndicator " - "= 51 (avg of avgs)") + raise TranslationError( + "unhandled grib1 timeRangeIndicator " "= 51 (avg of avgs)" + ) elif time_range_indicator == 113: # Average of N forecasts (or initialized analyses); each # product has forecast period of P1 (P1=0 for initialized @@ -574,16 +611,16 @@ def _get_verification_date(self): # the reference time, at intervals of P2. time_diff = P1 else: - raise TranslationError("unhandled grib1 timeRangeIndicator " - "= %i" % time_range_indicator) + raise TranslationError( + "unhandled grib1 timeRangeIndicator " "= %i" % time_range_indicator + ) # Get the timeunit interval. interval_secs = self._timeunit_seconds() # Multiply by start-offset and convert to a timedelta. # NOTE: a 'float' conversion is required here, as time_diff may be # a numpy scalar, which timedelta will not accept. - interval_delta = datetime.timedelta( - seconds=float(time_diff * interval_secs)) + interval_delta = datetime.timedelta(seconds=float(time_diff * interval_secs)) # Return validity_time = (reference_time + start_offset*time_unit). return reference_date_time + interval_delta @@ -606,11 +643,10 @@ def phenomenon_points(self, time_unit): measured in the appropriate time units. """ - time_reference = '%s since epoch' % time_unit + time_reference = "%s since epoch" % time_unit return float( cf_units.date2num( - self._phenomenonDateTime, time_reference, - cf_units.CALENDAR_GREGORIAN + self._phenomenonDateTime, time_reference, cf_units.CALENDAR_GREGORIAN ) ) @@ -621,10 +657,12 @@ def phenomenon_bounds(self, time_unit): """ # TODO #576 Investigate when it's valid to get phenomenon_bounds - time_reference = '%s since epoch' % time_unit + time_reference = "%s since epoch" % time_unit unit = cf_units.Unit(time_reference, cf_units.CALENDAR_GREGORIAN) - return [float(unit.date2num(self._periodStartDateTime)), - float(unit.date2num(self._periodEndDateTime))] + return [ + float(unit.date2num(self._periodStartDateTime)), + float(unit.date2num(self._periodEndDateTime)), + ] def _longitude_is_cyclic(points): @@ -643,8 +681,8 @@ def _longitude_is_cyclic(points): def _message_values(grib_message, shape): - eccodes.codes_set_double(grib_message, 'missingValue', np.nan) - data = eccodes.codes_get_double_array(grib_message, 'values') + eccodes.codes_set_double(grib_message, "missingValue", np.nan) + data = eccodes.codes_get_double_array(grib_message, "values") data = data.reshape(shape) # Handle missing values in a sensible way. @@ -657,15 +695,14 @@ def _message_values(grib_message, shape): def _load_generate(filename): messages = GribMessage.messages_from_filename(filename) for message in messages: - editionNumber = message.sections[0]['editionNumber'] + editionNumber = message.sections[0]["editionNumber"] if editionNumber == 1: message_id = message._raw_message._message_id grib_fh = message._file_ref.open_file message = GribWrapper(message_id, grib_fh=grib_fh) elif editionNumber != 2: - emsg = 'GRIB edition {} is not supported by {!r}.' - raise TranslationError(emsg.format(editionNumber, - type(message).__name__)) + emsg = "GRIB edition {} is not supported by {!r}." + raise TranslationError(emsg.format(editionNumber, type(message).__name__)) yield message @@ -688,9 +725,8 @@ def load_cubes(filenames, callback=None): """ import iris.fileformats.rules as iris_rules - grib_loader = iris_rules.Loader(_load_generate, - {}, - load_convert) + + grib_loader = iris_rules.Loader(_load_generate, {}, load_convert) return iris_rules.load_cubes(filenames, callback, grib_loader) @@ -708,16 +744,16 @@ def load_pairs_from_fields(grib_messages): >>> import iris >>> from iris_grib import load_pairs_from_fields >>> from iris_grib.message import GribMessage - >>> filename = iris.sample_data_path('polar_stereo.grib2') + >>> filename = iris.sample_data_path("polar_stereo.grib2") >>> filtered_messages = [] >>> for message in GribMessage.messages_from_filename(filename): - ... if message.sections[1]['productionStatusOfProcessedData'] == 0: + ... if message.sections[1]["productionStatusOfProcessedData"] == 0: ... filtered_messages.append(message) >>> cubes_messages = load_pairs_from_fields(filtered_messages) >>> for cube, msg in cubes_messages: - ... prod_stat = msg.sections[1]['productionStatusOfProcessedData'] - ... cube.attributes['productionStatusOfProcessedData'] = prod_stat - >>> print(cube.attributes['productionStatusOfProcessedData']) + ... prod_stat = msg.sections[1]["productionStatusOfProcessedData"] + ... cube.attributes["productionStatusOfProcessedData"] = prod_stat + >>> print(cube.attributes["productionStatusOfProcessedData"]) 0 This capability can also be used to alter fields before they are passed to @@ -727,8 +763,8 @@ def load_pairs_from_fields(grib_messages): >>> from iris_grib import load_pairs_from_fields >>> cleaned_messages = GribMessage.messages_from_filename(filename) >>> for message in cleaned_messages: - ... if message.sections[1]['productionStatusOfProcessedData'] == 0: - ... message.sections[1]['productionStatusOfProcessedData'] = 4 + ... if message.sections[1]["productionStatusOfProcessedData"] == 0: + ... message.sections[1]["productionStatusOfProcessedData"] = 4 >>> cubes = load_pairs_from_fields(cleaned_messages) Args: @@ -742,6 +778,7 @@ def load_pairs_from_fields(grib_messages): """ import iris.fileformats.rules as iris_rules + return iris_rules.load_pairs_from_fields(grib_messages, load_convert) @@ -784,8 +821,8 @@ def save_pairs_from_cube(cube): list of cubes. """ - x_coords = cube.coords(axis='x', dim_coords=True) - y_coords = cube.coords(axis='y', dim_coords=True) + x_coords = cube.coords(axis="x", dim_coords=True) + y_coords = cube.coords(axis="y", dim_coords=True) if len(x_coords) != 1 or len(y_coords) != 1: raise TranslationError("Did not find one (and only one) x or y coord") diff --git a/iris_grib/_grib1_load_rules.py b/iris_grib/_grib1_load_rules.py index 73afe5aa..7a3d2c2c 100644 --- a/iris_grib/_grib1_load_rules.py +++ b/iris_grib/_grib1_load_rules.py @@ -12,7 +12,7 @@ from iris.aux_factory import HybridPressureFactory from iris.coords import AuxCoord, CellMethod, DimCoord from iris.exceptions import TranslationError -from iris.fileformats.rules import (ConversionMetadata, Factory, Reference) +from iris.fileformats.rules import ConversionMetadata, Factory, Reference def grib1_convert(grib): @@ -29,9 +29,8 @@ def grib1_convert(grib): """ if grib.edition != 1: - emsg = 'GRIB edition {} is not supported by {!r}.' - raise TranslationError(emsg.format(grib.edition, - type(grib).__name__)) + emsg = "GRIB edition {} is not supported by {!r}." + raise TranslationError(emsg.format(grib.edition, type(grib).__name__)) factories = [] references = [] @@ -49,10 +48,10 @@ def grib1_convert(grib): AuxCoord( grib._y_points, grib._y_coord_name, - units='degrees', + units="degrees", coord_system=grib._coord_system, ), - 0 + 0, ) ) aux_coords_and_dims.append( @@ -60,10 +59,10 @@ def grib1_convert(grib): AuxCoord( grib._x_points, grib._x_coord_name, - units='degrees', + units="degrees", coord_system=grib._coord_system, ), - 0 + 0, ) ) elif grib.gridType in ("regular_ll", "rotated_ll", "regular_gg"): @@ -77,10 +76,10 @@ def grib1_convert(grib): DimCoord( grib._y_points, grib._y_coord_name, - units='degrees', + units="degrees", coord_system=grib._coord_system, ), - j_points_are_consecutive + j_points_are_consecutive, ) ) dim_coords_and_dims.append( @@ -88,11 +87,11 @@ def grib1_convert(grib): DimCoord( grib._x_points, grib._x_coord_name, - units='degrees', + units="degrees", coord_system=grib._coord_system, circular=grib._x_circular, ), - int(not j_points_are_consecutive) + int(not j_points_are_consecutive), ) ) @@ -105,7 +104,7 @@ def grib1_convert(grib): units="m", coord_system=grib._coord_system, ), - 0 + 0, ) ) dim_coords_and_dims.append( @@ -116,49 +115,49 @@ def grib1_convert(grib): units="m", coord_system=grib._coord_system, ), - 1 + 1, ) ) - if \ - (grib.table2Version < 128) and \ - (grib.indicatorOfParameter == 11) and \ - (grib._cf_data is None): + if ( + (grib.table2Version < 128) + and (grib.indicatorOfParameter == 11) + and (grib._cf_data is None) + ): standard_name = "air_temperature" units = "kelvin" - if \ - (grib.table2Version < 128) and \ - (grib.indicatorOfParameter == 33) and \ - (grib._cf_data is None): + if ( + (grib.table2Version < 128) + and (grib.indicatorOfParameter == 33) + and (grib._cf_data is None) + ): standard_name = "x_wind" units = "m s-1" - if \ - (grib.table2Version < 128) and \ - (grib.indicatorOfParameter == 34) and \ - (grib._cf_data is None): + if ( + (grib.table2Version < 128) + and (grib.indicatorOfParameter == 34) + and (grib._cf_data is None) + ): standard_name = "y_wind" units = "m s-1" - if \ - (grib._cf_data is not None): + if grib._cf_data is not None: standard_name = grib._cf_data.standard_name long_name = grib._cf_data.standard_name or grib._cf_data.long_name units = grib._cf_data.units - if \ - (grib.table2Version >= 128) and \ - (grib._cf_data is None): - long_name = f"UNKNOWN LOCAL PARAM {grib.indicatorOfParameter}"\ - f".{grib.table2Version}" + if (grib.table2Version >= 128) and (grib._cf_data is None): + long_name = ( + f"UNKNOWN LOCAL PARAM {grib.indicatorOfParameter}" f".{grib.table2Version}" + ) units = "???" - if \ - (grib.table2Version == 1) and \ - (grib.indicatorOfParameter >= 128): - long_name = f"UNKNOWN LOCAL PARAM {grib.indicatorOfParameter}"\ - f".{grib.table2Version}" + if (grib.table2Version == 1) and (grib.indicatorOfParameter >= 128): + long_name = ( + f"UNKNOWN LOCAL PARAM {grib.indicatorOfParameter}" f".{grib.table2Version}" + ) units = "???" if grib._phenomenonDateTime != -1.0: @@ -166,119 +165,110 @@ def grib1_convert(grib): ( DimCoord( points=grib.startStep, - standard_name='forecast_period', + standard_name="forecast_period", units=grib._forecastTimeUnit, ), - None + None, ) ) aux_coords_and_dims.append( ( DimCoord( - points=grib.phenomenon_points('hours'), - standard_name='time', - units=Unit('hours since epoch', CALENDAR_GREGORIAN), + points=grib.phenomenon_points("hours"), + standard_name="time", + units=Unit("hours since epoch", CALENDAR_GREGORIAN), ), - None + None, ) ) def add_bounded_time_coords(aux_coords_and_dims, grib): - t_bounds = grib.phenomenon_bounds('hours') + t_bounds = grib.phenomenon_bounds("hours") period = t_bounds[1] - t_bounds[0] - aux_coords_and_dims.append(( - DimCoord(standard_name='forecast_period', - units="hours", - points=grib._forecastTime + 0.5 * period, - bounds=[grib._forecastTime, grib._forecastTime + period]), - None)) - aux_coords_and_dims.append(( - DimCoord(standard_name='time', - units=Unit('hours since epoch', CALENDAR_GREGORIAN), - points=0.5 * (t_bounds[0] + t_bounds[1]), - bounds=t_bounds), - None)) - - if \ - (grib.timeRangeIndicator == 2): + aux_coords_and_dims.append( + ( + DimCoord( + standard_name="forecast_period", + units="hours", + points=grib._forecastTime + 0.5 * period, + bounds=[grib._forecastTime, grib._forecastTime + period], + ), + None, + ) + ) + aux_coords_and_dims.append( + ( + DimCoord( + standard_name="time", + units=Unit("hours since epoch", CALENDAR_GREGORIAN), + points=0.5 * (t_bounds[0] + t_bounds[1]), + bounds=t_bounds, + ), + None, + ) + ) + + if grib.timeRangeIndicator == 2: add_bounded_time_coords(aux_coords_and_dims, grib) - if \ - (grib.timeRangeIndicator == 3): + if grib.timeRangeIndicator == 3: add_bounded_time_coords(aux_coords_and_dims, grib) cell_methods.append(CellMethod("mean", coords="time")) - if \ - (grib.timeRangeIndicator == 4): + if grib.timeRangeIndicator == 4: add_bounded_time_coords(aux_coords_and_dims, grib) cell_methods.append(CellMethod("sum", coords="time")) - if \ - (grib.timeRangeIndicator == 5): + if grib.timeRangeIndicator == 5: add_bounded_time_coords(aux_coords_and_dims, grib) cell_methods.append(CellMethod("_difference", coords="time")) - if \ - (grib.timeRangeIndicator == 51): + if grib.timeRangeIndicator == 51: add_bounded_time_coords(aux_coords_and_dims, grib) cell_methods.append(CellMethod("mean", coords="time")) - if \ - (grib.timeRangeIndicator == 113): + if grib.timeRangeIndicator == 113: add_bounded_time_coords(aux_coords_and_dims, grib) cell_methods.append(CellMethod("mean", coords="time")) - if \ - (grib.timeRangeIndicator == 114): + if grib.timeRangeIndicator == 114: add_bounded_time_coords(aux_coords_and_dims, grib) cell_methods.append(CellMethod("sum", coords="time")) - if \ - (grib.timeRangeIndicator == 115): + if grib.timeRangeIndicator == 115: add_bounded_time_coords(aux_coords_and_dims, grib) cell_methods.append(CellMethod("mean", coords="time")) - if \ - (grib.timeRangeIndicator == 116): + if grib.timeRangeIndicator == 116: add_bounded_time_coords(aux_coords_and_dims, grib) cell_methods.append(CellMethod("sum", coords="time")) - if \ - (grib.timeRangeIndicator == 117): + if grib.timeRangeIndicator == 117: add_bounded_time_coords(aux_coords_and_dims, grib) cell_methods.append(CellMethod("mean", coords="time")) - if \ - (grib.timeRangeIndicator == 118): + if grib.timeRangeIndicator == 118: add_bounded_time_coords(aux_coords_and_dims, grib) cell_methods.append(CellMethod("_covariance", coords="time")) - if \ - (grib.timeRangeIndicator == 123): + if grib.timeRangeIndicator == 123: add_bounded_time_coords(aux_coords_and_dims, grib) cell_methods.append(CellMethod("mean", coords="time")) - if \ - (grib.timeRangeIndicator == 124): + if grib.timeRangeIndicator == 124: add_bounded_time_coords(aux_coords_and_dims, grib) cell_methods.append(CellMethod("sum", coords="time")) - if \ - (grib.timeRangeIndicator == 125): + if grib.timeRangeIndicator == 125: add_bounded_time_coords(aux_coords_and_dims, grib) cell_methods.append(CellMethod("standard_deviation", coords="time")) - if grib.levelType == 'pl': + if grib.levelType == "pl": aux_coords_and_dims.append( - ( - DimCoord( - points=grib.level, long_name="pressure", units="hPa" - ), - None - ) + (DimCoord(points=grib.level, long_name="pressure", units="hPa"), None) ) - if grib.levelType == 'sfc': + if grib.levelType == "sfc": if grib._cf_data is not None and grib._cf_data.set_height is not None: aux_coords_and_dims.append( ( @@ -286,77 +276,83 @@ def add_bounded_time_coords(aux_coords_and_dims, grib): points=grib._cf_data.set_height, long_name="height", units="m", - attributes={'positive': 'up'}, + attributes={"positive": "up"}, ), - None + None, ) ) - elif grib.typeOfLevel == 'heightAboveGround': # required for NCAR + elif grib.typeOfLevel == "heightAboveGround": # required for NCAR aux_coords_and_dims.append( ( DimCoord( points=grib.level, long_name="height", units="m", - attributes={'positive': 'up'}, + attributes={"positive": "up"}, ), - None + None, ) ) - if grib.levelType == 'ml' and hasattr(grib, 'pv'): + if grib.levelType == "ml" and hasattr(grib, "pv"): aux_coords_and_dims.append( ( AuxCoord( grib.level, - standard_name='model_level_number', + standard_name="model_level_number", units=1, - attributes={'positive': 'up'}, + attributes={"positive": "up"}, ), - None + None, ) ) aux_coords_and_dims.append( ( - DimCoord( - grib.pv[grib.level], long_name='level_pressure', units='Pa' - ), - None + DimCoord(grib.pv[grib.level], long_name="level_pressure", units="Pa"), + None, ) ) aux_coords_and_dims.append( ( AuxCoord( - grib.pv[grib.numberOfCoordinatesValues//2 + grib.level], - long_name='sigma', + grib.pv[grib.numberOfCoordinatesValues // 2 + grib.level], + long_name="sigma", units=1, ), - None + None, ) ) factories.append( Factory( HybridPressureFactory, [ - {'long_name': 'level_pressure'}, - {'long_name': 'sigma'}, - Reference('surface_pressure'), - ] + {"long_name": "level_pressure"}, + {"long_name": "sigma"}, + Reference("surface_pressure"), + ], ) ) - if grib._originatingCentre != 'unknown': + if grib._originatingCentre != "unknown": aux_coords_and_dims.append( ( AuxCoord( points=grib._originatingCentre, - long_name='originating_centre', - units='no_unit', + long_name="originating_centre", + units="no_unit", ), - None + None, ) ) - return ConversionMetadata(factories, references, standard_name, long_name, - units, attributes, cell_methods, - dim_coords_and_dims, aux_coords_and_dims) + return ConversionMetadata( + factories, + references, + standard_name, + long_name, + units, + attributes, + cell_methods, + dim_coords_and_dims, + aux_coords_and_dims, + ) diff --git a/iris_grib/_grib_cf_map.py b/iris_grib/_grib_cf_map.py index 554be6ea..bb2714e1 100644 --- a/iris_grib/_grib_cf_map.py +++ b/iris_grib/_grib_cf_map.py @@ -11,235 +11,322 @@ from collections import namedtuple -CFName = namedtuple('CFName', 'standard_name long_name units') +CFName = namedtuple("CFName", "standard_name long_name units") -DimensionCoordinate = namedtuple('DimensionCoordinate', - 'standard_name units points') +DimensionCoordinate = namedtuple("DimensionCoordinate", "standard_name units points") -G1LocalParam = namedtuple('G1LocalParam', 'edition t2version centre iParam') -G2Param = namedtuple('G2Param', 'edition discipline category number') +G1LocalParam = namedtuple("G1LocalParam", "edition t2version centre iParam") +G2Param = namedtuple("G2Param", "edition discipline category number") GRIB1_LOCAL_TO_CF_CONSTRAINED = { - G1LocalParam(1, 128, 98, 165): (CFName('x_wind', None, 'm s-1'), DimensionCoordinate('height', 'm', (10,))), - G1LocalParam(1, 128, 98, 166): (CFName('y_wind', None, 'm s-1'), DimensionCoordinate('height', 'm', (10,))), - G1LocalParam(1, 128, 98, 167): (CFName('air_temperature', None, 'K'), DimensionCoordinate('height', 'm', (2,))), - G1LocalParam(1, 128, 98, 168): (CFName('dew_point_temperature', None, 'K'), DimensionCoordinate('height', 'm', (2,))), - } + G1LocalParam(1, 128, 98, 165): ( + CFName("x_wind", None, "m s-1"), + DimensionCoordinate("height", "m", (10,)), + ), + G1LocalParam(1, 128, 98, 166): ( + CFName("y_wind", None, "m s-1"), + DimensionCoordinate("height", "m", (10,)), + ), + G1LocalParam(1, 128, 98, 167): ( + CFName("air_temperature", None, "K"), + DimensionCoordinate("height", "m", (2,)), + ), + G1LocalParam(1, 128, 98, 168): ( + CFName("dew_point_temperature", None, "K"), + DimensionCoordinate("height", "m", (2,)), + ), +} GRIB1_LOCAL_TO_CF = { - G1LocalParam(1, 128, 98, 31): CFName('sea_ice_area_fraction', None, '1'), - G1LocalParam(1, 128, 98, 34): CFName('sea_surface_temperature', None, 'K'), - G1LocalParam(1, 128, 98, 59): CFName('atmosphere_specific_convective_available_potential_energy', None, 'J kg-1'), - G1LocalParam(1, 128, 98, 129): CFName('geopotential', None, 'm2 s-2'), - G1LocalParam(1, 128, 98, 130): CFName('air_temperature', None, 'K'), - G1LocalParam(1, 128, 98, 131): CFName('x_wind', None, 'm s-1'), - G1LocalParam(1, 128, 98, 132): CFName('y_wind', None, 'm s-1'), - G1LocalParam(1, 128, 98, 135): CFName('lagrangian_tendency_of_air_pressure', None, 'Pa s-1'), - G1LocalParam(1, 128, 98, 141): CFName('thickness_of_snowfall_amount', None, 'm'), - G1LocalParam(1, 128, 98, 151): CFName('air_pressure_at_sea_level', None, 'Pa'), - G1LocalParam(1, 128, 98, 157): CFName('relative_humidity', None, '%'), - G1LocalParam(1, 128, 98, 164): CFName('cloud_area_fraction', None, '1'), - G1LocalParam(1, 128, 98, 173): CFName('surface_roughness_length', None, 'm'), - G1LocalParam(1, 128, 98, 174): CFName(None, 'grib_physical_atmosphere_albedo', '1'), - G1LocalParam(1, 128, 98, 186): CFName('low_type_cloud_area_fraction', None, '1'), - G1LocalParam(1, 128, 98, 187): CFName('medium_type_cloud_area_fraction', None, '1'), - G1LocalParam(1, 128, 98, 188): CFName('high_type_cloud_area_fraction', None, '1'), - G1LocalParam(1, 128, 98, 235): CFName(None, 'grib_skin_temperature', 'K'), - } + G1LocalParam(1, 128, 98, 31): CFName("sea_ice_area_fraction", None, "1"), + G1LocalParam(1, 128, 98, 34): CFName("sea_surface_temperature", None, "K"), + G1LocalParam(1, 128, 98, 59): CFName( + "atmosphere_specific_convective_available_potential_energy", None, "J kg-1" + ), + G1LocalParam(1, 128, 98, 129): CFName("geopotential", None, "m2 s-2"), + G1LocalParam(1, 128, 98, 130): CFName("air_temperature", None, "K"), + G1LocalParam(1, 128, 98, 131): CFName("x_wind", None, "m s-1"), + G1LocalParam(1, 128, 98, 132): CFName("y_wind", None, "m s-1"), + G1LocalParam(1, 128, 98, 135): CFName( + "lagrangian_tendency_of_air_pressure", None, "Pa s-1" + ), + G1LocalParam(1, 128, 98, 141): CFName("thickness_of_snowfall_amount", None, "m"), + G1LocalParam(1, 128, 98, 151): CFName("air_pressure_at_sea_level", None, "Pa"), + G1LocalParam(1, 128, 98, 157): CFName("relative_humidity", None, "%"), + G1LocalParam(1, 128, 98, 164): CFName("cloud_area_fraction", None, "1"), + G1LocalParam(1, 128, 98, 173): CFName("surface_roughness_length", None, "m"), + G1LocalParam(1, 128, 98, 174): CFName(None, "grib_physical_atmosphere_albedo", "1"), + G1LocalParam(1, 128, 98, 186): CFName("low_type_cloud_area_fraction", None, "1"), + G1LocalParam(1, 128, 98, 187): CFName("medium_type_cloud_area_fraction", None, "1"), + G1LocalParam(1, 128, 98, 188): CFName("high_type_cloud_area_fraction", None, "1"), + G1LocalParam(1, 128, 98, 235): CFName(None, "grib_skin_temperature", "K"), +} GRIB2_TO_CF = { - G2Param(2, 0, 0, 0): CFName('air_temperature', None, 'K'), - G2Param(2, 0, 0, 2): CFName('air_potential_temperature', None, 'K'), - G2Param(2, 0, 0, 6): CFName('dew_point_temperature', None, 'K'), - G2Param(2, 0, 0, 10): CFName('surface_upward_latent_heat_flux', None, 'W m-2'), - G2Param(2, 0, 0, 11): CFName('surface_upward_sensible_heat_flux', None, 'W m-2'), - G2Param(2, 0, 0, 17): CFName('surface_temperature', None, 'K'), - G2Param(2, 0, 0, 32): CFName('wet_bulb_potential_temperature', None, 'K'), - G2Param(2, 0, 1, 0): CFName('specific_humidity', None, 'kg kg-1'), - G2Param(2, 0, 1, 1): CFName('relative_humidity', None, '%'), - G2Param(2, 0, 1, 2): CFName('humidity_mixing_ratio', None, 'kg kg-1'), - G2Param(2, 0, 1, 3): CFName(None, 'precipitable_water', 'kg m-2'), - G2Param(2, 0, 1, 7): CFName('precipitation_flux', None, 'kg m-2 s-1'), - G2Param(2, 0, 1, 9): CFName('stratiform_rainfall_amount', 'Large-scale precipitation (non-convective)', 'kg m-2'), - G2Param(2, 0, 1, 10): CFName('convective_rainfall_amount', 'Convective precipitation', 'kg m-2'), - G2Param(2, 0, 1, 11): CFName('thickness_of_snowfall_amount', None, 'm'), - G2Param(2, 0, 1, 13): CFName('liquid_water_content_of_surface_snow', None, 'kg m-2'), - G2Param(2, 0, 1, 15): CFName('stratiform_snowfall_amount', 'Large-scale snow', 'kg m-2'), - G2Param(2, 0, 1, 22): CFName(None, 'cloud_mixing_ratio', 'kg kg-1'), - G2Param(2, 0, 1, 37): CFName('convective_rainfall_flux', 'Convective precipitation rate', 'kg m-2 s-1'), - G2Param(2, 0, 1, 49): CFName('precipitation_amount', None, 'kg m-2'), - G2Param(2, 0, 1, 51): CFName('atmosphere_mass_content_of_water', None, 'kg m-2'), - G2Param(2, 0, 1, 53): CFName('snowfall_flux', None, 'kg m-2 s-1'), - G2Param(2, 0, 1, 58): CFName('convective_snowfall_flux', 'Convective snowfall rate', 'kg m-2 s-1'), - G2Param(2, 0, 1, 59): CFName('stratiform_snowfall_flux', 'Large scale snowfall rate', 'kg m-2 s-1'), - G2Param(2, 0, 1, 60): CFName('snowfall_amount', None, 'kg m-2'), - G2Param(2, 0, 1, 64): CFName('atmosphere_mass_content_of_water_vapor', None, 'kg m-2'), - G2Param(2, 0, 1, 77): CFName('stratiform_rainfall_flux', 'Large scale rain rate', 'kg m-2 s-1'), - G2Param(2, 0, 1, 83): CFName('mass_fraction_of_cloud_liquid_water_in_air', None, 'kg kg-1'), - G2Param(2, 0, 1, 84): CFName('mass_fraction_of_cloud_ice_in_air', None, 'kg kg-1'), - G2Param(2, 0, 2, 0): CFName('wind_from_direction', None, 'degrees'), - G2Param(2, 0, 2, 1): CFName('wind_speed', None, 'm s-1'), - G2Param(2, 0, 2, 2): CFName('x_wind', None, 'm s-1'), - G2Param(2, 0, 2, 3): CFName('y_wind', None, 'm s-1'), - G2Param(2, 0, 2, 8): CFName('lagrangian_tendency_of_air_pressure', None, 'Pa s-1'), - G2Param(2, 0, 2, 9): CFName('upward_air_velocity', 'Vertical velocity (geometric)', 'm s-1'), - G2Param(2, 0, 2, 10): CFName('atmosphere_absolute_vorticity', None, 's-1'), - G2Param(2, 0, 2, 12): CFName('atmosphere_relative_vorticity', 'Relative vorticity', 's-1'), - G2Param(2, 0, 2, 14): CFName(None, 'ertel_potential_velocity', 'K m2 kg-1 s-1'), - G2Param(2, 0, 2, 22): CFName('wind_speed_of_gust', None, 'm s-1'), - G2Param(2, 0, 3, 0): CFName('air_pressure', None, 'Pa'), - G2Param(2, 0, 3, 1): CFName('air_pressure_at_sea_level', None, 'Pa'), - G2Param(2, 0, 3, 3): CFName(None, 'icao_standard_atmosphere_reference_height', 'm'), - G2Param(2, 0, 3, 4): CFName('geopotential', None, 'm2 s-2'), - G2Param(2, 0, 3, 5): CFName('geopotential_height', None, 'm'), - G2Param(2, 0, 3, 6): CFName('altitude', None, 'm'), - G2Param(2, 0, 3, 9): CFName('geopotential_height_anomaly', None, 'm'), - G2Param(2, 0, 4, 7): CFName('surface_downwelling_shortwave_flux_in_air', None, 'W m-2'), - G2Param(2, 0, 4, 9): CFName('surface_net_downward_shortwave_flux', None, 'W m-2'), - G2Param(2, 0, 5, 3): CFName('surface_downwelling_longwave_flux_in_air', None, 'W m-2'), - G2Param(2, 0, 5, 4): CFName('toa_outgoing_longwave_flux', 'Upward long-wave radiation flux', 'W m-2'), - G2Param(2, 0, 5, 5): CFName('surface_net_downward_longwave_flux', None, 'W m-2'), - G2Param(2, 0, 6, 1): CFName(None, 'cloud_area_fraction_assuming_maximum_random_overlap', '1'), - G2Param(2, 0, 6, 3): CFName('low_type_cloud_area_fraction', None, '%'), - G2Param(2, 0, 6, 4): CFName('medium_type_cloud_area_fraction', None, '%'), - G2Param(2, 0, 6, 5): CFName('high_type_cloud_area_fraction', None, '%'), - G2Param(2, 0, 6, 6): CFName('atmosphere_mass_content_of_cloud_liquid_water', None, 'kg m-2'), - G2Param(2, 0, 6, 7): CFName('cloud_area_fraction_in_atmosphere_layer', None, '%'), - G2Param(2, 0, 6, 25): CFName(None, 'WAFC_CB_horizontal_extent', '1'), - G2Param(2, 0, 6, 26): CFName(None, 'WAFC_ICAO_height_at_cloud_base', 'm'), - G2Param(2, 0, 6, 27): CFName(None, 'WAFC_ICAO_height_at_cloud_top', 'm'), - G2Param(2, 0, 7, 6): CFName('atmosphere_specific_convective_available_potential_energy', None, 'J kg-1'), - G2Param(2, 0, 7, 7): CFName(None, 'convective_inhibition', 'J kg-1'), - G2Param(2, 0, 7, 8): CFName(None, 'storm_relative_helicity', 'J kg-1'), - G2Param(2, 0, 14, 0): CFName('atmosphere_mole_content_of_ozone', None, 'Dobson'), - G2Param(2, 0, 19, 1): CFName(None, 'grib_physical_atmosphere_albedo', '%'), - G2Param(2, 0, 19, 20): CFName(None, 'WAFC_icing_potential', '1'), - G2Param(2, 0, 19, 21): CFName(None, 'WAFC_in-cloud_turb_potential', '1'), - G2Param(2, 0, 19, 22): CFName(None, 'WAFC_CAT_potential', '1'), - G2Param(2, 2, 0, 0): CFName('land_binary_mask', None, '1'), - G2Param(2, 2, 0, 0): CFName('land_area_fraction', None, '1'), - G2Param(2, 2, 0, 1): CFName('surface_roughness_length', None, 'm'), - G2Param(2, 2, 0, 2): CFName('soil_temperature', None, 'K'), - G2Param(2, 2, 0, 3): CFName('soil_moisture_content', 'Soil moisture content', 'kg m-2'), - G2Param(2, 2, 0, 7): CFName('surface_altitude', None, 'm'), - G2Param(2, 2, 0, 22): CFName('moisture_content_of_soil_layer', None, 'kg m-2'), - G2Param(2, 2, 0, 34): CFName('surface_runoff_flux', None, 'kg m-2 s-1'), - G2Param(2, 10, 1, 2): CFName('sea_water_x_velocity', None, 'm s-1'), - G2Param(2, 10, 1, 3): CFName('sea_water_y_velocity', None, 'm s-1'), - G2Param(2, 10, 2, 0): CFName('sea_ice_area_fraction', None, '1'), - G2Param(2, 10, 3, 0): CFName('sea_surface_temperature', None, 'K'), - } + G2Param(2, 0, 0, 0): CFName("air_temperature", None, "K"), + G2Param(2, 0, 0, 2): CFName("air_potential_temperature", None, "K"), + G2Param(2, 0, 0, 6): CFName("dew_point_temperature", None, "K"), + G2Param(2, 0, 0, 10): CFName("surface_upward_latent_heat_flux", None, "W m-2"), + G2Param(2, 0, 0, 11): CFName("surface_upward_sensible_heat_flux", None, "W m-2"), + G2Param(2, 0, 0, 17): CFName("surface_temperature", None, "K"), + G2Param(2, 0, 0, 32): CFName("wet_bulb_potential_temperature", None, "K"), + G2Param(2, 0, 1, 0): CFName("specific_humidity", None, "kg kg-1"), + G2Param(2, 0, 1, 1): CFName("relative_humidity", None, "%"), + G2Param(2, 0, 1, 2): CFName("humidity_mixing_ratio", None, "kg kg-1"), + G2Param(2, 0, 1, 3): CFName(None, "precipitable_water", "kg m-2"), + G2Param(2, 0, 1, 7): CFName("precipitation_flux", None, "kg m-2 s-1"), + G2Param(2, 0, 1, 9): CFName( + "stratiform_rainfall_amount", + "Large-scale precipitation (non-convective)", + "kg m-2", + ), + G2Param(2, 0, 1, 10): CFName( + "convective_rainfall_amount", "Convective precipitation", "kg m-2" + ), + G2Param(2, 0, 1, 11): CFName("thickness_of_snowfall_amount", None, "m"), + G2Param(2, 0, 1, 13): CFName( + "liquid_water_content_of_surface_snow", None, "kg m-2" + ), + G2Param(2, 0, 1, 15): CFName( + "stratiform_snowfall_amount", "Large-scale snow", "kg m-2" + ), + G2Param(2, 0, 1, 22): CFName(None, "cloud_mixing_ratio", "kg kg-1"), + G2Param(2, 0, 1, 37): CFName( + "convective_rainfall_flux", "Convective precipitation rate", "kg m-2 s-1" + ), + G2Param(2, 0, 1, 49): CFName("precipitation_amount", None, "kg m-2"), + G2Param(2, 0, 1, 51): CFName("atmosphere_mass_content_of_water", None, "kg m-2"), + G2Param(2, 0, 1, 53): CFName("snowfall_flux", None, "kg m-2 s-1"), + G2Param(2, 0, 1, 58): CFName( + "convective_snowfall_flux", "Convective snowfall rate", "kg m-2 s-1" + ), + G2Param(2, 0, 1, 59): CFName( + "stratiform_snowfall_flux", "Large scale snowfall rate", "kg m-2 s-1" + ), + G2Param(2, 0, 1, 60): CFName("snowfall_amount", None, "kg m-2"), + G2Param(2, 0, 1, 64): CFName( + "atmosphere_mass_content_of_water_vapor", None, "kg m-2" + ), + G2Param(2, 0, 1, 77): CFName( + "stratiform_rainfall_flux", "Large scale rain rate", "kg m-2 s-1" + ), + G2Param(2, 0, 1, 83): CFName( + "mass_fraction_of_cloud_liquid_water_in_air", None, "kg kg-1" + ), + G2Param(2, 0, 1, 84): CFName("mass_fraction_of_cloud_ice_in_air", None, "kg kg-1"), + G2Param(2, 0, 2, 0): CFName("wind_from_direction", None, "degrees"), + G2Param(2, 0, 2, 1): CFName("wind_speed", None, "m s-1"), + G2Param(2, 0, 2, 2): CFName("x_wind", None, "m s-1"), + G2Param(2, 0, 2, 3): CFName("y_wind", None, "m s-1"), + G2Param(2, 0, 2, 8): CFName("lagrangian_tendency_of_air_pressure", None, "Pa s-1"), + G2Param(2, 0, 2, 9): CFName( + "upward_air_velocity", "Vertical velocity (geometric)", "m s-1" + ), + G2Param(2, 0, 2, 10): CFName("atmosphere_absolute_vorticity", None, "s-1"), + G2Param(2, 0, 2, 12): CFName( + "atmosphere_relative_vorticity", "Relative vorticity", "s-1" + ), + G2Param(2, 0, 2, 14): CFName(None, "ertel_potential_velocity", "K m2 kg-1 s-1"), + G2Param(2, 0, 2, 22): CFName("wind_speed_of_gust", None, "m s-1"), + G2Param(2, 0, 3, 0): CFName("air_pressure", None, "Pa"), + G2Param(2, 0, 3, 1): CFName("air_pressure_at_sea_level", None, "Pa"), + G2Param(2, 0, 3, 3): CFName(None, "icao_standard_atmosphere_reference_height", "m"), + G2Param(2, 0, 3, 4): CFName("geopotential", None, "m2 s-2"), + G2Param(2, 0, 3, 5): CFName("geopotential_height", None, "m"), + G2Param(2, 0, 3, 6): CFName("altitude", None, "m"), + G2Param(2, 0, 3, 9): CFName("geopotential_height_anomaly", None, "m"), + G2Param(2, 0, 4, 7): CFName( + "surface_downwelling_shortwave_flux_in_air", None, "W m-2" + ), + G2Param(2, 0, 4, 9): CFName("surface_net_downward_shortwave_flux", None, "W m-2"), + G2Param(2, 0, 5, 3): CFName( + "surface_downwelling_longwave_flux_in_air", None, "W m-2" + ), + G2Param(2, 0, 5, 4): CFName( + "toa_outgoing_longwave_flux", "Upward long-wave radiation flux", "W m-2" + ), + G2Param(2, 0, 5, 5): CFName("surface_net_downward_longwave_flux", None, "W m-2"), + G2Param(2, 0, 6, 1): CFName( + None, "cloud_area_fraction_assuming_maximum_random_overlap", "1" + ), + G2Param(2, 0, 6, 3): CFName("low_type_cloud_area_fraction", None, "%"), + G2Param(2, 0, 6, 4): CFName("medium_type_cloud_area_fraction", None, "%"), + G2Param(2, 0, 6, 5): CFName("high_type_cloud_area_fraction", None, "%"), + G2Param(2, 0, 6, 6): CFName( + "atmosphere_mass_content_of_cloud_liquid_water", None, "kg m-2" + ), + G2Param(2, 0, 6, 7): CFName("cloud_area_fraction_in_atmosphere_layer", None, "%"), + G2Param(2, 0, 6, 25): CFName(None, "WAFC_CB_horizontal_extent", "1"), + G2Param(2, 0, 6, 26): CFName(None, "WAFC_ICAO_height_at_cloud_base", "m"), + G2Param(2, 0, 6, 27): CFName(None, "WAFC_ICAO_height_at_cloud_top", "m"), + G2Param(2, 0, 7, 6): CFName( + "atmosphere_specific_convective_available_potential_energy", None, "J kg-1" + ), + G2Param(2, 0, 7, 7): CFName(None, "convective_inhibition", "J kg-1"), + G2Param(2, 0, 7, 8): CFName(None, "storm_relative_helicity", "J kg-1"), + G2Param(2, 0, 14, 0): CFName("atmosphere_mole_content_of_ozone", None, "Dobson"), + G2Param(2, 0, 19, 1): CFName(None, "grib_physical_atmosphere_albedo", "%"), + G2Param(2, 0, 19, 20): CFName(None, "WAFC_icing_potential", "1"), + G2Param(2, 0, 19, 21): CFName(None, "WAFC_in-cloud_turb_potential", "1"), + G2Param(2, 0, 19, 22): CFName(None, "WAFC_CAT_potential", "1"), + G2Param(2, 2, 0, 0): CFName("land_binary_mask", None, "1"), + G2Param(2, 2, 0, 0): CFName("land_area_fraction", None, "1"), + G2Param(2, 2, 0, 1): CFName("surface_roughness_length", None, "m"), + G2Param(2, 2, 0, 2): CFName("soil_temperature", None, "K"), + G2Param(2, 2, 0, 3): CFName( + "soil_moisture_content", "Soil moisture content", "kg m-2" + ), + G2Param(2, 2, 0, 7): CFName("surface_altitude", None, "m"), + G2Param(2, 2, 0, 22): CFName("moisture_content_of_soil_layer", None, "kg m-2"), + G2Param(2, 2, 0, 34): CFName("surface_runoff_flux", None, "kg m-2 s-1"), + G2Param(2, 10, 1, 2): CFName("sea_water_x_velocity", None, "m s-1"), + G2Param(2, 10, 1, 3): CFName("sea_water_y_velocity", None, "m s-1"), + G2Param(2, 10, 2, 0): CFName("sea_ice_area_fraction", None, "1"), + G2Param(2, 10, 3, 0): CFName("sea_surface_temperature", None, "K"), +} CF_CONSTRAINED_TO_GRIB1_LOCAL = { - (CFName('air_temperature', None, 'K'), DimensionCoordinate('height', 'm', (2,))): G1LocalParam(1, 128, 98, 167), - (CFName('dew_point_temperature', None, 'K'), DimensionCoordinate('height', 'm', (2,))): G1LocalParam(1, 128, 98, 168), - (CFName('x_wind', None, 'm s-1'), DimensionCoordinate('height', 'm', (10,))): G1LocalParam(1, 128, 98, 165), - (CFName('y_wind', None, 'm s-1'), DimensionCoordinate('height', 'm', (10,))): G1LocalParam(1, 128, 98, 166), - } + ( + CFName("air_temperature", None, "K"), + DimensionCoordinate("height", "m", (2,)), + ): G1LocalParam(1, 128, 98, 167), + ( + CFName("dew_point_temperature", None, "K"), + DimensionCoordinate("height", "m", (2,)), + ): G1LocalParam(1, 128, 98, 168), + ( + CFName("x_wind", None, "m s-1"), + DimensionCoordinate("height", "m", (10,)), + ): G1LocalParam(1, 128, 98, 165), + ( + CFName("y_wind", None, "m s-1"), + DimensionCoordinate("height", "m", (10,)), + ): G1LocalParam(1, 128, 98, 166), +} CF_TO_GRIB1_LOCAL = { - CFName(None, 'grib_physical_atmosphere_albedo', '1'): G1LocalParam(1, 128, 98, 174), - CFName(None, 'grib_skin_temperature', 'K'): G1LocalParam(1, 128, 98, 235), - CFName('air_pressure_at_sea_level', None, 'Pa'): G1LocalParam(1, 128, 98, 151), - CFName('air_temperature', None, 'K'): G1LocalParam(1, 128, 98, 130), - CFName('atmosphere_specific_convective_available_potential_energy', None, 'J kg-1'): G1LocalParam(1, 128, 98, 59), - CFName('cloud_area_fraction', None, '1'): G1LocalParam(1, 128, 98, 164), - CFName('geopotential', None, 'm2 s-2'): G1LocalParam(1, 128, 98, 129), - CFName('high_type_cloud_area_fraction', None, '1'): G1LocalParam(1, 128, 98, 188), - CFName('lagrangian_tendency_of_air_pressure', None, 'Pa s-1'): G1LocalParam(1, 128, 98, 135), - CFName('low_type_cloud_area_fraction', None, '1'): G1LocalParam(1, 128, 98, 186), - CFName('medium_type_cloud_area_fraction', None, '1'): G1LocalParam(1, 128, 98, 187), - CFName('relative_humidity', None, '%'): G1LocalParam(1, 128, 98, 157), - CFName('sea_ice_area_fraction', None, '1'): G1LocalParam(1, 128, 98, 31), - CFName('sea_surface_temperature', None, 'K'): G1LocalParam(1, 128, 98, 34), - CFName('surface_roughness_length', None, 'm'): G1LocalParam(1, 128, 98, 173), - CFName('thickness_of_snowfall_amount', None, 'm'): G1LocalParam(1, 128, 98, 141), - CFName('x_wind', None, 'm s-1'): G1LocalParam(1, 128, 98, 131), - CFName('y_wind', None, 'm s-1'): G1LocalParam(1, 128, 98, 132), - } + CFName(None, "grib_physical_atmosphere_albedo", "1"): G1LocalParam(1, 128, 98, 174), + CFName(None, "grib_skin_temperature", "K"): G1LocalParam(1, 128, 98, 235), + CFName("air_pressure_at_sea_level", None, "Pa"): G1LocalParam(1, 128, 98, 151), + CFName("air_temperature", None, "K"): G1LocalParam(1, 128, 98, 130), + CFName( + "atmosphere_specific_convective_available_potential_energy", None, "J kg-1" + ): G1LocalParam(1, 128, 98, 59), + CFName("cloud_area_fraction", None, "1"): G1LocalParam(1, 128, 98, 164), + CFName("geopotential", None, "m2 s-2"): G1LocalParam(1, 128, 98, 129), + CFName("high_type_cloud_area_fraction", None, "1"): G1LocalParam(1, 128, 98, 188), + CFName("lagrangian_tendency_of_air_pressure", None, "Pa s-1"): G1LocalParam( + 1, 128, 98, 135 + ), + CFName("low_type_cloud_area_fraction", None, "1"): G1LocalParam(1, 128, 98, 186), + CFName("medium_type_cloud_area_fraction", None, "1"): G1LocalParam(1, 128, 98, 187), + CFName("relative_humidity", None, "%"): G1LocalParam(1, 128, 98, 157), + CFName("sea_ice_area_fraction", None, "1"): G1LocalParam(1, 128, 98, 31), + CFName("sea_surface_temperature", None, "K"): G1LocalParam(1, 128, 98, 34), + CFName("surface_roughness_length", None, "m"): G1LocalParam(1, 128, 98, 173), + CFName("thickness_of_snowfall_amount", None, "m"): G1LocalParam(1, 128, 98, 141), + CFName("x_wind", None, "m s-1"): G1LocalParam(1, 128, 98, 131), + CFName("y_wind", None, "m s-1"): G1LocalParam(1, 128, 98, 132), +} CF_TO_GRIB2 = { - CFName(None, 'WAFC_CAT_potential', '1'): G2Param(2, 0, 19, 22), - CFName(None, 'WAFC_CB_horizontal_extent', '1'): G2Param(2, 0, 6, 25), - CFName(None, 'WAFC_ICAO_height_at_cloud_base', 'm'): G2Param(2, 0, 6, 26), - CFName(None, 'WAFC_ICAO_height_at_cloud_top', 'm'): G2Param(2, 0, 6, 27), - CFName(None, 'WAFC_icing_potential', '1'): G2Param(2, 0, 19, 20), - CFName(None, 'WAFC_in-cloud_turb_potential', '1'): G2Param(2, 0, 19, 21), - CFName(None, 'cloud_area_fraction_assuming_maximum_random_overlap', '1'): G2Param(2, 0, 6, 1), - CFName(None, 'cloud_mixing_ratio', 'kg kg-1'): G2Param(2, 0, 1, 22), - CFName(None, 'convective_inhibition', 'J kg-1'): G2Param(2, 0, 7, 7), - CFName(None, 'ertel_potential_velocity', 'K m2 kg-1 s-1'): G2Param(2, 0, 2, 14), - CFName(None, 'grib_physical_atmosphere_albedo', '%'): G2Param(2, 0, 19, 1), - CFName(None, 'icao_standard_atmosphere_reference_height', 'm'): G2Param(2, 0, 3, 3), - CFName(None, 'precipitable_water', 'kg m-2'): G2Param(2, 0, 1, 3), - CFName(None, 'storm_relative_helicity', 'J kg-1'): G2Param(2, 0, 7, 8), - CFName('air_potential_temperature', None, 'K'): G2Param(2, 0, 0, 2), - CFName('air_pressure', None, 'Pa'): G2Param(2, 0, 3, 0), - CFName('air_pressure_at_sea_level', None, 'Pa'): G2Param(2, 0, 3, 0), - CFName('air_pressure_at_sea_level', None, 'Pa'): G2Param(2, 0, 3, 1), - CFName('air_temperature', None, 'K'): G2Param(2, 0, 0, 0), - CFName('altitude', None, 'm'): G2Param(2, 0, 3, 6), - CFName('atmosphere_absolute_vorticity', None, 's-1'): G2Param(2, 0, 2, 10), - CFName('atmosphere_mass_content_of_cloud_liquid_water', None, 'kg m-2'): G2Param(2, 0, 6, 6), - CFName('atmosphere_mass_content_of_water', None, 'kg m-2'): G2Param(2, 0, 1, 51), - CFName('atmosphere_mass_content_of_water_vapor', None, 'kg m-2'): G2Param(2, 0, 1, 64), - CFName('atmosphere_mole_content_of_ozone', None, 'Dobson'): G2Param(2, 0, 14, 0), - CFName('atmosphere_relative_vorticity', None, 's-1'): G2Param(2, 0, 2, 12), - CFName('atmosphere_specific_convective_available_potential_energy', None, 'J kg-1'): G2Param(2, 0, 7, 6), - CFName('convective_rainfall_amount', None, 'kg m-2'): G2Param(2, 0, 1, 10), - CFName('convective_rainfall_flux', None, 'kg m-2 s-1'): G2Param(2, 0, 1, 37), - CFName('convective_snowfall_flux', None, 'kg m-2 s-1'): G2Param(2, 0, 1, 58), - CFName('cloud_area_fraction_in_atmosphere_layer', None, '%'): G2Param(2, 0, 6, 7), - CFName('dew_point_temperature', None, 'K'): G2Param(2, 0, 0, 6), - CFName('geopotential', None, 'm2 s-2'): G2Param(2, 0, 3, 4), - CFName('geopotential_height', None, 'm'): G2Param(2, 0, 3, 5), - CFName('geopotential_height_anomaly', None, 'm'): G2Param(2, 0, 3, 9), - CFName('high_type_cloud_area_fraction', None, '%'): G2Param(2, 0, 6, 5), - CFName('humidity_mixing_ratio', None, 'kg kg-1'): G2Param(2, 0, 1, 2), - CFName('lagrangian_tendency_of_air_pressure', None, 'Pa s-1'): G2Param(2, 0, 2, 8), - CFName('land_area_fraction', None, '1'): G2Param(2, 2, 0, 0), - CFName('land_binary_mask', None, '1'): G2Param(2, 2, 0, 0), - CFName('liquid_water_content_of_surface_snow', None, 'kg m-2'): G2Param(2, 0, 1, 13), - CFName('low_type_cloud_area_fraction', None, '%'): G2Param(2, 0, 6, 3), - CFName('mass_fraction_of_cloud_ice_in_air', None, 'kg kg-1'): G2Param(2, 0, 1, 84), - CFName('mass_fraction_of_cloud_liquid_water_in_air', None, 'kg kg-1'): G2Param(2, 0, 1, 83), - CFName('medium_type_cloud_area_fraction', None, '%'): G2Param(2, 0, 6, 4), - CFName('moisture_content_of_soil_layer', None, 'kg m-2'): G2Param(2, 2, 0, 22), - CFName('precipitation_amount', None, 'kg m-2'): G2Param(2, 0, 1, 49), - CFName('precipitation_flux', None, 'kg m-2 s-1'): G2Param(2, 0, 1, 7), - CFName('relative_humidity', None, '%'): G2Param(2, 0, 1, 1), - CFName('sea_ice_area_fraction', None, '1'): G2Param(2, 10, 2, 0), - CFName('sea_surface_temperature', None, 'K'): G2Param(2, 10, 3, 0), - CFName('sea_water_x_velocity', None, 'm s-1'): G2Param(2, 10, 1, 2), - CFName('sea_water_y_velocity', None, 'm s-1'): G2Param(2, 10, 1, 3), - CFName('snowfall_amount', None, 'kg m-2'): G2Param(2, 0, 1, 60), - CFName('snowfall_flux', None, 'kg m-2 s-1'): G2Param(2, 0, 1, 53), - CFName('soil_moisture_content', None, 'kg m-2'): G2Param(2, 2, 0, 3), - CFName('soil_temperature', None, 'K'): G2Param(2, 2, 0, 2), - CFName('specific_humidity', None, 'kg kg-1'): G2Param(2, 0, 1, 0), - CFName('stratiform_rainfall_amount', None, 'kg m-2'): G2Param(2, 0, 1, 9), - CFName('stratiform_rainfall_flux', None, 'kg m-2 s-1'): G2Param(2, 0, 1, 77), - CFName('stratiform_snowfall_amount', None, 'kg m-2'): G2Param(2, 0, 1, 15), - CFName('stratiform_snowfall_flux', None, 'kg m-2 s-1'): G2Param(2, 0, 1, 59), - CFName('surface_air_pressure', None, 'Pa'): G2Param(2, 0, 3, 0), - CFName('surface_altitude', None, 'm'): G2Param(2, 2, 0, 7), - CFName('surface_downwelling_longwave_flux_in_air', None, 'W m-2'): G2Param(2, 0, 5, 3), - CFName('surface_downwelling_shortwave_flux_in_air', None, 'W m-2'): G2Param(2, 0, 4, 7), - CFName('surface_net_downward_longwave_flux', None, 'W m-2'): G2Param(2, 0, 5, 5), - CFName('surface_net_downward_shortwave_flux', None, 'W m-2'): G2Param(2, 0, 4, 9), - CFName('surface_roughness_length', None, 'm'): G2Param(2, 2, 0, 1), - CFName('surface_runoff_flux', None, 'kg m-2 s-1'): G2Param(2, 2, 0, 34), - CFName('surface_temperature', None, 'K'): G2Param(2, 0, 0, 17), - CFName('surface_upward_latent_heat_flux', None, 'W m-2'): G2Param(2, 0, 0, 10), - CFName('surface_upward_sensible_heat_flux', None, 'W m-2'): G2Param(2, 0, 0, 11), - CFName('toa_outgoing_longwave_flux', None, 'W m-2'): G2Param(2, 0, 5, 4), - CFName('thickness_of_snowfall_amount', None, 'm'): G2Param(2, 0, 1, 11), - CFName('upward_air_velocity', None, 'm s-1'): G2Param(2, 0, 2, 9), - CFName('wet_bulb_potential_temperature', None, 'K'): G2Param(2, 0, 0, 32), - CFName('wind_from_direction', None, 'degrees'): G2Param(2, 0, 2, 0), - CFName('wind_speed', None, 'm s-1'): G2Param(2, 0, 2, 1), - CFName('wind_speed_of_gust', None, 'm s-1'): G2Param(2, 0, 2, 22), - CFName('x_wind', None, 'm s-1'): G2Param(2, 0, 2, 2), - CFName('y_wind', None, 'm s-1'): G2Param(2, 0, 2, 3), - } + CFName(None, "WAFC_CAT_potential", "1"): G2Param(2, 0, 19, 22), + CFName(None, "WAFC_CB_horizontal_extent", "1"): G2Param(2, 0, 6, 25), + CFName(None, "WAFC_ICAO_height_at_cloud_base", "m"): G2Param(2, 0, 6, 26), + CFName(None, "WAFC_ICAO_height_at_cloud_top", "m"): G2Param(2, 0, 6, 27), + CFName(None, "WAFC_icing_potential", "1"): G2Param(2, 0, 19, 20), + CFName(None, "WAFC_in-cloud_turb_potential", "1"): G2Param(2, 0, 19, 21), + CFName(None, "cloud_area_fraction_assuming_maximum_random_overlap", "1"): G2Param( + 2, 0, 6, 1 + ), + CFName(None, "cloud_mixing_ratio", "kg kg-1"): G2Param(2, 0, 1, 22), + CFName(None, "convective_inhibition", "J kg-1"): G2Param(2, 0, 7, 7), + CFName(None, "ertel_potential_velocity", "K m2 kg-1 s-1"): G2Param(2, 0, 2, 14), + CFName(None, "grib_physical_atmosphere_albedo", "%"): G2Param(2, 0, 19, 1), + CFName(None, "icao_standard_atmosphere_reference_height", "m"): G2Param(2, 0, 3, 3), + CFName(None, "precipitable_water", "kg m-2"): G2Param(2, 0, 1, 3), + CFName(None, "storm_relative_helicity", "J kg-1"): G2Param(2, 0, 7, 8), + CFName("air_potential_temperature", None, "K"): G2Param(2, 0, 0, 2), + CFName("air_pressure", None, "Pa"): G2Param(2, 0, 3, 0), + CFName("air_pressure_at_sea_level", None, "Pa"): G2Param(2, 0, 3, 0), + CFName("air_pressure_at_sea_level", None, "Pa"): G2Param(2, 0, 3, 1), + CFName("air_temperature", None, "K"): G2Param(2, 0, 0, 0), + CFName("altitude", None, "m"): G2Param(2, 0, 3, 6), + CFName("atmosphere_absolute_vorticity", None, "s-1"): G2Param(2, 0, 2, 10), + CFName("atmosphere_mass_content_of_cloud_liquid_water", None, "kg m-2"): G2Param( + 2, 0, 6, 6 + ), + CFName("atmosphere_mass_content_of_water", None, "kg m-2"): G2Param(2, 0, 1, 51), + CFName("atmosphere_mass_content_of_water_vapor", None, "kg m-2"): G2Param( + 2, 0, 1, 64 + ), + CFName("atmosphere_mole_content_of_ozone", None, "Dobson"): G2Param(2, 0, 14, 0), + CFName("atmosphere_relative_vorticity", None, "s-1"): G2Param(2, 0, 2, 12), + CFName( + "atmosphere_specific_convective_available_potential_energy", None, "J kg-1" + ): G2Param(2, 0, 7, 6), + CFName("convective_rainfall_amount", None, "kg m-2"): G2Param(2, 0, 1, 10), + CFName("convective_rainfall_flux", None, "kg m-2 s-1"): G2Param(2, 0, 1, 37), + CFName("convective_snowfall_flux", None, "kg m-2 s-1"): G2Param(2, 0, 1, 58), + CFName("cloud_area_fraction_in_atmosphere_layer", None, "%"): G2Param(2, 0, 6, 7), + CFName("dew_point_temperature", None, "K"): G2Param(2, 0, 0, 6), + CFName("geopotential", None, "m2 s-2"): G2Param(2, 0, 3, 4), + CFName("geopotential_height", None, "m"): G2Param(2, 0, 3, 5), + CFName("geopotential_height_anomaly", None, "m"): G2Param(2, 0, 3, 9), + CFName("high_type_cloud_area_fraction", None, "%"): G2Param(2, 0, 6, 5), + CFName("humidity_mixing_ratio", None, "kg kg-1"): G2Param(2, 0, 1, 2), + CFName("lagrangian_tendency_of_air_pressure", None, "Pa s-1"): G2Param(2, 0, 2, 8), + CFName("land_area_fraction", None, "1"): G2Param(2, 2, 0, 0), + CFName("land_binary_mask", None, "1"): G2Param(2, 2, 0, 0), + CFName("liquid_water_content_of_surface_snow", None, "kg m-2"): G2Param( + 2, 0, 1, 13 + ), + CFName("low_type_cloud_area_fraction", None, "%"): G2Param(2, 0, 6, 3), + CFName("mass_fraction_of_cloud_ice_in_air", None, "kg kg-1"): G2Param(2, 0, 1, 84), + CFName("mass_fraction_of_cloud_liquid_water_in_air", None, "kg kg-1"): G2Param( + 2, 0, 1, 83 + ), + CFName("medium_type_cloud_area_fraction", None, "%"): G2Param(2, 0, 6, 4), + CFName("moisture_content_of_soil_layer", None, "kg m-2"): G2Param(2, 2, 0, 22), + CFName("precipitation_amount", None, "kg m-2"): G2Param(2, 0, 1, 49), + CFName("precipitation_flux", None, "kg m-2 s-1"): G2Param(2, 0, 1, 7), + CFName("relative_humidity", None, "%"): G2Param(2, 0, 1, 1), + CFName("sea_ice_area_fraction", None, "1"): G2Param(2, 10, 2, 0), + CFName("sea_surface_temperature", None, "K"): G2Param(2, 10, 3, 0), + CFName("sea_water_x_velocity", None, "m s-1"): G2Param(2, 10, 1, 2), + CFName("sea_water_y_velocity", None, "m s-1"): G2Param(2, 10, 1, 3), + CFName("snowfall_amount", None, "kg m-2"): G2Param(2, 0, 1, 60), + CFName("snowfall_flux", None, "kg m-2 s-1"): G2Param(2, 0, 1, 53), + CFName("soil_moisture_content", None, "kg m-2"): G2Param(2, 2, 0, 3), + CFName("soil_temperature", None, "K"): G2Param(2, 2, 0, 2), + CFName("specific_humidity", None, "kg kg-1"): G2Param(2, 0, 1, 0), + CFName("stratiform_rainfall_amount", None, "kg m-2"): G2Param(2, 0, 1, 9), + CFName("stratiform_rainfall_flux", None, "kg m-2 s-1"): G2Param(2, 0, 1, 77), + CFName("stratiform_snowfall_amount", None, "kg m-2"): G2Param(2, 0, 1, 15), + CFName("stratiform_snowfall_flux", None, "kg m-2 s-1"): G2Param(2, 0, 1, 59), + CFName("surface_air_pressure", None, "Pa"): G2Param(2, 0, 3, 0), + CFName("surface_altitude", None, "m"): G2Param(2, 2, 0, 7), + CFName("surface_downwelling_longwave_flux_in_air", None, "W m-2"): G2Param( + 2, 0, 5, 3 + ), + CFName("surface_downwelling_shortwave_flux_in_air", None, "W m-2"): G2Param( + 2, 0, 4, 7 + ), + CFName("surface_net_downward_longwave_flux", None, "W m-2"): G2Param(2, 0, 5, 5), + CFName("surface_net_downward_shortwave_flux", None, "W m-2"): G2Param(2, 0, 4, 9), + CFName("surface_roughness_length", None, "m"): G2Param(2, 2, 0, 1), + CFName("surface_runoff_flux", None, "kg m-2 s-1"): G2Param(2, 2, 0, 34), + CFName("surface_temperature", None, "K"): G2Param(2, 0, 0, 17), + CFName("surface_upward_latent_heat_flux", None, "W m-2"): G2Param(2, 0, 0, 10), + CFName("surface_upward_sensible_heat_flux", None, "W m-2"): G2Param(2, 0, 0, 11), + CFName("toa_outgoing_longwave_flux", None, "W m-2"): G2Param(2, 0, 5, 4), + CFName("thickness_of_snowfall_amount", None, "m"): G2Param(2, 0, 1, 11), + CFName("upward_air_velocity", None, "m s-1"): G2Param(2, 0, 2, 9), + CFName("wet_bulb_potential_temperature", None, "K"): G2Param(2, 0, 0, 32), + CFName("wind_from_direction", None, "degrees"): G2Param(2, 0, 2, 0), + CFName("wind_speed", None, "m s-1"): G2Param(2, 0, 2, 1), + CFName("wind_speed_of_gust", None, "m s-1"): G2Param(2, 0, 2, 22), + CFName("x_wind", None, "m s-1"): G2Param(2, 0, 2, 2), + CFName("y_wind", None, "m s-1"): G2Param(2, 0, 2, 3), +} diff --git a/iris_grib/_iris_mercator_support.py b/iris_grib/_iris_mercator_support.py new file mode 100644 index 00000000..92df804d --- /dev/null +++ b/iris_grib/_iris_mercator_support.py @@ -0,0 +1,25 @@ +# Copyright iris-grib contributors +# +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +""" +Temporary module to check for the extended Mercator class in Iris, +which iris-grib requires for its Mercator support. + +""" + +from packaging.version import Version + +import iris + + +def confirm_extended_mercator_supported(): + # Check that Iris version is at least 2.1, required for 'standard_parallel' + # support in the Mercator coord-system. + # This is a temporary fix allowing us to state Iris>=2.0 as a dependency, + # required for this release because Iris 2.1 is not yet available. + iris_version = Version(iris.__version__) + min_mercator_version = Version("2.1.0") + if iris_version < min_mercator_version: + msg = "Support for Mercator projections requires Iris version >= {}" + raise ValueError(msg.format(min_mercator_version)) diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index d0389565..62f6f317 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -26,8 +26,12 @@ from iris.exceptions import TranslationError from . import grib_phenom_translation as itranslation from .grib_phenom_translation import GRIBCode -from iris.fileformats.rules import ConversionMetadata, Factory, Reference, \ - ReferenceTarget +from iris.fileformats.rules import ( + ConversionMetadata, + Factory, + Reference, + ReferenceTarget, +) from iris.util import _is_circular from ._grib1_load_rules import grib1_convert @@ -37,65 +41,58 @@ __all__ = ["convert"] -options = Namespace(warn_on_unsupported=False, - support_hindcast_values=True) +options = Namespace(warn_on_unsupported=False, support_hindcast_values=True) -ScanningMode = namedtuple('ScanningMode', ['i_negative', - 'j_positive', - 'j_consecutive', - 'i_alternative']) +ScanningMode = namedtuple( + "ScanningMode", ["i_negative", "j_positive", "j_consecutive", "i_alternative"] +) -ProjectionCentre = namedtuple('ProjectionCentre', - ['south_pole_on_projection_plane', - 'bipolar_and_symmetric']) +ProjectionCentre = namedtuple( + "ProjectionCentre", ["south_pole_on_projection_plane", "bipolar_and_symmetric"] +) -ResolutionFlags = namedtuple('ResolutionFlags', - ['i_increments_given', - 'j_increments_given', - 'uv_resolved']) +ResolutionFlags = namedtuple( + "ResolutionFlags", ["i_increments_given", "j_increments_given", "uv_resolved"] +) -FixedSurface = namedtuple('FixedSurface', ['standard_name', - 'long_name', - 'units']) +FixedSurface = namedtuple("FixedSurface", ["standard_name", "long_name", "units"]) -InterpolationParameters = namedtuple('InterpolationParameters', - ['interpolation_type', - 'statistical_process', - 'number_of_points_used']) +InterpolationParameters = namedtuple( + "InterpolationParameters", + ["interpolation_type", "statistical_process", "number_of_points_used"], +) # Regulations 92.1.6. _GRID_ACCURACY_IN_DEGREES = 1e-6 # 1/1,000,000 of a degree # Reference Common Code Table C-1. -_CENTRES = { - 'ecmf': 'European Centre for Medium Range Weather Forecasts' -} +_CENTRES = {"ecmf": "European Centre for Medium Range Weather Forecasts"} # Reference Code Table 1.0 _CODE_TABLES_MISSING = 255 # UDUNITS-2 units time string. Reference GRIB2 Code Table 4.4. _TIME_RANGE_UNITS = { - 0: 'minutes', - 1: 'hours', - 2: 'days', + 0: "minutes", + 1: "hours", + 2: "days", # 3: 'months', Unsupported # 4: 'years', Unsupported # 5: '10 years', Unsupported # 6: '30 years', Unsupported # 7: '100 years', Unsupported # 8-9 Reserved - 10: '3 hours', - 11: '6 hours', - 12: '12 hours', - 13: 'seconds' + 10: "3 hours", + 11: "6 hours", + 12: "12 hours", + 13: "seconds", } # Regulation 92.1.4 -_TIME_RANGE_MISSING = 2 ** 32 - 1 +_TIME_RANGE_MISSING = 2**32 - 1 # Reference Code Table 4.5. _FIXED_SURFACE = { - 100: FixedSurface(None, 'pressure', 'Pa'), # Isobaric surface - 103: FixedSurface(None, 'height', 'm') # Height level above ground + 100: FixedSurface(None, "pressure", "Pa"), # Isobaric surface + 103: FixedSurface(None, "height", "m"), # Height level above ground } _TYPE_OF_FIXED_SURFACE_MISSING = 255 @@ -105,16 +102,16 @@ # Reference Code Table 4.10. _STATISTIC_TYPE_NAMES = { - 0: 'mean', - 1: 'sum', - 2: 'maximum', - 3: 'minimum', - 6: 'standard_deviation' + 0: "mean", + 1: "sum", + 2: "maximum", + 3: "minimum", + 6: "standard_deviation", } # Reference Code Table 4.11. _STATISTIC_TYPE_OF_TIME_INTERVAL = { - 2: 'same start time of forecast, forecast time is incremented' + 2: "same start time of forecast, forecast time is incremented" } # NOTE: Our test data contains the value 2, which is all we currently support. # The exact interpretation of this is still unclear. @@ -125,18 +122,17 @@ # InterpolationParameters(spatial process descriptor, statistical process # (octet 35), number of points used in interpolation (octet 37)) _SPATIAL_PROCESSING_TYPES = { - 0: InterpolationParameters('No interpolation', 'cell_method', 0), - 1: InterpolationParameters('Bilinear interpolation', None, 4), - 2: InterpolationParameters('Bicubic interpolation', None, 4), - 3: InterpolationParameters('Nearest neighbour interpolation', None, 1), - 4: InterpolationParameters('Budget interpolation', None, 4), - 5: InterpolationParameters('Spectral interpolation', None, 4), - 6: InterpolationParameters('Neighbour-budget interpolation', None, 4) + 0: InterpolationParameters("No interpolation", "cell_method", 0), + 1: InterpolationParameters("Bilinear interpolation", None, 4), + 2: InterpolationParameters("Bicubic interpolation", None, 4), + 3: InterpolationParameters("Nearest neighbour interpolation", None, 1), + 4: InterpolationParameters("Budget interpolation", None, 4), + 5: InterpolationParameters("Spectral interpolation", None, 4), + 6: InterpolationParameters("Neighbour-budget interpolation", None, 4), } # Class containing details of a probability analysis. -Probability = namedtuple('Probability', - ('probability_type_name', 'threshold')) +Probability = namedtuple("Probability", ("probability_type_name", "threshold")) # List of grid definition template numbers which use either (i,j) or (x,y) # for (lat,lon) @@ -168,10 +164,12 @@ def unscale(value, factor): is returned. """ + def _unscale(v, f): - return v / 10.0 ** f + return v / 10.0**f if isinstance(value, Iterable) or isinstance(factor, Iterable): + def _masker(item): # This is a small work around for an edge case, which is not # evident in any of our sample GRIB2 messages, where an array @@ -181,7 +179,7 @@ def _masker(item): # value is used, selected from a legacy implementation of iris, # to construct the masked array. The valure is transient, only in # scope for this function. - numerical_mdi = 2 ** 32 - 1 + numerical_mdi = 2**32 - 1 item = [numerical_mdi if i is None else i for i in item] result = ma.masked_equal(item, numerical_mdi) if ma.count_masked(result): @@ -190,6 +188,7 @@ def _masker(item): # for data containing _MDI. Remove transient _MDI value. result.data[result.mask] = 0 return result + value = _masker(value) factor = _masker(factor) result = _unscale(value, factor) @@ -218,9 +217,9 @@ def _hindcast_fix(forecast_time): original_forecast_time = forecast_time forecast_time = -(uft - 2 * HIGHBIT) if options.warn_on_unsupported: - msg = ('Re-interpreting large grib forecastTime ' - 'from {} to {}.'.format(original_forecast_time, - forecast_time)) + msg = "Re-interpreting large grib forecastTime " "from {} to {}.".format( + original_forecast_time, forecast_time + ) warnings.warn(msg) return forecast_time @@ -240,8 +239,8 @@ def fixup_float32_from_int32(value): # to treat an integer 0 as a positive zero. if value < 0: value = 0x80000000 - value - value_as_uint32 = np.array(value, dtype='u4') - value_as_float32 = value_as_uint32.view(dtype='f4') + value_as_uint32 = np.array(value, dtype="u4") + value_as_float32 = value_as_uint32.view(dtype="f4") return float(value_as_float32) @@ -266,6 +265,7 @@ def fixup_int32_from_uint32(value): # ############################################################################### + def reference_time_coord(section): """ Translate section 1 reference time according to its significance. @@ -278,27 +278,37 @@ def reference_time_coord(section): """ # Look-up standard name by significanceOfReferenceTime. - _lookup = {0: 'forecast_reference_time', - 1: 'forecast_reference_time', - 2: 'time', - 3: 'time'} + _lookup = { + 0: "forecast_reference_time", + 1: "forecast_reference_time", + 2: "time", + 3: "time", + } # Calculate the reference time and units. - dt = datetime(section['year'], section['month'], section['day'], - section['hour'], section['minute'], section['second']) + dt = datetime( + section["year"], + section["month"], + section["day"], + section["hour"], + section["minute"], + section["second"], + ) # XXX Defaulting to a Gregorian calendar. # Current GRIBAPI does not cover GRIB Section 1 - Octets 22-nn (optional) # which are part of GRIB spec v12. - unit = Unit('hours since epoch', calendar=CALENDAR_GREGORIAN) + unit = Unit("hours since epoch", calendar=CALENDAR_GREGORIAN) point = float(unit.date2num(dt)) # Reference Code Table 1.2. - significanceOfReferenceTime = section['significanceOfReferenceTime'] + significanceOfReferenceTime = section["significanceOfReferenceTime"] standard_name = _lookup.get(significanceOfReferenceTime) if standard_name is None: - msg = 'Identificaton section 1 contains an unsupported significance ' \ - 'of reference time [{}]'.format(significanceOfReferenceTime) + msg = ( + "Identificaton section 1 contains an unsupported significance " + "of reference time [{}]".format(significanceOfReferenceTime) + ) raise TranslationError(msg) # Create the associated reference time of data coordinate. @@ -313,6 +323,7 @@ def reference_time_coord(section): # ############################################################################### + def projection_centre(projectionCentreFlag): """ Translate the projection centre flag bitmask. @@ -330,8 +341,7 @@ def projection_centre(projectionCentreFlag): """ south_pole_on_projection_plane = bool(projectionCentreFlag & 0x80) bipolar_and_symmetric = bool(projectionCentreFlag & 0x40) - return ProjectionCentre(south_pole_on_projection_plane, - bipolar_and_symmetric) + return ProjectionCentre(south_pole_on_projection_plane, bipolar_and_symmetric) def scanning_mode(scanningMode): @@ -355,12 +365,13 @@ def scanning_mode(scanningMode): i_alternative = bool(scanningMode & 0x10) if i_alternative: - msg = 'Grid definition section 3 contains unsupported ' \ - 'alternative row scanning mode' + msg = ( + "Grid definition section 3 contains unsupported " + "alternative row scanning mode" + ) raise TranslationError(msg) - return ScanningMode(i_negative, j_positive, - j_consecutive, i_alternative) + return ScanningMode(i_negative, j_positive, j_consecutive, i_alternative) def resolution_flags(resolutionAndComponentFlags): @@ -416,8 +427,10 @@ def ellipsoid(shapeOfTheEarth, major, minor, radius): """ # Supported shapeOfTheEarth values. if shapeOfTheEarth not in (0, 1, 2, 3, 4, 5, 6, 7): - msg = 'Grid definition section 3 contains an unsupported ' \ - 'shape of the earth [{}]'.format(shapeOfTheEarth) + msg = ( + "Grid definition section 3 contains an unsupported " + "shape of the earth [{}]".format(shapeOfTheEarth) + ) raise TranslationError(msg) if shapeOfTheEarth == 0: @@ -427,8 +440,10 @@ def ellipsoid(shapeOfTheEarth, major, minor, radius): # Earth assumed spherical with radius specified (in m) by # data producer. if ma.is_masked(radius): - msg = 'Ellipsoid for shape of the earth {} requires a' \ - 'radius to be specified.'.format(shapeOfTheEarth) + msg = ( + "Ellipsoid for shape of the earth {} requires a" + "radius to be specified.".format(shapeOfTheEarth) + ) raise ValueError(msg) result = icoord_systems.GeogCS(radius) elif shapeOfTheEarth == 2: @@ -437,12 +452,14 @@ def ellipsoid(shapeOfTheEarth, major, minor, radius): elif shapeOfTheEarth in [3, 7]: # Earth assumed oblate spheroid with major and minor axes # specified (in km)/(in m) by data producer. - emsg_oblate = 'Ellipsoid for shape of the earth [{}] requires a' \ - 'semi-{} axis to be specified.' + emsg_oblate = ( + "Ellipsoid for shape of the earth [{}] requires a" + "semi-{} axis to be specified." + ) if ma.is_masked(major): - raise ValueError(emsg_oblate.format(shapeOfTheEarth, 'major')) + raise ValueError(emsg_oblate.format(shapeOfTheEarth, "major")) if ma.is_masked(minor): - raise ValueError(emsg_oblate.format(shapeOfTheEarth, 'minor')) + raise ValueError(emsg_oblate.format(shapeOfTheEarth, "minor")) # Check whether to convert from km to m. if shapeOfTheEarth == 3: major *= 1000 @@ -450,12 +467,10 @@ def ellipsoid(shapeOfTheEarth, major, minor, radius): result = icoord_systems.GeogCS(major, minor) elif shapeOfTheEarth == 4: # Earth assumed oblate spheroid as defined in IAG-GRS80 model. - result = icoord_systems.GeogCS(6378137, - inverse_flattening=298.257222101) + result = icoord_systems.GeogCS(6378137, inverse_flattening=298.257222101) elif shapeOfTheEarth == 5: # Earth assumed represented by WGS84 (as used by ICAO since 1998). - result = icoord_systems.GeogCS(6378137, - inverse_flattening=298.257223563) + result = icoord_systems.GeogCS(6378137, inverse_flattening=298.257223563) elif shapeOfTheEarth == 6: # Earth assumed spherical with radius of 6 371 229.0m result = icoord_systems.GeogCS(6371229) @@ -476,12 +491,16 @@ def ellipsoid_geometry(section): Tuple containing the major-axis, minor-axis and radius. """ - major = unscale(section['scaledValueOfEarthMajorAxis'], - section['scaleFactorOfEarthMajorAxis']) - minor = unscale(section['scaledValueOfEarthMinorAxis'], - section['scaleFactorOfEarthMinorAxis']) - radius = unscale(section['scaledValueOfRadiusOfSphericalEarth'], - section['scaleFactorOfRadiusOfSphericalEarth']) + major = unscale( + section["scaledValueOfEarthMajorAxis"], section["scaleFactorOfEarthMajorAxis"] + ) + minor = unscale( + section["scaledValueOfEarthMinorAxis"], section["scaleFactorOfEarthMinorAxis"] + ) + radius = unscale( + section["scaledValueOfRadiusOfSphericalEarth"], + section["scaleFactorOfRadiusOfSphericalEarth"], + ) return major, minor, radius @@ -521,50 +540,63 @@ def grid_definition_template_0_and_1(section, metadata, y_name, x_name, cs): """ # Abort if this is a reduced grid, that case isn't handled yet. - if section['numberOfOctectsForNumberOfPoints'] != 0 or \ - section['interpretationOfNumberOfPoints'] != 0: - msg = 'Grid definition section 3 contains unsupported ' \ - 'quasi-regular grid' + if ( + section["numberOfOctectsForNumberOfPoints"] != 0 + or section["interpretationOfNumberOfPoints"] != 0 + ): + msg = "Grid definition section 3 contains unsupported " "quasi-regular grid" raise TranslationError(msg) - scan = scanning_mode(section['scanningMode']) + scan = scanning_mode(section["scanningMode"]) # Set resolution flags - res_flags = resolution_flags(section['resolutionAndComponentFlags']) + res_flags = resolution_flags(section["resolutionAndComponentFlags"]) # Calculate longitude points. - x_inc = (section['iDirectionIncrement'] - if res_flags.i_increments_given - else _calculate_increment(section['longitudeOfFirstGridPoint'], - section['longitudeOfLastGridPoint'], - section['Ni'] - 1, - 360.0 / _GRID_ACCURACY_IN_DEGREES)) + x_inc = ( + section["iDirectionIncrement"] + if res_flags.i_increments_given + else _calculate_increment( + section["longitudeOfFirstGridPoint"], + section["longitudeOfLastGridPoint"], + section["Ni"] - 1, + 360.0 / _GRID_ACCURACY_IN_DEGREES, + ) + ) x_inc *= _GRID_ACCURACY_IN_DEGREES - x_offset = section['longitudeOfFirstGridPoint'] * _GRID_ACCURACY_IN_DEGREES + x_offset = section["longitudeOfFirstGridPoint"] * _GRID_ACCURACY_IN_DEGREES x_direction = -1 if scan.i_negative else 1 - Ni = section['Ni'] + Ni = section["Ni"] x_points = np.arange(Ni, dtype=np.float64) * x_inc * x_direction + x_offset # Determine whether the x-points (in degrees) are circular. circular = _is_circular(x_points, 360.0) # Calculate latitude points. - y_inc = (section['jDirectionIncrement'] - if res_flags.j_increments_given - else _calculate_increment(section['latitudeOfFirstGridPoint'], - section['latitudeOfLastGridPoint'], - section['Nj'] - 1)) + y_inc = ( + section["jDirectionIncrement"] + if res_flags.j_increments_given + else _calculate_increment( + section["latitudeOfFirstGridPoint"], + section["latitudeOfLastGridPoint"], + section["Nj"] - 1, + ) + ) y_inc *= _GRID_ACCURACY_IN_DEGREES - y_offset = section['latitudeOfFirstGridPoint'] * _GRID_ACCURACY_IN_DEGREES + y_offset = section["latitudeOfFirstGridPoint"] * _GRID_ACCURACY_IN_DEGREES y_direction = 1 if scan.j_positive else -1 - Nj = section['Nj'] + Nj = section["Nj"] y_points = np.arange(Nj, dtype=np.float64) * y_inc * y_direction + y_offset # Create the lat/lon coordinates. - y_coord = DimCoord(y_points, standard_name=y_name, units='degrees', - coord_system=cs) - x_coord = DimCoord(x_points, standard_name=x_name, units='degrees', - coord_system=cs, circular=circular) + y_coord = DimCoord(y_points, standard_name=y_name, units="degrees", coord_system=cs) + x_coord = DimCoord( + x_points, + standard_name=x_name, + units="degrees", + coord_system=cs, + circular=circular, + ) # Determine the lat/lon dimensions. y_dim, x_dim = 0, 1 @@ -572,8 +604,8 @@ def grid_definition_template_0_and_1(section, metadata, y_name, x_name, cs): y_dim, x_dim = 1, 0 # Add the lat/lon coordinates to the metadata dim coords. - metadata['dim_coords_and_dims'].append((y_coord, y_dim)) - metadata['dim_coords_and_dims'].append((x_coord, x_dim)) + metadata["dim_coords_and_dims"].append((y_coord, y_dim)) + metadata["dim_coords_and_dims"].append((x_coord, x_dim)) def grid_definition_template_0(section, metadata): @@ -594,9 +626,8 @@ def grid_definition_template_0(section, metadata): """ # Determine the coordinate system. major, minor, radius = ellipsoid_geometry(section) - cs = ellipsoid(section['shapeOfTheEarth'], major, minor, radius) - grid_definition_template_0_and_1(section, metadata, - 'latitude', 'longitude', cs) + cs = ellipsoid(section["shapeOfTheEarth"], major, minor, radius) + grid_definition_template_0_and_1(section, metadata, "latitude", "longitude", cs) def grid_definition_template_1(section, metadata): @@ -616,17 +647,17 @@ def grid_definition_template_1(section, metadata): """ # Determine the coordinate system. major, minor, radius = ellipsoid_geometry(section) - south_pole_lat = (section['latitudeOfSouthernPole'] * - _GRID_ACCURACY_IN_DEGREES) - south_pole_lon = (section['longitudeOfSouthernPole'] * - _GRID_ACCURACY_IN_DEGREES) - cs = icoord_systems.RotatedGeogCS(-south_pole_lat, - math.fmod(south_pole_lon + 180, 360), - section['angleOfRotation'], - ellipsoid(section['shapeOfTheEarth'], - major, minor, radius)) - grid_definition_template_0_and_1(section, metadata, - 'grid_latitude', 'grid_longitude', cs) + south_pole_lat = section["latitudeOfSouthernPole"] * _GRID_ACCURACY_IN_DEGREES + south_pole_lon = section["longitudeOfSouthernPole"] * _GRID_ACCURACY_IN_DEGREES + cs = icoord_systems.RotatedGeogCS( + -south_pole_lat, + math.fmod(south_pole_lon + 180, 360), + section["angleOfRotation"], + ellipsoid(section["shapeOfTheEarth"], major, minor, radius), + ) + grid_definition_template_0_and_1( + section, metadata, "grid_latitude", "grid_longitude", cs + ) def grid_definition_template_4_and_5(section, metadata, y_name, x_name, cs): @@ -656,40 +687,44 @@ def grid_definition_template_4_and_5(section, metadata, y_name, x_name, cs): """ # Determine the (variable) units of resolution. - key = 'basicAngleOfTheInitialProductionDomain' + key = "basicAngleOfTheInitialProductionDomain" basicAngleOfTheInitialProductDomain = section[key] - subdivisionsOfBasicAngle = section['subdivisionsOfBasicAngle'] + subdivisionsOfBasicAngle = section["subdivisionsOfBasicAngle"] if basicAngleOfTheInitialProductDomain in [0, _MDI]: - basicAngleOfTheInitialProductDomain = 1. + basicAngleOfTheInitialProductDomain = 1.0 if subdivisionsOfBasicAngle in [0, _MDI]: - subdivisionsOfBasicAngle = 1. / _GRID_ACCURACY_IN_DEGREES + subdivisionsOfBasicAngle = 1.0 / _GRID_ACCURACY_IN_DEGREES resolution = np.float64(basicAngleOfTheInitialProductDomain) resolution /= subdivisionsOfBasicAngle - flags = resolution_flags(section['resolutionAndComponentFlags']) + flags = resolution_flags(section["resolutionAndComponentFlags"]) # Grid Definition Template 3.4. Notes (2). # Flag bits 3-4 are not applicable for this template. if flags.uv_resolved and options.warn_on_unsupported: - msg = 'Unable to translate resolution and component flags.' + msg = "Unable to translate resolution and component flags." warnings.warn(msg) # Calculate the latitude and longitude points. - x_points = np.array(section['longitudes'], dtype=np.float64) * resolution - y_points = np.array(section['latitudes'], dtype=np.float64) * resolution + x_points = np.array(section["longitudes"], dtype=np.float64) * resolution + y_points = np.array(section["latitudes"], dtype=np.float64) * resolution # Determine whether the x-points (in degrees) are circular. circular = _is_circular(x_points, 360.0) # Create the lat/lon coordinates. - y_coord = DimCoord(y_points, standard_name=y_name, units='degrees', - coord_system=cs) - x_coord = DimCoord(x_points, standard_name=x_name, units='degrees', - coord_system=cs, circular=circular) + y_coord = DimCoord(y_points, standard_name=y_name, units="degrees", coord_system=cs) + x_coord = DimCoord( + x_points, + standard_name=x_name, + units="degrees", + coord_system=cs, + circular=circular, + ) - scan = scanning_mode(section['scanningMode']) + scan = scanning_mode(section["scanningMode"]) # Determine the lat/lon dimensions. y_dim, x_dim = 0, 1 @@ -697,8 +732,8 @@ def grid_definition_template_4_and_5(section, metadata, y_name, x_name, cs): y_dim, x_dim = 1, 0 # Add the lat/lon coordinates to the metadata dim coords. - metadata['dim_coords_and_dims'].append((y_coord, y_dim)) - metadata['dim_coords_and_dims'].append((x_coord, x_dim)) + metadata["dim_coords_and_dims"].append((y_coord, y_dim)) + metadata["dim_coords_and_dims"].append((x_coord, x_dim)) def grid_definition_template_4(section, metadata): @@ -718,9 +753,8 @@ def grid_definition_template_4(section, metadata): """ # Determine the coordinate system. major, minor, radius = ellipsoid_geometry(section) - cs = ellipsoid(section['shapeOfTheEarth'], major, minor, radius) - grid_definition_template_4_and_5(section, metadata, - 'latitude', 'longitude', cs) + cs = ellipsoid(section["shapeOfTheEarth"], major, minor, radius) + grid_definition_template_4_and_5(section, metadata, "latitude", "longitude", cs) def grid_definition_template_5(section, metadata): @@ -741,17 +775,17 @@ def grid_definition_template_5(section, metadata): """ # Determine the coordinate system. major, minor, radius = ellipsoid_geometry(section) - south_pole_lat = (section['latitudeOfSouthernPole'] * - _GRID_ACCURACY_IN_DEGREES) - south_pole_lon = (section['longitudeOfSouthernPole'] * - _GRID_ACCURACY_IN_DEGREES) - cs = icoord_systems.RotatedGeogCS(-south_pole_lat, - math.fmod(south_pole_lon + 180, 360), - section['angleOfRotation'], - ellipsoid(section['shapeOfTheEarth'], - major, minor, radius)) - grid_definition_template_4_and_5(section, metadata, - 'grid_latitude', 'grid_longitude', cs) + south_pole_lat = section["latitudeOfSouthernPole"] * _GRID_ACCURACY_IN_DEGREES + south_pole_lon = section["longitudeOfSouthernPole"] * _GRID_ACCURACY_IN_DEGREES + cs = icoord_systems.RotatedGeogCS( + -south_pole_lat, + math.fmod(south_pole_lon + 180, 360), + section["angleOfRotation"], + ellipsoid(section["shapeOfTheEarth"], major, minor, radius), + ) + grid_definition_template_4_and_5( + section, metadata, "grid_latitude", "grid_longitude", cs + ) def grid_definition_template_10(section, metadata): @@ -770,18 +804,16 @@ def grid_definition_template_10(section, metadata): """ major, minor, radius = ellipsoid_geometry(section) - geog_cs = ellipsoid(section['shapeOfTheEarth'], major, minor, radius) + geog_cs = ellipsoid(section["shapeOfTheEarth"], major, minor, radius) # standard_parallel is the latitude at which the Mercator projection # intersects the Earth - standard_parallel = section['LaD'] * _GRID_ACCURACY_IN_DEGREES + standard_parallel = section["LaD"] * _GRID_ACCURACY_IN_DEGREES - cs = icoord_systems.Mercator(standard_parallel=standard_parallel, - ellipsoid=geog_cs) + cs = icoord_systems.Mercator(standard_parallel=standard_parallel, ellipsoid=geog_cs) # Create the X and Y coordinates. - x_coord, y_coord, scan = _calculate_proj_coords_from_grid_lengths(section, - cs) + x_coord, y_coord, scan = _calculate_proj_coords_from_grid_lengths(section, cs) # Determine the lat/lon dimensions. y_dim, x_dim = 0, 1 @@ -789,8 +821,8 @@ def grid_definition_template_10(section, metadata): y_dim, x_dim = 1, 0 # Add the X and Y coordinates to the metadata dim coords. - metadata['dim_coords_and_dims'].append((y_coord, y_dim)) - metadata['dim_coords_and_dims'].append((x_coord, x_dim)) + metadata["dim_coords_and_dims"].append((y_coord, y_dim)) + metadata["dim_coords_and_dims"].append((x_coord, x_dim)) def grid_definition_template_12(section, metadata): @@ -809,27 +841,26 @@ def grid_definition_template_12(section, metadata): """ major, minor, radius = ellipsoid_geometry(section) - geog_cs = ellipsoid(section['shapeOfTheEarth'], major, minor, radius) + geog_cs = ellipsoid(section["shapeOfTheEarth"], major, minor, radius) - lat = section['latitudeOfReferencePoint'] * _GRID_ACCURACY_IN_DEGREES - lon = section['longitudeOfReferencePoint'] * _GRID_ACCURACY_IN_DEGREES - scale = section['scaleFactorAtReferencePoint'] + lat = section["latitudeOfReferencePoint"] * _GRID_ACCURACY_IN_DEGREES + lon = section["longitudeOfReferencePoint"] * _GRID_ACCURACY_IN_DEGREES + scale = section["scaleFactorAtReferencePoint"] # Catch bug in ECMWF GRIB API (present at 1.12.1) where the scale # is treated as a signed, 4-byte integer. if isinstance(scale, int): scale = fixup_float32_from_int32(scale) CM_TO_M = 0.01 - easting = section['XR'] * CM_TO_M - northing = section['YR'] * CM_TO_M - cs = icoord_systems.TransverseMercator(lat, lon, easting, northing, - scale, geog_cs) + easting = section["XR"] * CM_TO_M + northing = section["YR"] * CM_TO_M + cs = icoord_systems.TransverseMercator(lat, lon, easting, northing, scale, geog_cs) # Deal with bug in ECMWF GRIB API (present at 1.12.1) where these # values are treated as unsigned, 4-byte integers. - x1 = fixup_int32_from_uint32(section['X1']) - y1 = fixup_int32_from_uint32(section['Y1']) - x2 = fixup_int32_from_uint32(section['X2']) - y2 = fixup_int32_from_uint32(section['Y2']) + x1 = fixup_int32_from_uint32(section["X1"]) + y1 = fixup_int32_from_uint32(section["Y1"]) + x2 = fixup_int32_from_uint32(section["X2"]) + y2 = fixup_int32_from_uint32(section["Y2"]) # Rather unhelpfully this grid definition template seems to be # overspecified, and thus open to inconsistency. But for determining @@ -844,13 +875,14 @@ def check_range(v1, v2, n, d, axis_name): max_last = small + (n - 1) * (d + 1) if not (min_last < large < max_last): message = ( - f'File grid {axis_name} definition inconsistent: ' - f'{v1} to {v2} in {n} steps is incompatible with step-size ' - f'{d} .' + f"File grid {axis_name} definition inconsistent: " + f"{v1} to {v2} in {n} steps is incompatible with step-size " + f"{d} ." ) raise TranslationError(message) - check_range(x1, x2, section['Ni'], section['Di'], 'X') - check_range(y1, y2, section['Nj'], section['Dj'], 'Y') + + check_range(x1, x2, section["Ni"], section["Di"], "X") + check_range(y1, y2, section["Nj"], section["Dj"], "Y") # Further over-specification - the sequence of X1 & X2 is enough to # generate the sequence in the correct direction (also Y1 & Y2). All @@ -858,6 +890,7 @@ def check_range(v1, v2, n, d, axis_name): def validate_scanning(axis: str, stated: bool, encoded: bool): def scan_str(scanning_bool): return "positive" if scanning_bool else "negative" + if stated != encoded: message = ( f"File grid {axis} definition inconsistent: " @@ -865,18 +898,17 @@ def scan_str(scanning_bool): f"direction is {scan_str(encoded)}." ) warnings.warn(message) - scan = scanning_mode(section['scanningMode']) + + scan = scanning_mode(section["scanningMode"]) validate_scanning("X", not scan.i_negative, x1 < x2) validate_scanning("Y", scan.j_positive, y1 < y2) - x_points = np.linspace(x1 * CM_TO_M, x2 * CM_TO_M, section['Ni']) - y_points = np.linspace(y1 * CM_TO_M, y2 * CM_TO_M, section['Nj']) + x_points = np.linspace(x1 * CM_TO_M, x2 * CM_TO_M, section["Ni"]) + y_points = np.linspace(y1 * CM_TO_M, y2 * CM_TO_M, section["Nj"]) # Create the X and Y coordinates. - y_coord = DimCoord(y_points, 'projection_y_coordinate', units='m', - coord_system=cs) - x_coord = DimCoord(x_points, 'projection_x_coordinate', units='m', - coord_system=cs) + y_coord = DimCoord(y_points, "projection_y_coordinate", units="m", coord_system=cs) + x_coord = DimCoord(x_points, "projection_x_coordinate", units="m", coord_system=cs) # Determine the lat/lon dimensions. y_dim, x_dim = 0, 1 @@ -884,8 +916,8 @@ def scan_str(scanning_bool): y_dim, x_dim = 1, 0 # Add the X and Y coordinates to the metadata dim coords. - metadata['dim_coords_and_dims'].append((y_coord, y_dim)) - metadata['dim_coords_and_dims'].append((x_coord, x_dim)) + metadata["dim_coords_and_dims"].append((y_coord, y_dim)) + metadata["dim_coords_and_dims"].append((x_coord, x_dim)) def grid_definition_template_20(section, metadata): @@ -904,25 +936,28 @@ def grid_definition_template_20(section, metadata): """ major, minor, radius = ellipsoid_geometry(section) - geog_cs = ellipsoid(section['shapeOfTheEarth'], major, minor, radius) + geog_cs = ellipsoid(section["shapeOfTheEarth"], major, minor, radius) - proj_centre = projection_centre(section['projectionCentreFlag']) + proj_centre = projection_centre(section["projectionCentreFlag"]) if proj_centre.bipolar_and_symmetric: - raise TranslationError('Bipolar and symmetric polar stereo projections' - ' are not supported by the ' - 'grid_definition_template_20 translation.') + raise TranslationError( + "Bipolar and symmetric polar stereo projections" + " are not supported by the " + "grid_definition_template_20 translation." + ) if proj_centre.south_pole_on_projection_plane: - central_lat = -90. + central_lat = -90.0 else: - central_lat = 90. - central_lon = section['orientationOfTheGrid'] * _GRID_ACCURACY_IN_DEGREES - true_scale_lat = section['LaD'] * _GRID_ACCURACY_IN_DEGREES - cs = icoord_systems.Stereographic(central_lat=central_lat, - central_lon=central_lon, - true_scale_lat=true_scale_lat, - ellipsoid=geog_cs) - x_coord, y_coord, scan = _calculate_proj_coords_from_grid_lengths(section, - cs) + central_lat = 90.0 + central_lon = section["orientationOfTheGrid"] * _GRID_ACCURACY_IN_DEGREES + true_scale_lat = section["LaD"] * _GRID_ACCURACY_IN_DEGREES + cs = icoord_systems.Stereographic( + central_lat=central_lat, + central_lon=central_lon, + true_scale_lat=true_scale_lat, + ellipsoid=geog_cs, + ) + x_coord, y_coord, scan = _calculate_proj_coords_from_grid_lengths(section, cs) # Determine the order of the dimensions. y_dim, x_dim = 0, 1 @@ -930,8 +965,8 @@ def grid_definition_template_20(section, metadata): y_dim, x_dim = 1, 0 # Add the projection coordinates to the metadata dim coords. - metadata['dim_coords_and_dims'].append((y_coord, y_dim)) - metadata['dim_coords_and_dims'].append((x_coord, x_dim)) + metadata["dim_coords_and_dims"].append((y_coord, y_dim)) + metadata["dim_coords_and_dims"].append((x_coord, x_dim)) def _calculate_proj_coords_from_grid_lengths(section, cs): @@ -942,30 +977,29 @@ def _calculate_proj_coords_from_grid_lengths(section, cs): # Conversion factor millimetres to metres mm_to_m = 1e-3 - if section['gridDefinitionTemplateNumber'] in _XYGRIDLENGTH_GDT_NUMBERS: - if section['gridDefinitionTemplateNumber'] == 140: - dx = section['xDirectionGridLengthInMillimetres'] - dy = section['yDirectionGridLengthInMillimetres'] - nx = section['numberOfPointsAlongXAxis'] - ny = section['numberOfPointsAlongYAxis'] + if section["gridDefinitionTemplateNumber"] in _XYGRIDLENGTH_GDT_NUMBERS: + if section["gridDefinitionTemplateNumber"] == 140: + dx = section["xDirectionGridLengthInMillimetres"] + dy = section["yDirectionGridLengthInMillimetres"] + nx = section["numberOfPointsAlongXAxis"] + ny = section["numberOfPointsAlongYAxis"] else: - dx = section['Dx'] - dy = section['Dy'] - nx = section['Nx'] - ny = section['Ny'] - elif section['gridDefinitionTemplateNumber'] in _IJGRIDLENGTH_GDT_NUMBERS: - dx = section['Di'] - dy = section['Dj'] - nx = section['Ni'] - ny = section['Nj'] + dx = section["Dx"] + dy = section["Dy"] + nx = section["Nx"] + ny = section["Ny"] + elif section["gridDefinitionTemplateNumber"] in _IJGRIDLENGTH_GDT_NUMBERS: + dx = section["Di"] + dy = section["Dj"] + nx = section["Ni"] + ny = section["Nj"] else: - raise TranslationError('Unsupported lat-lon point parameters') + raise TranslationError("Unsupported lat-lon point parameters") - scan = scanning_mode(section['scanningMode']) - lon_0 = section['longitudeOfFirstGridPoint'] * _GRID_ACCURACY_IN_DEGREES - lat_0 = section['latitudeOfFirstGridPoint'] * _GRID_ACCURACY_IN_DEGREES - x0_m, y0_m = cs.as_cartopy_crs().transform_point( - lon_0, lat_0, ccrs.Geodetic()) + scan = scanning_mode(section["scanningMode"]) + lon_0 = section["longitudeOfFirstGridPoint"] * _GRID_ACCURACY_IN_DEGREES + lat_0 = section["latitudeOfFirstGridPoint"] * _GRID_ACCURACY_IN_DEGREES + x0_m, y0_m = cs.as_cartopy_crs().transform_point(lon_0, lat_0, ccrs.Geodetic()) dx_m = dx * mm_to_m dy_m = dy * mm_to_m x_dir = -1 if scan.i_negative else 1 @@ -974,10 +1008,12 @@ def _calculate_proj_coords_from_grid_lengths(section, cs): y_points = y0_m + dy_m * y_dir * np.arange(ny, dtype=np.float64) # Create the dimension coordinates. - x_coord = DimCoord(x_points, standard_name='projection_x_coordinate', - units='m', coord_system=cs) - y_coord = DimCoord(y_points, standard_name='projection_y_coordinate', - units='m', coord_system=cs) + x_coord = DimCoord( + x_points, standard_name="projection_x_coordinate", units="m", coord_system=cs + ) + y_coord = DimCoord( + y_points, standard_name="projection_y_coordinate", units="m", coord_system=cs + ) return x_coord, y_coord, scan @@ -997,42 +1033,45 @@ def grid_definition_template_30(section, metadata): """ major, minor, radius = ellipsoid_geometry(section) - geog_cs = ellipsoid(section['shapeOfTheEarth'], major, minor, radius) + geog_cs = ellipsoid(section["shapeOfTheEarth"], major, minor, radius) - central_latitude = section['LaD'] * _GRID_ACCURACY_IN_DEGREES - central_longitude = section['LoV'] * _GRID_ACCURACY_IN_DEGREES + central_latitude = section["LaD"] * _GRID_ACCURACY_IN_DEGREES + central_longitude = section["LoV"] * _GRID_ACCURACY_IN_DEGREES false_easting = 0 false_northing = 0 - secant_latitudes = (section['Latin1'] * _GRID_ACCURACY_IN_DEGREES, - section['Latin2'] * _GRID_ACCURACY_IN_DEGREES) - - cs = icoord_systems.LambertConformal(central_latitude, - central_longitude, - false_easting, - false_northing, - secant_latitudes=secant_latitudes, - ellipsoid=geog_cs) + secant_latitudes = ( + section["Latin1"] * _GRID_ACCURACY_IN_DEGREES, + section["Latin2"] * _GRID_ACCURACY_IN_DEGREES, + ) + + cs = icoord_systems.LambertConformal( + central_latitude, + central_longitude, + false_easting, + false_northing, + secant_latitudes=secant_latitudes, + ellipsoid=geog_cs, + ) # A projection centre flag is defined for GDT30. However, we don't need to # know which pole is in the projection plane as Cartopy handles that. The # Other component of the projection centre flag determines if there are # multiple projection centres. There is no support for this in Proj4 or # Cartopy so a translation error is raised if this flag is set. - proj_centre = projection_centre(section['projectionCentreFlag']) + proj_centre = projection_centre(section["projectionCentreFlag"]) if proj_centre.bipolar_and_symmetric: - msg = 'Unsupported projection centre: Bipolar and symmetric.' + msg = "Unsupported projection centre: Bipolar and symmetric." raise TranslationError(msg) - res_flags = resolution_flags(section['resolutionAndComponentFlags']) + res_flags = resolution_flags(section["resolutionAndComponentFlags"]) if not res_flags.uv_resolved and options.warn_on_unsupported: # Vector components are given as relative to east an north, rather than # relative to the projection coordinates, issue a warning in this case. # (ideally we need a way to add this information to a cube) - msg = 'Unable to translate resolution and component flags.' + msg = "Unable to translate resolution and component flags." warnings.warn(msg) - x_coord, y_coord, scan = _calculate_proj_coords_from_grid_lengths(section, - cs) + x_coord, y_coord, scan = _calculate_proj_coords_from_grid_lengths(section, cs) # Determine the order of the dimensions. y_dim, x_dim = 0, 1 @@ -1040,8 +1079,8 @@ def grid_definition_template_30(section, metadata): y_dim, x_dim = 1, 0 # Add the projection coordinates to the metadata dim coords. - metadata['dim_coords_and_dims'].append((y_coord, y_dim)) - metadata['dim_coords_and_dims'].append((x_coord, x_dim)) + metadata["dim_coords_and_dims"].append((y_coord, y_dim)) + metadata["dim_coords_and_dims"].append((x_coord, x_dim)) def grid_definition_template_40(section, metadata): @@ -1060,10 +1099,12 @@ def grid_definition_template_40(section, metadata): """ major, minor, radius = ellipsoid_geometry(section) - cs = ellipsoid(section['shapeOfTheEarth'], major, minor, radius) + cs = ellipsoid(section["shapeOfTheEarth"], major, minor, radius) - if section['numberOfOctectsForNumberOfPoints'] != 0 or \ - section['interpretationOfNumberOfPoints'] != 0: + if ( + section["numberOfOctectsForNumberOfPoints"] != 0 + or section["interpretationOfNumberOfPoints"] != 0 + ): grid_definition_template_40_reduced(section, metadata, cs) else: grid_definition_template_40_regular(section, metadata, cs) @@ -1074,22 +1115,26 @@ def grid_definition_template_40_regular(section, metadata, cs): Translate template representing a regular Gaussian grid. """ - scan = scanning_mode(section['scanningMode']) + scan = scanning_mode(section["scanningMode"]) # Set resolution flags - res_flags = resolution_flags(section['resolutionAndComponentFlags']) + res_flags = resolution_flags(section["resolutionAndComponentFlags"]) # Calculate longitude points. - x_inc = (section['iDirectionIncrement'] - if res_flags.i_increments_given - else _calculate_increment(section['longitudeOfFirstGridPoint'], - section['longitudeOfLastGridPoint'], - section['Ni'] - 1, - 360.0 / _GRID_ACCURACY_IN_DEGREES)) + x_inc = ( + section["iDirectionIncrement"] + if res_flags.i_increments_given + else _calculate_increment( + section["longitudeOfFirstGridPoint"], + section["longitudeOfLastGridPoint"], + section["Ni"] - 1, + 360.0 / _GRID_ACCURACY_IN_DEGREES, + ) + ) x_inc *= _GRID_ACCURACY_IN_DEGREES - x_offset = section['longitudeOfFirstGridPoint'] * _GRID_ACCURACY_IN_DEGREES + x_offset = section["longitudeOfFirstGridPoint"] * _GRID_ACCURACY_IN_DEGREES x_direction = -1 if scan.i_negative else 1 - Ni = section['Ni'] + Ni = section["Ni"] x_points = np.arange(Ni, dtype=np.float64) * x_inc * x_direction + x_offset # Determine whether the x-points (in degrees) are circular. @@ -1125,17 +1170,22 @@ def grid_definition_template_40_regular(section, metadata, cs): # GRIB2 message. This computed key provides a rapid calculation of the # monotonic latitude points that form the Gaussian grid, accounting for # the coverage of the grid. - y_points = section.get_computed_key('distinctLatitudes') + y_points = section.get_computed_key("distinctLatitudes") y_points.sort() if not scan.j_positive: y_points = y_points[::-1] # Create lat/lon coordinates. - x_coord = DimCoord(x_points, standard_name='longitude', - units='degrees', coord_system=cs, - circular=circular) - y_coord = DimCoord(y_points, standard_name='latitude', - units='degrees', coord_system=cs) + x_coord = DimCoord( + x_points, + standard_name="longitude", + units="degrees", + coord_system=cs, + circular=circular, + ) + y_coord = DimCoord( + y_points, standard_name="latitude", units="degrees", coord_system=cs + ) # Determine the lat/lon dimensions. y_dim, x_dim = 0, 1 @@ -1143,8 +1193,8 @@ def grid_definition_template_40_regular(section, metadata, cs): y_dim, x_dim = 1, 0 # Add the lat/lon coordinates to the metadata dim coords. - metadata['dim_coords_and_dims'].append((y_coord, y_dim)) - metadata['dim_coords_and_dims'].append((x_coord, x_dim)) + metadata["dim_coords_and_dims"].append((y_coord, y_dim)) + metadata["dim_coords_and_dims"].append((x_coord, x_dim)) def grid_definition_template_40_reduced(section, metadata, cs): @@ -1162,18 +1212,20 @@ def grid_definition_template_40_reduced(section, metadata, cs): # from coded keys, it would be complex and time-consuming compared to # loading the latitude and longitude arrays directly using the computed # keys 'latitudes' and 'longitudes'. - x_points = section.get_computed_key('longitudes') - y_points = section.get_computed_key('latitudes') + x_points = section.get_computed_key("longitudes") + y_points = section.get_computed_key("latitudes") # Create lat/lon coordinates. - x_coord = AuxCoord(x_points, standard_name='longitude', - units='degrees', coord_system=cs) - y_coord = AuxCoord(y_points, standard_name='latitude', - units='degrees', coord_system=cs) + x_coord = AuxCoord( + x_points, standard_name="longitude", units="degrees", coord_system=cs + ) + y_coord = AuxCoord( + y_points, standard_name="latitude", units="degrees", coord_system=cs + ) # Add the lat/lon coordinates to the metadata dim coords. - metadata['aux_coords_and_dims'].append((y_coord, 0)) - metadata['aux_coords_and_dims'].append((x_coord, 0)) + metadata["aux_coords_and_dims"].append((y_coord, 0)) + metadata["aux_coords_and_dims"].append((x_coord, 0)) def grid_definition_template_90(section, metadata): @@ -1191,26 +1243,29 @@ def grid_definition_template_90(section, metadata): :class:`collections.OrderedDict` of metadata. """ - if section['Nr'] == _MDI: - raise TranslationError('Unsupported orthographic grid.') - elif section['Nr'] == 0: - raise TranslationError('Unsupported zero height for space-view.') - if section['orientationOfTheGrid'] != 0: - raise TranslationError('Unsupported space-view orientation.') + if section["Nr"] == _MDI: + raise TranslationError("Unsupported orthographic grid.") + elif section["Nr"] == 0: + raise TranslationError("Unsupported zero height for space-view.") + if section["orientationOfTheGrid"] != 0: + raise TranslationError("Unsupported space-view orientation.") # Determine the coordinate system. - sub_satellite_lat = (section['latitudeOfSubSatellitePoint'] * - _GRID_ACCURACY_IN_DEGREES) + sub_satellite_lat = ( + section["latitudeOfSubSatellitePoint"] * _GRID_ACCURACY_IN_DEGREES + ) # The subsequent calculations to determine the apparent Earth # diameters rely on the satellite being over the equator. if sub_satellite_lat != 0: - raise TranslationError('Unsupported non-zero latitude for ' - 'space-view perspective.') - sub_satellite_lon = (section['longitudeOfSubSatellitePoint'] * - _GRID_ACCURACY_IN_DEGREES) + raise TranslationError( + "Unsupported non-zero latitude for " "space-view perspective." + ) + sub_satellite_lon = ( + section["longitudeOfSubSatellitePoint"] * _GRID_ACCURACY_IN_DEGREES + ) major, minor, radius = ellipsoid_geometry(section) - geog_cs = ellipsoid(section['shapeOfTheEarth'], major, minor, radius) - height_above_centre = geog_cs.semi_major_axis * section['Nr'] / 1e6 + geog_cs = ellipsoid(section["shapeOfTheEarth"], major, minor, radius) + height_above_centre = geog_cs.semi_major_axis * section["Nr"] / 1e6 height_above_ellipsoid = height_above_centre - geog_cs.semi_major_axis # Figure out how large the Earth would appear in projection coordinates. @@ -1233,30 +1288,31 @@ def grid_definition_template_90(section, metadata): # ------------ # a / cos(psi) # This can be simplified using: cos(psi) = a / height_above_centre - half_apparent_equatorial_angle = math.asin(geog_cs.semi_major_axis / - height_above_centre) + half_apparent_equatorial_angle = math.asin( + geog_cs.semi_major_axis / height_above_centre + ) parametric_angle = math.acos(geog_cs.semi_major_axis / height_above_centre) - half_apparent_polar_angle = math.atan(geog_cs.semi_minor_axis / - (height_above_centre * - math.sin(parametric_angle))) + half_apparent_polar_angle = math.atan( + geog_cs.semi_minor_axis / (height_above_centre * math.sin(parametric_angle)) + ) y_apparent_angular_diameter = 2 * half_apparent_polar_angle x_apparent_angular_diameter = 2 * half_apparent_equatorial_angle - y_step = y_apparent_angular_diameter / section['dy'] - x_step = x_apparent_angular_diameter / section['dx'] - y_start = y_step * (section['Yo'] - section['Yp'] / 1000) - x_start = x_step * (section['Xo'] - section['Xp'] / 1000) - y_points = y_start + np.arange(section['Ny']) * y_step - x_points = x_start + np.arange(section['Nx']) * x_step + y_step = y_apparent_angular_diameter / section["dy"] + x_step = x_apparent_angular_diameter / section["dx"] + y_start = y_step * (section["Yo"] - section["Yp"] / 1000) + x_start = x_step * (section["Xo"] - section["Xp"] / 1000) + y_points = y_start + np.arange(section["Ny"]) * y_step + x_points = x_start + np.arange(section["Nx"]) * x_step # This has only been tested with -x/+y scanning, so raise an error # for other permutations. - scan = scanning_mode(section['scanningMode']) + scan = scanning_mode(section["scanningMode"]) if scan.i_negative: x_points = -x_points else: - raise TranslationError('Unsupported +x scanning') + raise TranslationError("Unsupported +x scanning") if not scan.j_positive: - raise TranslationError('Unsupported -y scanning') + raise TranslationError("Unsupported -y scanning") # Make a coordinate system for the X and Y coordinates. # Note: false_easting/northing are always just zero, as the calculation of @@ -1265,14 +1321,17 @@ def grid_definition_template_90(section, metadata): latitude_of_projection_origin=sub_satellite_lat, longitude_of_projection_origin=sub_satellite_lon, perspective_point_height=height_above_ellipsoid, - sweep_angle_axis='y', - ellipsoid=geog_cs) + sweep_angle_axis="y", + ellipsoid=geog_cs, + ) # Create the X and Y coordinates. - y_coord = DimCoord(y_points, 'projection_y_coordinate', units='radians', - coord_system=cs) - x_coord = DimCoord(x_points, 'projection_x_coordinate', units='radians', - coord_system=cs) + y_coord = DimCoord( + y_points, "projection_y_coordinate", units="radians", coord_system=cs + ) + x_coord = DimCoord( + x_points, "projection_x_coordinate", units="radians", coord_system=cs + ) # Determine the lat/lon dimensions. y_dim, x_dim = 0, 1 @@ -1280,8 +1339,8 @@ def grid_definition_template_90(section, metadata): y_dim, x_dim = 1, 0 # Add the X and Y coordinates to the metadata dim coords. - metadata['dim_coords_and_dims'].append((y_coord, y_dim)) - metadata['dim_coords_and_dims'].append((x_coord, x_dim)) + metadata["dim_coords_and_dims"].append((y_coord, y_dim)) + metadata["dim_coords_and_dims"].append((x_coord, x_dim)) def grid_definition_template_140(section, metadata): @@ -1301,14 +1360,14 @@ def grid_definition_template_140(section, metadata): # Define the coordinate system major, minor, radius = ellipsoid_geometry(section) cs = icoord_systems.LambertAzimuthalEqualArea( - section['standardParallelInMicrodegrees'] * _GRID_ACCURACY_IN_DEGREES, - section['centralLongitudeInMicrodegrees'] * _GRID_ACCURACY_IN_DEGREES, + section["standardParallelInMicrodegrees"] * _GRID_ACCURACY_IN_DEGREES, + section["centralLongitudeInMicrodegrees"] * _GRID_ACCURACY_IN_DEGREES, 0, 0, - ellipsoid(section['shapeOfTheEarth'], major, minor, radius)) + ellipsoid(section["shapeOfTheEarth"], major, minor, radius), + ) - x_coord, y_coord, scan = \ - _calculate_proj_coords_from_grid_lengths(section, cs) + x_coord, y_coord, scan = _calculate_proj_coords_from_grid_lengths(section, cs) # Determine the order of the dimensions. y_dim, x_dim = 0, 1 @@ -1316,8 +1375,8 @@ def grid_definition_template_140(section, metadata): y_dim, x_dim = 1, 0 # Add the projection coordinates to the metadata dim coords. - metadata['dim_coords_and_dims'].append((y_coord, y_dim)) - metadata['dim_coords_and_dims'].append((x_coord, x_dim)) + metadata["dim_coords_and_dims"].append((y_coord, y_dim)) + metadata["dim_coords_and_dims"].append((x_coord, x_dim)) def grid_definition_section(section, metadata): @@ -1336,14 +1395,16 @@ def grid_definition_section(section, metadata): """ # Reference GRIB2 Code Table 3.0. - value = section['sourceOfGridDefinition'] + value = section["sourceOfGridDefinition"] if value != 0: - msg = 'Grid definition section 3 contains unsupported ' \ - 'source of grid definition [{}]'.format(value) + msg = ( + "Grid definition section 3 contains unsupported " + "source of grid definition [{}]".format(value) + ) raise TranslationError(msg) # Reference GRIB2 Code Table 3.1. - template = section['gridDefinitionTemplateNumber'] + template = section["gridDefinitionTemplateNumber"] if template == 0: # Process regular latitude/longitude grid (regular_ll) @@ -1378,7 +1439,7 @@ def grid_definition_section(section, metadata): # Process Lambert Azimuthal Equal Area. grid_definition_template_140(section, metadata) else: - msg = 'Grid definition template [{}] is not supported'.format(template) + msg = "Grid definition template [{}] is not supported".format(template) raise TranslationError(msg) @@ -1388,10 +1449,17 @@ def grid_definition_section(section, metadata): # ############################################################################### -def translate_phenomenon(metadata, discipline, parameterCategory, - parameterNumber, typeOfFirstFixedSurface, - scaledValueOfFirstFixedSurface, - typeOfSecondFixedSurface, probability=None): + +def translate_phenomenon( + metadata, + discipline, + parameterCategory, + parameterNumber, + typeOfFirstFixedSurface, + scaledValueOfFirstFixedSurface, + typeOfSecondFixedSurface, + probability=None, +): """ Translate GRIB2 phenomenon to CF phenomenon. @@ -1418,54 +1486,60 @@ def translate_phenomenon(metadata, discipline, parameterCategory, given properties. """ - cf = itranslation.grib2_phenom_to_cf_info(param_discipline=discipline, - param_category=parameterCategory, - param_number=parameterNumber) + cf = itranslation.grib2_phenom_to_cf_info( + param_discipline=discipline, + param_category=parameterCategory, + param_number=parameterNumber, + ) if cf is not None: if probability is None: - metadata['standard_name'] = cf.standard_name - metadata['long_name'] = cf.long_name - metadata['units'] = cf.units + metadata["standard_name"] = cf.standard_name + metadata["long_name"] = cf.long_name + metadata["units"] = cf.units else: # The basic name+unit info goes into a 'threshold coordinate' which # encodes probability threshold values. threshold_coord = DimCoord( probability.threshold, - standard_name=cf.standard_name, long_name=cf.long_name, - units=cf.units) - metadata['aux_coords_and_dims'].append((threshold_coord, None)) + standard_name=cf.standard_name, + long_name=cf.long_name, + units=cf.units, + ) + metadata["aux_coords_and_dims"].append((threshold_coord, None)) # The main cube has an adjusted name, and units of '1'. base_name = cf.standard_name or cf.long_name - long_name = 'probability_of_{}_{}'.format( - base_name, probability.probability_type_name) - metadata['standard_name'] = None - metadata['long_name'] = long_name - metadata['units'] = Unit(1) + long_name = "probability_of_{}_{}".format( + base_name, probability.probability_type_name + ) + metadata["standard_name"] = None + metadata["long_name"] = long_name + metadata["units"] = Unit(1) # Add a standard attribute recording the grib phenomenon identity. - metadata['attributes']['GRIB_PARAM'] = GRIBCode( + metadata["attributes"]["GRIB_PARAM"] = GRIBCode( edition_or_string=2, discipline=discipline, category=parameterCategory, - number=parameterNumber) + number=parameterNumber, + ) # Identify hybrid height and pressure reference fields. # Look for fields at surface level first. - if (typeOfFirstFixedSurface == 1 and - scaledValueOfFirstFixedSurface == 0 and - typeOfSecondFixedSurface == _TYPE_OF_FIXED_SURFACE_MISSING): + if ( + typeOfFirstFixedSurface == 1 + and scaledValueOfFirstFixedSurface == 0 + and typeOfSecondFixedSurface == _TYPE_OF_FIXED_SURFACE_MISSING + ): # Land surface products for model terrain height: - if (discipline == 2 and - parameterCategory == 0 and - parameterNumber == 7): - metadata['references'].append(ReferenceTarget( - 'ref_orography', None)) + if discipline == 2 and parameterCategory == 0 and parameterNumber == 7: + metadata["references"].append(ReferenceTarget("ref_orography", None)) # Meteorological mass products for pressure: - elif (discipline == 0 and - parameterCategory == 3 and - parameterNumber == 0): - metadata['references'].append(ReferenceTarget( - 'ref_surface_pressure', ensure_surface_air_pressure_name)) + elif discipline == 0 and parameterCategory == 3 and parameterNumber == 0: + metadata["references"].append( + ReferenceTarget( + "ref_surface_pressure", ensure_surface_air_pressure_name + ) + ) def ensure_surface_air_pressure_name(cube): @@ -1481,13 +1555,15 @@ def ensure_surface_air_pressure_name(cube): # This will cause an infinite loop when building the derived coord (!) name = cube.name() # Just check the passed cube is of the sort expected. - expected_names = ('air_pressure', 'surface_air_pressure') + expected_names = ("air_pressure", "surface_air_pressure") if name not in expected_names: - msg = ('Unexpected cube name for hybrid-pressure reference data : ' - 'Expected one of {}, got {!r}.') + msg = ( + "Unexpected cube name for hybrid-pressure reference data : " + "Expected one of {}, got {!r}." + ) raise ValueError(msg.format(expected_names, name)) # Get the caller (in rules.py) to rename it. - return {'standard_name': 'surface_air_pressure'} + return {"standard_name": "surface_air_pressure"} def time_range_unit(indicatorOfUnitOfTimeRange): @@ -1507,8 +1583,10 @@ def time_range_unit(indicatorOfUnitOfTimeRange): try: unit = Unit(_TIME_RANGE_UNITS[indicatorOfUnitOfTimeRange]) except (KeyError, ValueError): - msg = 'Product definition section 4 contains unsupported ' \ - 'time range unit [{}]'.format(indicatorOfUnitOfTimeRange) + msg = ( + "Product definition section 4 contains unsupported " + "time range unit [{}]".format(indicatorOfUnitOfTimeRange) + ) raise TranslationError(msg) return unit @@ -1533,72 +1611,89 @@ def hybrid_factories(section, metadata): :class:`collections.OrderedDict` of metadata. """ - NV = section['NV'] + NV = section["NV"] if NV > 0: - typeOfFirstFixedSurface = section['typeOfFirstFixedSurface'] + typeOfFirstFixedSurface = section["typeOfFirstFixedSurface"] if typeOfFirstFixedSurface == _TYPE_OF_FIXED_SURFACE_MISSING: - msg = 'Product definition section 4 contains missing ' \ - 'type of first fixed surface' + msg = ( + "Product definition section 4 contains missing " + "type of first fixed surface" + ) raise TranslationError(msg) - typeOfSecondFixedSurface = section['typeOfSecondFixedSurface'] + typeOfSecondFixedSurface = section["typeOfSecondFixedSurface"] if typeOfSecondFixedSurface != _TYPE_OF_FIXED_SURFACE_MISSING: - msg = 'Product definition section 4 contains unsupported type ' \ - 'of second fixed surface [{}]'.format(typeOfSecondFixedSurface) + msg = ( + "Product definition section 4 contains unsupported type " + "of second fixed surface [{}]".format(typeOfSecondFixedSurface) + ) raise TranslationError(msg) if typeOfFirstFixedSurface in [105, 118, 119]: # Hybrid level (105), Hybrid height level (118) and Hybrid # pressure level (119). - scaleFactor = section['scaleFactorOfFirstFixedSurface'] + scaleFactor = section["scaleFactorOfFirstFixedSurface"] if scaleFactor != 0: - msg = 'Product definition section 4 contains invalid scale ' \ - 'factor of first fixed surface [{}]'.format(scaleFactor) + msg = ( + "Product definition section 4 contains invalid scale " + "factor of first fixed surface [{}]".format(scaleFactor) + ) raise TranslationError(msg) # Create the model level number scalar coordinate. - scaledValue = section['scaledValueOfFirstFixedSurface'] - coord = DimCoord(scaledValue, standard_name='model_level_number', - units=1, attributes=dict(positive='up')) - metadata['aux_coords_and_dims'].append((coord, None)) + scaledValue = section["scaledValueOfFirstFixedSurface"] + coord = DimCoord( + scaledValue, + standard_name="model_level_number", + units=1, + attributes=dict(positive="up"), + ) + metadata["aux_coords_and_dims"].append((coord, None)) if typeOfFirstFixedSurface == 118: # height - level_value_name = 'level_height' - level_value_units = 'm' + level_value_name = "level_height" + level_value_units = "m" factory_class = HybridHeightFactory - factory_args = [{'long_name': level_value_name}, - {'long_name': 'sigma'}, - Reference('ref_orography')] + factory_args = [ + {"long_name": level_value_name}, + {"long_name": "sigma"}, + Reference("ref_orography"), + ] else: # pressure - level_value_name = 'level_pressure' - level_value_units = 'Pa' + level_value_name = "level_pressure" + level_value_units = "Pa" factory_class = HybridPressureFactory - factory_args = [{'long_name': level_value_name}, - {'long_name': 'sigma'}, - Reference('ref_surface_pressure')] + factory_args = [ + {"long_name": level_value_name}, + {"long_name": "sigma"}, + Reference("ref_surface_pressure"), + ] # Create the level height/pressure scalar coordinate. # scaledValue represents the level number, which is used to select # the sigma and delta values as follows: # sigma, delta = PV[i], PV[NV/2+i] : where i=1..level_number - pv = section['pv'] + pv = section["pv"] offset = scaledValue - coord = DimCoord(pv[offset], long_name=level_value_name, - units=level_value_units) - metadata['aux_coords_and_dims'].append((coord, None)) + coord = DimCoord( + pv[offset], long_name=level_value_name, units=level_value_units + ) + metadata["aux_coords_and_dims"].append((coord, None)) # Create the sigma scalar coordinate. offset = NV // 2 + scaledValue - coord = AuxCoord(pv[offset], long_name='sigma', units=1) - metadata['aux_coords_and_dims'].append((coord, None)) + coord = AuxCoord(pv[offset], long_name="sigma", units=1) + metadata["aux_coords_and_dims"].append((coord, None)) # Create the associated factory reference. factory = Factory(factory_class, factory_args) - metadata['factories'].append(factory) + metadata["factories"].append(factory) else: - msg = 'Product definition section 4 contains unsupported ' \ - 'first fixed surface [{}]'.format(typeOfFirstFixedSurface) + msg = ( + "Product definition section 4 contains unsupported " + "first fixed surface [{}]".format(typeOfFirstFixedSurface) + ) raise TranslationError(msg) @@ -1619,66 +1714,81 @@ def vertical_coords(section, metadata): :class:`collections.OrderedDict` of metadata. """ - if section['NV'] > 0: + if section["NV"] > 0: # Generate hybrid vertical coordinates. hybrid_factories(section, metadata) else: # Generate vertical coordinate. - typeOfFirstFixedSurface = section['typeOfFirstFixedSurface'] + typeOfFirstFixedSurface = section["typeOfFirstFixedSurface"] # We treat fixed surface level type=1 as having no vertical coordinate. # See https://github.com/SciTools/iris/issues/519 if typeOfFirstFixedSurface not in [_TYPE_OF_FIXED_SURFACE_MISSING, 1]: - key = 'scaledValueOfFirstFixedSurface' + key = "scaledValueOfFirstFixedSurface" scaledValueOfFirstFixedSurface = section[key] if scaledValueOfFirstFixedSurface == _MDI: if options.warn_on_unsupported: - msg = 'Unable to translate type of first fixed ' \ - 'surface with missing scaled value.' + msg = ( + "Unable to translate type of first fixed " + "surface with missing scaled value." + ) warnings.warn(msg) else: fixed_surface_missing = FixedSurface(None, None, None) fixed_surface = _FIXED_SURFACE.get( - typeOfFirstFixedSurface, fixed_surface_missing) - key = 'scaleFactorOfFirstFixedSurface' + typeOfFirstFixedSurface, fixed_surface_missing + ) + key = "scaleFactorOfFirstFixedSurface" scaleFactorOfFirstFixedSurface = section[key] - typeOfSecondFixedSurface = section['typeOfSecondFixedSurface'] + typeOfSecondFixedSurface = section["typeOfSecondFixedSurface"] if typeOfSecondFixedSurface != _TYPE_OF_FIXED_SURFACE_MISSING: if typeOfFirstFixedSurface != typeOfSecondFixedSurface: - msg = 'Product definition section 4 has different ' \ - 'types of first and second fixed surface' + msg = ( + "Product definition section 4 has different " + "types of first and second fixed surface" + ) raise TranslationError(msg) - key = 'scaledValueOfSecondFixedSurface' + key = "scaledValueOfSecondFixedSurface" scaledValueOfSecondFixedSurface = section[key] if scaledValueOfSecondFixedSurface == _MDI: - msg = 'Product definition section 4 has missing ' \ - 'scaled value of second fixed surface' + msg = ( + "Product definition section 4 has missing " + "scaled value of second fixed surface" + ) raise TranslationError(msg) else: - key = 'scaleFactorOfSecondFixedSurface' + key = "scaleFactorOfSecondFixedSurface" scaleFactorOfSecondFixedSurface = section[key] - first = unscale(scaledValueOfFirstFixedSurface, - scaleFactorOfFirstFixedSurface) - second = unscale(scaledValueOfSecondFixedSurface, - scaleFactorOfSecondFixedSurface) + first = unscale( + scaledValueOfFirstFixedSurface, + scaleFactorOfFirstFixedSurface, + ) + second = unscale( + scaledValueOfSecondFixedSurface, + scaleFactorOfSecondFixedSurface, + ) point = 0.5 * (first + second) bounds = [first, second] else: - point = unscale(scaledValueOfFirstFixedSurface, - scaleFactorOfFirstFixedSurface) + point = unscale( + scaledValueOfFirstFixedSurface, scaleFactorOfFirstFixedSurface + ) bounds = None - coord = DimCoord(point, - standard_name=fixed_surface.standard_name, - long_name=fixed_surface.long_name, - units=fixed_surface.units, - bounds=bounds) + coord = DimCoord( + point, + standard_name=fixed_surface.standard_name, + long_name=fixed_surface.long_name, + units=fixed_surface.units, + bounds=bounds, + ) if fixed_surface == fixed_surface_missing: - coord.attributes['GRIB_fixed_surface_type'] = \ + coord.attributes["GRIB_fixed_surface_type"] = ( typeOfFirstFixedSurface + ) # Add the vertical coordinate to metadata aux coords. - metadata['aux_coords_and_dims'].append((coord, None)) + metadata["aux_coords_and_dims"].append((coord, None)) def forecast_period_coord(indicatorOfUnitOfTimeRange, forecastTime): @@ -1699,9 +1809,9 @@ def forecast_period_coord(indicatorOfUnitOfTimeRange, forecastTime): """ # Determine the forecast period and associated units. unit = time_range_unit(indicatorOfUnitOfTimeRange) - point = unit.convert(forecastTime, 'hours') + point = unit.convert(forecastTime, "hours") # Create the forecast period scalar coordinate. - coord = DimCoord(point, standard_name='forecast_period', units='hours') + coord = DimCoord(point, standard_name="forecast_period", units="hours") return coord @@ -1725,23 +1835,25 @@ def statistical_forecast_period_coord(section, frt_coord): """ # Get the period end time as a datetime. - end_time = datetime(section['yearOfEndOfOverallTimeInterval'], - section['monthOfEndOfOverallTimeInterval'], - section['dayOfEndOfOverallTimeInterval'], - section['hourOfEndOfOverallTimeInterval'], - section['minuteOfEndOfOverallTimeInterval'], - section['secondOfEndOfOverallTimeInterval']) + end_time = datetime( + section["yearOfEndOfOverallTimeInterval"], + section["monthOfEndOfOverallTimeInterval"], + section["dayOfEndOfOverallTimeInterval"], + section["hourOfEndOfOverallTimeInterval"], + section["minuteOfEndOfOverallTimeInterval"], + section["secondOfEndOfOverallTimeInterval"], + ) # Get forecast reference time (frt) as a datetime. frt_point = frt_coord.units.num2date(frt_coord.points[0]) # Get the period start time (as a timedelta relative to the frt). - forecast_time = section['forecastTime'] + forecast_time = section["forecastTime"] if options.support_hindcast_values: # Apply the hindcast fix. forecast_time = _hindcast_fix(forecast_time) - forecast_units = time_range_unit(section['indicatorOfUnitOfTimeRange']) - forecast_seconds = forecast_units.convert(forecast_time, 'seconds') + forecast_units = time_range_unit(section["indicatorOfUnitOfTimeRange"]) + forecast_seconds = forecast_units.convert(forecast_time, "seconds") start_time_delta = timedelta(seconds=forecast_seconds) # Get the period end time (as a timedelta relative to the frt). @@ -1757,10 +1869,13 @@ def timedelta_hours(timedelta): return timedelta.total_seconds() / 3600.0 mid_point_hours = timedelta_hours(mid_time_delta) - bounds_hours = [timedelta_hours(start_time_delta), - timedelta_hours(end_time_delta)] - fp_coord = DimCoord(mid_point_hours, bounds=bounds_hours, - standard_name='forecast_period', units='hours') + bounds_hours = [timedelta_hours(start_time_delta), timedelta_hours(end_time_delta)] + fp_coord = DimCoord( + mid_point_hours, + bounds=bounds_hours, + standard_name="forecast_period", + units="hours", + ) return fp_coord @@ -1788,25 +1903,25 @@ def other_time_coord(rt_coord, fp_coord): """ if not rt_coord.units.is_time_reference(): - fmt = 'Invalid unit for reference time coord: {}' + fmt = "Invalid unit for reference time coord: {}" raise ValueError(fmt.format(rt_coord.units)) if not fp_coord.units.is_time(): - fmt = 'Invalid unit for forecast_period coord: {}' + fmt = "Invalid unit for forecast_period coord: {}" raise ValueError(fmt.format(fp_coord.units)) if rt_coord.has_bounds() or fp_coord.has_bounds(): - raise ValueError('Coordinate bounds are not supported') + raise ValueError("Coordinate bounds are not supported") if rt_coord.shape != (1,) or fp_coord.shape != (1,): - raise ValueError('Vector coordinates are not supported') + raise ValueError("Vector coordinates are not supported") - if rt_coord.standard_name == 'time': - rt_base_unit = str(rt_coord.units).split(' since ')[0] + if rt_coord.standard_name == "time": + rt_base_unit = str(rt_coord.units).split(" since ")[0] fp = fp_coord.units.convert(fp_coord.points[0], rt_base_unit) frt = rt_coord.points[0] - fp - return DimCoord(frt, 'forecast_reference_time', units=rt_coord.units) - elif rt_coord.standard_name == 'forecast_reference_time': + return DimCoord(frt, "forecast_reference_time", units=rt_coord.units) + elif rt_coord.standard_name == "forecast_reference_time": return validity_time_coord(rt_coord, fp_coord) else: - fmt = 'Unexpected reference time coordinate: {}' + fmt = "Unexpected reference time coordinate: {}" raise ValueError(fmt.format(rt_coord.name())) @@ -1828,18 +1943,22 @@ def validity_time_coord(frt_coord, fp_coord): """ if frt_coord.shape != (1,): - msg = 'Expected scalar forecast reference time coordinate when ' \ - 'calculating validity time, got shape {!r}'.format(frt_coord.shape) + msg = ( + "Expected scalar forecast reference time coordinate when " + "calculating validity time, got shape {!r}".format(frt_coord.shape) + ) raise ValueError(msg) if fp_coord.shape != (1,): - msg = 'Expected scalar forecast period coordinate when ' \ - 'calculating validity time, got shape {!r}'.format(fp_coord.shape) + msg = ( + "Expected scalar forecast period coordinate when " + "calculating validity time, got shape {!r}".format(fp_coord.shape) + ) raise ValueError(msg) def coord_timedelta(coord, value): # Helper to convert a time coordinate value into a timedelta. - seconds = coord.units.convert(value, 'seconds') + seconds = coord.units.convert(value, "seconds") return timedelta(seconds=seconds) # Calculate validity (phenomenon) time in forecast-reference-time units. @@ -1851,49 +1970,54 @@ def coord_timedelta(coord, value): if fp_coord.bounds is None: bounds = None else: - bounds_deltas = [coord_timedelta(fp_coord, bound_point) - for bound_point in fp_coord.bounds[0]] - bounds = [float(frt_coord.units.date2num(frt_point + delta)) - for delta in bounds_deltas] + bounds_deltas = [ + coord_timedelta(fp_coord, bound_point) for bound_point in fp_coord.bounds[0] + ] + bounds = [ + float(frt_coord.units.date2num(frt_point + delta)) + for delta in bounds_deltas + ] # Create the time scalar coordinate. - coord = DimCoord(point, bounds=bounds, - standard_name='time', units=frt_coord.units) + coord = DimCoord(point, bounds=bounds, standard_name="time", units=frt_coord.units) return coord def time_coords(section, metadata, rt_coord): - if 'forecastTime' in section.keys(): - forecast_time = section['forecastTime'] + if "forecastTime" in section.keys(): + forecast_time = section["forecastTime"] # ecCodes encodes the forecast time as 'startStep' for pdt 4.4x; # product_definition_template_40 makes use of this function. The # following will be removed once the suspected bug is fixed. - elif 'startStep' in section.keys(): - forecast_time = section['startStep'] + elif "startStep" in section.keys(): + forecast_time = section["startStep"] # Calculate the forecast period coordinate. - fp_coord = forecast_period_coord(section['indicatorOfUnitOfTimeRange'], - forecast_time) + fp_coord = forecast_period_coord( + section["indicatorOfUnitOfTimeRange"], forecast_time + ) # Add the forecast period coordinate to the metadata aux coords. - metadata['aux_coords_and_dims'].append((fp_coord, None)) + metadata["aux_coords_and_dims"].append((fp_coord, None)) # Calculate the "other" time coordinate - i.e. whichever of 'time' # or 'forecast_reference_time' we don't already have. other_coord = other_time_coord(rt_coord, fp_coord) # Add the time coordinate to the metadata aux coords. - metadata['aux_coords_and_dims'].append((other_coord, None)) + metadata["aux_coords_and_dims"].append((other_coord, None)) # Add the reference time coordinate to the metadata aux coords. - metadata['aux_coords_and_dims'].append((rt_coord, None)) + metadata["aux_coords_and_dims"].append((rt_coord, None)) def generating_process(section, include_forecast_process=True): if options.warn_on_unsupported: # Reference Code Table 4.3. - warnings.warn('Unable to translate type of generating process.') - warnings.warn('Unable to translate background generating ' - 'process identifier.') + warnings.warn("Unable to translate type of generating process.") + warnings.warn( + "Unable to translate background generating " "process identifier." + ) if include_forecast_process: - warnings.warn('Unable to translate forecast generating ' - 'process identifier.') + warnings.warn( + "Unable to translate forecast generating " "process identifier." + ) def data_cutoff(hoursAfterDataCutoff, minutesAfterDataCutoff): @@ -1909,11 +2033,11 @@ def data_cutoff(hoursAfterDataCutoff, minutesAfterDataCutoff): Message section 4, octet 17. """ - if (hoursAfterDataCutoff != _MDI or - minutesAfterDataCutoff != _MDI): + if hoursAfterDataCutoff != _MDI or minutesAfterDataCutoff != _MDI: if options.warn_on_unsupported: - warnings.warn('Unable to translate "hours and/or minutes ' - 'after data cutoff".') + warnings.warn( + 'Unable to translate "hours and/or minutes ' 'after data cutoff".' + ) def statistical_method_name(section): @@ -1921,21 +2045,25 @@ def statistical_method_name(section): # Templates 8, 9, 10, 11 and 15 all use this type code, which is defined # in table 4.10. # However, the actual keyname is different for template 15. - section_number = section['productDefinitionTemplateNumber'] + section_number = section["productDefinitionTemplateNumber"] if section_number in (8, 9, 10, 11): - stat_keyname = 'typeOfStatisticalProcessing' + stat_keyname = "typeOfStatisticalProcessing" elif section_number == 15: - stat_keyname = 'statisticalProcess' + stat_keyname = "statisticalProcess" else: # This should *never* happen, as only called by pdt 8 and 15. - msg = ("Internal error: can't get statistical method for unsupported " - "pdt : 4.{:d}.") + msg = ( + "Internal error: can't get statistical method for unsupported " + "pdt : 4.{:d}." + ) raise ValueError(msg.format(section_number)) statistic_code = section[stat_keyname] statistic_name = _STATISTIC_TYPE_NAMES.get(statistic_code) if statistic_name is None: - msg = ('Product definition section 4 contains an unsupported ' - 'statistical process type [{}] ') + msg = ( + "Product definition section 4 contains an unsupported " + "statistical process type [{}] " + ) raise TranslationError(msg.format(statistic_code)) return statistic_name @@ -1956,57 +2084,61 @@ def statistical_cell_method(section): """ # Handle the number of time ranges -- we currently only support one. - n_time_ranges = section['numberOfTimeRange'] + n_time_ranges = section["numberOfTimeRange"] if n_time_ranges != 1: if n_time_ranges == 0: - msg = ('Product definition section 4 specifies aggregation over ' - '"0 time ranges".') + msg = ( + "Product definition section 4 specifies aggregation over " + '"0 time ranges".' + ) raise TranslationError(msg) else: - msg = ('Product definition section 4 specifies aggregation over ' - 'multiple time ranges [{}], which is not yet ' - 'supported.'.format(n_time_ranges)) + msg = ( + "Product definition section 4 specifies aggregation over " + "multiple time ranges [{}], which is not yet " + "supported.".format(n_time_ranges) + ) raise TranslationError(msg) # Decode the type of statistic (aggregation method). statistic_name = statistical_method_name(section) # Decode the type of time increment. - increment_typecode = section['typeOfTimeIncrement'] + increment_typecode = section["typeOfTimeIncrement"] if increment_typecode not in (2, 255): # NOTE: All our current test data seems to contain the value 2, which # is all we currently support. # The exact interpretation of this is still unclear so we also accept # a missing value. - msg = ('grib statistic time-increment type [{}] ' - 'is not supported.'.format(increment_typecode)) + msg = "grib statistic time-increment type [{}] " "is not supported.".format( + increment_typecode + ) raise TranslationError(msg) - interval_number = section['timeIncrement'] + interval_number = section["timeIncrement"] if interval_number in (0, _TIME_RANGE_MISSING): intervals_string = None else: - units_string = _TIME_RANGE_UNITS[ - section['indicatorOfUnitForTimeIncrement']] - intervals_string = '{} {}'.format(interval_number, units_string) + units_string = _TIME_RANGE_UNITS[section["indicatorOfUnitForTimeIncrement"]] + intervals_string = "{} {}".format(interval_number, units_string) # Create a cell method to represent the time aggregation. - cell_method = CellMethod(method=statistic_name, - coords='time', - intervals=intervals_string) + cell_method = CellMethod( + method=statistic_name, coords="time", intervals=intervals_string + ) return cell_method def ensemble_identifier(section): if options.warn_on_unsupported: # Reference Code Table 4.6. - warnings.warn('Unable to translate type of ensemble forecast.') - warnings.warn('Unable to translate number of forecasts in ensemble.') + warnings.warn("Unable to translate type of ensemble forecast.") + warnings.warn("Unable to translate number of forecasts in ensemble.") # Create the realization coordinates. - realization = DimCoord(section['perturbationNumber'], - standard_name='realization', - units='no_unit') + realization = DimCoord( + section["perturbationNumber"], standard_name="realization", units="no_unit" + ) return realization @@ -2034,8 +2166,7 @@ def product_definition_template_0(section, metadata, rt_coord): generating_process(section) # Handle the data cutoff. - data_cutoff(section['hoursAfterDataCutoff'], - section['minutesAfterDataCutoff']) + data_cutoff(section["hoursAfterDataCutoff"], section["minutesAfterDataCutoff"]) time_coords(section, metadata, rt_coord) @@ -2069,7 +2200,7 @@ def product_definition_template_1(section, metadata, frt_coord): realization = ensemble_identifier(section) # Add the realization coordinate to the metadata aux coords. - metadata['aux_coords_and_dims'].append((realization, None)) + metadata["aux_coords_and_dims"].append((realization, None)) def product_definition_template_6(section, metadata, frt_coord): @@ -2095,12 +2226,10 @@ def product_definition_template_6(section, metadata, frt_coord): # Perform identical message processing. product_definition_template_0(section, metadata, frt_coord) - percentile = DimCoord(section['percentileValue'], - long_name='percentile', - units='%') + percentile = DimCoord(section["percentileValue"], long_name="percentile", units="%") # Add the percentile coordinate to the metadata aux coords. - metadata['aux_coords_and_dims'].append((percentile, None)) + metadata["aux_coords_and_dims"].append((percentile, None)) def product_definition_template_8(section, metadata, frt_coord): @@ -2127,28 +2256,27 @@ def product_definition_template_8(section, metadata, frt_coord): generating_process(section) # Handle the data cutoff. - data_cutoff(section['hoursAfterDataCutoff'], - section['minutesAfterDataCutoff']) + data_cutoff(section["hoursAfterDataCutoff"], section["minutesAfterDataCutoff"]) # Create a cell method to represent the time statistic. time_statistic_cell_method = statistical_cell_method(section) # Add the forecast cell method to the metadata. - metadata['cell_methods'].append(time_statistic_cell_method) + metadata["cell_methods"].append(time_statistic_cell_method) # Add the forecast reference time coordinate to the metadata aux coords, # if it is a forecast reference time, not a time coord, as defined by # significanceOfReferenceTime. - if frt_coord.name() != 'time': - metadata['aux_coords_and_dims'].append((frt_coord, None)) + if frt_coord.name() != "time": + metadata["aux_coords_and_dims"].append((frt_coord, None)) # Add a bounded forecast period coordinate. fp_coord = statistical_forecast_period_coord(section, frt_coord) - metadata['aux_coords_and_dims'].append((fp_coord, None)) + metadata["aux_coords_and_dims"].append((fp_coord, None)) # Calculate a bounded validity time coord matching the forecast period. t_coord = validity_time_coord(frt_coord, fp_coord) # Add the time coordinate to the metadata aux coords. - metadata['aux_coords_and_dims'].append((t_coord, None)) + metadata["aux_coords_and_dims"].append((t_coord, None)) # Check for vertical coordinates. vertical_coords(section, metadata) @@ -2179,36 +2307,42 @@ def product_definition_template_9(section, metadata, frt_coord): # Remove the cell_method encoding the underlying statistic, as CF does not # currently support this type of representation. - cell_method, = metadata['cell_methods'] - metadata['cell_methods'] = [] + (cell_method,) = metadata["cell_methods"] + metadata["cell_methods"] = [] # NOTE: we currently don't record the nature of the underlying statistic, # as we don't have an agreed way of representing that in CF. # Return a probability object to control the production of a probability # result. This is done once the underlying phenomenon type is determined, # in 'translate_phenomenon'. - probability_typecode = section['probabilityType'] + probability_typecode = section["probabilityType"] if probability_typecode == 1: # Type is "above upper level". - threshold_value = section['scaledValueOfUpperLimit'] + threshold_value = section["scaledValueOfUpperLimit"] if threshold_value == _MDI: - msg = 'Product definition section 4 has missing ' \ - 'scaled value of upper limit' + msg = ( + "Product definition section 4 has missing " + "scaled value of upper limit" + ) raise TranslationError(msg) - threshold_scaling = section['scaleFactorOfUpperLimit'] + threshold_scaling = section["scaleFactorOfUpperLimit"] if threshold_scaling == _MDI: - msg = 'Product definition section 4 has missing ' \ - 'scale factor of upper limit' + msg = ( + "Product definition section 4 has missing " + "scale factor of upper limit" + ) raise TranslationError(msg) # Encode threshold information. threshold = unscale(threshold_value, threshold_scaling) - probability_type = Probability('above_threshold', threshold) + probability_type = Probability("above_threshold", threshold) # Note that GRIB provides separate "above lower threshold" and "above # upper threshold" probability types. This naming style doesn't # recognise that distinction. For now, assume this is not important. else: - msg = ('Product definition section 4 contains an unsupported ' - 'probability type [{}]'.format(probability_typecode)) + msg = ( + "Product definition section 4 contains an unsupported " + "probability type [{}]".format(probability_typecode) + ) raise TranslationError(msg) return probability_type @@ -2235,12 +2369,12 @@ def product_definition_template_10(section, metadata, frt_coord): """ product_definition_template_8(section, metadata, frt_coord) - percentile = DimCoord(section['percentileValue'], - long_name='percentile_over_time', - units='no_unit') + percentile = DimCoord( + section["percentileValue"], long_name="percentile_over_time", units="no_unit" + ) # Add the percentile data info - metadata['aux_coords_and_dims'].append((percentile, None)) + metadata["aux_coords_and_dims"].append((percentile, None)) def product_definition_template_11(section, metadata, frt_coord): @@ -2269,7 +2403,7 @@ def product_definition_template_11(section, metadata, frt_coord): realization = ensemble_identifier(section) # Add the realization coordinate to the metadata aux coords. - metadata['aux_coords_and_dims'].append((realization, None)) + metadata["aux_coords_and_dims"].append((realization, None)) def product_definition_template_15(section, metadata, frt_coord): @@ -2293,20 +2427,23 @@ def product_definition_template_15(section, metadata, frt_coord): """ # Check unique keys for this template. - spatial_processing_code = section['spatialProcessing'] + spatial_processing_code = section["spatialProcessing"] # Only a limited number of spatial processing codes are supported if spatial_processing_code not in _SPATIAL_PROCESSING_TYPES.keys(): - msg = ('Product definition section 4 contains an unsupported ' - 'spatial processing type [{}]'.format(spatial_processing_code)) + msg = ( + "Product definition section 4 contains an unsupported " + "spatial processing type [{}]".format(spatial_processing_code) + ) raise TranslationError(msg) # Process parts in common with PDT 4.0. product_definition_template_0(section, metadata, frt_coord) # Add spatial processing type as an attribute. - metadata['attributes']['spatial_processing_type'] = \ - _SPATIAL_PROCESSING_TYPES[spatial_processing_code][0] + metadata["attributes"]["spatial_processing_type"] = _SPATIAL_PROCESSING_TYPES[ + spatial_processing_code + ][0] # Add a cell method if the spatial processing type supports a # statistical process. @@ -2315,46 +2452,42 @@ def product_definition_template_15(section, metadata, frt_coord): cell_method_name = statistical_method_name(section) # Record an 'area' cell-method using this statistic. - metadata['cell_methods'] = [CellMethod(coords=('area',), - method=cell_method_name)] + metadata["cell_methods"] = [ + CellMethod(coords=("area",), method=cell_method_name) + ] def satellite_common(section, metadata): # Number of contributing spectral bands. - NB = section['NB'] + NB = section["NB"] if NB > 0: # Create the satellite series coordinate. - satelliteSeries = section['satelliteSeries'] - coord = AuxCoord(satelliteSeries, long_name='satellite_series', - units=1) + satelliteSeries = section["satelliteSeries"] + coord = AuxCoord(satelliteSeries, long_name="satellite_series", units=1) # Add the satellite series coordinate to the metadata aux coords. - metadata['aux_coords_and_dims'].append((coord, None)) + metadata["aux_coords_and_dims"].append((coord, None)) # Create the satellite number coordinate. - satelliteNumber = section['satelliteNumber'] - coord = AuxCoord(satelliteNumber, long_name='satellite_number', - units=1) + satelliteNumber = section["satelliteNumber"] + coord = AuxCoord(satelliteNumber, long_name="satellite_number", units=1) # Add the satellite number coordinate to the metadata aux coords. - metadata['aux_coords_and_dims'].append((coord, None)) + metadata["aux_coords_and_dims"].append((coord, None)) # Create the satellite instrument type coordinate. - instrumentType = section['instrumentType'] - coord = AuxCoord(instrumentType, long_name='instrument_type', - units=1) + instrumentType = section["instrumentType"] + coord = AuxCoord(instrumentType, long_name="instrument_type", units=1) # Add the instrument type coordinate to the metadata aux coords. - metadata['aux_coords_and_dims'].append((coord, None)) + metadata["aux_coords_and_dims"].append((coord, None)) # Create the central wave number coordinate. - scaleFactor = section['scaleFactorOfCentralWaveNumber'] - scaledValue = section['scaledValueOfCentralWaveNumber'] + scaleFactor = section["scaleFactorOfCentralWaveNumber"] + scaledValue = section["scaledValueOfCentralWaveNumber"] wave_number = unscale(scaledValue, scaleFactor) - standard_name = 'sensor_band_central_radiation_wavenumber' - coord = AuxCoord(wave_number, - standard_name=standard_name, - units=Unit('m-1')) + standard_name = "sensor_band_central_radiation_wavenumber" + coord = AuxCoord(wave_number, standard_name=standard_name, units=Unit("m-1")) # Add the central wave number coordinate to the metadata aux coords. - metadata['aux_coords_and_dims'].append((coord, None)) + metadata["aux_coords_and_dims"].append((coord, None)) def product_definition_template_31(section, metadata, rt_coord): @@ -2380,7 +2513,7 @@ def product_definition_template_31(section, metadata, rt_coord): satellite_common(section, metadata) # Add the observation time coordinate. - metadata['aux_coords_and_dims'].append((rt_coord, None)) + metadata["aux_coords_and_dims"].append((rt_coord, None)) def product_definition_template_32(section, metadata, rt_coord): @@ -2406,8 +2539,7 @@ def product_definition_template_32(section, metadata, rt_coord): generating_process(section, include_forecast_process=False) # Handle the data cutoff. - data_cutoff(section['hoursAfterDataCutoff'], - section['minutesAfterDataCutoff']) + data_cutoff(section["hoursAfterDataCutoff"], section["minutesAfterDataCutoff"]) time_coords(section, metadata, rt_coord) @@ -2438,14 +2570,13 @@ def product_definition_template_40(section, metadata, frt_coord): product_definition_template_0(section, metadata, frt_coord) # Reference GRIB2 Code Table 4.230. - constituent_type = section['constituentType'] + constituent_type = section["constituentType"] # Add the constituent type as an attribute. - metadata['attributes']['WMO_constituent_type'] = constituent_type + metadata["attributes"]["WMO_constituent_type"] = constituent_type -def product_definition_section(section, metadata, discipline, tablesVersion, - rt_coord): +def product_definition_section(section, metadata, discipline, tablesVersion, rt_coord): """ Translate section 4 from the GRIB2 message. @@ -2470,7 +2601,7 @@ def product_definition_section(section, metadata, discipline, tablesVersion, """ # Reference GRIB2 Code Table 4.0. - template = section['productDefinitionTemplateNumber'] + template = section["productDefinitionTemplateNumber"] probability = None includes_fixed_surface_keys = True @@ -2491,8 +2622,7 @@ def product_definition_section(section, metadata, discipline, tablesVersion, # horizontal layer in a continuous or non-continuous time interval. product_definition_template_8(section, metadata, rt_coord) elif template == 9: - probability = \ - product_definition_template_9(section, metadata, rt_coord) + probability = product_definition_template_9(section, metadata, rt_coord) elif template == 10: product_definition_template_10(section, metadata, rt_coord) elif template == 11: @@ -2509,31 +2639,31 @@ def product_definition_section(section, metadata, discipline, tablesVersion, elif template == 40: product_definition_template_40(section, metadata, rt_coord) else: - msg = 'Product definition template [{}] is not ' \ - 'supported'.format(template) + msg = "Product definition template [{}] is not " "supported".format(template) raise TranslationError(msg) # Translate GRIB2 phenomenon to CF phenomenon. if tablesVersion != _CODE_TABLES_MISSING: translation_kwargs = { - 'metadata': metadata, - 'discipline': discipline, - 'parameterCategory': section['parameterCategory'], - 'parameterNumber': section['parameterNumber'], - 'probability': probability + "metadata": metadata, + "discipline": discipline, + "parameterCategory": section["parameterCategory"], + "parameterNumber": section["parameterNumber"], + "probability": probability, } # Won't always be able to populate the below arguments - # missing from some template definitions. fixed_surface_keys = [ - 'typeOfFirstFixedSurface', - 'scaledValueOfFirstFixedSurface', - 'typeOfSecondFixedSurface' + "typeOfFirstFixedSurface", + "scaledValueOfFirstFixedSurface", + "typeOfSecondFixedSurface", ] for section_key in fixed_surface_keys: - translation_kwargs[section_key] = \ + translation_kwargs[section_key] = ( section[section_key] if includes_fixed_surface_keys else None + ) translate_phenomenon(**translation_kwargs) @@ -2544,6 +2674,7 @@ def product_definition_section(section, metadata, discipline, tablesVersion, # ############################################################################### + def data_representation_section(section): """ Translate section 5 from the GRIB2 message. @@ -2553,7 +2684,7 @@ def data_representation_section(section): """ # Reference GRIB2 Code Table 5.0. - template = section['dataRepresentationTemplateNumber'] + template = section["dataRepresentationTemplateNumber"] # Supported templates for both grid point and spectral data: grid_point_templates = (0, 1, 2, 3, 4, 40, 41, 42, 61) @@ -2561,8 +2692,9 @@ def data_representation_section(section): supported_templates = grid_point_templates + spectral_templates if template not in supported_templates: - msg = 'Data Representation Section Template [{}] is not ' \ - 'supported'.format(template) + msg = "Data Representation Section Template [{}] is not " "supported".format( + template + ) raise TranslationError(msg) @@ -2572,6 +2704,7 @@ def data_representation_section(section): # ############################################################################### + def bitmap_section(section): """ Translate section 6 from the GRIB2 message. @@ -2591,16 +2724,18 @@ def bitmap_section(section): """ # Reference GRIB2 Code Table 6.0. - bitMapIndicator = section['bitMapIndicator'] + bitMapIndicator = section["bitMapIndicator"] if bitMapIndicator not in [_BITMAP_CODE_NONE, _BITMAP_CODE_PRESENT]: - msg = 'Bitmap Section 6 contains unsupported ' \ - 'bitmap indicator [{}]'.format(bitMapIndicator) + msg = "Bitmap Section 6 contains unsupported " "bitmap indicator [{}]".format( + bitMapIndicator + ) raise TranslationError(msg) ############################################################################### + def grib2_convert(field, metadata): """ Translate the GRIB2 message into the appropriate cube metadata. @@ -2617,19 +2752,22 @@ def grib2_convert(field, metadata): """ # Section 1 - Identification Section. - centre = _CENTRES.get(field.sections[1]['centre']) + centre = _CENTRES.get(field.sections[1]["centre"]) if centre is not None: - metadata['attributes']['centre'] = centre + metadata["attributes"]["centre"] = centre rt_coord = reference_time_coord(field.sections[1]) # Section 3 - Grid Definition Section (Grid Definition Template) grid_definition_section(field.sections[3], metadata) # Section 4 - Product Definition Section (Product Definition Template) - product_definition_section(field.sections[4], metadata, - field.sections[0]['discipline'], - field.sections[1]['tablesVersion'], - rt_coord) + product_definition_section( + field.sections[4], + metadata, + field.sections[0]["discipline"], + field.sections[1]["tablesVersion"], + rt_coord, + ) # Section 5 - Data Representation Section (Data Representation Template) data_representation_section(field.sections[5]) @@ -2640,6 +2778,7 @@ def grib2_convert(field, metadata): ############################################################################### + def convert(field): """ Translate the GRIB message into the appropriate cube metadata. @@ -2653,25 +2792,24 @@ def convert(field): A :class:`iris.fileformats.rules.ConversionMetadata` object. """ - if hasattr(field, 'sections'): - editionNumber = field.sections[0]['editionNumber'] + if hasattr(field, "sections"): + editionNumber = field.sections[0]["editionNumber"] if editionNumber != 2: - emsg = 'GRIB edition {} is not supported by {!r}.' - raise TranslationError(emsg.format(editionNumber, - type(field).__name__)) + emsg = "GRIB edition {} is not supported by {!r}." + raise TranslationError(emsg.format(editionNumber, type(field).__name__)) # Initialise the cube metadata. metadata = OrderedDict() - metadata['factories'] = [] - metadata['references'] = [] - metadata['standard_name'] = None - metadata['long_name'] = None - metadata['units'] = None - metadata['attributes'] = {} - metadata['cell_methods'] = [] - metadata['dim_coords_and_dims'] = [] - metadata['aux_coords_and_dims'] = [] + metadata["factories"] = [] + metadata["references"] = [] + metadata["standard_name"] = None + metadata["long_name"] = None + metadata["units"] = None + metadata["attributes"] = {} + metadata["cell_methods"] = [] + metadata["dim_coords_and_dims"] = [] + metadata["aux_coords_and_dims"] = [] # Convert GRIB2 message to cube metadata. grib2_convert(field, metadata) @@ -2681,9 +2819,8 @@ def convert(field): editionNumber = field.edition if editionNumber != 1: - emsg = 'GRIB edition {} is not supported by {!r}.' - raise TranslationError(emsg.format(editionNumber, - type(field).__name__)) + emsg = "GRIB edition {} is not supported by {!r}." + raise TranslationError(emsg.format(editionNumber, type(field).__name__)) result = grib1_convert(field) diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index 9ade6b8e..a47bd453 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -20,25 +20,32 @@ import iris from iris.aux_factory import HybridHeightFactory, HybridPressureFactory -from iris.coord_systems import (GeogCS, RotatedGeogCS, Mercator, - TransverseMercator, LambertConformal, - LambertAzimuthalEqualArea) +from iris.coord_systems import ( + GeogCS, + RotatedGeogCS, + Mercator, + TransverseMercator, + LambertConformal, + LambertAzimuthalEqualArea, +) from iris.exceptions import TranslationError from . import grib_phenom_translation as gptx -from ._load_convert import (_STATISTIC_TYPE_NAMES, _TIME_RANGE_UNITS, - _SPATIAL_PROCESSING_TYPES) +from ._load_convert import ( + _STATISTIC_TYPE_NAMES, + _TIME_RANGE_UNITS, + _SPATIAL_PROCESSING_TYPES, +) from .grib_phenom_translation import GRIBCode from iris.util import is_regular, regular_step # Invert code tables from :mod:`iris_grib._load_convert`. -_STATISTIC_TYPE_NAMES_INVERTED = {val: key for key, val in - _STATISTIC_TYPE_NAMES.items()} -_TIME_RANGE_UNITS_INVERTED = { - val: key for key, val in _TIME_RANGE_UNITS.items() +_STATISTIC_TYPE_NAMES_INVERTED = { + val: key for key, val in _STATISTIC_TYPE_NAMES.items() } +_TIME_RANGE_UNITS_INVERTED = {val: key for key, val in _TIME_RANGE_UNITS.items()} def fixup_float32_as_int32(value): @@ -51,8 +58,8 @@ def fixup_float32_as_int32(value): value. """ - value_as_float32 = np.array(value, dtype='f4') - value_as_uint32 = value_as_float32.view(dtype='u4') + value_as_float32 = np.array(value, dtype="f4") + value_as_uint32 = value_as_float32.view(dtype="u4") if value_as_uint32 >= 0x80000000: # Convert from two's-complement to sign-and-magnitude. # NB. Because of the silly representation of negative @@ -77,12 +84,12 @@ def fixup_int32_as_uint32(value): """ value = int(value) - if -0x7fffffff <= value <= 0x7fffffff: + if -0x7FFFFFFF <= value <= 0x7FFFFFFF: if value < 0: # Convert from two's-complement to sign-and-magnitude. value = 0x80000000 - value else: - msg = '{} out of range -2147483647 to 2147483647.'.format(value) + msg = "{} out of range -2147483647 to 2147483647.".format(value) raise ValueError(msg) return value @@ -141,9 +148,9 @@ def reference_time(cube, grib): eccodes.codes_set_long(grib, "significanceOfReferenceTime", rt_meaning) eccodes.codes_set_long( - grib, "dataDate", "%04d%02d%02d" % (rt.year, rt.month, rt.day)) - eccodes.codes_set_long( - grib, "dataTime", "%02d%02d" % (rt.hour, rt.minute)) + grib, "dataDate", "%04d%02d%02d" % (rt.year, rt.month, rt.day) + ) + eccodes.codes_set_long(grib, "dataTime", "%02d%02d" % (rt.hour, rt.minute)) # TODO: Set the calendar, when we find out what happened to the proposal! # http://tinyurl.com/oefqgv6 @@ -160,10 +167,10 @@ def identification(cube, grib): # Code table 1.4 # analysis, forecast, processed satellite, processed radar, - if cube.coords('realization'): + if cube.coords("realization"): # assume realization will always have 1 and only 1 point # as cubes saving to GRIB2 a 2D horizontal slices - if cube.coord('realization').points[0] != 0: + if cube.coord("realization").points[0] != 0: eccodes.codes_set_long(grib, "typeOfProcessedData", 4) else: eccodes.codes_set_long(grib, "typeOfProcessedData", 3) @@ -184,30 +191,32 @@ def shape_of_the_earth(cube, grib): # Initially set shape_of_earth keys to missing (255 for byte). eccodes.codes_set_long(grib, "scaleFactorOfRadiusOfSphericalEarth", 255) - eccodes.codes_set_long(grib, "scaledValueOfRadiusOfSphericalEarth", - GRIB_MISSING_LONG) + eccodes.codes_set_long( + grib, "scaledValueOfRadiusOfSphericalEarth", GRIB_MISSING_LONG + ) eccodes.codes_set_long(grib, "scaleFactorOfEarthMajorAxis", 255) - eccodes.codes_set_long(grib, "scaledValueOfEarthMajorAxis", - GRIB_MISSING_LONG) + eccodes.codes_set_long(grib, "scaledValueOfEarthMajorAxis", GRIB_MISSING_LONG) eccodes.codes_set_long(grib, "scaleFactorOfEarthMinorAxis", 255) - eccodes.codes_set_long(grib, "scaledValueOfEarthMinorAxis", - GRIB_MISSING_LONG) + eccodes.codes_set_long(grib, "scaledValueOfEarthMinorAxis", GRIB_MISSING_LONG) if isinstance(cs, GeogCS): ellipsoid = cs else: ellipsoid = cs.ellipsoid if ellipsoid is None: - msg = "Could not determine shape of the earth from coord system "\ - "of horizontal grid." + msg = ( + "Could not determine shape of the earth from coord system " + "of horizontal grid." + ) raise TranslationError(msg) # Spherical earth. if ellipsoid.inverse_flattening == 0.0: eccodes.codes_set_long(grib, "shapeOfTheEarth", 1) eccodes.codes_set_long(grib, "scaleFactorOfRadiusOfSphericalEarth", 0) - eccodes.codes_set_long(grib, "scaledValueOfRadiusOfSphericalEarth", - ellipsoid.semi_major_axis) + eccodes.codes_set_long( + grib, "scaledValueOfRadiusOfSphericalEarth", ellipsoid.semi_major_axis + ) eccodes.codes_set_long(grib, "scaleFactorOfEarthMajorAxis", 0) eccodes.codes_set_long(grib, "scaledValueOfEarthMajorAxis", 0) eccodes.codes_set_long(grib, "scaleFactorOfEarthMinorAxis", 0) @@ -216,11 +225,13 @@ def shape_of_the_earth(cube, grib): else: eccodes.codes_set_long(grib, "shapeOfTheEarth", 7) eccodes.codes_set_long(grib, "scaleFactorOfEarthMajorAxis", 0) - eccodes.codes_set_long(grib, "scaledValueOfEarthMajorAxis", - ellipsoid.semi_major_axis) + eccodes.codes_set_long( + grib, "scaledValueOfEarthMajorAxis", ellipsoid.semi_major_axis + ) eccodes.codes_set_long(grib, "scaleFactorOfEarthMinorAxis", 0) - eccodes.codes_set_long(grib, "scaledValueOfEarthMinorAxis", - ellipsoid.semi_minor_axis) + eccodes.codes_set_long( + grib, "scaledValueOfEarthMinorAxis", ellipsoid.semi_minor_axis + ) def grid_dims(x_coord, y_coord, grib, x_str, y_str): @@ -232,24 +243,28 @@ def latlon_first_last(x_coord, y_coord, grib): if x_coord.has_bounds() or y_coord.has_bounds(): warnings.warn("Ignoring xy bounds") -# XXX Pending #1125 -# eccodes.codes_set_double(grib, "latitudeOfFirstGridPointInDegrees", -# float(y_coord.points[0])) -# eccodes.codes_set_double(grib, "latitudeOfLastGridPointInDegrees", -# float(y_coord.points[-1])) -# eccodes.codes_set_double(grib, "longitudeOfFirstGridPointInDegrees", -# float(x_coord.points[0])) -# eccodes.codes_set_double(grib, "longitudeOfLastGridPointInDegrees", -# float(x_coord.points[-1])) -# WORKAROUND - eccodes.codes_set_long(grib, "latitudeOfFirstGridPoint", - int(y_coord.points[0]*1000000)) - eccodes.codes_set_long(grib, "latitudeOfLastGridPoint", - int(y_coord.points[-1]*1000000)) - eccodes.codes_set_long(grib, "longitudeOfFirstGridPoint", - int((x_coord.points[0] % 360)*1000000)) - eccodes.codes_set_long(grib, "longitudeOfLastGridPoint", - int((x_coord.points[-1] % 360)*1000000)) + # XXX Pending #1125 + # eccodes.codes_set_double(grib, "latitudeOfFirstGridPointInDegrees", + # float(y_coord.points[0])) + # eccodes.codes_set_double(grib, "latitudeOfLastGridPointInDegrees", + # float(y_coord.points[-1])) + # eccodes.codes_set_double(grib, "longitudeOfFirstGridPointInDegrees", + # float(x_coord.points[0])) + # eccodes.codes_set_double(grib, "longitudeOfLastGridPointInDegrees", + # float(x_coord.points[-1])) + # WORKAROUND + eccodes.codes_set_long( + grib, "latitudeOfFirstGridPoint", int(y_coord.points[0] * 1000000) + ) + eccodes.codes_set_long( + grib, "latitudeOfLastGridPoint", int(y_coord.points[-1] * 1000000) + ) + eccodes.codes_set_long( + grib, "longitudeOfFirstGridPoint", int((x_coord.points[0] % 360) * 1000000) + ) + eccodes.codes_set_long( + grib, "longitudeOfLastGridPoint", int((x_coord.points[-1] % 360) * 1000000) + ) def dx_dy(x_coord, y_coord, grib): @@ -258,25 +273,27 @@ def dx_dy(x_coord, y_coord, grib): # Set x and y step. For degrees, this is encoded as an integer: # 1 * 10^6 * floating point value. # WMO Manual on Codes regulation 92.1.6 - if x_coord.units == 'degrees': - eccodes.codes_set(grib, "iDirectionIncrement", - round(1e6 * float(abs(x_step)))) + if x_coord.units == "degrees": + eccodes.codes_set(grib, "iDirectionIncrement", round(1e6 * float(abs(x_step)))) else: - raise ValueError('X coordinate must be in degrees, not {}' - '.'.format(x_coord.units)) - if y_coord.units == 'degrees': - eccodes.codes_set(grib, "jDirectionIncrement", - round(1e6 * float(abs(y_step)))) + raise ValueError( + "X coordinate must be in degrees, not {}" ".".format(x_coord.units) + ) + if y_coord.units == "degrees": + eccodes.codes_set(grib, "jDirectionIncrement", round(1e6 * float(abs(y_step)))) else: - raise ValueError('Y coordinate must be in degrees, not {}' - '.'.format(y_coord.units)) + raise ValueError( + "Y coordinate must be in degrees, not {}" ".".format(y_coord.units) + ) def scanning_mode_flags(x_coord, y_coord, grib): - eccodes.codes_set_long(grib, "iScansPositively", - int(x_coord.points[1] - x_coord.points[0] > 0)) - eccodes.codes_set_long(grib, "jScansPositively", - int(y_coord.points[1] - y_coord.points[0] > 0)) + eccodes.codes_set_long( + grib, "iScansPositively", int(x_coord.points[1] - x_coord.points[0] > 0) + ) + eccodes.codes_set_long( + grib, "jScansPositively", int(y_coord.points[1] - y_coord.points[0] > 0) + ) def horizontal_grid_common(cube, grib, xy=False): @@ -301,13 +318,17 @@ def latlon_points_irregular(cube, grib): x_coord = cube.coord(dimensions=[1]) # Distinguish between true-north and grid-oriented vectors. - is_grid_wind = cube.name() in ('x_wind', 'y_wind', 'grid_eastward_wind', - 'grid_northward_wind') + is_grid_wind = cube.name() in ( + "x_wind", + "y_wind", + "grid_eastward_wind", + "grid_northward_wind", + ) # Encode in bit "5" of 'resolutionAndComponentFlags' (other bits unused). component_flags = 0 if is_grid_wind: - component_flags |= 2 ** _RESOLUTION_AND_COMPONENTS_GRID_WINDS_BIT - eccodes.codes_set(grib, 'resolutionAndComponentFlags', component_flags) + component_flags |= 2**_RESOLUTION_AND_COMPONENTS_GRID_WINDS_BIT + eccodes.codes_set(grib, "resolutionAndComponentFlags", component_flags) # Record the X and Y coordinate values. # NOTE: there is currently a bug in the gribapi which means that the size @@ -316,10 +337,12 @@ def latlon_points_irregular(cube, grib): # So, this only works at present if the x and y dimensions are **equal**. lon_values = x_coord.points / _DEFAULT_DEGREES_UNITS lat_values = y_coord.points / _DEFAULT_DEGREES_UNITS - eccodes.codes_set_array(grib, 'longitude', - np.array(np.round(lon_values), dtype=np.int64)) - eccodes.codes_set_array(grib, 'latitude', - np.array(np.round(lat_values), dtype=np.int64)) + eccodes.codes_set_array( + grib, "longitude", np.array(np.round(lon_values), dtype=np.int64) + ) + eccodes.codes_set_array( + grib, "latitude", np.array(np.round(lat_values), dtype=np.int64) + ) def rotated_pole(cube, grib): @@ -328,19 +351,19 @@ def rotated_pole(cube, grib): if cs.north_pole_grid_longitude != 0.0: raise TranslationError( - 'Grib save does not yet support Rotated-pole coordinates with ' - 'a rotated prime meridian.') -# XXX Pending #1125 -# eccodes.codes_set_double(grib, "latitudeOfSouthernPoleInDegrees", -# float(cs.n_pole.latitude)) -# eccodes.codes_set_double(grib, "longitudeOfSouthernPoleInDegrees", -# float(cs.n_pole.longitude)) -# eccodes.codes_set_double(grib, "angleOfRotationInDegrees", 0) -# WORKAROUND + "Grib save does not yet support Rotated-pole coordinates with " + "a rotated prime meridian." + ) + # XXX Pending #1125 + # eccodes.codes_set_double(grib, "latitudeOfSouthernPoleInDegrees", + # float(cs.n_pole.latitude)) + # eccodes.codes_set_double(grib, "longitudeOfSouthernPoleInDegrees", + # float(cs.n_pole.longitude)) + # eccodes.codes_set_double(grib, "angleOfRotationInDegrees", 0) + # WORKAROUND latitude = cs.grid_north_pole_latitude / _DEFAULT_DEGREES_UNITS - longitude = (((cs.grid_north_pole_longitude + 180) % 360) / - _DEFAULT_DEGREES_UNITS) - eccodes.codes_set(grib, "latitudeOfSouthernPole", - int(round(latitude))) + longitude = ((cs.grid_north_pole_longitude + 180) % 360) / _DEFAULT_DEGREES_UNITS + eccodes.codes_set(grib, "latitudeOfSouthernPole", -int(round(latitude))) eccodes.codes_set(grib, "longitudeOfSouthernPole", int(round(longitude))) eccodes.codes_set(grib, "angleOfRotation", 0) @@ -456,8 +479,8 @@ def grid_definition_template_10(cube, grib): # Normalise the coordinate values to millimetres - the resolution # used in the GRIB message. - y_mm = points_in_unit(y_coord, 'mm') - x_mm = points_in_unit(x_coord, 'mm') + y_mm = points_in_unit(y_coord, "mm") + x_mm = points_in_unit(x_coord, "mm") # Encode the horizontal points. @@ -467,43 +490,54 @@ def grid_definition_template_10(cube, grib): x_step = step(x_mm, atol=1) y_step = step(y_mm, atol=1) except ValueError: - msg = 'Irregular coordinates not supported for Mercator.' + msg = "Irregular coordinates not supported for Mercator." raise TranslationError(msg) - eccodes.codes_set(grib, 'Di', abs(x_step)) - eccodes.codes_set(grib, 'Dj', abs(y_step)) + eccodes.codes_set(grib, "Di", abs(x_step)) + eccodes.codes_set(grib, "Dj", abs(y_step)) horizontal_grid_common(cube, grib) # Transform first and last points into geographic CS. geog = cs.ellipsoid if cs.ellipsoid is not None else GeogCS(1) - first_x, first_y, = geog.as_cartopy_crs().transform_point( - x_coord.points[0], - y_coord.points[0], - cs.as_cartopy_crs()) + ( + first_x, + first_y, + ) = geog.as_cartopy_crs().transform_point( + x_coord.points[0], y_coord.points[0], cs.as_cartopy_crs() + ) last_x, last_y = geog.as_cartopy_crs().transform_point( - x_coord.points[-1], - y_coord.points[-1], - cs.as_cartopy_crs()) + x_coord.points[-1], y_coord.points[-1], cs.as_cartopy_crs() + ) first_x = first_x % 360 last_x = last_x % 360 - eccodes.codes_set(grib, "latitudeOfFirstGridPoint", - int(np.round(first_y / _DEFAULT_DEGREES_UNITS))) - eccodes.codes_set(grib, "longitudeOfFirstGridPoint", - int(np.round(first_x / _DEFAULT_DEGREES_UNITS))) - eccodes.codes_set(grib, "latitudeOfLastGridPoint", - int(np.round(last_y / _DEFAULT_DEGREES_UNITS))) - eccodes.codes_set(grib, "longitudeOfLastGridPoint", - int(np.round(last_x / _DEFAULT_DEGREES_UNITS))) + eccodes.codes_set( + grib, + "latitudeOfFirstGridPoint", + int(np.round(first_y / _DEFAULT_DEGREES_UNITS)), + ) + eccodes.codes_set( + grib, + "longitudeOfFirstGridPoint", + int(np.round(first_x / _DEFAULT_DEGREES_UNITS)), + ) + eccodes.codes_set( + grib, "latitudeOfLastGridPoint", int(np.round(last_y / _DEFAULT_DEGREES_UNITS)) + ) + eccodes.codes_set( + grib, "longitudeOfLastGridPoint", int(np.round(last_x / _DEFAULT_DEGREES_UNITS)) + ) # Encode the latitude at which the projection intersects the Earth. - eccodes.codes_set(grib, 'LaD', - cs.standard_parallel / _DEFAULT_DEGREES_UNITS) + eccodes.codes_set(grib, "LaD", cs.standard_parallel / _DEFAULT_DEGREES_UNITS) # Encode resolution and component flags - eccodes.codes_set(grib, 'resolutionAndComponentFlags', - 0x1 << _RESOLUTION_AND_COMPONENTS_GRID_WINDS_BIT) + eccodes.codes_set( + grib, + "resolutionAndComponentFlags", + 0x1 << _RESOLUTION_AND_COMPONENTS_GRID_WINDS_BIT, + ) def grid_definition_template_12(cube, grib): @@ -523,8 +557,8 @@ def grid_definition_template_12(cube, grib): # Normalise the coordinate values to centimetres - the resolution # used in the GRIB message. - y_cm = points_in_unit(y_coord, 'cm') - x_cm = points_in_unit(x_coord, 'cm') + y_cm = points_in_unit(y_coord, "cm") + x_cm = points_in_unit(x_coord, "cm") # Set some keys specific to GDT12. # Encode the horizontal points. @@ -535,29 +569,30 @@ def grid_definition_template_12(cube, grib): x_step = step(x_cm, atol=1) y_step = step(y_cm, atol=1) except ValueError: - msg = ('Irregular coordinates not supported for Transverse ' - 'Mercator.') + msg = "Irregular coordinates not supported for Transverse " "Mercator." raise TranslationError(msg) - eccodes.codes_set(grib, 'Di', abs(x_step)) - eccodes.codes_set(grib, 'Dj', abs(y_step)) + eccodes.codes_set(grib, "Di", abs(x_step)) + eccodes.codes_set(grib, "Dj", abs(y_step)) horizontal_grid_common(cube, grib) # GRIBAPI expects unsigned ints in X1, X2, Y1, Y2 but it should accept # signed ints, so work around this. # See https://software.ecmwf.int/issues/browse/SUP-1101 - ensure_set_int32_value(grib, 'Y1', int(y_cm[0])) - ensure_set_int32_value(grib, 'Y2', int(y_cm[-1])) - ensure_set_int32_value(grib, 'X1', int(x_cm[0])) - ensure_set_int32_value(grib, 'X2', int(x_cm[-1])) + ensure_set_int32_value(grib, "Y1", int(y_cm[0])) + ensure_set_int32_value(grib, "Y2", int(y_cm[-1])) + ensure_set_int32_value(grib, "X1", int(x_cm[0])) + ensure_set_int32_value(grib, "X2", int(x_cm[-1])) # Lat and lon of reference point are measured in millionths of a degree. eccodes.codes_set( - grib, "latitudeOfReferencePoint", - cs.latitude_of_projection_origin / _DEFAULT_DEGREES_UNITS + grib, + "latitudeOfReferencePoint", + cs.latitude_of_projection_origin / _DEFAULT_DEGREES_UNITS, ) eccodes.codes_set( - grib, "longitudeOfReferencePoint", - cs.longitude_of_central_meridian / _DEFAULT_DEGREES_UNITS + grib, + "longitudeOfReferencePoint", + cs.longitude_of_central_meridian / _DEFAULT_DEGREES_UNITS, ) # Convert a value in metres into the closest integer number of @@ -566,15 +601,14 @@ def m_to_cm(value): return int(round(value * 100)) # False easting and false northing are measured in units of (10^-2)m. - eccodes.codes_set(grib, 'XR', m_to_cm(cs.false_easting)) - eccodes.codes_set(grib, 'YR', m_to_cm(cs.false_northing)) + eccodes.codes_set(grib, "XR", m_to_cm(cs.false_easting)) + eccodes.codes_set(grib, "YR", m_to_cm(cs.false_northing)) # GRIBAPI expects a signed int for scaleFactorAtReferencePoint # but it should accept a float, so work around this. # See https://software.ecmwf.int/issues/browse/SUP-1100 value = cs.scale_factor_at_central_meridian - key_type = eccodes.codes_get_native_type(grib, - "scaleFactorAtReferencePoint") + key_type = eccodes.codes_get_native_type(grib, "scaleFactorAtReferencePoint") if key_type is not float: value = fixup_float32_as_int32(value) eccodes.codes_set(grib, "scaleFactorAtReferencePoint", value) @@ -598,8 +632,8 @@ def grid_definition_template_30(cube, grib): # Normalise the coordinate values to millimetres - the resolution # used in the GRIB message. - y_mm = points_in_unit(y_coord, 'mm') - x_mm = points_in_unit(x_coord, 'mm') + y_mm = points_in_unit(y_coord, "mm") + x_mm = points_in_unit(x_coord, "mm") # Encode the horizontal points. @@ -609,40 +643,47 @@ def grid_definition_template_30(cube, grib): x_step = step(x_mm, atol=1) y_step = step(y_mm, atol=1) except ValueError: - msg = ('Irregular coordinates not supported for Lambert ' - 'Conformal.') + msg = "Irregular coordinates not supported for Lambert " "Conformal." raise TranslationError(msg) - eccodes.codes_set(grib, 'Dx', abs(x_step)) - eccodes.codes_set(grib, 'Dy', abs(y_step)) + eccodes.codes_set(grib, "Dx", abs(x_step)) + eccodes.codes_set(grib, "Dy", abs(y_step)) horizontal_grid_common(cube, grib, xy=True) # Transform first point into geographic CS geog = cs.ellipsoid if cs.ellipsoid is not None else GeogCS(1) first_x, first_y = geog.as_cartopy_crs().transform_point( - x_coord.points[0], - y_coord.points[0], - cs.as_cartopy_crs()) + x_coord.points[0], y_coord.points[0], cs.as_cartopy_crs() + ) first_x = first_x % 360 central_lon = cs.central_lon % 360 - eccodes.codes_set(grib, "latitudeOfFirstGridPoint", - int(np.round(first_y / _DEFAULT_DEGREES_UNITS))) - eccodes.codes_set(grib, "longitudeOfFirstGridPoint", - int(np.round(first_x / _DEFAULT_DEGREES_UNITS))) + eccodes.codes_set( + grib, + "latitudeOfFirstGridPoint", + int(np.round(first_y / _DEFAULT_DEGREES_UNITS)), + ) + eccodes.codes_set( + grib, + "longitudeOfFirstGridPoint", + int(np.round(first_x / _DEFAULT_DEGREES_UNITS)), + ) eccodes.codes_set(grib, "LaD", cs.central_lat / _DEFAULT_DEGREES_UNITS) eccodes.codes_set(grib, "LoV", central_lon / _DEFAULT_DEGREES_UNITS) latin1, latin2 = cs.secant_latitudes eccodes.codes_set(grib, "Latin1", latin1 / _DEFAULT_DEGREES_UNITS) eccodes.codes_set(grib, "Latin2", latin2 / _DEFAULT_DEGREES_UNITS) - eccodes.codes_set(grib, 'resolutionAndComponentFlags', - 0x1 << _RESOLUTION_AND_COMPONENTS_GRID_WINDS_BIT) + eccodes.codes_set( + grib, + "resolutionAndComponentFlags", + 0x1 << _RESOLUTION_AND_COMPONENTS_GRID_WINDS_BIT, + ) # Which pole are the parallels closest to? That is the direction # that the cone converges. poliest_sec = latin1 if abs(latin1) > abs(latin2) else latin2 centre_flag = 0x0 if poliest_sec > 0 else 0x1 - eccodes.codes_set(grib, 'projectionCentreFlag', centre_flag) + eccodes.codes_set(grib, "projectionCentreFlag", centre_flag) eccodes.codes_set(grib, "latitudeOfSouthernPole", 0) eccodes.codes_set(grib, "longitudeOfSouthernPole", 0) @@ -665,8 +706,8 @@ def grid_definition_template_140(cube, grib): # Normalise the coordinate values to millimetres - the resolution # used in the GRIB message. - y_mm = points_in_unit(y_coord, 'mm') - x_mm = points_in_unit(x_coord, 'mm') + y_mm = points_in_unit(y_coord, "mm") + x_mm = points_in_unit(x_coord, "mm") # Encode the horizontal points. @@ -676,40 +717,52 @@ def grid_definition_template_140(cube, grib): x_step = step(x_mm, atol=1) y_step = step(y_mm, atol=1) except ValueError: - msg = ('Irregular coordinates not supported for Lambert ' - 'Azimuthal Equal Area.') + msg = "Irregular coordinates not supported for Lambert " "Azimuthal Equal Area." raise TranslationError(msg) - eccodes.codes_set(grib, 'Dx', abs(x_step)) - eccodes.codes_set(grib, 'Dy', abs(y_step)) + eccodes.codes_set(grib, "Dx", abs(x_step)) + eccodes.codes_set(grib, "Dy", abs(y_step)) horizontal_grid_common(cube, grib, xy=True) # Transform first point into geographic CS geog = cs.ellipsoid if cs.ellipsoid is not None else GeogCS(1) first_x, first_y = geog.as_cartopy_crs().transform_point( - x_coord.points[0], - y_coord.points[0], - cs.as_cartopy_crs()) + x_coord.points[0], y_coord.points[0], cs.as_cartopy_crs() + ) first_x = first_x % 360 central_lon = cs.longitude_of_projection_origin % 360 central_lat = cs.latitude_of_projection_origin - eccodes.codes_set(grib, "latitudeOfFirstGridPoint", - int(np.round(first_y / _DEFAULT_DEGREES_UNITS))) - eccodes.codes_set(grib, "longitudeOfFirstGridPoint", - int(np.round(first_x / _DEFAULT_DEGREES_UNITS))) - eccodes.codes_set(grib, 'standardParallelInMicrodegrees', - central_lat / _DEFAULT_DEGREES_UNITS) - eccodes.codes_set(grib, 'centralLongitudeInMicrodegrees', - central_lon / _DEFAULT_DEGREES_UNITS) - eccodes.codes_set(grib, 'resolutionAndComponentFlags', - 0x1 << _RESOLUTION_AND_COMPONENTS_GRID_WINDS_BIT) - if (not (np.isclose(cs.false_easting, 0.0, atol=1e-6)) or - not (np.isclose(cs.false_northing, 0.0, atol=1e-6))): - msg = ('non zero false easting ({:.2f}) or ' - 'non zero false northing ({:.2f})' - '; unsupported by GRIB Template 3.140' - '').format(cs.false_easting, cs.false_northing) + eccodes.codes_set( + grib, + "latitudeOfFirstGridPoint", + int(np.round(first_y / _DEFAULT_DEGREES_UNITS)), + ) + eccodes.codes_set( + grib, + "longitudeOfFirstGridPoint", + int(np.round(first_x / _DEFAULT_DEGREES_UNITS)), + ) + eccodes.codes_set( + grib, "standardParallelInMicrodegrees", central_lat / _DEFAULT_DEGREES_UNITS + ) + eccodes.codes_set( + grib, "centralLongitudeInMicrodegrees", central_lon / _DEFAULT_DEGREES_UNITS + ) + eccodes.codes_set( + grib, + "resolutionAndComponentFlags", + 0x1 << _RESOLUTION_AND_COMPONENTS_GRID_WINDS_BIT, + ) + if not (np.isclose(cs.false_easting, 0.0, atol=1e-6)) or not ( + np.isclose(cs.false_northing, 0.0, atol=1e-6) + ): + msg = ( + "non zero false easting ({:.2f}) or " + "non zero false northing ({:.2f})" + "; unsupported by GRIB Template 3.140" + "" + ).format(cs.false_easting, cs.false_northing) raise TranslationError(msg) @@ -755,8 +808,8 @@ def grid_definition_section(cube, grib): grid_definition_template_140(cube, grib) else: - name = cs.grid_mapping_name.replace('_', ' ').title() - emsg = 'Grib saving is not supported for coordinate system {!r}' + name = cs.grid_mapping_name.replace("_", " ").title() + emsg = "Grib saving is not supported for coordinate system {!r}" raise ValueError(emsg.format(name)) @@ -766,13 +819,14 @@ def grid_definition_section(cube, grib): # ############################################################################### + def set_discipline_and_parameter(cube, grib): # Default values for parameter identity keys = effectively "MISSING". discipline, category, number = 255, 255, 255 identity_found = False # First, see if we can find and interpret a 'GRIB_PARAM' attribute. - attr = cube.attributes.get('GRIB_PARAM', None) + attr = cube.attributes.get("GRIB_PARAM", None) if attr: try: # Convert to standard tuple-derived form. @@ -789,8 +843,7 @@ def set_discipline_and_parameter(cube, grib): # Else, translate a cube phenomenon, if possible. # NOTE: for now, can match by *either* standard_name or long_name. # This allows workarounds for data with no identified standard_name. - grib2_info = gptx.cf_phenom_to_grib2_info(cube.standard_name, - cube.long_name) + grib2_info = gptx.cf_phenom_to_grib2_info(cube.standard_name, cube.long_name) if grib2_info is not None: discipline = grib2_info.discipline category = grib2_info.category @@ -798,9 +851,11 @@ def set_discipline_and_parameter(cube, grib): identity_found = True if not identity_found: - warnings.warn('Unable to determine Grib2 parameter code for cube.\n' - 'discipline, parameterCategory and parameterNumber ' - 'have been set to "missing".') + warnings.warn( + "Unable to determine Grib2 parameter code for cube.\n" + "discipline, parameterCategory and parameterNumber " + 'have been set to "missing".' + ) eccodes.codes_set(grib, "discipline", discipline) eccodes.codes_set(grib, "parameterCategory", category) @@ -812,10 +867,9 @@ def _non_missing_forecast_period(cube): fp_coord = cube.coord("forecast_period") # Convert fp and t to hours so we can subtract to calculate R. - cf_fp_hrs = fp_coord.units.convert(fp_coord.points[0], 'hours') + cf_fp_hrs = fp_coord.units.convert(fp_coord.points[0], "hours") t_coord = cube.coord("time").copy() - hours_since = cf_units.Unit("hours since epoch", - calendar=t_coord.units.calendar) + hours_since = cf_units.Unit("hours since epoch", calendar=t_coord.units.calendar) t_coord.convert_units(hours_since) rt_num = t_coord.points[0] - cf_fp_hrs @@ -831,20 +885,20 @@ def _non_missing_forecast_period(cube): grib_time_code = 13 else: raise TranslationError( - "Unexpected units for 'forecast_period' : %s" % fp_coord.units) + "Unexpected units for 'forecast_period' : %s" % fp_coord.units + ) if not t_coord.has_bounds(): fp = fp_coord.points[0] else: if not fp_coord.has_bounds(): raise TranslationError( - "bounds on 'time' coordinate requires bounds on" - " 'forecast_period'.") + "bounds on 'time' coordinate requires bounds on" " 'forecast_period'." + ) fp = fp_coord.bounds[0][0] if fp - int(fp): - warnings.warn("forecast_period encoding problem: " - "scaling required.") + warnings.warn("forecast_period encoding problem: " "scaling required.") fp = int(fp) return rt, rt_meaning, fp, grib_time_code @@ -858,11 +912,12 @@ def _missing_forecast_period(cube): """ t_coord = cube.coord("time") - if cube.coords('forecast_reference_time'): + if cube.coords("forecast_reference_time"): # Make copies and convert them to common "hours since" units. - hours_since = cf_units.Unit('hours since epoch', - calendar=t_coord.units.calendar) - frt_coord = cube.coord('forecast_reference_time').copy() + hours_since = cf_units.Unit( + "hours since epoch", calendar=t_coord.units.calendar + ) + frt_coord = cube.coord("forecast_reference_time").copy() frt_coord.convert_units(hours_since) t_coord = t_coord.copy() t_coord.convert_units(hours_since) @@ -875,8 +930,7 @@ def _missing_forecast_period(cube): fp = t - frt integer_fp = int(fp) if integer_fp != fp: - msg = 'Truncating floating point forecast period {} to ' \ - 'integer value {}' + msg = "Truncating floating point forecast period {} to " "integer value {}" warnings.warn(msg.format(fp, integer_fp)) fp = integer_fp fp_meaning = 1 # Hours @@ -915,18 +969,19 @@ def set_forecast_time(cube, grib): def set_fixed_surfaces(cube, grib, full3d_cube=None): - # Look for something we can export v_coord = grib_v_code = output_unit = None # Detect factories for hybrid vertical coordinates. hybrid_factories = [ - factory for factory in cube.aux_factories - if isinstance(factory, (HybridHeightFactory, HybridPressureFactory))] + factory + for factory in cube.aux_factories + if isinstance(factory, (HybridHeightFactory, HybridPressureFactory)) + ] if not hybrid_factories: hybrid_factory = None elif len(hybrid_factories) > 1: - msg = 'Data contains >1 vertical coordinate factory : {}' + msg = "Data contains >1 vertical coordinate factory : {}" raise ValueError(msg.format(hybrid_factories)) else: factory = hybrid_factories[0] @@ -939,14 +994,14 @@ def set_fixed_surfaces(cube, grib, full3d_cube=None): if hybrid_factory is not None: # N.B. in this case, there are additional operations, besides just # encoding v_coord : see below at end .. - v_coord = cube.coord('model_level_number') + v_coord = cube.coord("model_level_number") output_unit = cf_units.Unit("1") if isinstance(hybrid_factory, HybridHeightFactory): grib_v_code = 118 elif isinstance(hybrid_factory, HybridPressureFactory): grib_v_code = 119 else: - msg = 'Unrecognised factory type : {}' + msg = "Unrecognised factory type : {}" raise ValueError(msg.format(hybrid_factory)) # pressure @@ -970,37 +1025,41 @@ def set_fixed_surfaces(cube, grib, full3d_cube=None): # depth elif cube.coords("depth"): grib_v_code = 106 - output_unit = cf_units.Unit('m') + output_unit = cf_units.Unit("m") v_coord = cube.coord("depth") elif cube.coords("air_potential_temperature"): grib_v_code = 107 - output_unit = cf_units.Unit('K') + output_unit = cf_units.Unit("K") v_coord = cube.coord("air_potential_temperature") # unknown / absent else: - fs_v_coords = [coord for coord in cube.coords() if - 'GRIB_fixed_surface_type' in coord.attributes] + fs_v_coords = [ + coord + for coord in cube.coords() + if "GRIB_fixed_surface_type" in coord.attributes + ] if len(fs_v_coords) > 1: - fs_types = [c.attributes['GRIB_fixed_surface_type'] - for c in fs_v_coords] - raise ValueError("Multiple vertical-axis coordinates were found " - f"of fixed surface type: {fs_types}") + fs_types = [c.attributes["GRIB_fixed_surface_type"] for c in fs_v_coords] + raise ValueError( + "Multiple vertical-axis coordinates were found " + f"of fixed surface type: {fs_types}" + ) elif len(fs_v_coords) == 1: v_coord = fs_v_coords[0] - grib_v_code = v_coord.attributes['GRIB_fixed_surface_type'] + grib_v_code = v_coord.attributes["GRIB_fixed_surface_type"] else: # check for *ANY* height coords at all... - v_coords = cube.coords(axis='z') + v_coords = cube.coords(axis="z") if v_coords: # There are vertical coordinate(s), but we don't understand # them... - v_coords_str = ' ,'.join(["'{}'".format(c.name()) - for c in v_coords]) + v_coords_str = " ,".join(["'{}'".format(c.name()) for c in v_coords]) raise TranslationError( - 'The vertical-axis coordinate(s) ({}) ' - 'are not recognised or handled.'.format(v_coords_str)) + "The vertical-axis coordinate(s) ({}) " + "are not recognised or handled.".format(v_coords_str) + ) # What did we find? if v_coord is None: @@ -1013,10 +1072,8 @@ def set_fixed_surfaces(cube, grib, full3d_cube=None): eccodes.codes_set(grib, "scaledValueOfFirstFixedSurface", 0) # Set secondary surface = 'missing'. eccodes.codes_set(grib, "typeOfSecondFixedSurface", 255) - eccodes.codes_set(grib, "scaleFactorOfSecondFixedSurface", - GRIB_MISSING_LONG) - eccodes.codes_set(grib, "scaledValueOfSecondFixedSurface", - GRIB_MISSING_LONG) + eccodes.codes_set(grib, "scaleFactorOfSecondFixedSurface", GRIB_MISSING_LONG) + eccodes.codes_set(grib, "scaledValueOfSecondFixedSurface", GRIB_MISSING_LONG) elif not v_coord.has_bounds(): # No second surface output_v = v_coord.points[0] @@ -1030,10 +1087,8 @@ def set_fixed_surfaces(cube, grib, full3d_cube=None): eccodes.codes_set(grib, "scaleFactorOfFirstFixedSurface", 0) eccodes.codes_set(grib, "scaledValueOfFirstFixedSurface", output_v) eccodes.codes_set(grib, "typeOfSecondFixedSurface", 255) - eccodes.codes_set(grib, "scaleFactorOfSecondFixedSurface", - GRIB_MISSING_LONG) - eccodes.codes_set(grib, "scaledValueOfSecondFixedSurface", - GRIB_MISSING_LONG) + eccodes.codes_set(grib, "scaleFactorOfSecondFixedSurface", GRIB_MISSING_LONG) + eccodes.codes_set(grib, "scaledValueOfSecondFixedSurface", GRIB_MISSING_LONG) else: # bounded : set lower+upper surfaces output_v = v_coord.bounds[0] @@ -1045,29 +1100,30 @@ def set_fixed_surfaces(cube, grib, full3d_cube=None): eccodes.codes_set(grib, "typeOfSecondFixedSurface", grib_v_code) eccodes.codes_set(grib, "scaleFactorOfFirstFixedSurface", 0) eccodes.codes_set(grib, "scaleFactorOfSecondFixedSurface", 0) - eccodes.codes_set(grib, "scaledValueOfFirstFixedSurface", - int(round(output_v[0]))) - eccodes.codes_set(grib, "scaledValueOfSecondFixedSurface", - int(round(output_v[1]))) + eccodes.codes_set( + grib, "scaledValueOfFirstFixedSurface", int(round(output_v[0])) + ) + eccodes.codes_set( + grib, "scaledValueOfSecondFixedSurface", int(round(output_v[1])) + ) if hybrid_factory is not None: # Need to record ALL the level coefficients in a 'PV' vector. level_delta_coord = hybrid_factory.delta sigma_coord = hybrid_factory.sigma - model_levels = full3d_cube.coord('model_level_number').points + model_levels = full3d_cube.coord("model_level_number").points # Just check these make some kind of sense (!) - if model_levels.dtype.kind not in 'iu': - msg = 'model_level_number is not an integer: dtype={}.' + if model_levels.dtype.kind not in "iu": + msg = "model_level_number is not an integer: dtype={}." raise ValueError(msg.format(model_levels.dtype)) if np.min(model_levels) < 1: - msg = 'model_level_number must be > 0: minimum value = {}.' + msg = "model_level_number must be > 0: minimum value = {}." raise ValueError(msg.format(np.min(model_levels))) # Need to save enough levels for indexes up to [max(model_levels)] n_levels = np.max(model_levels) max_valid_nlevels = 9999 if n_levels > max_valid_nlevels: - msg = ('model_level_number values are > {} : ' - 'maximum value = {}.') + msg = "model_level_number values are > {} : " "maximum value = {}." raise ValueError(msg.format(max_valid_nlevels, n_levels)) # In sample data we have seen, there seems to be an extra missing data # value *before* each set of n-levels coefficients. @@ -1075,9 +1131,9 @@ def set_fixed_surfaces(cube, grib, full3d_cube=None): # I.E. sigma, delta = PV[i], PV[NV/2+i] : where i=1..n_levels n_coeffs = n_levels + 1 coeffs_array = np.zeros(n_coeffs * 2, dtype=np.float32) - for n_lev, height, sigma in zip(model_levels, - level_delta_coord.points, - sigma_coord.points): + for n_lev, height, sigma in zip( + model_levels, level_delta_coord.points, sigma_coord.points + ): # Record all the level coefficients coming from the 'full' cube. # Note: if some model levels are missing, we must still have the # coeffs at the correct index according to the model_level_number @@ -1099,20 +1155,23 @@ def set_time_range(time_coord, grib): """ if len(time_coord.points) != 1: - msg = 'Expected length one time coordinate, got {} points' + msg = "Expected length one time coordinate, got {} points" raise ValueError(msg.format(len(time_coord.points))) if time_coord.nbounds != 2: - msg = 'Expected time coordinate with two bounds, got {} bounds' + msg = "Expected time coordinate with two bounds, got {} bounds" raise ValueError(msg.format(time_coord.nbounds)) # Set type to hours and convert period to this unit. - eccodes.codes_set(grib, "indicatorOfUnitForTimeRange", - _TIME_RANGE_UNITS_INVERTED['hours']) - hours_since_units = cf_units.Unit('hours since epoch', - calendar=time_coord.units.calendar) - start_hours, end_hours = time_coord.units.convert(time_coord.bounds[0], - hours_since_units) + eccodes.codes_set( + grib, "indicatorOfUnitForTimeRange", _TIME_RANGE_UNITS_INVERTED["hours"] + ) + hours_since_units = cf_units.Unit( + "hours since epoch", calendar=time_coord.units.calendar + ) + start_hours, end_hours = time_coord.units.convert( + time_coord.bounds[0], hours_since_units + ) # Cast from np.float to Python int. The lengthOfTimeRange key is a # 4 byte integer so we cast to highlight truncation of any floating # point value. The grib_api will do the cast from float to int, but it @@ -1120,8 +1179,7 @@ def set_time_range(time_coord, grib): time_range_in_hours = end_hours - start_hours integer_hours = int(time_range_in_hours) if integer_hours != time_range_in_hours: - msg = 'Truncating floating point lengthOfTimeRange {} to ' \ - 'integer value {}' + msg = "Truncating floating point lengthOfTimeRange {} to " "integer value {}" warnings.warn(msg.format(time_range_in_hours, integer_hours)) eccodes.codes_set(grib, "lengthOfTimeRange", integer_hours) @@ -1143,14 +1201,14 @@ def set_time_increment(cell_method, grib): # Attempt to determine time increment from cell method intervals string. intervals = cell_method.intervals if intervals is not None and len(intervals) == 1: - interval, = intervals + (interval,) = intervals try: inc, units = interval.split() inc = float(inc) - if units in ('hr', 'hour', 'hours'): - units_type = _TIME_RANGE_UNITS_INVERTED['hours'] + if units in ("hr", "hour", "hours"): + units_type = _TIME_RANGE_UNITS_INVERTED["hours"] else: - raise ValueError('Unable to parse units of interval') + raise ValueError("Unable to parse units of interval") except ValueError: # Problem interpreting the interval string. inc = 0 @@ -1159,8 +1217,10 @@ def set_time_increment(cell_method, grib): # Cast to int as timeIncrement key is a 4 byte integer. integer_inc = int(inc) if integer_inc != inc: - warnings.warn('Truncating floating point timeIncrement {} to ' - 'integer value {}'.format(inc, integer_inc)) + warnings.warn( + "Truncating floating point timeIncrement {} to " + "integer value {}".format(inc, integer_inc) + ) inc = integer_inc eccodes.codes_set(grib, "indicatorOfUnitForTimeIncrement", units_type) @@ -1179,7 +1239,7 @@ def _cube_is_time_statistic(cube): """ result = False - stat_coord_name = 'percentile_over_time' + stat_coord_name = "percentile_over_time" cube_coord_names = [coord.name() for coord in cube.coords()] # Check our cube for time statistic indicators. @@ -1191,8 +1251,7 @@ def _cube_is_time_statistic(cube): result = True elif has_cell_methods: # Define accepted time names, including from coord_categorisations. - recognised_time_names = ['time', 'year', 'month', 'day', 'weekday', - 'season'] + recognised_time_names = ["time", "year", "month", "day", "weekday", "season"] latest_coordnames = cube.cell_methods[-1].coord_names if len(latest_coordnames) != 1: result = False @@ -1211,16 +1270,19 @@ def _spatial_statistic(cube): """ spatial_cell_methods = [ - cell_method for cell_method in cube.cell_methods if 'area' in - cell_method.coord_names] + cell_method + for cell_method in cube.cell_methods + if "area" in cell_method.coord_names + ] if len(spatial_cell_methods) > 1: raise ValueError("Cannot handle multiple 'area' cell methods") elif len(spatial_cell_methods[0].coord_names) > 1: - raise ValueError("Cannot handle multiple coordinate names in " - "the spatial processing related cell method. " - "Expected ('area',), got {!r}".format - (spatial_cell_methods[0].coord_names)) + raise ValueError( + "Cannot handle multiple coordinate names in " + "the spatial processing related cell method. " + "Expected ('area',), got {!r}".format(spatial_cell_methods[0].coord_names) + ) return spatial_cell_methods @@ -1229,10 +1291,12 @@ def statistical_method_code(cell_method_name): """ Decode cell_method string as statistic code integer. """ - statistic_code = _STATISTIC_TYPE_NAMES_INVERTED.get(cell_method_name, None) + statistic_code = _STATISTIC_TYPE_NAMES_INVERTED.get(cell_method_name) if statistic_code is None: - msg = ('Product definition section 4 contains an unsupported ' - 'statistical process type [{}] ') + msg = ( + "Product definition section 4 contains an unsupported " + "statistical process type [{}] " + ) raise TranslationError(msg.format(statistic_code)) return statistic_code @@ -1250,8 +1314,10 @@ def get_spatial_process_code(spatial_processing_type): break if spatial_processing_code is None: - msg = ('Product definition section 4 contains an unsupported ' - 'spatial processing or interpolation type: {} ') + msg = ( + "Product definition section 4 contains an unsupported " + "spatial processing or interpolation type: {} " + ) raise TranslationError(msg.format(spatial_processing_type)) return spatial_processing_code @@ -1263,12 +1329,14 @@ def set_ensemble(cube, grib): information. """ - if not (cube.coords('realization') and - len(cube.coord('realization').points) == 1): - raise ValueError("A cube 'realization' coordinate with one " - "point is required, but not present") - eccodes.codes_set(grib, "perturbationNumber", - int(cube.coord('realization').points[0])) + if not (cube.coords("realization") and len(cube.coord("realization").points) == 1): + raise ValueError( + "A cube 'realization' coordinate with one " + "point is required, but not present" + ) + eccodes.codes_set( + grib, "perturbationNumber", int(cube.coord("realization").points[0]) + ) # no encoding at present in iris-grib, set to missing eccodes.codes_set(grib, "numberOfForecastsInEnsemble", 255) eccodes.codes_set(grib, "typeOfEnsembleForecast", 255) @@ -1333,12 +1401,12 @@ def product_definition_template_6(cube, grib, full3d_cube=None): """ eccodes.codes_set(grib, "productDefinitionTemplateNumber", 6) product_definition_template_common(cube, grib, full3d_cube) - if not (cube.coords('percentile') and - len(cube.coord('percentile').points) == 1): - raise ValueError("A cube 'percentile' coordinate with one " - "point is required, but not present.") - eccodes.codes_set(grib, "percentileValue", - int(cube.coord('percentile').points[0])) + if not (cube.coords("percentile") and len(cube.coord("percentile").points) == 1): + raise ValueError( + "A cube 'percentile' coordinate with one " + "point is required, but not present." + ) + eccodes.codes_set(grib, "percentileValue", int(cube.coord("percentile").points[0])) def product_definition_template_8(cube, grib, full3d_cube=None): @@ -1364,12 +1432,17 @@ def product_definition_template_10(cube, grib, full3d_cube=None): """ eccodes.codes_set(grib, "productDefinitionTemplateNumber", 10) - if not (cube.coords('percentile_over_time') and - len(cube.coord('percentile_over_time').points) == 1): - raise ValueError("A cube 'percentile_over_time' coordinate with one " - "point is required, but not present.") - eccodes.codes_set(grib, "percentileValue", - int(cube.coord('percentile_over_time').points[0])) + if not ( + cube.coords("percentile_over_time") + and len(cube.coord("percentile_over_time").points) == 1 + ): + raise ValueError( + "A cube 'percentile_over_time' coordinate with one " + "point is required, but not present." + ) + eccodes.codes_set( + grib, "percentileValue", int(cube.coord("percentile_over_time").points[0]) + ) _product_definition_template_8_10_and_11(cube, grib) @@ -1399,14 +1472,14 @@ def _product_definition_template_8_10_and_11(cube, grib, full3d_cube=None): product_definition_template_common(cube, grib, full3d_cube) # Check for time coordinate. - time_coord = cube.coord('time') + time_coord = cube.coord("time") if len(time_coord.points) != 1: - msg = 'Expected length one time coordinate, got {} points' + msg = "Expected length one time coordinate, got {} points" raise ValueError(msg.format(time_coord.points)) if time_coord.nbounds != 2: - msg = 'Expected time coordinate with two bounds, got {} bounds' + msg = "Expected time coordinate with two bounds, got {} bounds" raise ValueError(msg.format(time_coord.nbounds)) # Extract the datetime-like object corresponding to the end of @@ -1435,25 +1508,27 @@ def _product_definition_template_8_10_and_11(cube, grib, full3d_cube=None): # time coord. if cube.cell_methods: time_cell_methods = [ - cell_method for cell_method in cube.cell_methods if 'time' in - cell_method.coord_names] + cell_method + for cell_method in cube.cell_methods + if "time" in cell_method.coord_names + ] if not time_cell_methods: - raise ValueError("Expected a cell method with a coordinate name " - "of 'time'") + raise ValueError( + "Expected a cell method with a coordinate name " "of 'time'" + ) if len(time_cell_methods) > 1: raise ValueError("Cannot handle multiple 'time' cell methods") - cell_method, = time_cell_methods + (cell_method,) = time_cell_methods if len(cell_method.coord_names) > 1: - raise ValueError("Cannot handle multiple coordinate names in " - "the time related cell method. Expected " - "('time',), got {!r}".format( - cell_method.coord_names)) + raise ValueError( + "Cannot handle multiple coordinate names in " + "the time related cell method. Expected " + "('time',), got {!r}".format(cell_method.coord_names) + ) # Type of statistical process (see code table 4.10) - statistic_type = _STATISTIC_TYPE_NAMES_INVERTED.get( - cell_method.method, 255 - ) + statistic_type = _STATISTIC_TYPE_NAMES_INVERTED.get(cell_method.method, 255) eccodes.codes_set(grib, "typeOfStatisticalProcessing", statistic_type) # Time increment i.e. interval of cell method (if any) @@ -1470,7 +1545,7 @@ def product_definition_template_15(cube, grib, full3d_cube=None): """ # Encode type of spatial processing (see code table 4.15) - spatial_processing_type = cube.attributes['spatial_processing_type'] + spatial_processing_type = cube.attributes["spatial_processing_type"] spatial_processing = get_spatial_process_code(spatial_processing_type) # Encode statistical process and number of points @@ -1480,8 +1555,10 @@ def product_definition_template_15(cube, grib, full3d_cube=None): # Only a limited number of spatial processing types are supported. if spatial_processing not in _SPATIAL_PROCESSING_TYPES.keys(): - msg = ('Cannot save Product Definition Type 4.15 with spatial ' - 'processing type {}'.format(spatial_processing)) + msg = ( + "Cannot save Product Definition Type 4.15 with spatial " + "processing type {}".format(spatial_processing) + ) raise ValueError(msg) if statistical_process is not None: @@ -1492,8 +1569,10 @@ def product_definition_template_15(cube, grib, full3d_cube=None): cell_method_name = spatial_stats[0].method statistical_process = statistical_method_code(cell_method_name) else: - raise ValueError("Could not find a suitable cell_method to save " - "as a spatial statistical process.") + raise ValueError( + "Could not find a suitable cell_method to save " + "as a spatial statistical process." + ) # Set GRIB messages eccodes.codes_set(grib, "productDefinitionTemplateNumber", 15) @@ -1517,7 +1596,7 @@ def product_definition_template_40(cube, grib, full3d_cube=None): """ eccodes.codes_set(grib, "productDefinitionTemplateNumber", 40) product_definition_template_common(cube, grib) - constituent_type = cube.attributes['WMO_constituent_type'] + constituent_type = cube.attributes["WMO_constituent_type"] eccodes.codes_set(grib, "constituentType", constituent_type) @@ -1528,25 +1607,25 @@ def product_definition_section(cube, grib, full3d_cube=None): """ if not cube.coord("time").has_bounds(): - if cube.coords('realization'): + if cube.coords("realization"): # ensemble forecast (template 4.1) pdt = product_definition_template_1(cube, grib, full3d_cube) - elif 'WMO_constituent_type' in cube.attributes: + elif "WMO_constituent_type" in cube.attributes: # forecast for atmospheric chemical constiuent (template 4.40) product_definition_template_40(cube, grib, full3d_cube) - elif 'spatial_processing_type' in cube.attributes: + elif "spatial_processing_type" in cube.attributes: # spatial process (template 4.15) product_definition_template_15(cube, grib, full3d_cube) - elif cube.coords('percentile'): + elif cube.coords("percentile"): product_definition_template_6(cube, grib, full3d_cube) else: # forecast (template 4.0) product_definition_template_0(cube, grib, full3d_cube) elif _cube_is_time_statistic(cube): - if cube.coords('realization'): + if cube.coords("realization"): # time processed (template 4.11) pdt = product_definition_template_11 - elif cube.coords('percentile_over_time'): + elif cube.coords("percentile_over_time"): # time processed as percentile (template 4.10) pdt = product_definition_template_10 else: @@ -1555,12 +1634,14 @@ def product_definition_section(cube, grib, full3d_cube=None): try: pdt(cube, grib, full3d_cube) except ValueError as e: - raise ValueError('Saving to GRIB2 failed: the cube is not suitable' - ' for saving as a time processed statistic GRIB' - ' message. {}'.format(e)) + raise ValueError( + "Saving to GRIB2 failed: the cube is not suitable" + " for saving as a time processed statistic GRIB" + " message. {}".format(e) + ) else: # Don't know how to handle this kind of data - msg = 'A suitable product template could not be deduced' + msg = "A suitable product template could not be deduced" raise TranslationError(msg) @@ -1570,6 +1651,7 @@ def product_definition_section(cube, grib, full3d_cube=None): # ############################################################################### + def data_section(cube, grib): # Masked data? if ma.isMaskedArray(cube.data): @@ -1589,12 +1671,13 @@ def data_section(cube, grib): data = cube.data # units scaling - grib2_info = gptx.cf_phenom_to_grib2_info(cube.standard_name, - cube.long_name) + grib2_info = gptx.cf_phenom_to_grib2_info(cube.standard_name, cube.long_name) if grib2_info is None: # for now, just allow this - warnings.warn('Unable to determine Grib2 parameter code for cube.\n' - 'Message data may not be correctly scaled.') + warnings.warn( + "Unable to determine Grib2 parameter code for cube.\n" + "Message data may not be correctly scaled." + ) else: if cube.units != grib2_info.units: data = cube.units.convert(data, grib2_info.units) @@ -1612,11 +1695,14 @@ def data_section(cube, grib): eccodes.codes_set_double_array(grib, "values", data.flatten()) # todo: check packing accuracy? + + # print("packingError", eccodes.get_get_double(grib, "packingError")) ############################################################################### + def gribbability_check(cube): "We always need the following things for grib saving." diff --git a/iris_grib/grib_phenom_translation.py b/iris_grib/grib_phenom_translation.py index a1680cbd..be56df4d 100644 --- a/iris_grib/grib_phenom_translation.py +++ b/iris_grib/grib_phenom_translation.py @@ -2,7 +2,7 @@ # # This file is part of iris-grib and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -''' +""" Provide grib 1 and 2 phenomenon translations to + from CF terms. This is done by wrapping '_grib_cf_map.py', @@ -14,7 +14,8 @@ * grib2 --> cf * cf --> grib2 -''' +""" + from collections import namedtuple import re import warnings @@ -34,6 +35,7 @@ class _LookupTable(dict): (but it is still possible to remove keys) """ + def __init__(self, *args, **kwargs): self._super = super() self._super.__init__(*args, **kwargs) @@ -45,32 +47,41 @@ def __getitem__(self, key): def __setitem__(self, key, value): if key in self and self[key] is not value: - raise KeyError('Attempted to set dict[{}] = {}, ' - 'but this is already set to {}.'.format( - key, value, self[key])) + raise KeyError( + "Attempted to set dict[{}] = {}, " + "but this is already set to {}.".format(key, value, self[key]) + ) self._super.__setitem__(key, value) # Define namedtuples for keys+values of the Grib1 lookup table. Grib1CfKey = namedtuple( - 'Grib1CfKey', - ('table2_version', 'centre_number', 'param_number')) + "Grib1CfKey", ("table2_version", "centre_number", "param_number") +) # NOTE: this form is currently used for both Grib1 *and* Grib2 Grib1CfData = namedtuple( - 'Grib1CfData', - ('standard_name', 'long_name', 'units', 'set_height')) + "Grib1CfData", ("standard_name", "long_name", "units", "set_height") +) # Create the grib1-to-cf lookup table. + def _make_grib1_cf_table(): - """ Build the Grib1 to CF phenomenon translation table. """ + """Build the Grib1 to CF phenomenon translation table.""" table = _LookupTable() - def _make_grib1_cf_entry(table2_version, centre_number, param_number, - standard_name, long_name, units, set_height=None): + def _make_grib1_cf_entry( + table2_version, + centre_number, + param_number, + standard_name, + long_name, + units, + set_height=None, + ): """ Check data, convert types and create a new _GRIB1_CF_TABLE key/value. @@ -79,24 +90,31 @@ def _make_grib1_cf_entry(table2_version, centre_number, param_number, e.g. "2-metre tempererature". """ - grib1_key = Grib1CfKey(table2_version=int(table2_version), - centre_number=int(centre_number), - param_number=int(param_number)) + grib1_key = Grib1CfKey( + table2_version=int(table2_version), + centre_number=int(centre_number), + param_number=int(param_number), + ) if standard_name is not None: if standard_name not in iris.std_names.STD_NAMES: - warnings.warn('{} is not a recognised CF standard name ' - '(skipping).'.format(standard_name)) + warnings.warn( + "{} is not a recognised CF standard name " "(skipping).".format( + standard_name + ) + ) return None # convert units string to iris Unit (i.e. mainly, check it is good) a_cf_unit = cf_units.Unit(units) - cf_data = Grib1CfData(standard_name=standard_name, - long_name=long_name, - units=a_cf_unit, - set_height=set_height) + cf_data = Grib1CfData( + standard_name=standard_name, + long_name=long_name, + units=a_cf_unit, + set_height=set_height, + ) return (grib1_key, cf_data) # Interpret the imported Grib1-to-CF table. - for (grib1data, cfdata) in grcf.GRIB1_LOCAL_TO_CF.items(): + for grib1data, cfdata in grcf.GRIB1_LOCAL_TO_CF.items(): assert grib1data.edition == 1 association_entry = _make_grib1_cf_entry( table2_version=grib1data.t2version, @@ -104,27 +122,35 @@ def _make_grib1_cf_entry(table2_version, centre_number, param_number, param_number=grib1data.iParam, standard_name=cfdata.standard_name, long_name=cfdata.long_name, - units=cfdata.units) + units=cfdata.units, + ) if association_entry is not None: key, value = association_entry table[key] = value # Do the same for special Grib1 codes that include an implied height level. - for (grib1data, (cfdata, extra_dimcoord)) \ - in grcf.GRIB1_LOCAL_TO_CF_CONSTRAINED.items(): + for grib1data, ( + cfdata, + extra_dimcoord, + ) in grcf.GRIB1_LOCAL_TO_CF_CONSTRAINED.items(): assert grib1data.edition == 1 - if extra_dimcoord.standard_name != 'height': - raise ValueError('Got implied dimension coord of "{}", ' - 'currently can only handle "height".'.format( - extra_dimcoord.standard_name)) - if extra_dimcoord.units != 'm': - raise ValueError('Got implied dimension units of "{}", ' - 'currently can only handle "m".'.format( - extra_dimcoord.units)) + if extra_dimcoord.standard_name != "height": + raise ValueError( + 'Got implied dimension coord of "{}", ' + 'currently can only handle "height".'.format( + extra_dimcoord.standard_name + ) + ) + if extra_dimcoord.units != "m": + raise ValueError( + 'Got implied dimension units of "{}", ' + 'currently can only handle "m".'.format(extra_dimcoord.units) + ) if len(extra_dimcoord.points) != 1: - raise ValueError('Implied dimension has {} points, ' - 'currently can only handle 1.'.format( - len(extra_dimcoord.points))) + raise ValueError( + "Implied dimension has {} points, " + "currently can only handle 1.".format(len(extra_dimcoord.points)) + ) association_entry = _make_grib1_cf_entry( table2_version=int(grib1data.t2version), centre_number=int(grib1data.centre), @@ -132,7 +158,8 @@ def _make_grib1_cf_entry(table2_version, centre_number, param_number, standard_name=cfdata.standard_name, long_name=cfdata.long_name, units=cfdata.units, - set_height=extra_dimcoord.points[0]) + set_height=extra_dimcoord.points[0], + ) if association_entry is not None: key, value = association_entry table[key] = value @@ -146,18 +173,20 @@ def _make_grib1_cf_entry(table2_version, centre_number, param_number, # Define a namedtuple for the keys of the Grib2 lookup table. Grib2CfKey = namedtuple( - 'Grib2CfKey', - ('param_discipline', 'param_category', 'param_number')) + "Grib2CfKey", ("param_discipline", "param_category", "param_number") +) # Create the grib2-to-cf lookup table. + def _make_grib2_to_cf_table(): - """ Build the Grib2 to CF phenomenon translation table. """ + """Build the Grib2 to CF phenomenon translation table.""" table = _LookupTable() - def _make_grib2_cf_entry(param_discipline, param_category, param_number, - standard_name, long_name, units): + def _make_grib2_cf_entry( + param_discipline, param_category, param_number, standard_name, long_name, units + ): """ Check data, convert types and make a _GRIB2_CF_TABLE key/value pair. @@ -166,20 +195,27 @@ def _make_grib2_cf_entry(param_discipline, param_category, param_number, e.g. "2-metre tempererature". """ - grib2_key = Grib2CfKey(param_discipline=int(param_discipline), - param_category=int(param_category), - param_number=int(param_number)) + grib2_key = Grib2CfKey( + param_discipline=int(param_discipline), + param_category=int(param_category), + param_number=int(param_number), + ) if standard_name is not None: if standard_name not in iris.std_names.STD_NAMES: - warnings.warn('{} is not a recognised CF standard name ' - '(skipping).'.format(standard_name)) + warnings.warn( + "{} is not a recognised CF standard name " "(skipping).".format( + standard_name + ) + ) return None # convert units string to iris Unit (i.e. mainly, check it is good) a_cf_unit = cf_units.Unit(units) - cf_data = Grib1CfData(standard_name=standard_name, - long_name=long_name, - units=a_cf_unit, - set_height=None) + cf_data = Grib1CfData( + standard_name=standard_name, + long_name=long_name, + units=a_cf_unit, + set_height=None, + ) return (grib2_key, cf_data) # Interpret the grib2 info from grib_cf_map @@ -191,7 +227,8 @@ def _make_grib2_cf_entry(param_discipline, param_category, param_number, param_number=grib2data.number, standard_name=cfdata.standard_name, long_name=cfdata.long_name, - units=cfdata.units) + units=cfdata.units, + ) if association_entry is not None: key, value = association_entry table[key] = value @@ -204,24 +241,21 @@ def _make_grib2_cf_entry(param_discipline, param_category, param_number, # Define namedtuples for key+values of the cf-to-grib2 lookup table. -CfGrib2Key = namedtuple( - 'CfGrib2Key', - ('standard_name', 'long_name')) +CfGrib2Key = namedtuple("CfGrib2Key", ("standard_name", "long_name")) -CfGrib2Data = namedtuple( - 'CfGrib2Data', - ('discipline', 'category', 'number', 'units')) +CfGrib2Data = namedtuple("CfGrib2Data", ("discipline", "category", "number", "units")) # Create the cf-to-grib2 lookup table. + def _make_cf_to_grib2_table(): - """ Build the Grib1 to CF phenomenon translation table. """ + """Build the Grib1 to CF phenomenon translation table.""" table = _LookupTable() - def _make_cf_grib2_entry(standard_name, long_name, - param_discipline, param_category, param_number, - units): + def _make_cf_grib2_entry( + standard_name, long_name, param_discipline, param_category, param_number, units + ): """ Check data, convert types and make a new _CF_TABLE key/value pair. @@ -230,16 +264,21 @@ def _make_cf_grib2_entry(standard_name, long_name, if standard_name is not None: long_name = None if standard_name not in iris.std_names.STD_NAMES: - warnings.warn('{} is not a recognised CF standard name ' - '(skipping).'.format(standard_name)) + warnings.warn( + "{} is not a recognised CF standard name " "(skipping).".format( + standard_name + ) + ) return None cf_key = CfGrib2Key(standard_name, long_name) # convert units string to iris Unit (i.e. mainly, check it is good) a_cf_unit = cf_units.Unit(units) - grib2_data = CfGrib2Data(discipline=int(param_discipline), - category=int(param_category), - number=int(param_number), - units=a_cf_unit) + grib2_data = CfGrib2Data( + discipline=int(param_discipline), + category=int(param_category), + number=int(param_number), + units=a_cf_unit, + ) return (cf_key, grib2_data) # Interpret the imported CF-to-Grib2 table into a lookup table @@ -252,7 +291,8 @@ def _make_cf_grib2_entry(standard_name, long_name, param_discipline=grib2data.discipline, param_category=grib2data.category, param_number=grib2data.number, - units=a_cf_unit) + units=a_cf_unit, + ) if association_entry is not None: key, value = association_entry table[key] = value @@ -265,6 +305,7 @@ def _make_cf_grib2_entry(standard_name, long_name, # Interface functions for translation lookup + def grib1_phenom_to_cf_info(table2_version, centre_number, param_number): """ Lookup grib-1 parameter --> cf_data or None. @@ -277,9 +318,11 @@ def grib1_phenom_to_cf_info(table2_version, centre_number, param_number): * set_height : a scalar 'height' value , or None """ - grib1_key = Grib1CfKey(table2_version=table2_version, - centre_number=centre_number, - param_number=param_number) + grib1_key = Grib1CfKey( + table2_version=table2_version, + centre_number=centre_number, + param_number=param_number, + ) return _GRIB1_CF_TABLE[grib1_key] @@ -294,9 +337,11 @@ def grib2_phenom_to_cf_info(param_discipline, param_category, param_number): * units : a :class:`cf_units.Unit` """ - grib2_key = Grib2CfKey(param_discipline=int(param_discipline), - param_category=int(param_category), - param_number=int(param_number)) + grib2_key = Grib2CfKey( + param_discipline=int(param_discipline), + param_category=int(param_category), + param_number=int(param_number), + ) return _GRIB2_CF_TABLE[grib2_key] @@ -318,8 +363,7 @@ def cf_phenom_to_grib2_info(standard_name, long_name=None): return _CF_GRIB2_TABLE[(standard_name, long_name)] -class GRIBCode(namedtuple('GRIBCode', - 'edition discipline category number')): +class GRIBCode(namedtuple("GRIBCode", "edition discipline category number")): """ An object representing a specific Grib phenomenon identity. @@ -330,33 +374,35 @@ class GRIBCode(namedtuple('GRIBCode', numbers in it. """ + __slots__ = () - def __new__(cls, edition_or_string, - discipline=None, category=None, number=None): + def __new__(cls, edition_or_string, discipline=None, category=None, number=None): args = (edition_or_string, discipline, category, number) nargs = sum(arg is not None for arg in args) if nargs == 1: # Single argument: convert to a string and extract 4 integers. # NOTE: this also allows input from a GRIBCode, or a plain tuple. edition_or_string = str(edition_or_string) - edition, discipline, category, number = \ - cls._fournums_from_gribcode_string(edition_or_string) + edition, discipline, category, number = cls._fournums_from_gribcode_string( + edition_or_string + ) elif nargs == 4: edition = edition_or_string edition, discipline, category, number = [ - int(arg) - for arg in (edition, discipline, category, number)] + int(arg) for arg in (edition, discipline, category, number) + ] else: - msg = ('Cannot create GRIBCode from {} arguments, ' - '"GRIBCode{!r}" : ' - 'expected either 1 or 4 non-None arguments.') + msg = ( + "Cannot create GRIBCode from {} arguments, " + '"GRIBCode{!r}" : ' + "expected either 1 or 4 non-None arguments." + ) raise ValueError(msg.format(nargs, args)) - return super(GRIBCode, cls).__new__( - cls, edition, discipline, category, number) + return super(GRIBCode, cls).__new__(cls, edition, discipline, category, number) - RE_PARSE_FOURNUMS = re.compile(4 * r'[^\d]*(\d*)') + RE_PARSE_FOURNUMS = re.compile(4 * r"[^\d]*(\d*)") @classmethod def _fournums_from_gribcode_string(cls, edcn_string): @@ -370,16 +416,19 @@ def _fournums_from_gribcode_string(cls, edcn_string): pass if not parsed_ok: - msg = ('Invalid argument for GRIBCode creation, ' - '"GRIBCode({!r})" : ' - 'requires 4 numbers, separated by non-numerals.') + msg = ( + "Invalid argument for GRIBCode creation, " + '"GRIBCode({!r})" : ' + "requires 4 numbers, separated by non-numerals." + ) raise ValueError(msg.format(edcn_string)) return nums - PRINT_FORMAT = 'GRIB{:1d}:d{:03d}c{:03d}n{:03d}' + PRINT_FORMAT = "GRIB{:1d}:d{:03d}c{:03d}n{:03d}" def __str__(self): result = self.PRINT_FORMAT.format( - self.edition, self.discipline, self.category, self.number) + self.edition, self.discipline, self.category, self.number + ) return result diff --git a/iris_grib/message.py b/iris_grib/message.py index 80a7f8b2..f416dd7f 100644 --- a/iris_grib/message.py +++ b/iris_grib/message.py @@ -21,10 +21,10 @@ # Alias names for eccodes spatial computed keys. KEY_ALIAS = { - 'latitude': 'latitudes', - 'longitude': 'longitudes', - 'latitudes': 'latitude', - 'longitudes': 'longitude', + "latitude": "latitudes", + "longitude": "longitudes", + "latitudes": "latitude", + "longitudes": "longitude", } @@ -33,6 +33,7 @@ class _OpenFileRef: A reference to an open file that ensures that the file is closed when the object is garbage collected. """ + def __init__(self, open_file): self.open_file = open_file @@ -61,13 +62,12 @@ def messages_from_filename(filename): Name of the file to generate fields from. """ - grib_fh = open(filename, 'rb') + grib_fh = open(filename, "rb") # create an _OpenFileRef to manage the closure of the file handle file_ref = _OpenFileRef(grib_fh) while True: - grib_id = eccodes.codes_new_from_file(grib_fh, - eccodes.CODES_PRODUCT_GRIB) + grib_id = eccodes.codes_new_from_file(grib_fh, eccodes.CODES_PRODUCT_GRIB) if grib_id is None: break offset = eccodes.codes_get_message_offset(grib_id) @@ -130,38 +130,46 @@ def data(self): """ sections = self.sections grid_section = sections[3] - if grid_section['sourceOfGridDefinition'] != 0: + if grid_section["sourceOfGridDefinition"] != 0: raise TranslationError( - 'Unsupported source of grid definition: {}'.format( - grid_section['sourceOfGridDefinition'])) + "Unsupported source of grid definition: {}".format( + grid_section["sourceOfGridDefinition"] + ) + ) - reduced = (grid_section['numberOfOctectsForNumberOfPoints'] != 0 or - grid_section['interpretationOfNumberOfPoints'] != 0) - template = grid_section['gridDefinitionTemplateNumber'] + reduced = ( + grid_section["numberOfOctectsForNumberOfPoints"] != 0 + or grid_section["interpretationOfNumberOfPoints"] != 0 + ) + template = grid_section["gridDefinitionTemplateNumber"] if reduced and template not in (40,): - raise TranslationError('Grid definition Section 3 contains ' - 'unsupported quasi-regular grid.') + raise TranslationError( + "Grid definition Section 3 contains " "unsupported quasi-regular grid." + ) if template in _SUPPORTED_GRID_DEFINITIONS: # We can ignore the first two bits (i-neg, j-pos) because # that is already captured in the coordinate values. - if grid_section['scanningMode'] & 0x3f: - msg = 'Unsupported scanning mode: {}'.format( - grid_section['scanningMode']) + if grid_section["scanningMode"] & 0x3F: + msg = "Unsupported scanning mode: {}".format( + grid_section["scanningMode"] + ) raise TranslationError(msg) if template in (20, 30, 90): - shape = (grid_section['Ny'], grid_section['Nx']) + shape = (grid_section["Ny"], grid_section["Nx"]) elif template == 140: - shape = (grid_section['numberOfPointsAlongYAxis'], - grid_section['numberOfPointsAlongXAxis']) + shape = ( + grid_section["numberOfPointsAlongYAxis"], + grid_section["numberOfPointsAlongXAxis"], + ) elif template == 40 and reduced: - shape = (grid_section['numberOfDataPoints'],) + shape = (grid_section["numberOfDataPoints"],) else: - shape = (grid_section['Nj'], grid_section['Ni']) - proxy = _DataProxy(shape, np.dtype('f8'), self._recreate_raw) + shape = (grid_section["Nj"], grid_section["Ni"]) + proxy = _DataProxy(shape, np.dtype("f8"), self._recreate_raw) data = as_lazy_data(proxy) else: - fmt = 'Grid definition template {} is not supported' + fmt = "Grid definition template {} is not supported" raise TranslationError(fmt.format(template)) return data @@ -175,7 +183,7 @@ def __getstate__(self): return self -class _MessageLocation(namedtuple('_MessageLocation', 'filename offset')): +class _MessageLocation(namedtuple("_MessageLocation", "filename offset")): """A reference to a specific GRIB message within a file.""" __slots__ = () @@ -187,7 +195,7 @@ def __call__(self): class _DataProxy: """A reference to the data payload of a single GRIB message.""" - __slots__ = ('shape', 'dtype', 'recreate_raw') + __slots__ = ("shape", "dtype", "recreate_raw") def __init__(self, shape, dtype, recreate_raw): self.shape = shape @@ -224,15 +232,18 @@ def _bitmap(self, bitmap_section): """ # Reference GRIB2 Code Table 6.0. - bitMapIndicator = bitmap_section['bitMapIndicator'] + bitMapIndicator = bitmap_section["bitMapIndicator"] if bitMapIndicator == 0: - bitmap = bitmap_section['bitmap'] + bitmap = bitmap_section["bitmap"] elif bitMapIndicator == 255: bitmap = None else: - msg = 'Bitmap Section 6 contains unsupported ' \ - 'bitmap indicator [{}]'.format(bitMapIndicator) + msg = ( + "Bitmap Section 6 contains unsupported " "bitmap indicator [{}]".format( + bitMapIndicator + ) + ) raise TranslationError(msg) return bitmap @@ -269,10 +280,11 @@ def __getitem__(self, keys): _data[bitmap.astype(bool)] = data # `ma.masked_array` masks where input = 1, the opposite of # the behaviour specified by the GRIB spec. - data = ma.masked_array(_data, mask=np.logical_not(bitmap), - fill_value=np.nan) + data = ma.masked_array( + _data, mask=np.logical_not(bitmap), fill_value=np.nan + ) else: - msg = 'Shapes of data and bitmap do not match.' + msg = "Shapes of data and bitmap do not match." raise TranslationError(msg) data = data.reshape(self.shape) @@ -281,8 +293,10 @@ def __getitem__(self, keys): return result def __repr__(self): - msg = '<{self.__class__.__name__} shape={self.shape} ' \ - 'dtype={self.dtype!r} recreate_raw={self.recreate_raw!r} ' + msg = ( + "<{self.__class__.__name__} shape={self.shape} " + "dtype={self.dtype!r} recreate_raw={self.recreate_raw!r} " + ) return msg.format(self=self) def __getstate__(self): @@ -299,17 +313,16 @@ class _RawGribMessage: of the input GRIB message. """ - _NEW_SECTION_KEY_MATCHER = re.compile(r'section([0-9]{1})Length') + + _NEW_SECTION_KEY_MATCHER = re.compile(r"section([0-9]{1})Length") @staticmethod def from_file_offset(filename, offset): - with open(filename, 'rb') as f: + with open(filename, "rb") as f: f.seek(offset) - message_id = eccodes.codes_new_from_file( - f, eccodes.CODES_PRODUCT_GRIB - ) + message_id = eccodes.codes_new_from_file(f, eccodes.CODES_PRODUCT_GRIB) if message_id is None: - fmt = 'Invalid GRIB message: {} @ {}' + fmt = "Invalid GRIB message: {} @ {}" raise RuntimeError(fmt.format(filename, offset)) return _RawGribMessage(message_id) @@ -384,11 +397,10 @@ def _get_message_sections(self): key_match = re.match(self._NEW_SECTION_KEY_MATCHER, key_name) if key_match is not None: new_section = int(key_match.group(1)) - elif key_name == '7777': + elif key_name == "7777": new_section = 8 if section != new_section: - sections[section] = Section(self._message_id, section, - section_keys) + sections[section] = Section(self._message_id, section, section_keys) section_keys = [] section = new_section section_keys.append(key_name) @@ -405,6 +417,7 @@ class Section: write to the file. """ + # Keys are read from the file as required and values are cached. # Within GribMessage instances all keys will have been fetched @@ -417,14 +430,13 @@ def __init__(self, message_id, number, keys): def __repr__(self): items = [] for key in self._keys: - value = self._cache.get(key, '?') - items.append('{}={}'.format(key, value)) - return '<{} {}: {}>'.format(type(self).__name__, self._number, - ', '.join(items)) + value = self._cache.get(key, "?") + items.append("{}={}".format(key, value)) + return "<{} {}: {}>".format(type(self).__name__, self._number, ", ".join(items)) def __getitem__(self, key): if key not in self._cache: - if key == 'numberOfSection': + if key == "numberOfSection": value = self._number else: if key not in self._keys: @@ -445,8 +457,9 @@ def __setitem__(self, key, value): if key in self._cache: self._cache[key] = value else: - raise KeyError('{!r} cannot be redefined in ' - 'section {}'.format(key, self._number)) + raise KeyError( + "{!r} cannot be redefined in " "section {}".format(key, self._number) + ) def _get_key_value(self, key): """ @@ -461,20 +474,27 @@ def _get_key_value(self, key): message. """ - vector_keys = ('codedValues', 'pv', 'satelliteSeries', - 'satelliteNumber', 'instrumentType', - 'scaleFactorOfCentralWaveNumber', - 'scaledValueOfCentralWaveNumber', - 'longitude', 'latitude', - 'longitudes', 'latitudes') + vector_keys = ( + "codedValues", + "pv", + "satelliteSeries", + "satelliteNumber", + "instrumentType", + "scaleFactorOfCentralWaveNumber", + "scaledValueOfCentralWaveNumber", + "longitude", + "latitude", + "longitudes", + "latitudes", + ) if key in vector_keys: res = eccodes.codes_get_array(self._message_id, key) - elif key == 'bitmap': + elif key == "bitmap": # The bitmap is stored as contiguous boolean bits, one bit for each # data point. ecCodes returns these as strings, so it must be # type-cast to return an array of ints (0, 1). res = eccodes.codes_get_array(self._message_id, key, int) - elif key in ('typeOfFirstFixedSurface', 'typeOfSecondFixedSurface'): + elif key in ("typeOfFirstFixedSurface", "typeOfSecondFixedSurface"): # By default these values are returned as unhelpful strings but # we can use int representation to compare against instead. res = self._get_value_or_missing(key, use_int=True) @@ -496,7 +516,7 @@ def get_computed_key(self, key): message. """ - vector_keys = ('longitudes', 'latitudes', 'distinctLatitudes') + vector_keys = ("longitudes", "latitudes", "distinctLatitudes") if key in vector_keys: res = eccodes.codes_get_array(self._message_id, key) else: diff --git a/iris_grib/tests/__init__.py b/iris_grib/tests/__init__.py index b33d72c8..197ff1b8 100644 --- a/iris_grib/tests/__init__.py +++ b/iris_grib/tests/__init__.py @@ -30,10 +30,10 @@ #: Basepath for iris-grib test results. -_RESULT_PATH = os.path.join(os.path.dirname(__file__), 'results') +_RESULT_PATH = os.path.join(os.path.dirname(__file__), "results") #: Basepath for iris-grib loadable test files. -_TESTDATA_PATH = os.path.join(os.path.dirname(__file__), 'testdata') +_TESTDATA_PATH = os.path.join(os.path.dirname(__file__), "testdata") override = os.environ.get("GRIB_TEST_DATA_PATH") if override: @@ -57,9 +57,7 @@ class MyDataTests(tests.IrisGribTest): no_data = not os.path.isdir(dpath) or os.environ.get(evar) reason = "Test(s) require missing external GRIB test data." - skip = unittest.skipIf( - condition=no_data, reason=reason - ) + skip = unittest.skipIf(condition=no_data, reason=reason) return skip(fn) @@ -79,7 +77,7 @@ def get_result_path(relative_path): relative_path = os.path.join(*relative_path) return os.path.abspath(os.path.join(_RESULT_PATH, relative_path)) - def result_path(self, basename=None, ext=''): + def result_path(self, basename=None, ext=""): """ Return the full path to a test result, generated from the \ calling file, class and, optionally, method. @@ -91,27 +89,29 @@ def result_path(self, basename=None, ext=''): * ext - Appended file extension. """ - if ext and not ext.startswith('.'): - ext = '.' + ext + if ext and not ext.startswith("."): + ext = "." + ext # Generate the folder name from the calling file name. path = os.path.abspath(inspect.getfile(self.__class__)) path = os.path.splitext(path)[0] - sub_path = path.rsplit('iris_grib', 1)[1].split('tests', 1)[1][1:] + sub_path = path.rsplit("iris_grib", 1)[1].split("tests", 1)[1][1:] # Generate the file name from the calling function name? if basename is None: stack = inspect.stack() for frame in stack[1:]: - if 'test_' in frame[3]: - basename = frame[3].replace('test_', '') + if "test_" in frame[3]: + basename = frame[3].replace("test_", "") break filename = basename + ext - result = os.path.join(self.get_result_path(''), - sub_path.replace('test_', ''), - self.__class__.__name__.replace('Test_', ''), - filename) + result = os.path.join( + self.get_result_path(""), + sub_path.replace("test_", ""), + self.__class__.__name__.replace("Test_", ""), + filename, + ) return result @staticmethod @@ -173,9 +173,7 @@ def assertGribMessageDifference( m2_sect = set(m2.sections.keys()) for missing_section in m1_sect ^ m2_sect: - what = ( - "introduced" if missing_section in m1_sect else "removed" - ) + what = "introduced" if missing_section in m1_sect else "removed" # Assert that an introduced section is in the diffs. self.assertIn( missing_section, @@ -211,9 +209,7 @@ def assertGribMessageDifference( if isinstance(m1_value, np.ndarray): # A large tolerance appears to be required for # gribapi 1.12, but not for 1.14. - self.assertArrayAlmostEqual( - m1_value, m2_value, decimal=2 - ) + self.assertArrayAlmostEqual(m1_value, m2_value, decimal=2) else: self.assertEqual( m1_value, diff --git a/iris_grib/tests/integration/format_interop/test_name_grib.py b/iris_grib/tests/integration/format_interop/test_name_grib.py index eb5366c4..16f50a59 100644 --- a/iris_grib/tests/integration/format_interop/test_name_grib.py +++ b/iris_grib/tests/integration/format_interop/test_name_grib.py @@ -28,7 +28,7 @@ def name_cb(cube, field, filename): if z_coord: z_coord[0].standard_name = "height" z_coord[0].long_name = "height above ground level" - z_coord[0].attributes = {'positive': 'up'} + z_coord[0].attributes = {"positive": "up"} class TestNameToGRIB(tests.IrisGribTest): @@ -73,8 +73,8 @@ def test_name2_field(self): # Iris>=3.2 loads in an extra 'z' coordinate which cannot currently # be save to GRIB. - if name_cube.coords('z'): - name_cube.remove_coord('z') + if name_cube.coords("z"): + name_cube.remove_coord("z") with self.temp_filename(".grib2") as temp_filename: iris.save(name_cube, temp_filename) @@ -99,8 +99,8 @@ def test_name3_field(self): for i, name_cube in enumerate(name_cubes): # Iris>=3.2 loads in an extra 'z' coordinate which cannot currently # be save to GRIB. - if name_cube.coord('z') is not None: - name_cube.remove_coord('z') + if name_cube.coord("z") is not None: + name_cube.remove_coord("z") with self.temp_filename(".grib2") as temp_filename: iris.save(name_cube, temp_filename) diff --git a/iris_grib/tests/integration/format_interop/test_pp_grib.py b/iris_grib/tests/integration/format_interop/test_pp_grib.py index a4e031f4..f5b9b2fe 100644 --- a/iris_grib/tests/integration/format_interop/test_pp_grib.py +++ b/iris_grib/tests/integration/format_interop/test_pp_grib.py @@ -14,14 +14,10 @@ class TestBoundedTime(tests.IrisTest): @tests.skip_data def test_time_and_forecast_period_round_trip(self): - pp_path = tests.get_data_path( - ("PP", "meanMaxMin", "200806081200__qwpb.T24.pp") - ) + pp_path = tests.get_data_path(("PP", "meanMaxMin", "200806081200__qwpb.T24.pp")) # Choose the first time-bounded Cube in the PP dataset. original = [ - cube - for cube in iris.load(pp_path) - if cube.coord("time").has_bounds() + cube for cube in iris.load(pp_path) if cube.coord("time").has_bounds() ][0] # Save it to GRIB2 and re-load. with self.temp_filename(".grib2") as grib_path: diff --git a/iris_grib/tests/integration/load_convert/test_data_section.py b/iris_grib/tests/integration/load_convert/test_data_section.py index 6c4aca1e..8e5e7431 100644 --- a/iris_grib/tests/integration/load_convert/test_data_section.py +++ b/iris_grib/tests/integration/load_convert/test_data_section.py @@ -19,9 +19,7 @@ class TestImport(tests.IrisGribTest): def test_gdt1(self): - path = tests.get_data_path( - ("GRIB", "rotated_nae_t", "sensible_pole.grib2") - ) + path = tests.get_data_path(("GRIB", "rotated_nae_t", "sensible_pole.grib2")) cube = load_cube(path) self.assertCMLApproxData(cube) @@ -62,9 +60,7 @@ def test_reduced(self): class TestDRT3(tests.IrisGribTest): def test_grid_complex_spatial_differencing(self): - path = tests.get_data_path( - ("GRIB", "missing_values", "missing_values.grib2") - ) + path = tests.get_data_path(("GRIB", "missing_values", "missing_values.grib2")) cube = load_cube(path) self.assertCMLApproxData(cube) @@ -84,5 +80,5 @@ def test_data_representation__no_bitsPerValue(self): self.assertEqual(0, np.sum(cube.data)) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py b/iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py index 184b618c..af267b16 100644 --- a/iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py +++ b/iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py @@ -19,65 +19,70 @@ @tests.skip_grib_data class TestHybridHeight(tests.IrisGribTest): def setUp(self): - filepath = self.get_testdata_path('faked_sample_hh_grib_data.grib2') - self.testdata_cube = load_cube(filepath, 'air_temperature') + filepath = self.get_testdata_path("faked_sample_hh_grib_data.grib2") + self.testdata_cube = load_cube(filepath, "air_temperature") def test_load_hybrid_height(self): # Check that it loads right, and creates a factory. - self.assertIsInstance(self.testdata_cube.aux_factories[0], - HybridHeightFactory) + self.assertIsInstance(self.testdata_cube.aux_factories[0], HybridHeightFactory) def test_hybrid_height_coords_values(self): cube = self.testdata_cube # check actual model level values. - self.assertArrayEqual(cube.coord('model_level_number').points, - [1, 11, 21]) + self.assertArrayEqual(cube.coord("model_level_number").points, [1, 11, 21]) # check sigma values correctly loaded from indices 1, 11, 21. - self.assertArrayAllClose(cube.coord('sigma').points, - [0.998, 0.894, 0.667], - atol=0.001) + self.assertArrayAllClose( + cube.coord("sigma").points, [0.998, 0.894, 0.667], atol=0.001 + ) # check height values too. - self.assertArrayAllClose(cube.coord('level_height').points, - [20., 953.3, 3220.], - atol=0.5) + self.assertArrayAllClose( + cube.coord("level_height").points, [20.0, 953.3, 3220.0], atol=0.5 + ) @tests.skip_grib_data class TestHybridPressure(tests.IrisGribTest): def setUp(self): - filepath = self.get_testdata_path('faked_sample_hp_grib_data.grib2') - self.testdata_cube = load_cube(filepath, 'air_temperature') + filepath = self.get_testdata_path("faked_sample_hp_grib_data.grib2") + self.testdata_cube = load_cube(filepath, "air_temperature") def test_load_hybrid_pressure(self): # Check that it loads right, and creates a factory. - self.assertIsInstance(self.testdata_cube.aux_factories[0], - HybridPressureFactory) + self.assertIsInstance( + self.testdata_cube.aux_factories[0], HybridPressureFactory + ) def test_hybrid_pressure_coords_values(self): cube = self.testdata_cube # Check existence, and some values, of the loaded coefficients. - self.assertArrayEqual(cube.coord('model_level_number').points, - [1, 51, 91]) - self.assertArrayAllClose(cube.coord('sigma').points, - [0., 0.045, 1.], atol=0.001) - self.assertArrayAllClose(cube.coord('level_pressure').points, - [2.00004, 18716.9688, 0.], rtol=0.0001) + self.assertArrayEqual(cube.coord("model_level_number").points, [1, 51, 91]) + self.assertArrayAllClose( + cube.coord("sigma").points, [0.0, 0.045, 1.0], atol=0.001 + ) + self.assertArrayAllClose( + cube.coord("level_pressure").points, [2.00004, 18716.9688, 0.0], rtol=0.0001 + ) self.assertArrayAllClose( - cube.coord('surface_air_pressure')[:2, :3].points, - [[103493.8, 103493.8, 103493.8], - [103401.0, 103407.4, 103412.2]], atol=0.1) + cube.coord("surface_air_pressure")[:2, :3].points, + [[103493.8, 103493.8, 103493.8], [103401.0, 103407.4, 103412.2]], + atol=0.1, + ) # Also check a few values from the derived coord. self.assertArrayAllClose( - cube.coord('air_pressure')[:, :3, 0].points, - [[2., 2., 2.], - [23389.3, 23385.1, 23379.9], - [103493.8, 103401.0, 103285.8]], atol=0.1) + cube.coord("air_pressure")[:, :3, 0].points, + [ + [2.0, 2.0, 2.0], + [23389.3, 23385.1, 23379.9], + [103493.8, 103401.0, 103285.8], + ], + atol=0.1, + ) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/integration/load_convert/test_product_definition_section.py b/iris_grib/tests/integration/load_convert/test_product_definition_section.py index b7a81b03..a9431db2 100644 --- a/iris_grib/tests/integration/load_convert/test_product_definition_section.py +++ b/iris_grib/tests/integration/load_convert/test_product_definition_section.py @@ -18,9 +18,7 @@ class TestPDT8(tests.IrisGribTest): def setUp(self): # Load from the test file. - file_path = tests.get_data_path( - ("GRIB", "time_processed", "time_bound.grib2") - ) + file_path = tests.get_data_path(("GRIB", "time_processed", "time_bound.grib2")) self.cube = load_cube(file_path) def test_coords(self): @@ -61,9 +59,7 @@ def test_cell_method(self): self.assertEqual( len(cell_methods), 1, - "result has {} cell methods, expected one.".format( - len(cell_methods) - ), + "result has {} cell methods, expected one.".format(len(cell_methods)), ) (cell_method,) = cell_methods self.assertEqual(cell_method.coord_names, ("time",)) diff --git a/iris_grib/tests/integration/load_convert/test_sample_file_loads.py b/iris_grib/tests/integration/load_convert/test_sample_file_loads.py index 3f07082b..aeb5526e 100644 --- a/iris_grib/tests/integration/load_convert/test_sample_file_loads.py +++ b/iris_grib/tests/integration/load_convert/test_sample_file_loads.py @@ -40,9 +40,7 @@ def test_load_time_processed(self): self.assertCML(cubes, _RESULTDIR_PREFIX + ("time_bound_grib2.cml",)) def test_load_3_layer(self): - cubes = iris.load( - tests.get_data_path(("GRIB", "3_layer_viz", "3_layer.grib2")) - ) + cubes = iris.load(tests.get_data_path(("GRIB", "3_layer_viz", "3_layer.grib2"))) cubes = iris.cube.CubeList([cubes[1], cubes[0], cubes[2]]) self.assertCML(cubes, _RESULTDIR_PREFIX + ("3_layer.cml",)) @@ -51,8 +49,7 @@ def test_load_masked(self): ("GRIB", "missing_values", "missing_values.grib2") ) cubes = iris.load(gribfile) - self.assertCML(cubes, - _RESULTDIR_PREFIX + ("missing_values_grib2.cml",)) + self.assertCML(cubes, _RESULTDIR_PREFIX + ("missing_values_grib2.cml",)) def test_polar_stereo_grib1(self): cube = iris.load_cube( @@ -86,15 +83,11 @@ def test_polar_stereo_grib2_grid_definition(self): self.assertEqual(pyc.coord_system.true_scale_lat, 60.0) def test_lambert_grib1(self): - cube = iris.load_cube( - tests.get_data_path(("GRIB", "lambert", "lambert.grib1")) - ) + cube = iris.load_cube(tests.get_data_path(("GRIB", "lambert", "lambert.grib1"))) self.assertCML(cube, _RESULTDIR_PREFIX + ("lambert_grib1.cml",)) def test_lambert_grib2(self): - cube = iris.load_cube( - tests.get_data_path(("GRIB", "lambert", "lambert.grib2")) - ) + cube = iris.load_cube(tests.get_data_path(("GRIB", "lambert", "lambert.grib2"))) self.assertCML(cube, _RESULTDIR_PREFIX + ("lambert_grib2.cml",)) def test_regular_gg_grib1(self): diff --git a/iris_grib/tests/integration/round_trip/test_WAFC_mapping_round_trip.py b/iris_grib/tests/integration/round_trip/test_WAFC_mapping_round_trip.py index ac76c89c..b106474b 100644 --- a/iris_grib/tests/integration/round_trip/test_WAFC_mapping_round_trip.py +++ b/iris_grib/tests/integration/round_trip/test_WAFC_mapping_round_trip.py @@ -19,18 +19,18 @@ @tests.skip_grib_data class TestWAFCCodes(tests.IrisGribTest): def setUp(self): - self.cat = self.get_testdata_path('CAT_T+24_0600.grib2') - self.cb = self.get_testdata_path('CB_T+24_0600.grib2') - self.icing = self.get_testdata_path('ICING_T+24_0600.grib2') - self.turb = self.get_testdata_path('INCLDTURB_T+24_0600.grib2') + self.cat = self.get_testdata_path("CAT_T+24_0600.grib2") + self.cb = self.get_testdata_path("CB_T+24_0600.grib2") + self.icing = self.get_testdata_path("ICING_T+24_0600.grib2") + self.turb = self.get_testdata_path("INCLDTURB_T+24_0600.grib2") def test_WAFC_CAT_round_trip(self): - cubelist = load(self.cat, 'WAFC_CAT_potential') + cubelist = load(self.cat, "WAFC_CAT_potential") cube = cubelist[0] self.assertIsInstance(cube, Cube) with self.temp_filename() as tmp_save_path: - save(cube, tmp_save_path, saver='grib2') + save(cube, tmp_save_path, saver="grib2") saved_cube = load_cube(tmp_save_path) self.assertEqual(saved_cube.metadata, cube.metadata) @@ -40,7 +40,7 @@ def test_WAFC_CB_round_trip(self): self.assertIsInstance(cube, Cube) with self.temp_filename() as tmp_save_path: - save(cube, tmp_save_path, saver='grib2') + save(cube, tmp_save_path, saver="grib2") saved_cube = load_cube(tmp_save_path) self.assertEqual(saved_cube.metadata, cube.metadata) @@ -50,7 +50,7 @@ def test_WAFC_icing_round_trip(self): self.assertIsInstance(cube, Cube) with self.temp_filename() as tmp_save_path: - save(cube, tmp_save_path, saver='grib2') + save(cube, tmp_save_path, saver="grib2") saved_cube = load_cube(tmp_save_path) self.assertEqual(saved_cube.metadata, cube.metadata) @@ -60,10 +60,10 @@ def test_WAFC_turb_round_trip(self): self.assertIsInstance(cube, Cube) with self.temp_filename() as tmp_save_path: - save(cube, tmp_save_path, saver='grib2') + save(cube, tmp_save_path, saver="grib2") saved_cube = load_cube(tmp_save_path) self.assertEqual(saved_cube.metadata, cube.metadata) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/integration/round_trip/test_grid_definition_section.py b/iris_grib/tests/integration/round_trip/test_grid_definition_section.py index 06cfd342..8988a7de 100644 --- a/iris_grib/tests/integration/round_trip/test_grid_definition_section.py +++ b/iris_grib/tests/integration/round_trip/test_grid_definition_section.py @@ -72,9 +72,7 @@ def test_save_load(self): # Check those re-loaded properties which should match the original. for test_cube in (cube, cube_loaded_from_saved): - self.assertEqual( - test_cube.standard_name, "air_pressure_at_sea_level" - ) + self.assertEqual(test_cube.standard_name, "air_pressure_at_sea_level") self.assertEqual(test_cube.units, "Pa") self.assertEqual(test_cube.shape, (928, 744)) self.assertEqual(test_cube.cell_methods, ()) @@ -90,9 +88,7 @@ def test_save_load(self): # Check they have all the same coordinates. co_names = [coord.name() for coord in cube.coords()] - co_names_reload = [ - coord.name() for coord in cube_loaded_from_saved.coords() - ] + co_names_reload = [coord.name() for coord in cube_loaded_from_saved.coords()] self.assertEqual(sorted(co_names_reload), sorted(co_names)) # Check all the coordinates. @@ -105,16 +101,13 @@ def test_save_load(self): self.assertEqual( co_load.shape, co_orig.shape, - 'Shape of re-loaded "{}" coord is {} ' - "instead of {}".format( + 'Shape of re-loaded "{}" coord is {} ' "instead of {}".format( coord_name, co_load.shape, co_orig.shape ), ) # Check coordinate points equal, within a tolerance. - self.assertArrayAllClose( - co_load.points, co_orig.points, rtol=1.0e-6 - ) + self.assertArrayAllClose(co_load.points, co_orig.points, rtol=1.0e-6) # Check all coords are unbounded. # (NOTE: this is not so for the original X and Y coordinates, @@ -124,9 +117,7 @@ def test_save_load(self): except AssertionError as err: self.assertTrue( False, - 'Failed on coordinate "{}" : {}'.format( - coord_name, str(err) - ), + 'Failed on coordinate "{}" : {}'.format(coord_name, str(err)), ) # Check that main data array also matches. diff --git a/iris_grib/tests/integration/round_trip/test_hybrid_coords_round_trip.py b/iris_grib/tests/integration/round_trip/test_hybrid_coords_round_trip.py index 578eaee7..25dc38c7 100644 --- a/iris_grib/tests/integration/round_trip/test_hybrid_coords_round_trip.py +++ b/iris_grib/tests/integration/round_trip/test_hybrid_coords_round_trip.py @@ -13,6 +13,7 @@ import iris_grib.tests as tests from iris import load_cube, load_cubes, save + # Try except allows compatibility with current Iris (2.4) and also master. # TODO: simplify to just the iris.util import once we drop support for any # Iris versions with iris.experimental.equalise_cubes import @@ -25,38 +26,34 @@ @tests.skip_grib_data class TestHybridHeightRoundTrip(tests.IrisGribTest): def test_hh_round_trip(self): - filepath = self.get_testdata_path( - 'faked_sample_hh_grib_data.grib2') + filepath = self.get_testdata_path("faked_sample_hh_grib_data.grib2") # Load and save temperature cube and reference (orography) cube # separately because this is the only way to save the hybrid height # coordinate. - cube, ref_cube = load_cubes(filepath, - ('air_temperature', 'surface_altitude')) + cube, ref_cube = load_cubes(filepath, ("air_temperature", "surface_altitude")) with self.temp_filename() as tmp_save_path: - save([cube, ref_cube], tmp_save_path, saver='grib2') + save([cube, ref_cube], tmp_save_path, saver="grib2") # Only need to reload temperature cube to compare with unsaved # temperature cube. - saved_cube = load_cube(tmp_save_path, 'air_temperature') + saved_cube = load_cube(tmp_save_path, "air_temperature") self.assertTrue(saved_cube == cube) @tests.skip_grib_data class TestHybridPressureRoundTrip(tests.IrisGribTest): def test_hybrid_pressure(self): - filepath = self.get_testdata_path( - 'faked_sample_hp_grib_data.grib2') + filepath = self.get_testdata_path("faked_sample_hp_grib_data.grib2") # Load and save temperature cube and reference (air_pressure at # surface) cube separately because this is the only way to save the # hybrid pressure coordinate. - cube, ref_cube = load_cubes(filepath, - ('air_temperature', 'air_pressure')) + cube, ref_cube = load_cubes(filepath, ("air_temperature", "air_pressure")) with self.temp_filename() as tmp_save_path: - save([cube, ref_cube], tmp_save_path, saver='grib2') + save([cube, ref_cube], tmp_save_path, saver="grib2") # Only need to reload temperature cube to compare with unsaved # temperature cube. - saved_cube = load_cube(tmp_save_path, 'air_temperature') + saved_cube = load_cube(tmp_save_path, "air_temperature") # Currently all attributes are lost when saving to grib, so we must # equalise them in order to successfully compare all other aspects. @@ -65,5 +62,5 @@ def test_hybrid_pressure(self): self.assertTrue(saved_cube == cube) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/integration/round_trip/test_product_definition_section.py b/iris_grib/tests/integration/round_trip/test_product_definition_section.py index 0b33fdc5..e5f28fb1 100644 --- a/iris_grib/tests/integration/round_trip/test_product_definition_section.py +++ b/iris_grib/tests/integration/round_trip/test_product_definition_section.py @@ -35,9 +35,7 @@ def test_perturbation(self): cube.coord("longitude").coord_system = crs # add a realization coordinate cube.add_aux_coord( - iris.coords.DimCoord( - points=1, standard_name="realization", units="1" - ) + iris.coords.DimCoord(points=1, standard_name="realization", units="1") ) with self.temp_filename("testPDT11.GRIB2") as temp_file_path: iris.save(cube, temp_file_path) @@ -62,8 +60,7 @@ def test_save_load(self): tcoord = iris.coords.DimCoord( 23, "time", units=Unit("days since epoch", calendar="standard") ) - fpcoord = iris.coords.DimCoord(24, "forecast_period", - units=Unit("hours")) + fpcoord = iris.coords.DimCoord(24, "forecast_period", units=Unit("hours")) cube.add_aux_coord(tcoord) cube.add_aux_coord(fpcoord) cube.attributes["WMO_constituent_type"] = 0 diff --git a/iris_grib/tests/integration/save_rules/test_grib_save.py b/iris_grib/tests/integration/save_rules/test_grib_save.py index 0d5f7c90..875c2ecf 100644 --- a/iris_grib/tests/integration/save_rules/test_grib_save.py +++ b/iris_grib/tests/integration/save_rules/test_grib_save.py @@ -144,9 +144,7 @@ def test_irregular(self): lat_coord = cube.coord("latitude") cube.remove_coord("latitude") - new_lats = np.append( - lat_coord.points[:-1], lat_coord.points[0] - ) # Irregular + new_lats = np.append(lat_coord.points[:-1], lat_coord.points[0]) # Irregular cube.add_aux_coord( iris.coords.AuxCoord( new_lats, @@ -158,18 +156,14 @@ def test_irregular(self): ) saved_grib = iris.util.create_temp_filename(suffix=".grib2") - self.assertRaises( - iris.exceptions.TranslationError, iris.save, cube, saved_grib - ) + self.assertRaises(iris.exceptions.TranslationError, iris.save, cube, saved_grib) os.remove(saved_grib) def test_non_latlon(self): cube = self._load_basic() cube.coord(dimensions=[0]).coord_system = None saved_grib = iris.util.create_temp_filename(suffix=".grib2") - self.assertRaises( - iris.exceptions.TranslationError, iris.save, cube, saved_grib - ) + self.assertRaises(iris.exceptions.TranslationError, iris.save, cube, saved_grib) os.remove(saved_grib) def test_forecast_period(self): @@ -177,9 +171,7 @@ def test_forecast_period(self): cube = self._load_basic() cube.coord("forecast_period").units = cf_units.Unit("years") saved_grib = iris.util.create_temp_filename(suffix=".grib2") - self.assertRaises( - iris.exceptions.TranslationError, iris.save, cube, saved_grib - ) + self.assertRaises(iris.exceptions.TranslationError, iris.save, cube, saved_grib) os.remove(saved_grib) def test_unhandled_vertical(self): @@ -204,25 +196,17 @@ def test_scalar_int32_pressure(self): iris.save(cube, testfile) def test_bounded_level(self): - cube = iris.load_cube( - tests.get_data_path(("GRIB", "uk_t", "uk_t.grib2")) - ) + cube = iris.load_cube(tests.get_data_path(("GRIB", "uk_t", "uk_t.grib2"))) with self.temp_filename(".grib2") as testfile: iris.save(cube, testfile) with open(testfile, "rb") as saved_file: - g = eccodes.codes_new_from_file( - saved_file, eccodes.CODES_PRODUCT_GRIB - ) + g = eccodes.codes_new_from_file(saved_file, eccodes.CODES_PRODUCT_GRIB) self.assertEqual( - eccodes.codes_get_double( - g, "scaledValueOfFirstFixedSurface" - ), + eccodes.codes_get_double(g, "scaledValueOfFirstFixedSurface"), 0.0, ) self.assertEqual( - eccodes.codes_get_double( - g, "scaledValueOfSecondFixedSurface" - ), + eccodes.codes_get_double(g, "scaledValueOfSecondFixedSurface"), 2147483647.0, ) @@ -259,9 +243,7 @@ def _lat_lon_cube_no_time(self): def _cube_time_no_forecast(self): cube = self._lat_lon_cube_no_time() - unit = cf_units.Unit( - "hours since epoch", calendar=cf_units.CALENDAR_GREGORIAN - ) + unit = cf_units.Unit("hours since epoch", calendar=cf_units.CALENDAR_GREGORIAN) dt = datetime.datetime(2010, 12, 31, 12, 0) cube.add_aux_coord( iris.coords.AuxCoord( @@ -296,17 +278,13 @@ def _cube_with_time_bounds(self): def test_no_time_cube(self): cube = self._lat_lon_cube_no_time() saved_grib = iris.util.create_temp_filename(suffix=".grib2") - self.assertRaises( - iris.exceptions.TranslationError, iris.save, cube, saved_grib - ) + self.assertRaises(iris.exceptions.TranslationError, iris.save, cube, saved_grib) os.remove(saved_grib) def test_cube_with_time_bounds(self): cube = self._cube_with_time_bounds() saved_grib = iris.util.create_temp_filename(suffix=".grib2") - self.assertRaises( - iris.exceptions.TranslationError, iris.save, cube, saved_grib - ) + self.assertRaises(iris.exceptions.TranslationError, iris.save, cube, saved_grib) os.remove(saved_grib) diff --git a/iris_grib/tests/integration/save_rules/test_grid_definition_section.py b/iris_grib/tests/integration/save_rules/test_grid_definition_section.py index 46512831..b7b0f3bc 100644 --- a/iris_grib/tests/integration/save_rules/test_grid_definition_section.py +++ b/iris_grib/tests/integration/save_rules/test_grid_definition_section.py @@ -12,13 +12,15 @@ # importing anything else. import iris_grib.tests as tests -from iris.coord_systems import (GeogCS, - RotatedGeogCS, - Mercator, - TransverseMercator, - LambertConformal, - AlbersEqualArea, - LambertAzimuthalEqualArea) +from iris.coord_systems import ( + GeogCS, + RotatedGeogCS, + Mercator, + TransverseMercator, + LambertConformal, + AlbersEqualArea, + LambertAzimuthalEqualArea, +) import numpy as np from iris_grib._save_rules import grid_definition_section @@ -34,92 +36,92 @@ def test_grid_definition_template_0(self): # Regular lat/lon (Plate Carree). x_points = np.arange(3) y_points = np.arange(3) - coord_units = 'degrees' + coord_units = "degrees" cs = self.ellipsoid test_cube = self._make_test_cube(cs, x_points, y_points, coord_units) grid_definition_section(test_cube, self.mock_grib) - self._check_key('gridDefinitionTemplateNumber', 0) + self._check_key("gridDefinitionTemplateNumber", 0) def test_grid_definition_template_1(self): # Rotated lat/lon (Plate Carree). x_points = np.arange(3) y_points = np.arange(3) - coord_units = 'degrees' + coord_units = "degrees" cs = RotatedGeogCS(34.0, 117.0, ellipsoid=self.ellipsoid) test_cube = self._make_test_cube(cs, x_points, y_points, coord_units) grid_definition_section(test_cube, self.mock_grib) - self._check_key('gridDefinitionTemplateNumber', 1) + self._check_key("gridDefinitionTemplateNumber", 1) def test_grid_definition_template_4(self): # Irregular (variable resolution) lat/lon grid. x_points = np.array([0, 2, 7]) y_points = np.array([1, 3, 6]) - coord_units = '1' + coord_units = "1" cs = self.ellipsoid test_cube = self._make_test_cube(cs, x_points, y_points, coord_units) grid_definition_section(test_cube, self.mock_grib) - self._check_key('gridDefinitionTemplateNumber', 4) + self._check_key("gridDefinitionTemplateNumber", 4) def test_grid_definition_template_5(self): # Irregular (variable resolution) rotated lat/lon grid. x_points = np.array([0, 2, 7]) y_points = np.array([1, 3, 6]) - coord_units = '1' + coord_units = "1" cs = RotatedGeogCS(34.0, 117.0, ellipsoid=self.ellipsoid) test_cube = self._make_test_cube(cs, x_points, y_points, coord_units) grid_definition_section(test_cube, self.mock_grib) - self._check_key('gridDefinitionTemplateNumber', 5) + self._check_key("gridDefinitionTemplateNumber", 5) def test_grid_definition_template_10(self): # Mercator grid. x_points = np.arange(3) y_points = np.arange(3) - coord_units = 'm' + coord_units = "m" cs = Mercator(ellipsoid=self.ellipsoid) test_cube = self._make_test_cube(cs, x_points, y_points, coord_units) grid_definition_section(test_cube, self.mock_grib) - self._check_key('gridDefinitionTemplateNumber', 10) + self._check_key("gridDefinitionTemplateNumber", 10) def test_grid_definition_template_12(self): # Transverse Mercator grid. x_points = np.arange(3) y_points = np.arange(3) - coord_units = 'm' + coord_units = "m" cs = TransverseMercator(0, 0, 0, 0, 1, ellipsoid=self.ellipsoid) test_cube = self._make_test_cube(cs, x_points, y_points, coord_units) grid_definition_section(test_cube, self.mock_grib) - self._check_key('gridDefinitionTemplateNumber', 12) + self._check_key("gridDefinitionTemplateNumber", 12) def test_grid_definition_template_30(self): # Lambert Conformal grid. x_points = np.arange(3) y_points = np.arange(3) - coord_units = 'm' + coord_units = "m" cs = LambertConformal(ellipsoid=self.ellipsoid) test_cube = self._make_test_cube(cs, x_points, y_points, coord_units) grid_definition_section(test_cube, self.mock_grib) - self._check_key('gridDefinitionTemplateNumber', 30) + self._check_key("gridDefinitionTemplateNumber", 30) def test_grid_definition_template_140(self): # Lambert Conformal grid. x_points = np.arange(3) y_points = np.arange(3) - coord_units = 'm' + coord_units = "m" cs = LambertAzimuthalEqualArea(ellipsoid=self.ellipsoid) test_cube = self._make_test_cube(cs, x_points, y_points, coord_units) grid_definition_section(test_cube, self.mock_grib) - self._check_key('gridDefinitionTemplateNumber', 140) + self._check_key("gridDefinitionTemplateNumber", 140) def test_coord_system_not_supported(self): # Test an unsupported grid - let's choose Albers Equal Area. x_points = np.arange(3) y_points = np.arange(3) - coord_units = '1' + coord_units = "1" cs = AlbersEqualArea(ellipsoid=self.ellipsoid) test_cube = self._make_test_cube(cs, x_points, y_points, coord_units) - exp_name = cs.grid_mapping_name.replace('_', ' ').title() - exp_emsg = 'not supported for coordinate system {!r}'.format(exp_name) + exp_name = cs.grid_mapping_name.replace("_", " ").title() + exp_emsg = "not supported for coordinate system {!r}".format(exp_name) with self.assertRaisesRegex(ValueError, exp_emsg): grid_definition_section(test_cube, self.mock_grib) diff --git a/iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py b/iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py index 5ed377f1..a77c2f55 100644 --- a/iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py +++ b/iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py @@ -21,12 +21,10 @@ @tests.skip_grib_data class TestSaveHybridHeight(tests.IrisGribTest): def setUp(self): - reference_data_filepath = self.get_testdata_path('hybrid_height.nc') - if (hasattr(iris.FUTURE, 'netcdf_promote') and - not iris.FUTURE.netcdf_promote): + reference_data_filepath = self.get_testdata_path("hybrid_height.nc") + if hasattr(iris.FUTURE, "netcdf_promote") and not iris.FUTURE.netcdf_promote: iris.FUTURE.netcdf_promote = True - data_cube = iris.load_cube(reference_data_filepath, - 'air_potential_temperature') + data_cube = iris.load_cube(reference_data_filepath, "air_potential_temperature") # Use only 3 (non-contiguous) levels, and a single timestep. data_cube = data_cube[0, :6:2] self.test_hh_data_cube = data_cube @@ -55,37 +53,28 @@ def test_save(self): # Check that the PV vector (same in all messages) is as expected. # Note: gaps here are because we took model levels = (1, 3, 5). self.assertArrayAllClose( - msgs[0].sections[4]['pv'], - [0, 5., 0, 45., 0, 111.667, 0, 0.999, 0, 0.995, 0, 0.987], - atol=0.0015) + msgs[0].sections[4]["pv"], + [0, 5.0, 0, 45.0, 0, 111.667, 0, 0.999, 0, 0.995, 0, 0.987], + atol=0.0015, + ) # Check message #2-of-3 has the correctly encoded hybrid height. msg = msgs[1] # first surface type = 118 (i.e. hybrid height). - self.assertEqual( - msg.sections[4]['typeOfFirstFixedSurface'], - 118) + self.assertEqual(msg.sections[4]["typeOfFirstFixedSurface"], 118) # first surface scaling = 0. - self.assertEqual( - msg.sections[4]['scaleFactorOfFirstFixedSurface'], - 0) + self.assertEqual(msg.sections[4]["scaleFactorOfFirstFixedSurface"], 0) # first surface value = 3 -- i.e. #2 of (1, 3, 5). - self.assertEqual( - msg.sections[4]['scaledValueOfFirstFixedSurface'], - 3) + self.assertEqual(msg.sections[4]["scaledValueOfFirstFixedSurface"], 3) # second surface type = "NONE" -- i.e. unbounded level. - self.assertEqual( - msg.sections[4]['typeOfSecondFixedSurface'], - 255) + self.assertEqual(msg.sections[4]["typeOfSecondFixedSurface"], 255) @tests.skip_grib_data class TestSaveHybridPressure(tests.IrisGribTest): def setUp(self): - reference_data_filepath = self.get_testdata_path( - 'hybrid_pressure.nc') - data_cube = iris.load_cube(reference_data_filepath, - 'air_temperature') + reference_data_filepath = self.get_testdata_path("hybrid_pressure.nc") + data_cube = iris.load_cube(reference_data_filepath, "air_temperature") self.test_hp_data_cube = data_cube def test_save(self): @@ -111,32 +100,23 @@ def test_save(self): # Check that the PV vector (same in all messages) is as expected. # Note: HUGE gaps here because we took model levels = (1, 51, 91). - self.assertEqual(msgs[0].sections[4]['NV'], 184) + self.assertEqual(msgs[0].sections[4]["NV"], 184) pv_expected = np.zeros(184, dtype=np.float64) - pv_expected[[1, 51, 91]] = [0., 18191.03, 0.003] - pv_expected[[93, 143, 183]] = [0., 0.036, 0.998] - self.assertArrayAllClose( - msgs[0].sections[4]['pv'], pv_expected, atol=0.001) + pv_expected[[1, 51, 91]] = [0.0, 18191.03, 0.003] + pv_expected[[93, 143, 183]] = [0.0, 0.036, 0.998] + self.assertArrayAllClose(msgs[0].sections[4]["pv"], pv_expected, atol=0.001) # Check message #2-of-3 has the correctly encoded hybrid pressure. msg = msgs[1] # first surface type = 119 (i.e. hybrid pressure). - self.assertEqual( - msg.sections[4]['typeOfFirstFixedSurface'], - 119) + self.assertEqual(msg.sections[4]["typeOfFirstFixedSurface"], 119) # first surface scaling = 0. - self.assertEqual( - msg.sections[4]['scaleFactorOfFirstFixedSurface'], - 0) + self.assertEqual(msg.sections[4]["scaleFactorOfFirstFixedSurface"], 0) # first surface value = 3 -- i.e. #2 of (1, 3, 5). - self.assertEqual( - msg.sections[4]['scaledValueOfFirstFixedSurface'], - 51) + self.assertEqual(msg.sections[4]["scaledValueOfFirstFixedSurface"], 51) # second surface type = "NONE" -- i.e. unbounded level. - self.assertEqual( - msg.sections[4]['typeOfSecondFixedSurface'], - 255) + self.assertEqual(msg.sections[4]["typeOfSecondFixedSurface"], 255) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/test_license_headers.py b/iris_grib/tests/test_license_headers.py index 1ac0d92d..7779bc2b 100644 --- a/iris_grib/tests/test_license_headers.py +++ b/iris_grib/tests/test_license_headers.py @@ -37,20 +37,23 @@ def whatchanged_parse(whatchanged_output): Sample input:: - ['TIME:1366884020', '', - ':000000 100644 0000000... 5862ced... A\tlib/iris/cube.py'] + [ + "TIME:1366884020", + "", + ":000000 100644 0000000... 5862ced... A\tlib/iris/cube.py", + ] """ dt = None for line in whatchanged_output: if not line.strip(): continue - elif line.startswith('TIME:'): + elif line.startswith("TIME:"): dt = datetime.fromtimestamp(int(line[5:])) else: # Non blank, non date, line -> must be the lines # containing the file info. - fname = ' '.join(line.split('\t')[1:]) + fname = " ".join(line.split("\t")[1:]) yield fname, dt @staticmethod @@ -67,15 +70,15 @@ def last_change_by_fname(): """ # Check the ".git" folder exists at the repo dir. - if not os.path.isdir(os.path.join(REPO_DIR, '.git')): - raise ValueError('{} is not a git repository.'.format(REPO_DIR)) + if not os.path.isdir(os.path.join(REPO_DIR, ".git")): + raise ValueError("{} is not a git repository.".format(REPO_DIR)) # Call "git whatchanged" to get the details of all the files and when # they were last changed. - output = subprocess.check_output(['git', 'whatchanged', - "--pretty=TIME:%ct"], - cwd=REPO_DIR) - output = output.decode().split('\n') + output = subprocess.check_output( + ["git", "whatchanged", "--pretty=TIME:%ct"], cwd=REPO_DIR + ) + output = output.decode().split("\n") res = {} for fname, dt in TestLicenseHeaders.whatchanged_parse(output): if fname not in res or dt > res[fname]: @@ -84,35 +87,43 @@ def last_change_by_fname(): return res def test_license_headers(self): - exclude_patterns = ('setup.py', - 'build/*', - 'dist/*', - 'docs/*', - 'iris_grib/tests/unit/results/*', - 'iris_grib.egg-info/*') + exclude_patterns = ( + "setup.py", + "build/*", + "dist/*", + "docs/*", + "iris_grib/tests/unit/results/*", + "iris_grib.egg-info/*", + ) try: last_change_by_fname = self.last_change_by_fname() except ValueError: # Caught the case where this is not a git repo. - return self.skipTest('Iris-grib installation did not look like a ' - 'git repo.') + return self.skipTest( + "Iris-grib installation did not look like a " "git repo." + ) failed = False for fname, last_change in sorted(last_change_by_fname.items()): full_fname = os.path.join(REPO_DIR, fname) - if full_fname.endswith('.py') and os.path.isfile(full_fname) and \ - not any(fnmatch(fname, pat) for pat in exclude_patterns): + if ( + full_fname.endswith(".py") + and os.path.isfile(full_fname) + and not any(fnmatch(fname, pat) for pat in exclude_patterns) + ): with open(full_fname) as fh: content = fh.read() if not content.startswith(LICENSE_TEMPLATE): - print('The file {} does not start with the required ' - 'license header.'.format(fname)) + print( + "The file {} does not start with the required " + "license header.".format(fname) + ) failed = True if failed: - raise ValueError('There were license header failures. See stdout.') + raise ValueError("There were license header failures. See stdout.") -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/iris_grib/tests/unit/__init__.py b/iris_grib/tests/unit/__init__.py index 27f39ec1..7cbbc4d6 100644 --- a/iris_grib/tests/unit/__init__.py +++ b/iris_grib/tests/unit/__init__.py @@ -45,7 +45,7 @@ def _mock_eccodes__codes_is_missing(grib_message, keyname): Return whether the key exists in the fake message (dictionary). """ - return (keyname not in grib_message) + return keyname not in grib_message def _mock_eccodes__codes_get_native_type(grib_message, keyname): @@ -68,12 +68,11 @@ def _mock_eccodes__codes_get_native_type(grib_message, keyname): _mock_eccodes.codes_get_long = mock.Mock(side_effect=_mock_eccodes_fetch) _mock_eccodes.codes_get_string = mock.Mock(side_effect=_mock_eccodes_fetch) _mock_eccodes.codes_get_double = mock.Mock(side_effect=_mock_eccodes_fetch) -_mock_eccodes.codes_get_double_array = mock.Mock( - side_effect=_mock_eccodes_fetch) -_mock_eccodes.codes_is_missing = mock.Mock( - side_effect=_mock_eccodes__codes_is_missing) +_mock_eccodes.codes_get_double_array = mock.Mock(side_effect=_mock_eccodes_fetch) +_mock_eccodes.codes_is_missing = mock.Mock(side_effect=_mock_eccodes__codes_is_missing) _mock_eccodes.codes_get_native_type = mock.Mock( - side_effect=_mock_eccodes__codes_get_native_type) + side_effect=_mock_eccodes__codes_get_native_type +) class FakeGribMessage(dict): @@ -83,6 +82,7 @@ class FakeGribMessage(dict): Behaves as a dictionary, containing key-values for message keys. """ + def __init__(self, **kwargs): """ Create a fake message object. @@ -94,7 +94,7 @@ def __init__(self, **kwargs): # Start with a bare dictionary dict.__init__(self) # Extract specially-recognised keys. - time_code = kwargs.pop('time_code', None) + time_code = kwargs.pop("time_code", None) # Set the minimally required keys. self._init_minimal_message() # Also set a time-code, if given. @@ -105,58 +105,71 @@ def __init__(self, **kwargs): def _init_minimal_message(self): # Set values for all the required keys. - self.update({ - 'edition': 1, - 'Ni': 1, - 'Nj': 1, - 'numberOfValues': 1, - 'alternativeRowScanning': 0, - 'centre': 'ecmf', - 'year': 2007, - 'month': 3, - 'day': 23, - 'hour': 12, - 'minute': 0, - 'indicatorOfUnitOfTimeRange': 1, - 'gridType': 'rotated_ll', - 'angleOfRotation': 0.0, - 'resolutionAndComponentFlags': 128, - 'iDirectionIncrementInDegrees': 0.036, - 'jDirectionIncrementInDegrees': 0.036, - 'iScansNegatively': 0, - 'jScansPositively': 1, - 'longitudeOfFirstGridPointInDegrees': -5.70, - 'latitudeOfFirstGridPointInDegrees': -4.452, - 'jPointsAreConsecutive': 0, - 'values': np.array([[1.0]]), - 'indicatorOfParameter': 9999, - 'parameterNumber': 9999, - 'startStep': 24, - 'timeRangeIndicator': 1, - 'P1': 2, 'P2': 0, - # time unit - needed AS WELL as 'indicatorOfUnitOfTimeRange' - 'unitOfTime': 1, - 'table2Version': 9999, - }) + self.update( + { + "edition": 1, + "Ni": 1, + "Nj": 1, + "numberOfValues": 1, + "alternativeRowScanning": 0, + "centre": "ecmf", + "year": 2007, + "month": 3, + "day": 23, + "hour": 12, + "minute": 0, + "indicatorOfUnitOfTimeRange": 1, + "gridType": "rotated_ll", + "angleOfRotation": 0.0, + "resolutionAndComponentFlags": 128, + "iDirectionIncrementInDegrees": 0.036, + "jDirectionIncrementInDegrees": 0.036, + "iScansNegatively": 0, + "jScansPositively": 1, + "longitudeOfFirstGridPointInDegrees": -5.70, + "latitudeOfFirstGridPointInDegrees": -4.452, + "jPointsAreConsecutive": 0, + "values": np.array([[1.0]]), + "indicatorOfParameter": 9999, + "parameterNumber": 9999, + "startStep": 24, + "timeRangeIndicator": 1, + "P1": 2, + "P2": 0, + # time unit - needed AS WELL as 'indicatorOfUnitOfTimeRange' + "unitOfTime": 1, + "table2Version": 9999, + } + ) def set_timeunit_code(self, timecode): - self['indicatorOfUnitOfTimeRange'] = timecode + self["indicatorOfUnitOfTimeRange"] = timecode # for some odd reason, GRIB1 code uses *both* of these # NOTE kludge -- the 2 keys are really the same thing - self['unitOfTime'] = timecode + self["unitOfTime"] = timecode class TestField(tests.IrisGribTest): - def _test_for_coord(self, field, convert, coord_predicate, expected_points, - expected_bounds): - (factories, references, standard_name, long_name, units, - attributes, cell_methods, dim_coords_and_dims, - aux_coords_and_dims) = convert(field) + def _test_for_coord( + self, field, convert, coord_predicate, expected_points, expected_bounds + ): + ( + factories, + references, + standard_name, + long_name, + units, + attributes, + cell_methods, + dim_coords_and_dims, + aux_coords_and_dims, + ) = convert(field) # Check for one and only one matching coordinate. coords_and_dims = dim_coords_and_dims + aux_coords_and_dims - matching_coords = [coord for coord, _ in coords_and_dims if - coord_predicate(coord)] + matching_coords = [ + coord for coord, _ in coords_and_dims if coord_predicate(coord) + ] self.assertEqual(len(matching_coords), 1, str(matching_coords)) coord = matching_coords[0] @@ -169,8 +182,9 @@ def _test_for_coord(self, field, convert, coord_predicate, expected_points, else: self.assertArrayEqual(coord.bounds, expected_bounds) - def assertCoordsAndDimsListsMatch(self, coords_and_dims_got, - coords_and_dims_expected): + def assertCoordsAndDimsListsMatch( + self, coords_and_dims_got, coords_and_dims_expected + ): """ Check that coords_and_dims lists are equivalent. @@ -180,17 +194,18 @@ def assertCoordsAndDimsListsMatch(self, coords_and_dims_got, It also checks that the coordinate types (DimCoord/AuxCoord) match. """ + def sorted_by_coordname(list): return sorted(list, key=lambda item: item[0].name()) coords_and_dims_got = sorted_by_coordname(coords_and_dims_got) - coords_and_dims_expected = sorted_by_coordname( - coords_and_dims_expected) + coords_and_dims_expected = sorted_by_coordname(coords_and_dims_expected) self.assertEqual(coords_and_dims_got, coords_and_dims_expected) # Also check coordinate type equivalences (as Coord.__eq__ does not). self.assertEqual( [type(coord) for coord, dims in coords_and_dims_got], - [type(coord) for coord, dims in coords_and_dims_expected]) + [type(coord) for coord, dims in coords_and_dims_expected], + ) class TestGribSimple(tests.IrisGribTest): @@ -211,9 +226,10 @@ def mock_grib(self): def cube_from_message(self, grib): # Parameter translation now uses the GribWrapper, so we must convert # the Mock-based fake message to a FakeGribMessage. - with mock.patch('iris_grib.eccodes', _mock_eccodes): + with mock.patch("iris_grib.eccodes", _mock_eccodes): grib_message = FakeGribMessage(**grib.__dict__) wrapped_msg = iris_grib.GribWrapper(grib_message) cube, _, _ = iris.fileformats.rules._make_cube( - wrapped_msg, iris_grib._grib1_load_rules.grib1_convert) + wrapped_msg, iris_grib._grib1_load_rules.grib1_convert + ) return cube diff --git a/iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py b/iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py index 327f6b65..840313b0 100644 --- a/iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py +++ b/iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py @@ -23,7 +23,7 @@ class TestBadEdition(tests.IrisGribTest): def test(self): message = mock.Mock(edition=2) - emsg = 'GRIB edition 2 is not supported' + emsg = "GRIB edition 2 is not supported" with self.assertRaisesRegex(TranslationError, emsg): grib1_convert(message) @@ -31,49 +31,67 @@ def test(self): class TestBoundedTime(TestField): @staticmethod def is_forecast_period(coord): - return (coord.standard_name == 'forecast_period' and - coord.units == 'hours') + return coord.standard_name == "forecast_period" and coord.units == "hours" @staticmethod def is_time(coord): - return (coord.standard_name == 'time' and - coord.units == 'hours since epoch') + return coord.standard_name == "time" and coord.units == "hours since epoch" def assert_bounded_message(self, **kwargs): - attributes = {'productDefinitionTemplateNumber': 0, - 'edition': 1, '_forecastTime': 15, - '_forecastTimeUnit': 'hours', - 'phenomenon_bounds': lambda u: (80, 120), - '_phenomenonDateTime': -1, - 'table2Version': 9999, - '_originatingCentre': 'xxx', - } + attributes = { + "productDefinitionTemplateNumber": 0, + "edition": 1, + "_forecastTime": 15, + "_forecastTimeUnit": "hours", + "phenomenon_bounds": lambda u: (80, 120), + "_phenomenonDateTime": -1, + "table2Version": 9999, + "_originatingCentre": "xxx", + } attributes.update(kwargs) message = mock.Mock(**attributes) - self._test_for_coord(message, grib1_convert, self.is_forecast_period, - expected_points=[35], - expected_bounds=[[15, 55]]) - self._test_for_coord(message, grib1_convert, self.is_time, - expected_points=[100], - expected_bounds=[[80, 120]]) + self._test_for_coord( + message, + grib1_convert, + self.is_forecast_period, + expected_points=[35], + expected_bounds=[[15, 55]], + ) + self._test_for_coord( + message, + grib1_convert, + self.is_time, + expected_points=[100], + expected_bounds=[[80, 120]], + ) def assert_bounded_message_3hours(self, **kwargs): - attributes = {'productDefinitionTemplateNumber': 0, - 'edition': 1, '_forecastTime': 252, - '_forecastTimeUnit': '3 hours', - 'phenomenon_bounds': lambda u: (252, 258), - '_phenomenonDateTime': -1, - 'table2Version': 9999, - '_originatingCentre': 'xxx', - } + attributes = { + "productDefinitionTemplateNumber": 0, + "edition": 1, + "_forecastTime": 252, + "_forecastTimeUnit": "3 hours", + "phenomenon_bounds": lambda u: (252, 258), + "_phenomenonDateTime": -1, + "table2Version": 9999, + "_originatingCentre": "xxx", + } attributes.update(kwargs) message = mock.Mock(**attributes) - self._test_for_coord(message, grib1_convert, self.is_forecast_period, - expected_points=[255], - expected_bounds=[[252, 258]]) - self._test_for_coord(message, grib1_convert, self.is_time, - expected_points=[255], - expected_bounds=[[252, 258]]) + self._test_for_coord( + message, + grib1_convert, + self.is_forecast_period, + expected_points=[255], + expected_bounds=[[252, 258]], + ) + self._test_for_coord( + message, + grib1_convert, + self.is_time, + expected_points=[255], + expected_bounds=[[252, 258]], + ) def test_time_range_indicator_2(self): self.assert_bounded_message(timeRangeIndicator=2) @@ -134,28 +152,27 @@ def test_time_range_indicator_125(self): class Test_GribLevels(tests.IrisTest): def test_grib1_hybrid_height(self): - gm = eccodes.codes_grib_new_from_samples('regular_gg_ml_grib1') + gm = eccodes.codes_grib_new_from_samples("regular_gg_ml_grib1") gw = GribWrapper(gm) results = grib1_convert(gw) - factory, = results[0] + (factory,) = results[0] self.assertEqual(factory.factory_class, HybridPressureFactory) delta, sigma, ref = factory.args - self.assertEqual(delta, {'long_name': 'level_pressure'}) - self.assertEqual(sigma, {'long_name': 'sigma'}) - self.assertEqual(ref, Reference(name='surface_pressure')) + self.assertEqual(delta, {"long_name": "level_pressure"}) + self.assertEqual(sigma, {"long_name": "sigma"}) + self.assertEqual(ref, Reference(name="surface_pressure")) coords_and_dims = results[8] - coord, = [co for co, _ in coords_and_dims - if co.name() == 'model_level_number'] - self.assertEqual(coord.units, '1') - self.assertEqual(coord.attributes['positive'], 'up') - coord, = [co for co, _ in coords_and_dims - if co.name() == 'level_pressure'] - self.assertEqual(coord.units, 'Pa') - coord, = [co for co, _ in coords_and_dims - if co.name() == 'sigma'] - self.assertEqual(coord.units, '1') + (coord,) = [ + co for co, _ in coords_and_dims if co.name() == "model_level_number" + ] + self.assertEqual(coord.units, "1") + self.assertEqual(coord.attributes["positive"], "up") + (coord,) = [co for co, _ in coords_and_dims if co.name() == "level_pressure"] + self.assertEqual(coord.units, "Pa") + (coord,) = [co for co, _ in coords_and_dims if co.name() == "sigma"] + self.assertEqual(coord.units, "1") if __name__ == "__main__": diff --git a/iris_grib/tests/unit/grib1_load_rules/test_grib1_load_translations.py b/iris_grib/tests/unit/grib1_load_rules/test_grib1_load_translations.py index a430943d..33ebc575 100644 --- a/iris_grib/tests/unit/grib1_load_rules/test_grib1_load_translations.py +++ b/iris_grib/tests/unit/grib1_load_rules/test_grib1_load_translations.py @@ -71,12 +71,8 @@ def _mock_eccodes__codes_get_native_type(grib_message, keyname): _mock_eccodes.codes_get_long = mock.Mock(side_effect=_mock_eccodes_fetch) _mock_eccodes.codes_get_string = mock.Mock(side_effect=_mock_eccodes_fetch) _mock_eccodes.codes_get_double = mock.Mock(side_effect=_mock_eccodes_fetch) -_mock_eccodes.codes_get_double_array = mock.Mock( - side_effect=_mock_eccodes_fetch -) -_mock_eccodes.codes_is_missing = mock.Mock( - side_effect=_mock_eccodes__codes_is_missing -) +_mock_eccodes.codes_get_double_array = mock.Mock(side_effect=_mock_eccodes_fetch) +_mock_eccodes.codes_is_missing = mock.Mock(side_effect=_mock_eccodes__codes_is_missing) _mock_eccodes.codes_get_native_type = mock.Mock( side_effect=_mock_eccodes__codes_get_native_type ) @@ -191,9 +187,7 @@ def _run_timetests(self, test_set): # Expect GribWrapper construction to fail. with self.assertRaises(type(expected_error)) as ar_context: _ = iris_grib.GribWrapper(message) - self.assertEqual( - ar_context.exception.args, expected_error.args - ) + self.assertEqual(ar_context.exception.args, expected_error.args) continue # 'ELSE'... @@ -218,8 +212,7 @@ def _run_timetests(self, test_set): # Check the data-starttime calculation. interval_start_to_end = ( - wrapped_msg._phenomenonDateTime - - wrapped_msg._referenceDateTime + wrapped_msg._phenomenonDateTime - wrapped_msg._referenceDateTime ) if grib_edition == 1: interval_from_units = wrapped_msg.P1 @@ -281,9 +274,7 @@ def test_timeunits_calendar(self): TestGribTimecodes._run_timetests(self, tests) def test_timeunits_invalid(self): - tests = ( - (1, 111, TestGribTimecodes._err_bad_timeunit(111), 1.0, "??"), - ) + tests = ((1, 111, TestGribTimecodes._err_bad_timeunit(111), 1.0, "??"),) TestGribTimecodes._run_timetests(self, tests) def test_warn_unknown_pdts(self): diff --git a/iris_grib/tests/unit/grib_phenom_translation/test_grib_phenom_translation.py b/iris_grib/tests/unit/grib_phenom_translation/test_grib_phenom_translation.py index 519d7638..00440a6d 100644 --- a/iris_grib/tests/unit/grib_phenom_translation/test_grib_phenom_translation.py +++ b/iris_grib/tests/unit/grib_phenom_translation/test_grib_phenom_translation.py @@ -2,13 +2,13 @@ # # This file is part of iris-grib and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -''' +""" Unit tests for the mod:`iris_grib.grib_phenom_translation` module. Carried over from old iris/tests/test_grib_phenom_translation.py. Code is out of step with current test conventions and standards. -''' +""" # Import iris_grib.tests first so that some things can be initialised before # importing anything else. @@ -22,30 +22,36 @@ class TestGribLookupTableType(tests.IrisTest): def test_lookuptable_type(self): - ll = gptx._LookupTable([('a', 1), ('b', 2)]) - assert ll['a'] == 1 - assert ll['q'] is None - ll['q'] = 15 - assert ll['q'] == 15 - ll['q'] = 15 - assert ll['q'] == 15 + ll = gptx._LookupTable([("a", 1), ("b", 2)]) + assert ll["a"] == 1 + assert ll["q"] is None + ll["q"] = 15 + assert ll["q"] == 15 + ll["q"] = 15 + assert ll["q"] == 15 with self.assertRaises(KeyError): - ll['q'] = 7 - del ll['q'] - ll['q'] = 7 - assert ll['q'] == 7 + ll["q"] = 7 + del ll["q"] + ll["q"] = 7 + assert ll["q"] == 7 class TestGribPhenomenonLookup(tests.IrisTest): def test_grib1_cf_lookup(self): - def check_grib1_cf(param, - standard_name, long_name, units, - height=None, - t2version=128, centre=98, expect_none=False): + def check_grib1_cf( + param, + standard_name, + long_name, + units, + height=None, + t2version=128, + centre=98, + expect_none=False, + ): a_cf_unit = cf_units.Unit(units) - cfdata = gptx.grib1_phenom_to_cf_info(param_number=param, - table2_version=t2version, - centre_number=centre) + cfdata = gptx.grib1_phenom_to_cf_info( + param_number=param, table2_version=t2version, centre_number=centre + ) if expect_none: self.assertIsNone(cfdata) else: @@ -57,25 +63,34 @@ def check_grib1_cf(param, else: self.assertEqual(cfdata.set_height, float(height)) - check_grib1_cf(165, 'x_wind', None, 'm s-1', 10.0) - check_grib1_cf(168, 'dew_point_temperature', None, 'K', 2) - check_grib1_cf(130, 'air_temperature', None, 'K') + check_grib1_cf(165, "x_wind", None, "m s-1", 10.0) + check_grib1_cf(168, "dew_point_temperature", None, "K", 2) + check_grib1_cf(130, "air_temperature", None, "K") check_grib1_cf(235, None, "grib_skin_temperature", "K") - check_grib1_cf(235, None, "grib_skin_temperature", "K", - t2version=9999, expect_none=True) - check_grib1_cf(235, None, "grib_skin_temperature", "K", - centre=9999, expect_none=True) - check_grib1_cf(9999, None, "grib_skin_temperature", "K", - expect_none=True) + check_grib1_cf( + 235, None, "grib_skin_temperature", "K", t2version=9999, expect_none=True + ) + check_grib1_cf( + 235, None, "grib_skin_temperature", "K", centre=9999, expect_none=True + ) + check_grib1_cf(9999, None, "grib_skin_temperature", "K", expect_none=True) def test_grib2_cf_lookup(self): - def check_grib2_cf(discipline, category, number, - standard_name, long_name, units, - expect_none=False): + def check_grib2_cf( + discipline, + category, + number, + standard_name, + long_name, + units, + expect_none=False, + ): a_cf_unit = cf_units.Unit(units) - cfdata = gptx.grib2_phenom_to_cf_info(param_discipline=discipline, - param_category=category, - param_number=number) + cfdata = gptx.grib2_phenom_to_cf_info( + param_discipline=discipline, + param_category=category, + param_number=number, + ) if expect_none: self.assertIsNone(cfdata) else: @@ -90,23 +105,26 @@ def check_grib2_cf(discipline, category, number, check_grib2_cf(10, 2, 0, "sea_ice_area_fraction", None, 1) check_grib2_cf(2, 0, 0, "land_area_fraction", None, 1) check_grib2_cf(0, 19, 1, None, "grib_physical_atmosphere_albedo", "%") - check_grib2_cf(0, 1, 64, - "atmosphere_mass_content_of_water_vapor", None, - "kg m-2") + check_grib2_cf( + 0, 1, 64, "atmosphere_mass_content_of_water_vapor", None, "kg m-2" + ) check_grib2_cf(2, 0, 7, "surface_altitude", None, "m") # These should fail - check_grib2_cf(9999, 2, 0, "sea_ice_area_fraction", None, 1, - expect_none=True) - check_grib2_cf(10, 9999, 0, "sea_ice_area_fraction", None, 1, - expect_none=True) - check_grib2_cf(10, 2, 9999, "sea_ice_area_fraction", None, 1, - expect_none=True) + check_grib2_cf(9999, 2, 0, "sea_ice_area_fraction", None, 1, expect_none=True) + check_grib2_cf(10, 9999, 0, "sea_ice_area_fraction", None, 1, expect_none=True) + check_grib2_cf(10, 2, 9999, "sea_ice_area_fraction", None, 1, expect_none=True) def test_cf_grib2_lookup(self): - def check_cf_grib2(standard_name, long_name, - discipline, category, number, units, - expect_none=False): + def check_cf_grib2( + standard_name, + long_name, + discipline, + category, + number, + units, + expect_none=False, + ): a_cf_unit = cf_units.Unit(units) gribdata = gptx.cf_phenom_to_grib2_info(standard_name, long_name) if expect_none: @@ -118,48 +136,34 @@ def check_cf_grib2(standard_name, long_name, self.assertEqual(gribdata.units, a_cf_unit) # These should work - check_cf_grib2("sea_surface_temperature", None, - 10, 3, 0, 'K') - check_cf_grib2("air_temperature", None, - 0, 0, 0, 'K') - check_cf_grib2("soil_temperature", None, - 2, 0, 2, "K") - check_cf_grib2("land_area_fraction", None, - 2, 0, 0, '1') - check_cf_grib2("land_binary_mask", None, - 2, 0, 0, '1') - check_cf_grib2("atmosphere_mass_content_of_water_vapor", None, - 0, 1, 64, "kg m-2") - check_cf_grib2("surface_altitude", None, - 2, 0, 7, "m") + check_cf_grib2("sea_surface_temperature", None, 10, 3, 0, "K") + check_cf_grib2("air_temperature", None, 0, 0, 0, "K") + check_cf_grib2("soil_temperature", None, 2, 0, 2, "K") + check_cf_grib2("land_area_fraction", None, 2, 0, 0, "1") + check_cf_grib2("land_binary_mask", None, 2, 0, 0, "1") + check_cf_grib2( + "atmosphere_mass_content_of_water_vapor", None, 0, 1, 64, "kg m-2" + ) + check_cf_grib2("surface_altitude", None, 2, 0, 7, "m") # These should fail - check_cf_grib2("air_temperature", "user_long_UNRECOGNISED", - 0, 0, 0, 'K') - check_cf_grib2("air_temperature_UNRECOGNISED", None, - 0, 0, 0, 'K', - expect_none=True) - check_cf_grib2(None, "user_long_UNRECOGNISED", - 0, 0, 0, 'K', - expect_none=True) - check_cf_grib2(None, "precipitable_water", - 0, 1, 3, 'kg m-2') - check_cf_grib2("invalid_unknown", "precipitable_water", - 0, 1, 3, 'kg m-2', - expect_none=True) - check_cf_grib2(None, None, 0, 0, 0, '', - expect_none=True) + check_cf_grib2("air_temperature", "user_long_UNRECOGNISED", 0, 0, 0, "K") + check_cf_grib2( + "air_temperature_UNRECOGNISED", None, 0, 0, 0, "K", expect_none=True + ) + check_cf_grib2(None, "user_long_UNRECOGNISED", 0, 0, 0, "K", expect_none=True) + check_cf_grib2(None, "precipitable_water", 0, 1, 3, "kg m-2") + check_cf_grib2( + "invalid_unknown", "precipitable_water", 0, 1, 3, "kg m-2", expect_none=True + ) + check_cf_grib2(None, None, 0, 0, 0, "", expect_none=True) class TestGRIBcode(tests.IrisTest): # GRIBCode is basically a namedtuple, so not all behaviour needs testing. # However, creation is a bit special so exercise all those cases. def test_create_from_keys(self): - gribcode = GRIBCode( - edition_or_string=5, - discipline=7, - category=4, - number=199) + gribcode = GRIBCode(edition_or_string=5, discipline=7, category=4, number=199) self.assertEqual(gribcode.edition, 5) self.assertEqual(gribcode.discipline, 7) self.assertEqual(gribcode.category, 4) @@ -187,17 +191,13 @@ def test_create_from_gribcode(self): self.assertIsNot(gribcode1, gribcode2) def test_create_from_string(self): - gribcode = GRIBCode('xxx12xs-34 -5,678qqqq') + gribcode = GRIBCode("xxx12xs-34 -5,678qqqq") # NOTE: args 2 and 3 are *not* negative. self.assertEqual(gribcode, GRIBCode(12, 34, 5, 678)) def test_create_from_own_string(self): # Check that GRIBCode string reprs are valid as create arguments. - gribcode = GRIBCode( - edition_or_string=2, - discipline=17, - category=94, - number=231) + gribcode = GRIBCode(edition_or_string=2, discipline=17, category=94, number=231) grib_param_string = str(gribcode) newcode = GRIBCode(grib_param_string) self.assertEqual(newcode, gribcode) @@ -209,55 +209,55 @@ def test_create_from_tuple(self): def test_create_bad_nargs(self): # Between 1 and 4 args is not invalid call syntax, but it should fail. with self.assertRaisesRegex( - ValueError, - 'Cannot create GRIBCode from 2 arguments'): + ValueError, "Cannot create GRIBCode from 2 arguments" + ): GRIBCode(1, 2) def test_create_bad_single_arg_None(self): with self.assertRaisesRegex( - ValueError, - 'Cannot create GRIBCode from 0 arguments'): + ValueError, "Cannot create GRIBCode from 0 arguments" + ): GRIBCode(None) def test_create_bad_single_arg_empty_string(self): with self.assertRaisesRegex( - ValueError, - 'Invalid argument for GRIBCode creation'): - GRIBCode('') + ValueError, "Invalid argument for GRIBCode creation" + ): + GRIBCode("") def test_create_bad_single_arg_nonums(self): with self.assertRaisesRegex( - ValueError, - 'Invalid argument for GRIBCode creation'): - GRIBCode('saas- dsa- ') + ValueError, "Invalid argument for GRIBCode creation" + ): + GRIBCode("saas- dsa- ") def test_create_bad_single_arg_less_than_4_nums(self): with self.assertRaisesRegex( - ValueError, - 'Invalid argument for GRIBCode creation'): - GRIBCode('1,2,3') + ValueError, "Invalid argument for GRIBCode creation" + ): + GRIBCode("1,2,3") def test_create_bad_single_arg_number(self): with self.assertRaisesRegex( - ValueError, - 'Invalid argument for GRIBCode creation'): + ValueError, "Invalid argument for GRIBCode creation" + ): GRIBCode(4) def test_create_bad_single_arg_single_numeric(self): with self.assertRaisesRegex( - ValueError, - 'Invalid argument for GRIBCode creation'): - GRIBCode('44') + ValueError, "Invalid argument for GRIBCode creation" + ): + GRIBCode("44") def test_create_string_more_than_4_nums(self): # Note: does not error, just discards the extra. - gribcode = GRIBCode('1,2,3,4,5,6,7,8') + gribcode = GRIBCode("1,2,3,4,5,6,7,8") self.assertEqual(gribcode, GRIBCode(1, 2, 3, 4)) def test__str__(self): result = str(GRIBCode(2, 17, 3, 123)) - self.assertEqual(result, 'GRIB2:d017c003n123') + self.assertEqual(result, "GRIB2:d017c003n123") -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/__init__.py b/iris_grib/tests/unit/load_convert/__init__.py index 4fecf59e..68d333df 100644 --- a/iris_grib/tests/unit/load_convert/__init__.py +++ b/iris_grib/tests/unit/load_convert/__init__.py @@ -13,15 +13,15 @@ def empty_metadata(): metadata = OrderedDict() - metadata['factories'] = [] - metadata['references'] = [] - metadata['standard_name'] = None - metadata['long_name'] = None - metadata['units'] = None - metadata['attributes'] = {} - metadata['cell_methods'] = [] - metadata['dim_coords_and_dims'] = [] - metadata['aux_coords_and_dims'] = [] + metadata["factories"] = [] + metadata["references"] = [] + metadata["standard_name"] = None + metadata["long_name"] = None + metadata["units"] = None + metadata["attributes"] = {} + metadata["cell_methods"] = [] + metadata["dim_coords_and_dims"] = [] + metadata["aux_coords_and_dims"] = [] return metadata diff --git a/iris_grib/tests/unit/load_convert/test__hindcast_fix.py b/iris_grib/tests/unit/load_convert/test__hindcast_fix.py index 1d611fba..7e566ad1 100644 --- a/iris_grib/tests/unit/load_convert/test__hindcast_fix.py +++ b/iris_grib/tests/unit/load_convert/test__hindcast_fix.py @@ -18,7 +18,7 @@ class TestHindcastFix(tests.IrisGribTest): # setup tests : provided value, fix-applies, expected-fixed - FixTest = namedtuple('FixTest', ('given', 'fixable', 'fixed')) + FixTest = namedtuple("FixTest", ("given", "fixable", "fixed")) test_values = [ FixTest(0, False, None), FixTest(100, False, None), @@ -27,10 +27,11 @@ class TestHindcastFix(tests.IrisGribTest): FixTest(2 * 2**30 + 1, True, -1), FixTest(2 * 2**30 + 2, True, -2), FixTest(3 * 2**30 - 1, True, -(2**30 - 1)), - FixTest(3 * 2**30, False, None)] + FixTest(3 * 2**30, False, None), + ] def setUp(self): - self.patch_warn = self.patch('warnings.warn') + self.patch_warn = self.patch("warnings.warn") def test_fix(self): # Check hindcast fixing. @@ -41,11 +42,12 @@ def test_fix(self): def test_fix_warning(self): # Check warning appears when enabled. - self.patch('iris_grib._load_convert.options.warn_on_unsupported', True) + self.patch("iris_grib._load_convert.options.warn_on_unsupported", True) hindcast_fix(2 * 2**30 + 5) self.assertEqual(self.patch_warn.call_count, 1) - self.assertIn('Re-interpreting large grib forecastTime', - self.patch_warn.call_args[0][0]) + self.assertIn( + "Re-interpreting large grib forecastTime", self.patch_warn.call_args[0][0] + ) def test_fix_warning_disabled(self): # Default is no warning. @@ -53,5 +55,5 @@ def test_fix_warning_disabled(self): self.assertEqual(self.patch_warn.call_count, 0) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_bitmap_section.py b/iris_grib/tests/unit/load_convert/test_bitmap_section.py index 64a24bd5..2fabdac2 100644 --- a/iris_grib/tests/unit/load_convert/test_bitmap_section.py +++ b/iris_grib/tests/unit/load_convert/test_bitmap_section.py @@ -22,11 +22,10 @@ def test_bitmap_unsupported(self): # bitMapIndicator in range 1-254. # Note that bitMapIndicator = 1-253 and bitMapIndicator = 254 mean two # different things, but load_convert treats them identically. - message = _make_test_message({6: {'bitMapIndicator': 100, - 'bitmap': None}}) - with self.assertRaisesRegex(TranslationError, 'unsupported bitmap'): + message = _make_test_message({6: {"bitMapIndicator": 100, "bitmap": None}}) + with self.assertRaisesRegex(TranslationError, "unsupported bitmap"): bitmap_section(message.sections[6]) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_calculate_increment.py b/iris_grib/tests/unit/load_convert/test_calculate_increment.py index 71dc27d4..da0a6310 100644 --- a/iris_grib/tests/unit/load_convert/test_calculate_increment.py +++ b/iris_grib/tests/unit/load_convert/test_calculate_increment.py @@ -28,5 +28,5 @@ def test_with_mod(self): self.assertEqual(result, 1) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_convert.py b/iris_grib/tests/unit/load_convert/test_convert.py index b50f669c..ebf02a6f 100644 --- a/iris_grib/tests/unit/load_convert/test_convert.py +++ b/iris_grib/tests/unit/load_convert/test_convert.py @@ -19,11 +19,11 @@ class TestGribMessage(tests.IrisGribTest): def test_edition_2(self): def func(field, metadata): - return metadata['factories'].append(factory) + return metadata["factories"].append(factory) - sections = [{'editionNumber': 2}] + sections = [{"editionNumber": 2}] field = _make_test_message(sections) - this = 'iris_grib._load_convert.grib2_convert' + this = "iris_grib._load_convert.grib2_convert" factory = mock.sentinel.factory with mock.patch(this, side_effect=func) as grib2_convert: # The call being tested. @@ -33,9 +33,9 @@ def func(field, metadata): self.assertEqual(result, metadata) def test_edition_1_bad(self): - sections = [{'editionNumber': 1}] + sections = [{"editionNumber": 1}] field = _make_test_message(sections) - emsg = 'edition 1 is not supported' + emsg = "edition 1 is not supported" with self.assertRaisesRegex(TranslationError, emsg): convert(field) @@ -43,15 +43,15 @@ def test_edition_1_bad(self): class TestGribWrapper(tests.IrisGribTest): def test_edition_2_bad(self): # Test object with no '.sections', and '.edition' ==2. - field = mock.Mock(edition=2, spec=('edition')) - emsg = 'edition 2 is not supported' + field = mock.Mock(edition=2, spec=("edition")) + emsg = "edition 2 is not supported" with self.assertRaisesRegex(TranslationError, emsg): convert(field) def test_edition_1(self): # Test object with no '.sections', and '.edition' ==1. - field = mock.Mock(edition=1, spec=('edition')) - func = 'iris_grib._load_convert.grib1_convert' + field = mock.Mock(edition=1, spec=("edition")) + func = "iris_grib._load_convert.grib1_convert" metadata = mock.sentinel.metadata with mock.patch(func, return_value=metadata) as grib1_convert: result = convert(field) @@ -59,5 +59,5 @@ def test_edition_1(self): self.assertEqual(result, metadata) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_data_cutoff.py b/iris_grib/tests/unit/load_convert/test_data_cutoff.py index 03a4911e..35eed1a7 100644 --- a/iris_grib/tests/unit/load_convert/test_data_cutoff.py +++ b/iris_grib/tests/unit/load_convert/test_data_cutoff.py @@ -20,17 +20,17 @@ class TestDataCutoff(tests.IrisGribTest): def _check(self, hours, minutes, request_warning, expect_warning=False): # Setup the environment. - patch_target = 'iris_grib._load_convert.options' + patch_target = "iris_grib._load_convert.options" with mock.patch(patch_target) as options: options.warn_on_unsupported = request_warning - with mock.patch('warnings.warn') as warn: + with mock.patch("warnings.warn") as warn: # The call being tested. data_cutoff(hours, minutes) # Check the result. if expect_warning: self.assertEqual(len(warn.mock_calls), 1) args, kwargs = warn.call_args - self.assertIn('data cutoff', args[0]) + self.assertIn("data cutoff", args[0]) else: self.assertEqual(len(warn.mock_calls), 0) @@ -59,5 +59,5 @@ def test_hours_and_minutes_warning(self): self._check(30, 40, True, True) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_data_representation_section.py b/iris_grib/tests/unit/load_convert/test_data_representation_section.py index 094aa91f..9bf03478 100644 --- a/iris_grib/tests/unit/load_convert/test_data_representation_section.py +++ b/iris_grib/tests/unit/load_convert/test_data_representation_section.py @@ -22,16 +22,16 @@ def test_supported_templates(self): template_nums = [0, 1, 2, 3, 4, 40, 41, 42, 50, 51, 61] for template_num in template_nums: message = _make_test_message( - {5: {'dataRepresentationTemplateNumber': template_num}}) + {5: {"dataRepresentationTemplateNumber": template_num}} + ) data_representation_section(message.sections[5]) def test_unsupported_template(self): - message = _make_test_message( - {5: {'dataRepresentationTemplateNumber': 5}}) - err_msg = r'Template \[5\] is not supported' + message = _make_test_message({5: {"dataRepresentationTemplateNumber": 5}}) + err_msg = r"Template \[5\] is not supported" with self.assertRaisesRegex(TranslationError, err_msg): data_representation_section(message.sections[5]) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_ellipsoid.py b/iris_grib/tests/unit/load_convert/test_ellipsoid.py index bf3c3d2f..52dbbe23 100644 --- a/iris_grib/tests/unit/load_convert/test_ellipsoid.py +++ b/iris_grib/tests/unit/load_convert/test_ellipsoid.py @@ -28,21 +28,23 @@ class Test(tests.IrisGribTest): def test_shape_unsupported(self): unsupported = [8, 9, 10, MDI] - emsg = 'unsupported shape of the earth' + emsg = "unsupported shape of the earth" for shape in unsupported: with self.assertRaisesRegex(TranslationError, emsg): ellipsoid(shape, MDI, MDI, MDI) def test_spherical_default_supported(self): - cs_by_shape = {0: icoord_systems.GeogCS(6367470), - 6: icoord_systems.GeogCS(6371229)} + cs_by_shape = { + 0: icoord_systems.GeogCS(6367470), + 6: icoord_systems.GeogCS(6371229), + } for shape, expected in cs_by_shape.items(): result = ellipsoid(shape, MDI, MDI, MDI) self.assertEqual(result, expected) def test_spherical_shape_1_no_radius(self): shape = 1 - emsg = 'radius to be specified' + emsg = "radius to be specified" with self.assertRaisesRegex(ValueError, emsg): ellipsoid(shape, MDI, MDI, MDI) @@ -55,19 +57,19 @@ def test_spherical_shape_1(self): def test_oblate_shape_3_7_no_axes(self): for shape in [3, 7]: - emsg = 'axis to be specified' + emsg = "axis to be specified" with self.assertRaisesRegex(ValueError, emsg): ellipsoid(shape, MDI, MDI, MDI) def test_oblate_shape_3_7_no_major(self): for shape in [3, 7]: - emsg = 'major axis to be specified' + emsg = "major axis to be specified" with self.assertRaisesRegex(ValueError, emsg): ellipsoid(shape, MDI, 1, MDI) def test_oblate_shape_3_7_no_minor(self): for shape in [3, 7]: - emsg = 'minor axis to be specified' + emsg = "minor axis to be specified" with self.assertRaisesRegex(ValueError, emsg): ellipsoid(shape, 1, MDI, MDI) @@ -83,5 +85,5 @@ def test_oblate_shape_3_7(self): self.assertEqual(result, expected) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_ellipsoid_geometry.py b/iris_grib/tests/unit/load_convert/test_ellipsoid_geometry.py index 3f7e8b74..0ed1e93b 100644 --- a/iris_grib/tests/unit/load_convert/test_ellipsoid_geometry.py +++ b/iris_grib/tests/unit/load_convert/test_ellipsoid_geometry.py @@ -16,17 +16,19 @@ class Test(tests.IrisGribTest): def setUp(self): - self.section = {'scaledValueOfEarthMajorAxis': 10, - 'scaleFactorOfEarthMajorAxis': 1, - 'scaledValueOfEarthMinorAxis': 100, - 'scaleFactorOfEarthMinorAxis': 2, - 'scaledValueOfRadiusOfSphericalEarth': 1000, - 'scaleFactorOfRadiusOfSphericalEarth': 3} + self.section = { + "scaledValueOfEarthMajorAxis": 10, + "scaleFactorOfEarthMajorAxis": 1, + "scaledValueOfEarthMinorAxis": 100, + "scaleFactorOfEarthMinorAxis": 2, + "scaledValueOfRadiusOfSphericalEarth": 1000, + "scaleFactorOfRadiusOfSphericalEarth": 3, + } def test_geometry(self): result = ellipsoid_geometry(self.section) self.assertEqual(result, (1.0, 1.0, 1.0)) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_ensemble_identifier.py b/iris_grib/tests/unit/load_convert/test_ensemble_identifier.py index 11ae5edd..84b78213 100644 --- a/iris_grib/tests/unit/load_convert/test_ensemble_identifier.py +++ b/iris_grib/tests/unit/load_convert/test_ensemble_identifier.py @@ -22,21 +22,23 @@ class Test(tests.IrisGribTest): def setUp(self): - self.patch('warnings.warn') + self.patch("warnings.warn") def _check(self, request_warning): - section = {'perturbationNumber': 17} - this = 'iris_grib._load_convert.options' + section = {"perturbationNumber": 17} + this = "iris_grib._load_convert.options" with mock.patch(this, warn_on_unsupported=request_warning): realization = ensemble_identifier(section) - expected = DimCoord(section['perturbationNumber'], - standard_name='realization', - units='no_unit') + expected = DimCoord( + section["perturbationNumber"], + standard_name="realization", + units="no_unit", + ) self.assertEqual(realization, expected) if request_warning: warn_msgs = [mcall[1][0] for mcall in warnings.warn.mock_calls] - expected_msgs = ['type of ensemble', 'number of forecasts'] + expected_msgs = ["type of ensemble", "number of forecasts"] for emsg in expected_msgs: matches = [wmsg for wmsg in warn_msgs if emsg in wmsg] self.assertEqual(len(matches), 1) @@ -51,5 +53,5 @@ def test_ens_warn(self): self._check(True) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_fixup_float32_from_int32.py b/iris_grib/tests/unit/load_convert/test_fixup_float32_from_int32.py index da02b154..e5d187b0 100644 --- a/iris_grib/tests/unit/load_convert/test_fixup_float32_from_int32.py +++ b/iris_grib/tests/unit/load_convert/test_fixup_float32_from_int32.py @@ -16,7 +16,7 @@ class Test(tests.IrisGribTest): def test_negative(self): - result = fixup_float32_from_int32(-0x3f000000) + result = fixup_float32_from_int32(-0x3F000000) self.assertEqual(result, -0.5) def test_zero(self): @@ -24,9 +24,9 @@ def test_zero(self): self.assertEqual(result, 0) def test_positive(self): - result = fixup_float32_from_int32(0x3f000000) + result = fixup_float32_from_int32(0x3F000000) self.assertEqual(result, 0.5) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_fixup_int32_from_uint32.py b/iris_grib/tests/unit/load_convert/test_fixup_int32_from_uint32.py index 6b444568..b4c3f8f0 100644 --- a/iris_grib/tests/unit/load_convert/test_fixup_int32_from_uint32.py +++ b/iris_grib/tests/unit/load_convert/test_fixup_int32_from_uint32.py @@ -38,5 +38,5 @@ def test_already_negative(self): self.assertEqual(result, -7) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_forecast_period_coord.py b/iris_grib/tests/unit/load_convert/test_forecast_period_coord.py index a932428d..75de7fac 100644 --- a/iris_grib/tests/unit/load_convert/test_forecast_period_coord.py +++ b/iris_grib/tests/unit/load_convert/test_forecast_period_coord.py @@ -19,24 +19,25 @@ class Test(tests.IrisGribTest): def test(self): # (indicatorOfUnitOfTimeRange, forecastTime, expected-hours) - times = [(0, 60, 1), # minutes - (1, 2, 2), # hours - (2, 1, 24), # days - (10, 2, 6), # 3 hours - (11, 3, 18), # 6 hours - (12, 2, 24), # 12 hours - (13, 3600, 1)] # seconds + times = [ + (0, 60, 1), # minutes + (1, 2, 2), # hours + (2, 1, 24), # days + (10, 2, 6), # 3 hours + (11, 3, 18), # 6 hours + (12, 2, 24), # 12 hours + (13, 3600, 1), + ] # seconds for indicatorOfUnitOfTimeRange, forecastTime, hours in times: - coord = forecast_period_coord(indicatorOfUnitOfTimeRange, - forecastTime) + coord = forecast_period_coord(indicatorOfUnitOfTimeRange, forecastTime) self.assertIsInstance(coord, DimCoord) - self.assertEqual(coord.standard_name, 'forecast_period') - self.assertEqual(coord.units, 'hours') + self.assertEqual(coord.standard_name, "forecast_period") + self.assertEqual(coord.units, "hours") self.assertEqual(coord.shape, (1,)) self.assertEqual(coord.points[0], hours) self.assertFalse(coord.has_bounds()) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_generating_process.py b/iris_grib/tests/unit/load_convert/test_generating_process.py index eca8e15d..479a8ecc 100644 --- a/iris_grib/tests/unit/load_convert/test_generating_process.py +++ b/iris_grib/tests/unit/load_convert/test_generating_process.py @@ -17,29 +17,30 @@ class TestGeneratingProcess(tests.IrisGribTest): def setUp(self): - self.warn_patch = self.patch('warnings.warn') + self.warn_patch = self.patch("warnings.warn") def test_nowarn(self): generating_process(None) self.assertEqual(self.warn_patch.call_count, 0) def _check_warnings(self, with_forecast=True): - module = 'iris_grib._load_convert' - self.patch(module + '.options.warn_on_unsupported', True) + module = "iris_grib._load_convert" + self.patch(module + ".options.warn_on_unsupported", True) call_args = [None] call_kwargs = {} expected_fragments = [ - 'Unable to translate type of generating process', - 'Unable to translate background generating process'] + "Unable to translate type of generating process", + "Unable to translate background generating process", + ] if with_forecast: - expected_fragments.append( - 'Unable to translate forecast generating process') + expected_fragments.append("Unable to translate forecast generating process") else: - call_kwargs['include_forecast_process'] = False + call_kwargs["include_forecast_process"] = False generating_process(*call_args, **call_kwargs) got_msgs = [call[0][0] for call in self.warn_patch.call_args_list] - for got_msg, expected_fragment in zip(sorted(got_msgs), - sorted(expected_fragments)): + for got_msg, expected_fragment in zip( + sorted(got_msgs), sorted(expected_fragments) + ): self.assertIn(expected_fragment, got_msg) def test_warn_full(self): @@ -49,5 +50,5 @@ def test_warn_no_forecast(self): self._check_warnings(with_forecast=False) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_grib2_convert.py b/iris_grib/tests/unit/load_convert/test_grib2_convert.py index 4463195c..cc06cd09 100644 --- a/iris_grib/tests/unit/load_convert/test_grib2_convert.py +++ b/iris_grib/tests/unit/load_convert/test_grib2_convert.py @@ -18,42 +18,56 @@ class Test(tests.IrisGribTest): def setUp(self): - this = 'iris_grib._load_convert' - self.patch('{}.reference_time_coord'.format(this), return_value=None) - self.patch('{}.grid_definition_section'.format(this)) - self.patch('{}.product_definition_section'.format(this)) - self.patch('{}.data_representation_section'.format(this)) - self.patch('{}.bitmap_section'.format(this)) + this = "iris_grib._load_convert" + self.patch("{}.reference_time_coord".format(this), return_value=None) + self.patch("{}.grid_definition_section".format(this)) + self.patch("{}.product_definition_section".format(this)) + self.patch("{}.data_representation_section".format(this)) + self.patch("{}.bitmap_section".format(this)) def test(self): - sections = [{'discipline': mock.sentinel.discipline}, # section 0 - {'centre': 'ecmf', # section 1 - 'tablesVersion': mock.sentinel.tablesVersion}, - None, # section 2 - mock.sentinel.grid_definition_section, # section 3 - mock.sentinel.product_definition_section, # section 4 - mock.sentinel.data_representation_section, # section 5 - mock.sentinel.bitmap_section] # section 6 + sections = [ + {"discipline": mock.sentinel.discipline}, # section 0 + { + "centre": "ecmf", # section 1 + "tablesVersion": mock.sentinel.tablesVersion, + }, + None, # section 2 + mock.sentinel.grid_definition_section, # section 3 + mock.sentinel.product_definition_section, # section 4 + mock.sentinel.data_representation_section, # section 5 + mock.sentinel.bitmap_section, + ] # section 6 field = _make_test_message(sections) - metadata = {'factories': [], 'references': [], - 'standard_name': None, - 'long_name': None, 'units': None, 'attributes': {}, - 'cell_methods': [], 'dim_coords_and_dims': [], - 'aux_coords_and_dims': []} + metadata = { + "factories": [], + "references": [], + "standard_name": None, + "long_name": None, + "units": None, + "attributes": {}, + "cell_methods": [], + "dim_coords_and_dims": [], + "aux_coords_and_dims": [], + } expected = copy.deepcopy(metadata) - centre = 'European Centre for Medium Range Weather Forecasts' - expected['attributes'] = {'centre': centre} + centre = "European Centre for Medium Range Weather Forecasts" + expected["attributes"] = {"centre": centre} # The call being tested. grib2_convert(field, metadata) self.assertEqual(metadata, expected) this = iris_grib._load_convert this.reference_time_coord.assert_called_with(sections[1]) - this.grid_definition_section.assert_called_with(sections[3], - expected) - args = (sections[4], expected, sections[0]['discipline'], - sections[1]['tablesVersion'], None) + this.grid_definition_section.assert_called_with(sections[3], expected) + args = ( + sections[4], + expected, + sections[0]["discipline"], + sections[1]["tablesVersion"], + None, + ) this.product_definition_section.assert_called_with(*args) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_0_and_1.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_0_and_1.py index 8d8be13b..1d8a9fa3 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_0_and_1.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_0_and_1.py @@ -30,142 +30,139 @@ def get_computed_key(self, key): class Test_resolution_flags(tests.IrisGribTest): - def section_3(self): - section = _Section({ - 'Ni': 6, - 'Nj': 6, - 'latitudeOfFirstGridPoint': 0, - 'longitudeOfFirstGridPoint': 0, - 'resolutionAndComponentFlags': 0, - 'latitudeOfLastGridPoint': 5000000, - 'longitudeOfLastGridPoint': 5000000, - 'iDirectionIncrement': 0, - 'jDirectionIncrement': 0, - 'scanningMode': 0b01000000, - 'numberOfOctectsForNumberOfPoints': 0, - 'interpretationOfNumberOfPoints': 0, - }) + section = _Section( + { + "Ni": 6, + "Nj": 6, + "latitudeOfFirstGridPoint": 0, + "longitudeOfFirstGridPoint": 0, + "resolutionAndComponentFlags": 0, + "latitudeOfLastGridPoint": 5000000, + "longitudeOfLastGridPoint": 5000000, + "iDirectionIncrement": 0, + "jDirectionIncrement": 0, + "scanningMode": 0b01000000, + "numberOfOctectsForNumberOfPoints": 0, + "interpretationOfNumberOfPoints": 0, + } + ) return section - def expected(self, x_dim, y_dim, x_points, y_points, x_neg=True, - y_neg=True): + def expected(self, x_dim, y_dim, x_points, y_points, x_neg=True, y_neg=True): # Prepare the expectation. expected = empty_metadata() cs = iris.coord_systems.GeogCS(6367470) if x_neg: x_points = x_points[::-1] - x = iris.coords.DimCoord(x_points, - standard_name='longitude', - units='degrees', - coord_system=cs) + x = iris.coords.DimCoord( + x_points, standard_name="longitude", units="degrees", coord_system=cs + ) if y_neg: y_points = y_points[::-1] - y = iris.coords.DimCoord(y_points, - standard_name='latitude', - units='degrees', - coord_system=cs) - expected['dim_coords_and_dims'].append((y, y_dim)) - expected['dim_coords_and_dims'].append((x, x_dim)) + y = iris.coords.DimCoord( + y_points, standard_name="latitude", units="degrees", coord_system=cs + ) + expected["dim_coords_and_dims"].append((y, y_dim)) + expected["dim_coords_and_dims"].append((x, x_dim)) return expected def test_without_increments(self): section = self.section_3() metadata = empty_metadata() cs = iris.coord_systems.GeogCS(6367470) - grid_definition_template_0_and_1(section, metadata, 'latitude', - 'longitude', cs) - x_points = np.array([0., 1., 2., 3., 4., 5.]) - y_points = np.array([0., 1., 2., 3., 4., 5.]) - expected = self.expected(1, 0, x_points, y_points, x_neg=False, - y_neg=False) + grid_definition_template_0_and_1(section, metadata, "latitude", "longitude", cs) + x_points = np.array([0.0, 1.0, 2.0, 3.0, 4.0, 5.0]) + y_points = np.array([0.0, 1.0, 2.0, 3.0, 4.0, 5.0]) + expected = self.expected(1, 0, x_points, y_points, x_neg=False, y_neg=False) self.assertEqual(metadata, expected) def test_with_increments(self): section = self.section_3() - section['resolutionAndComponentFlags'] = 48 - section['iDirectionIncrement'] = 1000000 - section['jDirectionIncrement'] = 1000000 + section["resolutionAndComponentFlags"] = 48 + section["iDirectionIncrement"] = 1000000 + section["jDirectionIncrement"] = 1000000 metadata = empty_metadata() cs = iris.coord_systems.GeogCS(6367470) - grid_definition_template_0_and_1(section, metadata, 'latitude', - 'longitude', cs) - x_points = np.array([0., 1., 2., 3., 4., 5.]) - y_points = np.array([0., 1., 2., 3., 4., 5.]) - expected = self.expected(1, 0, x_points, y_points, x_neg=False, - y_neg=False) + grid_definition_template_0_and_1(section, metadata, "latitude", "longitude", cs) + x_points = np.array([0.0, 1.0, 2.0, 3.0, 4.0, 5.0]) + y_points = np.array([0.0, 1.0, 2.0, 3.0, 4.0, 5.0]) + expected = self.expected(1, 0, x_points, y_points, x_neg=False, y_neg=False) self.assertEqual(metadata, expected) def test_with_i_not_j_increment(self): section = self.section_3() - section['resolutionAndComponentFlags'] = 32 - section['iDirectionIncrement'] = 1000000 + section["resolutionAndComponentFlags"] = 32 + section["iDirectionIncrement"] = 1000000 metadata = empty_metadata() cs = iris.coord_systems.GeogCS(6367470) - grid_definition_template_0_and_1(section, metadata, 'latitude', - 'longitude', cs) - x_points = np.array([0., 1., 2., 3., 4., 5.]) - y_points = np.array([0., 1., 2., 3., 4., 5.]) - expected = self.expected(1, 0, x_points, y_points, x_neg=False, - y_neg=False) + grid_definition_template_0_and_1(section, metadata, "latitude", "longitude", cs) + x_points = np.array([0.0, 1.0, 2.0, 3.0, 4.0, 5.0]) + y_points = np.array([0.0, 1.0, 2.0, 3.0, 4.0, 5.0]) + expected = self.expected(1, 0, x_points, y_points, x_neg=False, y_neg=False) self.assertEqual(metadata, expected) def test_with_j_not_i_increment(self): section = self.section_3() - section['resolutionAndComponentFlags'] = 16 - section['jDirectionIncrement'] = 1000000 + section["resolutionAndComponentFlags"] = 16 + section["jDirectionIncrement"] = 1000000 metadata = empty_metadata() cs = iris.coord_systems.GeogCS(6367470) - grid_definition_template_0_and_1(section, metadata, 'latitude', - 'longitude', cs) - x_points = np.array([0., 1., 2., 3., 4., 5.]) - y_points = np.array([0., 1., 2., 3., 4., 5.]) - expected = self.expected(1, 0, x_points, y_points, x_neg=False, - y_neg=False) + grid_definition_template_0_and_1(section, metadata, "latitude", "longitude", cs) + x_points = np.array([0.0, 1.0, 2.0, 3.0, 4.0, 5.0]) + y_points = np.array([0.0, 1.0, 2.0, 3.0, 4.0, 5.0]) + expected = self.expected(1, 0, x_points, y_points, x_neg=False, y_neg=False) self.assertEqual(metadata, expected) def test_without_increments_crossing_0_lon(self): section = self.section_3() - section['longitudeOfFirstGridPoint'] = 355000000 - section['Ni'] = 11 + section["longitudeOfFirstGridPoint"] = 355000000 + section["Ni"] = 11 metadata = empty_metadata() cs = iris.coord_systems.GeogCS(6367470) - grid_definition_template_0_and_1(section, metadata, 'latitude', - 'longitude', cs) + grid_definition_template_0_and_1(section, metadata, "latitude", "longitude", cs) x_points = np.array( - [355., 356., 357., 358., 359., 360., 361., 362., 363., 364., 365.] + [ + 355.0, + 356.0, + 357.0, + 358.0, + 359.0, + 360.0, + 361.0, + 362.0, + 363.0, + 364.0, + 365.0, + ] ) - y_points = np.array([0., 1., 2., 3., 4., 5.]) - expected = self.expected(1, 0, x_points, y_points, x_neg=False, - y_neg=False) + y_points = np.array([0.0, 1.0, 2.0, 3.0, 4.0, 5.0]) + expected = self.expected(1, 0, x_points, y_points, x_neg=False, y_neg=False) self.assertEqual(metadata, expected) class Test(tests.IrisGribTest): - def test_unsupported_quasi_regular__number_of_octets(self): - section = {'numberOfOctectsForNumberOfPoints': 1} + section = {"numberOfOctectsForNumberOfPoints": 1} cs = None metadata = None - with self.assertRaisesRegex(TranslationError, 'quasi-regular'): - grid_definition_template_0_and_1(section, - metadata, - 'latitude', - 'longitude', - cs) + with self.assertRaisesRegex(TranslationError, "quasi-regular"): + grid_definition_template_0_and_1( + section, metadata, "latitude", "longitude", cs + ) def test_unsupported_quasi_regular__interpretation(self): - section = {'numberOfOctectsForNumberOfPoints': 1, - 'interpretationOfNumberOfPoints': 1} + section = { + "numberOfOctectsForNumberOfPoints": 1, + "interpretationOfNumberOfPoints": 1, + } cs = None metadata = None - with self.assertRaisesRegex(TranslationError, 'quasi-regular'): - grid_definition_template_0_and_1(section, - metadata, - 'latitude', - 'longitude', - cs) + with self.assertRaisesRegex(TranslationError, "quasi-regular"): + grid_definition_template_0_and_1( + section, metadata, "latitude", "longitude", cs + ) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_10.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_10.py index 13d17a73..093f7507 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_10.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_10.py @@ -26,25 +26,25 @@ class Test(tests.IrisGribTest): def section_3(self): section = { - 'gridDefinitionTemplateNumber': 10, - 'shapeOfTheEarth': 1, - 'scaleFactorOfRadiusOfSphericalEarth': 0, - 'scaledValueOfRadiusOfSphericalEarth': 6371200, - 'scaleFactorOfEarthMajorAxis': 0, - 'scaledValueOfEarthMajorAxis': 0, - 'scaleFactorOfEarthMinorAxis': 0, - 'scaledValueOfEarthMinorAxis': 0, - 'Ni': 181, - 'Nj': 213, - 'latitudeOfFirstGridPoint': 2351555, - 'latitudeOfLastGridPoint': 25088204, - 'LaD': 14000000, - 'longitudeOfFirstGridPoint': 114990304, - 'longitudeOfLastGridPoint': 135009712, - 'resolutionAndComponentFlags': 56, - 'scanningMode': 64, - 'Di': 12000000, - 'Dj': 12000000 + "gridDefinitionTemplateNumber": 10, + "shapeOfTheEarth": 1, + "scaleFactorOfRadiusOfSphericalEarth": 0, + "scaledValueOfRadiusOfSphericalEarth": 6371200, + "scaleFactorOfEarthMajorAxis": 0, + "scaledValueOfEarthMajorAxis": 0, + "scaleFactorOfEarthMinorAxis": 0, + "scaledValueOfEarthMinorAxis": 0, + "Ni": 181, + "Nj": 213, + "latitudeOfFirstGridPoint": 2351555, + "latitudeOfLastGridPoint": 25088204, + "LaD": 14000000, + "longitudeOfFirstGridPoint": 114990304, + "longitudeOfLastGridPoint": 135009712, + "resolutionAndComponentFlags": 56, + "scanningMode": 64, + "Di": 12000000, + "Dj": 12000000, } return section @@ -52,25 +52,28 @@ def expected(self, y_dim, x_dim): # Prepare the expectation. expected = empty_metadata() ellipsoid = iris.coord_systems.GeogCS(6371200.0) - cs = iris.coord_systems.Mercator(standard_parallel=14., - ellipsoid=ellipsoid) + cs = iris.coord_systems.Mercator(standard_parallel=14.0, ellipsoid=ellipsoid) nx = 181 x_origin = 12406918.990644248 dx = 12000 - x = iris.coords.DimCoord(np.arange(nx) * dx + x_origin, - 'projection_x_coordinate', - units='m', - coord_system=cs) + x = iris.coords.DimCoord( + np.arange(nx) * dx + x_origin, + "projection_x_coordinate", + units="m", + coord_system=cs, + ) ny = 213 y_origin = 253793.10903714459 dy = 12000 - y = iris.coords.DimCoord(np.arange(ny) * dy + y_origin, - 'projection_y_coordinate', - units='m', - coord_system=cs) - expected['dim_coords_and_dims'].append((y, y_dim)) - expected['dim_coords_and_dims'].append((x, x_dim)) + y = iris.coords.DimCoord( + np.arange(ny) * dy + y_origin, + "projection_y_coordinate", + units="m", + coord_system=cs, + ) + expected["dim_coords_and_dims"].append((y, y_dim)) + expected["dim_coords_and_dims"].append((x, x_dim)) return expected def test(self): @@ -81,5 +84,5 @@ def test(self): self.assertEqual(metadata, expected) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_12.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_12.py index f75b63ae..09d46a64 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_12.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_12.py @@ -28,28 +28,28 @@ class Test(tests.IrisGribTest): def section_3(self): section = { - 'shapeOfTheEarth': 7, - 'scaleFactorOfRadiusOfSphericalEarth': MDI, - 'scaledValueOfRadiusOfSphericalEarth': MDI, - 'scaleFactorOfEarthMajorAxis': 3, - 'scaledValueOfEarthMajorAxis': 6377563396, - 'scaleFactorOfEarthMinorAxis': 3, - 'scaledValueOfEarthMinorAxis': 6356256909, - 'Ni': 4, - 'Nj': 3, - 'latitudeOfReferencePoint': 49000000, - 'longitudeOfReferencePoint': -2000000, - 'resolutionAndComponentFlags': 0, - 'scaleFactorAtReferencePoint': 0.9996012717, - 'XR': 40000000, - 'YR': -10000000, - 'scanningMode': 64, - 'Di': 200000, - 'Dj': 100000, - 'X1': 29300000, - 'Y1': 9200000, - 'X2': 29900000, - 'Y2': 9400000 + "shapeOfTheEarth": 7, + "scaleFactorOfRadiusOfSphericalEarth": MDI, + "scaledValueOfRadiusOfSphericalEarth": MDI, + "scaleFactorOfEarthMajorAxis": 3, + "scaledValueOfEarthMajorAxis": 6377563396, + "scaleFactorOfEarthMinorAxis": 3, + "scaledValueOfEarthMinorAxis": 6356256909, + "Ni": 4, + "Nj": 3, + "latitudeOfReferencePoint": 49000000, + "longitudeOfReferencePoint": -2000000, + "resolutionAndComponentFlags": 0, + "scaleFactorAtReferencePoint": 0.9996012717, + "XR": 40000000, + "YR": -10000000, + "scanningMode": 64, + "Di": 200000, + "Dj": 100000, + "X1": 29300000, + "Y1": 9200000, + "X2": 29900000, + "Y2": 9400000, } return section @@ -57,28 +57,29 @@ def expected(self, y_dim, x_dim, x_negative=False, y_negative=False): # Prepare the expectation. expected = empty_metadata() ellipsoid = iris.coord_systems.GeogCS(6377563.396, 6356256.909) - cs = iris.coord_systems.TransverseMercator(49, -2, 400000, -100000, - 0.9996012717, ellipsoid) + cs = iris.coord_systems.TransverseMercator( + 49, -2, 400000, -100000, 0.9996012717, ellipsoid + ) nx = 4 x_origin = 293000 dx = 2000 x_array = np.arange(nx) * dx + x_origin if x_negative: x_array = np.flip(x_array) - x = iris.coords.DimCoord(x_array, - 'projection_x_coordinate', units='m', - coord_system=cs) + x = iris.coords.DimCoord( + x_array, "projection_x_coordinate", units="m", coord_system=cs + ) ny = 3 y_origin = 92000 dy = 1000 y_array = np.arange(ny) * dy + y_origin if y_negative: y_array = np.flip(y_array) - y = iris.coords.DimCoord(y_array, - 'projection_y_coordinate', units='m', - coord_system=cs) - expected['dim_coords_and_dims'].append((y, y_dim)) - expected['dim_coords_and_dims'].append((x, x_dim)) + y = iris.coords.DimCoord( + y_array, "projection_y_coordinate", units="m", coord_system=cs + ) + expected["dim_coords_and_dims"].append((y, y_dim)) + expected["dim_coords_and_dims"].append((x, x_dim)) return expected def test(self): @@ -90,18 +91,18 @@ def test(self): def test_spherical(self): section = self.section_3() - section['shapeOfTheEarth'] = 0 + section["shapeOfTheEarth"] = 0 metadata = empty_metadata() grid_definition_template_12(section, metadata) expected = self.expected(0, 1) - cs = expected['dim_coords_and_dims'][0][0].coord_system + cs = expected["dim_coords_and_dims"][0][0].coord_system cs.ellipsoid = iris.coord_systems.GeogCS(6367470) self.assertEqual(metadata, expected) def test_negative_x(self): section = self.section_3() - section['scanningMode'] = 0b11000000 - section['X1'], section['X2'] = section['X2'], section['X1'] + section["scanningMode"] = 0b11000000 + section["X1"], section["X2"] = section["X2"], section["X1"] metadata = empty_metadata() grid_definition_template_12(section, metadata) expected = self.expected(0, 1, x_negative=True) @@ -109,7 +110,7 @@ def test_negative_x(self): def test_x_inconsistent_direction(self): section = self.section_3() - section['scanningMode'] = 0b11000000 + section["scanningMode"] = 0b11000000 metadata = empty_metadata() with warnings.catch_warnings(record=True) as warn: grid_definition_template_12(section, metadata) @@ -121,18 +122,16 @@ def test_x_inconsistent_direction(self): def test_x_inconsistent_steps(self): section = self.section_3() - section['Ni'] += 1 + section["Ni"] += 1 metadata = empty_metadata() - expected_regex = ( - "X definition inconsistent: .* incompatible with step-size") - with self.assertRaisesRegex(iris.exceptions.TranslationError, - expected_regex): + expected_regex = "X definition inconsistent: .* incompatible with step-size" + with self.assertRaisesRegex(iris.exceptions.TranslationError, expected_regex): grid_definition_template_12(section, metadata) def test_negative_y(self): section = self.section_3() - section['scanningMode'] = 0b00000000 - section['Y1'], section['Y2'] = section['Y2'], section['Y1'] + section["scanningMode"] = 0b00000000 + section["Y1"], section["Y2"] = section["Y2"], section["Y1"] metadata = empty_metadata() grid_definition_template_12(section, metadata) expected = self.expected(0, 1, y_negative=True) @@ -140,7 +139,7 @@ def test_negative_y(self): def test_y_inconsistent_direction(self): section = self.section_3() - section['scanningMode'] = 0b00000000 + section["scanningMode"] = 0b00000000 metadata = empty_metadata() with warnings.catch_warnings(record=True) as warn: grid_definition_template_12(section, metadata) @@ -152,17 +151,15 @@ def test_y_inconsistent_direction(self): def test_y_inconsistent_steps(self): section = self.section_3() - section['Nj'] += 1 + section["Nj"] += 1 metadata = empty_metadata() - expected_regex = ( - "Y definition inconsistent: .* incompatible with step-size") - with self.assertRaisesRegex(iris.exceptions.TranslationError, - expected_regex): + expected_regex = "Y definition inconsistent: .* incompatible with step-size" + with self.assertRaisesRegex(iris.exceptions.TranslationError, expected_regex): grid_definition_template_12(section, metadata) def test_transposed(self): section = self.section_3() - section['scanningMode'] = 0b01100000 + section["scanningMode"] = 0b01100000 metadata = empty_metadata() grid_definition_template_12(section, metadata) expected = self.expected(1, 0) @@ -172,33 +169,32 @@ def test_di_tolerance(self): # Even though Ni * Di doesn't exactly match X1 to X2 it should # be close enough to allow the translation. section = self.section_3() - section['X2'] += 1 + section["X2"] += 1 metadata = empty_metadata() grid_definition_template_12(section, metadata) expected = self.expected(0, 1) - x = expected['dim_coords_and_dims'][1][0] + x = expected["dim_coords_and_dims"][1][0] x.points = np.linspace(293000, 299000.01, 4) self.assertEqual(metadata, expected) def test_incompatible_grid_extent(self): section = self.section_3() - section['X2'] += 100 + section["X2"] += 100 metadata = empty_metadata() - with self.assertRaisesRegex(iris.exceptions.TranslationError, - 'grid'): + with self.assertRaisesRegex(iris.exceptions.TranslationError, "grid"): grid_definition_template_12(section, metadata) def test_scale_workaround(self): section = self.section_3() - section['scaleFactorAtReferencePoint'] = 1065346526 + section["scaleFactorAtReferencePoint"] = 1065346526 metadata = empty_metadata() grid_definition_template_12(section, metadata) expected = self.expected(0, 1) # A float32 can't hold exactly the same value. - cs = expected['dim_coords_and_dims'][0][0].coord_system + cs = expected["dim_coords_and_dims"][0][0].coord_system cs.scale_factor_at_central_meridian = 0.9996012449264526 self.assertEqual(metadata, expected) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_140.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_140.py index 95e4328b..a99010e3 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_140.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_140.py @@ -24,59 +24,60 @@ class Test(tests.IrisGribTest): - def section_3(self): section = { - 'gridDefinitionTemplateNumber': 140, - 'shapeOfTheEarth': 4, - 'scaleFactorOfRadiusOfSphericalEarth': MDI, - 'scaledValueOfRadiusOfSphericalEarth': MDI, - 'scaleFactorOfEarthMajorAxis': MDI, - 'scaledValueOfEarthMajorAxis': MDI, - 'scaleFactorOfEarthMinorAxis': MDI, - 'scaledValueOfEarthMinorAxis': MDI, - 'numberOfPointsAlongXAxis': 2, - 'numberOfPointsAlongYAxis': 2, - 'latitudeOfFirstGridPoint': 53988880, - 'longitudeOfFirstGridPoint': -4027984, - 'standardParallelInMicrodegrees': 54900000, - 'centralLongitudeInMicrodegrees': -2500000, - 'resolutionAndComponentFlags': 0b00110000, - 'xDirectionGridLengthInMillimetres': 2000000, - 'yDirectionGridLengthInMillimetres': 2000000, - 'scanningMode': 0b01000000, + "gridDefinitionTemplateNumber": 140, + "shapeOfTheEarth": 4, + "scaleFactorOfRadiusOfSphericalEarth": MDI, + "scaledValueOfRadiusOfSphericalEarth": MDI, + "scaleFactorOfEarthMajorAxis": MDI, + "scaledValueOfEarthMajorAxis": MDI, + "scaleFactorOfEarthMinorAxis": MDI, + "scaledValueOfEarthMinorAxis": MDI, + "numberOfPointsAlongXAxis": 2, + "numberOfPointsAlongYAxis": 2, + "latitudeOfFirstGridPoint": 53988880, + "longitudeOfFirstGridPoint": -4027984, + "standardParallelInMicrodegrees": 54900000, + "centralLongitudeInMicrodegrees": -2500000, + "resolutionAndComponentFlags": 0b00110000, + "xDirectionGridLengthInMillimetres": 2000000, + "yDirectionGridLengthInMillimetres": 2000000, + "scanningMode": 0b01000000, } return section def expected(self, y_dim, x_dim): # Prepare the expectation. expected = empty_metadata() - ellipsoid = iris.coord_systems.GeogCS( - 6378137, - inverse_flattening=298.257222101) + ellipsoid = iris.coord_systems.GeogCS(6378137, inverse_flattening=298.257222101) cs = iris.coord_systems.LambertAzimuthalEqualArea( latitude_of_projection_origin=54.9, longitude_of_projection_origin=-2.5, false_easting=0, false_northing=0, - ellipsoid=ellipsoid) + ellipsoid=ellipsoid, + ) lon0 = -4027984 * 1e-6 lat0 = 53988880 * 1e-6 - x0m, y0m = cs.as_cartopy_crs().transform_point( - lon0, lat0, ccrs.Geodetic()) - dxm = dym = 2000. + x0m, y0m = cs.as_cartopy_crs().transform_point(lon0, lat0, ccrs.Geodetic()) + dxm = dym = 2000.0 x_points = x0m + dxm * np.arange(2) y_points = y0m + dym * np.arange(2) - x = iris.coords.DimCoord(x_points, - standard_name='projection_x_coordinate', - units='m', - coord_system=cs) - y = iris.coords.DimCoord(y_points, - standard_name='projection_y_coordinate', - units='m', - coord_system=cs) - expected['dim_coords_and_dims'].append((y, y_dim)) - expected['dim_coords_and_dims'].append((x, x_dim)) + x = iris.coords.DimCoord( + x_points, + standard_name="projection_x_coordinate", + units="m", + coord_system=cs, + ) + y = iris.coords.DimCoord( + y_points, + standard_name="projection_y_coordinate", + units="m", + coord_system=cs, + ) + expected["dim_coords_and_dims"].append((y, y_dim)) + expected["dim_coords_and_dims"].append((x, x_dim)) return expected def test(self): @@ -87,5 +88,5 @@ def test(self): self.assertEqual(metadata, expected) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_20.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_20.py index 3eb17c25..949ec045 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_20.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_20.py @@ -24,28 +24,27 @@ class Test(tests.IrisGribTest): - def section_3(self): section = { - 'gridDefinitionTemplateNumber': 20, - 'shapeOfTheEarth': 0, - 'scaleFactorOfRadiusOfSphericalEarth': 0, - 'scaledValueOfRadiusOfSphericalEarth': 6367470, - 'scaleFactorOfEarthMajorAxis': 0, - 'scaledValueOfEarthMajorAxis': MDI, - 'scaleFactorOfEarthMinorAxis': 0, - 'scaledValueOfEarthMinorAxis': MDI, - 'Nx': 15, - 'Ny': 10, - 'latitudeOfFirstGridPoint': 32549114, - 'longitudeOfFirstGridPoint': 225385728, - 'resolutionAndComponentFlags': 0b00001000, - 'LaD': 60000000, - 'orientationOfTheGrid': 262000000, - 'Dx': 320000000, - 'Dy': 320000000, - 'projectionCentreFlag': 0b00000000, - 'scanningMode': 0b01000000, + "gridDefinitionTemplateNumber": 20, + "shapeOfTheEarth": 0, + "scaleFactorOfRadiusOfSphericalEarth": 0, + "scaledValueOfRadiusOfSphericalEarth": 6367470, + "scaleFactorOfEarthMajorAxis": 0, + "scaledValueOfEarthMajorAxis": MDI, + "scaleFactorOfEarthMinorAxis": 0, + "scaledValueOfEarthMinorAxis": MDI, + "Nx": 15, + "Ny": 10, + "latitudeOfFirstGridPoint": 32549114, + "longitudeOfFirstGridPoint": 225385728, + "resolutionAndComponentFlags": 0b00001000, + "LaD": 60000000, + "orientationOfTheGrid": 262000000, + "Dx": 320000000, + "Dy": 320000000, + "projectionCentreFlag": 0b00000000, + "scanningMode": 0b01000000, } return section @@ -53,30 +52,35 @@ def expected(self, y_dim, x_dim): # Prepare the expectation. expected = empty_metadata() ellipsoid = iris.coord_systems.GeogCS(6367470) - cs = iris.coord_systems.Stereographic(central_lat=90., - central_lon=262., - false_easting=0, - false_northing=0, - true_scale_lat=60., - ellipsoid=ellipsoid) + cs = iris.coord_systems.Stereographic( + central_lat=90.0, + central_lon=262.0, + false_easting=0, + false_northing=0, + true_scale_lat=60.0, + ellipsoid=ellipsoid, + ) lon0 = 225385728 * 1e-6 lat0 = 32549114 * 1e-6 - x0m, y0m = cs.as_cartopy_crs().transform_point( - lon0, lat0, ccrs.Geodetic()) - dxm = dym = 320000. + x0m, y0m = cs.as_cartopy_crs().transform_point(lon0, lat0, ccrs.Geodetic()) + dxm = dym = 320000.0 x_points = x0m + dxm * np.arange(15) y_points = y0m + dym * np.arange(10) - x = iris.coords.DimCoord(x_points, - standard_name='projection_x_coordinate', - units='m', - coord_system=cs, - circular=False) - y = iris.coords.DimCoord(y_points, - standard_name='projection_y_coordinate', - units='m', - coord_system=cs) - expected['dim_coords_and_dims'].append((y, y_dim)) - expected['dim_coords_and_dims'].append((x, x_dim)) + x = iris.coords.DimCoord( + x_points, + standard_name="projection_x_coordinate", + units="m", + coord_system=cs, + circular=False, + ) + y = iris.coords.DimCoord( + y_points, + standard_name="projection_y_coordinate", + units="m", + coord_system=cs, + ) + expected["dim_coords_and_dims"].append((y, y_dim)) + expected["dim_coords_and_dims"].append((x, x_dim)) return expected def test(self): @@ -87,5 +91,5 @@ def test(self): self.assertEqual(metadata, expected) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_30.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_30.py index a52a33e2..635bf173 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_30.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_30.py @@ -24,30 +24,29 @@ class Test(tests.IrisGribTest): - def section_3(self): section = { - 'gridDefinitionTemplateNumber': 30, - 'shapeOfTheEarth': 0, - 'scaleFactorOfRadiusOfSphericalEarth': 0, - 'scaledValueOfRadiusOfSphericalEarth': 6367470, - 'scaleFactorOfEarthMajorAxis': 0, - 'scaledValueOfEarthMajorAxis': MDI, - 'scaleFactorOfEarthMinorAxis': 0, - 'scaledValueOfEarthMinorAxis': MDI, - 'Nx': 15, - 'Ny': 10, - 'longitudeOfFirstGridPoint': 239550000, - 'latitudeOfFirstGridPoint': 21641000, - 'resolutionAndComponentFlags': 0b00001000, - 'LaD': 60000000, - 'LoV': 262000000, - 'Dx': 320000000, - 'Dy': 320000000, - 'projectionCentreFlag': 0b00000000, - 'scanningMode': 0b01000000, - 'Latin1': 60000000, - 'Latin2': 30000000, + "gridDefinitionTemplateNumber": 30, + "shapeOfTheEarth": 0, + "scaleFactorOfRadiusOfSphericalEarth": 0, + "scaledValueOfRadiusOfSphericalEarth": 6367470, + "scaleFactorOfEarthMajorAxis": 0, + "scaledValueOfEarthMajorAxis": MDI, + "scaleFactorOfEarthMinorAxis": 0, + "scaledValueOfEarthMinorAxis": MDI, + "Nx": 15, + "Ny": 10, + "longitudeOfFirstGridPoint": 239550000, + "latitudeOfFirstGridPoint": 21641000, + "resolutionAndComponentFlags": 0b00001000, + "LaD": 60000000, + "LoV": 262000000, + "Dx": 320000000, + "Dy": 320000000, + "projectionCentreFlag": 0b00000000, + "scanningMode": 0b01000000, + "Latin1": 60000000, + "Latin2": 30000000, } return section @@ -56,30 +55,34 @@ def expected(self, y_dim, x_dim): expected = empty_metadata() cs = iris.coord_systems.GeogCS(6367470) cs = iris.coord_systems.LambertConformal( - central_lat=60., - central_lon=262., + central_lat=60.0, + central_lon=262.0, false_easting=0, false_northing=0, - secant_latitudes=(60., 30.), - ellipsoid=iris.coord_systems.GeogCS(6367470)) + secant_latitudes=(60.0, 30.0), + ellipsoid=iris.coord_systems.GeogCS(6367470), + ) lon0 = 239.55 lat0 = 21.641 - x0m, y0m = cs.as_cartopy_crs().transform_point( - lon0, lat0, ccrs.Geodetic()) - dxm = dym = 320000. + x0m, y0m = cs.as_cartopy_crs().transform_point(lon0, lat0, ccrs.Geodetic()) + dxm = dym = 320000.0 x_points = x0m + dxm * np.arange(15) y_points = y0m + dym * np.arange(10) - x = iris.coords.DimCoord(x_points, - standard_name='projection_x_coordinate', - units='m', - coord_system=cs, - circular=False) - y = iris.coords.DimCoord(y_points, - standard_name='projection_y_coordinate', - units='m', - coord_system=cs) - expected['dim_coords_and_dims'].append((y, y_dim)) - expected['dim_coords_and_dims'].append((x, x_dim)) + x = iris.coords.DimCoord( + x_points, + standard_name="projection_x_coordinate", + units="m", + coord_system=cs, + circular=False, + ) + y = iris.coords.DimCoord( + y_points, + standard_name="projection_y_coordinate", + units="m", + coord_system=cs, + ) + expected["dim_coords_and_dims"].append((y, y_dim)) + expected["dim_coords_and_dims"].append((x, x_dim)) return expected def test(self): @@ -90,5 +93,5 @@ def test(self): self.assertEqual(metadata, expected) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_40.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_40.py index a05d4181..0b4cca01 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_40.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_40.py @@ -29,28 +29,37 @@ def get_computed_key(self, key): class Test_regular(tests.IrisGribTest): - def section_3(self): - section = _Section({ - 'shapeOfTheEarth': 0, - 'scaleFactorOfRadiusOfSphericalEarth': 0, - 'scaledValueOfRadiusOfSphericalEarth': 6367470, - 'scaleFactorOfEarthMajorAxis': 0, - 'scaledValueOfEarthMajorAxis': MDI, - 'scaleFactorOfEarthMinorAxis': 0, - 'scaledValueOfEarthMinorAxis': MDI, - 'iDirectionIncrement': 22500000, - 'longitudeOfFirstGridPoint': 0, - 'resolutionAndComponentFlags': 32, - 'Ni': 16, - 'scanningMode': 0b01000000, - 'distinctLatitudes': np.array([-73.79921363, -52.81294319, - -31.70409175, -10.56988231, - 10.56988231, 31.70409175, - 52.81294319, 73.79921363]), - 'numberOfOctectsForNumberOfPoints': 0, - 'interpretationOfNumberOfPoints': 0, - }) + section = _Section( + { + "shapeOfTheEarth": 0, + "scaleFactorOfRadiusOfSphericalEarth": 0, + "scaledValueOfRadiusOfSphericalEarth": 6367470, + "scaleFactorOfEarthMajorAxis": 0, + "scaledValueOfEarthMajorAxis": MDI, + "scaleFactorOfEarthMinorAxis": 0, + "scaledValueOfEarthMinorAxis": MDI, + "iDirectionIncrement": 22500000, + "longitudeOfFirstGridPoint": 0, + "resolutionAndComponentFlags": 32, + "Ni": 16, + "scanningMode": 0b01000000, + "distinctLatitudes": np.array( + [ + -73.79921363, + -52.81294319, + -31.70409175, + -10.56988231, + 10.56988231, + 31.70409175, + 52.81294319, + 73.79921363, + ] + ), + "numberOfOctectsForNumberOfPoints": 0, + "interpretationOfNumberOfPoints": 0, + } + ) return section def expected(self, y_dim, x_dim, y_neg=True): @@ -60,23 +69,32 @@ def expected(self, y_dim, x_dim, y_neg=True): nx = 16 dx = 22.5 x_origin = 0 - x = iris.coords.DimCoord(np.arange(nx) * dx + x_origin, - standard_name='longitude', - units='degrees_east', - coord_system=cs, - circular=True) - y_points = np.array([73.79921363, 52.81294319, - 31.70409175, 10.56988231, - -10.56988231, -31.70409175, - -52.81294319, -73.79921363]) + x = iris.coords.DimCoord( + np.arange(nx) * dx + x_origin, + standard_name="longitude", + units="degrees_east", + coord_system=cs, + circular=True, + ) + y_points = np.array( + [ + 73.79921363, + 52.81294319, + 31.70409175, + 10.56988231, + -10.56988231, + -31.70409175, + -52.81294319, + -73.79921363, + ] + ) if not y_neg: y_points = y_points[::-1] - y = iris.coords.DimCoord(y_points, - standard_name='latitude', - units='degrees_north', - coord_system=cs) - expected['dim_coords_and_dims'].append((y, y_dim)) - expected['dim_coords_and_dims'].append((x, x_dim)) + y = iris.coords.DimCoord( + y_points, standard_name="latitude", units="degrees_north", coord_system=cs + ) + expected["dim_coords_and_dims"].append((y, y_dim)) + expected["dim_coords_and_dims"].append((x, x_dim)) return expected def test(self): @@ -88,7 +106,7 @@ def test(self): def test_transposed(self): section = self.section_3() - section['scanningMode'] = 0b01100000 + section["scanningMode"] = 0b01100000 metadata = empty_metadata() grid_definition_template_40(section, metadata) expected = self.expected(1, 0, y_neg=False) @@ -96,7 +114,7 @@ def test_transposed(self): def test_reverse_latitude(self): section = self.section_3() - section['scanningMode'] = 0b00000000 + section["scanningMode"] = 0b00000000 metadata = empty_metadata() grid_definition_template_40(section, metadata) expected = self.expected(0, 1, y_neg=True) @@ -104,51 +122,68 @@ def test_reverse_latitude(self): class Test_reduced(tests.IrisGribTest): - def section_3(self): - section = _Section({ - 'shapeOfTheEarth': 0, - 'scaleFactorOfRadiusOfSphericalEarth': 0, - 'scaledValueOfRadiusOfSphericalEarth': 6367470, - 'scaleFactorOfEarthMajorAxis': 0, - 'scaledValueOfEarthMajorAxis': MDI, - 'scaleFactorOfEarthMinorAxis': 0, - 'scaledValueOfEarthMinorAxis': MDI, - 'longitudes': np.array([0., 180., - 0., 120., 240., - 0., 120., 240., - 0., 180.]), - 'latitudes': np.array([-59.44440829, -59.44440829, - -19.87571915, -19.87571915, -19.87571915, - 19.87571915, 19.87571915, 19.87571915, - 59.44440829, 59.44440829]), - 'numberOfOctectsForNumberOfPoints': 1, - 'interpretationOfNumberOfPoints': 1, - }) + section = _Section( + { + "shapeOfTheEarth": 0, + "scaleFactorOfRadiusOfSphericalEarth": 0, + "scaledValueOfRadiusOfSphericalEarth": 6367470, + "scaleFactorOfEarthMajorAxis": 0, + "scaledValueOfEarthMajorAxis": MDI, + "scaleFactorOfEarthMinorAxis": 0, + "scaledValueOfEarthMinorAxis": MDI, + "longitudes": np.array( + [0.0, 180.0, 0.0, 120.0, 240.0, 0.0, 120.0, 240.0, 0.0, 180.0] + ), + "latitudes": np.array( + [ + -59.44440829, + -59.44440829, + -19.87571915, + -19.87571915, + -19.87571915, + 19.87571915, + 19.87571915, + 19.87571915, + 59.44440829, + 59.44440829, + ] + ), + "numberOfOctectsForNumberOfPoints": 1, + "interpretationOfNumberOfPoints": 1, + } + ) return section def expected(self): # Prepare the expectation. expected = empty_metadata() cs = iris.coord_systems.GeogCS(6367470) - x_points = np.array([0., 180., - 0., 120., 240., - 0., 120., 240., - 0., 180.]) - y_points = np.array([-59.44440829, -59.44440829, - -19.87571915, -19.87571915, -19.87571915, - 19.87571915, 19.87571915, 19.87571915, - 59.44440829, 59.44440829]) - x = iris.coords.AuxCoord(x_points, - standard_name='longitude', - units='degrees_east', - coord_system=cs) - y = iris.coords.AuxCoord(y_points, - standard_name='latitude', - units='degrees_north', - coord_system=cs) - expected['aux_coords_and_dims'].append((y, 0)) - expected['aux_coords_and_dims'].append((x, 0)) + x_points = np.array( + [0.0, 180.0, 0.0, 120.0, 240.0, 0.0, 120.0, 240.0, 0.0, 180.0] + ) + y_points = np.array( + [ + -59.44440829, + -59.44440829, + -19.87571915, + -19.87571915, + -19.87571915, + 19.87571915, + 19.87571915, + 19.87571915, + 59.44440829, + 59.44440829, + ] + ) + x = iris.coords.AuxCoord( + x_points, standard_name="longitude", units="degrees_east", coord_system=cs + ) + y = iris.coords.AuxCoord( + y_points, standard_name="latitude", units="degrees_north", coord_system=cs + ) + expected["aux_coords_and_dims"].append((y, 0)) + expected["aux_coords_and_dims"].append((x, 0)) return expected def test(self): @@ -159,5 +194,5 @@ def test(self): self.assertEqual(metadata, expected) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_4_and_5.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_4_and_5.py index c7114e65..6cfafda6 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_4_and_5.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_4_and_5.py @@ -19,8 +19,7 @@ from iris.coords import DimCoord import numpy as np -from iris_grib._load_convert import (grid_definition_template_4_and_5, - _MDI as MDI) +from iris_grib._load_convert import grid_definition_template_4_and_5, _MDI as MDI RESOLUTION = 1e6 @@ -28,96 +27,116 @@ class Test(tests.IrisGribTest): def setUp(self): - self.patch('warnings.warn') - self.patch('iris_grib._load_convert._is_circular', return_value=False) - self.metadata = {'factories': [], 'references': [], - 'standard_name': None, - 'long_name': None, 'units': None, 'attributes': {}, - 'cell_methods': [], 'dim_coords_and_dims': [], - 'aux_coords_and_dims': []} + self.patch("warnings.warn") + self.patch("iris_grib._load_convert._is_circular", return_value=False) + self.metadata = { + "factories": [], + "references": [], + "standard_name": None, + "long_name": None, + "units": None, + "attributes": {}, + "cell_methods": [], + "dim_coords_and_dims": [], + "aux_coords_and_dims": [], + } self.cs = mock.sentinel.coord_system self.data = np.arange(10, dtype=np.float64) - def _check(self, section, request_warning, - expect_warning=False, y_dim=0, x_dim=1): - this = 'iris_grib._load_convert.options' + def _check(self, section, request_warning, expect_warning=False, y_dim=0, x_dim=1): + this = "iris_grib._load_convert.options" with mock.patch(this, warn_on_unsupported=request_warning): metadata = deepcopy(self.metadata) # The called being tested. - grid_definition_template_4_and_5(section, metadata, - 'latitude', 'longitude', self.cs) + grid_definition_template_4_and_5( + section, metadata, "latitude", "longitude", self.cs + ) expected = deepcopy(self.metadata) - coord = DimCoord(self.data, - standard_name='latitude', - units='degrees', - coord_system=self.cs) - expected['dim_coords_and_dims'].append((coord, y_dim)) - coord = DimCoord(self.data, - standard_name='longitude', - units='degrees', - coord_system=self.cs) - expected['dim_coords_and_dims'].append((coord, x_dim)) + coord = DimCoord( + self.data, + standard_name="latitude", + units="degrees", + coord_system=self.cs, + ) + expected["dim_coords_and_dims"].append((coord, y_dim)) + coord = DimCoord( + self.data, + standard_name="longitude", + units="degrees", + coord_system=self.cs, + ) + expected["dim_coords_and_dims"].append((coord, x_dim)) self.assertEqual(metadata, expected) if expect_warning: self.assertEqual(len(warnings.warn.mock_calls), 1) args, kwargs = warnings.warn.call_args - self.assertIn('resolution and component flags', args[0]) + self.assertIn("resolution and component flags", args[0]) else: self.assertEqual(len(warnings.warn.mock_calls), 0) def test_resolution_default_0(self): for request_warn in [False, True]: - section = {'basicAngleOfTheInitialProductionDomain': 0, - 'subdivisionsOfBasicAngle': 0, - 'resolutionAndComponentFlags': 0, - 'longitudes': self.data * RESOLUTION, - 'latitudes': self.data * RESOLUTION, - 'scanningMode': 0} + section = { + "basicAngleOfTheInitialProductionDomain": 0, + "subdivisionsOfBasicAngle": 0, + "resolutionAndComponentFlags": 0, + "longitudes": self.data * RESOLUTION, + "latitudes": self.data * RESOLUTION, + "scanningMode": 0, + } self._check(section, request_warn) def test_resolution_default_mdi(self): for request_warn in [False, True]: - section = {'basicAngleOfTheInitialProductionDomain': MDI, - 'subdivisionsOfBasicAngle': MDI, - 'resolutionAndComponentFlags': 0, - 'longitudes': self.data * RESOLUTION, - 'latitudes': self.data * RESOLUTION, - 'scanningMode': 0} + section = { + "basicAngleOfTheInitialProductionDomain": MDI, + "subdivisionsOfBasicAngle": MDI, + "resolutionAndComponentFlags": 0, + "longitudes": self.data * RESOLUTION, + "latitudes": self.data * RESOLUTION, + "scanningMode": 0, + } self._check(section, request_warn) def test_resolution(self): angle = 10 for request_warn in [False, True]: - section = {'basicAngleOfTheInitialProductionDomain': 1, - 'subdivisionsOfBasicAngle': angle, - 'resolutionAndComponentFlags': 0, - 'longitudes': self.data * angle, - 'latitudes': self.data * angle, - 'scanningMode': 0} + section = { + "basicAngleOfTheInitialProductionDomain": 1, + "subdivisionsOfBasicAngle": angle, + "resolutionAndComponentFlags": 0, + "longitudes": self.data * angle, + "latitudes": self.data * angle, + "scanningMode": 0, + } self._check(section, request_warn) def test_uv_resolved_warn(self): angle = 100 for warn in [False, True]: - section = {'basicAngleOfTheInitialProductionDomain': 1, - 'subdivisionsOfBasicAngle': angle, - 'resolutionAndComponentFlags': 0x08, - 'longitudes': self.data * angle, - 'latitudes': self.data * angle, - 'scanningMode': 0} + section = { + "basicAngleOfTheInitialProductionDomain": 1, + "subdivisionsOfBasicAngle": angle, + "resolutionAndComponentFlags": 0x08, + "longitudes": self.data * angle, + "latitudes": self.data * angle, + "scanningMode": 0, + } self._check(section, warn, expect_warning=warn) def test_j_consecutive(self): angle = 1000 for request_warn in [False, True]: - section = {'basicAngleOfTheInitialProductionDomain': 1, - 'subdivisionsOfBasicAngle': angle, - 'resolutionAndComponentFlags': 0, - 'longitudes': self.data * angle, - 'latitudes': self.data * angle, - 'scanningMode': 0x20} + section = { + "basicAngleOfTheInitialProductionDomain": 1, + "subdivisionsOfBasicAngle": angle, + "resolutionAndComponentFlags": 0, + "longitudes": self.data * angle, + "latitudes": self.data * angle, + "scanningMode": 0x20, + } self._check(section, request_warn, y_dim=1, x_dim=0) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_5.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_5.py index 90994294..4662db5e 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_5.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_5.py @@ -21,64 +21,78 @@ class Test(tests.IrisGribTest): def setUp(self): def func(s, m, y, x, c): - return m['dim_coords_and_dims'].append(item) + return m["dim_coords_and_dims"].append(item) - module = 'iris_grib._load_convert' + module = "iris_grib._load_convert" self.major = mock.sentinel.major self.minor = mock.sentinel.minor self.radius = mock.sentinel.radius - mfunc = '{}.ellipsoid_geometry'.format(module) + mfunc = "{}.ellipsoid_geometry".format(module) return_value = (self.major, self.minor, self.radius) self.patch(mfunc, return_value=return_value) - mfunc = '{}.ellipsoid'.format(module) + mfunc = "{}.ellipsoid".format(module) self.ellipsoid = mock.sentinel.ellipsoid self.patch(mfunc, return_value=self.ellipsoid) - mfunc = '{}.grid_definition_template_4_and_5'.format(module) + mfunc = "{}.grid_definition_template_4_and_5".format(module) self.coord = mock.sentinel.coord self.dim = mock.sentinel.dim item = (self.coord, self.dim) self.patch(mfunc, side_effect=func) - mclass = 'iris.coord_systems.RotatedGeogCS' + mclass = "iris.coord_systems.RotatedGeogCS" self.cs = mock.sentinel.cs self.patch(mclass, return_value=self.cs) - self.metadata = {'factories': [], 'references': [], - 'standard_name': None, - 'long_name': None, 'units': None, 'attributes': {}, - 'cell_methods': [], 'dim_coords_and_dims': [], - 'aux_coords_and_dims': []} + self.metadata = { + "factories": [], + "references": [], + "standard_name": None, + "long_name": None, + "units": None, + "attributes": {}, + "cell_methods": [], + "dim_coords_and_dims": [], + "aux_coords_and_dims": [], + } def test(self): metadata = deepcopy(self.metadata) angleOfRotation = mock.sentinel.angleOfRotation shapeOfTheEarth = mock.sentinel.shapeOfTheEarth - section = {'latitudeOfSouthernPole': 45000000, - 'longitudeOfSouthernPole': 90000000, - 'angleOfRotation': angleOfRotation, - 'shapeOfTheEarth': shapeOfTheEarth} + section = { + "latitudeOfSouthernPole": 45000000, + "longitudeOfSouthernPole": 90000000, + "angleOfRotation": angleOfRotation, + "shapeOfTheEarth": shapeOfTheEarth, + } # The called being tested. grid_definition_template_5(section, metadata) - from iris_grib._load_convert import \ - ellipsoid_geometry, \ - ellipsoid, \ - grid_definition_template_4_and_5 as gdt_4_5 + from iris_grib._load_convert import ( + ellipsoid_geometry, + ellipsoid, + grid_definition_template_4_and_5 as gdt_4_5, + ) + self.assertEqual(ellipsoid_geometry.call_count, 1) - ellipsoid.assert_called_once_with(shapeOfTheEarth, self.major, - self.minor, self.radius) + ellipsoid.assert_called_once_with( + shapeOfTheEarth, self.major, self.minor, self.radius + ) from iris.coord_systems import RotatedGeogCS - RotatedGeogCS.assert_called_once_with(-45.0, 270.0, angleOfRotation, - self.ellipsoid) - gdt_4_5.assert_called_once_with(section, metadata, 'grid_latitude', - 'grid_longitude', self.cs) + + RotatedGeogCS.assert_called_once_with( + -45.0, 270.0, angleOfRotation, self.ellipsoid + ) + gdt_4_5.assert_called_once_with( + section, metadata, "grid_latitude", "grid_longitude", self.cs + ) expected = deepcopy(self.metadata) - expected['dim_coords_and_dims'].append((self.coord, self.dim)) + expected["dim_coords_and_dims"].append((self.coord, self.dim)) self.assertEqual(metadata, expected) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_90.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_90.py index cdbf0fd9..202132d2 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_90.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_90.py @@ -27,27 +27,27 @@ class Test(tests.IrisGribTest): def uk(self): section = { - 'shapeOfTheEarth': 3, - 'scaleFactorOfRadiusOfSphericalEarth': MDI, - 'scaledValueOfRadiusOfSphericalEarth': MDI, - 'scaleFactorOfEarthMajorAxis': 4, - 'scaledValueOfEarthMajorAxis': 63781688, - 'scaleFactorOfEarthMinorAxis': 4, - 'scaledValueOfEarthMinorAxis': 63565840, - 'Nx': 390, - 'Ny': 227, - 'latitudeOfSubSatellitePoint': 0, - 'longitudeOfSubSatellitePoint': 0, - 'resolutionAndComponentFlags': 0, - 'dx': 3622, - 'dy': 3610, - 'Xp': 1856000, - 'Yp': 1856000, - 'scanningMode': 192, - 'orientationOfTheGrid': 0, - 'Nr': 6610674, - 'Xo': 1733, - 'Yo': 3320 + "shapeOfTheEarth": 3, + "scaleFactorOfRadiusOfSphericalEarth": MDI, + "scaledValueOfRadiusOfSphericalEarth": MDI, + "scaleFactorOfEarthMajorAxis": 4, + "scaledValueOfEarthMajorAxis": 63781688, + "scaleFactorOfEarthMinorAxis": 4, + "scaledValueOfEarthMinorAxis": 63565840, + "Nx": 390, + "Ny": 227, + "latitudeOfSubSatellitePoint": 0, + "longitudeOfSubSatellitePoint": 0, + "resolutionAndComponentFlags": 0, + "dx": 3622, + "dy": 3610, + "Xp": 1856000, + "Yp": 1856000, + "scanningMode": 192, + "orientationOfTheGrid": 0, + "Nr": 6610674, + "Xo": 1733, + "Yo": 3320, } return section @@ -63,57 +63,74 @@ def expected_uk(self, y_dim, x_dim): latitude_of_projection_origin=lat, longitude_of_projection_origin=lon, perspective_point_height=height, - sweep_angle_axis='y', + sweep_angle_axis="y", false_easting=easting, false_northing=northing, - ellipsoid=ellipsoid) + ellipsoid=ellipsoid, + ) nx = 390 x_origin = 0.010313624253429191 dx = -8.38506036864162e-05 - x = iris.coords.DimCoord(np.arange(nx) * dx + x_origin, - 'projection_x_coordinate', units='radians', - coord_system=cs) + x = iris.coords.DimCoord( + np.arange(nx) * dx + x_origin, + "projection_x_coordinate", + units="radians", + coord_system=cs, + ) ny = 227 y_origin = 0.12275487535118533 dy = 8.384895857321404e-05 - y = iris.coords.DimCoord(np.arange(ny) * dy + y_origin, - 'projection_y_coordinate', units='radians', - coord_system=cs) - expected['dim_coords_and_dims'].append((y, y_dim)) - expected['dim_coords_and_dims'].append((x, x_dim)) + y = iris.coords.DimCoord( + np.arange(ny) * dy + y_origin, + "projection_y_coordinate", + units="radians", + coord_system=cs, + ) + expected["dim_coords_and_dims"].append((y, y_dim)) + expected["dim_coords_and_dims"].append((x, x_dim)) return expected def compare(self, metadata, expected): # Compare the result with the expectation. - self.assertEqual(len(metadata['dim_coords_and_dims']), - len(expected['dim_coords_and_dims'])) - for result_pair, expected_pair in zip(metadata['dim_coords_and_dims'], - expected['dim_coords_and_dims']): + self.assertEqual( + len(metadata["dim_coords_and_dims"]), len(expected["dim_coords_and_dims"]) + ) + for result_pair, expected_pair in zip( + metadata["dim_coords_and_dims"], expected["dim_coords_and_dims"] + ): result_coord, result_dims = result_pair expected_coord, expected_dims = expected_pair # Take copies for safety, as we are going to modify them. - result_coord, expected_coord = [co.copy() for co in - (result_coord, expected_coord)] + result_coord, expected_coord = [ + co.copy() for co in (result_coord, expected_coord) + ] # Ensure the dims match. self.assertEqual(result_dims, expected_dims) # Ensure the coordinate systems match (allowing for precision). result_cs = result_coord.coord_system expected_cs = expected_coord.coord_system self.assertEqual(type(result_cs), type(expected_cs)) - self.assertEqual(result_cs.latitude_of_projection_origin, - expected_cs.latitude_of_projection_origin) - self.assertEqual(result_cs.longitude_of_projection_origin, - expected_cs.longitude_of_projection_origin) - self.assertAlmostEqual(result_cs.perspective_point_height, - expected_cs.perspective_point_height) - self.assertEqual(result_cs.false_easting, - expected_cs.false_easting) - self.assertEqual(result_cs.false_northing, - expected_cs.false_northing) - self.assertAlmostEqual(result_cs.ellipsoid.semi_major_axis, - expected_cs.ellipsoid.semi_major_axis) - self.assertEqual(result_cs.ellipsoid.semi_minor_axis, - expected_cs.ellipsoid.semi_minor_axis) + self.assertEqual( + result_cs.latitude_of_projection_origin, + expected_cs.latitude_of_projection_origin, + ) + self.assertEqual( + result_cs.longitude_of_projection_origin, + expected_cs.longitude_of_projection_origin, + ) + self.assertAlmostEqual( + result_cs.perspective_point_height, expected_cs.perspective_point_height + ) + self.assertEqual(result_cs.false_easting, expected_cs.false_easting) + self.assertEqual(result_cs.false_northing, expected_cs.false_northing) + self.assertAlmostEqual( + result_cs.ellipsoid.semi_major_axis, + expected_cs.ellipsoid.semi_major_axis, + ) + self.assertEqual( + result_cs.ellipsoid.semi_minor_axis, + expected_cs.ellipsoid.semi_minor_axis, + ) # Now we can ignore the coordinate systems and compare the # rest of the coordinate attributes. result_coord.coord_system = None @@ -121,12 +138,10 @@ def compare(self, metadata, expected): # Likewise, first compare the points (and optional bounds) # *approximately*, then force those equal + compare other aspects. - self.assertArrayAlmostEqual(result_coord.points, - expected_coord.points) + self.assertArrayAlmostEqual(result_coord.points, expected_coord.points) result_coord.points = expected_coord.points if result_coord.has_bounds() and expected_coord.has_bounds(): - self.assertArrayAlmostEqual(result_coord.bounds, - expected_coord.bounds) + self.assertArrayAlmostEqual(result_coord.bounds, expected_coord.bounds) result_coord.bounds = expected_coord.bounds # Compare the coords, having equalised the array values. @@ -134,7 +149,7 @@ def compare(self, metadata, expected): # Ensure no other metadata was created. for name in expected.keys(): - if name == 'dim_coords_and_dims': + if name == "dim_coords_and_dims": continue self.assertEqual(metadata[name], expected[name]) @@ -147,7 +162,7 @@ def test_uk(self): def test_uk_transposed(self): section = self.uk() - section['scanningMode'] = 0b11100000 + section["scanningMode"] = 0b11100000 metadata = empty_metadata() grid_definition_template_90(section, metadata) expected = self.expected_uk(1, 0) @@ -155,50 +170,48 @@ def test_uk_transposed(self): def test_non_zero_latitude(self): section = self.uk() - section['latitudeOfSubSatellitePoint'] = 1 + section["latitudeOfSubSatellitePoint"] = 1 metadata = empty_metadata() - with self.assertRaisesRegex(iris.exceptions.TranslationError, - 'non-zero latitude'): + with self.assertRaisesRegex( + iris.exceptions.TranslationError, "non-zero latitude" + ): grid_definition_template_90(section, metadata) def test_rotated_meridian(self): section = self.uk() - section['orientationOfTheGrid'] = 1 + section["orientationOfTheGrid"] = 1 metadata = empty_metadata() - with self.assertRaisesRegex(iris.exceptions.TranslationError, - 'orientation'): + with self.assertRaisesRegex(iris.exceptions.TranslationError, "orientation"): grid_definition_template_90(section, metadata) def test_zero_height(self): section = self.uk() - section['Nr'] = 0 + section["Nr"] = 0 metadata = empty_metadata() - with self.assertRaisesRegex(iris.exceptions.TranslationError, - 'zero'): + with self.assertRaisesRegex(iris.exceptions.TranslationError, "zero"): grid_definition_template_90(section, metadata) def test_orthographic(self): section = self.uk() - section['Nr'] = MDI + section["Nr"] = MDI metadata = empty_metadata() - with self.assertRaisesRegex(iris.exceptions.TranslationError, - 'orthographic'): + with self.assertRaisesRegex(iris.exceptions.TranslationError, "orthographic"): grid_definition_template_90(section, metadata) def test_scanning_mode_positive_x(self): section = self.uk() - section['scanningMode'] = 0b01000000 + section["scanningMode"] = 0b01000000 metadata = empty_metadata() - with self.assertRaisesRegex(iris.exceptions.TranslationError, r'\+x'): + with self.assertRaisesRegex(iris.exceptions.TranslationError, r"\+x"): grid_definition_template_90(section, metadata) def test_scanning_mode_negative_y(self): section = self.uk() - section['scanningMode'] = 0b10000000 + section["scanningMode"] = 0b10000000 metadata = empty_metadata() - with self.assertRaisesRegex(iris.exceptions.TranslationError, '-y'): + with self.assertRaisesRegex(iris.exceptions.TranslationError, "-y"): grid_definition_template_90(section, metadata) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_other_time_coord.py b/iris_grib/tests/unit/load_convert/test_other_time_coord.py index ecac767c..18226c81 100644 --- a/iris_grib/tests/unit/load_convert/test_other_time_coord.py +++ b/iris_grib/tests/unit/load_convert/test_other_time_coord.py @@ -18,89 +18,93 @@ class TestValid(tests.IrisGribTest): def test_t(self): - rt = iris.coords.DimCoord(48, 'time', units='hours since epoch') - fp = iris.coords.DimCoord(6, 'forecast_period', units='hours') + rt = iris.coords.DimCoord(48, "time", units="hours since epoch") + fp = iris.coords.DimCoord(6, "forecast_period", units="hours") result = other_time_coord(rt, fp) - expected = iris.coords.DimCoord(42, 'forecast_reference_time', - units='hours since epoch') + expected = iris.coords.DimCoord( + 42, "forecast_reference_time", units="hours since epoch" + ) self.assertEqual(result, expected) def test_frt(self): - rt = iris.coords.DimCoord(48, 'forecast_reference_time', - units='hours since epoch') - fp = iris.coords.DimCoord(6, 'forecast_period', units='hours') + rt = iris.coords.DimCoord( + 48, "forecast_reference_time", units="hours since epoch" + ) + fp = iris.coords.DimCoord(6, "forecast_period", units="hours") result = other_time_coord(rt, fp) - expected = iris.coords.DimCoord(54, 'time', units='hours since epoch') + expected = iris.coords.DimCoord(54, "time", units="hours since epoch") self.assertEqual(result, expected) class TestInvalid(tests.IrisGribTest): def test_t_with_bounds(self): - rt = iris.coords.DimCoord(48, 'time', units='hours since epoch', - bounds=[36, 60]) - fp = iris.coords.DimCoord(6, 'forecast_period', units='hours') - with self.assertRaisesRegex(ValueError, 'bounds'): + rt = iris.coords.DimCoord( + 48, "time", units="hours since epoch", bounds=[36, 60] + ) + fp = iris.coords.DimCoord(6, "forecast_period", units="hours") + with self.assertRaisesRegex(ValueError, "bounds"): other_time_coord(rt, fp) def test_frt_with_bounds(self): - rt = iris.coords.DimCoord(48, 'forecast_reference_time', - units='hours since epoch', - bounds=[42, 54]) - fp = iris.coords.DimCoord(6, 'forecast_period', units='hours') - with self.assertRaisesRegex(ValueError, 'bounds'): + rt = iris.coords.DimCoord( + 48, "forecast_reference_time", units="hours since epoch", bounds=[42, 54] + ) + fp = iris.coords.DimCoord(6, "forecast_period", units="hours") + with self.assertRaisesRegex(ValueError, "bounds"): other_time_coord(rt, fp) def test_fp_with_bounds(self): - rt = iris.coords.DimCoord(48, 'time', units='hours since epoch') - fp = iris.coords.DimCoord(6, 'forecast_period', units='hours', - bounds=[3, 9]) - with self.assertRaisesRegex(ValueError, 'bounds'): + rt = iris.coords.DimCoord(48, "time", units="hours since epoch") + fp = iris.coords.DimCoord(6, "forecast_period", units="hours", bounds=[3, 9]) + with self.assertRaisesRegex(ValueError, "bounds"): other_time_coord(rt, fp) def test_vector_t(self): - rt = iris.coords.DimCoord([0, 3], 'time', units='hours since epoch') - fp = iris.coords.DimCoord(6, 'forecast_period', units='hours') - with self.assertRaisesRegex(ValueError, 'Vector'): + rt = iris.coords.DimCoord([0, 3], "time", units="hours since epoch") + fp = iris.coords.DimCoord(6, "forecast_period", units="hours") + with self.assertRaisesRegex(ValueError, "Vector"): other_time_coord(rt, fp) def test_vector_frt(self): - rt = iris.coords.DimCoord([0, 3], 'forecast_reference_time', - units='hours since epoch') - fp = iris.coords.DimCoord(6, 'forecast_period', units='hours') - with self.assertRaisesRegex(ValueError, 'Vector'): + rt = iris.coords.DimCoord( + [0, 3], "forecast_reference_time", units="hours since epoch" + ) + fp = iris.coords.DimCoord(6, "forecast_period", units="hours") + with self.assertRaisesRegex(ValueError, "Vector"): other_time_coord(rt, fp) def test_vector_fp(self): - rt = iris.coords.DimCoord(48, 'time', units='hours since epoch') - fp = iris.coords.DimCoord([6, 12], 'forecast_period', units='hours') - with self.assertRaisesRegex(ValueError, 'Vector'): + rt = iris.coords.DimCoord(48, "time", units="hours since epoch") + fp = iris.coords.DimCoord([6, 12], "forecast_period", units="hours") + with self.assertRaisesRegex(ValueError, "Vector"): other_time_coord(rt, fp) def test_invalid_rt_name(self): - rt = iris.coords.DimCoord(1, 'height') - fp = iris.coords.DimCoord(6, 'forecast_period', units='hours') - with self.assertRaisesRegex(ValueError, 'reference time'): + rt = iris.coords.DimCoord(1, "height") + fp = iris.coords.DimCoord(6, "forecast_period", units="hours") + with self.assertRaisesRegex(ValueError, "reference time"): other_time_coord(rt, fp) def test_invalid_t_unit(self): - rt = iris.coords.DimCoord(1, 'time', units='Pa') - fp = iris.coords.DimCoord(6, 'forecast_period', units='hours') - with self.assertRaisesRegex(ValueError, 'unit.*Pa'): + rt = iris.coords.DimCoord(1, "time", units="Pa") + fp = iris.coords.DimCoord(6, "forecast_period", units="hours") + with self.assertRaisesRegex(ValueError, "unit.*Pa"): other_time_coord(rt, fp) def test_invalid_frt_unit(self): - rt = iris.coords.DimCoord(1, 'forecast_reference_time', units='km') - fp = iris.coords.DimCoord(6, 'forecast_period', units='hours') - with self.assertRaisesRegex(ValueError, 'unit.*km'): + rt = iris.coords.DimCoord(1, "forecast_reference_time", units="km") + fp = iris.coords.DimCoord(6, "forecast_period", units="hours") + with self.assertRaisesRegex(ValueError, "unit.*km"): other_time_coord(rt, fp) def test_invalid_fp_unit(self): - rt = iris.coords.DimCoord(48, 'forecast_reference_time', - units='hours since epoch') - fp = iris.coords.DimCoord(6, 'forecast_period', units='kg') - with self.assertRaisesRegex(ValueError, 'unit.*kg'): + rt = iris.coords.DimCoord( + 48, "forecast_reference_time", units="hours since epoch" + ) + fp = iris.coords.DimCoord(6, "forecast_period", units="kg") + with self.assertRaisesRegex(ValueError, "unit.*kg"): other_time_coord(rt, fp) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_section.py b/iris_grib/tests/unit/load_convert/test_product_definition_section.py index 409346f9..32903493 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_section.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_section.py @@ -18,10 +18,12 @@ from iris_grib._load_convert import product_definition_section from iris_grib.tests.unit.load_convert import empty_metadata -from iris_grib.tests.unit.load_convert.test_product_definition_template_0 \ - import section_4 as pdt_0_section_4 -from iris_grib.tests.unit.load_convert.test_product_definition_template_31 \ - import section_4 as pdt_31_section_4 +from iris_grib.tests.unit.load_convert.test_product_definition_template_0 import ( + section_4 as pdt_0_section_4, +) +from iris_grib.tests.unit.load_convert.test_product_definition_template_31 import ( + section_4 as pdt_31_section_4, +) class TestFixedSurfaces(tests.IrisGribTest): @@ -29,24 +31,26 @@ class TestFixedSurfaces(tests.IrisGribTest): Tests focussing on the handling of fixed surface elements in section 4. Expects/ignores depending on the template number. """ + def setUp(self): - self.patch('warnings.warn') + self.patch("warnings.warn") self.translate_phenomenon_patch = self.patch( - 'iris_grib._load_convert.translate_phenomenon' + "iris_grib._load_convert.translate_phenomenon" ) # Prep placeholder variables for product_definition_section. self.discipline = mock.sentinel.discipline self.tablesVersion = mock.sentinel.tablesVersion - self.rt_coord = DimCoord(24, 'forecast_reference_time', - units='hours since epoch') + self.rt_coord = DimCoord( + 24, "forecast_reference_time", units="hours since epoch" + ) self.metadata = empty_metadata() self.templates = {0: pdt_0_section_4(), 31: pdt_31_section_4()} self.fixed_surface_keys = [ - 'typeOfFirstFixedSurface', - 'scaledValueOfFirstFixedSurface', - 'typeOfSecondFixedSurface' + "typeOfFirstFixedSurface", + "scaledValueOfFirstFixedSurface", + "typeOfSecondFixedSurface", ] def _check_fixed_surface(self, fs_is_expected, fs_is_present): @@ -60,11 +64,13 @@ def _check_fixed_surface(self, fs_is_expected, fs_is_present): # #0 contains fixed surface elements, #31 does not. template_number = 0 if fs_is_expected else 31 section_4 = self.templates[template_number] - section_4.update({ - 'productDefinitionTemplateNumber': template_number, - 'parameterCategory': None, - 'parameterNumber': None - }) + section_4.update( + { + "productDefinitionTemplateNumber": template_number, + "parameterCategory": None, + "parameterNumber": None, + } + ) for key in self.fixed_surface_keys: # Force the presence or absence of the fixed surface elements even @@ -77,12 +83,16 @@ def _check_fixed_surface(self, fs_is_expected, fs_is_present): def run_function(): # For reuse in every type of test below. product_definition_section( - section_4, self.metadata, self.discipline, self.tablesVersion, - self.rt_coord) + section_4, + self.metadata, + self.discipline, + self.tablesVersion, + self.rt_coord, + ) if fs_is_expected and not fs_is_present: # Should error since the expected keys are missing. - error_message = 'FixedSurface' + error_message = "FixedSurface" with self.assertRaisesRegex(KeyError, error_message): run_function() else: @@ -93,8 +103,9 @@ def run_function(): # arguments. So should always have run. previous_call_count = self.translate_phenomenon_patch.call_count run_function() - self.assertEqual(self.translate_phenomenon_patch.call_count, - previous_call_count + 1) + self.assertEqual( + self.translate_phenomenon_patch.call_count, previous_call_count + 1 + ) phenom_call_args = self.translate_phenomenon_patch.call_args[1] for key in self.fixed_surface_keys: # Check whether None or actual values have been passed for @@ -119,5 +130,5 @@ def test_all_combinations(self): self._check_fixed_surface(*pair) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_0.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_0.py index 42593b54..0fa8a04a 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_0.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_0.py @@ -25,71 +25,74 @@ def section_4(): - return {'hoursAfterDataCutoff': MDI, - 'minutesAfterDataCutoff': MDI, - 'indicatorOfUnitOfTimeRange': 0, # minutes - 'forecastTime': 360, - 'NV': 0, - 'typeOfFirstFixedSurface': 103, - 'scaleFactorOfFirstFixedSurface': 0, - 'scaledValueOfFirstFixedSurface': 9999, - 'typeOfSecondFixedSurface': 255} + return { + "hoursAfterDataCutoff": MDI, + "minutesAfterDataCutoff": MDI, + "indicatorOfUnitOfTimeRange": 0, # minutes + "forecastTime": 360, + "NV": 0, + "typeOfFirstFixedSurface": 103, + "scaleFactorOfFirstFixedSurface": 0, + "scaledValueOfFirstFixedSurface": 9999, + "typeOfSecondFixedSurface": 255, + } class Test(LoadConvertTest): def test_given_frt(self): metadata = empty_metadata() - rt_coord = iris.coords.DimCoord(24, 'forecast_reference_time', - units='hours since epoch') + rt_coord = iris.coords.DimCoord( + 24, "forecast_reference_time", units="hours since epoch" + ) product_definition_template_0(section_4(), metadata, rt_coord) expected = empty_metadata() - aux = expected['aux_coords_and_dims'] - aux.append((iris.coords.DimCoord(6, 'forecast_period', units='hours'), - None)) - aux.append(( - iris.coords.DimCoord(30, 'time', units='hours since epoch'), None)) + aux = expected["aux_coords_and_dims"] + aux.append((iris.coords.DimCoord(6, "forecast_period", units="hours"), None)) + aux.append((iris.coords.DimCoord(30, "time", units="hours since epoch"), None)) aux.append((rt_coord, None)) - aux.append((iris.coords.DimCoord(9999, long_name='height', units='m'), - None)) + aux.append((iris.coords.DimCoord(9999, long_name="height", units="m"), None)) self.assertMetadataEqual(metadata, expected) def test_given_t(self): metadata = empty_metadata() - rt_coord = iris.coords.DimCoord(24, 'time', - units='hours since epoch') + rt_coord = iris.coords.DimCoord(24, "time", units="hours since epoch") product_definition_template_0(section_4(), metadata, rt_coord) expected = empty_metadata() - aux = expected['aux_coords_and_dims'] - aux.append((iris.coords.DimCoord(6, 'forecast_period', units='hours'), - None)) - aux.append(( - iris.coords.DimCoord(18, 'forecast_reference_time', - units='hours since epoch'), None)) + aux = expected["aux_coords_and_dims"] + aux.append((iris.coords.DimCoord(6, "forecast_period", units="hours"), None)) + aux.append( + ( + iris.coords.DimCoord( + 18, "forecast_reference_time", units="hours since epoch" + ), + None, + ) + ) aux.append((rt_coord, None)) - aux.append((iris.coords.DimCoord(9999, long_name='height', units='m'), - None)) + aux.append((iris.coords.DimCoord(9999, long_name="height", units="m"), None)) self.assertMetadataEqual(metadata, expected) def test_generating_process_warnings(self): metadata = empty_metadata() - rt_coord = iris.coords.DimCoord(24, 'forecast_reference_time', - units='hours since epoch') + rt_coord = iris.coords.DimCoord( + 24, "forecast_reference_time", units="hours since epoch" + ) convert_options = iris_grib._load_convert.options emit_warnings = convert_options.warn_on_unsupported try: convert_options.warn_on_unsupported = True - with mock.patch('warnings.warn') as warn: + with mock.patch("warnings.warn") as warn: product_definition_template_0(section_4(), metadata, rt_coord) warn_msgs = [call[1][0] for call in warn.mock_calls] - expected = ['Unable to translate type of generating process.', - 'Unable to translate background generating process ' - 'identifier.', - 'Unable to translate forecast generating process ' - 'identifier.'] + expected = [ + "Unable to translate type of generating process.", + "Unable to translate background generating process " "identifier.", + "Unable to translate forecast generating process " "identifier.", + ] self.assertEqual(warn_msgs, expected) finally: convert_options.warn_on_unsupported = emit_warnings -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_1.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_1.py index 2c607ba1..47bde0ee 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_1.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_1.py @@ -24,39 +24,44 @@ class Test(tests.IrisGribTest): def setUp(self): def func(s, m, f): - return m['cell_methods'].append(self.cell_method) + return m["cell_methods"].append(self.cell_method) - module = 'iris_grib._load_convert' - self.patch('warnings.warn') - this = '{}.product_definition_template_0'.format(module) + module = "iris_grib._load_convert" + self.patch("warnings.warn") + this = "{}.product_definition_template_0".format(module) self.cell_method = mock.sentinel.cell_method self.patch(this, side_effect=func) - self.metadata = {'factories': [], 'references': [], - 'standard_name': None, - 'long_name': None, 'units': None, 'attributes': {}, - 'cell_methods': [], 'dim_coords_and_dims': [], - 'aux_coords_and_dims': []} + self.metadata = { + "factories": [], + "references": [], + "standard_name": None, + "long_name": None, + "units": None, + "attributes": {}, + "cell_methods": [], + "dim_coords_and_dims": [], + "aux_coords_and_dims": [], + } def _check(self, request_warning): - this = 'iris_grib._load_convert.options' + this = "iris_grib._load_convert.options" with mock.patch(this, warn_on_unsupported=request_warning): metadata = deepcopy(self.metadata) perturbationNumber = 666 - section = {'perturbationNumber': perturbationNumber} + section = {"perturbationNumber": perturbationNumber} forecast_reference_time = mock.sentinel.forecast_reference_time # The called being tested. - product_definition_template_1(section, metadata, - forecast_reference_time) + product_definition_template_1(section, metadata, forecast_reference_time) expected = deepcopy(self.metadata) - expected['cell_methods'].append(self.cell_method) - realization = DimCoord(perturbationNumber, - standard_name='realization', - units='no_unit') - expected['aux_coords_and_dims'].append((realization, None)) + expected["cell_methods"].append(self.cell_method) + realization = DimCoord( + perturbationNumber, standard_name="realization", units="no_unit" + ) + expected["aux_coords_and_dims"].append((realization, None)) self.assertEqual(metadata, expected) if request_warning: warn_msgs = [mcall[1][0] for mcall in warnings.warn.mock_calls] - expected_msgs = ['type of ensemble', 'number of forecasts'] + expected_msgs = ["type of ensemble", "number of forecasts"] for emsg in expected_msgs: matches = [wmsg for wmsg in warn_msgs if emsg in wmsg] self.assertEqual(len(matches), 1) @@ -71,5 +76,5 @@ def test_pdt_warn(self): self._check(True) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_10.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_10.py index 741ed85f..b725a156 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_10.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_10.py @@ -20,46 +20,49 @@ class Test(tests.IrisGribTest): def setUp(self): - module = 'iris_grib._load_convert' + module = "iris_grib._load_convert" self.patch_statistical_fp_coord = self.patch( - module + '.statistical_forecast_period_coord', - return_value=mock.sentinel.dummy_fp_coord) + module + ".statistical_forecast_period_coord", + return_value=mock.sentinel.dummy_fp_coord, + ) self.patch_time_coord = self.patch( - module + '.validity_time_coord', - return_value=mock.sentinel.dummy_time_coord) - self.patch_vertical_coords = self.patch(module + '.vertical_coords') + module + ".validity_time_coord", return_value=mock.sentinel.dummy_time_coord + ) + self.patch_vertical_coords = self.patch(module + ".vertical_coords") def test_percentile_coord(self): metadata = empty_metadata() percentileValue = 75 - section = {'productDefinitionTemplateNumber': 10, - 'percentileValue': percentileValue, - 'hoursAfterDataCutoff': 1, - 'minutesAfterDataCutoff': 1, - 'numberOfTimeRange': 1, - 'typeOfStatisticalProcessing': 1, - 'typeOfTimeIncrement': 2, - 'timeIncrement': 0, - 'yearOfEndOfOverallTimeInterval': 2000, - 'monthOfEndOfOverallTimeInterval': 1, - 'dayOfEndOfOverallTimeInterval': 1, - 'hourOfEndOfOverallTimeInterval': 1, - 'minuteOfEndOfOverallTimeInterval': 0, - 'secondOfEndOfOverallTimeInterval': 1} + section = { + "productDefinitionTemplateNumber": 10, + "percentileValue": percentileValue, + "hoursAfterDataCutoff": 1, + "minutesAfterDataCutoff": 1, + "numberOfTimeRange": 1, + "typeOfStatisticalProcessing": 1, + "typeOfTimeIncrement": 2, + "timeIncrement": 0, + "yearOfEndOfOverallTimeInterval": 2000, + "monthOfEndOfOverallTimeInterval": 1, + "dayOfEndOfOverallTimeInterval": 1, + "hourOfEndOfOverallTimeInterval": 1, + "minuteOfEndOfOverallTimeInterval": 0, + "secondOfEndOfOverallTimeInterval": 1, + } forecast_reference_time = mock.Mock() # The called being tested. - product_definition_template_10(section, metadata, - forecast_reference_time) + product_definition_template_10(section, metadata, forecast_reference_time) - expected = {'aux_coords_and_dims': []} - percentile = DimCoord(percentileValue, - long_name='percentile_over_time', - units='no_unit') - expected['aux_coords_and_dims'].append((percentile, None)) + expected = {"aux_coords_and_dims": []} + percentile = DimCoord( + percentileValue, long_name="percentile_over_time", units="no_unit" + ) + expected["aux_coords_and_dims"].append((percentile, None)) - self.assertEqual(metadata['aux_coords_and_dims'][-1], - expected['aux_coords_and_dims'][0]) + self.assertEqual( + metadata["aux_coords_and_dims"][-1], expected["aux_coords_and_dims"][0] + ) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_11.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_11.py index 5df27d71..891ba447 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_11.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_11.py @@ -23,65 +23,72 @@ class Test(tests.IrisGribTest): def setUp(self): def func(s, m, f): - return m['cell_methods'].append(self.cell_method) + return m["cell_methods"].append(self.cell_method) - module = 'iris_grib._load_convert' - self.patch('warnings.warn') - this_module = '{}.product_definition_template_11'.format(module) + module = "iris_grib._load_convert" + self.patch("warnings.warn") + this_module = "{}.product_definition_template_11".format(module) self.cell_method = mock.sentinel.cell_method self.patch(this_module, side_effect=func) self.patch_statistical_fp_coord = self.patch( - module + '.statistical_forecast_period_coord', - return_value=mock.sentinel.dummy_fp_coord) + module + ".statistical_forecast_period_coord", + return_value=mock.sentinel.dummy_fp_coord, + ) self.patch_time_coord = self.patch( - module + '.validity_time_coord', - return_value=mock.sentinel.dummy_time_coord) - self.patch_vertical_coords = self.patch(module + '.vertical_coords') - self.metadata = {'factories': [], 'references': [], - 'standard_name': None, - 'long_name': None, 'units': None, 'attributes': {}, - 'cell_methods': [], 'dim_coords_and_dims': [], - 'aux_coords_and_dims': []} + module + ".validity_time_coord", return_value=mock.sentinel.dummy_time_coord + ) + self.patch_vertical_coords = self.patch(module + ".vertical_coords") + self.metadata = { + "factories": [], + "references": [], + "standard_name": None, + "long_name": None, + "units": None, + "attributes": {}, + "cell_methods": [], + "dim_coords_and_dims": [], + "aux_coords_and_dims": [], + } def _check(self, request_warning): - grib_lconv_opt = 'iris_grib._load_convert.options' + grib_lconv_opt = "iris_grib._load_convert.options" with mock.patch(grib_lconv_opt, warn_on_unsupported=request_warning): metadata = deepcopy(self.metadata) perturbationNumber = 666 - section = {'productDefinitionTemplateNumber': 11, - 'perturbationNumber': perturbationNumber, - 'hoursAfterDataCutoff': 1, - 'minutesAfterDataCutoff': 1, - 'numberOfTimeRange': 1, - 'typeOfStatisticalProcessing': 1, - 'typeOfTimeIncrement': 2, - 'timeIncrement': 0, - 'yearOfEndOfOverallTimeInterval': 2000, - 'monthOfEndOfOverallTimeInterval': 1, - 'dayOfEndOfOverallTimeInterval': 1, - 'hourOfEndOfOverallTimeInterval': 1, - 'minuteOfEndOfOverallTimeInterval': 0, - 'secondOfEndOfOverallTimeInterval': 1} + section = { + "productDefinitionTemplateNumber": 11, + "perturbationNumber": perturbationNumber, + "hoursAfterDataCutoff": 1, + "minutesAfterDataCutoff": 1, + "numberOfTimeRange": 1, + "typeOfStatisticalProcessing": 1, + "typeOfTimeIncrement": 2, + "timeIncrement": 0, + "yearOfEndOfOverallTimeInterval": 2000, + "monthOfEndOfOverallTimeInterval": 1, + "dayOfEndOfOverallTimeInterval": 1, + "hourOfEndOfOverallTimeInterval": 1, + "minuteOfEndOfOverallTimeInterval": 0, + "secondOfEndOfOverallTimeInterval": 1, + } forecast_reference_time = mock.Mock() # The called being tested. - product_definition_template_11(section, metadata, - forecast_reference_time) - expected = {'cell_methods': [], 'aux_coords_and_dims': []} - expected['cell_methods'].append(CellMethod(method='sum', - coords=('time',))) - realization = DimCoord(perturbationNumber, - standard_name='realization', - units='no_unit') - expected['aux_coords_and_dims'].append((realization, None)) + product_definition_template_11(section, metadata, forecast_reference_time) + expected = {"cell_methods": [], "aux_coords_and_dims": []} + expected["cell_methods"].append(CellMethod(method="sum", coords=("time",))) + realization = DimCoord( + perturbationNumber, standard_name="realization", units="no_unit" + ) + expected["aux_coords_and_dims"].append((realization, None)) self.maxDiff = None - self.assertEqual(metadata['aux_coords_and_dims'][-1], - expected['aux_coords_and_dims'][0]) - self.assertEqual(metadata['cell_methods'][-1], - expected['cell_methods'][0]) + self.assertEqual( + metadata["aux_coords_and_dims"][-1], expected["aux_coords_and_dims"][0] + ) + self.assertEqual(metadata["cell_methods"][-1], expected["cell_methods"][0]) if request_warning: warn_msgs = [mcall[1][0] for mcall in warnings.warn.mock_calls] - expected_msgs = ['type of ensemble', 'number of forecasts'] + expected_msgs = ["type of ensemble", "number of forecasts"] for emsg in expected_msgs: matches = [wmsg for wmsg in warn_msgs if emsg in wmsg] self.assertEqual(len(matches), 1) @@ -96,5 +103,5 @@ def test_pdt_warn(self): self._check(True) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py index 5ac92f69..8e81457e 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py @@ -28,37 +28,36 @@ def section_4_sample(): # Create a dictionary representing a sample section 4 from a grib file. - return {'productDefinitionTemplateNumber': 15, - 'hoursAfterDataCutoff': MDI, - 'minutesAfterDataCutoff': MDI, - 'indicatorOfUnitOfTimeRange': 0, # minutes - 'forecastTime': 360, - 'NV': 0, - 'typeOfFirstFixedSurface': 103, - 'scaleFactorOfFirstFixedSurface': 0, - 'scaledValueOfFirstFixedSurface': 9999, - 'typeOfSecondFixedSurface': 255, - 'statisticalProcess': 2, # method = maximum - 'spatialProcessing': 0, # from source grid, no interpolation - 'numberOfPointsUsed': 0 # no points used because no interpolation - } + return { + "productDefinitionTemplateNumber": 15, + "hoursAfterDataCutoff": MDI, + "minutesAfterDataCutoff": MDI, + "indicatorOfUnitOfTimeRange": 0, # minutes + "forecastTime": 360, + "NV": 0, + "typeOfFirstFixedSurface": 103, + "scaleFactorOfFirstFixedSurface": 0, + "scaledValueOfFirstFixedSurface": 9999, + "typeOfSecondFixedSurface": 255, + "statisticalProcess": 2, # method = maximum + "spatialProcessing": 0, # from source grid, no interpolation + "numberOfPointsUsed": 0, # no points used because no interpolation + } class Test(LoadConvertTest): def setUp(self): - self.time_coord = DimCoord(24, 'time', units='hours since epoch') - self.forecast_period_coord = DimCoord(6, 'forecast_period', - units='hours') - self.forecast_ref_time_coord = DimCoord(18, 'forecast_reference_time', - units='hours since epoch') - self.height_coord = iris.coords.DimCoord(9999, long_name='height', - units='m') + self.time_coord = DimCoord(24, "time", units="hours since epoch") + self.forecast_period_coord = DimCoord(6, "forecast_period", units="hours") + self.forecast_ref_time_coord = DimCoord( + 18, "forecast_reference_time", units="hours since epoch" + ) + self.height_coord = iris.coords.DimCoord(9999, long_name="height", units="m") def _translate(self, section): # Use pdt 4.15 to populate a metadata dict from the section 4 keys metadata = empty_metadata() - product_definition_template_15(section, metadata, - self.time_coord) + product_definition_template_15(section, metadata, self.time_coord) return metadata def test_translation(self): @@ -68,16 +67,14 @@ def test_translation(self): # Generate a fresh metadata dict and manually populate it with metadata # that we expect will be generated from our sample section. expected = empty_metadata() - aux = expected['aux_coords_and_dims'] + aux = expected["aux_coords_and_dims"] aux.append((self.forecast_period_coord, None)) aux.append((self.forecast_ref_time_coord, None)) aux.append((self.time_coord, None)) aux.append((self.height_coord, None)) - expected['cell_methods'] = [CellMethod(coords=('area',), - method='maximum')] - expected['attributes']['spatial_processing_type'] = \ - 'No interpolation' + expected["cell_methods"] = [CellMethod(coords=("area",), method="maximum")] + expected["attributes"]["spatial_processing_type"] = "No interpolation" # Now check that the section conversion produces the metadata we # expect. @@ -85,18 +82,18 @@ def test_translation(self): def test_bad_statistic_method(self): section = section_4_sample() - section['statisticalProcess'] = 999 - msg = r'unsupported statistical process type \[999\]' + section["statisticalProcess"] = 999 + msg = r"unsupported statistical process type \[999\]" with self.assertRaisesRegex(TranslationError, msg): self._translate(section) def test_bad_spatial_processing_code(self): section = section_4_sample() - section['spatialProcessing'] = 999 - msg = r'unsupported spatial processing type \[999\]' + section["spatialProcessing"] = 999 + msg = r"unsupported spatial processing type \[999\]" with self.assertRaisesRegex(TranslationError, msg): self._translate(section) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_31.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_31.py index 05a2ab08..182a0178 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_31.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_31.py @@ -23,21 +23,25 @@ def section_4(): series = mock.sentinel.satelliteSeries number = mock.sentinel.satelliteNumber instrument = mock.sentinel.instrumentType - return {'NB': 1, - 'satelliteSeries': series, - 'satelliteNumber': number, - 'instrumentType': instrument, - 'scaleFactorOfCentralWaveNumber': 1, - 'scaledValueOfCentralWaveNumber': 12} + return { + "NB": 1, + "satelliteSeries": series, + "satelliteNumber": number, + "instrumentType": instrument, + "scaleFactorOfCentralWaveNumber": 1, + "scaledValueOfCentralWaveNumber": 12, + } class Test(tests.IrisGribTest): def setUp(self): - self.patch('warnings.warn') + self.patch("warnings.warn") self.satellite_common_patch = self.patch( - 'iris_grib._load_convert.satellite_common') + "iris_grib._load_convert.satellite_common" + ) self.generating_process_patch = self.patch( - 'iris_grib._load_convert.generating_process') + "iris_grib._load_convert.generating_process" + ) def test(self): # Prepare the arguments. @@ -53,8 +57,8 @@ def test(self): # Check that 'generating_process' was called. self.assertEqual(self.generating_process_patch.call_count, 1) # Check that the scalar time coord was added in. - self.assertIn((rt_coord, None), metadata['aux_coords_and_dims']) + self.assertIn((rt_coord, None), metadata["aux_coords_and_dims"]) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_32.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_32.py index c60e98c5..563e6d3e 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_32.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_32.py @@ -19,15 +19,15 @@ class Test(tests.IrisGribTest): def setUp(self): - self.patch('warnings.warn') + self.patch("warnings.warn") self.generating_process_patch = self.patch( - 'iris_grib._load_convert.generating_process') + "iris_grib._load_convert.generating_process" + ) self.satellite_common_patch = self.patch( - 'iris_grib._load_convert.satellite_common') - self.time_coords_patch = self.patch( - 'iris_grib._load_convert.time_coords') - self.data_cutoff_patch = self.patch( - 'iris_grib._load_convert.data_cutoff') + "iris_grib._load_convert.satellite_common" + ) + self.time_coords_patch = self.patch("iris_grib._load_convert.time_coords") + self.data_cutoff_patch = self.patch("iris_grib._load_convert.data_cutoff") def test(self, value=10, factor=1): # Prepare the arguments. @@ -35,15 +35,16 @@ def test(self, value=10, factor=1): number = mock.sentinel.satelliteNumber instrument = mock.sentinel.instrumentType rt_coord = mock.sentinel.observation_time - section = {'NB': 1, - 'hoursAfterDataCutoff': None, - 'minutesAfterDataCutoff': None, - 'satelliteSeries': series, - 'satelliteNumber': number, - 'instrumentType': instrument, - 'scaleFactorOfCentralWaveNumber': 1, - 'scaledValueOfCentralWaveNumber': 12, - } + section = { + "NB": 1, + "hoursAfterDataCutoff": None, + "minutesAfterDataCutoff": None, + "satelliteSeries": series, + "satelliteNumber": number, + "instrumentType": instrument, + "scaleFactorOfCentralWaveNumber": 1, + "scaledValueOfCentralWaveNumber": 12, + } # Call the function. metadata = empty_metadata() @@ -59,5 +60,5 @@ def test(self, value=10, factor=1): self.assertEqual(self.time_coords_patch.call_count, 1) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_40.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_40.py index 8e9275d4..a7c0b3b2 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_40.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_40.py @@ -19,26 +19,29 @@ class Test(tests.IrisGribTest): def setUp(self): - self.section_4 = {'hoursAfterDataCutoff': _MDI, - 'minutesAfterDataCutoff': _MDI, - 'constituentType': 1, - 'indicatorOfUnitOfTimeRange': 0, # minutes - 'startStep': 360, - 'NV': 0, - 'typeOfFirstFixedSurface': 103, - 'scaleFactorOfFirstFixedSurface': 0, - 'scaledValueOfFirstFixedSurface': 9999, - 'typeOfSecondFixedSurface': 255} + self.section_4 = { + "hoursAfterDataCutoff": _MDI, + "minutesAfterDataCutoff": _MDI, + "constituentType": 1, + "indicatorOfUnitOfTimeRange": 0, # minutes + "startStep": 360, + "NV": 0, + "typeOfFirstFixedSurface": 103, + "scaleFactorOfFirstFixedSurface": 0, + "scaledValueOfFirstFixedSurface": 9999, + "typeOfSecondFixedSurface": 255, + } def test_constituent_type(self): metadata = empty_metadata() - rt_coord = iris.coords.DimCoord(24, 'forecast_reference_time', - units='hours since epoch') + rt_coord = iris.coords.DimCoord( + 24, "forecast_reference_time", units="hours since epoch" + ) product_definition_template_40(self.section_4, metadata, rt_coord) expected = empty_metadata() - expected['attributes']['WMO_constituent_type'] = 1 - self.assertEqual(metadata['attributes'], expected['attributes']) + expected["attributes"]["WMO_constituent_type"] = 1 + self.assertEqual(metadata["attributes"], expected["attributes"]) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_6.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_6.py index f8f21c69..3c45fabc 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_6.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_6.py @@ -23,35 +23,38 @@ class Test(tests.IrisGribTest): def setUp(self): def func(s, m, f): - return m['cell_methods'].append(self.cell_method) + return m["cell_methods"].append(self.cell_method) - module = 'iris_grib._load_convert' - self.patch('warnings.warn') - this = '{}.product_definition_template_0'.format(module) + module = "iris_grib._load_convert" + self.patch("warnings.warn") + this = "{}.product_definition_template_0".format(module) self.cell_method = mock.sentinel.cell_method self.patch(this, side_effect=func) - self.metadata = {'factories': [], 'references': [], - 'standard_name': None, - 'long_name': None, 'units': None, 'attributes': {}, - 'cell_methods': [], 'dim_coords_and_dims': [], - 'aux_coords_and_dims': []} + self.metadata = { + "factories": [], + "references": [], + "standard_name": None, + "long_name": None, + "units": None, + "attributes": {}, + "cell_methods": [], + "dim_coords_and_dims": [], + "aux_coords_and_dims": [], + } def _check(self, request_warning): - this = 'iris_grib._load_convert.options' + this = "iris_grib._load_convert.options" with mock.patch(this, warn_on_unsupported=request_warning): metadata = deepcopy(self.metadata) percentile = 50 - section = {'percentileValue': percentile} + section = {"percentileValue": percentile} forecast_reference_time = mock.sentinel.forecast_reference_time # The called being tested. - product_definition_template_6(section, metadata, - forecast_reference_time) + product_definition_template_6(section, metadata, forecast_reference_time) expected = deepcopy(self.metadata) - expected['cell_methods'].append(self.cell_method) - percentile = DimCoord(percentile, - long_name='percentile', - units='%') - expected['aux_coords_and_dims'].append((percentile, None)) + expected["cell_methods"].append(self.cell_method) + percentile = DimCoord(percentile, long_name="percentile", units="%") + expected["aux_coords_and_dims"].append((percentile, None)) self.assertEqual(metadata, expected) def test_pdt_no_warn(self): @@ -61,5 +64,5 @@ def test_pdt_warn(self): self._check(True) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_8.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_8.py index e2ab0e48..f8dab4ed 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_8.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_8.py @@ -19,32 +19,32 @@ class Test(tests.IrisGribTest): def setUp(self): - module = 'iris_grib._load_convert' + module = "iris_grib._load_convert" self.module = module # Create patches for called routines - self.patch_generating_process = self.patch( - module + '.generating_process') - self.patch_data_cutoff = self.patch(module + '.data_cutoff') + self.patch_generating_process = self.patch(module + ".generating_process") + self.patch_data_cutoff = self.patch(module + ".data_cutoff") self.patch_statistical_cell_method = self.patch( - module + '.statistical_cell_method', - return_value=mock.sentinel.dummy_cell_method) + module + ".statistical_cell_method", + return_value=mock.sentinel.dummy_cell_method, + ) self.patch_statistical_fp_coord = self.patch( - module + '.statistical_forecast_period_coord', - return_value=mock.sentinel.dummy_fp_coord) + module + ".statistical_forecast_period_coord", + return_value=mock.sentinel.dummy_fp_coord, + ) self.patch_time_coord = self.patch( - module + '.validity_time_coord', - return_value=mock.sentinel.dummy_time_coord) - self.patch_vertical_coords = self.patch(module + '.vertical_coords') + module + ".validity_time_coord", return_value=mock.sentinel.dummy_time_coord + ) + self.patch_vertical_coords = self.patch(module + ".vertical_coords") # Construct dummy call arguments self.section = {} - self.section['hoursAfterDataCutoff'] = mock.sentinel.cutoff_hours - self.section['minutesAfterDataCutoff'] = mock.sentinel.cutoff_mins + self.section["hoursAfterDataCutoff"] = mock.sentinel.cutoff_hours + self.section["minutesAfterDataCutoff"] = mock.sentinel.cutoff_mins self.frt_coord = mock.Mock() - self.metadata = {'cell_methods': [], 'aux_coords_and_dims': []} + self.metadata = {"cell_methods": [], "aux_coords_and_dims": []} def test_basic(self): - product_definition_template_8( - self.section, self.metadata, self.frt_coord) + product_definition_template_8(self.section, self.metadata, self.frt_coord) # Check all expected functions were called just once. self.assertEqual(self.patch_generating_process.call_count, 1) self.assertEqual(self.patch_data_cutoff.call_count, 1) @@ -53,15 +53,21 @@ def test_basic(self): self.assertEqual(self.patch_time_coord.call_count, 1) self.assertEqual(self.patch_vertical_coords.call_count, 1) # Check metadata content. - self.assertEqual(sorted(self.metadata.keys()), - ['aux_coords_and_dims', 'cell_methods']) - self.assertEqual(self.metadata['cell_methods'], - [mock.sentinel.dummy_cell_method]) - self.assertCountEqual(self.metadata['aux_coords_and_dims'], - [(self.frt_coord, None), - (mock.sentinel.dummy_fp_coord, None), - (mock.sentinel.dummy_time_coord, None)]) + self.assertEqual( + sorted(self.metadata.keys()), ["aux_coords_and_dims", "cell_methods"] + ) + self.assertEqual( + self.metadata["cell_methods"], [mock.sentinel.dummy_cell_method] + ) + self.assertCountEqual( + self.metadata["aux_coords_and_dims"], + [ + (self.frt_coord, None), + (mock.sentinel.dummy_fp_coord, None), + (mock.sentinel.dummy_time_coord, None), + ], + ) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_9.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_9.py index 83bfbe30..626ec6af 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_9.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_9.py @@ -23,52 +23,48 @@ class Test(tests.IrisGribTest): def setUp(self): # Create patches for called routines - module = 'iris_grib._load_convert' - self.patch_pdt8_call = self.patch( - module + '.product_definition_template_8') + module = "iris_grib._load_convert" + self.patch_pdt8_call = self.patch(module + ".product_definition_template_8") # Construct dummy call arguments self.section = {} - self.section['probabilityType'] = 1 - self.section['scaledValueOfUpperLimit'] = 53 - self.section['scaleFactorOfUpperLimit'] = 1 + self.section["probabilityType"] = 1 + self.section["scaledValueOfUpperLimit"] = 53 + self.section["scaleFactorOfUpperLimit"] = 1 self.frt_coord = mock.sentinel.frt_coord - self.metadata = {'cell_methods': [mock.sentinel.cell_method], - 'aux_coords_and_dims': []} + self.metadata = { + "cell_methods": [mock.sentinel.cell_method], + "aux_coords_and_dims": [], + } def test_basic(self): result = product_definition_template_9( - self.section, self.metadata, self.frt_coord) + self.section, self.metadata, self.frt_coord + ) # Check expected function was called. self.assertEqual( self.patch_pdt8_call.call_args_list, - [mock.call(self.section, self.metadata, self.frt_coord)]) + [mock.call(self.section, self.metadata, self.frt_coord)], + ) # Check metadata content (N.B. cell_method has been removed!). - self.assertEqual(self.metadata, {'cell_methods': [], - 'aux_coords_and_dims': []}) + self.assertEqual(self.metadata, {"cell_methods": [], "aux_coords_and_dims": []}) # Check result. - self.assertEqual(result, Probability('above_threshold', 5.3)) + self.assertEqual(result, Probability("above_threshold", 5.3)) def test_fail_bad_probability_type(self): - self.section['probabilityType'] = 17 - with self.assertRaisesRegex(TranslationError, - 'unsupported probability type'): - product_definition_template_9( - self.section, self.metadata, self.frt_coord) + self.section["probabilityType"] = 17 + with self.assertRaisesRegex(TranslationError, "unsupported probability type"): + product_definition_template_9(self.section, self.metadata, self.frt_coord) def test_fail_bad_threshold_value(self): - self.section['scaledValueOfUpperLimit'] = _MDI - with self.assertRaisesRegex(TranslationError, - 'missing scaled value'): - product_definition_template_9( - self.section, self.metadata, self.frt_coord) + self.section["scaledValueOfUpperLimit"] = _MDI + with self.assertRaisesRegex(TranslationError, "missing scaled value"): + product_definition_template_9(self.section, self.metadata, self.frt_coord) def test_fail_bad_threshold_scalefactor(self): - self.section['scaleFactorOfUpperLimit'] = _MDI - with self.assertRaisesRegex(TranslationError, - 'missing scale factor'): - product_definition_template_9( - self.section, self.metadata, self.frt_coord) + self.section["scaleFactorOfUpperLimit"] = _MDI + with self.assertRaisesRegex(TranslationError, "missing scale factor"): + product_definition_template_9(self.section, self.metadata, self.frt_coord) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_projection_centre.py b/iris_grib/tests/unit/load_convert/test_projection_centre.py index e2c18d6b..5bbfa625 100644 --- a/iris_grib/tests/unit/load_convert/test_projection_centre.py +++ b/iris_grib/tests/unit/load_convert/test_projection_centre.py @@ -29,8 +29,8 @@ def test_south_pole_on_projection_plane(self): def test_both(self): expected = ProjectionCentre(True, True) - self.assertEqual(projection_centre(0xc0), expected) + self.assertEqual(projection_centre(0xC0), expected) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_reference_time_coord.py b/iris_grib/tests/unit/load_convert/test_reference_time_coord.py index 76e4c36c..f3d2b5f9 100644 --- a/iris_grib/tests/unit/load_convert/test_reference_time_coord.py +++ b/iris_grib/tests/unit/load_convert/test_reference_time_coord.py @@ -26,47 +26,53 @@ class Test(tests.IrisGribTest): def setUp(self): - self.section = {'year': 2007, - 'month': 1, - 'day': 15, - 'hour': 0, - 'minute': 3, - 'second': 0} - self.unit = Unit('hours since epoch', calendar=CALENDAR_GREGORIAN) - dt = datetime(self.section['year'], self.section['month'], - self.section['day'], self.section['hour'], - self.section['minute'], self.section['second']) + self.section = { + "year": 2007, + "month": 1, + "day": 15, + "hour": 0, + "minute": 3, + "second": 0, + } + self.unit = Unit("hours since epoch", calendar=CALENDAR_GREGORIAN) + dt = datetime( + self.section["year"], + self.section["month"], + self.section["day"], + self.section["hour"], + self.section["minute"], + self.section["second"], + ) self.point = self.unit.date2num(dt) def _check(self, section, standard_name=None): - expected = DimCoord(self.point, standard_name=standard_name, - units=self.unit) + expected = DimCoord(self.point, standard_name=standard_name, units=self.unit) # The call being tested. coord = reference_time_coord(section) self.assertEqual(coord, expected) def test_start_of_forecast__0(self): section = deepcopy(self.section) - section['significanceOfReferenceTime'] = 0 - self._check(section, 'forecast_reference_time') + section["significanceOfReferenceTime"] = 0 + self._check(section, "forecast_reference_time") def test_start_of_forecast__1(self): section = deepcopy(self.section) - section['significanceOfReferenceTime'] = 1 - self._check(section, 'forecast_reference_time') + section["significanceOfReferenceTime"] = 1 + self._check(section, "forecast_reference_time") def test_observation_time(self): section = deepcopy(self.section) - section['significanceOfReferenceTime'] = 3 - self._check(section, 'time') + section["significanceOfReferenceTime"] = 3 + self._check(section, "time") def test_unknown_significance(self): section = deepcopy(self.section) - section['significanceOfReferenceTime'] = 5 - emsg = 'unsupported significance' + section["significanceOfReferenceTime"] = 5 + emsg = "unsupported significance" with self.assertRaisesRegex(TranslationError, emsg): self._check(section) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_resolution_flags.py b/iris_grib/tests/unit/load_convert/test_resolution_flags.py index dc47e36d..dc26fa9e 100644 --- a/iris_grib/tests/unit/load_convert/test_resolution_flags.py +++ b/iris_grib/tests/unit/load_convert/test_resolution_flags.py @@ -32,5 +32,5 @@ def test_uv_resolved(self): self.assertEqual(resolution_flags(0x08), expected) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_satellite_common.py b/iris_grib/tests/unit/load_convert/test_satellite_common.py index 3e1e3dde..fb0ab654 100644 --- a/iris_grib/tests/unit/load_convert/test_satellite_common.py +++ b/iris_grib/tests/unit/load_convert/test_satellite_common.py @@ -27,12 +27,14 @@ def _check(self, factors=1, values=111): series = mock.sentinel.satelliteSeries number = mock.sentinel.satelliteNumber instrument = mock.sentinel.instrumentType - section = {'NB': 1, - 'satelliteSeries': series, - 'satelliteNumber': number, - 'instrumentType': instrument, - 'scaleFactorOfCentralWaveNumber': factors, - 'scaledValueOfCentralWaveNumber': values} + section = { + "NB": 1, + "satelliteSeries": series, + "satelliteNumber": number, + "instrumentType": instrument, + "scaleFactorOfCentralWaveNumber": factors, + "scaledValueOfCentralWaveNumber": values, + } # Call the function. metadata = empty_metadata() @@ -40,17 +42,17 @@ def _check(self, factors=1, values=111): # Check the result. expected = empty_metadata() - coord = AuxCoord(series, long_name='satellite_series', units=1) - expected['aux_coords_and_dims'].append((coord, None)) - coord = AuxCoord(number, long_name='satellite_number', units=1) - expected['aux_coords_and_dims'].append((coord, None)) - coord = AuxCoord(instrument, long_name='instrument_type', units=1) - expected['aux_coords_and_dims'].append((coord, None)) - standard_name = 'sensor_band_central_radiation_wavenumber' - coord = AuxCoord(values / (10.0 ** factors), - standard_name=standard_name, - units='m-1') - expected['aux_coords_and_dims'].append((coord, None)) + coord = AuxCoord(series, long_name="satellite_series", units=1) + expected["aux_coords_and_dims"].append((coord, None)) + coord = AuxCoord(number, long_name="satellite_number", units=1) + expected["aux_coords_and_dims"].append((coord, None)) + coord = AuxCoord(instrument, long_name="instrument_type", units=1) + expected["aux_coords_and_dims"].append((coord, None)) + standard_name = "sensor_band_central_radiation_wavenumber" + coord = AuxCoord( + values / (10.0**factors), standard_name=standard_name, units="m-1" + ) + expected["aux_coords_and_dims"].append((coord, None)) self.assertEqual(metadata, expected) def test_basic(self): @@ -64,5 +66,5 @@ def test_multiple_wavelengths(self): self._check(values=values, factors=factors) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_scanning_mode.py b/iris_grib/tests/unit/load_convert/test_scanning_mode.py index da554f53..00d8332a 100644 --- a/iris_grib/tests/unit/load_convert/test_scanning_mode.py +++ b/iris_grib/tests/unit/load_convert/test_scanning_mode.py @@ -22,18 +22,21 @@ def test_unset(self): self.assertEqual(scanning_mode(0x0), expected) def test_i_negative(self): - expected = ScanningMode(i_negative=True, j_positive=False, - j_consecutive=False, i_alternative=False) + expected = ScanningMode( + i_negative=True, j_positive=False, j_consecutive=False, i_alternative=False + ) self.assertEqual(scanning_mode(0x80), expected) def test_j_positive(self): - expected = ScanningMode(i_negative=False, j_positive=True, - j_consecutive=False, i_alternative=False) + expected = ScanningMode( + i_negative=False, j_positive=True, j_consecutive=False, i_alternative=False + ) self.assertEqual(scanning_mode(0x40), expected) def test_j_consecutive(self): - expected = ScanningMode(i_negative=False, j_positive=False, - j_consecutive=True, i_alternative=False) + expected = ScanningMode( + i_negative=False, j_positive=False, j_consecutive=True, i_alternative=False + ) self.assertEqual(scanning_mode(0x20), expected) def test_i_alternative(self): @@ -41,5 +44,5 @@ def test_i_alternative(self): scanning_mode(0x10) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_statistical_cell_method.py b/iris_grib/tests/unit/load_convert/test_statistical_cell_method.py index 551b1826..ef2ba3be 100644 --- a/iris_grib/tests/unit/load_convert/test_statistical_cell_method.py +++ b/iris_grib/tests/unit/load_convert/test_statistical_cell_method.py @@ -21,14 +21,13 @@ class Test(tests.IrisGribTest): def setUp(self): self.section = {} - self.section['productDefinitionTemplateNumber'] = 8 - self.section['numberOfTimeRange'] = 1 - self.section['typeOfStatisticalProcessing'] = 0 - self.section['typeOfTimeIncrement'] = 2 - self.section['timeIncrement'] = 0 - - def expected_cell_method(self, - coords=('time',), method='mean', intervals=None): + self.section["productDefinitionTemplateNumber"] = 8 + self.section["numberOfTimeRange"] = 1 + self.section["typeOfStatisticalProcessing"] = 0 + self.section["typeOfTimeIncrement"] = 2 + self.section["timeIncrement"] = 0 + + def expected_cell_method(self, coords=("time",), method="mean", intervals=None): keys = dict(coords=coords, method=method, intervals=intervals) cell_method = CellMethod(**keys) return cell_method @@ -38,85 +37,84 @@ def test_basic(self): self.assertEqual(cell_method, self.expected_cell_method()) def test_intervals(self): - self.section['timeIncrement'] = 3 - self.section['indicatorOfUnitForTimeIncrement'] = 1 + self.section["timeIncrement"] = 3 + self.section["indicatorOfUnitForTimeIncrement"] = 1 cell_method = statistical_cell_method(self.section) - self.assertEqual(cell_method, - self.expected_cell_method(intervals=('3 hours',))) + self.assertEqual(cell_method, self.expected_cell_method(intervals=("3 hours",))) def test_increment_missing(self): - self.section['timeIncrement'] = 2 ** 32 - 1 - self.section['indicatorOfUnitForTimeIncrement'] = 255 + self.section["timeIncrement"] = 2**32 - 1 + self.section["indicatorOfUnitForTimeIncrement"] = 255 cell_method = statistical_cell_method(self.section) self.assertEqual(cell_method, self.expected_cell_method()) def test_different_statistic(self): - self.section['typeOfStatisticalProcessing'] = 6 + self.section["typeOfStatisticalProcessing"] = 6 cell_method = statistical_cell_method(self.section) self.assertEqual( - cell_method, - self.expected_cell_method(method='standard_deviation')) + cell_method, self.expected_cell_method(method="standard_deviation") + ) def test_fail_bad_ranges(self): - self.section['numberOfTimeRange'] = 0 - with self.assertRaisesRegex(TranslationError, - 'aggregation over "0 time ranges"'): + self.section["numberOfTimeRange"] = 0 + with self.assertRaisesRegex( + TranslationError, 'aggregation over "0 time ranges"' + ): statistical_cell_method(self.section) def test_fail_multiple_ranges(self): - self.section['numberOfTimeRange'] = 2 - with self.assertRaisesRegex(TranslationError, - r'multiple time ranges \[2\]'): + self.section["numberOfTimeRange"] = 2 + with self.assertRaisesRegex(TranslationError, r"multiple time ranges \[2\]"): statistical_cell_method(self.section) def test_fail_unknown_statistic(self): - self.section['typeOfStatisticalProcessing'] = 17 + self.section["typeOfStatisticalProcessing"] = 17 with self.assertRaisesRegex( - TranslationError, - r'contains an unsupported statistical process type \[17\]'): + TranslationError, r"contains an unsupported statistical process type \[17\]" + ): statistical_cell_method(self.section) def test_fail_bad_increment_type(self): - self.section['typeOfTimeIncrement'] = 7 + self.section["typeOfTimeIncrement"] = 7 with self.assertRaisesRegex( - TranslationError, - r'time-increment type \[7\] is not supported'): + TranslationError, r"time-increment type \[7\] is not supported" + ): statistical_cell_method(self.section) def test_pdt_9(self): # Should behave the same as PDT 4.8. - self.section['productDefinitionTemplateNumber'] = 9 + self.section["productDefinitionTemplateNumber"] = 9 cell_method = statistical_cell_method(self.section) self.assertEqual(cell_method, self.expected_cell_method()) def test_pdt_10(self): # Should behave the same as PDT 4.8. - self.section['productDefinitionTemplateNumber'] = 10 + self.section["productDefinitionTemplateNumber"] = 10 cell_method = statistical_cell_method(self.section) self.assertEqual(cell_method, self.expected_cell_method()) def test_pdt_11(self): # Should behave the same as PDT 4.8. - self.section['productDefinitionTemplateNumber'] = 11 + self.section["productDefinitionTemplateNumber"] = 11 cell_method = statistical_cell_method(self.section) self.assertEqual(cell_method, self.expected_cell_method()) def test_pdt_15(self): # Encoded slightly differently to PDT 4.8. - self.section['productDefinitionTemplateNumber'] = 15 - test_code = self.section['typeOfStatisticalProcessing'] - del self.section['typeOfStatisticalProcessing'] - self.section['statisticalProcess'] = test_code + self.section["productDefinitionTemplateNumber"] = 15 + test_code = self.section["typeOfStatisticalProcessing"] + del self.section["typeOfStatisticalProcessing"] + self.section["statisticalProcess"] = test_code cell_method = statistical_cell_method(self.section) self.assertEqual(cell_method, self.expected_cell_method()) def test_fail_unsupported_pdt(self): # Rejects PDTs other than the ones tested above. - self.section['productDefinitionTemplateNumber'] = 101 + self.section["productDefinitionTemplateNumber"] = 101 msg = "can't get statistical method for unsupported pdt : 4.101" with self.assertRaisesRegex(ValueError, msg): statistical_cell_method(self.section) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_statistical_forecast_period_coord.py b/iris_grib/tests/unit/load_convert/test_statistical_forecast_period_coord.py index 1873597d..b825edc6 100644 --- a/iris_grib/tests/unit/load_convert/test_statistical_forecast_period_coord.py +++ b/iris_grib/tests/unit/load_convert/test_statistical_forecast_period_coord.py @@ -19,33 +19,32 @@ class Test(tests.IrisGribTest): def setUp(self): - module = 'iris_grib._load_convert' + module = "iris_grib._load_convert" self.module = module - self.patch_hindcast = self.patch(module + '._hindcast_fix') + self.patch_hindcast = self.patch(module + "._hindcast_fix") self.forecast_seconds = 0.0 self.forecast_units = mock.Mock() self.forecast_units.convert = lambda x, y: self.forecast_seconds - self.patch(module + '.time_range_unit', - return_value=self.forecast_units) + self.patch(module + ".time_range_unit", return_value=self.forecast_units) self.frt_coord = mock.Mock() self.frt_coord.points = [1] self.frt_coord.units.num2date = mock.Mock( - return_value=datetime.datetime(2010, 2, 3)) + return_value=datetime.datetime(2010, 2, 3) + ) self.section = {} - self.section['yearOfEndOfOverallTimeInterval'] = 2010 - self.section['monthOfEndOfOverallTimeInterval'] = 2 - self.section['dayOfEndOfOverallTimeInterval'] = 3 - self.section['hourOfEndOfOverallTimeInterval'] = 8 - self.section['minuteOfEndOfOverallTimeInterval'] = 0 - self.section['secondOfEndOfOverallTimeInterval'] = 0 - self.section['forecastTime'] = mock.Mock() - self.section['indicatorOfUnitOfTimeRange'] = mock.Mock() + self.section["yearOfEndOfOverallTimeInterval"] = 2010 + self.section["monthOfEndOfOverallTimeInterval"] = 2 + self.section["dayOfEndOfOverallTimeInterval"] = 3 + self.section["hourOfEndOfOverallTimeInterval"] = 8 + self.section["minuteOfEndOfOverallTimeInterval"] = 0 + self.section["secondOfEndOfOverallTimeInterval"] = 0 + self.section["forecastTime"] = mock.Mock() + self.section["indicatorOfUnitOfTimeRange"] = mock.Mock() def test_basic(self): - coord = statistical_forecast_period_coord(self.section, - self.frt_coord) - self.assertEqual(coord.standard_name, 'forecast_period') - self.assertEqual(coord.units, 'hours') + coord = statistical_forecast_period_coord(self.section, self.frt_coord) + self.assertEqual(coord.standard_name, "forecast_period") + self.assertEqual(coord.units, "hours") self.assertArrayAlmostEqual(coord.points, [4.0]) self.assertArrayAlmostEqual(coord.bounds, [[0.0, 8.0]]) @@ -54,10 +53,10 @@ def test_with_hindcast(self): self.assertEqual(self.patch_hindcast.call_count, 1) def test_no_hindcast(self): - self.patch(self.module + '.options.support_hindcast_values', False) + self.patch(self.module + ".options.support_hindcast_values", False) _ = statistical_forecast_period_coord(self.section, self.frt_coord) self.assertEqual(self.patch_hindcast.call_count, 0) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_time_range_unit.py b/iris_grib/tests/unit/load_convert/test_time_range_unit.py index ffe09250..e8b9f73e 100644 --- a/iris_grib/tests/unit/load_convert/test_time_range_unit.py +++ b/iris_grib/tests/unit/load_convert/test_time_range_unit.py @@ -19,13 +19,15 @@ class Test(tests.IrisGribTest): def setUp(self): - self.unit_by_indicator = {0: Unit('minutes'), - 1: Unit('hours'), - 2: Unit('days'), - 10: Unit('3 hours'), - 11: Unit('6 hours'), - 12: Unit('12 hours'), - 13: Unit('seconds')} + self.unit_by_indicator = { + 0: Unit("minutes"), + 1: Unit("hours"), + 2: Unit("days"), + 10: Unit("3 hours"), + 11: Unit("6 hours"), + 12: Unit("12 hours"), + 13: Unit("seconds"), + } def test_units(self): for indicator, unit in self.unit_by_indicator.items(): @@ -33,10 +35,10 @@ def test_units(self): self.assertEqual(result, unit) def test_bad_indicator(self): - emsg = 'unsupported time range' + emsg = "unsupported time range" with self.assertRaisesRegex(TranslationError, emsg): time_range_unit(-1) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_translate_phenomenon.py b/iris_grib/tests/unit/load_convert/test_translate_phenomenon.py index fed63e4d..b19a03db 100644 --- a/iris_grib/tests/unit/load_convert/test_translate_phenomenon.py +++ b/iris_grib/tests/unit/load_convert/test_translate_phenomenon.py @@ -21,43 +21,50 @@ class Test_probability(tests.IrisGribTest): def setUp(self): # Patch inner call to return a given phenomenon type. - target_module = 'iris_grib._load_convert' + target_module = "iris_grib._load_convert" self.phenom_lookup_patch = self.patch( - target_module + '.itranslation.grib2_phenom_to_cf_info', - return_value=Grib1CfData('air_temperature', '', 'K', None)) + target_module + ".itranslation.grib2_phenom_to_cf_info", + return_value=Grib1CfData("air_temperature", "", "K", None), + ) # Construct dummy call arguments - self.probability = Probability('', 22.0) - self.metadata = {'aux_coords_and_dims': [], 'attributes': {}} + self.probability = Probability("", 22.0) + self.metadata = {"aux_coords_and_dims": [], "attributes": {}} def test_basic(self): - translate_phenomenon(self.metadata, 7, 8, 9, None, - None, None, probability=self.probability) + translate_phenomenon( + self.metadata, 7, 8, 9, None, None, None, probability=self.probability + ) # Check metadata. - thresh_coord = DimCoord([22.0], - standard_name='air_temperature', - long_name='', units='K') - self.assertEqual(self.metadata, { - 'standard_name': None, - 'long_name': 'probability_of_air_temperature_', - 'units': Unit(1), - 'aux_coords_and_dims': [(thresh_coord, None)], - 'attributes': {'GRIB_PARAM': GRIBCode(2, 7, 8, 9)}}) + thresh_coord = DimCoord( + [22.0], standard_name="air_temperature", long_name="", units="K" + ) + self.assertEqual( + self.metadata, + { + "standard_name": None, + "long_name": "probability_of_air_temperature_", + "units": Unit(1), + "aux_coords_and_dims": [(thresh_coord, None)], + "attributes": {"GRIB_PARAM": GRIBCode(2, 7, 8, 9)}, + }, + ) def test_no_phenomenon(self): self.phenom_lookup_patch.return_value = None expected_metadata = self.metadata.copy() - translate_phenomenon(self.metadata, - discipline=7, - parameterCategory=77, - parameterNumber=777, - typeOfFirstFixedSurface=None, - scaledValueOfFirstFixedSurface=None, - typeOfSecondFixedSurface=None, - probability=self.probability) - expected_metadata['attributes']['GRIB_PARAM'] = \ - GRIBCode(2, 7, 77, 777) + translate_phenomenon( + self.metadata, + discipline=7, + parameterCategory=77, + parameterNumber=777, + typeOfFirstFixedSurface=None, + scaledValueOfFirstFixedSurface=None, + typeOfSecondFixedSurface=None, + probability=self.probability, + ) + expected_metadata["attributes"]["GRIB_PARAM"] = GRIBCode(2, 7, 77, 777) self.assertEqual(self.metadata, expected_metadata) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_unscale.py b/iris_grib/tests/unit/load_convert/test_unscale.py index a3f615bb..0005b13a 100644 --- a/iris_grib/tests/unit/load_convert/test_unscale.py +++ b/iris_grib/tests/unit/load_convert/test_unscale.py @@ -31,10 +31,12 @@ def test_single_mdi(self): self.assertIs(unscale(MDI, 1), ma.masked) def test_array(self): - items = [[1, [0.1, 1.2, 12.3, 123.4]], - [-1, [10.0, 120.0, 1230.0, 12340.0]], - [2, [0.01, 0.12, 1.23, 12.34]], - [-2, [100.0, 1200.0, 12300.0, 123400.0]]] + items = [ + [1, [0.1, 1.2, 12.3, 123.4]], + [-1, [10.0, 120.0, 1230.0, 12340.0]], + [2, [0.01, 0.12, 1.23, 12.34]], + [-2, [100.0, 1200.0, 12300.0, 123400.0]], + ] values = np.array([1, 12, 123, 1234]) for factor, expected in items: result = unscale(values, [factor] * values.size) @@ -48,5 +50,5 @@ def test_array_mdi(self): np.testing.assert_array_almost_equal(result, expected) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_validity_time_coord.py b/iris_grib/tests/unit/load_convert/test_validity_time_coord.py index e3ba9c69..45068226 100644 --- a/iris_grib/tests/unit/load_convert/test_validity_time_coord.py +++ b/iris_grib/tests/unit/load_convert/test_validity_time_coord.py @@ -22,30 +22,31 @@ class Test(tests.IrisGribTest): def setUp(self): - self.fp = DimCoord(5, standard_name='forecast_period', units='hours') + self.fp = DimCoord(5, standard_name="forecast_period", units="hours") self.fp_test_bounds = np.array([[1.0, 9.0]]) - self.unit = Unit('hours since epoch') - self.frt = DimCoord(10, standard_name='forecast_reference_time', - units=self.unit) + self.unit = Unit("hours since epoch") + self.frt = DimCoord( + 10, standard_name="forecast_reference_time", units=self.unit + ) def test_frt_shape(self): frt = mock.Mock(shape=(2,)) fp = mock.Mock(shape=(1,)) - emsg = 'scalar forecast reference time' + emsg = "scalar forecast reference time" with self.assertRaisesRegex(ValueError, emsg): validity_time_coord(frt, fp) def test_fp_shape(self): frt = mock.Mock(shape=(1,)) fp = mock.Mock(shape=(2,)) - emsg = 'scalar forecast period' + emsg = "scalar forecast period" with self.assertRaisesRegex(ValueError, emsg): validity_time_coord(frt, fp) def test(self): coord = validity_time_coord(self.frt, self.fp) self.assertIsInstance(coord, DimCoord) - self.assertEqual(coord.standard_name, 'time') + self.assertEqual(coord.standard_name, "time") self.assertEqual(coord.units, self.unit) self.assertEqual(coord.shape, (1,)) point = self.frt.points[0] + self.fp.points[0] @@ -56,7 +57,7 @@ def test_bounded(self): self.fp.bounds = self.fp_test_bounds coord = validity_time_coord(self.frt, self.fp) self.assertIsInstance(coord, DimCoord) - self.assertEqual(coord.standard_name, 'time') + self.assertEqual(coord.standard_name, "time") self.assertEqual(coord.units, self.unit) self.assertEqual(coord.shape, (1,)) point = self.frt.points[0] + self.fp.points[0] @@ -66,5 +67,5 @@ def test_bounded(self): self.assertArrayAlmostEqual(coord.bounds, bounds) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_vertical_coords.py b/iris_grib/tests/unit/load_convert/test_vertical_coords.py index 2f77c0b8..d619e018 100644 --- a/iris_grib/tests/unit/load_convert/test_vertical_coords.py +++ b/iris_grib/tests/unit/load_convert/test_vertical_coords.py @@ -18,183 +18,210 @@ from iris.exceptions import TranslationError from iris_grib._load_convert import vertical_coords -from iris_grib._load_convert import \ - _TYPE_OF_FIXED_SURFACE_MISSING as MISSING_SURFACE, \ - _MDI as MISSING_LEVEL +from iris_grib._load_convert import ( + _TYPE_OF_FIXED_SURFACE_MISSING as MISSING_SURFACE, + _MDI as MISSING_LEVEL, +) class Test(tests.IrisGribTest): def setUp(self): - self.metadata = {'factories': [], 'references': [], - 'standard_name': None, - 'long_name': None, 'units': None, 'attributes': {}, - 'cell_methods': [], 'dim_coords_and_dims': [], - 'aux_coords_and_dims': []} + self.metadata = { + "factories": [], + "references": [], + "standard_name": None, + "long_name": None, + "units": None, + "attributes": {}, + "cell_methods": [], + "dim_coords_and_dims": [], + "aux_coords_and_dims": [], + } def test_hybrid_factories(self): def func(section, metadata): - return metadata['factories'].append(factory) + return metadata["factories"].append(factory) metadata = deepcopy(self.metadata) - section = {'NV': 1} - this = 'iris_grib._load_convert.hybrid_factories' + section = {"NV": 1} + this = "iris_grib._load_convert.hybrid_factories" factory = mock.sentinel.factory with mock.patch(this, side_effect=func) as hybrid_factories: vertical_coords(section, metadata) self.assertTrue(hybrid_factories.called) - self.assertEqual(metadata['factories'], [factory]) + self.assertEqual(metadata["factories"], [factory]) def test_no_first_fixed_surface(self): metadata = deepcopy(self.metadata) - section = {'NV': 0, - 'typeOfFirstFixedSurface': MISSING_SURFACE, - 'scaledValueOfFirstFixedSurface': MISSING_LEVEL} + section = { + "NV": 0, + "typeOfFirstFixedSurface": MISSING_SURFACE, + "scaledValueOfFirstFixedSurface": MISSING_LEVEL, + } vertical_coords(section, metadata) self.assertEqual(metadata, self.metadata) def test_fixed_surface_type_1(self): metadata = deepcopy(self.metadata) - section = {'NV': 0, - 'typeOfFirstFixedSurface': 1, - 'scaledValueOfFirstFixedSurface': 0, - 'scaleFactorOfFirstFixedSurface': 0, - 'typeOfSecondFixedSurface': 255} + section = { + "NV": 0, + "typeOfFirstFixedSurface": 1, + "scaledValueOfFirstFixedSurface": 0, + "scaleFactorOfFirstFixedSurface": 0, + "typeOfSecondFixedSurface": 255, + } vertical_coords(section, metadata) # No metadata change, as surfaceType=1 translates to "no vertical # coord" without error or warning. self.assertEqual(metadata, self.metadata) def test_unknown_first_fixed_surface_with_missing_scaled_value(self): - this = 'iris_grib._load_convert.options' - with mock.patch('warnings.warn') as warn: + this = "iris_grib._load_convert.options" + with mock.patch("warnings.warn") as warn: with mock.patch(this) as options: for request_warning in [False, True]: options.warn_on_unsupported = request_warning metadata = deepcopy(self.metadata) - section = {'NV': 0, - 'typeOfFirstFixedSurface': 0, - 'scaledValueOfFirstFixedSurface': MISSING_LEVEL} + section = { + "NV": 0, + "typeOfFirstFixedSurface": 0, + "scaledValueOfFirstFixedSurface": MISSING_LEVEL, + } # The call being tested. vertical_coords(section, metadata) self.assertEqual(metadata, self.metadata) if request_warning: self.assertEqual(len(warn.mock_calls), 1) args, _ = warn.call_args - self.assertIn('surface with missing scaled value', - args[0]) + self.assertIn("surface with missing scaled value", args[0]) else: self.assertEqual(len(warn.mock_calls), 0) def test_unknown_first_fixed_surface(self): metadata = deepcopy(self.metadata) expected = deepcopy(self.metadata) - coord = DimCoord(600.0, attributes={'GRIB_fixed_surface_type': 106}) - expected['aux_coords_and_dims'].append((coord, None)) - - section = {'NV': 0, - 'typeOfFirstFixedSurface': 106, - 'scaledValueOfFirstFixedSurface': 600, - 'scaleFactorOfFirstFixedSurface': 0, - 'typeOfSecondFixedSurface': MISSING_SURFACE} + coord = DimCoord(600.0, attributes={"GRIB_fixed_surface_type": 106}) + expected["aux_coords_and_dims"].append((coord, None)) + + section = { + "NV": 0, + "typeOfFirstFixedSurface": 106, + "scaledValueOfFirstFixedSurface": 600, + "scaleFactorOfFirstFixedSurface": 0, + "typeOfSecondFixedSurface": MISSING_SURFACE, + } vertical_coords(section, metadata) self.assertEqual(metadata, expected) def test_unknown_first_fixed_surface_with_second_fixed_surface(self): metadata = deepcopy(self.metadata) expected = deepcopy(self.metadata) - coord = DimCoord(9000.0, bounds=[18000, 0], - attributes={'GRIB_fixed_surface_type': 108}) - expected['aux_coords_and_dims'].append((coord, None)) - - section = {'NV': 0, - 'typeOfFirstFixedSurface': 108, - 'scaledValueOfFirstFixedSurface': 18000, - 'scaleFactorOfFirstFixedSurface': 0, - 'typeOfSecondFixedSurface': 108, - 'scaledValueOfSecondFixedSurface': 0, - 'scaleFactorOfSecondFixedSurface': 0} + coord = DimCoord( + 9000.0, bounds=[18000, 0], attributes={"GRIB_fixed_surface_type": 108} + ) + expected["aux_coords_and_dims"].append((coord, None)) + + section = { + "NV": 0, + "typeOfFirstFixedSurface": 108, + "scaledValueOfFirstFixedSurface": 18000, + "scaleFactorOfFirstFixedSurface": 0, + "typeOfSecondFixedSurface": 108, + "scaledValueOfSecondFixedSurface": 0, + "scaleFactorOfSecondFixedSurface": 0, + } vertical_coords(section, metadata) self.assertEqual(metadata, expected) def test_pressure_with_no_second_fixed_surface(self): metadata = deepcopy(self.metadata) - section = {'NV': 0, - 'typeOfFirstFixedSurface': 100, # pressure / Pa - 'scaledValueOfFirstFixedSurface': 10, - 'scaleFactorOfFirstFixedSurface': 1, - 'typeOfSecondFixedSurface': MISSING_SURFACE} + section = { + "NV": 0, + "typeOfFirstFixedSurface": 100, # pressure / Pa + "scaledValueOfFirstFixedSurface": 10, + "scaleFactorOfFirstFixedSurface": 1, + "typeOfSecondFixedSurface": MISSING_SURFACE, + } vertical_coords(section, metadata) - coord = DimCoord(1.0, long_name='pressure', units='Pa') + coord = DimCoord(1.0, long_name="pressure", units="Pa") expected = deepcopy(self.metadata) - expected['aux_coords_and_dims'].append((coord, None)) + expected["aux_coords_and_dims"].append((coord, None)) self.assertEqual(metadata, expected) def test_height_with_no_second_fixed_surface(self): metadata = deepcopy(self.metadata) - section = {'NV': 0, - 'typeOfFirstFixedSurface': 103, # height / m - 'scaledValueOfFirstFixedSurface': 100, - 'scaleFactorOfFirstFixedSurface': 2, - 'typeOfSecondFixedSurface': MISSING_SURFACE} + section = { + "NV": 0, + "typeOfFirstFixedSurface": 103, # height / m + "scaledValueOfFirstFixedSurface": 100, + "scaleFactorOfFirstFixedSurface": 2, + "typeOfSecondFixedSurface": MISSING_SURFACE, + } vertical_coords(section, metadata) - coord = DimCoord(1.0, long_name='height', units='m') + coord = DimCoord(1.0, long_name="height", units="m") expected = deepcopy(self.metadata) - expected['aux_coords_and_dims'].append((coord, None)) + expected["aux_coords_and_dims"].append((coord, None)) self.assertEqual(metadata, expected) def test_different_fixed_surfaces(self): - section = {'NV': 0, - 'typeOfFirstFixedSurface': 100, - 'scaledValueOfFirstFixedSurface': 10, - 'scaleFactorOfFirstFixedSurface': 1, - 'typeOfSecondFixedSurface': 0} - emsg = 'different types of first and second fixed surface' + section = { + "NV": 0, + "typeOfFirstFixedSurface": 100, + "scaledValueOfFirstFixedSurface": 10, + "scaleFactorOfFirstFixedSurface": 1, + "typeOfSecondFixedSurface": 0, + } + emsg = "different types of first and second fixed surface" with self.assertRaisesRegex(TranslationError, emsg): vertical_coords(section, None) def test_same_fixed_surfaces_missing_second_scaled_value(self): - section = {'NV': 0, - 'typeOfFirstFixedSurface': 100, - 'scaledValueOfFirstFixedSurface': 10, - 'scaleFactorOfFirstFixedSurface': 1, - 'typeOfSecondFixedSurface': 100, - 'scaledValueOfSecondFixedSurface': MISSING_LEVEL} - emsg = 'missing scaled value of second fixed surface' + section = { + "NV": 0, + "typeOfFirstFixedSurface": 100, + "scaledValueOfFirstFixedSurface": 10, + "scaleFactorOfFirstFixedSurface": 1, + "typeOfSecondFixedSurface": 100, + "scaledValueOfSecondFixedSurface": MISSING_LEVEL, + } + emsg = "missing scaled value of second fixed surface" with self.assertRaisesRegex(TranslationError, emsg): vertical_coords(section, None) def test_pressure_with_second_fixed_surface(self): metadata = deepcopy(self.metadata) - section = {'NV': 0, - 'typeOfFirstFixedSurface': 100, - 'scaledValueOfFirstFixedSurface': 10, - 'scaleFactorOfFirstFixedSurface': 1, - 'typeOfSecondFixedSurface': 100, - 'scaledValueOfSecondFixedSurface': 30, - 'scaleFactorOfSecondFixedSurface': 1} + section = { + "NV": 0, + "typeOfFirstFixedSurface": 100, + "scaledValueOfFirstFixedSurface": 10, + "scaleFactorOfFirstFixedSurface": 1, + "typeOfSecondFixedSurface": 100, + "scaledValueOfSecondFixedSurface": 30, + "scaleFactorOfSecondFixedSurface": 1, + } vertical_coords(section, metadata) - coord = DimCoord(2.0, long_name='pressure', units='Pa', - bounds=[1.0, 3.0]) + coord = DimCoord(2.0, long_name="pressure", units="Pa", bounds=[1.0, 3.0]) expected = deepcopy(self.metadata) - expected['aux_coords_and_dims'].append((coord, None)) + expected["aux_coords_and_dims"].append((coord, None)) self.assertEqual(metadata, expected) def test_height_with_second_fixed_surface(self): metadata = deepcopy(self.metadata) - section = {'NV': 0, - 'typeOfFirstFixedSurface': 103, - 'scaledValueOfFirstFixedSurface': 1000, - 'scaleFactorOfFirstFixedSurface': 2, - 'typeOfSecondFixedSurface': 103, - 'scaledValueOfSecondFixedSurface': 3000, - 'scaleFactorOfSecondFixedSurface': 2} + section = { + "NV": 0, + "typeOfFirstFixedSurface": 103, + "scaledValueOfFirstFixedSurface": 1000, + "scaleFactorOfFirstFixedSurface": 2, + "typeOfSecondFixedSurface": 103, + "scaledValueOfSecondFixedSurface": 3000, + "scaleFactorOfSecondFixedSurface": 2, + } vertical_coords(section, metadata) - coord = DimCoord(20.0, long_name='height', units='m', - bounds=[10.0, 30.0]) + coord = DimCoord(20.0, long_name="height", units="m", bounds=[10.0, 30.0]) expected = deepcopy(self.metadata) - expected['aux_coords_and_dims'].append((coord, None)) + expected["aux_coords_and_dims"].append((coord, None)) self.assertEqual(metadata, expected) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/message/test_GribMessage.py b/iris_grib/tests/unit/message/test_GribMessage.py index 12318b93..ca2248da 100644 --- a/iris_grib/tests/unit/message/test_GribMessage.py +++ b/iris_grib/tests/unit/message/test_GribMessage.py @@ -24,24 +24,23 @@ from iris_grib.tests.unit import _make_test_message -SECTION_6_NO_BITMAP = {'bitMapIndicator': 255, 'bitmap': None} +SECTION_6_NO_BITMAP = {"bitMapIndicator": 255, "bitmap": None} @tests.skip_data class Test_messages_from_filename(tests.IrisGribTest): def test(self): - filename = tests.get_data_path(('GRIB', '3_layer_viz', - '3_layer.grib2')) + filename = tests.get_data_path(("GRIB", "3_layer_viz", "3_layer.grib2")) messages = list(GribMessage.messages_from_filename(filename)) self.assertEqual(len(messages), 3) def test_release_file(self): - filename = tests.get_data_path(('GRIB', '3_layer_viz', - '3_layer.grib2')) + filename = tests.get_data_path(("GRIB", "3_layer_viz", "3_layer.grib2")) my_file = open(filename) import builtins # noqa: F401 - self.patch('builtins.open', mock.Mock(return_value=my_file)) + + self.patch("builtins.open", mock.Mock(return_value=my_file)) messages = list(GribMessage.messages_from_filename(filename)) self.assertFalse(my_file.closed) @@ -61,19 +60,21 @@ class Test_data__masked(tests.IrisGribTest): def setUp(self): self.bitmap = np.array([0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1]) self.shape = (3, 4) - self._section_3 = {'sourceOfGridDefinition': 0, - 'numberOfOctectsForNumberOfPoints': 0, - 'interpretationOfNumberOfPoints': 0, - 'gridDefinitionTemplateNumber': 0, - 'scanningMode': 0, - 'Nj': self.shape[0], - 'Ni': self.shape[1]} + self._section_3 = { + "sourceOfGridDefinition": 0, + "numberOfOctectsForNumberOfPoints": 0, + "interpretationOfNumberOfPoints": 0, + "gridDefinitionTemplateNumber": 0, + "scanningMode": 0, + "Nj": self.shape[0], + "Ni": self.shape[1], + } def test_no_bitmap(self): values = np.arange(12) - message = _make_test_message({3: self._section_3, - 6: SECTION_6_NO_BITMAP, - 7: {'codedValues': values}}) + message = _make_test_message( + {3: self._section_3, 6: SECTION_6_NO_BITMAP, 7: {"codedValues": values}} + ) result = as_concrete_data(message.data) expected = values.reshape(self.shape) self.assertEqual(result.shape, self.shape) @@ -84,13 +85,15 @@ def test_bitmap_present(self): # are not equal. input_values = np.arange(5) output_values = np.array([-1, -1, 0, 1, -1, -1, -1, 2, -1, 3, -1, 4]) - message = _make_test_message({3: self._section_3, - 6: {'bitMapIndicator': 0, - 'bitmap': self.bitmap}, - 7: {'codedValues': input_values}}) + message = _make_test_message( + { + 3: self._section_3, + 6: {"bitMapIndicator": 0, "bitmap": self.bitmap}, + 7: {"codedValues": input_values}, + } + ) result = as_concrete_data(message.data) - expected = ma.masked_array(output_values, - np.logical_not(self.bitmap)) + expected = ma.masked_array(output_values, np.logical_not(self.bitmap)) expected = expected.reshape(self.shape) self.assertMaskedArrayEqual(result, expected) @@ -98,56 +101,78 @@ def test_bitmap__shapes_mismatch(self): # Test the behaviour where bitmap and codedValues shapes do not match. # Too many or too few unmasked values in codedValues will cause this. values = np.arange(6) - message = _make_test_message({3: self._section_3, - 6: {'bitMapIndicator': 0, - 'bitmap': self.bitmap}, - 7: {'codedValues': values}}) - with self.assertRaisesRegex(TranslationError, 'do not match'): + message = _make_test_message( + { + 3: self._section_3, + 6: {"bitMapIndicator": 0, "bitmap": self.bitmap}, + 7: {"codedValues": values}, + } + ) + with self.assertRaisesRegex(TranslationError, "do not match"): as_concrete_data(message.data) def test_bitmap__invalid_indicator(self): values = np.arange(12) - message = _make_test_message({3: self._section_3, - 6: {'bitMapIndicator': 100, - 'bitmap': None}, - 7: {'codedValues': values}}) - with self.assertRaisesRegex(TranslationError, 'unsupported bitmap'): + message = _make_test_message( + { + 3: self._section_3, + 6: {"bitMapIndicator": 100, "bitmap": None}, + 7: {"codedValues": values}, + } + ) + with self.assertRaisesRegex(TranslationError, "unsupported bitmap"): as_concrete_data(message.data) class Test_data__unsupported(tests.IrisGribTest): def test_unsupported_grid_definition(self): - message = _make_test_message({3: {'sourceOfGridDefinition': 1}, - 6: SECTION_6_NO_BITMAP}) - with self.assertRaisesRegex(TranslationError, 'source'): + message = _make_test_message( + {3: {"sourceOfGridDefinition": 1}, 6: SECTION_6_NO_BITMAP} + ) + with self.assertRaisesRegex(TranslationError, "source"): message.data def test_unsupported_quasi_regular__number_of_octets(self): message = _make_test_message( - {3: {'sourceOfGridDefinition': 0, - 'numberOfOctectsForNumberOfPoints': 1, - 'gridDefinitionTemplateNumber': 0}, - 6: SECTION_6_NO_BITMAP}) - with self.assertRaisesRegex(TranslationError, 'quasi-regular'): + { + 3: { + "sourceOfGridDefinition": 0, + "numberOfOctectsForNumberOfPoints": 1, + "gridDefinitionTemplateNumber": 0, + }, + 6: SECTION_6_NO_BITMAP, + } + ) + with self.assertRaisesRegex(TranslationError, "quasi-regular"): message.data def test_unsupported_quasi_regular__interpretation(self): message = _make_test_message( - {3: {'sourceOfGridDefinition': 0, - 'numberOfOctectsForNumberOfPoints': 0, - 'interpretationOfNumberOfPoints': 1, - 'gridDefinitionTemplateNumber': 0}, - 6: SECTION_6_NO_BITMAP}) - with self.assertRaisesRegex(TranslationError, 'quasi-regular'): + { + 3: { + "sourceOfGridDefinition": 0, + "numberOfOctectsForNumberOfPoints": 0, + "interpretationOfNumberOfPoints": 1, + "gridDefinitionTemplateNumber": 0, + }, + 6: SECTION_6_NO_BITMAP, + } + ) + with self.assertRaisesRegex(TranslationError, "quasi-regular"): message.data def test_unsupported_template(self): message = _make_test_message( - {3: {'sourceOfGridDefinition': 0, - 'numberOfOctectsForNumberOfPoints': 0, - 'interpretationOfNumberOfPoints': 0, - 'gridDefinitionTemplateNumber': 2}}) - with self.assertRaisesRegex(TranslationError, 'template'): + { + 3: { + "sourceOfGridDefinition": 0, + "numberOfOctectsForNumberOfPoints": 0, + "interpretationOfNumberOfPoints": 0, + "gridDefinitionTemplateNumber": 2, + } + } + ) + with self.assertRaisesRegex(TranslationError, "template"): message.data @@ -159,23 +184,23 @@ def section_3(self, scanning_mode): raise NotImplementedError() def test_unsupported_scanning_mode(self): - message = _make_test_message( - {3: self.section_3(1), - 6: SECTION_6_NO_BITMAP}) - with self.assertRaisesRegex(TranslationError, 'scanning mode'): + message = _make_test_message({3: self.section_3(1), 6: SECTION_6_NO_BITMAP}) + with self.assertRaisesRegex(TranslationError, "scanning mode"): message.data def _test(self, scanning_mode): message = _make_test_message( - {3: self.section_3(scanning_mode), - 6: SECTION_6_NO_BITMAP, - 7: {'codedValues': np.arange(12)}}) + { + 3: self.section_3(scanning_mode), + 6: SECTION_6_NO_BITMAP, + 7: {"codedValues": np.arange(12)}, + } + ) data = message.data self.assertTrue(is_lazy_data(data)) self.assertEqual(data.shape, (3, 4)) self.assertEqual(data.dtype, np.floating) - self.assertArrayEqual(as_concrete_data(data), - np.arange(12).reshape(3, 4)) + self.assertArrayEqual(as_concrete_data(data), np.arange(12).reshape(3, 4)) def test_regular_mode_0(self): self._test(0) @@ -191,90 +216,88 @@ def test_regular_mode_64_128(self): def _example_section_3(grib_definition_template_number, scanning_mode): - return {'sourceOfGridDefinition': 0, - 'numberOfOctectsForNumberOfPoints': 0, - 'interpretationOfNumberOfPoints': 0, - 'gridDefinitionTemplateNumber': grib_definition_template_number, - 'scanningMode': scanning_mode, - 'Nj': 3, - 'Ni': 4} - - -class Test_data__grid_template_0(tests.IrisGribTest, - Mixin_data__grid_template): + return { + "sourceOfGridDefinition": 0, + "numberOfOctectsForNumberOfPoints": 0, + "interpretationOfNumberOfPoints": 0, + "gridDefinitionTemplateNumber": grib_definition_template_number, + "scanningMode": scanning_mode, + "Nj": 3, + "Ni": 4, + } + + +class Test_data__grid_template_0(tests.IrisGribTest, Mixin_data__grid_template): def section_3(self, scanning_mode): return _example_section_3(0, scanning_mode) -class Test_data__grid_template_1(tests.IrisGribTest, - Mixin_data__grid_template): +class Test_data__grid_template_1(tests.IrisGribTest, Mixin_data__grid_template): def section_3(self, scanning_mode): return _example_section_3(1, scanning_mode) -class Test_data__grid_template_5(tests.IrisGribTest, - Mixin_data__grid_template): +class Test_data__grid_template_5(tests.IrisGribTest, Mixin_data__grid_template): def section_3(self, scanning_mode): return _example_section_3(5, scanning_mode) -class Test_data__grid_template_12(tests.IrisGribTest, - Mixin_data__grid_template): +class Test_data__grid_template_12(tests.IrisGribTest, Mixin_data__grid_template): def section_3(self, scanning_mode): return _example_section_3(12, scanning_mode) -class Test_data__grid_template_30(tests.IrisGribTest, - Mixin_data__grid_template): +class Test_data__grid_template_30(tests.IrisGribTest, Mixin_data__grid_template): def section_3(self, scanning_mode): section_3 = _example_section_3(30, scanning_mode) # Dimensions are 'Nx' + 'Ny' instead of 'Ni' + 'Nj'. - section_3['Nx'] = section_3['Ni'] - section_3['Ny'] = section_3['Nj'] - del section_3['Ni'] - del section_3['Nj'] + section_3["Nx"] = section_3["Ni"] + section_3["Ny"] = section_3["Nj"] + del section_3["Ni"] + del section_3["Nj"] return section_3 -class Test_data__grid_template_40_regular(tests.IrisGribTest, - Mixin_data__grid_template): +class Test_data__grid_template_40_regular( + tests.IrisGribTest, Mixin_data__grid_template +): def section_3(self, scanning_mode): return _example_section_3(40, scanning_mode) -class Test_data__grid_template_90(tests.IrisGribTest, - Mixin_data__grid_template): +class Test_data__grid_template_90(tests.IrisGribTest, Mixin_data__grid_template): def section_3(self, scanning_mode): section_3 = _example_section_3(90, scanning_mode) # Exceptionally, dimensions are 'Nx' + 'Ny' instead of 'Ni' + 'Nj'. - section_3['Nx'] = section_3['Ni'] - section_3['Ny'] = section_3['Nj'] - del section_3['Ni'] - del section_3['Nj'] + section_3["Nx"] = section_3["Ni"] + section_3["Ny"] = section_3["Nj"] + del section_3["Ni"] + del section_3["Nj"] return section_3 -class Test_data__grid_template_140(tests.IrisGribTest, - Mixin_data__grid_template): +class Test_data__grid_template_140(tests.IrisGribTest, Mixin_data__grid_template): def section_3(self, scanning_mode): section_3 = _example_section_3(140, scanning_mode) - section_3['numberOfPointsAlongXAxis'] = section_3['Ni'] - section_3['numberOfPointsAlongYAxis'] = section_3['Nj'] - del section_3['Ni'] - del section_3['Nj'] + section_3["numberOfPointsAlongXAxis"] = section_3["Ni"] + section_3["numberOfPointsAlongYAxis"] = section_3["Nj"] + del section_3["Ni"] + del section_3["Nj"] return section_3 class Test_data__unknown_grid_template(tests.IrisGribTest): def test(self): message = _make_test_message( - {3: _example_section_3(999, 0), - 6: SECTION_6_NO_BITMAP, - 7: {'codedValues': np.arange(12)}}) - with self.assertRaisesRegex(TranslationError, - 'template 999 is not supported'): + { + 3: _example_section_3(999, 0), + 6: SECTION_6_NO_BITMAP, + 7: {"codedValues": np.arange(12)}, + } + ) + with self.assertRaisesRegex(TranslationError, "template 999 is not supported"): _ = message.data -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/message/test_Section.py b/iris_grib/tests/unit/message/test_Section.py index b2f842fa..a1af5277 100644 --- a/iris_grib/tests/unit/message/test_Section.py +++ b/iris_grib/tests/unit/message/test_Section.py @@ -20,49 +20,54 @@ @tests.skip_data class Test___getitem__(tests.IrisGribTest): def setUp(self): - filename = tests.get_data_path(('GRIB', 'uk_t', 'uk_t.grib2')) - with open(filename, 'rb') as grib_fh: + filename = tests.get_data_path(("GRIB", "uk_t", "uk_t.grib2")) + with open(filename, "rb") as grib_fh: self.grib_id = eccodes.codes_new_from_file( grib_fh, eccodes.CODES_PRODUCT_GRIB ) def test_scalar(self): - section = Section(self.grib_id, None, ['Ni']) - self.assertEqual(section['Ni'], 47) + section = Section(self.grib_id, None, ["Ni"]) + self.assertEqual(section["Ni"], 47) def test_array(self): - section = Section(self.grib_id, None, ['codedValues']) - codedValues = section['codedValues'] + section = Section(self.grib_id, None, ["codedValues"]) + codedValues = section["codedValues"] self.assertEqual(codedValues.shape, (1551,)) - self.assertArrayAlmostEqual(codedValues[:3], - [-1.78140259, -1.53140259, -1.28140259]) + self.assertArrayAlmostEqual( + codedValues[:3], [-1.78140259, -1.53140259, -1.28140259] + ) def test_typeOfFirstFixedSurface(self): - section = Section(self.grib_id, None, ['typeOfFirstFixedSurface']) - self.assertEqual(section['typeOfFirstFixedSurface'], 100) + section = Section(self.grib_id, None, ["typeOfFirstFixedSurface"]) + self.assertEqual(section["typeOfFirstFixedSurface"], 100) def test_numberOfSection(self): n = 4 - section = Section(self.grib_id, n, ['numberOfSection']) - self.assertEqual(section['numberOfSection'], n) + section = Section(self.grib_id, n, ["numberOfSection"]) + self.assertEqual(section["numberOfSection"], n) def test_invalid(self): - section = Section(self.grib_id, None, ['Ni']) - with self.assertRaisesRegex(KeyError, 'Nii'): - section['Nii'] + section = Section(self.grib_id, None, ["Ni"]) + with self.assertRaisesRegex(KeyError, "Nii"): + section["Nii"] @tests.skip_data class Test__getitem___pdt_31(tests.IrisGribTest): def setUp(self): - filename = tests.get_data_path(('GRIB', 'umukv', 'ukv_chan9.grib2')) - with open(filename, 'rb') as grib_fh: + filename = tests.get_data_path(("GRIB", "umukv", "ukv_chan9.grib2")) + with open(filename, "rb") as grib_fh: self.grib_id = eccodes.codes_new_from_file( grib_fh, eccodes.CODES_PRODUCT_GRIB ) - self.keys = ['satelliteSeries', 'satelliteNumber', 'instrumentType', - 'scaleFactorOfCentralWaveNumber', - 'scaledValueOfCentralWaveNumber'] + self.keys = [ + "satelliteSeries", + "satelliteNumber", + "instrumentType", + "scaleFactorOfCentralWaveNumber", + "scaledValueOfCentralWaveNumber", + ] def test_array(self): section = Section(self.grib_id, None, self.keys) @@ -75,15 +80,15 @@ def test_array(self): @tests.skip_data class Test_get_computed_key(tests.IrisGribTest): def test_gdt40_computed(self): - fname = tests.get_data_path(('GRIB', 'gaussian', 'regular_gg.grib2')) - with open(fname, 'rb') as grib_fh: + fname = tests.get_data_path(("GRIB", "gaussian", "regular_gg.grib2")) + with open(fname, "rb") as grib_fh: self.grib_id = eccodes.codes_new_from_file( grib_fh, eccodes.CODES_PRODUCT_GRIB ) section = Section(self.grib_id, None, []) - latitudes = section.get_computed_key('latitudes') + latitudes = section.get_computed_key("latitudes") self.assertTrue(88.55 < latitudes[0] < 88.59) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/message/test__DataProxy.py b/iris_grib/tests/unit/message/test__DataProxy.py index 3b3c103b..48fdc1fb 100644 --- a/iris_grib/tests/unit/message/test__DataProxy.py +++ b/iris_grib/tests/unit/message/test__DataProxy.py @@ -20,24 +20,24 @@ class Test__bitmap(tests.IrisGribTest): def test_no_bitmap(self): - section_6 = {'bitMapIndicator': 255, 'bitmap': None} + section_6 = {"bitMapIndicator": 255, "bitmap": None} data_proxy = _DataProxy(0, 0, 0) result = data_proxy._bitmap(section_6) self.assertIsNone(result) def test_bitmap_present(self): bitmap = randint(2, size=(12)) - section_6 = {'bitMapIndicator': 0, 'bitmap': bitmap} + section_6 = {"bitMapIndicator": 0, "bitmap": bitmap} data_proxy = _DataProxy(0, 0, 0) result = data_proxy._bitmap(section_6) self.assertArrayEqual(bitmap, result) def test_bitmap__invalid_indicator(self): - section_6 = {'bitMapIndicator': 100, 'bitmap': None} + section_6 = {"bitMapIndicator": 100, "bitmap": None} data_proxy = _DataProxy(0, 0, 0) - with self.assertRaisesRegex(TranslationError, 'unsupported bitmap'): + with self.assertRaisesRegex(TranslationError, "unsupported bitmap"): data_proxy._bitmap(section_6) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/message/test__MessageLocation.py b/iris_grib/tests/unit/message/test__MessageLocation.py index 890a1a87..8ff5d6ee 100644 --- a/iris_grib/tests/unit/message/test__MessageLocation.py +++ b/iris_grib/tests/unit/message/test__MessageLocation.py @@ -18,16 +18,16 @@ class Test(tests.IrisGribTest): def test(self): - message_location = _MessageLocation(mock.sentinel.filename, - mock.sentinel.location) - patch_target = 'iris_grib.message._RawGribMessage.from_file_offset' + message_location = _MessageLocation( + mock.sentinel.filename, mock.sentinel.location + ) + patch_target = "iris_grib.message._RawGribMessage.from_file_offset" expected = mock.sentinel.message with mock.patch(patch_target, return_value=expected) as rgm: result = message_location() - rgm.assert_called_once_with(mock.sentinel.filename, - mock.sentinel.location) + rgm.assert_called_once_with(mock.sentinel.filename, mock.sentinel.location) self.assertIs(result, expected) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/message/test__RawGribMessage.py b/iris_grib/tests/unit/message/test__RawGribMessage.py index 9f35ba0f..f8b90ea2 100644 --- a/iris_grib/tests/unit/message/test__RawGribMessage.py +++ b/iris_grib/tests/unit/message/test__RawGribMessage.py @@ -19,11 +19,9 @@ @tests.skip_data class Test(tests.IrisGribTest): def setUp(self): - filename = tests.get_data_path(('GRIB', 'uk_t', 'uk_t.grib2')) - with open(filename, 'rb') as grib_fh: - grib_id = eccodes.codes_new_from_file( - grib_fh, eccodes.CODES_PRODUCT_GRIB - ) + filename = tests.get_data_path(("GRIB", "uk_t", "uk_t.grib2")) + with open(filename, "rb") as grib_fh: + grib_id = eccodes.codes_new_from_file(grib_fh, eccodes.CODES_PRODUCT_GRIB) self.message = _RawGribMessage(grib_id) def test_sections__set(self): @@ -32,7 +30,7 @@ def test_sections__set(self): self.assertNotEqual(self.message._sections, None) def test_sections__indexing(self): - res = self.message.sections[3]['scanningMode'] + res = self.message.sections[3]["scanningMode"] expected = 64 self.assertEqual(expected, res) @@ -46,9 +44,9 @@ def test_sections__numberOfSection_value(self): # This tests that the `_RawGribMessage._get_message_sections` # override is functioning. section_number = 4 - res = self.message.sections[section_number]['numberOfSection'] + res = self.message.sections[section_number]["numberOfSection"] self.assertEqual(res, section_number) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/save_rules/__init__.py b/iris_grib/tests/unit/save_rules/__init__.py index 7ccfb2ac..e64ef6fc 100644 --- a/iris_grib/tests/unit/save_rules/__init__.py +++ b/iris_grib/tests/unit/save_rules/__init__.py @@ -19,11 +19,12 @@ class GdtTestMixin: """Some handy common test capabilities for grib grid-definition tests.""" - TARGET_MODULE = 'iris_grib._save_rules' + + TARGET_MODULE = "iris_grib._save_rules" def setUp(self): # Patch the ecCodes of the tested module. - self.mock_eccodes = self.patch(self.TARGET_MODULE + '.eccodes') + self.mock_eccodes = self.patch(self.TARGET_MODULE + ".eccodes") # Fix the mock ecCodes to record key assignments. def codes_set_trap(grib, name, value): @@ -53,8 +54,9 @@ def _default_x_points(self): def _default_y_points(self): return [7.0, 8.0] # N.B. is_regular will *fail* on length-1 coords. - def _make_test_cube(self, cs=None, x_points=None, y_points=None, - coord_units='degrees'): + def _make_test_cube( + self, cs=None, x_points=None, y_points=None, coord_units="degrees" + ): # Create a cube with given properties, or minimal defaults. if cs is None: cs = self._default_coord_system() @@ -63,10 +65,12 @@ def _make_test_cube(self, cs=None, x_points=None, y_points=None, if y_points is None: y_points = self._default_y_points() - x_coord = DimCoord(x_points, long_name='longitude', - units=coord_units, coord_system=cs) - y_coord = DimCoord(y_points, long_name='latitude', - units=coord_units, coord_system=cs) + x_coord = DimCoord( + x_points, long_name="longitude", units=coord_units, coord_system=cs + ) + y_coord = DimCoord( + y_points, long_name="latitude", units=coord_units, coord_system=cs + ) test_cube = Cube(np.zeros((len(y_points), len(x_points)))) test_cube.add_dim_coord(y_coord, 0) test_cube.add_dim_coord(x_coord, 1) @@ -77,7 +81,6 @@ def _check_key(self, name, value): msg_fmt = 'Expected grib setting "{}" = {}, got {}' found = self.mock_grib.keys.get(name) if found is None: - self.assertEqual(0, 1, msg_fmt.format(name, value, '((UNSET))')) + self.assertEqual(0, 1, msg_fmt.format(name, value, "((UNSET))")) else: - self.assertArrayEqual(found, value, - msg_fmt.format(name, value, found)) + self.assertArrayEqual(found, value, msg_fmt.format(name, value, found)) diff --git a/iris_grib/tests/unit/save_rules/test__missing_forecast_period.py b/iris_grib/tests/unit/save_rules/test__missing_forecast_period.py index 6e427f00..ffbc9986 100644 --- a/iris_grib/tests/unit/save_rules/test__missing_forecast_period.py +++ b/iris_grib/tests/unit/save_rules/test__missing_forecast_period.py @@ -19,7 +19,7 @@ class TestNoForecastReferenceTime(tests.IrisGribTest): def test_no_bounds(self): - t_coord = DimCoord(15, 'time', units='hours since epoch') + t_coord = DimCoord(15, "time", units="hours since epoch") cube = Cube(23) cube.add_aux_coord(t_coord) @@ -28,15 +28,11 @@ def test_no_bounds(self): expected_rt_type = 3 expected_fp = 0 expected_fp_type = 1 - expected = (expected_rt, - expected_rt_type, - expected_fp, - expected_fp_type) + expected = (expected_rt, expected_rt_type, expected_fp, expected_fp_type) self.assertEqual(res, expected) def test_with_bounds(self): - t_coord = DimCoord(15, 'time', bounds=[14, 16], - units='hours since epoch') + t_coord = DimCoord(15, "time", bounds=[14, 16], units="hours since epoch") cube = Cube(23) cube.add_aux_coord(t_coord) @@ -45,18 +41,14 @@ def test_with_bounds(self): expected_rt_type = 3 expected_fp = 0 expected_fp_type = 1 - expected = (expected_rt, - expected_rt_type, - expected_fp, - expected_fp_type) + expected = (expected_rt, expected_rt_type, expected_fp, expected_fp_type) self.assertEqual(res, expected) class TestWithForecastReferenceTime(tests.IrisGribTest): def test_no_bounds(self): - t_coord = DimCoord(3, 'time', units='days since epoch') - frt_coord = DimCoord(8, 'forecast_reference_time', - units='hours since epoch') + t_coord = DimCoord(3, "time", units="days since epoch") + frt_coord = DimCoord(8, "forecast_reference_time", units="hours since epoch") cube = Cube(23) cube.add_aux_coord(t_coord) cube.add_aux_coord(frt_coord) @@ -66,16 +58,12 @@ def test_no_bounds(self): expected_rt_type = 1 expected_fp = 3 * 24 - 8 expected_fp_type = 1 - expected = (expected_rt, - expected_rt_type, - expected_fp, - expected_fp_type) + expected = (expected_rt, expected_rt_type, expected_fp, expected_fp_type) self.assertEqual(res, expected) def test_with_bounds(self): - t_coord = DimCoord(3, 'time', bounds=[2, 4], units='days since epoch') - frt_coord = DimCoord(8, 'forecast_reference_time', - units='hours since epoch') + t_coord = DimCoord(3, "time", bounds=[2, 4], units="days since epoch") + frt_coord = DimCoord(8, "forecast_reference_time", units="hours since epoch") cube = Cube(23) cube.add_aux_coord(t_coord) cube.add_aux_coord(frt_coord) @@ -85,10 +73,7 @@ def test_with_bounds(self): expected_rt_type = 1 expected_fp = 2 * 24 - 8 expected_fp_type = 1 - expected = (expected_rt, - expected_rt_type, - expected_fp, - expected_fp_type) + expected = (expected_rt, expected_rt_type, expected_fp, expected_fp_type) self.assertEqual(res, expected) diff --git a/iris_grib/tests/unit/save_rules/test__non_missing_forecast_period.py b/iris_grib/tests/unit/save_rules/test__non_missing_forecast_period.py index 2595526b..40f6184e 100644 --- a/iris_grib/tests/unit/save_rules/test__non_missing_forecast_period.py +++ b/iris_grib/tests/unit/save_rules/test__non_missing_forecast_period.py @@ -15,10 +15,12 @@ class Test(tests.IrisGribTest): def _cube(self, t_bounds=False): - time_coord = iris.coords.DimCoord(15, standard_name='time', - units='hours since epoch') - fp_coord = iris.coords.DimCoord(10, standard_name='forecast_period', - units='hours') + time_coord = iris.coords.DimCoord( + 15, standard_name="time", units="hours since epoch" + ) + fp_coord = iris.coords.DimCoord( + 10, standard_name="forecast_period", units="hours" + ) if t_bounds: time_coord.bounds = [[8, 100]] fp_coord.bounds = [[3, 95]] @@ -39,7 +41,7 @@ def test_time_bounds(self): def test_time_bounds_in_minutes(self): cube = self._cube(t_bounds=True) - cube.coord('forecast_period').convert_units('minutes') + cube.coord("forecast_period").convert_units("minutes") rt, rt_meaning, fp, fp_meaning = _non_missing_forecast_period(cube) self.assertEqual((rt_meaning, fp, fp_meaning), (1, 180, 0)) diff --git a/iris_grib/tests/unit/save_rules/test__product_definition_template_8_10_and_11.py b/iris_grib/tests/unit/save_rules/test__product_definition_template_8_10_and_11.py index 82a3c7f9..fd6b0ba4 100644 --- a/iris_grib/tests/unit/save_rules/test__product_definition_template_8_10_and_11.py +++ b/iris_grib/tests/unit/save_rules/test__product_definition_template_8_10_and_11.py @@ -27,49 +27,51 @@ class TestTypeOfStatisticalProcessing(tests.IrisGribTest): def setUp(self): self.cube = stock.lat_lon_cube() # Rename cube to avoid warning about unknown discipline/parameter. - self.cube.rename('air_temperature') - coord = DimCoord(23, 'time', bounds=[0, 100], - units=Unit('days since epoch', calendar='standard')) + self.cube.rename("air_temperature") + coord = DimCoord( + 23, + "time", + bounds=[0, 100], + units=Unit("days since epoch", calendar="standard"), + ) self.cube.add_aux_coord(coord) - @mock.patch.object(eccodes, 'codes_set') + @mock.patch.object(eccodes, "codes_set") def test_sum(self, mock_set): cube = self.cube - cell_method = CellMethod(method='sum', coords=['time']) + cell_method = CellMethod(method="sum", coords=["time"]) cube.add_cell_method(cell_method) _product_definition_template_8_10_and_11(cube, mock.sentinel.grib) - mock_set.assert_any_call(mock.sentinel.grib, - "typeOfStatisticalProcessing", 1) + mock_set.assert_any_call(mock.sentinel.grib, "typeOfStatisticalProcessing", 1) - @mock.patch.object(eccodes, 'codes_set') + @mock.patch.object(eccodes, "codes_set") def test_unrecognised(self, mock_set): cube = self.cube - cell_method = CellMethod(method='95th percentile', coords=['time']) + cell_method = CellMethod(method="95th percentile", coords=["time"]) cube.add_cell_method(cell_method) _product_definition_template_8_10_and_11(cube, mock.sentinel.grib) - mock_set.assert_any_call(mock.sentinel.grib, - "typeOfStatisticalProcessing", 255) + mock_set.assert_any_call(mock.sentinel.grib, "typeOfStatisticalProcessing", 255) - @mock.patch.object(eccodes, 'codes_set') + @mock.patch.object(eccodes, "codes_set") def test_multiple_cell_method_coords(self, mock_set): cube = self.cube - cell_method = CellMethod(method='sum', - coords=['time', 'forecast_period']) + cell_method = CellMethod(method="sum", coords=["time", "forecast_period"]) cube.add_cell_method(cell_method) - with self.assertRaisesRegex(ValueError, - 'Cannot handle multiple coordinate name'): + with self.assertRaisesRegex( + ValueError, "Cannot handle multiple coordinate name" + ): _product_definition_template_8_10_and_11(cube, mock.sentinel.grib) - @mock.patch.object(eccodes, 'codes_set') + @mock.patch.object(eccodes, "codes_set") def test_cell_method_coord_name_fail(self, mock_set): cube = self.cube - cell_method = CellMethod(method='mean', coords=['season']) + cell_method = CellMethod(method="mean", coords=["season"]) cube.add_cell_method(cell_method) with self.assertRaisesRegex( - ValueError, "Expected a cell method with a coordinate " - "name of 'time'"): + ValueError, "Expected a cell method with a coordinate " "name of 'time'" + ): _product_definition_template_8_10_and_11(cube, mock.sentinel.grib) @@ -77,119 +79,115 @@ class TestTimeCoordPrerequisites(tests.IrisGribTest): def setUp(self): self.cube = stock.lat_lon_cube() # Rename cube to avoid warning about unknown discipline/parameter. - self.cube.rename('air_temperature') + self.cube.rename("air_temperature") - @mock.patch.object(eccodes, 'codes_set') + @mock.patch.object(eccodes, "codes_set") def test_multiple_points(self, mock_set): # Add time coord with multiple points. - coord = DimCoord([23, 24, 25], 'time', - bounds=[[22, 23], [23, 24], [24, 25]], - units=Unit('days since epoch', calendar='standard')) + coord = DimCoord( + [23, 24, 25], + "time", + bounds=[[22, 23], [23, 24], [24, 25]], + units=Unit("days since epoch", calendar="standard"), + ) self.cube.add_aux_coord(coord, 0) - with self.assertRaisesRegex( - ValueError, 'Expected length one time coordinate'): - _product_definition_template_8_10_and_11(self.cube, - mock.sentinel.grib) + with self.assertRaisesRegex(ValueError, "Expected length one time coordinate"): + _product_definition_template_8_10_and_11(self.cube, mock.sentinel.grib) - @mock.patch.object(eccodes, 'codes_set') + @mock.patch.object(eccodes, "codes_set") def test_no_bounds(self, mock_set): # Add time coord with no bounds. - coord = DimCoord(23, 'time', - units=Unit('days since epoch', calendar='standard')) + coord = DimCoord( + 23, "time", units=Unit("days since epoch", calendar="standard") + ) self.cube.add_aux_coord(coord) with self.assertRaisesRegex( - ValueError, 'Expected time coordinate with two bounds, ' - 'got 0 bounds'): - _product_definition_template_8_10_and_11(self.cube, - mock.sentinel.grib) + ValueError, "Expected time coordinate with two bounds, " "got 0 bounds" + ): + _product_definition_template_8_10_and_11(self.cube, mock.sentinel.grib) - @mock.patch.object(eccodes, 'codes_set') + @mock.patch.object(eccodes, "codes_set") def test_more_than_two_bounds(self, mock_set): # Add time coord with more than two bounds. - coord = DimCoord(23, 'time', bounds=[21, 22, 23], - units=Unit('days since epoch', calendar='standard')) + coord = DimCoord( + 23, + "time", + bounds=[21, 22, 23], + units=Unit("days since epoch", calendar="standard"), + ) self.cube.add_aux_coord(coord) with self.assertRaisesRegex( - ValueError, 'Expected time coordinate with two bounds, ' - 'got 3 bounds'): - _product_definition_template_8_10_and_11(self.cube, - mock.sentinel.grib) + ValueError, "Expected time coordinate with two bounds, " "got 3 bounds" + ): + _product_definition_template_8_10_and_11(self.cube, mock.sentinel.grib) class TestEndOfOverallTimeInterval(tests.IrisGribTest): def setUp(self): self.cube = stock.lat_lon_cube() # Rename cube to avoid warning about unknown discipline/parameter. - self.cube.rename('air_temperature') - cell_method = CellMethod(method='sum', coords=['time']) + self.cube.rename("air_temperature") + cell_method = CellMethod(method="sum", coords=["time"]) self.cube.add_cell_method(cell_method) - @mock.patch.object(eccodes, 'codes_set') + @mock.patch.object(eccodes, "codes_set") def test_default_calendar(self, mock_set): cube = self.cube # End bound is 1972-04-26 10:27:07. - coord = DimCoord(23.0, 'time', bounds=[0.452, 20314.452], - units=Unit('hours since epoch')) + coord = DimCoord( + 23.0, "time", bounds=[0.452, 20314.452], units=Unit("hours since epoch") + ) cube.add_aux_coord(coord) grib = mock.sentinel.grib _product_definition_template_8_10_and_11(cube, grib) - mock_set.assert_any_call( - grib, "yearOfEndOfOverallTimeInterval", 1972) - mock_set.assert_any_call( - grib, "monthOfEndOfOverallTimeInterval", 4) - mock_set.assert_any_call( - grib, "dayOfEndOfOverallTimeInterval", 26) - mock_set.assert_any_call( - grib, "hourOfEndOfOverallTimeInterval", 10) - mock_set.assert_any_call( - grib, "minuteOfEndOfOverallTimeInterval", 27) - mock_set.assert_any_call( - grib, "secondOfEndOfOverallTimeInterval", 7) - - @mock.patch.object(eccodes, 'codes_set') + mock_set.assert_any_call(grib, "yearOfEndOfOverallTimeInterval", 1972) + mock_set.assert_any_call(grib, "monthOfEndOfOverallTimeInterval", 4) + mock_set.assert_any_call(grib, "dayOfEndOfOverallTimeInterval", 26) + mock_set.assert_any_call(grib, "hourOfEndOfOverallTimeInterval", 10) + mock_set.assert_any_call(grib, "minuteOfEndOfOverallTimeInterval", 27) + mock_set.assert_any_call(grib, "secondOfEndOfOverallTimeInterval", 7) + + @mock.patch.object(eccodes, "codes_set") def test_360_day_calendar(self, mock_set): cube = self.cube # End bound is 1972-05-07 10:27:07 - coord = DimCoord(23.0, 'time', bounds=[0.452, 20314.452], - units=Unit('hours since epoch', calendar='360_day')) + coord = DimCoord( + 23.0, + "time", + bounds=[0.452, 20314.452], + units=Unit("hours since epoch", calendar="360_day"), + ) cube.add_aux_coord(coord) grib = mock.sentinel.grib _product_definition_template_8_10_and_11(cube, grib) - mock_set.assert_any_call( - grib, "yearOfEndOfOverallTimeInterval", 1972) - mock_set.assert_any_call( - grib, "monthOfEndOfOverallTimeInterval", 5) - mock_set.assert_any_call( - grib, "dayOfEndOfOverallTimeInterval", 7) - mock_set.assert_any_call( - grib, "hourOfEndOfOverallTimeInterval", 10) - mock_set.assert_any_call( - grib, "minuteOfEndOfOverallTimeInterval", 27) - mock_set.assert_any_call( - grib, "secondOfEndOfOverallTimeInterval", 7) + mock_set.assert_any_call(grib, "yearOfEndOfOverallTimeInterval", 1972) + mock_set.assert_any_call(grib, "monthOfEndOfOverallTimeInterval", 5) + mock_set.assert_any_call(grib, "dayOfEndOfOverallTimeInterval", 7) + mock_set.assert_any_call(grib, "hourOfEndOfOverallTimeInterval", 10) + mock_set.assert_any_call(grib, "minuteOfEndOfOverallTimeInterval", 27) + mock_set.assert_any_call(grib, "secondOfEndOfOverallTimeInterval", 7) class TestNumberOfTimeRange(tests.IrisGribTest): - @mock.patch.object(eccodes, 'codes_set') + @mock.patch.object(eccodes, "codes_set") def test_other_cell_methods(self, mock_set): cube = stock.lat_lon_cube() # Rename cube to avoid warning about unknown discipline/parameter. - cube.rename('air_temperature') - coord = DimCoord(23, 'time', bounds=[0, 24], - units=Unit('hours since epoch')) + cube.rename("air_temperature") + coord = DimCoord(23, "time", bounds=[0, 24], units=Unit("hours since epoch")) cube.add_aux_coord(coord) # Add one time cell method and another unrelated one. - cell_method = CellMethod(method='mean', coords=['elephants']) + cell_method = CellMethod(method="mean", coords=["elephants"]) cube.add_cell_method(cell_method) - cell_method = CellMethod(method='sum', coords=['time']) + cell_method = CellMethod(method="sum", coords=["time"]) cube.add_cell_method(cell_method) _product_definition_template_8_10_and_11(cube, mock.sentinel.grib) - mock_set.assert_any_call(mock.sentinel.grib, 'numberOfTimeRange', 1) + mock_set.assert_any_call(mock.sentinel.grib, "numberOfTimeRange", 1) if __name__ == "__main__": diff --git a/iris_grib/tests/unit/save_rules/test_data_section.py b/iris_grib/tests/unit/save_rules/test_data_section.py index 22add2e6..81f073e5 100644 --- a/iris_grib/tests/unit/save_rules/test_data_section.py +++ b/iris_grib/tests/unit/save_rules/test_data_section.py @@ -20,7 +20,7 @@ from iris_grib._save_rules import data_section -GRIB_API = 'iris_grib._save_rules.eccodes' +GRIB_API = "iris_grib._save_rules.eccodes" GRIB_MESSAGE = mock.sentinel.GRIB_MESSAGE @@ -28,42 +28,42 @@ class TestMDI(tests.IrisGribTest): def assertBitmapOff(self, grib_api): # Check the use of a mask has been turned off via: # eccodes.codes_set(grib_message, 'bitmapPresent', 0) - grib_api.codes_set.assert_called_once_with(GRIB_MESSAGE, - 'bitmapPresent', 0) + grib_api.codes_set.assert_called_once_with(GRIB_MESSAGE, "bitmapPresent", 0) def assertBitmapOn(self, grib_api, fill_value): # Check the use of a mask has been turned on via: # eccodes.codes_set(grib_message, 'bitmapPresent', 1) # eccodes.codes_set_double(grib_message, 'missingValue', fill_value) - grib_api.codes_set.assert_called_once_with(GRIB_MESSAGE, - 'bitmapPresent', 1) - grib_api.codes_set_double.assert_called_once_with(GRIB_MESSAGE, - 'missingValue', - fill_value) + grib_api.codes_set.assert_called_once_with(GRIB_MESSAGE, "bitmapPresent", 1) + grib_api.codes_set_double.assert_called_once_with( + GRIB_MESSAGE, "missingValue", fill_value + ) def assertBitmapRange(self, grib_api, min_data, max_data): # Check the use of a mask has been turned on via: # eccodes.codes_set(grib_message, 'bitmapPresent', 1) # eccodes.codes_set_double(grib_message, 'missingValue', ...) # and that a suitable fill value has been chosen. - grib_api.codes_set.assert_called_once_with(GRIB_MESSAGE, - 'bitmapPresent', 1) - args, = grib_api.codes_set_double.call_args_list + grib_api.codes_set.assert_called_once_with(GRIB_MESSAGE, "bitmapPresent", 1) + (args,) = grib_api.codes_set_double.call_args_list (message, key, fill_value), kwargs = args self.assertIs(message, GRIB_MESSAGE) - self.assertEqual(key, 'missingValue') - self.assertTrue(fill_value < min_data or fill_value > max_data, - 'Fill value {} is not outside data range ' - '{} to {}.'.format(fill_value, min_data, max_data)) + self.assertEqual(key, "missingValue") + self.assertTrue( + fill_value < min_data or fill_value > max_data, + "Fill value {} is not outside data range " "{} to {}.".format( + fill_value, min_data, max_data + ), + ) return fill_value def assertValues(self, grib_api, values): # Check the correct data values have been set via: # eccodes.codes_set_double_array(grib_message, 'values', ...) - args, = grib_api.codes_set_double_array.call_args_list + (args,) = grib_api.codes_set_double_array.call_args_list (message, key, values), kwargs = args self.assertIs(message, GRIB_MESSAGE) - self.assertEqual(key, 'values') + self.assertEqual(key, "values") self.assertArrayEqual(values, values) self.assertEqual(kwargs, {}) @@ -79,9 +79,11 @@ def test_simple(self): self.assertValues(grib_api, np.arange(5)) def test_masked_with_finite_fill_value(self): - cube = iris.cube.Cube(np.ma.MaskedArray([1.0, 2.0, 3.0, 1.0, 2.0, 3.0], - mask=[0, 0, 0, 1, 1, 1], - fill_value=2000)) + cube = iris.cube.Cube( + np.ma.MaskedArray( + [1.0, 2.0, 3.0, 1.0, 2.0, 3.0], mask=[0, 0, 0, 1, 1, 1], fill_value=2000 + ) + ) grib_message = mock.sentinel.GRIB_MESSAGE with mock.patch(GRIB_API) as grib_api: data_section(cube, grib_message) @@ -92,9 +94,13 @@ def test_masked_with_finite_fill_value(self): self.assertValues(grib_api, [1, 2, 3, FILL, FILL, FILL]) def test_masked_with_nan_fill_value(self): - cube = iris.cube.Cube(np.ma.MaskedArray([1.0, 2.0, 3.0, 1.0, 2.0, 3.0], - mask=[0, 0, 0, 1, 1, 1], - fill_value=np.nan)) + cube = iris.cube.Cube( + np.ma.MaskedArray( + [1.0, 2.0, 3.0, 1.0, 2.0, 3.0], + mask=[0, 0, 0, 1, 1, 1], + fill_value=np.nan, + ) + ) grib_message = mock.sentinel.GRIB_MESSAGE with mock.patch(GRIB_API) as grib_api: data_section(cube, grib_message) @@ -107,8 +113,9 @@ def test_masked_with_nan_fill_value(self): def test_scaled(self): # If the Cube's units don't match the units required by GRIB # ensure the data values are scaled correctly. - cube = iris.cube.Cube(np.arange(5), - standard_name='geopotential_height', units='km') + cube = iris.cube.Cube( + np.arange(5), standard_name="geopotential_height", units="km" + ) grib_message = mock.sentinel.GRIB_MESSAGE with mock.patch(GRIB_API) as grib_api: data_section(cube, grib_message) @@ -120,10 +127,13 @@ def test_scaled(self): def test_scaled_with_finite_fill_value(self): # When re-scaling masked data with a finite fill value, ensure # the fill value and any filled values are also re-scaled. - cube = iris.cube.Cube(np.ma.MaskedArray([1.0, 2.0, 3.0, 1.0, 2.0, 3.0], - mask=[0, 0, 0, 1, 1, 1], - fill_value=2000), - standard_name='geopotential_height', units='km') + cube = iris.cube.Cube( + np.ma.MaskedArray( + [1.0, 2.0, 3.0, 1.0, 2.0, 3.0], mask=[0, 0, 0, 1, 1, 1], fill_value=2000 + ), + standard_name="geopotential_height", + units="km", + ) grib_message = mock.sentinel.GRIB_MESSAGE with mock.patch(GRIB_API) as grib_api: data_section(cube, grib_message) @@ -137,10 +147,13 @@ def test_scaled_with_nan_fill_value(self): # When re-scaling masked data with a NaN fill value, ensure # a fill value is chosen which allows for the scaling, and any # filled values match the chosen fill value. - cube = iris.cube.Cube(np.ma.MaskedArray([-1.0, 2.0, -1.0, 2.0], - mask=[0, 0, 1, 1], - fill_value=np.nan), - standard_name='geopotential_height', units='km') + cube = iris.cube.Cube( + np.ma.MaskedArray( + [-1.0, 2.0, -1.0, 2.0], mask=[0, 0, 1, 1], fill_value=np.nan + ), + standard_name="geopotential_height", + units="km", + ) grib_message = mock.sentinel.GRIB_MESSAGE with mock.patch(GRIB_API) as grib_api: data_section(cube, grib_message) @@ -157,8 +170,7 @@ class TestNonDoubleData(tests.IrisGribTest): # fault. def check(self, dtype): data = np.random.random(1920 * 2560).astype(dtype) - cube = iris.cube.Cube(data, - standard_name='geopotential_height', units='km') + cube = iris.cube.Cube(data, standard_name="geopotential_height", units="km") grib_message = eccodes.codes_grib_new_from_samples("GRIB2") data_section(cube, grib_message) eccodes.codes_release(grib_message) diff --git a/iris_grib/tests/unit/save_rules/test_fixup_float32_as_int32.py b/iris_grib/tests/unit/save_rules/test_fixup_float32_as_int32.py index 3354a6b5..5e576e04 100644 --- a/iris_grib/tests/unit/save_rules/test_fixup_float32_as_int32.py +++ b/iris_grib/tests/unit/save_rules/test_fixup_float32_as_int32.py @@ -44,5 +44,5 @@ def test_high_bit_set_2(self): self.assertEqual(result, -2) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/save_rules/test_fixup_int32_as_uint32.py b/iris_grib/tests/unit/save_rules/test_fixup_int32_as_uint32.py index a9928eee..cc8e87c4 100644 --- a/iris_grib/tests/unit/save_rules/test_fixup_int32_as_uint32.py +++ b/iris_grib/tests/unit/save_rules/test_fixup_int32_as_uint32.py @@ -36,5 +36,5 @@ def test_very_positive(self): fixup_int32_as_uint32(0x80000000) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_0.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_0.py index 83075d87..1c238183 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_template_0.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_0.py @@ -25,37 +25,34 @@ def setUp(self): def test__template_number(self): grid_definition_template_0(self.test_cube, self.mock_grib) - self._check_key('gridDefinitionTemplateNumber', 0) + self._check_key("gridDefinitionTemplateNumber", 0) def test__shape_of_earth_spherical(self): cs = GeogCS(semi_major_axis=1.23) test_cube = self._make_test_cube(cs=cs) grid_definition_template_0(test_cube, self.mock_grib) - self._check_key('shapeOfTheEarth', 1) - self._check_key('scaleFactorOfRadiusOfSphericalEarth', 0) - self._check_key('scaledValueOfRadiusOfSphericalEarth', 1.23) + self._check_key("shapeOfTheEarth", 1) + self._check_key("scaleFactorOfRadiusOfSphericalEarth", 0) + self._check_key("scaledValueOfRadiusOfSphericalEarth", 1.23) def test__shape_of_earth_flattened(self): - cs = GeogCS(semi_major_axis=1.456, - semi_minor_axis=1.123) + cs = GeogCS(semi_major_axis=1.456, semi_minor_axis=1.123) test_cube = self._make_test_cube(cs=cs) grid_definition_template_0(test_cube, self.mock_grib) - self._check_key('shapeOfTheEarth', 7) - self._check_key('scaleFactorOfEarthMajorAxis', 0) - self._check_key('scaledValueOfEarthMajorAxis', 1.456) - self._check_key('scaleFactorOfEarthMinorAxis', 0) - self._check_key('scaledValueOfEarthMinorAxis', 1.123) + self._check_key("shapeOfTheEarth", 7) + self._check_key("scaleFactorOfEarthMajorAxis", 0) + self._check_key("scaledValueOfEarthMajorAxis", 1.456) + self._check_key("scaleFactorOfEarthMinorAxis", 0) + self._check_key("scaledValueOfEarthMinorAxis", 1.123) def test__grid_shape(self): - test_cube = self._make_test_cube(x_points=np.arange(13), - y_points=np.arange(6)) + test_cube = self._make_test_cube(x_points=np.arange(13), y_points=np.arange(6)) grid_definition_template_0(test_cube, self.mock_grib) - self._check_key('Ni', 13) - self._check_key('Nj', 6) + self._check_key("Ni", 13) + self._check_key("Nj", 6) def test__grid_points(self): - test_cube = self._make_test_cube( - x_points=[1, 3, 5, 7], y_points=[4, 9]) + test_cube = self._make_test_cube(x_points=[1, 3, 5, 7], y_points=[4, 9]) grid_definition_template_0(test_cube, self.mock_grib) self._check_key("longitudeOfFirstGridPoint", 1000000) self._check_key("longitudeOfLastGridPoint", 7000000) @@ -66,14 +63,14 @@ def test__grid_points(self): def test__scanmode(self): grid_definition_template_0(self.test_cube, self.mock_grib) - self._check_key('iScansPositively', 1) - self._check_key('jScansPositively', 1) + self._check_key("iScansPositively", 1) + self._check_key("jScansPositively", 1) def test__scanmode_reverse(self): test_cube = self._make_test_cube(x_points=np.arange(7, 0, -1)) grid_definition_template_0(test_cube, self.mock_grib) - self._check_key('iScansPositively', 0) - self._check_key('jScansPositively', 1) + self._check_key("iScansPositively", 0) + self._check_key("jScansPositively", 1) if __name__ == "__main__": diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_1.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_1.py index 53d1ce89..ee0bb6f5 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_template_1.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_1.py @@ -28,49 +28,53 @@ def setUp(self): def _default_coord_system(self): # Define an alternate, rotated coordinate system to test. - cs = RotatedGeogCS(grid_north_pole_latitude=90.0, - grid_north_pole_longitude=0.0, - ellipsoid=self.default_ellipsoid) + cs = RotatedGeogCS( + grid_north_pole_latitude=90.0, + grid_north_pole_longitude=0.0, + ellipsoid=self.default_ellipsoid, + ) return cs def test__template_number(self): grid_definition_template_1(self.test_cube, self.mock_grib) - self._check_key('gridDefinitionTemplateNumber', 1) + self._check_key("gridDefinitionTemplateNumber", 1) def test__shape_of_earth_spherical(self): ellipsoid = GeogCS(1.23) - cs = RotatedGeogCS(grid_north_pole_latitude=90.0, - grid_north_pole_longitude=0.0, - ellipsoid=ellipsoid) + cs = RotatedGeogCS( + grid_north_pole_latitude=90.0, + grid_north_pole_longitude=0.0, + ellipsoid=ellipsoid, + ) test_cube = self._make_test_cube(cs=cs) grid_definition_template_1(test_cube, self.mock_grib) - self._check_key('shapeOfTheEarth', 1) - self._check_key('scaleFactorOfRadiusOfSphericalEarth', 0) - self._check_key('scaledValueOfRadiusOfSphericalEarth', 1.23) + self._check_key("shapeOfTheEarth", 1) + self._check_key("scaleFactorOfRadiusOfSphericalEarth", 0) + self._check_key("scaledValueOfRadiusOfSphericalEarth", 1.23) def test__shape_of_earth_flattened(self): ellipsoid = GeogCS(semi_major_axis=1.456, semi_minor_axis=1.123) - cs = RotatedGeogCS(grid_north_pole_latitude=90.0, - grid_north_pole_longitude=0.0, - ellipsoid=ellipsoid) + cs = RotatedGeogCS( + grid_north_pole_latitude=90.0, + grid_north_pole_longitude=0.0, + ellipsoid=ellipsoid, + ) test_cube = self._make_test_cube(cs=cs) grid_definition_template_1(test_cube, self.mock_grib) - self._check_key('shapeOfTheEarth', 7) - self._check_key('scaleFactorOfEarthMajorAxis', 0) - self._check_key('scaledValueOfEarthMajorAxis', 1.456) - self._check_key('scaleFactorOfEarthMinorAxis', 0) - self._check_key('scaledValueOfEarthMinorAxis', 1.123) + self._check_key("shapeOfTheEarth", 7) + self._check_key("scaleFactorOfEarthMajorAxis", 0) + self._check_key("scaledValueOfEarthMajorAxis", 1.456) + self._check_key("scaleFactorOfEarthMinorAxis", 0) + self._check_key("scaledValueOfEarthMinorAxis", 1.123) def test__grid_shape(self): - test_cube = self._make_test_cube(x_points=np.arange(13), - y_points=np.arange(6)) + test_cube = self._make_test_cube(x_points=np.arange(13), y_points=np.arange(6)) grid_definition_template_1(test_cube, self.mock_grib) - self._check_key('Ni', 13) - self._check_key('Nj', 6) + self._check_key("Ni", 13) + self._check_key("Nj", 6) def test__grid_points(self): - test_cube = self._make_test_cube(x_points=[1, 3, 5, 7], - y_points=[4, 9]) + test_cube = self._make_test_cube(x_points=[1, 3, 5, 7], y_points=[4, 9]) grid_definition_template_1(test_cube, self.mock_grib) self._check_key("longitudeOfFirstGridPoint", 1000000) self._check_key("longitudeOfLastGridPoint", 7000000) @@ -81,19 +85,21 @@ def test__grid_points(self): def test__scanmode(self): grid_definition_template_1(self.test_cube, self.mock_grib) - self._check_key('iScansPositively', 1) - self._check_key('jScansPositively', 1) + self._check_key("iScansPositively", 1) + self._check_key("jScansPositively", 1) def test__scanmode_reverse(self): test_cube = self._make_test_cube(x_points=np.arange(7, 0, -1)) grid_definition_template_1(test_cube, self.mock_grib) - self._check_key('iScansPositively', 0) - self._check_key('jScansPositively', 1) + self._check_key("iScansPositively", 0) + self._check_key("jScansPositively", 1) def test__rotated_pole(self): - cs = RotatedGeogCS(grid_north_pole_latitude=75.3, - grid_north_pole_longitude=54.321, - ellipsoid=self.default_ellipsoid) + cs = RotatedGeogCS( + grid_north_pole_latitude=75.3, + grid_north_pole_longitude=54.321, + ellipsoid=self.default_ellipsoid, + ) test_cube = self._make_test_cube(cs=cs) grid_definition_template_1(test_cube, self.mock_grib) self._check_key("latitudeOfSouthernPole", -75300000) @@ -101,14 +107,16 @@ def test__rotated_pole(self): self._check_key("angleOfRotation", 0) def test__fail_rotated_pole_nonstandard_meridian(self): - cs = RotatedGeogCS(grid_north_pole_latitude=90.0, - grid_north_pole_longitude=0.0, - north_pole_grid_longitude=22.5, - ellipsoid=self.default_ellipsoid) + cs = RotatedGeogCS( + grid_north_pole_latitude=90.0, + grid_north_pole_longitude=0.0, + north_pole_grid_longitude=22.5, + ellipsoid=self.default_ellipsoid, + ) test_cube = self._make_test_cube(cs=cs) with self.assertRaisesRegex( - TranslationError, - 'not yet support .* rotated prime meridian.'): + TranslationError, "not yet support .* rotated prime meridian." + ): grid_definition_template_1(test_cube, self.mock_grib) diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py index d83e420d..521f6001 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py @@ -22,41 +22,42 @@ class Test(tests.IrisGribTest, GdtTestMixin): def setUp(self): self.default_ellipsoid = GeogCS(semi_major_axis=6371200.0) - self.mercator_test_cube = self._make_test_cube(coord_units='m') + self.mercator_test_cube = self._make_test_cube(coord_units="m") GdtTestMixin.setUp(self) def _default_coord_system(self): - return Mercator(standard_parallel=14., - ellipsoid=self.default_ellipsoid) + return Mercator(standard_parallel=14.0, ellipsoid=self.default_ellipsoid) def test__template_number(self): grid_definition_template_10(self.mercator_test_cube, self.mock_grib) - self._check_key('gridDefinitionTemplateNumber', 10) + self._check_key("gridDefinitionTemplateNumber", 10) def test__shape_of_earth(self): grid_definition_template_10(self.mercator_test_cube, self.mock_grib) - self._check_key('shapeOfTheEarth', 1) - self._check_key('scaleFactorOfRadiusOfSphericalEarth', 0) - self._check_key('scaleFactorOfEarthMajorAxis', 0) - self._check_key('scaledValueOfEarthMajorAxis', 0) - self._check_key('scaleFactorOfEarthMinorAxis', 0) - self._check_key('scaledValueOfEarthMinorAxis', 0) + self._check_key("shapeOfTheEarth", 1) + self._check_key("scaleFactorOfRadiusOfSphericalEarth", 0) + self._check_key("scaleFactorOfEarthMajorAxis", 0) + self._check_key("scaledValueOfEarthMajorAxis", 0) + self._check_key("scaleFactorOfEarthMinorAxis", 0) + self._check_key("scaledValueOfEarthMinorAxis", 0) def test__grid_shape(self): n_x_points = 13 n_y_points = 6 - test_cube = self._make_test_cube(x_points=np.arange(n_x_points), - y_points=np.arange(n_y_points), - coord_units='m') + test_cube = self._make_test_cube( + x_points=np.arange(n_x_points), + y_points=np.arange(n_y_points), + coord_units="m", + ) grid_definition_template_10(test_cube, self.mock_grib) - self._check_key('Ni', n_x_points) - self._check_key('Nj', n_y_points) + self._check_key("Ni", n_x_points) + self._check_key("Nj", n_y_points) def test__grid_points(self): - test_cube = self._make_test_cube(x_points=[1e6, 3e6, 5e6, 7e6], - y_points=[4e6, 9e6], - coord_units='m') + test_cube = self._make_test_cube( + x_points=[1e6, 3e6, 5e6, 7e6], y_points=[4e6, 9e6], coord_units="m" + ) grid_definition_template_10(test_cube, self.mock_grib) self._check_key("latitudeOfFirstGridPoint", 34727738) self._check_key("longitudeOfFirstGridPoint", 9268240) @@ -71,15 +72,16 @@ def test__template_specifics(self): def test__scanmode(self): grid_definition_template_10(self.mercator_test_cube, self.mock_grib) - self._check_key('iScansPositively', 1) - self._check_key('jScansPositively', 1) + self._check_key("iScansPositively", 1) + self._check_key("jScansPositively", 1) def test__scanmode_reverse(self): - test_cube = self._make_test_cube(x_points=np.arange(7e6, 0, -1e6), - coord_units='m') + test_cube = self._make_test_cube( + x_points=np.arange(7e6, 0, -1e6), coord_units="m" + ) grid_definition_template_10(test_cube, self.mock_grib) - self._check_key('iScansPositively', 0) - self._check_key('jScansPositively', 1) + self._check_key("iScansPositively", 0) + self._check_key("jScansPositively", 1) if __name__ == "__main__": diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_12.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_12.py index caad0a99..ad42bff6 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_template_12.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_12.py @@ -26,8 +26,9 @@ class FakeGribError(Exception): class Test(tests.IrisGribTest, GdtTestMixin): def setUp(self): - self.default_ellipsoid = GeogCS(semi_major_axis=6377563.396, - semi_minor_axis=6356256.909) + self.default_ellipsoid = GeogCS( + semi_major_axis=6377563.396, semi_minor_axis=6356256.909 + ) self.test_cube = self._make_test_cube() GdtTestMixin.setUp(self) @@ -41,10 +42,12 @@ def _make_test_cube(self, cs=None, x_points=None, y_points=None): if y_points is None: y_points = self._default_y_points() - x_coord = iris.coords.DimCoord(x_points, 'projection_x_coordinate', - units='m', coord_system=cs) - y_coord = iris.coords.DimCoord(y_points, 'projection_y_coordinate', - units='m', coord_system=cs) + x_coord = iris.coords.DimCoord( + x_points, "projection_x_coordinate", units="m", coord_system=cs + ) + y_coord = iris.coords.DimCoord( + y_points, "projection_y_coordinate", units="m", coord_system=cs + ) test_cube = iris.cube.Cube(np.zeros((len(y_points), len(x_points)))) test_cube.add_dim_coord(y_coord, 0) test_cube.add_dim_coord(x_coord, 1) @@ -52,36 +55,36 @@ def _make_test_cube(self, cs=None, x_points=None, y_points=None): def _default_coord_system(self): # This defines an OSGB coord system. - cs = TransverseMercator(latitude_of_projection_origin=49.0, - longitude_of_central_meridian=-2.0, - false_easting=400000.0, - false_northing=-100000.0, - scale_factor_at_central_meridian=0.9996012717, - ellipsoid=self.default_ellipsoid) + cs = TransverseMercator( + latitude_of_projection_origin=49.0, + longitude_of_central_meridian=-2.0, + false_easting=400000.0, + false_northing=-100000.0, + scale_factor_at_central_meridian=0.9996012717, + ellipsoid=self.default_ellipsoid, + ) return cs def test__template_number(self): grid_definition_template_12(self.test_cube, self.mock_grib) - self._check_key('gridDefinitionTemplateNumber', 12) + self._check_key("gridDefinitionTemplateNumber", 12) def test__shape_of_earth(self): grid_definition_template_12(self.test_cube, self.mock_grib) - self._check_key('shapeOfTheEarth', 7) - self._check_key('scaleFactorOfEarthMajorAxis', 0) - self._check_key('scaledValueOfEarthMajorAxis', 6377563.396) - self._check_key('scaleFactorOfEarthMinorAxis', 0) - self._check_key('scaledValueOfEarthMinorAxis', 6356256.909) + self._check_key("shapeOfTheEarth", 7) + self._check_key("scaleFactorOfEarthMajorAxis", 0) + self._check_key("scaledValueOfEarthMajorAxis", 6377563.396) + self._check_key("scaleFactorOfEarthMinorAxis", 0) + self._check_key("scaledValueOfEarthMinorAxis", 6356256.909) def test__grid_shape(self): - test_cube = self._make_test_cube(x_points=np.arange(13), - y_points=np.arange(6)) + test_cube = self._make_test_cube(x_points=np.arange(13), y_points=np.arange(6)) grid_definition_template_12(test_cube, self.mock_grib) - self._check_key('Ni', 13) - self._check_key('Nj', 6) + self._check_key("Ni", 13) + self._check_key("Nj", 6) def test__grid_points_exact(self): - test_cube = self._make_test_cube(x_points=[1, 3, 5, 7], - y_points=[4, 9]) + test_cube = self._make_test_cube(x_points=[1, 3, 5, 7], y_points=[4, 9]) grid_definition_template_12(test_cube, self.mock_grib) self._check_key("X1", 100) self._check_key("X2", 700) @@ -91,8 +94,9 @@ def test__grid_points_exact(self): self._check_key("Dj", 500) def test__grid_points_approx(self): - test_cube = self._make_test_cube(x_points=[1.001, 3.003, 5.005, 7.007], - y_points=[4, 9]) + test_cube = self._make_test_cube( + x_points=[1.001, 3.003, 5.005, 7.007], y_points=[4, 9] + ) grid_definition_template_12(test_cube, self.mock_grib) self._check_key("X1", 100) self._check_key("X2", 701) @@ -109,10 +113,10 @@ def set(grib, key, value): if key in ["X1", "X2", "Y1", "Y2"] and value < 0: raise self.mock_eccodes.CodesInternalError() grib.keys[key] = value + self.mock_eccodes.codes_set = set - test_cube = self._make_test_cube(x_points=[-1, 1, 3, 5, 7], - y_points=[-4, 9]) + test_cube = self._make_test_cube(x_points=[-1, 1, 3, 5, 7], y_points=[-4, 9]) grid_definition_template_12(test_cube, self.mock_grib) self._check_key("X1", 0x80000064) self._check_key("X2", 700) @@ -120,8 +124,7 @@ def set(grib, key, value): self._check_key("Y2", 900) def test__negative_grid_points_eccodes_fixed(self): - test_cube = self._make_test_cube(x_points=[-1, 1, 3, 5, 7], - y_points=[-4, 9]) + test_cube = self._make_test_cube(x_points=[-1, 1, 3, 5, 7], y_points=[-4, 9]) grid_definition_template_12(test_cube, self.mock_grib) self._check_key("X1", -100) self._check_key("X2", 700) @@ -143,29 +146,30 @@ def test__scale_factor_eccodes_broken(self): def get_native_type(grib, key): assert key == "scaleFactorAtReferencePoint" return int + self.mock_eccodes.codes_get_native_type = get_native_type grid_definition_template_12(self.test_cube, self.mock_grib) self._check_key("scaleFactorAtReferencePoint", 1065346526) def test__scale_factor_eccodes_fixed(self): - def get_native_type(grib, key): assert key == "scaleFactorAtReferencePoint" return float + self.mock_eccodes.codes_get_native_type = get_native_type grid_definition_template_12(self.test_cube, self.mock_grib) self._check_key("scaleFactorAtReferencePoint", 0.9996012717) def test__scanmode(self): grid_definition_template_12(self.test_cube, self.mock_grib) - self._check_key('iScansPositively', 1) - self._check_key('jScansPositively', 1) + self._check_key("iScansPositively", 1) + self._check_key("jScansPositively", 1) def test__scanmode_reverse(self): test_cube = self._make_test_cube(x_points=np.arange(7, 0, -1)) grid_definition_template_12(test_cube, self.mock_grib) - self._check_key('iScansPositively', 0) - self._check_key('jScansPositively', 1) + self._check_key("iScansPositively", 0) + self._check_key("jScansPositively", 1) if __name__ == "__main__": diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_140.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_140.py index 7f888b5c..dcc7bb41 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_template_140.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_140.py @@ -29,8 +29,9 @@ class FakeGribError(Exception): class Test(tests.IrisGribTest, GdtTestMixin): def setUp(self): - self.default_ellipsoid = GeogCS(semi_major_axis=6377563.396, - semi_minor_axis=6356256.909) + self.default_ellipsoid = GeogCS( + semi_major_axis=6377563.396, semi_minor_axis=6356256.909 + ) self.test_cube = self._make_test_cube() GdtTestMixin.setUp(self) @@ -44,44 +45,48 @@ def _make_test_cube(self, cs=None, x_points=None, y_points=None): if y_points is None: y_points = self._default_y_points() - x_coord = iris.coords.DimCoord(x_points, 'projection_x_coordinate', - units='m', coord_system=cs) - y_coord = iris.coords.DimCoord(y_points, 'projection_y_coordinate', - units='m', coord_system=cs) + x_coord = iris.coords.DimCoord( + x_points, "projection_x_coordinate", units="m", coord_system=cs + ) + y_coord = iris.coords.DimCoord( + y_points, "projection_y_coordinate", units="m", coord_system=cs + ) test_cube = iris.cube.Cube(np.zeros((len(y_points), len(x_points)))) test_cube.add_dim_coord(y_coord, 0) test_cube.add_dim_coord(x_coord, 1) return test_cube def _default_coord_system(self, false_easting=0, false_northing=0): - return LambertAzimuthalEqualArea(latitude_of_projection_origin=54.9, - longitude_of_projection_origin=-2.5, - false_easting=false_easting, - false_northing=false_northing, - ellipsoid=self.default_ellipsoid) + return LambertAzimuthalEqualArea( + latitude_of_projection_origin=54.9, + longitude_of_projection_origin=-2.5, + false_easting=false_easting, + false_northing=false_northing, + ellipsoid=self.default_ellipsoid, + ) def test__template_number(self): grid_definition_template(self.test_cube, self.mock_grib) - self._check_key('gridDefinitionTemplateNumber', 140) + self._check_key("gridDefinitionTemplateNumber", 140) def test__shape_of_earth(self): grid_definition_template(self.test_cube, self.mock_grib) - self._check_key('shapeOfTheEarth', 7) - self._check_key('scaleFactorOfEarthMajorAxis', 0) - self._check_key('scaledValueOfEarthMajorAxis', 6377563.396) - self._check_key('scaleFactorOfEarthMinorAxis', 0) - self._check_key('scaledValueOfEarthMinorAxis', 6356256.909) + self._check_key("shapeOfTheEarth", 7) + self._check_key("scaleFactorOfEarthMajorAxis", 0) + self._check_key("scaledValueOfEarthMajorAxis", 6377563.396) + self._check_key("scaleFactorOfEarthMinorAxis", 0) + self._check_key("scaledValueOfEarthMinorAxis", 6356256.909) def test__grid_shape(self): - test_cube = self._make_test_cube(x_points=np.arange(13), - y_points=np.arange(6)) + test_cube = self._make_test_cube(x_points=np.arange(13), y_points=np.arange(6)) grid_definition_template(test_cube, self.mock_grib) - self._check_key('Nx', 13) - self._check_key('Ny', 6) + self._check_key("Nx", 13) + self._check_key("Ny", 6) def test__grid_points(self): - test_cube = self._make_test_cube(x_points=[1e6, 3e6, 5e6, 7e6], - y_points=[4e6, 9e6]) + test_cube = self._make_test_cube( + x_points=[1e6, 3e6, 5e6, 7e6], y_points=[4e6, 9e6] + ) grid_definition_template(test_cube, self.mock_grib) self._check_key("latitudeOfFirstGridPoint", 81330008) self._check_key("longitudeOfFirstGridPoint", 98799008) @@ -96,26 +101,27 @@ def test__template_specifics(self): def test__scanmode(self): grid_definition_template(self.test_cube, self.mock_grib) - self._check_key('iScansPositively', 1) - self._check_key('jScansPositively', 1) + self._check_key("iScansPositively", 1) + self._check_key("jScansPositively", 1) def test__scanmode_reverse(self): test_cube = self._make_test_cube(x_points=np.arange(7e6, 0, -1e6)) grid_definition_template(test_cube, self.mock_grib) - self._check_key('iScansPositively', 0) - self._check_key('jScansPositively', 1) + self._check_key("iScansPositively", 0) + self._check_key("jScansPositively", 1) def __fail_false_easting_northing(self, false_easting, false_northing): - cs = self._default_coord_system(false_easting=false_easting, - false_northing=false_northing) + cs = self._default_coord_system( + false_easting=false_easting, false_northing=false_northing + ) test_cube = self._make_test_cube(cs=cs) - msg = (r'non zero false easting \(\d*\.\d{2}\) or ' - r'non zero false northing \(\d*\.\d{2}\)' - r'; unsupported by GRIB Template 3\.140' - r'') - with self.assertRaisesRegex( - TranslationError, - msg): + msg = ( + r"non zero false easting \(\d*\.\d{2}\) or " + r"non zero false northing \(\d*\.\d{2}\)" + r"; unsupported by GRIB Template 3\.140" + r"" + ) + with self.assertRaisesRegex(TranslationError, msg): grid_definition_template(test_cube, self.mock_grib) def test__fail_false_easting(self): diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_30.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_30.py index 49a627cf..38a5cad9 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_template_30.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_30.py @@ -26,8 +26,9 @@ class FakeGribError(Exception): class Test(tests.IrisGribTest, GdtTestMixin): def setUp(self): - self.default_ellipsoid = GeogCS(semi_major_axis=6377563.396, - semi_minor_axis=6356256.909) + self.default_ellipsoid = GeogCS( + semi_major_axis=6377563.396, semi_minor_axis=6356256.909 + ) self.test_cube = self._make_test_cube() GdtTestMixin.setUp(self) @@ -41,43 +42,49 @@ def _make_test_cube(self, cs=None, x_points=None, y_points=None): if y_points is None: y_points = self._default_y_points() - x_coord = iris.coords.DimCoord(x_points, 'projection_x_coordinate', - units='m', coord_system=cs) - y_coord = iris.coords.DimCoord(y_points, 'projection_y_coordinate', - units='m', coord_system=cs) + x_coord = iris.coords.DimCoord( + x_points, "projection_x_coordinate", units="m", coord_system=cs + ) + y_coord = iris.coords.DimCoord( + y_points, "projection_y_coordinate", units="m", coord_system=cs + ) test_cube = iris.cube.Cube(np.zeros((len(y_points), len(x_points)))) test_cube.add_dim_coord(y_coord, 0) test_cube.add_dim_coord(x_coord, 1) return test_cube def _default_coord_system(self): - return LambertConformal(central_lat=39.0, central_lon=-96.0, - false_easting=0.0, false_northing=0.0, - secant_latitudes=(33, 45), - ellipsoid=self.default_ellipsoid) + return LambertConformal( + central_lat=39.0, + central_lon=-96.0, + false_easting=0.0, + false_northing=0.0, + secant_latitudes=(33, 45), + ellipsoid=self.default_ellipsoid, + ) def test__template_number(self): grid_definition_template_30(self.test_cube, self.mock_grib) - self._check_key('gridDefinitionTemplateNumber', 30) + self._check_key("gridDefinitionTemplateNumber", 30) def test__shape_of_earth(self): grid_definition_template_30(self.test_cube, self.mock_grib) - self._check_key('shapeOfTheEarth', 7) - self._check_key('scaleFactorOfEarthMajorAxis', 0) - self._check_key('scaledValueOfEarthMajorAxis', 6377563.396) - self._check_key('scaleFactorOfEarthMinorAxis', 0) - self._check_key('scaledValueOfEarthMinorAxis', 6356256.909) + self._check_key("shapeOfTheEarth", 7) + self._check_key("scaleFactorOfEarthMajorAxis", 0) + self._check_key("scaledValueOfEarthMajorAxis", 6377563.396) + self._check_key("scaleFactorOfEarthMinorAxis", 0) + self._check_key("scaledValueOfEarthMinorAxis", 6356256.909) def test__grid_shape(self): - test_cube = self._make_test_cube(x_points=np.arange(13), - y_points=np.arange(6)) + test_cube = self._make_test_cube(x_points=np.arange(13), y_points=np.arange(6)) grid_definition_template_30(test_cube, self.mock_grib) - self._check_key('Nx', 13) - self._check_key('Ny', 6) + self._check_key("Nx", 13) + self._check_key("Ny", 6) def test__grid_points(self): - test_cube = self._make_test_cube(x_points=[1e6, 3e6, 5e6, 7e6], - y_points=[4e6, 9e6]) + test_cube = self._make_test_cube( + x_points=[1e6, 3e6, 5e6, 7e6], y_points=[4e6, 9e6] + ) grid_definition_template_30(test_cube, self.mock_grib) self._check_key("latitudeOfFirstGridPoint", 71676530) self._check_key("longitudeOfFirstGridPoint", 287218188) @@ -95,24 +102,28 @@ def test__template_specifics(self): def test__scanmode(self): grid_definition_template_30(self.test_cube, self.mock_grib) - self._check_key('iScansPositively', 1) - self._check_key('jScansPositively', 1) + self._check_key("iScansPositively", 1) + self._check_key("jScansPositively", 1) def test__scanmode_reverse(self): test_cube = self._make_test_cube(x_points=np.arange(7e6, 0, -1e6)) grid_definition_template_30(test_cube, self.mock_grib) - self._check_key('iScansPositively', 0) - self._check_key('jScansPositively', 1) + self._check_key("iScansPositively", 0) + self._check_key("jScansPositively", 1) def test_projection_centre(self): grid_definition_template_30(self.test_cube, self.mock_grib) self._check_key("projectionCentreFlag", 0) def test_projection_centre_south_pole(self): - cs = LambertConformal(central_lat=39.0, central_lon=-96.0, - false_easting=0.0, false_northing=0.0, - secant_latitudes=(-33, -45), - ellipsoid=self.default_ellipsoid) + cs = LambertConformal( + central_lat=39.0, + central_lon=-96.0, + false_easting=0.0, + false_northing=0.0, + secant_latitudes=(-33, -45), + ellipsoid=self.default_ellipsoid, + ) test_cube = self._make_test_cube(cs=cs) grid_definition_template_30(test_cube, self.mock_grib) self._check_key("projectionCentreFlag", 1) diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_4.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_4.py index 3d5c4f4c..8e4e1b80 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_template_4.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_4.py @@ -25,33 +25,31 @@ def setUp(self): def test__template_number(self): grid_definition_template_4(self.test_cube, self.mock_grib) - self._check_key('gridDefinitionTemplateNumber', 4) + self._check_key("gridDefinitionTemplateNumber", 4) def test__shape_of_earth_spherical(self): cs = GeogCS(semi_major_axis=1.23) test_cube = self._make_test_cube(cs=cs) grid_definition_template_4(test_cube, self.mock_grib) - self._check_key('shapeOfTheEarth', 1) - self._check_key('scaleFactorOfRadiusOfSphericalEarth', 0) - self._check_key('scaledValueOfRadiusOfSphericalEarth', 1.23) + self._check_key("shapeOfTheEarth", 1) + self._check_key("scaleFactorOfRadiusOfSphericalEarth", 0) + self._check_key("scaledValueOfRadiusOfSphericalEarth", 1.23) def test__shape_of_earth_flattened(self): - cs = GeogCS(semi_major_axis=1.456, - semi_minor_axis=1.123) + cs = GeogCS(semi_major_axis=1.456, semi_minor_axis=1.123) test_cube = self._make_test_cube(cs=cs) grid_definition_template_4(test_cube, self.mock_grib) - self._check_key('shapeOfTheEarth', 7) - self._check_key('scaleFactorOfEarthMajorAxis', 0) - self._check_key('scaledValueOfEarthMajorAxis', 1.456) - self._check_key('scaleFactorOfEarthMinorAxis', 0) - self._check_key('scaledValueOfEarthMinorAxis', 1.123) + self._check_key("shapeOfTheEarth", 7) + self._check_key("scaleFactorOfEarthMajorAxis", 0) + self._check_key("scaledValueOfEarthMajorAxis", 1.456) + self._check_key("scaleFactorOfEarthMinorAxis", 0) + self._check_key("scaledValueOfEarthMinorAxis", 1.123) def test__grid_shape(self): - test_cube = self._make_test_cube(x_points=np.arange(13), - y_points=np.arange(6)) + test_cube = self._make_test_cube(x_points=np.arange(13), y_points=np.arange(6)) grid_definition_template_4(test_cube, self.mock_grib) - self._check_key('Ni', 13) - self._check_key('Nj', 6) + self._check_key("Ni", 13) + self._check_key("Nj", 6) def test__grid_points(self): x_floats = np.array([11.0, 12.0, 167.0]) @@ -66,14 +64,14 @@ def test__grid_points(self): def test__scanmode(self): grid_definition_template_4(self.test_cube, self.mock_grib) - self._check_key('iScansPositively', 1) - self._check_key('jScansPositively', 1) + self._check_key("iScansPositively", 1) + self._check_key("jScansPositively", 1) def test__scanmode_reverse(self): test_cube = self._make_test_cube(x_points=np.arange(7, 0, -1)) grid_definition_template_4(test_cube, self.mock_grib) - self._check_key('iScansPositively', 0) - self._check_key('jScansPositively', 1) + self._check_key("iScansPositively", 0) + self._check_key("jScansPositively", 1) if __name__ == "__main__": diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_5.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_5.py index 9d74f8c0..be789823 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_template_5.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_5.py @@ -28,9 +28,11 @@ def setUp(self): def _default_coord_system(self): # Define an alternate, rotated coordinate system to test." self.default_ellipsoid = GeogCS(PP_DEFAULT_EARTH_RADIUS) - cs = RotatedGeogCS(grid_north_pole_latitude=90.0, - grid_north_pole_longitude=0.0, - ellipsoid=self.default_ellipsoid) + cs = RotatedGeogCS( + grid_north_pole_latitude=90.0, + grid_north_pole_longitude=0.0, + ellipsoid=self.default_ellipsoid, + ) return cs def _default_x_points(self): @@ -39,53 +41,58 @@ def _default_x_points(self): def test__template_number(self): grid_definition_template_5(self.test_cube, self.mock_grib) - self._check_key('gridDefinitionTemplateNumber', 5) + self._check_key("gridDefinitionTemplateNumber", 5) def test__shape_of_earth_spherical(self): - cs = RotatedGeogCS(grid_north_pole_latitude=90.0, - grid_north_pole_longitude=0.0, - ellipsoid=GeogCS(52431.0)) + cs = RotatedGeogCS( + grid_north_pole_latitude=90.0, + grid_north_pole_longitude=0.0, + ellipsoid=GeogCS(52431.0), + ) test_cube = self._make_test_cube(cs=cs) grid_definition_template_5(test_cube, self.mock_grib) - self._check_key('shapeOfTheEarth', 1) - self._check_key('scaleFactorOfRadiusOfSphericalEarth', 0) - self._check_key('scaledValueOfRadiusOfSphericalEarth', 52431.0) + self._check_key("shapeOfTheEarth", 1) + self._check_key("scaleFactorOfRadiusOfSphericalEarth", 0) + self._check_key("scaledValueOfRadiusOfSphericalEarth", 52431.0) def test__shape_of_earth_flattened(self): ellipsoid = GeogCS(semi_major_axis=1456.0, semi_minor_axis=1123.0) - cs = RotatedGeogCS(grid_north_pole_latitude=90.0, - grid_north_pole_longitude=0.0, - ellipsoid=ellipsoid) + cs = RotatedGeogCS( + grid_north_pole_latitude=90.0, + grid_north_pole_longitude=0.0, + ellipsoid=ellipsoid, + ) test_cube = self._make_test_cube(cs=cs) grid_definition_template_5(test_cube, self.mock_grib) - self._check_key('shapeOfTheEarth', 7) - self._check_key('scaleFactorOfEarthMajorAxis', 0) - self._check_key('scaledValueOfEarthMajorAxis', 1456.0) - self._check_key('scaleFactorOfEarthMinorAxis', 0) - self._check_key('scaledValueOfEarthMinorAxis', 1123.0) + self._check_key("shapeOfTheEarth", 7) + self._check_key("scaleFactorOfEarthMajorAxis", 0) + self._check_key("scaledValueOfEarthMajorAxis", 1456.0) + self._check_key("scaleFactorOfEarthMinorAxis", 0) + self._check_key("scaledValueOfEarthMinorAxis", 1123.0) def test__grid_shape(self): - test_cube = self._make_test_cube(x_points=np.arange(13), - y_points=np.arange(6)) + test_cube = self._make_test_cube(x_points=np.arange(13), y_points=np.arange(6)) grid_definition_template_5(test_cube, self.mock_grib) - self._check_key('Ni', 13) - self._check_key('Nj', 6) + self._check_key("Ni", 13) + self._check_key("Nj", 6) def test__scanmode(self): grid_definition_template_5(self.test_cube, self.mock_grib) - self._check_key('iScansPositively', 1) - self._check_key('jScansPositively', 1) + self._check_key("iScansPositively", 1) + self._check_key("jScansPositively", 1) def test__scanmode_reverse(self): test_cube = self._make_test_cube(y_points=[5.0, 2.0]) grid_definition_template_5(test_cube, self.mock_grib) - self._check_key('iScansPositively', 1) - self._check_key('jScansPositively', 0) + self._check_key("iScansPositively", 1) + self._check_key("jScansPositively", 0) def test__rotated_pole(self): - cs = RotatedGeogCS(grid_north_pole_latitude=75.3, - grid_north_pole_longitude=54.321, - ellipsoid=self.default_ellipsoid) + cs = RotatedGeogCS( + grid_north_pole_latitude=75.3, + grid_north_pole_longitude=54.321, + ellipsoid=self.default_ellipsoid, + ) test_cube = self._make_test_cube(cs=cs) grid_definition_template_5(test_cube, self.mock_grib) self._check_key("latitudeOfSouthernPole", -75300000) @@ -93,14 +100,16 @@ def test__rotated_pole(self): self._check_key("angleOfRotation", 0) def test__fail_rotated_pole_nonstandard_meridian(self): - cs = RotatedGeogCS(grid_north_pole_latitude=90.0, - grid_north_pole_longitude=0.0, - north_pole_grid_longitude=22.5, - ellipsoid=self.default_ellipsoid) + cs = RotatedGeogCS( + grid_north_pole_latitude=90.0, + grid_north_pole_longitude=0.0, + north_pole_grid_longitude=22.5, + ellipsoid=self.default_ellipsoid, + ) test_cube = self._make_test_cube(cs=cs) with self.assertRaisesRegex( - TranslationError, - 'not yet support .* rotated prime meridian.'): + TranslationError, "not yet support .* rotated prime meridian." + ): grid_definition_template_5(test_cube, self.mock_grib) def test__grid_points(self): @@ -115,16 +124,16 @@ def test__grid_points(self): self._check_key("latitude", y_longs) def test__true_winds_orientation(self): - self.test_cube.rename('eastward_wind') + self.test_cube.rename("eastward_wind") grid_definition_template_5(self.test_cube, self.mock_grib) - flags = self.mock_grib.keys['resolutionAndComponentFlags'] & 255 + flags = self.mock_grib.keys["resolutionAndComponentFlags"] & 255 flags_expected = 0b00000000 self.assertEqual(flags, flags_expected) def test__grid_winds_orientation(self): - self.test_cube.rename('x_wind') + self.test_cube.rename("x_wind") grid_definition_template_5(self.test_cube, self.mock_grib) - flags = self.mock_grib.keys['resolutionAndComponentFlags'] & 255 + flags = self.mock_grib.keys["resolutionAndComponentFlags"] & 255 flags_expected = 0b00001000 self.assertEqual(flags, flags_expected) diff --git a/iris_grib/tests/unit/save_rules/test_identification.py b/iris_grib/tests/unit/save_rules/test_identification.py index 63ef01ef..d09dc52b 100644 --- a/iris_grib/tests/unit/save_rules/test_identification.py +++ b/iris_grib/tests/unit/save_rules/test_identification.py @@ -19,7 +19,7 @@ from iris_grib.tests.unit import TestGribSimple -GRIB_API = 'iris_grib._save_rules.eccodes' +GRIB_API = "iris_grib._save_rules.eccodes" class Test(TestGribSimple): @@ -32,13 +32,13 @@ def test_no_realization(self): identification(cube, grib) mock_eccodes.assert_has_calls( - [mock.call.codes_set_long(grib, "typeOfProcessedData", 2)]) + [mock.call.codes_set_long(grib, "typeOfProcessedData", 2)] + ) @tests.skip_data def test_realization_0(self): cube = stock.simple_pp() - realisation = iris.coords.AuxCoord((0,), standard_name='realization', - units='1') + realisation = iris.coords.AuxCoord((0,), standard_name="realization", units="1") cube.add_aux_coord(realisation) grib = mock.Mock() @@ -47,13 +47,13 @@ def test_realization_0(self): identification(cube, grib) mock_eccodes.assert_has_calls( - [mock.call.codes_set_long(grib, "typeOfProcessedData", 3)]) + [mock.call.codes_set_long(grib, "typeOfProcessedData", 3)] + ) @tests.skip_data def test_realization_n(self): cube = stock.simple_pp() - realisation = iris.coords.AuxCoord((2,), standard_name='realization', - units='1') + realisation = iris.coords.AuxCoord((2,), standard_name="realization", units="1") cube.add_aux_coord(realisation) grib = mock.Mock() @@ -62,7 +62,8 @@ def test_realization_n(self): identification(cube, grib) mock_eccodes.assert_has_calls( - [mock.call.codes_set_long(grib, "typeOfProcessedData", 4)]) + [mock.call.codes_set_long(grib, "typeOfProcessedData", 4)] + ) if __name__ == "__main__": diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_1.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_1.py index fad9f5cd..c6904c3d 100644 --- a/iris_grib/tests/unit/save_rules/test_product_definition_template_1.py +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_1.py @@ -26,31 +26,30 @@ class TestRealizationIdentifier(tests.IrisGribTest): def setUp(self): self.cube = stock.lat_lon_cube() # Rename cube to avoid warning about unknown discipline/parameter. - self.cube.rename('air_temperature') - coord = DimCoord([45], 'time', - units=Unit('days since epoch', calendar='standard')) + self.cube.rename("air_temperature") + coord = DimCoord( + [45], "time", units=Unit("days since epoch", calendar="standard") + ) self.cube.add_aux_coord(coord) - @mock.patch.object(eccodes, 'codes_set') + @mock.patch.object(eccodes, "codes_set") def test_realization(self, mock_set): cube = self.cube - coord = DimCoord(10, 'realization', units='1') + coord = DimCoord(10, "realization", units="1") cube.add_aux_coord(coord) product_definition_template_1(cube, mock.sentinel.grib) - mock_set.assert_any_call(mock.sentinel.grib, - "productDefinitionTemplateNumber", 1) - mock_set.assert_any_call(mock.sentinel.grib, - "perturbationNumber", 10) - mock_set.assert_any_call(mock.sentinel.grib, - "numberOfForecastsInEnsemble", 255) - mock_set.assert_any_call(mock.sentinel.grib, - "typeOfEnsembleForecast", 255) - - @mock.patch.object(eccodes, 'codes_set') + mock_set.assert_any_call( + mock.sentinel.grib, "productDefinitionTemplateNumber", 1 + ) + mock_set.assert_any_call(mock.sentinel.grib, "perturbationNumber", 10) + mock_set.assert_any_call(mock.sentinel.grib, "numberOfForecastsInEnsemble", 255) + mock_set.assert_any_call(mock.sentinel.grib, "typeOfEnsembleForecast", 255) + + @mock.patch.object(eccodes, "codes_set") def test_multiple_realization_values(self, mock_set): cube = self.cube - coord = DimCoord([8, 9, 10], 'realization', units='1') + coord = DimCoord([8, 9, 10], "realization", units="1") cube.add_aux_coord(coord, 0) msg = "'realization' coordinate with one point is required" diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_10.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_10.py index 93355da8..64cc01a9 100644 --- a/iris_grib/tests/unit/save_rules/test_product_definition_template_10.py +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_10.py @@ -26,32 +26,35 @@ class TestPercentileValueIdentifier(tests.IrisGribTest): def setUp(self): self.cube = stock.lat_lon_cube() # Rename cube to avoid warning about unknown discipline/parameter. - self.cube.rename('y_wind') + self.cube.rename("y_wind") time_coord = DimCoord( - 20, 'time', bounds=[0, 40], - units=Unit('days since epoch', calendar='julian')) + 20, + "time", + bounds=[0, 40], + units=Unit("days since epoch", calendar="julian"), + ) self.cube.add_aux_coord(time_coord) - @mock.patch.object(eccodes, 'codes_set') + @mock.patch.object(eccodes, "codes_set") def test_percentile_value(self, mock_set): cube = self.cube - percentile_coord = DimCoord(95, long_name='percentile_over_time') + percentile_coord = DimCoord(95, long_name="percentile_over_time") cube.add_aux_coord(percentile_coord) product_definition_template_10(cube, mock.sentinel.grib) - mock_set.assert_any_call(mock.sentinel.grib, - "productDefinitionTemplateNumber", 10) - mock_set.assert_any_call(mock.sentinel.grib, - "percentileValue", 95) + mock_set.assert_any_call( + mock.sentinel.grib, "productDefinitionTemplateNumber", 10 + ) + mock_set.assert_any_call(mock.sentinel.grib, "percentileValue", 95) - @mock.patch.object(eccodes, 'codes_set') + @mock.patch.object(eccodes, "codes_set") def test_multiple_percentile_value(self, mock_set): cube = self.cube - percentile_coord = DimCoord([5, 10, 15], - long_name='percentile_over_time') + percentile_coord = DimCoord([5, 10, 15], long_name="percentile_over_time") cube.add_aux_coord(percentile_coord, 0) - err_msg = "A cube 'percentile_over_time' coordinate with one point "\ - "is required" + err_msg = ( + "A cube 'percentile_over_time' coordinate with one point " "is required" + ) with self.assertRaisesRegex(ValueError, err_msg): product_definition_template_10(cube, mock.sentinel.grib) diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_11.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_11.py index 6c0c2dc0..64e27a06 100644 --- a/iris_grib/tests/unit/save_rules/test_product_definition_template_11.py +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_11.py @@ -26,28 +26,30 @@ class TestRealizationIdentifier(tests.IrisGribTest): def setUp(self): self.cube = stock.lat_lon_cube() # Rename cube to avoid warning about unknown discipline/parameter. - self.cube.rename('air_temperature') - coord = DimCoord(23, 'time', bounds=[0, 100], - units=Unit('days since epoch', calendar='standard')) + self.cube.rename("air_temperature") + coord = DimCoord( + 23, + "time", + bounds=[0, 100], + units=Unit("days since epoch", calendar="standard"), + ) self.cube.add_aux_coord(coord) - coord = DimCoord(4, 'realization', units='1') + coord = DimCoord(4, "realization", units="1") self.cube.add_aux_coord(coord) - @mock.patch.object(eccodes, 'codes_set') + @mock.patch.object(eccodes, "codes_set") def test_realization(self, mock_set): cube = self.cube - cell_method = CellMethod(method='sum', coords=['time']) + cell_method = CellMethod(method="sum", coords=["time"]) cube.add_cell_method(cell_method) product_definition_template_11(cube, mock.sentinel.grib) - mock_set.assert_any_call(mock.sentinel.grib, - "productDefinitionTemplateNumber", 11) - mock_set.assert_any_call(mock.sentinel.grib, - "perturbationNumber", 4) - mock_set.assert_any_call(mock.sentinel.grib, - "numberOfForecastsInEnsemble", 255) - mock_set.assert_any_call(mock.sentinel.grib, - "typeOfEnsembleForecast", 255) + mock_set.assert_any_call( + mock.sentinel.grib, "productDefinitionTemplateNumber", 11 + ) + mock_set.assert_any_call(mock.sentinel.grib, "perturbationNumber", 4) + mock_set.assert_any_call(mock.sentinel.grib, "numberOfForecastsInEnsemble", 255) + mock_set.assert_any_call(mock.sentinel.grib, "typeOfEnsembleForecast", 255) if __name__ == "__main__": diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py index 8da31e0a..458d03bf 100644 --- a/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py @@ -27,126 +27,119 @@ def setUp(self): self.cube = stock.lat_lon_cube() # Add scalar time coord so that product_definition_template_common # doesn't get upset. - t_coord = DimCoord([424854.], standard_name='time', - units=Unit('hours since 1970-01-01 00:00:00', - calendar='gregorian')) + t_coord = DimCoord( + [424854.0], + standard_name="time", + units=Unit("hours since 1970-01-01 00:00:00", calendar="gregorian"), + ) self.cube.add_aux_coord(t_coord) # Rename cube to avoid warning about unknown discipline/parameter. - self.cube.rename('air_temperature') + self.cube.rename("air_temperature") - @mock.patch.object(eccodes, 'codes_set') + @mock.patch.object(eccodes, "codes_set") def test_cell_method(self, mock_set): cube_0 = self.cube - cube_0.attributes = dict(spatial_processing_type='No interpolation') - cell_method = CellMethod(method='mean', coords=['area']) + cube_0.attributes = dict(spatial_processing_type="No interpolation") + cell_method = CellMethod(method="mean", coords=["area"]) cube_0.add_cell_method(cell_method) # If the cube has a cell method attached then it should not have any # interpolation on the data, so spatial processing code should be 0 and # number of points used should be 0. product_definition_template_15(cube_0, mock.sentinel.grib) - mock_set.assert_any_call(mock.sentinel.grib, - "productDefinitionTemplateNumber", 15) - mock_set.assert_any_call(mock.sentinel.grib, - "spatialProcessing", 0) - mock_set.assert_any_call(mock.sentinel.grib, - "statisticalProcess", 0) - - @mock.patch.object(eccodes, 'codes_set') + mock_set.assert_any_call( + mock.sentinel.grib, "productDefinitionTemplateNumber", 15 + ) + mock_set.assert_any_call(mock.sentinel.grib, "spatialProcessing", 0) + mock_set.assert_any_call(mock.sentinel.grib, "statisticalProcess", 0) + + @mock.patch.object(eccodes, "codes_set") def test_bilinear_interpolation(self, mock_set): cube_1 = self.cube - cube_1.attributes = dict(spatial_processing_type='Bilinear ' - 'interpolation') + cube_1.attributes = dict(spatial_processing_type="Bilinear " "interpolation") # If the cube has a bilinear interpolation attribute, spatial # processing code should be 1 and number of points used should be 4. product_definition_template_15(cube_1, mock.sentinel.grib) - mock_set.assert_any_call(mock.sentinel.grib, - "productDefinitionTemplateNumber", 15) - mock_set.assert_any_call(mock.sentinel.grib, - "spatialProcessing", 1) - mock_set.assert_any_call(mock.sentinel.grib, - "numberOfPointsUsed", 4) - - @mock.patch.object(eccodes, 'codes_set') + mock_set.assert_any_call( + mock.sentinel.grib, "productDefinitionTemplateNumber", 15 + ) + mock_set.assert_any_call(mock.sentinel.grib, "spatialProcessing", 1) + mock_set.assert_any_call(mock.sentinel.grib, "numberOfPointsUsed", 4) + + @mock.patch.object(eccodes, "codes_set") def test_bicubic_interpolation(self, mock_set): cube_2 = self.cube - cube_2.attributes = dict(spatial_processing_type='Bicubic ' - 'interpolation') + cube_2.attributes = dict(spatial_processing_type="Bicubic " "interpolation") # If the cube has a bicubic interpolation attribute, spatial # processing code should be 2 and number of points used should be 4. product_definition_template_15(cube_2, mock.sentinel.grib) - mock_set.assert_any_call(mock.sentinel.grib, - "productDefinitionTemplateNumber", 15) - mock_set.assert_any_call(mock.sentinel.grib, - "spatialProcessing", 2) - mock_set.assert_any_call(mock.sentinel.grib, - "numberOfPointsUsed", 4) - - @mock.patch.object(eccodes, 'codes_set') + mock_set.assert_any_call( + mock.sentinel.grib, "productDefinitionTemplateNumber", 15 + ) + mock_set.assert_any_call(mock.sentinel.grib, "spatialProcessing", 2) + mock_set.assert_any_call(mock.sentinel.grib, "numberOfPointsUsed", 4) + + @mock.patch.object(eccodes, "codes_set") def test_nearest_neighbour_interpolation(self, mock_set): cube_3 = self.cube - cube_3.attributes = dict(spatial_processing_type='Nearest neighbour ' - 'interpolation') + cube_3.attributes = dict( + spatial_processing_type="Nearest neighbour " "interpolation" + ) # If the cube has a nearest neighbour interpolation attribute, spatial # processing code should be 3 and number of points used should be 1. product_definition_template_15(cube_3, mock.sentinel.grib) - mock_set.assert_any_call(mock.sentinel.grib, - "productDefinitionTemplateNumber", 15) - mock_set.assert_any_call(mock.sentinel.grib, - "spatialProcessing", 3) - mock_set.assert_any_call(mock.sentinel.grib, - "numberOfPointsUsed", 1) - - @mock.patch.object(eccodes, 'codes_set') + mock_set.assert_any_call( + mock.sentinel.grib, "productDefinitionTemplateNumber", 15 + ) + mock_set.assert_any_call(mock.sentinel.grib, "spatialProcessing", 3) + mock_set.assert_any_call(mock.sentinel.grib, "numberOfPointsUsed", 1) + + @mock.patch.object(eccodes, "codes_set") def test_budget_interpolation(self, mock_set): cube_4 = self.cube - cube_4.attributes = dict(spatial_processing_type='Budget ' - 'interpolation') + cube_4.attributes = dict(spatial_processing_type="Budget " "interpolation") # If the cube has a budget interpolation attribute, spatial # processing code should be 4 and number of points used should be 4. product_definition_template_15(cube_4, mock.sentinel.grib) - mock_set.assert_any_call(mock.sentinel.grib, - "productDefinitionTemplateNumber", 15) - mock_set.assert_any_call(mock.sentinel.grib, - "spatialProcessing", 4) - mock_set.assert_any_call(mock.sentinel.grib, - "numberOfPointsUsed", 4) - - @mock.patch.object(eccodes, 'codes_set') + mock_set.assert_any_call( + mock.sentinel.grib, "productDefinitionTemplateNumber", 15 + ) + mock_set.assert_any_call(mock.sentinel.grib, "spatialProcessing", 4) + mock_set.assert_any_call(mock.sentinel.grib, "numberOfPointsUsed", 4) + + @mock.patch.object(eccodes, "codes_set") def test_spectral_interpolation(self, mock_set): cube_5 = self.cube - cube_5.attributes = dict(spatial_processing_type='Spectral ' - 'interpolation') + cube_5.attributes = dict(spatial_processing_type="Spectral " "interpolation") # If the cube has a spectral interpolation attribute, spatial # processing code should be 5 and number of points used should be 4. product_definition_template_15(cube_5, mock.sentinel.grib) - mock_set.assert_any_call(mock.sentinel.grib, - "productDefinitionTemplateNumber", 15) - mock_set.assert_any_call(mock.sentinel.grib, - "spatialProcessing", 5) - mock_set.assert_any_call(mock.sentinel.grib, - "numberOfPointsUsed", 4) - - @mock.patch.object(eccodes, 'codes_set') + mock_set.assert_any_call( + mock.sentinel.grib, "productDefinitionTemplateNumber", 15 + ) + mock_set.assert_any_call(mock.sentinel.grib, "spatialProcessing", 5) + mock_set.assert_any_call(mock.sentinel.grib, "numberOfPointsUsed", 4) + + @mock.patch.object(eccodes, "codes_set") def test_neighbour_budget_interpolation(self, mock_set): cube_6 = self.cube - cube_6.attributes = dict(spatial_processing_type='Neighbour-budget ' - 'interpolation') + cube_6.attributes = dict( + spatial_processing_type="Neighbour-budget " "interpolation" + ) # If the cube has a neighbour-budget interpolation attribute, spatial # processing code should be 6 and number of points used should be 4. product_definition_template_15(cube_6, mock.sentinel.grib) - mock_set.assert_any_call(mock.sentinel.grib, - "productDefinitionTemplateNumber", 15) - mock_set.assert_any_call(mock.sentinel.grib, - "spatialProcessing", 6) - mock_set.assert_any_call(mock.sentinel.grib, - "numberOfPointsUsed", 4) + mock_set.assert_any_call( + mock.sentinel.grib, "productDefinitionTemplateNumber", 15 + ) + mock_set.assert_any_call(mock.sentinel.grib, "spatialProcessing", 6) + mock_set.assert_any_call(mock.sentinel.grib, "numberOfPointsUsed", 4) if __name__ == "__main__": diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_40.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_40.py index f247d32b..d0df74cb 100644 --- a/iris_grib/tests/unit/save_rules/test_product_definition_template_40.py +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_40.py @@ -26,22 +26,23 @@ class TestChemicalConstituentIdentifier(tests.IrisGribTest): def setUp(self): self.cube = stock.lat_lon_cube() # Rename cube to avoid warning about unknown discipline/parameter. - self.cube.rename('atmosphere_mole_content_of_ozone') - coord = DimCoord(24, 'time', - units=Unit('days since epoch', calendar='standard')) + self.cube.rename("atmosphere_mole_content_of_ozone") + coord = DimCoord( + 24, "time", units=Unit("days since epoch", calendar="standard") + ) self.cube.add_aux_coord(coord) - self.cube.attributes['WMO_constituent_type'] = 0 + self.cube.attributes["WMO_constituent_type"] = 0 - @mock.patch.object(eccodes, 'codes_set') + @mock.patch.object(eccodes, "codes_set") def test_constituent_type(self, mock_set): cube = self.cube product_definition_template_40(cube, mock.sentinel.grib) - mock_set.assert_any_call(mock.sentinel.grib, - 'productDefinitionTemplateNumber', 40) - mock_set.assert_any_call(mock.sentinel.grib, - 'constituentType', 0) + mock_set.assert_any_call( + mock.sentinel.grib, "productDefinitionTemplateNumber", 40 + ) + mock_set.assert_any_call(mock.sentinel.grib, "constituentType", 0) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_6.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_6.py index 0f39e1e0..ae9859fc 100644 --- a/iris_grib/tests/unit/save_rules/test_product_definition_template_6.py +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_6.py @@ -26,27 +26,28 @@ class TestRealizationIdentifier(tests.IrisGribTest): def setUp(self): self.cube = stock.lat_lon_cube() # Rename cube to avoid warning about unknown discipline/parameter. - self.cube.rename('air_temperature') - coord = DimCoord([45], 'time', - units=Unit('days since epoch', calendar='standard')) + self.cube.rename("air_temperature") + coord = DimCoord( + [45], "time", units=Unit("days since epoch", calendar="standard") + ) self.cube.add_aux_coord(coord) - @mock.patch.object(eccodes, 'codes_set') + @mock.patch.object(eccodes, "codes_set") def test_percentile(self, mock_set): cube = self.cube - coord = DimCoord(10, long_name='percentile', units='%') + coord = DimCoord(10, long_name="percentile", units="%") cube.add_aux_coord(coord) product_definition_template_6(cube, mock.sentinel.grib) - mock_set.assert_any_call(mock.sentinel.grib, - "productDefinitionTemplateNumber", 6) - mock_set.assert_any_call(mock.sentinel.grib, - "percentileValue", 10) + mock_set.assert_any_call( + mock.sentinel.grib, "productDefinitionTemplateNumber", 6 + ) + mock_set.assert_any_call(mock.sentinel.grib, "percentileValue", 10) - @mock.patch.object(eccodes, 'codes_set') + @mock.patch.object(eccodes, "codes_set") def test_multiple_percentile_values(self, mock_set): cube = self.cube - coord = DimCoord([8, 9, 10], long_name='percentile', units='%') + coord = DimCoord([8, 9, 10], long_name="percentile", units="%") cube.add_aux_coord(coord, 0) msg = "'percentile' coordinate with one point is required" diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_8.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_8.py index 2c5ba3ef..bcb46114 100644 --- a/iris_grib/tests/unit/save_rules/test_product_definition_template_8.py +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_8.py @@ -28,20 +28,25 @@ class TestProductDefinitionIdentifier(tests.IrisGribTest): def setUp(self): self.cube = stock.lat_lon_cube() # Rename cube to avoid warning about unknown discipline/parameter. - self.cube.rename('air_temperature') - coord = DimCoord(23, 'time', bounds=[0, 100], - units=Unit('days since epoch', calendar='standard')) + self.cube.rename("air_temperature") + coord = DimCoord( + 23, + "time", + bounds=[0, 100], + units=Unit("days since epoch", calendar="standard"), + ) self.cube.add_aux_coord(coord) - @mock.patch.object(eccodes, 'codes_set') + @mock.patch.object(eccodes, "codes_set") def test_product_definition(self, mock_set): cube = self.cube - cell_method = CellMethod(method='sum', coords=['time']) + cell_method = CellMethod(method="sum", coords=["time"]) cube.add_cell_method(cell_method) product_definition_template_8(cube, mock.sentinel.grib) - mock_set.assert_any_call(mock.sentinel.grib, - "productDefinitionTemplateNumber", 8) + mock_set.assert_any_call( + mock.sentinel.grib, "productDefinitionTemplateNumber", 8 + ) class Test_type_of_statistical_processing(tests.IrisTest): diff --git a/iris_grib/tests/unit/save_rules/test_reference_time.py b/iris_grib/tests/unit/save_rules/test_reference_time.py index 3c31f11d..02e59347 100644 --- a/iris_grib/tests/unit/save_rules/test_reference_time.py +++ b/iris_grib/tests/unit/save_rules/test_reference_time.py @@ -20,25 +20,28 @@ class Test(tests.IrisGribTest): def _test(self, cube): grib = mock.Mock() mock_eccodes = mock.Mock(spec=eccodes) - with mock.patch('iris_grib._save_rules.eccodes', mock_eccodes): + with mock.patch("iris_grib._save_rules.eccodes", mock_eccodes): reference_time(cube, grib) mock_eccodes.assert_has_calls( - [mock.call.codes_set_long(grib, "significanceOfReferenceTime", 1), - mock.call.codes_set_long(grib, "dataDate", '19980306'), - mock.call.codes_set_long(grib, "dataTime", '0300')]) + [ + mock.call.codes_set_long(grib, "significanceOfReferenceTime", 1), + mock.call.codes_set_long(grib, "dataDate", "19980306"), + mock.call.codes_set_long(grib, "dataTime", "0300"), + ] + ) @tests.skip_data def test_forecast_period(self): # The stock cube has a non-compliant forecast_period. - fname = tests.get_data_path(('GRIB', 'global_t', 'global.grib2')) + fname = tests.get_data_path(("GRIB", "global_t", "global.grib2")) [cube] = load_cubes(fname) self._test(cube) @tests.skip_data def test_no_forecast_period(self): # The stock cube has a non-compliant forecast_period. - fname = tests.get_data_path(('GRIB', 'global_t', 'global.grib2')) + fname = tests.get_data_path(("GRIB", "global_t", "global.grib2")) [cube] = load_cubes(fname) cube.remove_coord("forecast_period") self._test(cube) diff --git a/iris_grib/tests/unit/save_rules/test_set_discipline_and_parameter.py b/iris_grib/tests/unit/save_rules/test_set_discipline_and_parameter.py index 9daa8bf3..1aa899f5 100644 --- a/iris_grib/tests/unit/save_rules/test_set_discipline_and_parameter.py +++ b/iris_grib/tests/unit/save_rules/test_set_discipline_and_parameter.py @@ -3,6 +3,7 @@ # This file is part of iris-grib and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """Unit tests for `iris_grib.grib_save_rules.set_discipline_and_parameter`.""" + # Import iris_grib.tests first so that some things can be initialised before # importing anything else. import iris_grib.tests as tests @@ -19,15 +20,12 @@ class TestPhenomenonCoding(tests.IrisGribTest): def setUp(self): # A mock cube with empty phenomenon-specifying metadata. self.mock_cube = mock.Mock( - spec=Cube, - standard_name=None, - long_name=None, - attributes={}) + spec=Cube, standard_name=None, long_name=None, attributes={} + ) def _check_coding(self, cube, discipline, paramCategory, paramNumber): # Check that encoding 'cube' writes the expected phenomenon keys. - codes_set_patch = self.patch( - 'iris_grib._save_rules.eccodes.codes_set') + codes_set_patch = self.patch("iris_grib._save_rules.eccodes.codes_set") mock_message = mock.sentinel.grib2_message set_discipline_and_parameter(cube, mock_message) @@ -35,7 +33,8 @@ def _check_coding(self, cube, discipline, paramCategory, paramNumber): expected_calls = [ mock.call(mock_message, "discipline", discipline), mock.call(mock_message, "parameterCategory", paramCategory), - mock.call(mock_message, "parameterNumber", paramNumber)] + mock.call(mock_message, "parameterNumber", paramNumber), + ] self.assertEqual(codes_set_patch.call_args_list, expected_calls) @@ -45,38 +44,38 @@ def test_unknown_phenomenon(self): def test_known_standard_name(self): cube = self.mock_cube - cube.standard_name = 'sea_water_y_velocity' + cube.standard_name = "sea_water_y_velocity" self._check_coding(cube, 10, 1, 3) # as seen in _grib_cf_map.py def test_known_long_name(self): cube = self.mock_cube - cube.long_name = 'cloud_mixing_ratio' + cube.long_name = "cloud_mixing_ratio" self._check_coding(cube, 0, 1, 22) def test_gribcode_attribute_object(self): cube = self.mock_cube - cube.attributes = {'GRIB_PARAM': GRIBCode(2, 7, 12, 99)} + cube.attributes = {"GRIB_PARAM": GRIBCode(2, 7, 12, 99)} self._check_coding(cube, 7, 12, 99) def test_gribcode_attribute_string(self): cube = self.mock_cube - cube.attributes = {'GRIB_PARAM': '2, 9, 33, 177'} + cube.attributes = {"GRIB_PARAM": "2, 9, 33, 177"} self._check_coding(cube, 9, 33, 177) def test_gribcode_attribute_tuple(self): cube = self.mock_cube - cube.attributes = {'GRIB_PARAM': (2, 33, 4, 12)} + cube.attributes = {"GRIB_PARAM": (2, 33, 4, 12)} self._check_coding(cube, 33, 4, 12) def test_gribcode_attribute_not_edition_2(self): cube = self.mock_cube - cube.attributes = {'GRIB_PARAM': GRIBCode(1, 7, 12, 99)} + cube.attributes = {"GRIB_PARAM": GRIBCode(1, 7, 12, 99)} self._check_coding(cube, 255, 255, 255) def test_gribcode_attribute_overrides_phenomenon(self): cube = self.mock_cube - cube.standard_name = 'sea_water_y_velocity' - cube.attributes = {'GRIB_PARAM': '2, 9, 33, 177'} + cube.standard_name = "sea_water_y_velocity" + cube.attributes = {"GRIB_PARAM": "2, 9, 33, 177"} self._check_coding(cube, 9, 33, 177) diff --git a/iris_grib/tests/unit/save_rules/test_set_fixed_surfaces.py b/iris_grib/tests/unit/save_rules/test_set_fixed_surfaces.py index 262da42f..7b979130 100644 --- a/iris_grib/tests/unit/save_rules/test_set_fixed_surfaces.py +++ b/iris_grib/tests/unit/save_rules/test_set_fixed_surfaces.py @@ -27,84 +27,87 @@ class Test(tests.IrisGribTest): def test_bounded_altitude_feet(self): cube = iris.cube.Cube([0]) - cube.add_aux_coord(iris.coords.AuxCoord( - 1500.0, long_name='altitude', units='ft', - bounds=np.array([1000.0, 2000.0]))) + cube.add_aux_coord( + iris.coords.AuxCoord( + 1500.0, + long_name="altitude", + units="ft", + bounds=np.array([1000.0, 2000.0]), + ) + ) grib = eccodes.codes_grib_new_from_samples("GRIB2") set_fixed_surfaces(cube, grib) self.assertEqual( - eccodes.codes_get_double(grib, "scaledValueOfFirstFixedSurface"), - 305.0) # precise ~304.8 - self.assertEqual( - eccodes.codes_get_double(grib, "scaledValueOfSecondFixedSurface"), - 610.0) # precise ~609.6 - self.assertEqual( - eccodes.codes_get_long(grib, "typeOfFirstFixedSurface"), - 102) + eccodes.codes_get_double(grib, "scaledValueOfFirstFixedSurface"), 305.0 + ) # precise ~304.8 self.assertEqual( - eccodes.codes_get_long(grib, "typeOfSecondFixedSurface"), - 102) + eccodes.codes_get_double(grib, "scaledValueOfSecondFixedSurface"), 610.0 + ) # precise ~609.6 + self.assertEqual(eccodes.codes_get_long(grib, "typeOfFirstFixedSurface"), 102) + self.assertEqual(eccodes.codes_get_long(grib, "typeOfSecondFixedSurface"), 102) def test_theta_level(self): cube = iris.cube.Cube([0]) - cube.add_aux_coord(iris.coords.AuxCoord( - 230.0, standard_name='air_potential_temperature', - units='K', attributes={'positive': 'up'}, - bounds=np.array([220.0, 240.0]))) + cube.add_aux_coord( + iris.coords.AuxCoord( + 230.0, + standard_name="air_potential_temperature", + units="K", + attributes={"positive": "up"}, + bounds=np.array([220.0, 240.0]), + ) + ) grib = eccodes.codes_grib_new_from_samples("GRIB2") set_fixed_surfaces(cube, grib) self.assertEqual( - eccodes.codes_get_double(grib, "scaledValueOfFirstFixedSurface"), - 220.0) - self.assertEqual( - eccodes.codes_get_double(grib, "scaledValueOfSecondFixedSurface"), - 240.0) - self.assertEqual( - eccodes.codes_get_long(grib, "typeOfFirstFixedSurface"), - 107) + eccodes.codes_get_double(grib, "scaledValueOfFirstFixedSurface"), 220.0 + ) self.assertEqual( - eccodes.codes_get_long(grib, "typeOfSecondFixedSurface"), - 107) + eccodes.codes_get_double(grib, "scaledValueOfSecondFixedSurface"), 240.0 + ) + self.assertEqual(eccodes.codes_get_long(grib, "typeOfFirstFixedSurface"), 107) + self.assertEqual(eccodes.codes_get_long(grib, "typeOfSecondFixedSurface"), 107) def test_depth(self): cube = iris.cube.Cube([0]) - cube.add_aux_coord(iris.coords.AuxCoord( - 1, long_name='depth', units='m', - bounds=np.array([0., 2]), attributes={'positive': 'down'})) + cube.add_aux_coord( + iris.coords.AuxCoord( + 1, + long_name="depth", + units="m", + bounds=np.array([0.0, 2]), + attributes={"positive": "down"}, + ) + ) grib = eccodes.codes_grib_new_from_samples("GRIB2") set_fixed_surfaces(cube, grib) self.assertEqual( - eccodes.codes_get_double(grib, "scaledValueOfFirstFixedSurface"), - 0.) - self.assertEqual( - eccodes.codes_get_double(grib, "scaledValueOfSecondFixedSurface"), - 2) - self.assertEqual( - eccodes.codes_get_long(grib, "typeOfFirstFixedSurface"), - 106) + eccodes.codes_get_double(grib, "scaledValueOfFirstFixedSurface"), 0.0 + ) self.assertEqual( - eccodes.codes_get_long(grib, "typeOfSecondFixedSurface"), - 106) + eccodes.codes_get_double(grib, "scaledValueOfSecondFixedSurface"), 2 + ) + self.assertEqual(eccodes.codes_get_long(grib, "typeOfFirstFixedSurface"), 106) + self.assertEqual(eccodes.codes_get_long(grib, "typeOfSecondFixedSurface"), 106) @mock.patch.object(eccodes, "codes_set") def test_altitude_point(self, mock_set): grib = None cube = iris.cube.Cube([1, 2, 3, 4, 5]) - cube.add_aux_coord( - iris.coords.AuxCoord([12345], "altitude", units="m") - ) + cube.add_aux_coord(iris.coords.AuxCoord([12345], "altitude", units="m")) set_fixed_surfaces(cube, grib) mock_set.assert_any_call(grib, "typeOfFirstFixedSurface", 102) mock_set.assert_any_call(grib, "scaleFactorOfFirstFixedSurface", 0) - mock_set.assert_any_call(grib, "scaledValueOfFirstFixedSurface", - 12345) + mock_set.assert_any_call(grib, "scaledValueOfFirstFixedSurface", 12345) mock_set.assert_any_call(grib, "typeOfSecondFixedSurface", 255) - mock_set.assert_any_call(grib, "scaleFactorOfSecondFixedSurface", - GRIB_MISSING_LONG) - mock_set.assert_any_call(grib, "scaledValueOfSecondFixedSurface", - GRIB_MISSING_LONG) + mock_set.assert_any_call( + grib, "scaleFactorOfSecondFixedSurface", GRIB_MISSING_LONG + ) + mock_set.assert_any_call( + grib, "scaledValueOfSecondFixedSurface", GRIB_MISSING_LONG + ) @mock.patch.object(eccodes, "codes_set") def test_height_point(self, mock_set): @@ -118,66 +121,78 @@ def test_height_point(self, mock_set): mock_set.assert_any_call(grib, "scaleFactorOfFirstFixedSurface", 0) mock_set.assert_any_call(grib, "scaledValueOfFirstFixedSurface", 12345) mock_set.assert_any_call(grib, "typeOfSecondFixedSurface", 255) - mock_set.assert_any_call(grib, "scaleFactorOfSecondFixedSurface", - GRIB_MISSING_LONG) - mock_set.assert_any_call(grib, "scaledValueOfSecondFixedSurface", - GRIB_MISSING_LONG) + mock_set.assert_any_call( + grib, "scaleFactorOfSecondFixedSurface", GRIB_MISSING_LONG + ) + mock_set.assert_any_call( + grib, "scaledValueOfSecondFixedSurface", GRIB_MISSING_LONG + ) def test_unknown_vertical_unbounded(self): cube = iris.cube.Cube([0]) cube.add_aux_coord( - iris.coords.AuxCoord([1], - attributes={'GRIB_fixed_surface_type': 151})) + iris.coords.AuxCoord([1], attributes={"GRIB_fixed_surface_type": 151}) + ) grib = eccodes.codes_grib_new_from_samples("GRIB2") set_fixed_surfaces(cube, grib) - self.assertEqual(eccodes.codes_get_long( - grib, "typeOfFirstFixedSurface"), 151) - self.assertEqual(eccodes.codes_get_double( - grib, "scaledValueOfFirstFixedSurface"), 1) - self.assertEqual(eccodes.codes_get_double( - grib, "scaleFactorOfFirstFixedSurface"), 0) - self.assertEqual(eccodes.codes_get_long( - grib, "typeOfSecondFixedSurface"), 255) - self.assertEqual(eccodes.codes_get_long( - grib, "scaledValueOfSecondFixedSurface"), GRIB_MISSING_LONG) - self.assertEqual(eccodes.codes_get_long( - grib, "scaleFactorOfSecondFixedSurface"), GRIB_MISSING_LONG) + self.assertEqual(eccodes.codes_get_long(grib, "typeOfFirstFixedSurface"), 151) + self.assertEqual( + eccodes.codes_get_double(grib, "scaledValueOfFirstFixedSurface"), 1 + ) + self.assertEqual( + eccodes.codes_get_double(grib, "scaleFactorOfFirstFixedSurface"), 0 + ) + self.assertEqual(eccodes.codes_get_long(grib, "typeOfSecondFixedSurface"), 255) + self.assertEqual( + eccodes.codes_get_long(grib, "scaledValueOfSecondFixedSurface"), + GRIB_MISSING_LONG, + ) + self.assertEqual( + eccodes.codes_get_long(grib, "scaleFactorOfSecondFixedSurface"), + GRIB_MISSING_LONG, + ) def test_unknown_vertical_bounded(self): cube = iris.cube.Cube([0]) cube.add_aux_coord( - iris.coords.AuxCoord([700], bounds=np.array([900.0, 500.0]), - attributes={'GRIB_fixed_surface_type': 108})) + iris.coords.AuxCoord( + [700], + bounds=np.array([900.0, 500.0]), + attributes={"GRIB_fixed_surface_type": 108}, + ) + ) grib = eccodes.codes_grib_new_from_samples("GRIB2") set_fixed_surfaces(cube, grib) + self.assertEqual(eccodes.codes_get_long(grib, "typeOfFirstFixedSurface"), 108) self.assertEqual( - eccodes.codes_get_long(grib, "typeOfFirstFixedSurface"), 108) - self.assertEqual( - eccodes.codes_get_double(grib, "scaledValueOfFirstFixedSurface"), - 900) - self.assertEqual( - eccodes.codes_get_double(grib, "scaleFactorOfFirstFixedSurface"), - 0) + eccodes.codes_get_double(grib, "scaledValueOfFirstFixedSurface"), 900 + ) self.assertEqual( - eccodes.codes_get_long(grib, "typeOfSecondFixedSurface"), 108) + eccodes.codes_get_double(grib, "scaleFactorOfFirstFixedSurface"), 0 + ) + self.assertEqual(eccodes.codes_get_long(grib, "typeOfSecondFixedSurface"), 108) self.assertEqual( - eccodes.codes_get_long(grib, "scaledValueOfSecondFixedSurface"), - 500) + eccodes.codes_get_long(grib, "scaledValueOfSecondFixedSurface"), 500 + ) self.assertEqual( - eccodes.codes_get_long(grib, "scaleFactorOfSecondFixedSurface"), - 0) + eccodes.codes_get_long(grib, "scaleFactorOfSecondFixedSurface"), 0 + ) def test_multiple_unknown_vertical_coords(self): grib = None cube = iris.cube.Cube([0]) cube.add_aux_coord( - iris.coords.AuxCoord([1], - attributes={'GRIB_fixed_surface_type': 151})) + iris.coords.AuxCoord([1], attributes={"GRIB_fixed_surface_type": 151}) + ) cube.add_aux_coord( - iris.coords.AuxCoord([450], bounds=np.array([900.0, 0.0]), - attributes={'GRIB_fixed_surface_type': 108})) + iris.coords.AuxCoord( + [450], + bounds=np.array([900.0, 0.0]), + attributes={"GRIB_fixed_surface_type": 108}, + ) + ) msg = r"coordinates were found of fixed surface type: \[151, 108\]" with self.assertRaisesRegex(ValueError, msg): set_fixed_surfaces(cube, grib) @@ -185,10 +200,11 @@ def test_multiple_unknown_vertical_coords(self): def test_unhandled_vertical_axis(self): grib = None cube = iris.cube.Cube([0]) - cube.add_aux_coord( - iris.coords.AuxCoord([450], attributes={'positive': 'up'})) - msg = r"vertical-axis coordinate\(s\) \('unknown'\) are not " \ - "recognised or handled." + cube.add_aux_coord(iris.coords.AuxCoord([450], attributes={"positive": "up"})) + msg = ( + r"vertical-axis coordinate\(s\) \('unknown'\) are not " + "recognised or handled." + ) with self.assertRaisesRegex(TranslationError, msg): set_fixed_surfaces(cube, grib) @@ -201,10 +217,12 @@ def test_no_vertical(self, mock_set): mock_set.assert_any_call(grib, "scaleFactorOfFirstFixedSurface", 0) mock_set.assert_any_call(grib, "scaledValueOfFirstFixedSurface", 0) mock_set.assert_any_call(grib, "typeOfSecondFixedSurface", 255) - mock_set.assert_any_call(grib, "scaleFactorOfSecondFixedSurface", - GRIB_MISSING_LONG) - mock_set.assert_any_call(grib, "scaledValueOfSecondFixedSurface", - GRIB_MISSING_LONG) + mock_set.assert_any_call( + grib, "scaleFactorOfSecondFixedSurface", GRIB_MISSING_LONG + ) + mock_set.assert_any_call( + grib, "scaledValueOfSecondFixedSurface", GRIB_MISSING_LONG + ) if __name__ == "__main__": diff --git a/iris_grib/tests/unit/save_rules/test_set_time_increment.py b/iris_grib/tests/unit/save_rules/test_set_time_increment.py index 4ff6f14e..6f44d88d 100644 --- a/iris_grib/tests/unit/save_rules/test_set_time_increment.py +++ b/iris_grib/tests/unit/save_rules/test_set_time_increment.py @@ -21,64 +21,72 @@ class Test(tests.IrisGribTest): - @mock.patch.object(eccodes, 'codes_set') + @mock.patch.object(eccodes, "codes_set") def test_no_intervals(self, mock_set): - cell_method = CellMethod('sum', 'time') + cell_method = CellMethod("sum", "time") set_time_increment(cell_method, mock.sentinel.grib) - mock_set.assert_any_call(mock.sentinel.grib, - 'indicatorOfUnitForTimeIncrement', 255) - mock_set.assert_any_call(mock.sentinel.grib, 'timeIncrement', 0) + mock_set.assert_any_call( + mock.sentinel.grib, "indicatorOfUnitForTimeIncrement", 255 + ) + mock_set.assert_any_call(mock.sentinel.grib, "timeIncrement", 0) - @mock.patch.object(eccodes, 'codes_set') + @mock.patch.object(eccodes, "codes_set") def test_area(self, mock_set): - cell_method = CellMethod('sum', 'area', '25 km') + cell_method = CellMethod("sum", "area", "25 km") set_time_increment(cell_method, mock.sentinel.grib) - mock_set.assert_any_call(mock.sentinel.grib, - 'indicatorOfUnitForTimeIncrement', 255) - mock_set.assert_any_call(mock.sentinel.grib, 'timeIncrement', 0) + mock_set.assert_any_call( + mock.sentinel.grib, "indicatorOfUnitForTimeIncrement", 255 + ) + mock_set.assert_any_call(mock.sentinel.grib, "timeIncrement", 0) - @mock.patch.object(eccodes, 'codes_set') + @mock.patch.object(eccodes, "codes_set") def test_multiple_intervals(self, mock_set): - cell_method = CellMethod('sum', 'time', ('1 hour', '24 hour')) + cell_method = CellMethod("sum", "time", ("1 hour", "24 hour")) set_time_increment(cell_method, mock.sentinel.grib) - mock_set.assert_any_call(mock.sentinel.grib, - 'indicatorOfUnitForTimeIncrement', 255) - mock_set.assert_any_call(mock.sentinel.grib, 'timeIncrement', 0) + mock_set.assert_any_call( + mock.sentinel.grib, "indicatorOfUnitForTimeIncrement", 255 + ) + mock_set.assert_any_call(mock.sentinel.grib, "timeIncrement", 0) - @mock.patch.object(eccodes, 'codes_set') + @mock.patch.object(eccodes, "codes_set") def test_hr(self, mock_set): - cell_method = CellMethod('sum', 'time', '23 hr') + cell_method = CellMethod("sum", "time", "23 hr") set_time_increment(cell_method, mock.sentinel.grib) - mock_set.assert_any_call(mock.sentinel.grib, - 'indicatorOfUnitForTimeIncrement', 1) - mock_set.assert_any_call(mock.sentinel.grib, 'timeIncrement', 23) + mock_set.assert_any_call( + mock.sentinel.grib, "indicatorOfUnitForTimeIncrement", 1 + ) + mock_set.assert_any_call(mock.sentinel.grib, "timeIncrement", 23) - @mock.patch.object(eccodes, 'codes_set') + @mock.patch.object(eccodes, "codes_set") def test_hour(self, mock_set): - cell_method = CellMethod('sum', 'time', '24 hour') + cell_method = CellMethod("sum", "time", "24 hour") set_time_increment(cell_method, mock.sentinel.grib) - mock_set.assert_any_call(mock.sentinel.grib, - 'indicatorOfUnitForTimeIncrement', 1) - mock_set.assert_any_call(mock.sentinel.grib, 'timeIncrement', 24) + mock_set.assert_any_call( + mock.sentinel.grib, "indicatorOfUnitForTimeIncrement", 1 + ) + mock_set.assert_any_call(mock.sentinel.grib, "timeIncrement", 24) - @mock.patch.object(eccodes, 'codes_set') + @mock.patch.object(eccodes, "codes_set") def test_hours(self, mock_set): - cell_method = CellMethod('sum', 'time', '25 hours') + cell_method = CellMethod("sum", "time", "25 hours") set_time_increment(cell_method, mock.sentinel.grib) - mock_set.assert_any_call(mock.sentinel.grib, - 'indicatorOfUnitForTimeIncrement', 1) - mock_set.assert_any_call(mock.sentinel.grib, 'timeIncrement', 25) + mock_set.assert_any_call( + mock.sentinel.grib, "indicatorOfUnitForTimeIncrement", 1 + ) + mock_set.assert_any_call(mock.sentinel.grib, "timeIncrement", 25) - @mock.patch.object(eccodes, 'codes_set') + @mock.patch.object(eccodes, "codes_set") def test_fractional_hours(self, mock_set): - cell_method = CellMethod('sum', 'time', '25.9 hours') - with mock.patch('warnings.warn') as warn: + cell_method = CellMethod("sum", "time", "25.9 hours") + with mock.patch("warnings.warn") as warn: set_time_increment(cell_method, mock.sentinel.grib) - warn.assert_called_once_with('Truncating floating point timeIncrement ' - '25.9 to integer value 25') - mock_set.assert_any_call(mock.sentinel.grib, - 'indicatorOfUnitForTimeIncrement', 1) - mock_set.assert_any_call(mock.sentinel.grib, 'timeIncrement', 25) + warn.assert_called_once_with( + "Truncating floating point timeIncrement " "25.9 to integer value 25" + ) + mock_set.assert_any_call( + mock.sentinel.grib, "indicatorOfUnitForTimeIncrement", 1 + ) + mock_set.assert_any_call(mock.sentinel.grib, "timeIncrement", 25) if __name__ == "__main__": diff --git a/iris_grib/tests/unit/save_rules/test_set_time_range.py b/iris_grib/tests/unit/save_rules/test_set_time_range.py index a7e0bace..d2f1dacb 100644 --- a/iris_grib/tests/unit/save_rules/test_set_time_range.py +++ b/iris_grib/tests/unit/save_rules/test_set_time_range.py @@ -24,53 +24,57 @@ class Test(tests.IrisGribTest): def setUp(self): - self.coord = DimCoord(0, 'time', - units=Unit('hours since epoch', - calendar='standard')) + self.coord = DimCoord( + 0, "time", units=Unit("hours since epoch", calendar="standard") + ) def test_no_bounds(self): - with self.assertRaisesRegex(ValueError, 'Expected time coordinate ' - 'with two bounds, got 0 bounds'): + with self.assertRaisesRegex( + ValueError, "Expected time coordinate " "with two bounds, got 0 bounds" + ): set_time_range(self.coord, mock.sentinel.grib) def test_three_bounds(self): self.coord.bounds = [0, 1, 2] - with self.assertRaisesRegex(ValueError, 'Expected time coordinate ' - 'with two bounds, got 3 bounds'): + with self.assertRaisesRegex( + ValueError, "Expected time coordinate " "with two bounds, got 3 bounds" + ): set_time_range(self.coord, mock.sentinel.grib) def test_non_scalar(self): - coord = DimCoord([0, 1], 'time', bounds=[[0, 1], [1, 2]], - units=Unit('hours since epoch', calendar='standard')) - with self.assertRaisesRegex(ValueError, 'Expected length one time ' - 'coordinate, got 2 points'): + coord = DimCoord( + [0, 1], + "time", + bounds=[[0, 1], [1, 2]], + units=Unit("hours since epoch", calendar="standard"), + ) + with self.assertRaisesRegex( + ValueError, "Expected length one time " "coordinate, got 2 points" + ): set_time_range(coord, mock.sentinel.grib) - @mock.patch.object(eccodes, 'codes_set') + @mock.patch.object(eccodes, "codes_set") def test_hours(self, mock_set): lower = 10 upper = 20 self.coord.bounds = [lower, upper] set_time_range(self.coord, mock.sentinel.grib) - mock_set.assert_any_call(mock.sentinel.grib, - 'indicatorOfUnitForTimeRange', 1) - mock_set.assert_any_call(mock.sentinel.grib, - 'lengthOfTimeRange', upper - lower) + mock_set.assert_any_call(mock.sentinel.grib, "indicatorOfUnitForTimeRange", 1) + mock_set.assert_any_call(mock.sentinel.grib, "lengthOfTimeRange", upper - lower) - @mock.patch.object(eccodes, 'codes_set') + @mock.patch.object(eccodes, "codes_set") def test_days(self, mock_set): lower = 4 upper = 6 self.coord.bounds = [lower, upper] - self.coord.units = Unit('days since epoch', calendar='standard') + self.coord.units = Unit("days since epoch", calendar="standard") set_time_range(self.coord, mock.sentinel.grib) - mock_set.assert_any_call(mock.sentinel.grib, - 'indicatorOfUnitForTimeRange', 1) - mock_set.assert_any_call(mock.sentinel.grib, - 'lengthOfTimeRange', - (upper - lower) * 24) + mock_set.assert_any_call(mock.sentinel.grib, "indicatorOfUnitForTimeRange", 1) + mock_set.assert_any_call( + mock.sentinel.grib, "lengthOfTimeRange", (upper - lower) * 24 + ) - @mock.patch.object(eccodes, 'codes_set') + @mock.patch.object(eccodes, "codes_set") def test_fractional_hours(self, mock_set_long): lower = 10.0 upper = 20.9 @@ -79,13 +83,17 @@ def test_fractional_hours(self, mock_set_long): warnings.simplefilter("always") set_time_range(self.coord, mock.sentinel.grib) self.assertEqual(len(warn), 1) - msg = r'Truncating floating point lengthOfTimeRange 10\.8?9+ ' \ - 'to integer value 10' + msg = ( + r"Truncating floating point lengthOfTimeRange 10\.8?9+ " + "to integer value 10" + ) self.assertRegex(str(warn[0].message), msg) - mock_set_long.assert_any_call(mock.sentinel.grib, - 'indicatorOfUnitForTimeRange', 1) - mock_set_long.assert_any_call(mock.sentinel.grib, - 'lengthOfTimeRange', int(upper - lower)) + mock_set_long.assert_any_call( + mock.sentinel.grib, "indicatorOfUnitForTimeRange", 1 + ) + mock_set_long.assert_any_call( + mock.sentinel.grib, "lengthOfTimeRange", int(upper - lower) + ) if __name__ == "__main__": diff --git a/iris_grib/tests/unit/test_GribWrapper.py b/iris_grib/tests/unit/test_GribWrapper.py index 1b775298..2f1484f3 100644 --- a/iris_grib/tests/unit/test_GribWrapper.py +++ b/iris_grib/tests/unit/test_GribWrapper.py @@ -25,16 +25,18 @@ def _mock_codes_get_long(grib_message, key): - lookup = dict(totalLength=_message_length, - numberOfValues=200, - jPointsAreConsecutive=0, - Ni=20, - Nj=10, - edition=1) + lookup = dict( + totalLength=_message_length, + numberOfValues=200, + jPointsAreConsecutive=0, + Ni=20, + Nj=10, + edition=1, + ) try: result = lookup[key] except KeyError: - msg = 'Mock codes_get_long unknown key: {!r}'.format(key) + msg = "Mock codes_get_long unknown key: {!r}".format(key) raise AttributeError(msg) return result @@ -45,7 +47,7 @@ def _mock_codes_get_string(grib_message, key): def _mock_codes_get_native_type(grib_message, key): result = int - if key == 'gridType': + if key == "gridType": result = str return result @@ -56,26 +58,24 @@ def _mock_codes_get_message_offset(grib_message): class Test_edition(tests.IrisGribTest): def setUp(self): - self.patch('iris_grib.GribWrapper._confirm_in_scope') - self.patch('iris_grib.GribWrapper._compute_extra_keys') - self.patch('eccodes.codes_get_long', _mock_codes_get_long) - self.patch('eccodes.codes_get_string', _mock_codes_get_string) - self.patch('eccodes.codes_get_native_type', - _mock_codes_get_native_type) - self.patch('eccodes.codes_get_message_offset', - _mock_codes_get_message_offset) + self.patch("iris_grib.GribWrapper._confirm_in_scope") + self.patch("iris_grib.GribWrapper._compute_extra_keys") + self.patch("eccodes.codes_get_long", _mock_codes_get_long) + self.patch("eccodes.codes_get_string", _mock_codes_get_string) + self.patch("eccodes.codes_get_native_type", _mock_codes_get_native_type) + self.patch("eccodes.codes_get_message_offset", _mock_codes_get_message_offset) def test_not_edition_1(self): def func(grib_message, key): return 2 emsg = "GRIB edition 2 is not supported by 'GribWrapper'" - with mock.patch('eccodes.codes_get_long', func): + with mock.patch("eccodes.codes_get_long", func): with self.assertRaisesRegex(TranslationError, emsg): GribWrapper(None) def test_edition_1(self): - grib_message = 'regular_ll' + grib_message = "regular_ll" grib_fh = mock.Mock() wrapper = GribWrapper(grib_message, grib_fh) self.assertEqual(wrapper.grib_message, grib_message) @@ -84,28 +84,24 @@ def test_edition_1(self): @tests.skip_data class Test_deferred_data(tests.IrisTest): def test_regular_data(self): - filename = tests.get_data_path(('GRIB', 'gaussian', - 'regular_gg.grib1')) + filename = tests.get_data_path(("GRIB", "gaussian", "regular_gg.grib1")) messages = list(_load_generate(filename)) self.assertTrue(is_lazy_data(messages[0]._data)) def test_reduced_data(self): - filename = tests.get_data_path(('GRIB', 'reduced', - 'reduced_ll.grib1')) + filename = tests.get_data_path(("GRIB", "reduced", "reduced_ll.grib1")) messages = list(_load_generate(filename)) self.assertTrue(is_lazy_data(messages[0]._data)) class Test_deferred_proxy_args(tests.IrisTest): def setUp(self): - self.patch('iris_grib.GribWrapper._confirm_in_scope') - self.patch('iris_grib.GribWrapper._compute_extra_keys') - self.patch('eccodes.codes_get_long', _mock_codes_get_long) - self.patch('eccodes.codes_get_string', _mock_codes_get_string) - self.patch('eccodes.codes_get_native_type', - _mock_codes_get_native_type) - self.patch('eccodes.codes_get_message_offset', - _mock_codes_get_message_offset) + self.patch("iris_grib.GribWrapper._confirm_in_scope") + self.patch("iris_grib.GribWrapper._compute_extra_keys") + self.patch("eccodes.codes_get_long", _mock_codes_get_long) + self.patch("eccodes.codes_get_string", _mock_codes_get_string) + self.patch("eccodes.codes_get_native_type", _mock_codes_get_native_type) + self.patch("eccodes.codes_get_message_offset", _mock_codes_get_message_offset) self.expected = np.atleast_1d(_offset) self.grib_fh = mock.Mock() self.dtype = np.float64 @@ -113,24 +109,21 @@ def setUp(self): self.lookup = _mock_codes_get_long def test_regular_proxy_args(self): - grib_message = 'regular_ll' - shape = (self.lookup(grib_message, 'Nj'), - self.lookup(grib_message, 'Ni')) + grib_message = "regular_ll" + shape = (self.lookup(grib_message, "Nj"), self.lookup(grib_message, "Ni")) for offset in self.expected: - with mock.patch('iris_grib.GribDataProxy') as mock_gdp: + with mock.patch("iris_grib.GribDataProxy") as mock_gdp: _ = GribWrapper(grib_message, self.grib_fh) - mock_gdp.assert_called_once_with(shape, self.dtype, - self.path, offset) + mock_gdp.assert_called_once_with(shape, self.dtype, self.path, offset) def test_reduced_proxy_args(self): - grib_message = 'reduced_gg' - shape = (self.lookup(grib_message, 'numberOfValues')) + grib_message = "reduced_gg" + shape = self.lookup(grib_message, "numberOfValues") for offset in self.expected: - with mock.patch('iris_grib.GribDataProxy') as mock_gdp: + with mock.patch("iris_grib.GribDataProxy") as mock_gdp: _ = GribWrapper(grib_message, self.grib_fh) - mock_gdp.assert_called_once_with((shape,), self.dtype, - self.path, offset) + mock_gdp.assert_called_once_with((shape,), self.dtype, self.path, offset) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/test__load_generate.py b/iris_grib/tests/unit/test__load_generate.py index 882d5b02..7a10db44 100644 --- a/iris_grib/tests/unit/test__load_generate.py +++ b/iris_grib/tests/unit/test__load_generate.py @@ -27,36 +27,37 @@ def _make_test_message(self, sections): return GribMessage(raw_message, None, file_ref=file_ref) def test_grib1(self): - sections = [{'editionNumber': 1}] + sections = [{"editionNumber": 1}] message = self._make_test_message(sections) - mfunc = 'iris_grib.GribMessage.messages_from_filename' - mclass = 'iris_grib.GribWrapper' + mfunc = "iris_grib.GribMessage.messages_from_filename" + mclass = "iris_grib.GribWrapper" with mock.patch(mfunc, return_value=[message]) as mock_func: with mock.patch(mclass, spec=GribWrapper) as mock_wrapper: field = next(_load_generate(self.fname)) mock_func.assert_called_once_with(self.fname) self.assertIsInstance(field, GribWrapper) - mock_wrapper.assert_called_once_with(self.message_id, - grib_fh=self.grib_fh) + mock_wrapper.assert_called_once_with( + self.message_id, grib_fh=self.grib_fh + ) def test_grib2(self): - sections = [{'editionNumber': 2}] + sections = [{"editionNumber": 2}] message = self._make_test_message(sections) - mfunc = 'iris_grib.GribMessage.messages_from_filename' + mfunc = "iris_grib.GribMessage.messages_from_filename" with mock.patch(mfunc, return_value=[message]) as mock_func: field = next(_load_generate(self.fname)) mock_func.assert_called_once_with(self.fname) self.assertEqual(field, message) def test_grib_unknown(self): - sections = [{'editionNumber': 0}] + sections = [{"editionNumber": 0}] message = self._make_test_message(sections) - mfunc = 'iris_grib.GribMessage.messages_from_filename' - emsg = 'GRIB edition 0 is not supported' + mfunc = "iris_grib.GribMessage.messages_from_filename" + emsg = "GRIB edition 0 is not supported" with mock.patch(mfunc, return_value=[message]): with self.assertRaisesRegex(TranslationError, emsg): next(_load_generate(self.fname)) -if __name__ == '__main__': +if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/test_load_cubes.py b/iris_grib/tests/unit/test_load_cubes.py index 32f6efba..d4f3016d 100644 --- a/iris_grib/tests/unit/test_load_cubes.py +++ b/iris_grib/tests/unit/test_load_cubes.py @@ -21,7 +21,7 @@ def test(self): files = mock.sentinel.FILES callback = mock.sentinel.CALLBACK expected_result = mock.sentinel.RESULT - with mock.patch('iris.fileformats.rules.load_cubes') as rules_load: + with mock.patch("iris.fileformats.rules.load_cubes") as rules_load: rules_load.return_value = expected_result result = load_cubes(files, callback) kwargs = {} @@ -32,12 +32,10 @@ def test(self): @tests.skip_data class Test_load_cubes(tests.IrisGribTest): - def test_reduced_raw(self): # Loading a GRIB message defined on a reduced grid without # interpolating to a regular grid. - gribfile = tests.get_data_path( - ("GRIB", "reduced", "reduced_gg.grib2")) + gribfile = tests.get_data_path(("GRIB", "reduced", "reduced_gg.grib2")) grib_generator = load_cubes(gribfile) self.assertCML(next(grib_generator)) diff --git a/iris_grib/tests/unit/test_save_grib2.py b/iris_grib/tests/unit/test_save_grib2.py index 9b8f6423..44603b30 100644 --- a/iris_grib/tests/unit/test_save_grib2.py +++ b/iris_grib/tests/unit/test_save_grib2.py @@ -17,12 +17,12 @@ class TestSaveGrib2(tests.IrisGribTest): def setUp(self): self.cube = mock.sentinel.cube self.target = mock.sentinel.target - func = 'iris_grib.save_pairs_from_cube' + func = "iris_grib.save_pairs_from_cube" self.messages = list(range(10)) slices = self.messages side_effect = [zip(slices, self.messages)] self.save_pairs_from_cube = self.patch(func, side_effect=side_effect) - func = 'iris_grib.save_messages' + func = "iris_grib.save_messages" self.save_messages = self.patch(func) def _check(self, append=False): diff --git a/iris_grib/tests/unit/test_save_messages.py b/iris_grib/tests/unit/test_save_messages.py index 37c3f71e..c8a1263c 100644 --- a/iris_grib/tests/unit/test_save_messages.py +++ b/iris_grib/tests/unit/test_save_messages.py @@ -21,16 +21,15 @@ def setUp(self): def test_save(self): m = mock.mock_open() - with mock.patch('builtins.open', m, create=True): - iris_grib.save_messages([self.grib_message], 'foo.grib2') - self.assertTrue(mock.call('foo.grib2', 'wb') in m.mock_calls) + with mock.patch("builtins.open", m, create=True): + iris_grib.save_messages([self.grib_message], "foo.grib2") + self.assertTrue(mock.call("foo.grib2", "wb") in m.mock_calls) def test_save_append(self): m = mock.mock_open() - with mock.patch('builtins.open', m, create=True): - iris_grib.save_messages([self.grib_message], 'foo.grib2', - append=True) - self.assertTrue(mock.call('foo.grib2', 'ab') in m.mock_calls) + with mock.patch("builtins.open", m, create=True): + iris_grib.save_messages([self.grib_message], "foo.grib2", append=True) + self.assertTrue(mock.call("foo.grib2", "ab") in m.mock_calls) if __name__ == "__main__": diff --git a/noxfile.py b/noxfile.py index ff2711e2..a8166b71 100644 --- a/noxfile.py +++ b/noxfile.py @@ -25,7 +25,7 @@ #: Cirrus-CI environment variable hook. PY_VER = os.environ.get("PY_VER", ["3.9", "3.10", "3.11"]) -IRIS_SOURCE = os.environ.get("IRIS_SOURCE", ['source', 'conda-forge']) +IRIS_SOURCE = os.environ.get("IRIS_SOURCE", ["source", "conda-forge"]) #: Default cartopy cache directory. CARTOPY_CACHE_DIR = os.environ.get("HOME") / Path(".local/share/cartopy") @@ -64,20 +64,18 @@ def _write_iris_config(session: nox.sessions.Session) -> None: """ try: - test_data_dir = session.posargs[ - session.posargs.index('--test-data-dir')+1 - ] + test_data_dir = session.posargs[session.posargs.index("--test-data-dir") + 1] except Exception: test_data_dir = "" iris_config_file = os.path.join( session.virtualenv.location, - 'lib', - f'python{session.python}', - 'site-packages', - 'iris', - 'etc', - 'site.cfg', + "lib", + f"python{session.python}", + "site-packages", + "iris", + "etc", + "site.cfg", ) iris_config = f""" [Resources] @@ -91,7 +89,7 @@ def _write_iris_config(session: nox.sessions.Session) -> None: print("Iris config\n-----------") print(iris_config) - with open(iris_config_file, 'w') as f: + with open(iris_config_file, "w") as f: f.write(iris_config) @@ -163,7 +161,7 @@ def _install_and_cache_venv(session: nox.sessions.Session) -> None: @contextmanager def prepare_venv( - session: nox.sessions.Session, iris_source: str = 'conda-forge' + session: nox.sessions.Session, iris_source: str = "conda-forge" ) -> None: """ Create and cache the nox session conda environment, and additionally @@ -206,7 +204,7 @@ def prepare_venv( logger.debug(f"Environment up to date: {venv_dir}") - if iris_source == 'source': + if iris_source == "source": # get latest iris iris_dir = f"{session.create_tmp()}/iris" @@ -219,7 +217,7 @@ def prepare_venv( "pull", "origin", "main", - external=True # use git from host environment + external=True, # use git from host environment ) else: session.run( @@ -227,9 +225,9 @@ def prepare_venv( "clone", "https://github.com/scitools/iris.git", iris_dir, - external=True + external=True, ) - session.install(iris_dir, '--no-deps') + session.install(iris_dir, "--no-deps") _cache_cartopy(session) _write_iris_config(session) @@ -252,46 +250,8 @@ def prepare_venv( ) -@nox.session -def flake8(session: nox.sessions.Session): - """ - Perform flake8 linting of iris-grib. - - Parameters - ---------- - session: object - A `nox.sessions.Session` object. - - """ - # Pip install the session requirements. - session.install("flake8") - # Execute the flake8 linter on the package. - session.run("flake8", PACKAGE) - # Execute the flake8 linter on this file. - session.run("flake8", __file__) - - -@nox.session -def black(session: nox.sessions.Session): - """ - Perform black format checking of iris-grib. - - Parameters - ---------- - session: object - A `nox.sessions.Session` object. - - """ - # Pip install the session requirements. - session.install("black==20.8b1") - # Execute the black format checker on the package. - session.run("black", "--check", PACKAGE) - # Execute the black format checker on this file. - session.run("black", "--check", __file__) - - @nox.session(python=PY_VER, venv_backend="conda") -@nox.parametrize('iris_source', IRIS_SOURCE) +@nox.parametrize("iris_source", IRIS_SOURCE) def tests(session: nox.sessions.Session, iris_source: str): """ Perform iris-grib tests against release and development versions of iris. diff --git a/pyproject.toml b/pyproject.toml index 115f6902..51a40161 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -120,3 +120,45 @@ minversion = "6.0" testpaths = "iris_grib" xfail_strict = "True" +[tool.ruff] +# Exclude the following, in addition to the standard set of exclusions. +# https://docs.astral.sh/ruff/settings/#exclude +line-length = 88 +src = [ + "iris_grib", + "docs", +] + +[tool.ruff.format] +docstring-code-format = true +preview = false + +[tool.ruff.lint] +ignore = [ + # NOTE: Non-permanent exclusions should be added to the ".ruff.toml" file. + + # flake8-commas (COM) + # https://docs.astral.sh/ruff/rules/#flake8-commas-com + "COM812", # Trailing comma missing. + "COM819", # Trailing comma prohibited. + + # flake8-implicit-str-concat (ISC) + # https://docs.astral.sh/ruff/rules/single-line-implicit-string-concatenation/ + # NOTE: This rule may cause conflicts when used with "ruff format". + "ISC001", # Implicitly concatenate string literals on one line. + ] +preview = false +select = [ + "ALL", + + # pydocstyle (D) + # https://docs.astral.sh/ruff/rules/multi-line-summary-first-line/ + "D212", # Multi-line docstring summary should start at the first line +] + +[tool.ruff.lint.isort] +force-sort-within-sections = true +known-first-party = ["iris_grib"] + +[tool.ruff.lint.pydocstyle] +convention = "numpy" From 10b37075fdd712714672b3274713b04b8785573e Mon Sep 17 00:00:00 2001 From: Bill Little Date: Thu, 18 Apr 2024 09:35:46 +0100 Subject: [PATCH 277/583] add dependabot (#426) --- .github/dependabot.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..773fd464 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,19 @@ +# Reference: +# - https://docs.github.com/en/code-security/supply-chain-security/keeping-your-dependencies-updated-automatically/keeping-your-actions-up-to-date-with-dependabot +# - https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file#groups + +version: 2 +updates: + + - package-ecosystem: "github-actions" + directory: "/" + schedule: + # Check for updates to GitHub Actions every weekday + interval: "daily" + groups: + dependencies: + patterns: + - "*" + labels: + - "New: Pull Request" + - "Bot" From 2c533c207ca01f4b313e4ec49ec281821d122f91 Mon Sep 17 00:00:00 2001 From: Bill Little Date: Thu, 18 Apr 2024 10:47:47 +0100 Subject: [PATCH 278/583] add manifest gha (#427) * add manifest gha * only include pypi requirements --- .github/workflows/ci-manifest.yml | 23 +++++++++++++++++++++++ MANIFEST.in | 14 ++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 .github/workflows/ci-manifest.yml create mode 100644 MANIFEST.in diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml new file mode 100644 index 00000000..a532bec0 --- /dev/null +++ b/.github/workflows/ci-manifest.yml @@ -0,0 +1,23 @@ +name: ci-manifest + +on: + pull_request: + branches: + - "*" + + push: + branches-ignore: + - "auto-update-lockfiles" + - "pre-commit-ci-update-config" + - "dependabot/*" + + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + manifest: + name: "check-manifest" + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.02.1 diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 00000000..8c8f62c5 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,14 @@ +prune .github +prune .nox +prune docs +prune requirements +recursive-include requirements *.txt +recursive-include iris_grib *.cml *.grib2 *.json *.nc *.py + +exclude .coveragerc +exclude .flake8 +exclude .gitignore +exclude .pre-commit-config.yaml +exclude .readthedocs.yml +include *.md +include *.py From c05b4e23542f7e83e6658c2187ba05026354cf22 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 18 Apr 2024 11:50:24 +0100 Subject: [PATCH 279/583] Bump scitools/workflows in the dependencies group (#434) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2023.03.0 to 2024.04.1 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2023.03.0...2024.04.1) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/refresh-lockfiles.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index e4a6c80d..f30786a8 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2023.03.0 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.04.1 secrets: inherit From b51e075c1f73c0d1c2ef8992a534e8ff4c7d807c Mon Sep 17 00:00:00 2001 From: stephenworsley <49274989+stephenworsley@users.noreply.github.com> Date: Thu, 18 Apr 2024 12:32:09 +0100 Subject: [PATCH 280/583] Re-remove _iris_mercator_support.py, fix manifest check failures (#435) * remove _iris_mercator_support.py * fix manifest check * fix manifest check properly --- MANIFEST.in | 1 + iris_grib/_iris_mercator_support.py | 25 ------------------------- 2 files changed, 1 insertion(+), 25 deletions(-) delete mode 100644 iris_grib/_iris_mercator_support.py diff --git a/MANIFEST.in b/MANIFEST.in index 8c8f62c5..f0382ab2 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -10,5 +10,6 @@ exclude .flake8 exclude .gitignore exclude .pre-commit-config.yaml exclude .readthedocs.yml +exclude .ruff.toml include *.md include *.py diff --git a/iris_grib/_iris_mercator_support.py b/iris_grib/_iris_mercator_support.py deleted file mode 100644 index 92df804d..00000000 --- a/iris_grib/_iris_mercator_support.py +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright iris-grib contributors -# -# This file is part of iris-grib and is released under the BSD license. -# See LICENSE in the root of the repository for full licensing details. -""" -Temporary module to check for the extended Mercator class in Iris, -which iris-grib requires for its Mercator support. - -""" - -from packaging.version import Version - -import iris - - -def confirm_extended_mercator_supported(): - # Check that Iris version is at least 2.1, required for 'standard_parallel' - # support in the Mercator coord-system. - # This is a temporary fix allowing us to state Iris>=2.0 as a dependency, - # required for this release because Iris 2.1 is not yet available. - iris_version = Version(iris.__version__) - min_mercator_version = Version("2.1.0") - if iris_version < min_mercator_version: - msg = "Support for Mercator projections requires Iris version >= {}" - raise ValueError(msg.format(min_mercator_version)) From 71703ae353abe26c224a6f3c7c46dac839ba896c Mon Sep 17 00:00:00 2001 From: Bill Little Date: Thu, 18 Apr 2024 12:32:23 +0100 Subject: [PATCH 281/583] add toml to manifest (#436) --- MANIFEST.in | 1 + 1 file changed, 1 insertion(+) diff --git a/MANIFEST.in b/MANIFEST.in index f0382ab2..24b6337b 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -13,3 +13,4 @@ exclude .readthedocs.yml exclude .ruff.toml include *.md include *.py +include *.toml From 590418bf5e9a58dbb944bf938a4ca7256b619b6f Mon Sep 17 00:00:00 2001 From: Bill Little Date: Thu, 18 Apr 2024 15:06:35 +0100 Subject: [PATCH 282/583] backout manifest inclusion (#441) --- MANIFEST.in | 1 - 1 file changed, 1 deletion(-) diff --git a/MANIFEST.in b/MANIFEST.in index 24b6337b..f0382ab2 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -13,4 +13,3 @@ exclude .readthedocs.yml exclude .ruff.toml include *.md include *.py -include *.toml From 569d5a1074eb0d76daef82e8940a4d824d4f35ba Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Thu, 18 Apr 2024 15:17:23 +0100 Subject: [PATCH 283/583] Grib1 loading defines a GRIB_PARAM attribute, like grib2 load. (#402) * Grib1 loading defines a GRIB_PARAM attribute, like grib2 load. * Shorten line. * Update cube-load result snapshots. * fix mock usage. * Various documentation improvements. * Further docs rework : doctests now working. * Line-length fix. * Review changes. * GRIBcode to properly support GRIB1 and GRIB2 usage. * Add repr test * Update with comments * Small notes. * Revert to shorter names with no digits; add repr implementation * Don't pep8 grib_phenom_translation as it now uses dataclasses. * Fixes for rename. * Fix result CMLs. * Add grib1 testing. * Replaced GRIBCode class with factory function. * Move GRIBCode code into a separate submodule. * Tidy and fix error case handling, and testing. * Small docs fix, and whatsnews * Fix doctests: don't use iris.tests * Small review changes. * Standardise optional type + ensure support for Python<3.10 * Review change. --------- Co-authored-by: Martin Yeo <40734014+trexfeathers@users.noreply.github.com> --- docs/conf.py | 2 +- docs/index.rst | 242 +++++++++++++----- docs/ref/release_notes.rst | 13 + iris_grib/__init__.py | 25 +- iris_grib/_grib1_load_rules.py | 16 +- iris_grib/_load_convert.py | 2 +- .../__init__.py} | 83 +----- .../grib_phenom_translation/_gribcode.py | 191 ++++++++++++++ .../sample_file_loads/earth_shape_grib1.cml | 3 + .../sample_file_loads/lambert_grib1.cml | 3 + .../sample_file_loads/polar_stereo_grib1.cml | 3 + .../sample_file_loads/reduced_ll_grib1.cml | 3 + .../sample_file_loads/regular_gg_grib1.cml | 3 + .../sample_file_loads/rotated.cml | 3 + .../sample_file_loads/time_bound_grib1.cml | 3 + .../test_grib1_load_translations.py | 2 +- .../test_grib_phenom_translation.py | 242 ++++++++++++++---- 17 files changed, 643 insertions(+), 196 deletions(-) rename iris_grib/{grib_phenom_translation.py => grib_phenom_translation/__init__.py} (81%) create mode 100644 iris_grib/grib_phenom_translation/_gribcode.py diff --git a/docs/conf.py b/docs/conf.py index 432e253d..6e27a766 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -296,5 +296,5 @@ # Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = { "python": ("https://docs.python.org/", None), - "iris": ("https://scitools-iris.readthedocs.io/en/latest/", None), + "iris": ("https://scitools-iris.readthedocs.io/en/stable/", None), } diff --git a/docs/index.rst b/docs/index.rst index e98a5abf..15f18fae 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -3,92 +3,210 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -Iris-grib v0.19 -=============== +Iris-grib v0.20 (unreleased) +============================ The library ``iris-grib`` provides functionality for converting between weather and -climate datasets that are stored as GRIB files and :class:`Iris cubes `. +climate datasets that are stored as GRIB files and Iris :class:`~iris.cube.Cube`\s. GRIB files can be loaded as Iris cubes using ``iris-grib`` so that you can use Iris -for analysing and visualising the contents of the GRIB files. Iris cubes can be saved to -GRIB files using ``iris-grib``. +for analysing and visualising the contents of the GRIB files. Iris cubes can also be +saved to GRIB edition-2 files using ``iris-grib``. + + +Simple GRIB Loading and Saving with Iris +---------------------------------------- +You can use the functionality provided by ``iris-grib`` directly within Iris +without having to explicitly import ``iris-grib``, as long as you have both Iris +and ``iris-grib`` installed in your Python environment. + +**This is the preferred route if no special control is required.** + +.. testsetup:: + + import iris + import iris_grib + import warnings + warnings.simplefilter('ignore') + cube = iris.load_cube(iris.sample_data_path("rotated_pole.nc")) + iris.save(cube, 'testfile.grib', saver='grib2') + +For example, to load GRIB data : + + >>> cube = iris.load_cube('testfile.grib') + +Similarly, you can save cubes to a GRIB file directly from Iris : + + >>> iris.save(cube, 'my_file.grib2') + +.. note:: + As the filename suggests, **only saving to GRIB2 is currently supported**. + + +Phenomenon translation +---------------------- +``iris-grib`` attempts to translate between CF phenomenon identities +(i.e. 'standard_name' and possibly 'long_name' attributes), and GRIB parameter codes, +when converting cubes to or from the GRIB format. + +A set of tables define known CF translations for GRIB1 and GRIB2 parameters, and can be +interrogated with the functions in :mod:`iris_grib.grib_phenom_translation`. + + +Parameter loading record +^^^^^^^^^^^^^^^^^^^^^^^^ +All cubes loaded from GRIB have a ``GRIB_PARAM`` attribute, which records the parameter +encodings present in the original file message. + +Examples : + +* ``"GRIB2:d000c003n005"`` represents GRIB2, discipline=0 ("Meteorological products"), + category=3 ("Mass") and indicatorOfParameter=5 ("Geopotential height (gpm)"). -The contents of ``iris-grib`` represent the former grib loading and saving capabilities -of :mod:`Iris ` itself. These capabilities have been separated into a discrete library -so that Iris becomes less monolithic as a library. + * This translates to a standard_name and units of "geopotential_height / m" +* ``"GRIB1:t002c007n033"`` is GRIB1 with table2Version=2, centre=7 + ("US National Weather Service - NCEP (WMC)"), and indicatorOfParameter=33 + ("U-component of wind m s**-1"). -Loading -------- + * This translates to a standard_name and units of "x_wind / m s-1". -To use ``iris-grib`` to load existing GRIB files we can make use of the -:func:`~iris_grib.load_cubes` function:: +Parameter saving control +^^^^^^^^^^^^^^^^^^^^^^^^ +When a cube has a ``GRIB_PARAM`` attribute, as described above, this controls what the +relevant message keys are set to on saving. +(N.B. at present applies only to GRIB2, since we don't support GRIB1 saving) - >>> import os - >>> import iris_sample_data - >>> import iris_grib - >>> cubes = iris_grib.load_cubes(os.path.join(iris_sample_data.path, - 'polar_stereo.grib2')) - >>> print cubes - + +Iris-grib Load and Save API +--------------------------- +In addition to direct load and save with Iris, as described above, +it is also possible to load and save GRIB data using iris-grib functions. + +Loading and saving Cubes +^^^^^^^^^^^^^^^^^^^^^^^^ +Load +~~~~ +To load from a GRIB file with ``iris-grib``, you can call the +:func:`~iris_grib.load_cubes` function : + + >>> cubes_iter = iris_grib.load_cubes('testfile.grib') + >>> print(cubes_iter) + As we can see, this returns a generator object. The generator object may be iterated over to access all the Iris cubes loaded from the GRIB file, or converted directly to a list:: - >>> cubes = list(cubes) - >>> print cubes + >>> cubes = list(cubes_iter) + >>> print(cubes) [] -.. note:: - There is no functionality in iris-grib that directly replicates - ``iris.load_cube`` (that is, load a single cube directly rather than returning - a length-one `CubeList`. Instead you could use the following, assuming that the - GRIB file you have loaded contains data that can be loaded to a single cube:: +In effect, this is the same as using ``iris.load_raw(...)``. +So, in most cases, **that is preferable.** - >>> cube, = list(cubes) - >>> print cube - air_temperature / (K) (projection_y_coordinate: 200; projection_x_coordinate: 247) - Dimension coordinates: - projection_y_coordinate x - - projection_x_coordinate - x - Scalar coordinates: - forecast_period: 6 hours - forecast_reference_time: 2013-05-20 00:00:00 - pressure: 101500.0 Pa - time: 2013-05-20 06:00:00 +Save +~~~~ +To use ``iris-grib`` to save Iris cubes to a GRIB file we can make use of the +:func:`~iris_grib.save_grib2` function : - This makes use of an idiom known as variable unpacking. + >>> iris_grib.save_grib2(cube, 'my_file.grib2') +In effect, this is the same as using ``iris.save(cube, ...)``. +So, in most cases, **that is preferable.** -Saving ------- -To use ``iris-grib`` to save Iris cubes to a GRIB file we can make use of the -:func:`~iris_grib.save_grib2` function:: +Working with GRIB messages +^^^^^^^^^^^^^^^^^^^^^^^^^^ +Iris-grib also provides lower-level functions which allow the user to inspect and +adjust actual GRIB encoding details, for precise custom control of loading and saving. + +These functions use intermediate objects which represent individual GRIB file +"messages", with all the GRIB metadata. + +For example: - >>> iris_grib.save_grib2(my_cube, 'my_file.grib2') +* correct loading of some messages with incorrectly encoded parameter number +* save messages with adjusted parameter encodings +* load messages with an unsupported parameter definition template : adjust them to + mimic a similar type which *is* supported by cube translation, and post-modify the + resulting cubes to correct the Iris metadata + +You can load and save messages to and from files, and convert them to and from Cubes. .. note:: - As the function name suggests, only saving to GRIB2 is supported. + at present this only works with GRIB2 data. +.. note:: + Messages are not represented in the same way for loading and saving : the messages + generated by loading *from* files are represented by + :class:`iris_grib.message.GribMessage` objects, whereas messages generated from + cubes, for saving *to* files, are represented as message handles from the + `Python eccodes library `_ . -Interconnectivity with Iris ---------------------------- +Load +~~~~ +The key functions are :func:`~iris_grib.load_pairs_from_fields` and +:func:`~iris_grib.message.GribMessage.messages_from_filename`. +See those for more detail. -You can use the functionality provided by ``iris-grib`` directly within Iris -without having to explicitly import ``iris-grib``, as long as you have both Iris -and ``iris-grib`` available to your Python interpreter. +You can load data to 'messages', and filter or modify them to enable or correct +how Iris converts them to 'raw' cubes (i.e. individual 2-dimensional fields). + +For example: + + >>> from iris_grib.message import GribMessage + >>> fields_iter = GribMessage.messages_from_filename('testfile.grib') + >>> # select only wanted data + >>> selected_fields = [ + ... field + ... for field in fields_iter + ... if field.sections[4]['parameterNumber'] == 33 + ... ] + >>> cube_field_pairs = iris_grib.load_pairs_from_fields(selected_fields) -For example:: +Filtering fields can be very useful to speed up loading, since otherwise all data must +be converted to Iris *before* selection with constraints, which can be quite costly. - >>> import iris - >>> import iris_sample_data - >>> cube = iris.load_cube(iris.sample_data_path('polar_stereo.grib2')) -Similarly, you can save your cubes to a GRIB file directly from Iris -using ``iris-grib``:: +Save +~~~~ +The key functions are :func:`~iris_grib.save_pairs_from_cubes` and +:func:`~iris_grib.save_messages`. +See those for more detail. - >>> iris.save(my_cube, 'my_file.grib2') +You can convert Iris cubes to eccodes messages, and modify or filter them before saving. + +.. note:: + The messages here are eccodes message "ids", essentially integers, and *not* + :class:`~iris_grib.message.GribMessages`. Thus, they must be inspected and + manipulated using the eccodes library functions. + +.. testsetup:: + + from iris.coords import DimCoord + import eccodes + cube_height_2m5 = iris.load_cube(iris.sample_data_path("rotated_pole.nc")) + cube_height_2m5.add_aux_coord(DimCoord([2.5], standard_name="height", units="m"), ()) + +For example: + + >>> # translate data to grib2 fields + >>> cube_field_pairs = list(iris_grib.save_pairs_from_cube(cube_height_2m5)) + >>> # adjust some of them + >>> for cube, field in cube_field_pairs: + ... if cube.coords('height') and cube.coord('height').points[0] == 2.5: + ... # we know this will have been rounded, badly, so needs re-scaling. + ... assert eccodes.codes_get_long(field, 'scaleFactorOfFirstFixedSurface') == 0 + ... assert eccodes.codes_get_long(field, 'scaledValueOfFirstFixedSurface') == 2 + ... eccodes.codes_set_long(field, 'scaleFactorOfFirstFixedSurface', 1) + ... eccodes.codes_set_long(field, 'scaledValueOfFirstFixedSurface', 25) + ... + >>> # save to file + >>> messages = [msg for (cube, msg) in cube_field_pairs] + >>> iris_grib.save_messages(messages, 'temp.grib2') + >>> # check result + >>> print(iris.load_cube('temp.grib2').coord('height').points) + [2.5] Getting Started @@ -99,11 +217,17 @@ To ensure all ``iris-grib`` dependencies, it is sufficient to have installed `ecCodes `_ . The simplest way to install is with -`conda `_ , -using the `conda-forge channel `_ , +`conda `_ , using the +`package on conda-forge `_ , +with the command + + $ conda install -c conda-forge iris-grib + +Pip can also be used, to install from the +`package on PyPI `_ , with the command - $ conda install -c conda-forge iris-grib + $ pip install iris-grib Development sources are hosted at ``_ . diff --git a/docs/ref/release_notes.rst b/docs/ref/release_notes.rst index 66eea17a..52d7bda7 100644 --- a/docs/ref/release_notes.rst +++ b/docs/ref/release_notes.rst @@ -16,6 +16,19 @@ Features 4.6, i.e. percentile forecasts. `(PR#401) `_ +* `@pp-mo `_ expanded the use of the "GRIB_PARAM" + attributes to GRIB1 loading, and document it more thoroughly. + `(ISSUE#330) `_, + `(PR#402) `_ + +Documentation +^^^^^^^^^^^^^ +* `@pp-mo `_ reworked the main docs page to : + headline basic load + save with Iris, rather than lower-level functions; + better explain load-pairs and save-pairs usage; make all usage examples into + doctests. + `(ISSUE#398) `_ + Dependencies ^^^^^^^^^^^^ * `@bjlittle `_ migrated to ``pytest``. diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index 7460286a..de2a5e0f 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -304,6 +304,7 @@ def _compute_extra_keys(self): "_x_points": None, "_y_points": None, "_cf_data": None, + "_grib_code": None, } # cf phenomenon translation @@ -317,6 +318,14 @@ def _compute_extra_keys(self): ) self.extra_keys["_cf_data"] = cf_data + # Record the original parameter encoding + self.extra_keys["_grib_code"] = gptx.GRIBCode( + edition=1, + table_version=self.table2Version, + centre_number=centre_number, + number=self.indicatorOfParameter, + ) + # reference date self.extra_keys["_referenceDateTime"] = datetime.datetime( int(self.year), @@ -708,7 +717,7 @@ def _load_generate(filename): def load_cubes(filenames, callback=None): """ - Returns a generator of cubes from the given list of filenames. + Returns an iterator over cubes from the given list of filenames. Args: @@ -721,7 +730,7 @@ def load_cubes(filenames, callback=None): Function which can be passed on to :func:`iris.io.run_callback`. Returns: - A generator containing Iris cubes loaded from the GRIB files. + An iterator returning Iris cubes loaded from the GRIB files. """ import iris.fileformats.rules as iris_rules @@ -809,10 +818,10 @@ def save_grib2(cube, target, append=False): def save_pairs_from_cube(cube): """ - Convert one or more cubes to (2D cube, GRIB message) pairs. - Returns an iterable of tuples each consisting of one 2D cube and - one GRIB message ID, the result of the 2D cube being processed by the GRIB - save rules. + Convert one or more cubes to (2D cube, GRIB-message-id) pairs. + + Produces pairs of 2D cubes and GRIB messages, the result of the 2D cube + being processed by the GRIB save rules. Args: @@ -820,6 +829,10 @@ def save_pairs_from_cube(cube): A :class:`iris.cube.Cube`, :class:`iris.cube.CubeList` or list of cubes. + Returns: + a iterator returning (cube, field) pairs, where each ``cube`` is a 2d + slice of the input and each``field`` is an eccodes message "id". + N.B. the message "id"s are integer handles. """ x_coords = cube.coords(axis="x", dim_coords=True) y_coords = cube.coords(axis="y", dim_coords=True) diff --git a/iris_grib/_grib1_load_rules.py b/iris_grib/_grib1_load_rules.py index 7a3d2c2c..0b670ad9 100644 --- a/iris_grib/_grib1_load_rules.py +++ b/iris_grib/_grib1_load_rules.py @@ -148,13 +148,17 @@ def grib1_convert(grib): long_name = grib._cf_data.standard_name or grib._cf_data.long_name units = grib._cf_data.units - if (grib.table2Version >= 128) and (grib._cf_data is None): - long_name = ( - f"UNKNOWN LOCAL PARAM {grib.indicatorOfParameter}" f".{grib.table2Version}" - ) - units = "???" + # N.B. in addition to the previous cf translated phenomenon info, + # **always** add a GRIB_PARAM attribute to identify the input phenomenon + # identity. + attributes["GRIB_PARAM"] = grib._grib_code - if (grib.table2Version == 1) and (grib.indicatorOfParameter >= 128): + if ( + (grib.table2Version >= 128) + and (grib._cf_data is None) + or (grib.table2Version == 1) + and (grib.indicatorOfParameter >= 128) + ): long_name = ( f"UNKNOWN LOCAL PARAM {grib.indicatorOfParameter}" f".{grib.table2Version}" ) diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index 62f6f317..c4ea31ec 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -1517,7 +1517,7 @@ def translate_phenomenon( # Add a standard attribute recording the grib phenomenon identity. metadata["attributes"]["GRIB_PARAM"] = GRIBCode( - edition_or_string=2, + edition=2, discipline=discipline, category=parameterCategory, number=parameterNumber, diff --git a/iris_grib/grib_phenom_translation.py b/iris_grib/grib_phenom_translation/__init__.py similarity index 81% rename from iris_grib/grib_phenom_translation.py rename to iris_grib/grib_phenom_translation/__init__.py index be56df4d..1fcb5e60 100644 --- a/iris_grib/grib_phenom_translation.py +++ b/iris_grib/grib_phenom_translation/__init__.py @@ -8,6 +8,7 @@ This is done by wrapping '_grib_cf_map.py', which is in a format provided by the metadata translation project. + Currently supports only these ones: * grib1 --> cf @@ -17,14 +18,21 @@ """ from collections import namedtuple -import re import warnings import cf_units -from . import _grib_cf_map as grcf +from iris_grib import _grib_cf_map as grcf +from iris_grib.grib_phenom_translation._gribcode import GRIBCode import iris.std_names +__all__ = [ + "GRIBCode", + "cf_phenom_to_grib2_info", + "grib1_phenom_to_cf_info", + "grib2_phenom_to_cf_info", +] + class _LookupTable(dict): """ @@ -361,74 +369,3 @@ def cf_phenom_to_grib2_info(standard_name, long_name=None): if standard_name is not None: long_name = None return _CF_GRIB2_TABLE[(standard_name, long_name)] - - -class GRIBCode(namedtuple("GRIBCode", "edition discipline category number")): - """ - An object representing a specific Grib phenomenon identity. - - Basically a namedtuple of (edition, discipline, category, number). - - Also provides a string representation, and supports creation from: another - similar object; a tuple of numbers; or any string with 4 separate decimal - numbers in it. - - """ - - __slots__ = () - - def __new__(cls, edition_or_string, discipline=None, category=None, number=None): - args = (edition_or_string, discipline, category, number) - nargs = sum(arg is not None for arg in args) - if nargs == 1: - # Single argument: convert to a string and extract 4 integers. - # NOTE: this also allows input from a GRIBCode, or a plain tuple. - edition_or_string = str(edition_or_string) - edition, discipline, category, number = cls._fournums_from_gribcode_string( - edition_or_string - ) - elif nargs == 4: - edition = edition_or_string - edition, discipline, category, number = [ - int(arg) for arg in (edition, discipline, category, number) - ] - else: - msg = ( - "Cannot create GRIBCode from {} arguments, " - '"GRIBCode{!r}" : ' - "expected either 1 or 4 non-None arguments." - ) - raise ValueError(msg.format(nargs, args)) - - return super(GRIBCode, cls).__new__(cls, edition, discipline, category, number) - - RE_PARSE_FOURNUMS = re.compile(4 * r"[^\d]*(\d*)") - - @classmethod - def _fournums_from_gribcode_string(cls, edcn_string): - parsed_ok = False - nums_match = cls.RE_PARSE_FOURNUMS.match(edcn_string).groups() - if nums_match is not None: - try: - nums = [int(grp) for grp in nums_match] - parsed_ok = True - except ValueError: - pass - - if not parsed_ok: - msg = ( - "Invalid argument for GRIBCode creation, " - '"GRIBCode({!r})" : ' - "requires 4 numbers, separated by non-numerals." - ) - raise ValueError(msg.format(edcn_string)) - - return nums - - PRINT_FORMAT = "GRIB{:1d}:d{:03d}c{:03d}n{:03d}" - - def __str__(self): - result = self.PRINT_FORMAT.format( - self.edition, self.discipline, self.category, self.number - ) - return result diff --git a/iris_grib/grib_phenom_translation/_gribcode.py b/iris_grib/grib_phenom_translation/_gribcode.py new file mode 100644 index 00000000..5dfe5c5d --- /dev/null +++ b/iris_grib/grib_phenom_translation/_gribcode.py @@ -0,0 +1,191 @@ +# Copyright iris-grib contributors +# +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +""" +Provide object to represent grib phenomena + +For use as cube attributes, freely convertible to+from strings +""" + +from __future__ import annotations +from dataclasses import dataclass +import re + + +def _invalid_edition(edition): + msg = f"Invalid grib edition, {edition!r}, for GRIBcode : " "can only be 1 or 2." + raise ValueError(msg) + + +def _invalid_nargs(args): + nargs = len(args) + msg = ( + f"Cannot create GRIBCode from {nargs} arguments, " + f"GRIBCode({args!r}) : expects either 1 or 4 arguments." + ) + raise ValueError(msg) + + +# Regexp to extract four integers from a string: +# - for four times ... +# - match any non-digits (including none) and discard +# - then match any digits (including none), and return as a "group" +_RE_PARSE_FOURNUMS = re.compile(4 * r"[^\d]*(\d*)") + + +def _fournums_from_gribcode_string(grib_param_string): + parsed_ok = True + # get the numbers.. + match_groups = _RE_PARSE_FOURNUMS.match(grib_param_string).groups() + # N.B. always produces 4 "strings of digits", but some can be empty + try: + nums = [int(grp) for grp in match_groups] + except ValueError: + parsed_ok = False + + if not parsed_ok: + msg = ( + "Invalid argument for GRIBCode creation, " + '"GRIBCode({!r})" : ' + "requires 4 numbers, separated by non-numerals." + ) + raise ValueError(msg.format(grib_param_string)) + + return nums + + +def GRIBCode(edition, *args, **kwargs): + """ + Make an object representing a specific Grib phenomenon identity. + + The class of the result, and the list of its properties, depend on whether + 'edition' is 1 or 2. + + One of : + + * GRIBCode(edition=1, table_version, centre_number, number) + * GRIBCode(edition=2, discipline, category, number) + + Either provides a string representation, and supports creation from: + keywords, another similar object; a tuple of numbers; or any string with 4 + separate decimal numbers in it. + """ + if edition is None: + _invalid_nargs(()) + + # Convert single argument to *args + if not args and not kwargs: + # Convert to a string and extract 4 integers. + # NOTE: this also allows input from a GRIBCode, or a plain tuple. + edition_string = str(edition) + edition, arg2, arg3, arg4 = _fournums_from_gribcode_string(edition_string) + args = [arg2, arg3, arg4] + + # Check edition + select the relevant keywords for the edition + if edition not in (1, 2): + _invalid_edition(edition) + + # Choose which actual type we will return. This also determines the + # argument (keyword) names. + instance_cls = {1: GRIBCode1, 2: GRIBCode2}[edition] + + # Convert all of (edition, *args) into **kwargs + if not args: + # Ignore that edition= is a required arg -- make it a kwarg + kwargs["edition"] = edition + else: + # Include edition, which just makes it simpler + args = tuple([edition] + list(args)) + nargs = len(args) + if nargs != 4: + _invalid_nargs(args) + + for i_arg, (arg, name) in enumerate(zip(args, instance_cls.argnames)): + if name in kwargs: + msg = ( + f"Keyword {name!r}={kwargs[name]!r} " + f"is not compatible with a {i_arg + 1}th argument." + ) + raise ValueError(msg) + else: + kwargs[name] = arg + + result = instance_cls(**kwargs) + return result + + +@dataclass +class GenericConcreteGRIBCode: + """ + Common behaviour for GRIBCode1 and GRIBCode2 + + GRIBCode1 and GRIBCode2 inherit this, making both dataclasses. + They contain different data properties. + """ + + def __init__(self, **kwargs): + # Note : only support creation with kargs. In GRIBCode(), any args + # get translated into kwargs + # Check against "_edition", defined by the specific subclass. + assert kwargs["edition"] == self._edition + for key, value in kwargs.items(): + setattr(self, key, value) + + def _broken_repr(self): + result = ( + f"<{self.__class__.__name__} with invalid content: " f"{self.__dict__}>" + ) + return result + + def __str__(self): + edition = self.edition + try: + # NB fallback to "invalid" if edition not one of (1, 2) + format = { + 1: "GRIB{:1d}:t{:03d}c{:03d}n{:03d}", + 2: "GRIB{:1d}:d{:03d}c{:03d}n{:03d}", + }[edition] + arg_values = [getattr(self, argname) for argname in self.argnames] + # NB fallback to "invalid" if format fails + result = format.format(*arg_values) + except Exception: + # Invalid content somewhere : fall back on default repr + result = self._broken_repr() + + return result + + def __repr__(self): + edition = self.edition + try: + assert edition in (1, 2) + key_value_strings = [] + for argname in self.argnames: + value = getattr(self, argname, None) + assert isinstance(value, int) + key_value_strings.append(f"{argname}={value}") + inner_text = ", ".join(key_value_strings) + result = f"GRIBCode({inner_text})" + except Exception: + # Invalid content somewhere : fall back on a default repr + result = self._broken_repr() + + return result + + +class GRIBCode1(GenericConcreteGRIBCode): + edition: int = 1 + table_version: int | None = None + centre_number: int | None = None + number: int | None = None + argnames = ["edition", "table_version", "centre_number", "number"] + _edition = 1 # Constructor argument should always match this + + +class GRIBCode2(GenericConcreteGRIBCode): + edition: int = 2 + discipline: int | None = None + category: int | None = None + number: int | None = None + argnames = ["edition", "discipline", "category", "number"] + _edition = 2 # Constructor argument should always match this diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_grib1.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_grib1.cml index e323b841..3ee70285 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_grib1.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_grib1.cml @@ -1,6 +1,9 @@ + + + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib1.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib1.cml index 32b73ff7..7c0b4d05 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib1.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib1.cml @@ -1,6 +1,9 @@ + + + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/polar_stereo_grib1.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/polar_stereo_grib1.cml index c590e237..c1c845ae 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/polar_stereo_grib1.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/polar_stereo_grib1.cml @@ -1,6 +1,9 @@ + + + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_ll_grib1.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_ll_grib1.cml index 095e9d2f..65c5483f 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_ll_grib1.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_ll_grib1.cml @@ -1,6 +1,9 @@ + + + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/regular_gg_grib1.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/regular_gg_grib1.cml index 8b811c4f..0fab6aa5 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/regular_gg_grib1.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/regular_gg_grib1.cml @@ -1,6 +1,9 @@ + + + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/rotated.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/rotated.cml index abb27107..f464429a 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/rotated.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/rotated.cml @@ -1,6 +1,9 @@ + + + diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_bound_grib1.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_bound_grib1.cml index 023f0f62..977fe028 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_bound_grib1.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_bound_grib1.cml @@ -1,6 +1,9 @@ + + + diff --git a/iris_grib/tests/unit/grib1_load_rules/test_grib1_load_translations.py b/iris_grib/tests/unit/grib1_load_rules/test_grib1_load_translations.py index 33ebc575..caf876ee 100644 --- a/iris_grib/tests/unit/grib1_load_rules/test_grib1_load_translations.py +++ b/iris_grib/tests/unit/grib1_load_rules/test_grib1_load_translations.py @@ -121,7 +121,7 @@ def _init_minimal_message(self, edition=1): "Nj": 1, "numberOfValues": 1, "alternativeRowScanning": 0, - "centre": "ecmf", + "centre": 74, # the UKMO centre id "year": 2007, "month": 3, "day": 23, diff --git a/iris_grib/tests/unit/grib_phenom_translation/test_grib_phenom_translation.py b/iris_grib/tests/unit/grib_phenom_translation/test_grib_phenom_translation.py index 00440a6d..d16c7f7a 100644 --- a/iris_grib/tests/unit/grib_phenom_translation/test_grib_phenom_translation.py +++ b/iris_grib/tests/unit/grib_phenom_translation/test_grib_phenom_translation.py @@ -23,17 +23,17 @@ class TestGribLookupTableType(tests.IrisTest): def test_lookuptable_type(self): ll = gptx._LookupTable([("a", 1), ("b", 2)]) - assert ll["a"] == 1 - assert ll["q"] is None + self.assertEqual(1, ll["a"]) + self.assertIsNone(ll["q"]) ll["q"] = 15 - assert ll["q"] == 15 + self.assertEqual(15, ll["q"]) ll["q"] = 15 - assert ll["q"] == 15 + self.assertEqual(15, ll["q"]) with self.assertRaises(KeyError): ll["q"] = 7 del ll["q"] ll["q"] = 7 - assert ll["q"] == 7 + self.assertEqual(7, ll["q"]) class TestGribPhenomenonLookup(tests.IrisTest): @@ -162,91 +162,166 @@ def check_cf_grib2( class TestGRIBcode(tests.IrisTest): # GRIBCode is basically a namedtuple, so not all behaviour needs testing. # However, creation is a bit special so exercise all those cases. - def test_create_from_keys(self): - gribcode = GRIBCode(edition_or_string=5, discipline=7, category=4, number=199) - self.assertEqual(gribcode.edition, 5) + + # TODO: convert to pytest + replace duplications with parameterisation + # (mostly grib1/grib2, but also in one case str/repr) + def test_create_from_keys__grib2(self): + gribcode = GRIBCode(edition=2, discipline=7, category=4, number=199) + self.assertEqual(gribcode.edition, 2) self.assertEqual(gribcode.discipline, 7) self.assertEqual(gribcode.category, 4) self.assertEqual(gribcode.number, 199) - def test_create_from_args(self): - gribcode = GRIBCode(7, 3, 12, 99) - self.assertEqual(gribcode.edition, 7) + def test_create_from_keys__grib1(self): + gribcode = GRIBCode(edition=1, table_version=7, centre_number=4, number=199) + self.assertEqual(gribcode.edition, 1) + self.assertEqual(gribcode.table_version, 7) + self.assertEqual(gribcode.centre_number, 4) + self.assertEqual(gribcode.number, 199) + + def test_create_from_args__grib2(self): + gribcode = GRIBCode(2, 3, 12, 99) + self.assertEqual(gribcode.edition, 2) self.assertEqual(gribcode.discipline, 3) self.assertEqual(gribcode.category, 12) self.assertEqual(gribcode.number, 99) - def test_create_is_copy(self): - gribcode1 = GRIBCode(7, 3, 12, 99) - gribcode2 = GRIBCode(7, 3, 12, 99) + def test_create_from_args__grib1(self): + gribcode = GRIBCode(1, 3, 12, 99) + self.assertEqual(gribcode.edition, 1) + self.assertEqual(gribcode.table_version, 3) + self.assertEqual(gribcode.centre_number, 12) + self.assertEqual(gribcode.number, 99) + + def check_create_is_copy(self, edition): + gribcode1 = GRIBCode(edition, 3, 12, 99) + gribcode2 = GRIBCode(edition, 3, 12, 99) self.assertEqual(gribcode1, gribcode2) self.assertIsNot(gribcode1, gribcode2) - def test_create_from_gribcode(self): - gribcode1 = GRIBCode((4, 3, 2, 1)) + def test_create_is_copy__grib1(self): + self.check_create_is_copy(edition=1) + + def test_create_is_copy__grib2(self): + self.check_create_is_copy(edition=2) + + def check_create_from_gribcode(self, edition): + gribcode1 = GRIBCode((edition, 3, 2, 1)) gribcode2 = GRIBCode(gribcode1) self.assertEqual(gribcode1, gribcode2) # NOTE: *not* passthrough : it creates a copy # (though maybe not too significant, as it is immutable anyway?) self.assertIsNot(gribcode1, gribcode2) - def test_create_from_string(self): - gribcode = GRIBCode("xxx12xs-34 -5,678qqqq") + def test_create_from_gribcode__grib1(self): + self.check_create_from_gribcode(edition=1) + + def test_create_from_gribcode__grib2(self): + self.check_create_from_gribcode(edition=2) + + def check_create_from_string(self, edition): + gribcode = GRIBCode(f"xxx{edition}xs-34 -5,678qqqq") # NOTE: args 2 and 3 are *not* negative. - self.assertEqual(gribcode, GRIBCode(12, 34, 5, 678)) + self.assertEqual(gribcode, GRIBCode(edition, 34, 5, 678)) + + def test_create_from_string__grib1(self): + self.check_create_from_string(edition=1) - def test_create_from_own_string(self): + def test_create_from_string__grib2(self): + self.check_create_from_string(edition=2) + + def check_create_from_own_string(self, string_function, edition): # Check that GRIBCode string reprs are valid as create arguments. - gribcode = GRIBCode(edition_or_string=2, discipline=17, category=94, number=231) - grib_param_string = str(gribcode) + gribcode = GRIBCode(edition, 17, 94, 231) + grib_param_string = string_function(gribcode) newcode = GRIBCode(grib_param_string) self.assertEqual(newcode, gribcode) - def test_create_from_tuple(self): - gribcode = GRIBCode((4, 3, 2, 1)) - self.assertEqual(gribcode, GRIBCode(4, 3, 2, 1)) + def test_create_from_own_string__str__grib1(self): + self.check_create_from_own_string(str, edition=1) + + def test_create_from_own_string__str__grib2(self): + self.check_create_from_own_string(str, edition=2) + + def test_create_from_own_string__repr__grib1(self): + self.check_create_from_own_string(repr, edition=1) + + def test_create_from_own_string__repr__grib2(self): + self.check_create_from_own_string(repr, edition=2) + + def check_create_from_tuple(self, edition): + gribcode = GRIBCode((edition, 3, 2, 1)) + expected = GRIBCode(edition, 3, 2, 1) + self.assertEqual(expected, gribcode) + + def test_create_from_tuple__grib1(self): + self.check_create_from_tuple(edition=1) + + def test_create_from_tuple__grib2(self): + self.check_create_from_tuple(edition=2) def test_create_bad_nargs(self): # Between 1 and 4 args is not invalid call syntax, but it should fail. - with self.assertRaisesRegex( - ValueError, "Cannot create GRIBCode from 2 arguments" - ): + msg = ( + "Cannot create.* from 2 arguments.*" + r"GRIBCode\(\(1, 2\)\).*" + "expects either 1 or 4 arguments" + ) + with self.assertRaisesRegex(ValueError, msg): GRIBCode(1, 2) def test_create_bad_single_arg_None(self): - with self.assertRaisesRegex( - ValueError, "Cannot create GRIBCode from 0 arguments" - ): + msg = ( + "Cannot create GRIBCode from 0 arguments.*" + r"GRIBCode\(\(\)\).*" + "expects either 1 or 4 arguments" + ) + with self.assertRaisesRegex(ValueError, msg): GRIBCode(None) def test_create_bad_single_arg_empty_string(self): - with self.assertRaisesRegex( - ValueError, "Invalid argument for GRIBCode creation" - ): + msg = ( + "Invalid argument for GRIBCode creation.*" + r"GRIBCode\(''\).*" + "requires 4 numbers, separated by non-numerals" + ) + with self.assertRaisesRegex(ValueError, msg): GRIBCode("") def test_create_bad_single_arg_nonums(self): - with self.assertRaisesRegex( - ValueError, "Invalid argument for GRIBCode creation" - ): + msg = ( + "Invalid argument for GRIBCode creation.*" + r"GRIBCode\('saas- dsa- '\).*" + "requires 4 numbers, separated by non-numerals" + ) + with self.assertRaisesRegex(ValueError, msg): GRIBCode("saas- dsa- ") def test_create_bad_single_arg_less_than_4_nums(self): - with self.assertRaisesRegex( - ValueError, "Invalid argument for GRIBCode creation" - ): + msg = ( + "Invalid argument for GRIBCode creation.*" + r"GRIBCode\('1,2,3'\).*" + "requires 4 numbers, separated by non-numerals" + ) + with self.assertRaisesRegex(ValueError, msg): GRIBCode("1,2,3") def test_create_bad_single_arg_number(self): - with self.assertRaisesRegex( - ValueError, "Invalid argument for GRIBCode creation" - ): + msg = ( + "Invalid argument for GRIBCode creation.*" + r"GRIBCode\('4'\).*" + "requires 4 numbers, separated by non-numerals" + ) + with self.assertRaisesRegex(ValueError, msg): GRIBCode(4) def test_create_bad_single_arg_single_numeric(self): - with self.assertRaisesRegex( - ValueError, "Invalid argument for GRIBCode creation" - ): + msg = ( + "Invalid argument for GRIBCode creation.*" + r"GRIBCode\('44'\).*" + "requires 4 numbers, separated by non-numerals" + ) + with self.assertRaisesRegex(ValueError, msg): GRIBCode("44") def test_create_string_more_than_4_nums(self): @@ -254,9 +329,78 @@ def test_create_string_more_than_4_nums(self): gribcode = GRIBCode("1,2,3,4,5,6,7,8") self.assertEqual(gribcode, GRIBCode(1, 2, 3, 4)) - def test__str__(self): - result = str(GRIBCode(2, 17, 3, 123)) - self.assertEqual(result, "GRIB2:d017c003n123") + def check__str__(self, edition): + result = str(GRIBCode(edition, 17, 3, 123)) + arg1_char = {1: "t", 2: "d"}[edition] + expected = f"GRIB{edition}:{arg1_char}017c003n123" + self.assertEqual(expected, result) + + def test__str__grib1(self): + self.check__str__(edition=1) + + def test__str__grib2(self): + self.check__str__(edition=2) + + def check__repr__(self, edition): + result = repr(GRIBCode(edition, 17, 3, 123)) + if edition == 1: + expected = ( + "GRIBCode(edition=1, table_version=17, " "centre_number=3, number=123)" + ) + elif edition == 2: + expected = "GRIBCode(edition=2, discipline=17, " "category=3, number=123)" + self.assertEqual(result, expected) + + def test__repr__grib1(self): + self.check__repr__(edition=1) + + def test__repr__grib2(self): + self.check__repr__(edition=2) + + def test_bad_content__str_repr__badedition(self): + gribcode = GRIBCode(2, 11, 12, 13) + gribcode.edition = 77 + str_result = str(gribcode) + expected = ( + "" + ) + self.assertEqual(expected, str_result) + repr_result = repr(gribcode) + self.assertEqual(str_result, repr_result) + + def test_bad_content__str_repr__badmembervalue(self): + gribcode = GRIBCode(2, 11, 12, 13) + gribcode.discipline = None + str_result = str(gribcode) + expected = ( + "" + ) + self.assertEqual(expected, str_result) + repr_result = repr(gribcode) + self.assertEqual(str_result, repr_result) + + def test_bad_content__str_repr__missingmember(self): + gribcode = GRIBCode(2, 11, 12, 13) + del gribcode.category + str_result = str(gribcode) + expected = ( + "" + ) + self.assertEqual(expected, str_result) + repr_result = repr(gribcode) + self.assertEqual(str_result, repr_result) + + def test_bad_create__invalid_edition(self): + with self.assertRaisesRegex(ValueError, "Invalid grib edition"): + GRIBCode(77, 1, 2, 3) + + def test_bad_create__arg_and_kwarg(self): + msg = "Keyword 'number'=7 is not compatible with a 4th argument." + with self.assertRaisesRegex(ValueError, msg): + GRIBCode(1, 2, 3, 4, number=7) if __name__ == "__main__": From 0870a9a11836bfb3d14a274fec9306188d796840 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Apr 2024 08:56:05 +0100 Subject: [PATCH 284/583] Bump scitools/workflows in the dependencies group (#445) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2024.02.1 to 2024.04.2 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2024.02.1...2024.04.2) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index a532bec0..2c9e2467 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.02.1 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.04.2 diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index f30786a8..7f356b4d 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.04.1 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.04.2 secrets: inherit From a9d45b11a3589b6382568d9633670e646318a665 Mon Sep 17 00:00:00 2001 From: Elias <110238618+ESadek-MO@users.noreply.github.com> Date: Fri, 19 Apr 2024 12:20:32 +0100 Subject: [PATCH 285/583] Added in linkchecks and coverage checks for gha ci (#432) * updated ci-tests * added linkcheck exceptions * fixed line lengths * comments too? * this is ridiculous * fixed two links in index.rst * missed a rebase spot * missed a typo * readded two links * fixed some broken links * fixed some broken links * fixed some broken links * fixed some broken links * fixed some broken links * fixed some broken links --------- Co-authored-by: stephenworsley <49274989+stephenworsley@users.noreply.github.com> --- .github/workflows/ci-tests.yml | 7 ++++++- docs/conf.py | 8 ++++++++ docs/index.rst | 4 ++-- docs/ref/release_notes.rst | 17 +++++++++-------- iris_grib/__init__.py | 2 +- 5 files changed, 26 insertions(+), 12 deletions(-) diff --git a/.github/workflows/ci-tests.yml b/.github/workflows/ci-tests.yml index 638683a8..d266bb1a 100644 --- a/.github/workflows/ci-tests.yml +++ b/.github/workflows/ci-tests.yml @@ -36,13 +36,14 @@ jobs: matrix: os: ["ubuntu-latest"] python-version: ["3.11"] - session: ["doctest"] + session: ["doctest", "linkcheck"] iris-source : ["conda-forge"] include: - os: "ubuntu-latest" python-version: "3.11" session: "tests" iris-source: "conda-forge" + coverage: "--coverage" - os: "ubuntu-latest" python-version: "3.11" session: "tests" @@ -129,3 +130,7 @@ jobs: PY_VER: ${{ matrix.python-version }} run: | nox --session ${{ matrix.session }} -- --test-data-dir ${HOME}/iris-test-data/test_data + + - name: "Upload coverage report" + uses: codecov/codecov-action@v4 + if: ${{ matrix.coverage }} \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py index 6e27a766..d70991db 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -105,6 +105,14 @@ # If true, `todo` and `todoList` produce output, else they produce nothing. todo_include_todos = False +# url link checker. Some links registering as faulty, despite being functional. +# See https://www.sphinx-doc.org/en/1.2/config.html[...] +# [...]#options-for-the-linkcheck-builder + +linkcheck_ignore = [ + "https://github.com/Scitools/iris-grib/compare" + "/c4243ae..5c314e3#diff-cf46b46880cae59e82a91c7ab6bb81ba" +] # -- Autodoc ------------------------------------------------------------------ diff --git a/docs/index.rst b/docs/index.rst index 15f18fae..d021c57d 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -214,7 +214,7 @@ Getting Started To ensure all ``iris-grib`` dependencies, it is sufficient to have installed :mod:`Iris ` itself, and -`ecCodes `_ . +`ecCodes `_ . The simplest way to install is with `conda `_ , using the @@ -234,7 +234,7 @@ Development sources are hosted at ``_ . Releases ======== -For recent changes, see `Release Notes `_ . +For recent changes, see :ref:`release_notes` . Indices and tables diff --git a/docs/ref/release_notes.rst b/docs/ref/release_notes.rst index 52d7bda7..cd93f5e4 100644 --- a/docs/ref/release_notes.rst +++ b/docs/ref/release_notes.rst @@ -1,3 +1,5 @@ +.. _release_notes: + Release Notes ============= @@ -128,7 +130,7 @@ Bugs Fixed iris-grib to work with the latest versions of `iris `_, `cf-units `_, - `ecCodes `_ and + `ecCodes `_ and `cartopy `_, including casting the usage of :meth:`cf_units.Unit.date2num` as float. setting and setting the values of some missing keys using ``gribapi.GRIB_MISSING_LONG``. @@ -247,15 +249,15 @@ Bugs Fixed * `@pp-mo `_ fixed loading of grid definition template 3.90, "Space view perspective or orthographic grid", which was **broken since Iris 2.3**. This now produces data with an iris - `Geostationary `_ + `Geostationary `_ coordinate system. Prior to Iris 2.3, what is now the Iris 'Geostationary' class was (incorrectly) named "VerticalPerspective" : When that was `corrected in Iris 2.3 `_ , it broke the iris-grib loading, since the data was now incorrectly assigned the "new-style" Iris - `VerticalPerspective `_ + `VerticalPerspective `_ coordinate system, equivalent to the Cartopy - `NearsidePerspective `_ + `NearsidePerspective `_ and Proj `"nsper" `_ . The plotting behaviour of this is now **the same again as before Iris 2.3** : @@ -264,7 +266,7 @@ Bugs Fixed * `@pp-mo `_ fixed a problem where cubes were loading from GRIB 1 with a changed coordinate system, since eccodes versions >= 1.19. This resulted from a change to eccodes, which now returns a different - 'shapeOfTheEarth' parameter : see `eccodes issue ECC-811 `_ . This resulted + 'shapeOfTheEarth' parameter. This resulted in a coordinate system with a different earth radius. For backwards compatibilty, the earth radius has now been fixed to the same value as previously. However, pending further investigation, this value may be technically incorrect and we may @@ -293,8 +295,7 @@ Bugs Fixed * `@pp-mo `_ fixed a problem that caused very slow loading, and possible memory overflows, with Dask versions >= 2.0. **This requires Iris >= 2.4**, as a new minimum dependency. - ( This problem was shared with UM file access in Iris : see - https://scitools.org.uk/iris/docs/v2.4.0/whatsnew/2.4.html#bugs-fixed ). + ( This problem was shared with UM file access in Iris, fixed in Iris 2.4. `(PR#190) `_ * `@trexfeathers `_ fixed all the tests to @@ -451,7 +452,7 @@ What's new in iris-grib v0.12 :Date: 25 Oct 2017 Updated to work with -`ecCodes `_ as its +`ecCodes `_ as its interface to GRIB files. This is ECMWF's replacement for the older GRIB-API, which is now deprecated. diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index de2a5e0f..6b7ca90a 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -5,7 +5,7 @@ """ Conversion of cubes to/from GRIB. -See: `ECMWF GRIB API `_. +See: `ECMWF GRIB API `_. """ From 7eacda5533238d9f17293da74af38bdc7cd56b42 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Fri, 19 Apr 2024 13:01:36 +0100 Subject: [PATCH 286/583] Remove obsolete workarounds. (#410) * Remove obsolete workarounds. * Remove dead tests. * Remove more dead tests. * Remove now-unused workaround routines. * Review changes. * Review change: remove another obsolete comment --------- Co-authored-by: stephenworsley <49274989+stephenworsley@users.noreply.github.com> --- iris_grib/_load_convert.py | 49 ++---------- iris_grib/_save_rules.py | 78 +------------------ .../test_fixup_float32_from_int32.py | 32 -------- .../test_fixup_int32_from_uint32.py | 42 ---------- .../test_grid_definition_template_12.py | 11 --- .../save_rules/test_fixup_float32_as_int32.py | 48 ------------ .../save_rules/test_fixup_int32_as_uint32.py | 40 ---------- .../test_grid_definition_template_12.py | 38 +-------- 8 files changed, 10 insertions(+), 328 deletions(-) delete mode 100644 iris_grib/tests/unit/load_convert/test_fixup_float32_from_int32.py delete mode 100644 iris_grib/tests/unit/load_convert/test_fixup_int32_from_uint32.py delete mode 100644 iris_grib/tests/unit/save_rules/test_fixup_float32_as_int32.py delete mode 100644 iris_grib/tests/unit/save_rules/test_fixup_int32_as_uint32.py diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index c4ea31ec..7acdfd94 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -225,40 +225,6 @@ def _hindcast_fix(forecast_time): return forecast_time -def fixup_float32_from_int32(value): - """ - Workaround for use when reading an IEEE 32-bit floating-point value - which the ECMWF GRIB API has erroneously treated as a 4-byte signed - integer. - - """ - # Convert from two's complement to sign-and-magnitude. - # NB. The bit patterns 0x00000000 and 0x80000000 will both be - # returned by the ECMWF GRIB API as an integer 0. Because they - # correspond to positive and negative zero respectively it is safe - # to treat an integer 0 as a positive zero. - if value < 0: - value = 0x80000000 - value - value_as_uint32 = np.array(value, dtype="u4") - value_as_float32 = value_as_uint32.view(dtype="f4") - return float(value_as_float32) - - -def fixup_int32_from_uint32(value): - """ - Workaround for use when reading a signed, 4-byte integer which the - ECMWF GRIB API has erroneously treated as an unsigned, 4-byte - integer. - - NB. This workaround is safe to use with values which are already - treated as signed, 4-byte integers. - - """ - if value >= 0x80000000: - value = 0x80000000 - value - return value - - ############################################################################### # # Identification Section 1 @@ -846,21 +812,16 @@ def grid_definition_template_12(section, metadata): lat = section["latitudeOfReferencePoint"] * _GRID_ACCURACY_IN_DEGREES lon = section["longitudeOfReferencePoint"] * _GRID_ACCURACY_IN_DEGREES scale = section["scaleFactorAtReferencePoint"] - # Catch bug in ECMWF GRIB API (present at 1.12.1) where the scale - # is treated as a signed, 4-byte integer. - if isinstance(scale, int): - scale = fixup_float32_from_int32(scale) CM_TO_M = 0.01 easting = section["XR"] * CM_TO_M northing = section["YR"] * CM_TO_M cs = icoord_systems.TransverseMercator(lat, lon, easting, northing, scale, geog_cs) - # Deal with bug in ECMWF GRIB API (present at 1.12.1) where these - # values are treated as unsigned, 4-byte integers. - x1 = fixup_int32_from_uint32(section["X1"]) - y1 = fixup_int32_from_uint32(section["Y1"]) - x2 = fixup_int32_from_uint32(section["X2"]) - y2 = fixup_int32_from_uint32(section["Y2"]) + # Fetch grid extents + x1 = section["X1"] + y1 = section["Y1"] + x2 = section["X2"] + y2 = section["Y2"] # Rather unhelpfully this grid definition template seems to be # overspecified, and thus open to inconsistency. But for determining diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index a47bd453..612cd9d7 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -48,65 +48,6 @@ _TIME_RANGE_UNITS_INVERTED = {val: key for key, val in _TIME_RANGE_UNITS.items()} -def fixup_float32_as_int32(value): - """ - Workaround for use when the ECMWF GRIB API treats an IEEE 32-bit - floating-point value as a signed, 4-byte integer. - - Returns the integer value which will result in the on-disk - representation corresponding to the IEEE 32-bit floating-point - value. - - """ - value_as_float32 = np.array(value, dtype="f4") - value_as_uint32 = value_as_float32.view(dtype="u4") - if value_as_uint32 >= 0x80000000: - # Convert from two's-complement to sign-and-magnitude. - # NB. Because of the silly representation of negative - # integers in GRIB2, there is no value we can pass to - # codes_set that will result in the bit pattern 0x80000000. - # But since that bit pattern corresponds to a floating - # point value of negative-zero, we can safely treat it as - # positive-zero instead. - value_as_grib_int = 0x80000000 - int(value_as_uint32) - else: - value_as_grib_int = int(value_as_uint32) - return value_as_grib_int - - -def fixup_int32_as_uint32(value): - """ - Workaround for use when the ECMWF GRIB API treats a signed, 4-byte - integer value as an unsigned, 4-byte integer. - - Returns the unsigned integer value which will result in the on-disk - representation corresponding to the signed, 4-byte integer value. - - """ - value = int(value) - if -0x7FFFFFFF <= value <= 0x7FFFFFFF: - if value < 0: - # Convert from two's-complement to sign-and-magnitude. - value = 0x80000000 - value - else: - msg = "{} out of range -2147483647 to 2147483647.".format(value) - raise ValueError(msg) - return value - - -def ensure_set_int32_value(grib, key, value): - """ - Ensure the workaround function :func:`fixup_int32_as_uint32` is applied as - necessary to problem keys. - - """ - try: - eccodes.codes_set(grib, key, value) - except eccodes.CodesInternalError: - value = fixup_int32_as_uint32(value) - eccodes.codes_set(grib, key, value) - - ############################################################################### # # Constants @@ -574,14 +515,10 @@ def grid_definition_template_12(cube, grib): eccodes.codes_set(grib, "Di", abs(x_step)) eccodes.codes_set(grib, "Dj", abs(y_step)) horizontal_grid_common(cube, grib) - - # GRIBAPI expects unsigned ints in X1, X2, Y1, Y2 but it should accept - # signed ints, so work around this. - # See https://software.ecmwf.int/issues/browse/SUP-1101 - ensure_set_int32_value(grib, "Y1", int(y_cm[0])) - ensure_set_int32_value(grib, "Y2", int(y_cm[-1])) - ensure_set_int32_value(grib, "X1", int(x_cm[0])) - ensure_set_int32_value(grib, "X2", int(x_cm[-1])) + eccodes.codes_set(grib, "Y1", int(y_cm[0])) + eccodes.codes_set(grib, "Y2", int(y_cm[-1])) + eccodes.codes_set(grib, "X1", int(x_cm[0])) + eccodes.codes_set(grib, "X2", int(x_cm[-1])) # Lat and lon of reference point are measured in millionths of a degree. eccodes.codes_set( @@ -603,14 +540,7 @@ def m_to_cm(value): # False easting and false northing are measured in units of (10^-2)m. eccodes.codes_set(grib, "XR", m_to_cm(cs.false_easting)) eccodes.codes_set(grib, "YR", m_to_cm(cs.false_northing)) - - # GRIBAPI expects a signed int for scaleFactorAtReferencePoint - # but it should accept a float, so work around this. - # See https://software.ecmwf.int/issues/browse/SUP-1100 value = cs.scale_factor_at_central_meridian - key_type = eccodes.codes_get_native_type(grib, "scaleFactorAtReferencePoint") - if key_type is not float: - value = fixup_float32_as_int32(value) eccodes.codes_set(grib, "scaleFactorAtReferencePoint", value) diff --git a/iris_grib/tests/unit/load_convert/test_fixup_float32_from_int32.py b/iris_grib/tests/unit/load_convert/test_fixup_float32_from_int32.py deleted file mode 100644 index e5d187b0..00000000 --- a/iris_grib/tests/unit/load_convert/test_fixup_float32_from_int32.py +++ /dev/null @@ -1,32 +0,0 @@ -# Copyright iris-grib contributors -# -# This file is part of iris-grib and is released under the BSD license. -# See LICENSE in the root of the repository for full licensing details. -""" -Unit tests for `iris_grib._load_convert.fixup_float32_from_int32`. - -""" - -# Import iris_grib.tests first so that some things can be initialised before -# importing anything else. -import iris_grib.tests as tests - -from iris_grib._load_convert import fixup_float32_from_int32 - - -class Test(tests.IrisGribTest): - def test_negative(self): - result = fixup_float32_from_int32(-0x3F000000) - self.assertEqual(result, -0.5) - - def test_zero(self): - result = fixup_float32_from_int32(0) - self.assertEqual(result, 0) - - def test_positive(self): - result = fixup_float32_from_int32(0x3F000000) - self.assertEqual(result, 0.5) - - -if __name__ == "__main__": - tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_fixup_int32_from_uint32.py b/iris_grib/tests/unit/load_convert/test_fixup_int32_from_uint32.py deleted file mode 100644 index b4c3f8f0..00000000 --- a/iris_grib/tests/unit/load_convert/test_fixup_int32_from_uint32.py +++ /dev/null @@ -1,42 +0,0 @@ -# Copyright iris-grib contributors -# -# This file is part of iris-grib and is released under the BSD license. -# See LICENSE in the root of the repository for full licensing details. -""" -Unit tests for `iris_grib._load_convert.fixup_int32_from_uint32`. - -""" - -# Import iris_grib.tests first so that some things can be initialised before -# importing anything else. -import iris_grib.tests as tests - -from iris_grib._load_convert import fixup_int32_from_uint32 - - -class Test(tests.IrisGribTest): - def test_negative(self): - result = fixup_int32_from_uint32(0x80000005) - self.assertEqual(result, -5) - - def test_negative_zero(self): - result = fixup_int32_from_uint32(0x80000000) - self.assertEqual(result, 0) - - def test_zero(self): - result = fixup_int32_from_uint32(0) - self.assertEqual(result, 0) - - def test_positive(self): - result = fixup_int32_from_uint32(200000) - self.assertEqual(result, 200000) - - def test_already_negative(self): - # If we *already* have a negative value the fixup routine should - # leave it alone. - result = fixup_int32_from_uint32(-7) - self.assertEqual(result, -7) - - -if __name__ == "__main__": - tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_12.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_12.py index 09d46a64..02485d14 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_12.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_12.py @@ -184,17 +184,6 @@ def test_incompatible_grid_extent(self): with self.assertRaisesRegex(iris.exceptions.TranslationError, "grid"): grid_definition_template_12(section, metadata) - def test_scale_workaround(self): - section = self.section_3() - section["scaleFactorAtReferencePoint"] = 1065346526 - metadata = empty_metadata() - grid_definition_template_12(section, metadata) - expected = self.expected(0, 1) - # A float32 can't hold exactly the same value. - cs = expected["dim_coords_and_dims"][0][0].coord_system - cs.scale_factor_at_central_meridian = 0.9996012449264526 - self.assertEqual(metadata, expected) - if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/unit/save_rules/test_fixup_float32_as_int32.py b/iris_grib/tests/unit/save_rules/test_fixup_float32_as_int32.py deleted file mode 100644 index 5e576e04..00000000 --- a/iris_grib/tests/unit/save_rules/test_fixup_float32_as_int32.py +++ /dev/null @@ -1,48 +0,0 @@ -# Copyright iris-grib contributors -# -# This file is part of iris-grib and is released under the BSD license. -# See LICENSE in the root of the repository for full licensing details. -""" -Unit tests for `iris_grib._save_rules.fixup_float32_as_int32`. - -""" - -# Import iris_grib.tests first so that some things can be initialised before -# importing anything else. -import iris_grib.tests as tests - -from iris_grib._save_rules import fixup_float32_as_int32 - - -class Test(tests.IrisGribTest): - def test_positive_zero(self): - result = fixup_float32_as_int32(0.0) - self.assertEqual(result, 0) - - def test_negative_zero(self): - result = fixup_float32_as_int32(-0.0) - self.assertEqual(result, 0) - - def test_high_bit_clear_1(self): - # Start with the float32 value for the bit pattern 0x00000001. - result = fixup_float32_as_int32(1.401298464324817e-45) - self.assertEqual(result, 1) - - def test_high_bit_clear_2(self): - # Start with the float32 value for the bit pattern 0x00000002. - result = fixup_float32_as_int32(2.802596928649634e-45) - self.assertEqual(result, 2) - - def test_high_bit_set_1(self): - # Start with the float32 value for the bit pattern 0x80000001. - result = fixup_float32_as_int32(-1.401298464324817e-45) - self.assertEqual(result, -1) - - def test_high_bit_set_2(self): - # Start with the float32 value for the bit pattern 0x80000002. - result = fixup_float32_as_int32(-2.802596928649634e-45) - self.assertEqual(result, -2) - - -if __name__ == "__main__": - tests.main() diff --git a/iris_grib/tests/unit/save_rules/test_fixup_int32_as_uint32.py b/iris_grib/tests/unit/save_rules/test_fixup_int32_as_uint32.py deleted file mode 100644 index cc8e87c4..00000000 --- a/iris_grib/tests/unit/save_rules/test_fixup_int32_as_uint32.py +++ /dev/null @@ -1,40 +0,0 @@ -# Copyright iris-grib contributors -# -# This file is part of iris-grib and is released under the BSD license. -# See LICENSE in the root of the repository for full licensing details. -""" -Unit tests for `iris_grib._save_rules.fixup_int32_as_uint32`. - -""" - -# Import iris.tests first so that some things can be initialised before -# importing anything else. -import iris_grib.tests as tests - -from iris_grib._save_rules import fixup_int32_as_uint32 - - -class Test(tests.IrisGribTest): - def test_very_negative(self): - with self.assertRaises(ValueError): - fixup_int32_as_uint32(-0x80000000) - - def test_negative(self): - result = fixup_int32_as_uint32(-3) - self.assertEqual(result, 0x80000003) - - def test_zero(self): - result = fixup_int32_as_uint32(0) - self.assertEqual(result, 0) - - def test_positive(self): - result = fixup_int32_as_uint32(5) - self.assertEqual(result, 5) - - def test_very_positive(self): - with self.assertRaises(ValueError): - fixup_int32_as_uint32(0x80000000) - - -if __name__ == "__main__": - tests.main() diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_12.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_12.py index ad42bff6..3b841e54 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_template_12.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_12.py @@ -105,24 +105,6 @@ def test__grid_points_approx(self): self._check_key("Di", 200) self._check_key("Dj", 500) - def test__negative_grid_points_eccodes_broken(self): - self.mock_eccodes.CodesInternalError = FakeGribError - - # Force the test to run the signed int --> unsigned int workaround. - def set(grib, key, value): - if key in ["X1", "X2", "Y1", "Y2"] and value < 0: - raise self.mock_eccodes.CodesInternalError() - grib.keys[key] = value - - self.mock_eccodes.codes_set = set - - test_cube = self._make_test_cube(x_points=[-1, 1, 3, 5, 7], y_points=[-4, 9]) - grid_definition_template_12(test_cube, self.mock_grib) - self._check_key("X1", 0x80000064) - self._check_key("X2", 700) - self._check_key("Y1", 0x80000190) - self._check_key("Y2", 900) - def test__negative_grid_points_eccodes_fixed(self): test_cube = self._make_test_cube(x_points=[-1, 1, 3, 5, 7], y_points=[-4, 9]) grid_definition_template_12(test_cube, self.mock_grib) @@ -138,25 +120,7 @@ def test__template_specifics(self): self._check_key("XR", 40000000.0) self._check_key("YR", -10000000.0) - def test__scale_factor_eccodes_broken(self): - # GRIBAPI expects a signed int for scaleFactorAtReferencePoint - # but it should accept a float, so work around this. - # See https://software.ecmwf.int/issues/browse/SUP-1100 - - def get_native_type(grib, key): - assert key == "scaleFactorAtReferencePoint" - return int - - self.mock_eccodes.codes_get_native_type = get_native_type - grid_definition_template_12(self.test_cube, self.mock_grib) - self._check_key("scaleFactorAtReferencePoint", 1065346526) - - def test__scale_factor_eccodes_fixed(self): - def get_native_type(grib, key): - assert key == "scaleFactorAtReferencePoint" - return float - - self.mock_eccodes.codes_get_native_type = get_native_type + def test__scale_factor(self): grid_definition_template_12(self.test_cube, self.mock_grib) self._check_key("scaleFactorAtReferencePoint", 0.9996012717) From e0a30576a779a82f2ccf8a995264d634dd43244c Mon Sep 17 00:00:00 2001 From: Henry Wright <84939917+HGWright@users.noreply.github.com> Date: Fri, 19 Apr 2024 13:47:52 +0100 Subject: [PATCH 287/583] Adding setuptools_scm to iris grib for automatic versioning (#444) * add setuptools_scm * adding scm to deps * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * fix * remove version * manifest ignore * spelling * spelling 2 * gitignore --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Martin Yeo <40734014+trexfeathers@users.noreply.github.com> --- .gitignore | 3 +++ .readthedocs.yml | 13 +++++++++++++ iris_grib/__init__.py | 5 ++++- pyproject.toml | 12 +++++++++++- requirements/locks/py310-linux-64.lock | 17 +++++++++++------ requirements/locks/py311-linux-64.lock | 19 ++++++++++++------- requirements/locks/py39-linux-64.lock | 17 +++++++++++------ requirements/py310.yml | 1 + requirements/py311.yml | 1 + requirements/py39.yml | 1 + 10 files changed, 68 insertions(+), 21 deletions(-) diff --git a/.gitignore b/.gitignore index 2cab3a2f..ccb41249 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,8 @@ *.py[co] +# setuptools-scm +_version.py + # Packages *.egg *.egg-info diff --git a/.readthedocs.yml b/.readthedocs.yml index d9e6d5ce..af304cb2 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -4,6 +4,19 @@ build: os: ubuntu-20.04 tools: python: mambaforge-4.10 + jobs: + post_checkout: + # The SciTools/iris-grib repository is shallow i.e., has a .git/shallow, + # therefore complete the repository with a full history in order + # to allow setuptools-scm to correctly auto-discover the version. + - git fetch --unshallow + - git fetch --all + # Need to stash the local changes that Read the Docs makes so that + # setuptools_scm can generate the correct Iris-grib version. + pre_install: + - git stash + post_install: + - git stash pop conda: environment: requirements/readthedocs.yml diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index 6b7ca90a..c5af006e 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -30,7 +30,10 @@ from .message import GribMessage -__version__ = "0.20.dev0" +try: + from ._version import version as __version__ +except ModuleNotFoundError: + __version__ = "unknown" __all__ = [ "load_cubes", diff --git a/pyproject.toml b/pyproject.toml index 51a40161..b4ef9cea 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,6 +4,7 @@ # Defined by PEP 518 requires = [ "setuptools>=64", + "setuptools_scm>=7.0", "wheel", ] # Defined by PEP 517 @@ -60,13 +61,17 @@ license-files = ["LICENSE"] [tool.setuptools.dynamic] dependencies = {file = "requirements/core.txt"} readme = {file = "README.rst", content-type = "text/x-rst"} -version = {attr = "iris_grib.__version__"} optional-dependencies.all = {file = "requirements/all.txt"} optional-dependencies.test = {file = "requirements/test.txt"} [tool.setuptools.packages.find] include = ["iris_grib*"] +[tool.setuptools_scm] +write_to = "iris_grib/_version.py" +local_scheme = "dirty-tag" +version_scheme = "release-branch-semver" + #------------------------------------------------------------------------------ [tool.coverage.run] @@ -91,6 +96,11 @@ exclude_lines = [ ignore-words-list = "alpha-numeric,degreee,discontiguities,lazyness,meaned,nin" skip = "_build,*.css,*.ipynb,*.js,*.html,*.svg,*.xml,.git,generated" +[tool.check-manifest] +ignore = [ + "iris_grib/_version.py", +] + [tool.mypy] # See https://mypy.readthedocs.io/en/stable/config_file.html ignore_missing_imports = true diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index af5cc02d..c4c6f495 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 9e797137467cb0eae651a9bc93dc4bec8f140aabfb83ba31bdbfd6e25e21a64e +# input_hash: 8b47e0a77f6ce801a2c484d9a593594c1998ce2d1b9fe3dc1e03225261de4b51 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef @@ -53,11 +53,11 @@ https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2. https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_5.conda#e73e9cfd1191783392131e6238bdb3e9 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.2-h2797004_0.conda#866983a220e27a80cb75e85cb30466a1 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.3-h2797004_0.conda#b3316cbe90249da4f8e84cd66e1cc55b https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.6-h232c23b_1.conda#6853448e9ca1cfd5f15382afd2a6d123 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.6-h232c23b_2.conda#9a3a42df8a95f65334dfc7b80da1195d https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc @@ -71,7 +71,7 @@ https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd9 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_h413a1c8_0.conda#a356024784da6dfd4683dc5ecf45b155 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda#66f03896ffbe1a110ffda05c7a856504 https://conda.anaconda.org/conda-forge/linux-64/python-3.10.14-hd12c33a_0_cpython.conda#2b4ba962994e8bd4be9ff5b64b75aff2 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.2-h2c6b66d_0.conda#1423efca06ed343c1da0fc429bae0779 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.3-h2c6b66d_0.conda#be7d70f2db41b674733667bdd69bd000 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-h8ee46fc_0.conda#077b6e8ad6a3ddb741fce2496dd01bec https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 @@ -88,7 +88,7 @@ https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2. https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.4-pyhd8ed1ab_0.conda#6baa2e7fc09bd2c7c82cb6662d5f1d36 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.3.1-pyhca7485f_0.conda#b7f0662ef2c9d4404f0af9eef5ed2fde -https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda#1a76f09108576397c41c0b0c5bd84134 +https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda#c0cc1420498b17414d8617d0b9f506ca https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 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/kiwisolver-1.4.5-py310hd41b1e2_1.conda#b8d67603d43b23ce7e988a5d81a7ab79 @@ -111,6 +111,7 @@ https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda#6ef2fc37559256cf682d8b3375e89b80 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py310h2372a71_0.conda#72637c58d36d9475fda24700c9796f19 https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda#0b5293a157c2b5cd513dd1b03d8d3aae https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec @@ -130,6 +131,7 @@ https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.1-h1d62c97_0.conda#44ec51d0857d9be26158bb85caa74fdb https://conda.anaconda.org/conda-forge/noarch/pytest-8.1.1-pyhd8ed1ab_0.conda#94ff09cdedcb7b17e9cd5097ee2cfcff https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.11.0-hd8ed1ab_0.conda#471e3988f8ca5e9eb3ce6be7eac3bcee https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 @@ -139,13 +141,15 @@ https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py310hb13e2d6_0.con https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py310hd5c30f3_5.conda#dc2ee770a2299307f3c127af79160d25 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b +https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.0.4-pyhd8ed1ab_1.conda#a1986ad21c766ff22f7bae93f0641020 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py310h1f7b6fc_0.conda#31beda75384647959d5792a1a7dc571a https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py310hd41b1e2_0.conda#60ee50b1968f802f2a487ba36d4cce0d https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.4.1-pyhd8ed1ab_0.conda#52387f00fee8dcd5cf75f8886025293f https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.3-he6dfbbe_0.conda#05c1609de571f7a9a40e6d7d4116c21a https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py310h2372a71_1.conda#dfcf64f67961eb9686676f96fdb4b4d1 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py310hb13e2d6_0.conda#512cfc0369e247e3993a76030671cce0 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.3-py310hc3e127f_0.conda#fbc825d13cbcb2d5d3fbba22c83fd203 +https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.0.4-hd8ed1ab_1.conda#b065535ca8ca824703ae5537087e2206 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py310hc3e127f_0.conda#5cc13dc3d6981b2187616b824e1c5fae https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py310h1f7b6fc_4.conda#0ca55ca20891d393846695354b32ebc5 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.35.0-he84ddb8_0.conda#2d01dfbe537478e7a1a495b9639edd45 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py310h62c0568_0.conda#bdfa3aee52579c6b3dde12f52e266ef2 @@ -153,3 +157,4 @@ https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py310hba70d5 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py310hcc13569_0.conda#89a13de526ea3008341e3a2aeab4da7e https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.0-py310h1f7b6fc_1.conda#f020ac07b7df9c4b0bd0ece3055b5bd2 https://conda.anaconda.org/conda-forge/noarch/iris-3.8.1-pyha770c72_0.conda#b08a116ef1607e7e960a4caa902e3a90 + diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 25664a3d..06177d00 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 27ab0ac641e4e7eca8a844e030e7e96ae85c91bc70dc3c0682a6f08459719d5a +# input_hash: 86ed0486ae4fc60e1f46ac8a62982bc103c806ab18fe04e57c4c75fe1eb391d3 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef @@ -53,11 +53,11 @@ https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2. https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_5.conda#e73e9cfd1191783392131e6238bdb3e9 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.2-h2797004_0.conda#866983a220e27a80cb75e85cb30466a1 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.3-h2797004_0.conda#b3316cbe90249da4f8e84cd66e1cc55b https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.6-h232c23b_1.conda#6853448e9ca1cfd5f15382afd2a6d123 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.6-h232c23b_2.conda#9a3a42df8a95f65334dfc7b80da1195d https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc @@ -71,7 +71,7 @@ https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd9 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_h413a1c8_0.conda#a356024784da6dfd4683dc5ecf45b155 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda#66f03896ffbe1a110ffda05c7a856504 https://conda.anaconda.org/conda-forge/linux-64/python-3.11.8-hab00c5b_0_cpython.conda#2fdc314ee058eda0114738a9309d3683 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.2-h2c6b66d_0.conda#1423efca06ed343c1da0fc429bae0779 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.3-h2c6b66d_0.conda#be7d70f2db41b674733667bdd69bd000 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-h8ee46fc_0.conda#077b6e8ad6a3ddb741fce2496dd01bec https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb @@ -90,7 +90,7 @@ https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2. https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.4-pyhd8ed1ab_0.conda#6baa2e7fc09bd2c7c82cb6662d5f1d36 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.3.1-pyhca7485f_0.conda#b7f0662ef2c9d4404f0af9eef5ed2fde -https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda#1a76f09108576397c41c0b0c5bd84134 +https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda#c0cc1420498b17414d8617d0b9f506ca https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.4.0-pyhd8ed1ab_0.tar.bz2#18ee9c07cf945a33f92caf1ee3d23ad9 @@ -118,6 +118,7 @@ https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda#6ef2fc37559256cf682d8b3375e89b80 https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda#0b5293a157c2b5cd513dd1b03d8d3aae https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a @@ -137,6 +138,7 @@ https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.1-h1d62c97_0.conda#44ec51d0857d9be26158bb85caa74fdb https://conda.anaconda.org/conda-forge/noarch/pytest-8.1.1-pyhd8ed1ab_0.conda#94ff09cdedcb7b17e9cd5097ee2cfcff https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.11.0-hd8ed1ab_0.conda#471e3988f8ca5e9eb3ce6be7eac3bcee https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 @@ -146,13 +148,15 @@ https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.con https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311hca0b8b9_5.conda#cac429fcb9126d5e6f02c8ba61c2a811 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b +https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.0.4-pyhd8ed1ab_1.conda#a1986ad21c766ff22f7bae93f0641020 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py311h1f0f07a_0.conda#b7e6d52b39e199238c3400cafaabafb3 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py311h9547e67_0.conda#74ad0ae64f1ef565e27eda87fa749e84 https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.4.1-pyhd8ed1ab_0.conda#52387f00fee8dcd5cf75f8886025293f https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.3-he6dfbbe_0.conda#05c1609de571f7a9a40e6d7d4116c21a https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py311h459d7ec_1.conda#45b8d355bbcdd27588c2d266bcfdff84 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py311h64a7726_0.conda#d443c70b4a05f50236c70b9c79beff64 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.3-py311h2032efe_0.conda#e982956906078eeac9feb3b8db10d011 +https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.0.4-hd8ed1ab_1.conda#b065535ca8ca824703ae5537087e2206 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py311h2032efe_0.conda#c99302680ce37b15bcda8152976cb3ba https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h1f0f07a_4.conda#1e105c1a8ea2163507726144b401eb1b https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.35.0-he84ddb8_0.conda#2d01dfbe537478e7a1a495b9639edd45 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py311h54ef318_0.conda#150186110f111b458f86c04361351337 @@ -166,5 +170,6 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.5-pyhd8 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jquery-4.1-pyhd8ed1ab_0.conda#914897066d5873acfb13e75705276ad1 https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-2.0.0-pyha770c72_0.conda#baf6d9a33df1a789ca55e3b404c7ea28 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.7-pyhd8ed1ab_0.conda#26acae54b06f178681bfb551760f5dd1 -https://conda.anaconda.org/conda-forge/noarch/sphinx-7.2.6-pyhd8ed1ab_0.conda#bbfd1120d1824d2d073bc65935f0e4c0 +https://conda.anaconda.org/conda-forge/noarch/sphinx-7.3.5-pyhd8ed1ab_1.conda#519304a917d39ff828de7da4b6d21f54 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda#e507335cb4ca9cff4c3d0fa9cdab255e + diff --git a/requirements/locks/py39-linux-64.lock b/requirements/locks/py39-linux-64.lock index c3809e15..a6e2a526 100644 --- a/requirements/locks/py39-linux-64.lock +++ b/requirements/locks/py39-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 0ea2e1429acfb3b6481755808a3eb8abce4ab84479aefa81da3fc40044655afb +# input_hash: 7e7dd4cf74148655349102a6a27dccab372cc945b64fe069cbb5be59c905fb6d @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef @@ -53,11 +53,11 @@ https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2. https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_5.conda#e73e9cfd1191783392131e6238bdb3e9 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.2-h2797004_0.conda#866983a220e27a80cb75e85cb30466a1 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.3-h2797004_0.conda#b3316cbe90249da4f8e84cd66e1cc55b https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.6-h232c23b_1.conda#6853448e9ca1cfd5f15382afd2a6d123 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.6-h232c23b_2.conda#9a3a42df8a95f65334dfc7b80da1195d https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc @@ -71,7 +71,7 @@ https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd9 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_h413a1c8_0.conda#a356024784da6dfd4683dc5ecf45b155 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda#66f03896ffbe1a110ffda05c7a856504 https://conda.anaconda.org/conda-forge/linux-64/python-3.9.19-h0755675_0_cpython.conda#d9ee3647fbd9e8595b8df759b2bbefb8 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.2-h2c6b66d_0.conda#1423efca06ed343c1da0fc429bae0779 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.3-h2c6b66d_0.conda#be7d70f2db41b674733667bdd69bd000 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-h8ee46fc_0.conda#077b6e8ad6a3ddb741fce2496dd01bec https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 @@ -88,7 +88,7 @@ https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2. https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.4-pyhd8ed1ab_0.conda#6baa2e7fc09bd2c7c82cb6662d5f1d36 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.3.1-pyhca7485f_0.conda#b7f0662ef2c9d4404f0af9eef5ed2fde -https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda#1a76f09108576397c41c0b0c5bd84134 +https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda#c0cc1420498b17414d8617d0b9f506ca https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 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/kiwisolver-1.4.5-py39h7633fee_1.conda#c9f74d717e5a2847a9f8b779c54130f2 @@ -111,6 +111,7 @@ https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda#6ef2fc37559256cf682d8b3375e89b80 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py39hd1e30aa_0.conda#1da984bbb6e765743e13388ba7b7b2c8 https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda#0b5293a157c2b5cd513dd1b03d8d3aae https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec @@ -131,6 +132,7 @@ https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.1-h1d62c97_0.conda#44ec51d0857d9be26158bb85caa74fdb https://conda.anaconda.org/conda-forge/noarch/pytest-8.1.1-pyhd8ed1ab_0.conda#94ff09cdedcb7b17e9cd5097ee2cfcff https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.11.0-hd8ed1ab_0.conda#471e3988f8ca5e9eb3ce6be7eac3bcee https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 @@ -141,13 +143,15 @@ https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py39h474f0d3_0.cond https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py39h15b0fa6_5.conda#85e186c7ff673b0d0026782ec353fb2a https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b +https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.0.4-pyhd8ed1ab_1.conda#a1986ad21c766ff22f7bae93f0641020 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py39h44dd56e_0.conda#baea2f5dfb3ab7b1c836385d2e1daca7 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py39h7633fee_0.conda#bdc188e59857d6efab332714e0d01d93 https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.4.1-pyhd8ed1ab_0.conda#52387f00fee8dcd5cf75f8886025293f https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.3-he6dfbbe_0.conda#05c1609de571f7a9a40e6d7d4116c21a https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py39hd1e30aa_1.conda#ca63612907462c8e36edcc9bbacc253e https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py39h474f0d3_0.conda#46ae0ecba9726ab4fa44c78fefa522cf -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.3-py39h6404dd3_0.conda#1520f039123452cd2de847068449a618 +https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.0.4-hd8ed1ab_1.conda#b065535ca8ca824703ae5537087e2206 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py39h6404dd3_0.conda#c33c60a88dad5df6960c4da482f9e313 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py39h44dd56e_4.conda#81310d21bf9d91754c1220c585bb72d6 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.35.0-he84ddb8_0.conda#2d01dfbe537478e7a1a495b9639edd45 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py39he9076e7_0.conda#1919384a8420e7bb25f6c3a582e0857c @@ -155,3 +159,4 @@ https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py39h4282601 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py39hddac248_0.conda#aa02350ccb542c83272f9cb7e4dfe15e https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.0-py39h44dd56e_1.conda#629e8d066a330f729d0085d86681fd01 https://conda.anaconda.org/conda-forge/noarch/iris-3.8.1-pyha770c72_0.conda#b08a116ef1607e7e960a4caa902e3a90 + diff --git a/requirements/py310.yml b/requirements/py310.yml index 019bb5af..6e24376a 100644 --- a/requirements/py310.yml +++ b/requirements/py310.yml @@ -8,6 +8,7 @@ dependencies: # Setup dependencies. - setuptools + - setuptools_scm >=7 # Core dependencies. - iris>=3.0.2 diff --git a/requirements/py311.yml b/requirements/py311.yml index 133ba2da..61600305 100644 --- a/requirements/py311.yml +++ b/requirements/py311.yml @@ -8,6 +8,7 @@ dependencies: # Setup dependencies. - setuptools + - setuptools_scm >=7 # Core dependencies. - iris>=3.0.2 diff --git a/requirements/py39.yml b/requirements/py39.yml index 5aedb9fa..302f8305 100644 --- a/requirements/py39.yml +++ b/requirements/py39.yml @@ -8,6 +8,7 @@ dependencies: # Setup dependencies. - setuptools + - setuptools_scm >=7 # Core dependencies. - iris>=3.0.2 From b0f4584e99fc75f12519b94f0d5488dfe5ab6854 Mon Sep 17 00:00:00 2001 From: Martin Yeo <40734014+trexfeathers@users.noreply.github.com> Date: Fri, 19 Apr 2024 15:24:27 +0100 Subject: [PATCH 288/583] Save GDT20 - Polar Stereographic - take 2 (#405) * Add saver for GDT20 * Save GDT20 (Polar Stereographic) * License headers! * Fix bits missed in branch update. * Address @pp-mo comment on 0x80. * Remove comment. * Fix flake8. * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Fix missing bracket. * Correct test value after ff8fc0d. * Further fixes. * Correct expected projectionCentreFlag to 128 following ff8fc0d. * Handle both Stereographic and PolarStereographic appropriately. * Add a GDT20 roundtrip test. * Fix tests. * Don't flake8 type hints. * Mypy - remove six import. * Revert "Don't flake8 type hints." This reverts commit 32f6806b8518131bdd29a5ee5f9acc5dffa807b8. * Exclude test_grid_definition_section.py from pep8 - E701 type hints. * More translation errors. * Fix tests. * Remove PEP8 exception file. * Add release notes entry. * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Approximate equality check. * Allow for scale factor of 1.0 . * Common non-standard scale factor error. * Better TranslationError for non-polar. * Fix test. --------- Co-authored-by: Peter Killick Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- docs/ref/release_notes.rst | 5 + iris_grib/__init__.py | 5 +- iris_grib/_load_convert.py | 5 +- iris_grib/_save_rules.py | 121 +++++++++-- .../load_convert/test_sample_file_loads.py | 5 +- .../test_grid_definition_section.py | 109 +++++++++- .../test_grid_definition_section.py | 22 ++ .../sample_file_loads/polar_stereo_grib1.cml | 8 +- .../test_grid_definition_template_20.py | 5 +- .../test_grid_definition_template_20.py | 188 ++++++++++++++++++ .../test_grid_definition_template_30.py | 57 +++++- 11 files changed, 498 insertions(+), 32 deletions(-) create mode 100644 iris_grib/tests/unit/save_rules/test_grid_definition_template_20.py diff --git a/docs/ref/release_notes.rst b/docs/ref/release_notes.rst index cd93f5e4..9ab84444 100644 --- a/docs/ref/release_notes.rst +++ b/docs/ref/release_notes.rst @@ -23,6 +23,11 @@ Features `(ISSUE#330) `_, `(PR#402) `_ +* `@DPeterK `_ and + `@trexfeathers `_ added saving support for + grid definition template 20 - polar stereographic. + `(PR#405) `_ + Documentation ^^^^^^^^^^^^^ * `@pp-mo `_ reworked the main docs page to : diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index c5af006e..bb02e15b 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -413,8 +413,11 @@ def _compute_extra_keys(self): else: raise TranslationError("Unhandled projectionCentreFlag") + # Always load PolarStereographic - never Stereographic. + # Stereographic is a CF/Iris concept and not something described + # in GRIB. # Note: I think the grib api defaults LaDInDegrees to 60 for grib1. - self.extra_keys["_coord_system"] = coord_systems.Stereographic( + self.extra_keys["_coord_system"] = coord_systems.PolarStereographic( pole_lat, self.orientationOfTheGridInDegrees, 0, diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index 7acdfd94..9b30eaf2 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -912,7 +912,10 @@ def grid_definition_template_20(section, metadata): central_lat = 90.0 central_lon = section["orientationOfTheGrid"] * _GRID_ACCURACY_IN_DEGREES true_scale_lat = section["LaD"] * _GRID_ACCURACY_IN_DEGREES - cs = icoord_systems.Stereographic( + # Always load PolarStereographic - never Stereographic. + # Stereographic is a CF/Iris concept and not something described + # in GRIB. + cs = icoord_systems.PolarStereographic( central_lat=central_lat, central_lon=central_lon, true_scale_lat=true_scale_lat, diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index 612cd9d7..3e8cb295 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -27,6 +27,7 @@ TransverseMercator, LambertConformal, LambertAzimuthalEqualArea, + Stereographic, ) from iris.exceptions import TranslationError @@ -544,21 +545,28 @@ def m_to_cm(value): eccodes.codes_set(grib, "scaleFactorAtReferencePoint", value) -def grid_definition_template_30(cube, grib): +def _perspective_projection_common(cube, grib): """ - Set keys within the provided grib message based on - Grid Definition Template 3.30. - - Template 3.30 is used to represent a Lambert Conformal grid. + Common functionality for setting grid keys for the perspective projection + grid definition templates (20 and 30; Polar Stereographic and Lambert + Conformal. """ - - eccodes.codes_set(grib, "gridDefinitionTemplateNumber", 30) - # Retrieve some information from the cube. y_coord = cube.coord(dimensions=[0]) x_coord = cube.coord(dimensions=[1]) cs = y_coord.coord_system + cs_name = cs.grid_mapping_name.replace("_", " ").title() + + both_falses_zero = all( + np.isclose(f, 0.0, atol=1e-6) for f in (cs.false_easting, cs.false_northing) + ) + if not both_falses_zero: + message = ( + f"{cs.false_easting=}, {cs.false_northing=} . Non-zero " + f"unsupported for {cs_name}." + ) + raise TranslationError(message) # Normalise the coordinate values to millimetres - the resolution # used in the GRIB message. @@ -566,21 +574,26 @@ def grid_definition_template_30(cube, grib): x_mm = points_in_unit(x_coord, "mm") # Encode the horizontal points. - # NB. Since we're already in millimetres, our tolerance for # discrepancy in the differences is 1. try: x_step = step(x_mm, atol=1) y_step = step(y_mm, atol=1) except ValueError: - msg = "Irregular coordinates not supported for Lambert " "Conformal." - raise TranslationError(msg) + msg = "Irregular coordinates not supported for {!r}." + raise TranslationError(msg.format(cs_name)) eccodes.codes_set(grib, "Dx", abs(x_step)) eccodes.codes_set(grib, "Dy", abs(y_step)) horizontal_grid_common(cube, grib, xy=True) - # Transform first point into geographic CS + eccodes.codes_set( + grib, + "resolutionAndComponentFlags", + 0x1 << _RESOLUTION_AND_COMPONENTS_GRID_WINDS_BIT, + ) + + # Transform first point into geographic CS. geog = cs.ellipsoid if cs.ellipsoid is not None else GeogCS(1) first_x, first_y = geog.as_cartopy_crs().transform_point( x_coord.points[0], y_coord.points[0], cs.as_cartopy_crs() @@ -600,20 +613,85 @@ def grid_definition_template_30(cube, grib): ) eccodes.codes_set(grib, "LaD", cs.central_lat / _DEFAULT_DEGREES_UNITS) eccodes.codes_set(grib, "LoV", central_lon / _DEFAULT_DEGREES_UNITS) + + +def grid_definition_template_20(cube, grib): + """ + Set keys within the provided GRIB message based on + Grid Definition Template 3.20. + + Template 3.20 is used to represent a Polar Stereographic grid. + + """ + eccodes.codes_set(grib, "gridDefinitionTemplateNumber", 20) + + # Retrieve the cube coord system. + cs = cube.coord(dimensions=[0]).coord_system + + _perspective_projection_common(cube, grib) + + # Is this a north or south polar stereographic projection? + if np.isclose(cs.central_lat, -90.0): + centre_flag = 0x80 + elif np.isclose(cs.central_lat, 90.0): + centre_flag = 0x0 + else: + message = ( + f"{cs.central_lat=} . GRIB Template 3.20 only supports the polar " + "stereographic projection; central_lat must be 90.0 or -90.0." + ) + raise TranslationError(message) + + def non_standard_scale_factor_error(message: str): + message = f"Non-standard scale factor specified. {message}" + raise TranslationError(message) + + if cs.true_scale_lat and cs.true_scale_lat != cs.central_lat: + non_standard_scale_factor_error( + f"{cs.true_scale_lat=}, {cs.central_lat=} . iris_grib can " + "only write a GRIB Template 3.20 file where these are identical." + ) + + if cs.scale_factor_at_projection_origin and not np.isclose( + cs.scale_factor_at_projection_origin, 1.0 + ): + non_standard_scale_factor_error( + f"{cs.scale_factor_at_projection_origin=} . iris_grib cannot " + "write scale_factor_at_projection_origin to a GRIB Template 3.20 " + "file." + ) + + eccodes.codes_set(grib, "projectionCentreFlag", centre_flag) + + +def grid_definition_template_30(cube, grib): + """ + Set keys within the provided grib message based on + Grid Definition Template 3.30. + + Template 3.30 is used to represent a Lambert Conformal grid. + + """ + + eccodes.codes_set(grib, "gridDefinitionTemplateNumber", 30) + + # Retrieve the cube coord system. + cs = cube.coord(dimensions=[0]).coord_system + + _perspective_projection_common(cube, grib) + + # Which pole are the parallels closest to? That is the direction + # that the cone converges. latin1, latin2 = cs.secant_latitudes eccodes.codes_set(grib, "Latin1", latin1 / _DEFAULT_DEGREES_UNITS) eccodes.codes_set(grib, "Latin2", latin2 / _DEFAULT_DEGREES_UNITS) - eccodes.codes_set( - grib, - "resolutionAndComponentFlags", - 0x1 << _RESOLUTION_AND_COMPONENTS_GRID_WINDS_BIT, - ) # Which pole are the parallels closest to? That is the direction # that the cone converges. - poliest_sec = latin1 if abs(latin1) > abs(latin2) else latin2 - centre_flag = 0x0 if poliest_sec > 0 else 0x1 + poliest_secant = latin1 if abs(latin1) > abs(latin2) else latin2 + centre_flag = 0x0 if poliest_secant > 0 else 0x80 eccodes.codes_set(grib, "projectionCentreFlag", centre_flag) + eccodes.codes_set(grib, "latitudeOfSouthernPole", 0) eccodes.codes_set(grib, "longitudeOfSouthernPole", 0) @@ -729,6 +807,11 @@ def grid_definition_section(cube, grib): # Transverse Mercator coordinate system (template 3.12). grid_definition_template_12(cube, grib) + elif isinstance(cs, Stereographic): + # Stereographic coordinate system (template 3.20). + # This will also handle the PolarStereographic subclass. + grid_definition_template_20(cube, grib) + elif isinstance(cs, LambertConformal): # Lambert Conformal coordinate system (template 3.30). grid_definition_template_30(cube, grib) diff --git a/iris_grib/tests/integration/load_convert/test_sample_file_loads.py b/iris_grib/tests/integration/load_convert/test_sample_file_loads.py index aeb5526e..43d04a50 100644 --- a/iris_grib/tests/integration/load_convert/test_sample_file_loads.py +++ b/iris_grib/tests/integration/load_convert/test_sample_file_loads.py @@ -75,7 +75,10 @@ def test_polar_stereo_grib2_grid_definition(self): self.assertAlmostEqual(pyc.points.max(), -216.1459, places=4) self.assertAlmostEqual(pyc.points.min(), -5970216.1459, places=4) self.assertEqual(pyc.coord_system, pxc.coord_system) - self.assertEqual(pyc.coord_system.grid_mapping_name, "stereographic") + self.assertEqual( + pyc.coord_system.grid_mapping_name, + "polar_stereographic", + ) self.assertEqual(pyc.coord_system.central_lat, 90.0) self.assertEqual(pyc.coord_system.central_lon, 249.0) self.assertEqual(pyc.coord_system.false_easting, 0.0) diff --git a/iris_grib/tests/integration/round_trip/test_grid_definition_section.py b/iris_grib/tests/integration/round_trip/test_grid_definition_section.py index 8988a7de..77e5668e 100644 --- a/iris_grib/tests/integration/round_trip/test_grid_definition_section.py +++ b/iris_grib/tests/integration/round_trip/test_grid_definition_section.py @@ -11,8 +11,14 @@ # before importing anything else. import iris_grib.tests as tests +from typing import Literal + +import numpy as np + from iris import load_cube, save -from iris.coord_systems import RotatedGeogCS +from iris.coord_systems import GeogCS, PolarStereographic, RotatedGeogCS, Stereographic +from iris.coords import DimCoord +from iris.cube import Cube from iris.fileformats.pp import EARTH_RADIUS as UM_DEFAULT_EARTH_RADIUS from iris.util import is_regular @@ -124,5 +130,106 @@ def test_save_load(self): self.assertArrayAllClose(cube.data, cube_loaded_from_saved.data) +class GDT20Common: + """'Wrapper' to avoid class being detected during test runs.""" + + class GDT20Common(tests.TestGribMessage): + """Roundtrip testing that attributes save+load correctly.""" + + # Enable subclassing to test different permutations. + coord_system_class: type[Stereographic] + pole: Literal["north", "south"] + + def setUp(self): + # Create a Cube to save, inspired by + # iris-sample-data toa_brightness_stereographic.nc + if self.pole == "north": + central_lat = 90 + elif self.pole == "south": + central_lat = -90 + else: + raise NotImplementedError(f"Invalid pole: {self.pole}") + + self.coord_system_kwargs = dict( + central_lat=central_lat, + central_lon=325, + true_scale_lat=central_lat, + ellipsoid=GeogCS(6378169.0), + ) + coord_system = self.coord_system_class(**self.coord_system_kwargs) + + coord_kwargs = dict( + units="m", + coord_system=coord_system, + ) + coord_x = DimCoord( + np.linspace(-2250000, 6750192, 256, endpoint=False), + standard_name="projection_x_coordinate", + **coord_kwargs, + ) + coord_y = DimCoord( + np.linspace(-980000, -6600000, 160, endpoint=False), + standard_name="projection_y_coordinate", + **coord_kwargs, + ) + coord_t = DimCoord( + 0, standard_name="time", units="hours since 1970-01-01 00:00:00" + ) + coord_fp = DimCoord(0, standard_name="forecast_period", units="hours") + coord_frt = DimCoord( + 0, standard_name="forecast_reference_time", units=coord_t.units + ) + shape = (coord_y.shape[0], coord_x.shape[0]) + self.cube = Cube( + np.arange(np.prod(shape), dtype=float).reshape(shape), + dim_coords_and_dims=[(coord_y, 0), (coord_x, 1)], + aux_coords_and_dims=[ + (coord_t, None), + (coord_fp, None), + (coord_frt, None), + ], + ) + + def test_save_load(self): + with self.temp_filename("polar_stereo.grib2") as temp_file_path: + save(self.cube, temp_file_path) + cube_reloaded = load_cube(temp_file_path) + # Touch the data before destroying the file. + _ = cube_reloaded.data + + cube_expected = self.cube.copy() + for coord in cube_expected.dim_coords: + # GRIB only describes PolarStereographic, so we always expect + # that system even when we started with Stereographic. + coord.coord_system = PolarStereographic(**self.coord_system_kwargs) + + # Modifications to remove irrelevant inequalities. + del cube_reloaded.attributes["GRIB_PARAM"] + for coord in cube_reloaded.dim_coords: + coord.points = np.round(coord.points) + + self.assertEqual(cube_expected, cube_reloaded) + + +class TestGDT20StereoNorth(GDT20Common.GDT20Common): + coord_system_class = Stereographic + pole = "north" + + +class TestGDT20StereoSouth(GDT20Common.GDT20Common): + coord_system_class = Stereographic + pole = "south" + + +class TestGDT20PolarNorth(GDT20Common.GDT20Common): + coord_system_class = PolarStereographic + pole = "north" + + +class TestGDT20PolarSouth(GDT20Common.GDT20Common): + coord_system_class = PolarStereographic + pole = "south" + + if __name__ == "__main__": tests.main() diff --git a/iris_grib/tests/integration/save_rules/test_grid_definition_section.py b/iris_grib/tests/integration/save_rules/test_grid_definition_section.py index b7b0f3bc..0ca62403 100644 --- a/iris_grib/tests/integration/save_rules/test_grid_definition_section.py +++ b/iris_grib/tests/integration/save_rules/test_grid_definition_section.py @@ -20,6 +20,8 @@ LambertConformal, AlbersEqualArea, LambertAzimuthalEqualArea, + Stereographic, + PolarStereographic, ) import numpy as np @@ -92,6 +94,26 @@ def test_grid_definition_template_12(self): grid_definition_section(test_cube, self.mock_grib) self._check_key("gridDefinitionTemplateNumber", 12) + def grid_definition_template_20_common(self, coord_system: type[Stereographic]): + # Stereographic grid. + # Common code to allow testing PolarStereographic and Stereographic. + if not issubclass(coord_system, Stereographic): + raise ValueError("coord_system must be Stereographic type.") + + x_points = np.arange(3) + y_points = np.arange(3) + coord_units = "m" + cs = coord_system(90.0, 0, ellipsoid=self.ellipsoid) + test_cube = self._make_test_cube(cs, x_points, y_points, coord_units) + grid_definition_section(test_cube, self.mock_grib) + self._check_key("gridDefinitionTemplateNumber", 20) + + def test_grid_definition_template_20_s(self): + self.grid_definition_template_20_common(Stereographic) + + def test_grid_definition_template_20_ps(self): + self.grid_definition_template_20_common(PolarStereographic) + def test_grid_definition_template_30(self): # Lambert Conformal grid. x_points = np.arange(3) diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/polar_stereo_grib1.cml b/iris_grib/tests/results/integration/load_convert/sample_file_loads/polar_stereo_grib1.cml index c1c845ae..27a002fb 100644 --- a/iris_grib/tests/results/integration/load_convert/sample_file_loads/polar_stereo_grib1.cml +++ b/iris_grib/tests/results/integration/load_convert/sample_file_loads/polar_stereo_grib1.cml @@ -12,17 +12,17 @@ - - + - - + diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_20.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_20.py index 949ec045..3aeaed43 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_20.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_20.py @@ -52,7 +52,10 @@ def expected(self, y_dim, x_dim): # Prepare the expectation. expected = empty_metadata() ellipsoid = iris.coord_systems.GeogCS(6367470) - cs = iris.coord_systems.Stereographic( + # Always expect PolarStereographic - never Stereographic. + # Stereographic is a CF/Iris concept and not something described in + # GRIB. + cs = iris.coord_systems.PolarStereographic( central_lat=90.0, central_lon=262.0, false_easting=0, diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_20.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_20.py new file mode 100644 index 00000000..fb7db975 --- /dev/null +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_20.py @@ -0,0 +1,188 @@ +# Copyright iris-grib contributors +# +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +""" +Unit tests for :meth:`iris_grib._save_rules.grid_definition_template_20`. + +""" + +# Import iris_grib.tests first so that some things can be initialised before +# importing anything else. +import iris_grib.tests as tests + +from iris.coord_systems import GeogCS, PolarStereographic, Stereographic +from iris.coords import AuxCoord +from iris.exceptions import TranslationError +import numpy as np + +from iris_grib._save_rules import grid_definition_template_20 +from iris_grib.tests.unit.save_rules import GdtTestMixin + + +class Test(tests.IrisGribTest, GdtTestMixin): + def setUp(self): + self.default_ellipsoid = GeogCS(semi_major_axis=6371200.0) + self.stereo_test_cube = self._make_test_cube(coord_units="m") + + GdtTestMixin.setUp(self) + + def _default_coord_system(self, false_easting=0, false_northing=0): + return PolarStereographic( + 90.0, + 0, + false_easting=false_easting, + false_northing=false_northing, + ellipsoid=self.default_ellipsoid, + ) + + def test__template_number(self): + grid_definition_template_20(self.stereo_test_cube, self.mock_grib) + self._check_key("gridDefinitionTemplateNumber", 20) + + def test__shape_of_earth(self): + grid_definition_template_20(self.stereo_test_cube, self.mock_grib) + self._check_key("shapeOfTheEarth", 1) + self._check_key("scaleFactorOfRadiusOfSphericalEarth", 0) + self._check_key("scaleFactorOfEarthMajorAxis", 0) + self._check_key("scaledValueOfEarthMajorAxis", 0) + self._check_key("scaleFactorOfEarthMinorAxis", 0) + self._check_key("scaledValueOfEarthMinorAxis", 0) + + def test__grid_shape(self): + stereo_test_cube = self._make_test_cube( + x_points=np.arange(13), y_points=np.arange(6), coord_units="m" + ) + grid_definition_template_20(stereo_test_cube, self.mock_grib) + self._check_key("Nx", 13) + self._check_key("Ny", 6) + + def test__grid_points(self): + stereo_test_cube = self._make_test_cube( + x_points=[1e6, 3e6, 5e6, 7e6], y_points=[4e6, 9e6], coord_units="m" + ) + grid_definition_template_20(stereo_test_cube, self.mock_grib) + self._check_key("latitudeOfFirstGridPoint", 54139565) + self._check_key("longitudeOfFirstGridPoint", 165963757) + self._check_key("Dx", 2e9) + self._check_key("Dy", 5e9) + + def test__template_specifics(self): + grid_definition_template_20(self.stereo_test_cube, self.mock_grib) + self._check_key("LaD", 90e6) + self._check_key("LoV", 0) + + def test__scanmode(self): + grid_definition_template_20(self.stereo_test_cube, self.mock_grib) + self._check_key("iScansPositively", 1) + self._check_key("jScansPositively", 1) + + def test__scanmode_reverse(self): + stereo_test_cube = self._make_test_cube( + x_points=np.arange(7e6, 0, -1e6), coord_units="m" + ) + grid_definition_template_20(stereo_test_cube, self.mock_grib) + self._check_key("iScansPositively", 0) + self._check_key("jScansPositively", 1) + + def test_projection_centre(self): + grid_definition_template_20(self.stereo_test_cube, self.mock_grib) + self._check_key("projectionCentreFlag", 0) + + def test_projection_centre_south_pole(self): + cs = PolarStereographic(-90.0, 0, ellipsoid=self.default_ellipsoid) + stereo_test_cube = self._make_test_cube(cs=cs, coord_units="m") + grid_definition_template_20(stereo_test_cube, self.mock_grib) + self._check_key("projectionCentreFlag", 128) + + def test_projection_centre_south_pole_parent(self): + # Saving should be able to handle either class (PolarStereographic + # being a subclass of Stereographic). + cs = Stereographic(-90.0, 0, ellipsoid=self.default_ellipsoid) + stereo_test_cube = self._make_test_cube(cs=cs, coord_units="m") + grid_definition_template_20(stereo_test_cube, self.mock_grib) + self._check_key("projectionCentreFlag", 128) + + def test_projection_centre_bad(self): + cs = Stereographic(0, 0, ellipsoid=self.default_ellipsoid) + stereo_test_cube = self._make_test_cube(cs=cs, coord_units="m") + exp_emsg = "must be 90.0 or -90.0" + with self.assertRaisesRegex(TranslationError, exp_emsg): + grid_definition_template_20(stereo_test_cube, self.mock_grib) + + def __fail_false_easting_northing(self, false_easting, false_northing): + cs = self._default_coord_system( + false_easting=false_easting, false_northing=false_northing + ) + test_cube = self._make_test_cube(cs=cs) + message = "Non-zero unsupported" + with self.assertRaisesRegex(TranslationError, message): + grid_definition_template_20(test_cube, self.mock_grib) + + def test__fail_false_easting(self): + self.__fail_false_easting_northing(10.0, 0.0) + + def test__fail_false_northing(self): + self.__fail_false_easting_northing(0.0, 10.0) + + def test__fail_false_easting_northing(self): + self.__fail_false_easting_northing(10.0, 10.0) + + def __fail_irregular_coords(self, x=False, y=False): + def irregular_coord(coord): + coord = AuxCoord.from_coord(coord) + coord.points[1] = coord.points[0] + return coord + + test_cube = self._make_test_cube( + # Make the Y dimension longer to make irregularity is possible. + y_points=[7.0, 8.0, 9.0], + coord_units="m", + ) + coord_lon = test_cube.coord("longitude") + coord_lat = test_cube.coord("latitude") + if x: + test_cube.replace_coord(irregular_coord(coord_lon)) + if y: + test_cube.replace_coord(irregular_coord(coord_lat)) + + message = "Irregular coordinates not supported" + with self.assertRaisesRegex(TranslationError, message): + grid_definition_template_20(test_cube, self.mock_grib) + + def test__fail_irregular_x_coords(self): + self.__fail_irregular_coords(x=True) + + def test__fail_irregular_y_coords(self): + self.__fail_irregular_coords(y=True) + + def test__fail_irregular_coords(self): + self.__fail_irregular_coords(x=True, y=True) + + def test__fail_non_identical_lats(self): + coord_system = PolarStereographic( + 90.0, + 0, + true_scale_lat=60.0, + ellipsoid=self.default_ellipsoid, + ) + test_cube = self._make_test_cube(cs=coord_system, coord_units="m") + message = "only write a GRIB Template 3.20 file where these are identical" + with self.assertRaisesRegex(TranslationError, message): + grid_definition_template_20(test_cube, self.mock_grib) + + def test__fail_scale_factor(self): + coord_system = PolarStereographic( + 90.0, + 0, + scale_factor_at_projection_origin=0.5, + ellipsoid=self.default_ellipsoid, + ) + test_cube = self._make_test_cube(cs=coord_system, coord_units="m") + message = "cannot write scale_factor_at_projection_origin" + with self.assertRaisesRegex(TranslationError, message): + grid_definition_template_20(test_cube, self.mock_grib) + + +if __name__ == "__main__": + tests.main() diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_30.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_30.py index 38a5cad9..96a02b02 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_template_30.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_30.py @@ -15,6 +15,7 @@ import iris.coords from iris.coord_systems import GeogCS, LambertConformal +from iris.exceptions import TranslationError from iris_grib._save_rules import grid_definition_template_30 from iris_grib.tests.unit.save_rules import GdtTestMixin @@ -53,12 +54,12 @@ def _make_test_cube(self, cs=None, x_points=None, y_points=None): test_cube.add_dim_coord(x_coord, 1) return test_cube - def _default_coord_system(self): + def _default_coord_system(self, false_easting=0.0, false_northing=0.0): return LambertConformal( central_lat=39.0, central_lon=-96.0, - false_easting=0.0, - false_northing=0.0, + false_easting=false_easting, + false_northing=false_northing, secant_latitudes=(33, 45), ellipsoid=self.default_ellipsoid, ) @@ -126,7 +127,55 @@ def test_projection_centre_south_pole(self): ) test_cube = self._make_test_cube(cs=cs) grid_definition_template_30(test_cube, self.mock_grib) - self._check_key("projectionCentreFlag", 1) + self._check_key("projectionCentreFlag", 128) + + def __fail_false_easting_northing(self, false_easting, false_northing): + cs = self._default_coord_system( + false_easting=false_easting, false_northing=false_northing + ) + test_cube = self._make_test_cube(cs=cs) + message = "Non-zero unsupported" + with self.assertRaisesRegex(TranslationError, message): + grid_definition_template_30(test_cube, self.mock_grib) + + def test__fail_false_easting(self): + self.__fail_false_easting_northing(10.0, 0.0) + + def test__fail_false_northing(self): + self.__fail_false_easting_northing(0.0, 10.0) + + def test__fail_false_easting_northing(self): + self.__fail_false_easting_northing(10.0, 10.0) + + def __fail_irregular_coords(self, x=False, y=False): + def irregular_coord(coord): + coord = iris.coords.AuxCoord.from_coord(coord) + coord.points[1] = coord.points[0] + return coord + + test_cube = self._make_test_cube( + # Make the Y dimension longer to make irregularity is possible. + y_points=[7.0, 8.0, 9.0], + ) + coord_x = test_cube.coord("projection_x_coordinate") + coord_y = test_cube.coord("projection_y_coordinate") + if x: + test_cube.replace_coord(irregular_coord(coord_x)) + if y: + test_cube.replace_coord(irregular_coord(coord_y)) + + message = "Irregular coordinates not supported" + with self.assertRaisesRegex(TranslationError, message): + grid_definition_template_30(test_cube, self.mock_grib) + + def test__fail_irregular_x_coords(self): + self.__fail_irregular_coords(x=True) + + def test__fail_irregular_y_coords(self): + self.__fail_irregular_coords(y=True) + + def test__fail_irregular_coords(self): + self.__fail_irregular_coords(x=True, y=True) if __name__ == "__main__": From 9caffa1f819b0df977aca381c5a85e02ef3a4c97 Mon Sep 17 00:00:00 2001 From: Bill Little Date: Fri, 19 Apr 2024 15:35:13 +0100 Subject: [PATCH 289/583] Update readme (#440) * update readme * update readme --------- Co-authored-by: stephenworsley <49274989+stephenworsley@users.noreply.github.com> --- README.md | 42 ++++++++++ README.rst | 29 ------- docs/_static/iris-logo-title-dark.svg | 108 ++++++++++++++++++++++++++ docs/_static/iris-logo-title.svg | 108 ++++++++++++++++++++++++++ pyproject.toml | 2 +- 5 files changed, 259 insertions(+), 30 deletions(-) create mode 100644 README.md delete mode 100644 README.rst create mode 100644 docs/_static/iris-logo-title-dark.svg create mode 100644 docs/_static/iris-logo-title.svg diff --git a/README.md b/README.md new file mode 100644 index 00000000..d6989dab --- /dev/null +++ b/README.md @@ -0,0 +1,42 @@ +

        + GRIB (GRIdded Binary) interface for Iris +

        + +| | | +|------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| ⚙️ CI | [![ci-manifest](https://github.com/SciTools/iris-grib/actions/workflows/ci-manifest.yml/badge.svg)](https://github.com/SciTools/iris-grib/actions/workflows/ci-manifest.yml) [![ci-tests](https://github.com/SciTools/iris-grib/actions/workflows/ci-tests.yml/badge.svg)](https://github.com/SciTools/iris-grib/actions/workflows/ci-tests.yml) [![pre-commit](https://results.pre-commit.ci/badge/github/SciTools/iris-grib/main.svg)](https://results.pre-commit.ci/latest/github/SciTools/iris-grib/main) | +| 💬 Community | [![GH Discussions](https://img.shields.io/badge/github-discussions%20%F0%9F%92%AC-yellow?logo=github&logoColor=lightgrey)](https://github.com/SciTools/iris-grib/discussions) | +| 📖 Documentation | [![rtd](https://readthedocs.org/projects/iris-grib/badge/?version=latest)](https://iris-grib.readthedocs.io/en/latest/?badge=latest) | +| 📈 Health | [![coveralls](https://coveralls.io/repos/github/SciTools/iris-grib/badge.svg?branch=main)](https://coveralls.io/github/SciTools/iris-grib?branch=main) | +| ✨ Meta | [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff) [![NEP29](https://raster.shields.io/badge/follows-NEP29-orange.png)](https://numpy.org/neps/nep-0029-deprecation_policy.html) [![license - bds-3-clause](https://img.shields.io/github/license/SciTools/iris-grib)](https://github.com/SciTools/iris-grib/blob/main/LICENSE) [![conda platform](https://img.shields.io/conda/pn/conda-forge/iris-grib.svg)](https://anaconda.org/conda-forge/iris-grib) | +| 📦 Package | [![conda-forge](https://img.shields.io/conda/vn/conda-forge/iris-grib?color=orange&label=conda-forge&logo=conda-forge&logoColor=white)](https://anaconda.org/conda-forge/iris-grib) [![pypi](https://img.shields.io/pypi/v/iris-grib?color=orange&label=pypi&logo=python&logoColor=white)](https://pypi.org/project/iris-grib/) [![pypi - python version](https://img.shields.io/pypi/pyversions/iris-grib.svg?color=orange&logo=python&label=python&logoColor=white)](https://pypi.org/project/iris-grib/) | +| 🧰 Repo | [![commits-since](https://img.shields.io/github/commits-since/SciTools/iris-grib/latest.svg)](https://github.com/SciTools/iris-grib/commits/main) [![contributors](https://img.shields.io/github/contributors/SciTools/iris-grib)](https://github.com/SciTools/iris-grib/graphs/contributors) [![release](https://img.shields.io/github/v/release/scitools/iris-grib)](https://github.com/SciTools/iris-grib/releases) | +| | + +

        +For documentation see the +latest +developer version or the most recent released +stable version. +

        + +## [#ShowYourStripes](https://showyourstripes.info/s/globe) + +

        + + #showyourstripes Global 1850-2021 +

        + +**Graphics and Lead Scientist**: [Ed Hawkins](https://www.met.reading.ac.uk/~ed/home/index.php), National Centre for Atmospheric Science, University of Reading. + +**Data**: Berkeley Earth, NOAA, UK Met Office, MeteoSwiss, DWD, SMHI, UoR, Meteo France & ZAMG. + +

        +#ShowYourStripes is distributed under a +Creative Commons Attribution 4.0 International License + + creative-commons-by +

        + diff --git a/README.rst b/README.rst deleted file mode 100644 index fb0c6d94..00000000 --- a/README.rst +++ /dev/null @@ -1,29 +0,0 @@ -iris-grib -========= - -|CirrusCI|_ |Coveralls|_ |conda-forge|_ |pypi|_ |License|_ |Commits|_ |Contributors|_ - -GRIB interface for `Iris `_. - -iris-grib is licensed under the BSD-3 license. - -.. |CirrusCI| image:: https://api.cirrus-ci.com/github/SciTools/iris-grib.svg?branch=main -.. _CirrusCI: https://cirrus-ci.com/github/SciTools/iris-grib - -.. |Coveralls| image:: https://coveralls.io/repos/github/SciTools/iris-grib/badge.svg?branch=main -.. _Coveralls: https://coveralls.io/github/SciTools/iris-grib?branch=main - -.. |conda-forge| image:: https://img.shields.io/conda/vn/conda-forge/iris-grib?color=orange&label=conda-forge&logo=conda-forge&logoColor=white -.. _conda-forge: https://anaconda.org/conda-forge/iris-grib - -.. |pypi| image:: https://img.shields.io/pypi/v/iris-grib?color=orange&label=pypi&logo=python&logoColor=white -.. _pypi: https://pypi.org/project/iris-grib - -.. |License| image:: https://img.shields.io/badge/BSD-3?style=plastic&label=License -.. _License: https://github.com/SciTools/iris-grib/blob/main/LICENSE - -.. |Contributors| image:: https://img.shields.io/github/contributors/SciTools/iris-grib?style=plastic -.. _Contributors: https://github.com/SciTools/iris-grib/graphs/contributors - -.. |Commits| image:: https://img.shields.io/github/commits-since/SciTools/iris-grib/latest.svg?style=plastic -.. _Commits: https://github.com/SciTools/iris-grib/commits/main diff --git a/docs/_static/iris-logo-title-dark.svg b/docs/_static/iris-logo-title-dark.svg new file mode 100644 index 00000000..44d8a3bb --- /dev/null +++ b/docs/_static/iris-logo-title-dark.svg @@ -0,0 +1,108 @@ + + \ No newline at end of file diff --git a/docs/_static/iris-logo-title.svg b/docs/_static/iris-logo-title.svg new file mode 100644 index 00000000..f1e7e236 --- /dev/null +++ b/docs/_static/iris-logo-title.svg @@ -0,0 +1,108 @@ + + \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index b4ef9cea..41cf7284 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -60,7 +60,7 @@ license-files = ["LICENSE"] [tool.setuptools.dynamic] dependencies = {file = "requirements/core.txt"} -readme = {file = "README.rst", content-type = "text/x-rst"} +readme = {file = "README.md", content-type = "text/markdown"} optional-dependencies.all = {file = "requirements/all.txt"} optional-dependencies.test = {file = "requirements/test.txt"} From bdcfe1d95141df6de29038051f59a3cb3612eddf Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Sat, 20 Apr 2024 13:14:34 +0100 Subject: [PATCH 290/583] Updated environment lockfiles (#448) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 3 +-- requirements/locks/py311-linux-64.lock | 7 +++---- requirements/locks/py39-linux-64.lock | 3 +-- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index c4c6f495..3108a123 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -144,7 +144,7 @@ https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.0.4-pyhd8ed1ab_1.conda#a1986ad21c766ff22f7bae93f0641020 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py310h1f7b6fc_0.conda#31beda75384647959d5792a1a7dc571a https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py310hd41b1e2_0.conda#60ee50b1968f802f2a487ba36d4cce0d -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.4.1-pyhd8ed1ab_0.conda#52387f00fee8dcd5cf75f8886025293f +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.4.2-pyhd8ed1ab_0.conda#bb4e6c52855aa64a5443ca4eedaa6cfe https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.3-he6dfbbe_0.conda#05c1609de571f7a9a40e6d7d4116c21a https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py310h2372a71_1.conda#dfcf64f67961eb9686676f96fdb4b4d1 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py310hb13e2d6_0.conda#512cfc0369e247e3993a76030671cce0 @@ -157,4 +157,3 @@ https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py310hba70d5 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py310hcc13569_0.conda#89a13de526ea3008341e3a2aeab4da7e https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.0-py310h1f7b6fc_1.conda#f020ac07b7df9c4b0bd0ece3055b5bd2 https://conda.anaconda.org/conda-forge/noarch/iris-3.8.1-pyha770c72_0.conda#b08a116ef1607e7e960a4caa902e3a90 - diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 06177d00..e60a1822 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -70,7 +70,7 @@ https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_h413a1c8_0.conda#a356024784da6dfd4683dc5ecf45b155 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda#66f03896ffbe1a110ffda05c7a856504 -https://conda.anaconda.org/conda-forge/linux-64/python-3.11.8-hab00c5b_0_cpython.conda#2fdc314ee058eda0114738a9309d3683 +https://conda.anaconda.org/conda-forge/linux-64/python-3.11.9-hb806964_0_cpython.conda#ac68acfa8b558ed406c75e98d3428d7b https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.3-h2c6b66d_0.conda#be7d70f2db41b674733667bdd69bd000 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-h8ee46fc_0.conda#077b6e8ad6a3ddb741fce2496dd01bec @@ -151,7 +151,7 @@ https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.0.4-pyhd8ed1ab_1.conda#a1986ad21c766ff22f7bae93f0641020 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py311h1f0f07a_0.conda#b7e6d52b39e199238c3400cafaabafb3 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py311h9547e67_0.conda#74ad0ae64f1ef565e27eda87fa749e84 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.4.1-pyhd8ed1ab_0.conda#52387f00fee8dcd5cf75f8886025293f +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.4.2-pyhd8ed1ab_0.conda#bb4e6c52855aa64a5443ca4eedaa6cfe https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.3-he6dfbbe_0.conda#05c1609de571f7a9a40e6d7d4116c21a https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py311h459d7ec_1.conda#45b8d355bbcdd27588c2d266bcfdff84 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py311h64a7726_0.conda#d443c70b4a05f50236c70b9c79beff64 @@ -170,6 +170,5 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.5-pyhd8 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jquery-4.1-pyhd8ed1ab_0.conda#914897066d5873acfb13e75705276ad1 https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-2.0.0-pyha770c72_0.conda#baf6d9a33df1a789ca55e3b404c7ea28 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.7-pyhd8ed1ab_0.conda#26acae54b06f178681bfb551760f5dd1 -https://conda.anaconda.org/conda-forge/noarch/sphinx-7.3.5-pyhd8ed1ab_1.conda#519304a917d39ff828de7da4b6d21f54 +https://conda.anaconda.org/conda-forge/noarch/sphinx-7.3.7-pyhd8ed1ab_0.conda#7b1465205e28d75d2c0e1a868ee00a67 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda#e507335cb4ca9cff4c3d0fa9cdab255e - diff --git a/requirements/locks/py39-linux-64.lock b/requirements/locks/py39-linux-64.lock index a6e2a526..2ea6dacc 100644 --- a/requirements/locks/py39-linux-64.lock +++ b/requirements/locks/py39-linux-64.lock @@ -146,7 +146,7 @@ https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.0.4-pyhd8ed1ab_1.conda#a1986ad21c766ff22f7bae93f0641020 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py39h44dd56e_0.conda#baea2f5dfb3ab7b1c836385d2e1daca7 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py39h7633fee_0.conda#bdc188e59857d6efab332714e0d01d93 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.4.1-pyhd8ed1ab_0.conda#52387f00fee8dcd5cf75f8886025293f +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.4.2-pyhd8ed1ab_0.conda#bb4e6c52855aa64a5443ca4eedaa6cfe https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.3-he6dfbbe_0.conda#05c1609de571f7a9a40e6d7d4116c21a https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py39hd1e30aa_1.conda#ca63612907462c8e36edcc9bbacc253e https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py39h474f0d3_0.conda#46ae0ecba9726ab4fa44c78fefa522cf @@ -159,4 +159,3 @@ https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py39h4282601 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py39hddac248_0.conda#aa02350ccb542c83272f9cb7e4dfe15e https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.0-py39h44dd56e_1.conda#629e8d066a330f729d0085d86681fd01 https://conda.anaconda.org/conda-forge/noarch/iris-3.8.1-pyha770c72_0.conda#b08a116ef1607e7e960a4caa902e3a90 - From 384deb8e39a20e1b048b41f6c360ef75bc82cd61 Mon Sep 17 00:00:00 2001 From: Bill Little Date: Mon, 22 Apr 2024 10:11:32 +0100 Subject: [PATCH 291/583] add pre-commit.ci message (#439) Co-authored-by: Patrick Peglar --- .pre-commit-config.yaml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 9786d478..16f39f16 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,5 +1,12 @@ # See https://pre-commit.com for more information # See https://pre-commit.com/hooks.html for more hooks +# See https://pre-commit.ci/#configuration +# See https://github.com/scientific-python/cookie#sp-repo-review + +ci: + autofix_prs: false + autoupdate_commit_msg: "chore: update pre-commit hooks" + files: | (?x)( From f43d52f1d7c4c6db0166b26025390af27e3de7fa Mon Sep 17 00:00:00 2001 From: Bill Little Date: Mon, 22 Apr 2024 10:49:15 +0100 Subject: [PATCH 292/583] fix blacken-docs hook url (#438) Co-authored-by: Patrick Peglar --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 16f39f16..29ee057d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -52,7 +52,7 @@ repos: types_or: [asciidoc, python, markdown, rst] additional_dependencies: [tomli] -- repo: https://github.com/asottile/blacken-docs +- repo: https://github.com/adamchainz/blacken-docs rev: 1.16.0 hooks: - id: blacken-docs @@ -80,4 +80,4 @@ repos: # rev: v1.7.0 # hooks: # - id: numpydoc-validation -# types: [file, python] \ No newline at end of file +# types: [file, python] From 11cc99a373783c1229ca24bd60364e734b221276 Mon Sep 17 00:00:00 2001 From: Bill Little Date: Mon, 22 Apr 2024 11:10:14 +0100 Subject: [PATCH 293/583] pep517: remove wheel dependency from build-system (#437) Co-authored-by: Patrick Peglar --- pyproject.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 41cf7284..fc43fd33 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,7 +5,6 @@ requires = [ "setuptools>=64", "setuptools_scm>=7.0", - "wheel", ] # Defined by PEP 517 build-backend = "setuptools.build_meta" From b3e3103c8e670e6e66663802e5e8d40f689052b1 Mon Sep 17 00:00:00 2001 From: Bill Little Date: Mon, 22 Apr 2024 12:56:50 +0100 Subject: [PATCH 294/583] add iris grib logo to readme (#447) --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index d6989dab..32fb3a20 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,9 @@ +

        + + Iris GRIB
        +

        + +

        GRIB (GRIdded Binary) interface for Iris

        From 8e538760f1d9ffca2cdc36a8fafdc87f9a50f82e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 22 Apr 2024 20:13:17 +0100 Subject: [PATCH 295/583] chore: update pre-commit hooks (#451) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.3.4 → v0.4.1](https://github.com/astral-sh/ruff-pre-commit/compare/v0.3.4...v0.4.1) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 29ee057d..f464207c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -37,7 +37,7 @@ repos: - id: no-commit-to-branch - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.3.4" + rev: "v0.4.1" hooks: - id: ruff types: [file, python] From e57dac079591b978806e55c7450b61d62b9342f5 Mon Sep 17 00:00:00 2001 From: Bill Little Date: Tue, 23 Apr 2024 10:15:51 +0100 Subject: [PATCH 296/583] Migrate iris_grib to src/iris_grib (#450) * migrate to src * update configs for src * bump setuptools-scm --- .pre-commit-config.yaml | 3 +-- MANIFEST.in | 2 +- pyproject.toml | 15 ++++++++------- {iris_grib => src/iris_grib}/__init__.py | 0 .../iris_grib}/_grib1_load_rules.py | 0 {iris_grib => src/iris_grib}/_grib_cf_map.py | 0 {iris_grib => src/iris_grib}/_load_convert.py | 0 {iris_grib => src/iris_grib}/_save_rules.py | 0 .../grib_phenom_translation/__init__.py | 0 .../grib_phenom_translation/_gribcode.py | 0 {iris_grib => src/iris_grib}/message.py | 0 {iris_grib => src/iris_grib}/tests/__init__.py | 0 .../iris_grib}/tests/integration/__init__.py | 0 .../tests/integration/format_interop/__init__.py | 0 .../integration/format_interop/test_name_grib.py | 0 .../integration/format_interop/test_pp_grib.py | 0 .../integration/iris_integration/__init__.py | 0 .../iris_integration/test_callback.py | 0 .../iris_integration/test_pickle_message.py | 0 .../tests/integration/load_convert/__init__.py | 0 .../load_convert/test_data_section.py | 0 .../load_convert/test_load_hybrid_coords.py | 0 .../test_product_definition_section.py | 0 .../load_convert/test_sample_file_loads.py | 0 .../tests/integration/round_trip/__init__.py | 0 .../round_trip/test_WAFC_mapping_round_trip.py | 0 .../round_trip/test_grid_definition_section.py | 0 .../round_trip/test_hybrid_coords_round_trip.py | 0 .../test_product_definition_section.py | 0 .../tests/integration/save_rules/__init__.py | 0 .../integration/save_rules/test_grib_save.py | 0 .../save_rules/test_grid_definition_section.py | 0 .../save_rules/test_save_hybrid_coords.py | 0 .../callback/TestCallbacks/load_callback.cml | 0 .../grid_complex_spatial_differencing.cml | 0 ...grid_complex_spatial_differencing.data.0.json | 0 .../data_representation__no_bitsPerValue.cml | 0 .../data_section/TestGDT30/lambert.cml | 0 .../data_section/TestGDT30/lambert.data.0.json | 0 .../data_section/TestGDT40/reduced.cml | 0 .../data_section/TestGDT40/reduced.data.0.json | 0 .../data_section/TestGDT40/regular.cml | 0 .../data_section/TestGDT40/regular.data.0.json | 0 .../data_section/TestImport/gdt1.cml | 0 .../data_section/TestImport/gdt1.data.0.json | 0 .../TestImport/gdt90_with_bitmap.cml | 0 .../TestImport/gdt90_with_bitmap.data.0.json | 0 .../load_convert/sample_file_loads/3_layer.cml | 0 .../sample_file_loads/earth_shape_0.cml | 0 .../sample_file_loads/earth_shape_1.cml | 0 .../sample_file_loads/earth_shape_2.cml | 0 .../sample_file_loads/earth_shape_3.cml | 0 .../sample_file_loads/earth_shape_4.cml | 0 .../sample_file_loads/earth_shape_5.cml | 0 .../sample_file_loads/earth_shape_6.cml | 0 .../sample_file_loads/earth_shape_7.cml | 0 .../sample_file_loads/earth_shape_grib1.cml | 0 .../load_convert/sample_file_loads/ineg_jneg.cml | 0 .../load_convert/sample_file_loads/ineg_jpos.cml | 0 .../load_convert/sample_file_loads/ipos_jneg.cml | 0 .../load_convert/sample_file_loads/ipos_jpos.cml | 0 .../sample_file_loads/lambert_grib1.cml | 0 .../sample_file_loads/lambert_grib2.cml | 0 .../sample_file_loads/missing_values_grib2.cml | 0 .../sample_file_loads/polar_stereo_grib1.cml | 0 .../sample_file_loads/reduced_gg_grib2.cml | 0 .../sample_file_loads/reduced_ll_grib1.cml | 0 .../sample_file_loads/regular_gg_grib1.cml | 0 .../sample_file_loads/regular_gg_grib2.cml | 0 .../load_convert/sample_file_loads/rotated.cml | 0 .../sample_file_loads/time_bound_grib1.cml | 0 .../sample_file_loads/time_bound_grib2.cml | 0 .../NAMEII/0_TRACER_AIR_CONCENTRATION.cml | 0 .../name_grib/NAMEII/1_TRACER_DOSAGE.cml | 0 .../name_grib/NAMEII/3_TRACER_DRY_DEPOSITION.cml | 0 .../NAMEII/4_TRACER_TOTAL_DEPOSITION.cml | 0 .../NAMEIII/0_TRACER_AIR_CONCENTRATION.cml | 0 .../NAMEIII/1_TRACER_AIR_CONCENTRATION.cml | 0 .../NAMEIII/2_TRACER_DRY_DEPOSITION.cml | 0 .../NAMEIII/3_TRACER_WET_DEPOSITION.cml | 0 .../name_grib/NAMEIII/4_TRACER_DEPOSITION.cml | 0 .../unit/load_cubes/load_cubes/reduced_raw.cml | 0 .../iris_grib}/tests/test_license_headers.py | 0 .../tests/testdata/CAT_T+24_0600.grib2 | Bin .../iris_grib}/tests/testdata/CB_T+24_0600.grib2 | Bin .../tests/testdata/ICING_T+24_0600.grib2 | Bin .../tests/testdata/INCLDTURB_T+24_0600.grib2 | Bin .../testdata/faked_sample_hh_grib_data.grib2 | Bin .../testdata/faked_sample_hp_grib_data.grib2 | Bin .../iris_grib}/tests/testdata/hybrid_height.nc | Bin .../iris_grib}/tests/testdata/hybrid_pressure.nc | Bin .../iris_grib}/tests/unit/__init__.py | 0 .../tests/unit/grib1_load_rules/__init__.py | 0 .../unit/grib1_load_rules/test_grib1_convert.py | 0 .../test_grib1_load_translations.py | 0 .../unit/grib_phenom_translation/__init__.py | 0 .../test_grib_phenom_translation.py | 0 .../tests/unit/load_convert/__init__.py | 0 .../unit/load_convert/test__hindcast_fix.py | 0 .../unit/load_convert/test_bitmap_section.py | 0 .../load_convert/test_calculate_increment.py | 0 .../tests/unit/load_convert/test_convert.py | 0 .../tests/unit/load_convert/test_data_cutoff.py | 0 .../test_data_representation_section.py | 0 .../tests/unit/load_convert/test_ellipsoid.py | 0 .../unit/load_convert/test_ellipsoid_geometry.py | 0 .../load_convert/test_ensemble_identifier.py | 0 .../load_convert/test_forecast_period_coord.py | 0 .../unit/load_convert/test_generating_process.py | 0 .../unit/load_convert/test_grib2_convert.py | 0 .../test_grid_definition_template_0_and_1.py | 0 .../test_grid_definition_template_10.py | 0 .../test_grid_definition_template_12.py | 0 .../test_grid_definition_template_140.py | 0 .../test_grid_definition_template_20.py | 0 .../test_grid_definition_template_30.py | 0 .../test_grid_definition_template_40.py | 0 .../test_grid_definition_template_4_and_5.py | 0 .../test_grid_definition_template_5.py | 0 .../test_grid_definition_template_90.py | 0 .../unit/load_convert/test_other_time_coord.py | 0 .../test_product_definition_section.py | 0 .../test_product_definition_template_0.py | 0 .../test_product_definition_template_1.py | 0 .../test_product_definition_template_10.py | 0 .../test_product_definition_template_11.py | 0 .../test_product_definition_template_15.py | 0 .../test_product_definition_template_31.py | 0 .../test_product_definition_template_32.py | 0 .../test_product_definition_template_40.py | 0 .../test_product_definition_template_6.py | 0 .../test_product_definition_template_8.py | 0 .../test_product_definition_template_9.py | 0 .../unit/load_convert/test_projection_centre.py | 0 .../load_convert/test_reference_time_coord.py | 0 .../unit/load_convert/test_resolution_flags.py | 0 .../unit/load_convert/test_satellite_common.py | 0 .../unit/load_convert/test_scanning_mode.py | 0 .../load_convert/test_statistical_cell_method.py | 0 .../test_statistical_forecast_period_coord.py | 0 .../unit/load_convert/test_time_range_unit.py | 0 .../load_convert/test_translate_phenomenon.py | 0 .../tests/unit/load_convert/test_unscale.py | 0 .../load_convert/test_validity_time_coord.py | 0 .../unit/load_convert/test_vertical_coords.py | 0 .../iris_grib}/tests/unit/message/__init__.py | 0 .../tests/unit/message/test_GribMessage.py | 0 .../tests/unit/message/test_Section.py | 0 .../tests/unit/message/test__DataProxy.py | 0 .../tests/unit/message/test__MessageLocation.py | 0 .../tests/unit/message/test__RawGribMessage.py | 0 .../iris_grib}/tests/unit/save_rules/__init__.py | 0 .../save_rules/test__missing_forecast_period.py | 0 .../test__non_missing_forecast_period.py | 0 ...t__product_definition_template_8_10_and_11.py | 0 .../tests/unit/save_rules/test_data_section.py | 0 .../test_grid_definition_template_0.py | 0 .../test_grid_definition_template_1.py | 0 .../test_grid_definition_template_10.py | 0 .../test_grid_definition_template_12.py | 0 .../test_grid_definition_template_140.py | 0 .../test_grid_definition_template_20.py | 0 .../test_grid_definition_template_30.py | 0 .../test_grid_definition_template_4.py | 0 .../test_grid_definition_template_5.py | 0 .../tests/unit/save_rules/test_identification.py | 0 .../test_product_definition_template_1.py | 0 .../test_product_definition_template_10.py | 0 .../test_product_definition_template_11.py | 0 .../test_product_definition_template_15.py | 0 .../test_product_definition_template_40.py | 0 .../test_product_definition_template_6.py | 0 .../test_product_definition_template_8.py | 0 .../tests/unit/save_rules/test_reference_time.py | 0 .../test_set_discipline_and_parameter.py | 0 .../unit/save_rules/test_set_fixed_surfaces.py | 0 .../unit/save_rules/test_set_time_increment.py | 0 .../tests/unit/save_rules/test_set_time_range.py | 0 .../iris_grib}/tests/unit/test_GribWrapper.py | 0 .../iris_grib}/tests/unit/test__load_generate.py | 0 .../iris_grib}/tests/unit/test_load_cubes.py | 0 .../tests/unit/test_load_pairs_from_fields.py | 0 .../iris_grib}/tests/unit/test_save_grib2.py | 0 .../iris_grib}/tests/unit/test_save_messages.py | 0 184 files changed, 10 insertions(+), 10 deletions(-) rename {iris_grib => src/iris_grib}/__init__.py (100%) rename {iris_grib => src/iris_grib}/_grib1_load_rules.py (100%) rename {iris_grib => src/iris_grib}/_grib_cf_map.py (100%) rename {iris_grib => src/iris_grib}/_load_convert.py (100%) rename {iris_grib => src/iris_grib}/_save_rules.py (100%) rename {iris_grib => src/iris_grib}/grib_phenom_translation/__init__.py (100%) rename {iris_grib => src/iris_grib}/grib_phenom_translation/_gribcode.py (100%) rename {iris_grib => src/iris_grib}/message.py (100%) rename {iris_grib => src/iris_grib}/tests/__init__.py (100%) rename {iris_grib => src/iris_grib}/tests/integration/__init__.py (100%) rename {iris_grib => src/iris_grib}/tests/integration/format_interop/__init__.py (100%) rename {iris_grib => src/iris_grib}/tests/integration/format_interop/test_name_grib.py (100%) rename {iris_grib => src/iris_grib}/tests/integration/format_interop/test_pp_grib.py (100%) rename {iris_grib => src/iris_grib}/tests/integration/iris_integration/__init__.py (100%) rename {iris_grib => src/iris_grib}/tests/integration/iris_integration/test_callback.py (100%) rename {iris_grib => src/iris_grib}/tests/integration/iris_integration/test_pickle_message.py (100%) rename {iris_grib => src/iris_grib}/tests/integration/load_convert/__init__.py (100%) rename {iris_grib => src/iris_grib}/tests/integration/load_convert/test_data_section.py (100%) rename {iris_grib => src/iris_grib}/tests/integration/load_convert/test_load_hybrid_coords.py (100%) rename {iris_grib => src/iris_grib}/tests/integration/load_convert/test_product_definition_section.py (100%) rename {iris_grib => src/iris_grib}/tests/integration/load_convert/test_sample_file_loads.py (100%) rename {iris_grib => src/iris_grib}/tests/integration/round_trip/__init__.py (100%) rename {iris_grib => src/iris_grib}/tests/integration/round_trip/test_WAFC_mapping_round_trip.py (100%) rename {iris_grib => src/iris_grib}/tests/integration/round_trip/test_grid_definition_section.py (100%) rename {iris_grib => src/iris_grib}/tests/integration/round_trip/test_hybrid_coords_round_trip.py (100%) rename {iris_grib => src/iris_grib}/tests/integration/round_trip/test_product_definition_section.py (100%) rename {iris_grib => src/iris_grib}/tests/integration/save_rules/__init__.py (100%) rename {iris_grib => src/iris_grib}/tests/integration/save_rules/test_grib_save.py (100%) rename {iris_grib => src/iris_grib}/tests/integration/save_rules/test_grid_definition_section.py (100%) rename {iris_grib => src/iris_grib}/tests/integration/save_rules/test_save_hybrid_coords.py (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/iris_integration/callback/TestCallbacks/load_callback.cml (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/load_convert/data_section/TestDRT3/grid_complex_spatial_differencing.cml (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/load_convert/data_section/TestDRT3/grid_complex_spatial_differencing.data.0.json (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/load_convert/data_section/TestDataProxy/data_representation__no_bitsPerValue.cml (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/load_convert/data_section/TestGDT30/lambert.cml (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/load_convert/data_section/TestGDT30/lambert.data.0.json (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/load_convert/data_section/TestGDT40/reduced.cml (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/load_convert/data_section/TestGDT40/reduced.data.0.json (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/load_convert/data_section/TestGDT40/regular.cml (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/load_convert/data_section/TestGDT40/regular.data.0.json (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/load_convert/data_section/TestImport/gdt1.cml (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/load_convert/data_section/TestImport/gdt1.data.0.json (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/load_convert/data_section/TestImport/gdt90_with_bitmap.cml (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/load_convert/data_section/TestImport/gdt90_with_bitmap.data.0.json (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/load_convert/sample_file_loads/3_layer.cml (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/load_convert/sample_file_loads/earth_shape_0.cml (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/load_convert/sample_file_loads/earth_shape_1.cml (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/load_convert/sample_file_loads/earth_shape_2.cml (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/load_convert/sample_file_loads/earth_shape_3.cml (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/load_convert/sample_file_loads/earth_shape_4.cml (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/load_convert/sample_file_loads/earth_shape_5.cml (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/load_convert/sample_file_loads/earth_shape_6.cml (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/load_convert/sample_file_loads/earth_shape_7.cml (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/load_convert/sample_file_loads/earth_shape_grib1.cml (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/load_convert/sample_file_loads/ineg_jneg.cml (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/load_convert/sample_file_loads/ineg_jpos.cml (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/load_convert/sample_file_loads/ipos_jneg.cml (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/load_convert/sample_file_loads/ipos_jpos.cml (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/load_convert/sample_file_loads/lambert_grib1.cml (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/load_convert/sample_file_loads/lambert_grib2.cml (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/load_convert/sample_file_loads/missing_values_grib2.cml (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/load_convert/sample_file_loads/polar_stereo_grib1.cml (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/load_convert/sample_file_loads/reduced_gg_grib2.cml (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/load_convert/sample_file_loads/reduced_ll_grib1.cml (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/load_convert/sample_file_loads/regular_gg_grib1.cml (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/load_convert/sample_file_loads/regular_gg_grib2.cml (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/load_convert/sample_file_loads/rotated.cml (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/load_convert/sample_file_loads/time_bound_grib1.cml (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/load_convert/sample_file_loads/time_bound_grib2.cml (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/name_grib/NAMEII/0_TRACER_AIR_CONCENTRATION.cml (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/name_grib/NAMEII/1_TRACER_DOSAGE.cml (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/name_grib/NAMEII/3_TRACER_DRY_DEPOSITION.cml (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/name_grib/NAMEII/4_TRACER_TOTAL_DEPOSITION.cml (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/name_grib/NAMEIII/0_TRACER_AIR_CONCENTRATION.cml (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/name_grib/NAMEIII/1_TRACER_AIR_CONCENTRATION.cml (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/name_grib/NAMEIII/2_TRACER_DRY_DEPOSITION.cml (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/name_grib/NAMEIII/3_TRACER_WET_DEPOSITION.cml (100%) rename {iris_grib => src/iris_grib}/tests/results/integration/name_grib/NAMEIII/4_TRACER_DEPOSITION.cml (100%) rename {iris_grib => src/iris_grib}/tests/results/unit/load_cubes/load_cubes/reduced_raw.cml (100%) rename {iris_grib => src/iris_grib}/tests/test_license_headers.py (100%) rename {iris_grib => src/iris_grib}/tests/testdata/CAT_T+24_0600.grib2 (100%) rename {iris_grib => src/iris_grib}/tests/testdata/CB_T+24_0600.grib2 (100%) rename {iris_grib => src/iris_grib}/tests/testdata/ICING_T+24_0600.grib2 (100%) rename {iris_grib => src/iris_grib}/tests/testdata/INCLDTURB_T+24_0600.grib2 (100%) rename {iris_grib => src/iris_grib}/tests/testdata/faked_sample_hh_grib_data.grib2 (100%) rename {iris_grib => src/iris_grib}/tests/testdata/faked_sample_hp_grib_data.grib2 (100%) rename {iris_grib => src/iris_grib}/tests/testdata/hybrid_height.nc (100%) rename {iris_grib => src/iris_grib}/tests/testdata/hybrid_pressure.nc (100%) rename {iris_grib => src/iris_grib}/tests/unit/__init__.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/grib1_load_rules/__init__.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/grib1_load_rules/test_grib1_convert.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/grib1_load_rules/test_grib1_load_translations.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/grib_phenom_translation/__init__.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/grib_phenom_translation/test_grib_phenom_translation.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/__init__.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test__hindcast_fix.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test_bitmap_section.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test_calculate_increment.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test_convert.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test_data_cutoff.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test_data_representation_section.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test_ellipsoid.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test_ellipsoid_geometry.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test_ensemble_identifier.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test_forecast_period_coord.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test_generating_process.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test_grib2_convert.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test_grid_definition_template_0_and_1.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test_grid_definition_template_10.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test_grid_definition_template_12.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test_grid_definition_template_140.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test_grid_definition_template_20.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test_grid_definition_template_30.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test_grid_definition_template_40.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test_grid_definition_template_4_and_5.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test_grid_definition_template_5.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test_grid_definition_template_90.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test_other_time_coord.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test_product_definition_section.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test_product_definition_template_0.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test_product_definition_template_1.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test_product_definition_template_10.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test_product_definition_template_11.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test_product_definition_template_15.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test_product_definition_template_31.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test_product_definition_template_32.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test_product_definition_template_40.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test_product_definition_template_6.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test_product_definition_template_8.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test_product_definition_template_9.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test_projection_centre.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test_reference_time_coord.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test_resolution_flags.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test_satellite_common.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test_scanning_mode.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test_statistical_cell_method.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test_statistical_forecast_period_coord.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test_time_range_unit.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test_translate_phenomenon.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test_unscale.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test_validity_time_coord.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/load_convert/test_vertical_coords.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/message/__init__.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/message/test_GribMessage.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/message/test_Section.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/message/test__DataProxy.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/message/test__MessageLocation.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/message/test__RawGribMessage.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/save_rules/__init__.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/save_rules/test__missing_forecast_period.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/save_rules/test__non_missing_forecast_period.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/save_rules/test__product_definition_template_8_10_and_11.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/save_rules/test_data_section.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/save_rules/test_grid_definition_template_0.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/save_rules/test_grid_definition_template_1.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/save_rules/test_grid_definition_template_10.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/save_rules/test_grid_definition_template_12.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/save_rules/test_grid_definition_template_140.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/save_rules/test_grid_definition_template_20.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/save_rules/test_grid_definition_template_30.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/save_rules/test_grid_definition_template_4.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/save_rules/test_grid_definition_template_5.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/save_rules/test_identification.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/save_rules/test_product_definition_template_1.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/save_rules/test_product_definition_template_10.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/save_rules/test_product_definition_template_11.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/save_rules/test_product_definition_template_15.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/save_rules/test_product_definition_template_40.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/save_rules/test_product_definition_template_6.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/save_rules/test_product_definition_template_8.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/save_rules/test_reference_time.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/save_rules/test_set_discipline_and_parameter.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/save_rules/test_set_fixed_surfaces.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/save_rules/test_set_time_increment.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/save_rules/test_set_time_range.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/test_GribWrapper.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/test__load_generate.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/test_load_cubes.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/test_load_pairs_from_fields.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/test_save_grib2.py (100%) rename {iris_grib => src/iris_grib}/tests/unit/test_save_messages.py (100%) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f464207c..05c15276 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,11 +11,10 @@ ci: files: | (?x)( noxfile\.py| - setup\.py| pyproject\.toml| docs\/.+\.py| benchmarks\/.+\.py| - iris_grib\/.+\.py + src\/.+\.py ) minimum_pre_commit_version: 1.21.0 diff --git a/MANIFEST.in b/MANIFEST.in index f0382ab2..d8e2ea0b 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -3,7 +3,7 @@ prune .nox prune docs prune requirements recursive-include requirements *.txt -recursive-include iris_grib *.cml *.grib2 *.json *.nc *.py +recursive-include src *.cml *.grib2 *.json *.nc *.py exclude .coveragerc exclude .flake8 diff --git a/pyproject.toml b/pyproject.toml index fc43fd33..34f41a93 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ # Defined by PEP 518 requires = [ "setuptools>=64", - "setuptools_scm>=7.0", + "setuptools_scm>=8.0", ] # Defined by PEP 517 build-backend = "setuptools.build_meta" @@ -65,9 +65,10 @@ optional-dependencies.test = {file = "requirements/test.txt"} [tool.setuptools.packages.find] include = ["iris_grib*"] +where = ["src"] [tool.setuptools_scm] -write_to = "iris_grib/_version.py" +write_to = "src/iris_grib/_version.py" local_scheme = "dirty-tag" version_scheme = "release-branch-semver" @@ -77,10 +78,10 @@ version_scheme = "release-branch-semver" # See https://coverage.readthedocs.io/en/latest/config.html branch = true source = [ - "iris_grib", + "src/iris_grib", ] omit = [ - "iris_grib/tests/*", + "src/iris_grib/tests/*", ] [tool.coverage.report] @@ -97,7 +98,7 @@ skip = "_build,*.css,*.ipynb,*.js,*.html,*.svg,*.xml,.git,generated" [tool.check-manifest] ignore = [ - "iris_grib/_version.py", + "src/iris_grib/_version.py", ] [tool.mypy] @@ -126,7 +127,7 @@ doctest_optionflags = "NORMALIZE_WHITESPACE ELLIPSIS NUMBER" log_cli = "True" log_cli_level = "INFO" minversion = "6.0" -testpaths = "iris_grib" +testpaths = "src/iris_grib" xfail_strict = "True" [tool.ruff] @@ -134,7 +135,7 @@ xfail_strict = "True" # https://docs.astral.sh/ruff/settings/#exclude line-length = 88 src = [ - "iris_grib", + "src", "docs", ] diff --git a/iris_grib/__init__.py b/src/iris_grib/__init__.py similarity index 100% rename from iris_grib/__init__.py rename to src/iris_grib/__init__.py diff --git a/iris_grib/_grib1_load_rules.py b/src/iris_grib/_grib1_load_rules.py similarity index 100% rename from iris_grib/_grib1_load_rules.py rename to src/iris_grib/_grib1_load_rules.py diff --git a/iris_grib/_grib_cf_map.py b/src/iris_grib/_grib_cf_map.py similarity index 100% rename from iris_grib/_grib_cf_map.py rename to src/iris_grib/_grib_cf_map.py diff --git a/iris_grib/_load_convert.py b/src/iris_grib/_load_convert.py similarity index 100% rename from iris_grib/_load_convert.py rename to src/iris_grib/_load_convert.py diff --git a/iris_grib/_save_rules.py b/src/iris_grib/_save_rules.py similarity index 100% rename from iris_grib/_save_rules.py rename to src/iris_grib/_save_rules.py diff --git a/iris_grib/grib_phenom_translation/__init__.py b/src/iris_grib/grib_phenom_translation/__init__.py similarity index 100% rename from iris_grib/grib_phenom_translation/__init__.py rename to src/iris_grib/grib_phenom_translation/__init__.py diff --git a/iris_grib/grib_phenom_translation/_gribcode.py b/src/iris_grib/grib_phenom_translation/_gribcode.py similarity index 100% rename from iris_grib/grib_phenom_translation/_gribcode.py rename to src/iris_grib/grib_phenom_translation/_gribcode.py diff --git a/iris_grib/message.py b/src/iris_grib/message.py similarity index 100% rename from iris_grib/message.py rename to src/iris_grib/message.py diff --git a/iris_grib/tests/__init__.py b/src/iris_grib/tests/__init__.py similarity index 100% rename from iris_grib/tests/__init__.py rename to src/iris_grib/tests/__init__.py diff --git a/iris_grib/tests/integration/__init__.py b/src/iris_grib/tests/integration/__init__.py similarity index 100% rename from iris_grib/tests/integration/__init__.py rename to src/iris_grib/tests/integration/__init__.py diff --git a/iris_grib/tests/integration/format_interop/__init__.py b/src/iris_grib/tests/integration/format_interop/__init__.py similarity index 100% rename from iris_grib/tests/integration/format_interop/__init__.py rename to src/iris_grib/tests/integration/format_interop/__init__.py diff --git a/iris_grib/tests/integration/format_interop/test_name_grib.py b/src/iris_grib/tests/integration/format_interop/test_name_grib.py similarity index 100% rename from iris_grib/tests/integration/format_interop/test_name_grib.py rename to src/iris_grib/tests/integration/format_interop/test_name_grib.py diff --git a/iris_grib/tests/integration/format_interop/test_pp_grib.py b/src/iris_grib/tests/integration/format_interop/test_pp_grib.py similarity index 100% rename from iris_grib/tests/integration/format_interop/test_pp_grib.py rename to src/iris_grib/tests/integration/format_interop/test_pp_grib.py diff --git a/iris_grib/tests/integration/iris_integration/__init__.py b/src/iris_grib/tests/integration/iris_integration/__init__.py similarity index 100% rename from iris_grib/tests/integration/iris_integration/__init__.py rename to src/iris_grib/tests/integration/iris_integration/__init__.py diff --git a/iris_grib/tests/integration/iris_integration/test_callback.py b/src/iris_grib/tests/integration/iris_integration/test_callback.py similarity index 100% rename from iris_grib/tests/integration/iris_integration/test_callback.py rename to src/iris_grib/tests/integration/iris_integration/test_callback.py diff --git a/iris_grib/tests/integration/iris_integration/test_pickle_message.py b/src/iris_grib/tests/integration/iris_integration/test_pickle_message.py similarity index 100% rename from iris_grib/tests/integration/iris_integration/test_pickle_message.py rename to src/iris_grib/tests/integration/iris_integration/test_pickle_message.py diff --git a/iris_grib/tests/integration/load_convert/__init__.py b/src/iris_grib/tests/integration/load_convert/__init__.py similarity index 100% rename from iris_grib/tests/integration/load_convert/__init__.py rename to src/iris_grib/tests/integration/load_convert/__init__.py diff --git a/iris_grib/tests/integration/load_convert/test_data_section.py b/src/iris_grib/tests/integration/load_convert/test_data_section.py similarity index 100% rename from iris_grib/tests/integration/load_convert/test_data_section.py rename to src/iris_grib/tests/integration/load_convert/test_data_section.py diff --git a/iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py b/src/iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py similarity index 100% rename from iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py rename to src/iris_grib/tests/integration/load_convert/test_load_hybrid_coords.py diff --git a/iris_grib/tests/integration/load_convert/test_product_definition_section.py b/src/iris_grib/tests/integration/load_convert/test_product_definition_section.py similarity index 100% rename from iris_grib/tests/integration/load_convert/test_product_definition_section.py rename to src/iris_grib/tests/integration/load_convert/test_product_definition_section.py diff --git a/iris_grib/tests/integration/load_convert/test_sample_file_loads.py b/src/iris_grib/tests/integration/load_convert/test_sample_file_loads.py similarity index 100% rename from iris_grib/tests/integration/load_convert/test_sample_file_loads.py rename to src/iris_grib/tests/integration/load_convert/test_sample_file_loads.py diff --git a/iris_grib/tests/integration/round_trip/__init__.py b/src/iris_grib/tests/integration/round_trip/__init__.py similarity index 100% rename from iris_grib/tests/integration/round_trip/__init__.py rename to src/iris_grib/tests/integration/round_trip/__init__.py diff --git a/iris_grib/tests/integration/round_trip/test_WAFC_mapping_round_trip.py b/src/iris_grib/tests/integration/round_trip/test_WAFC_mapping_round_trip.py similarity index 100% rename from iris_grib/tests/integration/round_trip/test_WAFC_mapping_round_trip.py rename to src/iris_grib/tests/integration/round_trip/test_WAFC_mapping_round_trip.py diff --git a/iris_grib/tests/integration/round_trip/test_grid_definition_section.py b/src/iris_grib/tests/integration/round_trip/test_grid_definition_section.py similarity index 100% rename from iris_grib/tests/integration/round_trip/test_grid_definition_section.py rename to src/iris_grib/tests/integration/round_trip/test_grid_definition_section.py diff --git a/iris_grib/tests/integration/round_trip/test_hybrid_coords_round_trip.py b/src/iris_grib/tests/integration/round_trip/test_hybrid_coords_round_trip.py similarity index 100% rename from iris_grib/tests/integration/round_trip/test_hybrid_coords_round_trip.py rename to src/iris_grib/tests/integration/round_trip/test_hybrid_coords_round_trip.py diff --git a/iris_grib/tests/integration/round_trip/test_product_definition_section.py b/src/iris_grib/tests/integration/round_trip/test_product_definition_section.py similarity index 100% rename from iris_grib/tests/integration/round_trip/test_product_definition_section.py rename to src/iris_grib/tests/integration/round_trip/test_product_definition_section.py diff --git a/iris_grib/tests/integration/save_rules/__init__.py b/src/iris_grib/tests/integration/save_rules/__init__.py similarity index 100% rename from iris_grib/tests/integration/save_rules/__init__.py rename to src/iris_grib/tests/integration/save_rules/__init__.py diff --git a/iris_grib/tests/integration/save_rules/test_grib_save.py b/src/iris_grib/tests/integration/save_rules/test_grib_save.py similarity index 100% rename from iris_grib/tests/integration/save_rules/test_grib_save.py rename to src/iris_grib/tests/integration/save_rules/test_grib_save.py diff --git a/iris_grib/tests/integration/save_rules/test_grid_definition_section.py b/src/iris_grib/tests/integration/save_rules/test_grid_definition_section.py similarity index 100% rename from iris_grib/tests/integration/save_rules/test_grid_definition_section.py rename to src/iris_grib/tests/integration/save_rules/test_grid_definition_section.py diff --git a/iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py b/src/iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py similarity index 100% rename from iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py rename to src/iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py diff --git a/iris_grib/tests/results/integration/iris_integration/callback/TestCallbacks/load_callback.cml b/src/iris_grib/tests/results/integration/iris_integration/callback/TestCallbacks/load_callback.cml similarity index 100% rename from iris_grib/tests/results/integration/iris_integration/callback/TestCallbacks/load_callback.cml rename to src/iris_grib/tests/results/integration/iris_integration/callback/TestCallbacks/load_callback.cml diff --git a/iris_grib/tests/results/integration/load_convert/data_section/TestDRT3/grid_complex_spatial_differencing.cml b/src/iris_grib/tests/results/integration/load_convert/data_section/TestDRT3/grid_complex_spatial_differencing.cml similarity index 100% rename from iris_grib/tests/results/integration/load_convert/data_section/TestDRT3/grid_complex_spatial_differencing.cml rename to src/iris_grib/tests/results/integration/load_convert/data_section/TestDRT3/grid_complex_spatial_differencing.cml diff --git a/iris_grib/tests/results/integration/load_convert/data_section/TestDRT3/grid_complex_spatial_differencing.data.0.json b/src/iris_grib/tests/results/integration/load_convert/data_section/TestDRT3/grid_complex_spatial_differencing.data.0.json similarity index 100% rename from iris_grib/tests/results/integration/load_convert/data_section/TestDRT3/grid_complex_spatial_differencing.data.0.json rename to src/iris_grib/tests/results/integration/load_convert/data_section/TestDRT3/grid_complex_spatial_differencing.data.0.json diff --git a/iris_grib/tests/results/integration/load_convert/data_section/TestDataProxy/data_representation__no_bitsPerValue.cml b/src/iris_grib/tests/results/integration/load_convert/data_section/TestDataProxy/data_representation__no_bitsPerValue.cml similarity index 100% rename from iris_grib/tests/results/integration/load_convert/data_section/TestDataProxy/data_representation__no_bitsPerValue.cml rename to src/iris_grib/tests/results/integration/load_convert/data_section/TestDataProxy/data_representation__no_bitsPerValue.cml diff --git a/iris_grib/tests/results/integration/load_convert/data_section/TestGDT30/lambert.cml b/src/iris_grib/tests/results/integration/load_convert/data_section/TestGDT30/lambert.cml similarity index 100% rename from iris_grib/tests/results/integration/load_convert/data_section/TestGDT30/lambert.cml rename to src/iris_grib/tests/results/integration/load_convert/data_section/TestGDT30/lambert.cml diff --git a/iris_grib/tests/results/integration/load_convert/data_section/TestGDT30/lambert.data.0.json b/src/iris_grib/tests/results/integration/load_convert/data_section/TestGDT30/lambert.data.0.json similarity index 100% rename from iris_grib/tests/results/integration/load_convert/data_section/TestGDT30/lambert.data.0.json rename to src/iris_grib/tests/results/integration/load_convert/data_section/TestGDT30/lambert.data.0.json diff --git a/iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/reduced.cml b/src/iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/reduced.cml similarity index 100% rename from iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/reduced.cml rename to src/iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/reduced.cml diff --git a/iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/reduced.data.0.json b/src/iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/reduced.data.0.json similarity index 100% rename from iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/reduced.data.0.json rename to src/iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/reduced.data.0.json diff --git a/iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/regular.cml b/src/iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/regular.cml similarity index 100% rename from iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/regular.cml rename to src/iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/regular.cml diff --git a/iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/regular.data.0.json b/src/iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/regular.data.0.json similarity index 100% rename from iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/regular.data.0.json rename to src/iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/regular.data.0.json diff --git a/iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt1.cml b/src/iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt1.cml similarity index 100% rename from iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt1.cml rename to src/iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt1.cml diff --git a/iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt1.data.0.json b/src/iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt1.data.0.json similarity index 100% rename from iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt1.data.0.json rename to src/iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt1.data.0.json diff --git a/iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt90_with_bitmap.cml b/src/iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt90_with_bitmap.cml similarity index 100% rename from iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt90_with_bitmap.cml rename to src/iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt90_with_bitmap.cml diff --git a/iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt90_with_bitmap.data.0.json b/src/iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt90_with_bitmap.data.0.json similarity index 100% rename from iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt90_with_bitmap.data.0.json rename to src/iris_grib/tests/results/integration/load_convert/data_section/TestImport/gdt90_with_bitmap.data.0.json diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/3_layer.cml b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/3_layer.cml similarity index 100% rename from iris_grib/tests/results/integration/load_convert/sample_file_loads/3_layer.cml rename to src/iris_grib/tests/results/integration/load_convert/sample_file_loads/3_layer.cml diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_0.cml b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_0.cml similarity index 100% rename from iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_0.cml rename to src/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_0.cml diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_1.cml b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_1.cml similarity index 100% rename from iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_1.cml rename to src/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_1.cml diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_2.cml b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_2.cml similarity index 100% rename from iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_2.cml rename to src/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_2.cml diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_3.cml b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_3.cml similarity index 100% rename from iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_3.cml rename to src/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_3.cml diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_4.cml b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_4.cml similarity index 100% rename from iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_4.cml rename to src/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_4.cml diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_5.cml b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_5.cml similarity index 100% rename from iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_5.cml rename to src/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_5.cml diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_6.cml b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_6.cml similarity index 100% rename from iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_6.cml rename to src/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_6.cml diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_7.cml b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_7.cml similarity index 100% rename from iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_7.cml rename to src/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_7.cml diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_grib1.cml b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_grib1.cml similarity index 100% rename from iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_grib1.cml rename to src/iris_grib/tests/results/integration/load_convert/sample_file_loads/earth_shape_grib1.cml diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/ineg_jneg.cml b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/ineg_jneg.cml similarity index 100% rename from iris_grib/tests/results/integration/load_convert/sample_file_loads/ineg_jneg.cml rename to src/iris_grib/tests/results/integration/load_convert/sample_file_loads/ineg_jneg.cml diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/ineg_jpos.cml b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/ineg_jpos.cml similarity index 100% rename from iris_grib/tests/results/integration/load_convert/sample_file_loads/ineg_jpos.cml rename to src/iris_grib/tests/results/integration/load_convert/sample_file_loads/ineg_jpos.cml diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/ipos_jneg.cml b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/ipos_jneg.cml similarity index 100% rename from iris_grib/tests/results/integration/load_convert/sample_file_loads/ipos_jneg.cml rename to src/iris_grib/tests/results/integration/load_convert/sample_file_loads/ipos_jneg.cml diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/ipos_jpos.cml b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/ipos_jpos.cml similarity index 100% rename from iris_grib/tests/results/integration/load_convert/sample_file_loads/ipos_jpos.cml rename to src/iris_grib/tests/results/integration/load_convert/sample_file_loads/ipos_jpos.cml diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib1.cml b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib1.cml similarity index 100% rename from iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib1.cml rename to src/iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib1.cml diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib2.cml b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib2.cml similarity index 100% rename from iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib2.cml rename to src/iris_grib/tests/results/integration/load_convert/sample_file_loads/lambert_grib2.cml diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/missing_values_grib2.cml b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/missing_values_grib2.cml similarity index 100% rename from iris_grib/tests/results/integration/load_convert/sample_file_loads/missing_values_grib2.cml rename to src/iris_grib/tests/results/integration/load_convert/sample_file_loads/missing_values_grib2.cml diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/polar_stereo_grib1.cml b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/polar_stereo_grib1.cml similarity index 100% rename from iris_grib/tests/results/integration/load_convert/sample_file_loads/polar_stereo_grib1.cml rename to src/iris_grib/tests/results/integration/load_convert/sample_file_loads/polar_stereo_grib1.cml diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_gg_grib2.cml b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_gg_grib2.cml similarity index 100% rename from iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_gg_grib2.cml rename to src/iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_gg_grib2.cml diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_ll_grib1.cml b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_ll_grib1.cml similarity index 100% rename from iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_ll_grib1.cml rename to src/iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_ll_grib1.cml diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/regular_gg_grib1.cml b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/regular_gg_grib1.cml similarity index 100% rename from iris_grib/tests/results/integration/load_convert/sample_file_loads/regular_gg_grib1.cml rename to src/iris_grib/tests/results/integration/load_convert/sample_file_loads/regular_gg_grib1.cml diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/regular_gg_grib2.cml b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/regular_gg_grib2.cml similarity index 100% rename from iris_grib/tests/results/integration/load_convert/sample_file_loads/regular_gg_grib2.cml rename to src/iris_grib/tests/results/integration/load_convert/sample_file_loads/regular_gg_grib2.cml diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/rotated.cml b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/rotated.cml similarity index 100% rename from iris_grib/tests/results/integration/load_convert/sample_file_loads/rotated.cml rename to src/iris_grib/tests/results/integration/load_convert/sample_file_loads/rotated.cml diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_bound_grib1.cml b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_bound_grib1.cml similarity index 100% rename from iris_grib/tests/results/integration/load_convert/sample_file_loads/time_bound_grib1.cml rename to src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_bound_grib1.cml diff --git a/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_bound_grib2.cml b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_bound_grib2.cml similarity index 100% rename from iris_grib/tests/results/integration/load_convert/sample_file_loads/time_bound_grib2.cml rename to src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_bound_grib2.cml diff --git a/iris_grib/tests/results/integration/name_grib/NAMEII/0_TRACER_AIR_CONCENTRATION.cml b/src/iris_grib/tests/results/integration/name_grib/NAMEII/0_TRACER_AIR_CONCENTRATION.cml similarity index 100% rename from iris_grib/tests/results/integration/name_grib/NAMEII/0_TRACER_AIR_CONCENTRATION.cml rename to src/iris_grib/tests/results/integration/name_grib/NAMEII/0_TRACER_AIR_CONCENTRATION.cml diff --git a/iris_grib/tests/results/integration/name_grib/NAMEII/1_TRACER_DOSAGE.cml b/src/iris_grib/tests/results/integration/name_grib/NAMEII/1_TRACER_DOSAGE.cml similarity index 100% rename from iris_grib/tests/results/integration/name_grib/NAMEII/1_TRACER_DOSAGE.cml rename to src/iris_grib/tests/results/integration/name_grib/NAMEII/1_TRACER_DOSAGE.cml diff --git a/iris_grib/tests/results/integration/name_grib/NAMEII/3_TRACER_DRY_DEPOSITION.cml b/src/iris_grib/tests/results/integration/name_grib/NAMEII/3_TRACER_DRY_DEPOSITION.cml similarity index 100% rename from iris_grib/tests/results/integration/name_grib/NAMEII/3_TRACER_DRY_DEPOSITION.cml rename to src/iris_grib/tests/results/integration/name_grib/NAMEII/3_TRACER_DRY_DEPOSITION.cml diff --git a/iris_grib/tests/results/integration/name_grib/NAMEII/4_TRACER_TOTAL_DEPOSITION.cml b/src/iris_grib/tests/results/integration/name_grib/NAMEII/4_TRACER_TOTAL_DEPOSITION.cml similarity index 100% rename from iris_grib/tests/results/integration/name_grib/NAMEII/4_TRACER_TOTAL_DEPOSITION.cml rename to src/iris_grib/tests/results/integration/name_grib/NAMEII/4_TRACER_TOTAL_DEPOSITION.cml diff --git a/iris_grib/tests/results/integration/name_grib/NAMEIII/0_TRACER_AIR_CONCENTRATION.cml b/src/iris_grib/tests/results/integration/name_grib/NAMEIII/0_TRACER_AIR_CONCENTRATION.cml similarity index 100% rename from iris_grib/tests/results/integration/name_grib/NAMEIII/0_TRACER_AIR_CONCENTRATION.cml rename to src/iris_grib/tests/results/integration/name_grib/NAMEIII/0_TRACER_AIR_CONCENTRATION.cml diff --git a/iris_grib/tests/results/integration/name_grib/NAMEIII/1_TRACER_AIR_CONCENTRATION.cml b/src/iris_grib/tests/results/integration/name_grib/NAMEIII/1_TRACER_AIR_CONCENTRATION.cml similarity index 100% rename from iris_grib/tests/results/integration/name_grib/NAMEIII/1_TRACER_AIR_CONCENTRATION.cml rename to src/iris_grib/tests/results/integration/name_grib/NAMEIII/1_TRACER_AIR_CONCENTRATION.cml diff --git a/iris_grib/tests/results/integration/name_grib/NAMEIII/2_TRACER_DRY_DEPOSITION.cml b/src/iris_grib/tests/results/integration/name_grib/NAMEIII/2_TRACER_DRY_DEPOSITION.cml similarity index 100% rename from iris_grib/tests/results/integration/name_grib/NAMEIII/2_TRACER_DRY_DEPOSITION.cml rename to src/iris_grib/tests/results/integration/name_grib/NAMEIII/2_TRACER_DRY_DEPOSITION.cml diff --git a/iris_grib/tests/results/integration/name_grib/NAMEIII/3_TRACER_WET_DEPOSITION.cml b/src/iris_grib/tests/results/integration/name_grib/NAMEIII/3_TRACER_WET_DEPOSITION.cml similarity index 100% rename from iris_grib/tests/results/integration/name_grib/NAMEIII/3_TRACER_WET_DEPOSITION.cml rename to src/iris_grib/tests/results/integration/name_grib/NAMEIII/3_TRACER_WET_DEPOSITION.cml diff --git a/iris_grib/tests/results/integration/name_grib/NAMEIII/4_TRACER_DEPOSITION.cml b/src/iris_grib/tests/results/integration/name_grib/NAMEIII/4_TRACER_DEPOSITION.cml similarity index 100% rename from iris_grib/tests/results/integration/name_grib/NAMEIII/4_TRACER_DEPOSITION.cml rename to src/iris_grib/tests/results/integration/name_grib/NAMEIII/4_TRACER_DEPOSITION.cml diff --git a/iris_grib/tests/results/unit/load_cubes/load_cubes/reduced_raw.cml b/src/iris_grib/tests/results/unit/load_cubes/load_cubes/reduced_raw.cml similarity index 100% rename from iris_grib/tests/results/unit/load_cubes/load_cubes/reduced_raw.cml rename to src/iris_grib/tests/results/unit/load_cubes/load_cubes/reduced_raw.cml diff --git a/iris_grib/tests/test_license_headers.py b/src/iris_grib/tests/test_license_headers.py similarity index 100% rename from iris_grib/tests/test_license_headers.py rename to src/iris_grib/tests/test_license_headers.py diff --git a/iris_grib/tests/testdata/CAT_T+24_0600.grib2 b/src/iris_grib/tests/testdata/CAT_T+24_0600.grib2 similarity index 100% rename from iris_grib/tests/testdata/CAT_T+24_0600.grib2 rename to src/iris_grib/tests/testdata/CAT_T+24_0600.grib2 diff --git a/iris_grib/tests/testdata/CB_T+24_0600.grib2 b/src/iris_grib/tests/testdata/CB_T+24_0600.grib2 similarity index 100% rename from iris_grib/tests/testdata/CB_T+24_0600.grib2 rename to src/iris_grib/tests/testdata/CB_T+24_0600.grib2 diff --git a/iris_grib/tests/testdata/ICING_T+24_0600.grib2 b/src/iris_grib/tests/testdata/ICING_T+24_0600.grib2 similarity index 100% rename from iris_grib/tests/testdata/ICING_T+24_0600.grib2 rename to src/iris_grib/tests/testdata/ICING_T+24_0600.grib2 diff --git a/iris_grib/tests/testdata/INCLDTURB_T+24_0600.grib2 b/src/iris_grib/tests/testdata/INCLDTURB_T+24_0600.grib2 similarity index 100% rename from iris_grib/tests/testdata/INCLDTURB_T+24_0600.grib2 rename to src/iris_grib/tests/testdata/INCLDTURB_T+24_0600.grib2 diff --git a/iris_grib/tests/testdata/faked_sample_hh_grib_data.grib2 b/src/iris_grib/tests/testdata/faked_sample_hh_grib_data.grib2 similarity index 100% rename from iris_grib/tests/testdata/faked_sample_hh_grib_data.grib2 rename to src/iris_grib/tests/testdata/faked_sample_hh_grib_data.grib2 diff --git a/iris_grib/tests/testdata/faked_sample_hp_grib_data.grib2 b/src/iris_grib/tests/testdata/faked_sample_hp_grib_data.grib2 similarity index 100% rename from iris_grib/tests/testdata/faked_sample_hp_grib_data.grib2 rename to src/iris_grib/tests/testdata/faked_sample_hp_grib_data.grib2 diff --git a/iris_grib/tests/testdata/hybrid_height.nc b/src/iris_grib/tests/testdata/hybrid_height.nc similarity index 100% rename from iris_grib/tests/testdata/hybrid_height.nc rename to src/iris_grib/tests/testdata/hybrid_height.nc diff --git a/iris_grib/tests/testdata/hybrid_pressure.nc b/src/iris_grib/tests/testdata/hybrid_pressure.nc similarity index 100% rename from iris_grib/tests/testdata/hybrid_pressure.nc rename to src/iris_grib/tests/testdata/hybrid_pressure.nc diff --git a/iris_grib/tests/unit/__init__.py b/src/iris_grib/tests/unit/__init__.py similarity index 100% rename from iris_grib/tests/unit/__init__.py rename to src/iris_grib/tests/unit/__init__.py diff --git a/iris_grib/tests/unit/grib1_load_rules/__init__.py b/src/iris_grib/tests/unit/grib1_load_rules/__init__.py similarity index 100% rename from iris_grib/tests/unit/grib1_load_rules/__init__.py rename to src/iris_grib/tests/unit/grib1_load_rules/__init__.py diff --git a/iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py b/src/iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py similarity index 100% rename from iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py rename to src/iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py diff --git a/iris_grib/tests/unit/grib1_load_rules/test_grib1_load_translations.py b/src/iris_grib/tests/unit/grib1_load_rules/test_grib1_load_translations.py similarity index 100% rename from iris_grib/tests/unit/grib1_load_rules/test_grib1_load_translations.py rename to src/iris_grib/tests/unit/grib1_load_rules/test_grib1_load_translations.py diff --git a/iris_grib/tests/unit/grib_phenom_translation/__init__.py b/src/iris_grib/tests/unit/grib_phenom_translation/__init__.py similarity index 100% rename from iris_grib/tests/unit/grib_phenom_translation/__init__.py rename to src/iris_grib/tests/unit/grib_phenom_translation/__init__.py diff --git a/iris_grib/tests/unit/grib_phenom_translation/test_grib_phenom_translation.py b/src/iris_grib/tests/unit/grib_phenom_translation/test_grib_phenom_translation.py similarity index 100% rename from iris_grib/tests/unit/grib_phenom_translation/test_grib_phenom_translation.py rename to src/iris_grib/tests/unit/grib_phenom_translation/test_grib_phenom_translation.py diff --git a/iris_grib/tests/unit/load_convert/__init__.py b/src/iris_grib/tests/unit/load_convert/__init__.py similarity index 100% rename from iris_grib/tests/unit/load_convert/__init__.py rename to src/iris_grib/tests/unit/load_convert/__init__.py diff --git a/iris_grib/tests/unit/load_convert/test__hindcast_fix.py b/src/iris_grib/tests/unit/load_convert/test__hindcast_fix.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test__hindcast_fix.py rename to src/iris_grib/tests/unit/load_convert/test__hindcast_fix.py diff --git a/iris_grib/tests/unit/load_convert/test_bitmap_section.py b/src/iris_grib/tests/unit/load_convert/test_bitmap_section.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test_bitmap_section.py rename to src/iris_grib/tests/unit/load_convert/test_bitmap_section.py diff --git a/iris_grib/tests/unit/load_convert/test_calculate_increment.py b/src/iris_grib/tests/unit/load_convert/test_calculate_increment.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test_calculate_increment.py rename to src/iris_grib/tests/unit/load_convert/test_calculate_increment.py diff --git a/iris_grib/tests/unit/load_convert/test_convert.py b/src/iris_grib/tests/unit/load_convert/test_convert.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test_convert.py rename to src/iris_grib/tests/unit/load_convert/test_convert.py diff --git a/iris_grib/tests/unit/load_convert/test_data_cutoff.py b/src/iris_grib/tests/unit/load_convert/test_data_cutoff.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test_data_cutoff.py rename to src/iris_grib/tests/unit/load_convert/test_data_cutoff.py diff --git a/iris_grib/tests/unit/load_convert/test_data_representation_section.py b/src/iris_grib/tests/unit/load_convert/test_data_representation_section.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test_data_representation_section.py rename to src/iris_grib/tests/unit/load_convert/test_data_representation_section.py diff --git a/iris_grib/tests/unit/load_convert/test_ellipsoid.py b/src/iris_grib/tests/unit/load_convert/test_ellipsoid.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test_ellipsoid.py rename to src/iris_grib/tests/unit/load_convert/test_ellipsoid.py diff --git a/iris_grib/tests/unit/load_convert/test_ellipsoid_geometry.py b/src/iris_grib/tests/unit/load_convert/test_ellipsoid_geometry.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test_ellipsoid_geometry.py rename to src/iris_grib/tests/unit/load_convert/test_ellipsoid_geometry.py diff --git a/iris_grib/tests/unit/load_convert/test_ensemble_identifier.py b/src/iris_grib/tests/unit/load_convert/test_ensemble_identifier.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test_ensemble_identifier.py rename to src/iris_grib/tests/unit/load_convert/test_ensemble_identifier.py diff --git a/iris_grib/tests/unit/load_convert/test_forecast_period_coord.py b/src/iris_grib/tests/unit/load_convert/test_forecast_period_coord.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test_forecast_period_coord.py rename to src/iris_grib/tests/unit/load_convert/test_forecast_period_coord.py diff --git a/iris_grib/tests/unit/load_convert/test_generating_process.py b/src/iris_grib/tests/unit/load_convert/test_generating_process.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test_generating_process.py rename to src/iris_grib/tests/unit/load_convert/test_generating_process.py diff --git a/iris_grib/tests/unit/load_convert/test_grib2_convert.py b/src/iris_grib/tests/unit/load_convert/test_grib2_convert.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test_grib2_convert.py rename to src/iris_grib/tests/unit/load_convert/test_grib2_convert.py diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_0_and_1.py b/src/iris_grib/tests/unit/load_convert/test_grid_definition_template_0_and_1.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test_grid_definition_template_0_and_1.py rename to src/iris_grib/tests/unit/load_convert/test_grid_definition_template_0_and_1.py diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_10.py b/src/iris_grib/tests/unit/load_convert/test_grid_definition_template_10.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test_grid_definition_template_10.py rename to src/iris_grib/tests/unit/load_convert/test_grid_definition_template_10.py diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_12.py b/src/iris_grib/tests/unit/load_convert/test_grid_definition_template_12.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test_grid_definition_template_12.py rename to src/iris_grib/tests/unit/load_convert/test_grid_definition_template_12.py diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_140.py b/src/iris_grib/tests/unit/load_convert/test_grid_definition_template_140.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test_grid_definition_template_140.py rename to src/iris_grib/tests/unit/load_convert/test_grid_definition_template_140.py diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_20.py b/src/iris_grib/tests/unit/load_convert/test_grid_definition_template_20.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test_grid_definition_template_20.py rename to src/iris_grib/tests/unit/load_convert/test_grid_definition_template_20.py diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_30.py b/src/iris_grib/tests/unit/load_convert/test_grid_definition_template_30.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test_grid_definition_template_30.py rename to src/iris_grib/tests/unit/load_convert/test_grid_definition_template_30.py diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_40.py b/src/iris_grib/tests/unit/load_convert/test_grid_definition_template_40.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test_grid_definition_template_40.py rename to src/iris_grib/tests/unit/load_convert/test_grid_definition_template_40.py diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_4_and_5.py b/src/iris_grib/tests/unit/load_convert/test_grid_definition_template_4_and_5.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test_grid_definition_template_4_and_5.py rename to src/iris_grib/tests/unit/load_convert/test_grid_definition_template_4_and_5.py diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_5.py b/src/iris_grib/tests/unit/load_convert/test_grid_definition_template_5.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test_grid_definition_template_5.py rename to src/iris_grib/tests/unit/load_convert/test_grid_definition_template_5.py diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_90.py b/src/iris_grib/tests/unit/load_convert/test_grid_definition_template_90.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test_grid_definition_template_90.py rename to src/iris_grib/tests/unit/load_convert/test_grid_definition_template_90.py diff --git a/iris_grib/tests/unit/load_convert/test_other_time_coord.py b/src/iris_grib/tests/unit/load_convert/test_other_time_coord.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test_other_time_coord.py rename to src/iris_grib/tests/unit/load_convert/test_other_time_coord.py diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_section.py b/src/iris_grib/tests/unit/load_convert/test_product_definition_section.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test_product_definition_section.py rename to src/iris_grib/tests/unit/load_convert/test_product_definition_section.py diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_0.py b/src/iris_grib/tests/unit/load_convert/test_product_definition_template_0.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test_product_definition_template_0.py rename to src/iris_grib/tests/unit/load_convert/test_product_definition_template_0.py diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_1.py b/src/iris_grib/tests/unit/load_convert/test_product_definition_template_1.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test_product_definition_template_1.py rename to src/iris_grib/tests/unit/load_convert/test_product_definition_template_1.py diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_10.py b/src/iris_grib/tests/unit/load_convert/test_product_definition_template_10.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test_product_definition_template_10.py rename to src/iris_grib/tests/unit/load_convert/test_product_definition_template_10.py diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_11.py b/src/iris_grib/tests/unit/load_convert/test_product_definition_template_11.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test_product_definition_template_11.py rename to src/iris_grib/tests/unit/load_convert/test_product_definition_template_11.py diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py b/src/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test_product_definition_template_15.py rename to src/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_31.py b/src/iris_grib/tests/unit/load_convert/test_product_definition_template_31.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test_product_definition_template_31.py rename to src/iris_grib/tests/unit/load_convert/test_product_definition_template_31.py diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_32.py b/src/iris_grib/tests/unit/load_convert/test_product_definition_template_32.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test_product_definition_template_32.py rename to src/iris_grib/tests/unit/load_convert/test_product_definition_template_32.py diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_40.py b/src/iris_grib/tests/unit/load_convert/test_product_definition_template_40.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test_product_definition_template_40.py rename to src/iris_grib/tests/unit/load_convert/test_product_definition_template_40.py diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_6.py b/src/iris_grib/tests/unit/load_convert/test_product_definition_template_6.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test_product_definition_template_6.py rename to src/iris_grib/tests/unit/load_convert/test_product_definition_template_6.py diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_8.py b/src/iris_grib/tests/unit/load_convert/test_product_definition_template_8.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test_product_definition_template_8.py rename to src/iris_grib/tests/unit/load_convert/test_product_definition_template_8.py diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_9.py b/src/iris_grib/tests/unit/load_convert/test_product_definition_template_9.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test_product_definition_template_9.py rename to src/iris_grib/tests/unit/load_convert/test_product_definition_template_9.py diff --git a/iris_grib/tests/unit/load_convert/test_projection_centre.py b/src/iris_grib/tests/unit/load_convert/test_projection_centre.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test_projection_centre.py rename to src/iris_grib/tests/unit/load_convert/test_projection_centre.py diff --git a/iris_grib/tests/unit/load_convert/test_reference_time_coord.py b/src/iris_grib/tests/unit/load_convert/test_reference_time_coord.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test_reference_time_coord.py rename to src/iris_grib/tests/unit/load_convert/test_reference_time_coord.py diff --git a/iris_grib/tests/unit/load_convert/test_resolution_flags.py b/src/iris_grib/tests/unit/load_convert/test_resolution_flags.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test_resolution_flags.py rename to src/iris_grib/tests/unit/load_convert/test_resolution_flags.py diff --git a/iris_grib/tests/unit/load_convert/test_satellite_common.py b/src/iris_grib/tests/unit/load_convert/test_satellite_common.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test_satellite_common.py rename to src/iris_grib/tests/unit/load_convert/test_satellite_common.py diff --git a/iris_grib/tests/unit/load_convert/test_scanning_mode.py b/src/iris_grib/tests/unit/load_convert/test_scanning_mode.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test_scanning_mode.py rename to src/iris_grib/tests/unit/load_convert/test_scanning_mode.py diff --git a/iris_grib/tests/unit/load_convert/test_statistical_cell_method.py b/src/iris_grib/tests/unit/load_convert/test_statistical_cell_method.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test_statistical_cell_method.py rename to src/iris_grib/tests/unit/load_convert/test_statistical_cell_method.py diff --git a/iris_grib/tests/unit/load_convert/test_statistical_forecast_period_coord.py b/src/iris_grib/tests/unit/load_convert/test_statistical_forecast_period_coord.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test_statistical_forecast_period_coord.py rename to src/iris_grib/tests/unit/load_convert/test_statistical_forecast_period_coord.py diff --git a/iris_grib/tests/unit/load_convert/test_time_range_unit.py b/src/iris_grib/tests/unit/load_convert/test_time_range_unit.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test_time_range_unit.py rename to src/iris_grib/tests/unit/load_convert/test_time_range_unit.py diff --git a/iris_grib/tests/unit/load_convert/test_translate_phenomenon.py b/src/iris_grib/tests/unit/load_convert/test_translate_phenomenon.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test_translate_phenomenon.py rename to src/iris_grib/tests/unit/load_convert/test_translate_phenomenon.py diff --git a/iris_grib/tests/unit/load_convert/test_unscale.py b/src/iris_grib/tests/unit/load_convert/test_unscale.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test_unscale.py rename to src/iris_grib/tests/unit/load_convert/test_unscale.py diff --git a/iris_grib/tests/unit/load_convert/test_validity_time_coord.py b/src/iris_grib/tests/unit/load_convert/test_validity_time_coord.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test_validity_time_coord.py rename to src/iris_grib/tests/unit/load_convert/test_validity_time_coord.py diff --git a/iris_grib/tests/unit/load_convert/test_vertical_coords.py b/src/iris_grib/tests/unit/load_convert/test_vertical_coords.py similarity index 100% rename from iris_grib/tests/unit/load_convert/test_vertical_coords.py rename to src/iris_grib/tests/unit/load_convert/test_vertical_coords.py diff --git a/iris_grib/tests/unit/message/__init__.py b/src/iris_grib/tests/unit/message/__init__.py similarity index 100% rename from iris_grib/tests/unit/message/__init__.py rename to src/iris_grib/tests/unit/message/__init__.py diff --git a/iris_grib/tests/unit/message/test_GribMessage.py b/src/iris_grib/tests/unit/message/test_GribMessage.py similarity index 100% rename from iris_grib/tests/unit/message/test_GribMessage.py rename to src/iris_grib/tests/unit/message/test_GribMessage.py diff --git a/iris_grib/tests/unit/message/test_Section.py b/src/iris_grib/tests/unit/message/test_Section.py similarity index 100% rename from iris_grib/tests/unit/message/test_Section.py rename to src/iris_grib/tests/unit/message/test_Section.py diff --git a/iris_grib/tests/unit/message/test__DataProxy.py b/src/iris_grib/tests/unit/message/test__DataProxy.py similarity index 100% rename from iris_grib/tests/unit/message/test__DataProxy.py rename to src/iris_grib/tests/unit/message/test__DataProxy.py diff --git a/iris_grib/tests/unit/message/test__MessageLocation.py b/src/iris_grib/tests/unit/message/test__MessageLocation.py similarity index 100% rename from iris_grib/tests/unit/message/test__MessageLocation.py rename to src/iris_grib/tests/unit/message/test__MessageLocation.py diff --git a/iris_grib/tests/unit/message/test__RawGribMessage.py b/src/iris_grib/tests/unit/message/test__RawGribMessage.py similarity index 100% rename from iris_grib/tests/unit/message/test__RawGribMessage.py rename to src/iris_grib/tests/unit/message/test__RawGribMessage.py diff --git a/iris_grib/tests/unit/save_rules/__init__.py b/src/iris_grib/tests/unit/save_rules/__init__.py similarity index 100% rename from iris_grib/tests/unit/save_rules/__init__.py rename to src/iris_grib/tests/unit/save_rules/__init__.py diff --git a/iris_grib/tests/unit/save_rules/test__missing_forecast_period.py b/src/iris_grib/tests/unit/save_rules/test__missing_forecast_period.py similarity index 100% rename from iris_grib/tests/unit/save_rules/test__missing_forecast_period.py rename to src/iris_grib/tests/unit/save_rules/test__missing_forecast_period.py diff --git a/iris_grib/tests/unit/save_rules/test__non_missing_forecast_period.py b/src/iris_grib/tests/unit/save_rules/test__non_missing_forecast_period.py similarity index 100% rename from iris_grib/tests/unit/save_rules/test__non_missing_forecast_period.py rename to src/iris_grib/tests/unit/save_rules/test__non_missing_forecast_period.py diff --git a/iris_grib/tests/unit/save_rules/test__product_definition_template_8_10_and_11.py b/src/iris_grib/tests/unit/save_rules/test__product_definition_template_8_10_and_11.py similarity index 100% rename from iris_grib/tests/unit/save_rules/test__product_definition_template_8_10_and_11.py rename to src/iris_grib/tests/unit/save_rules/test__product_definition_template_8_10_and_11.py diff --git a/iris_grib/tests/unit/save_rules/test_data_section.py b/src/iris_grib/tests/unit/save_rules/test_data_section.py similarity index 100% rename from iris_grib/tests/unit/save_rules/test_data_section.py rename to src/iris_grib/tests/unit/save_rules/test_data_section.py diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_0.py b/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_0.py similarity index 100% rename from iris_grib/tests/unit/save_rules/test_grid_definition_template_0.py rename to src/iris_grib/tests/unit/save_rules/test_grid_definition_template_0.py diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_1.py b/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_1.py similarity index 100% rename from iris_grib/tests/unit/save_rules/test_grid_definition_template_1.py rename to src/iris_grib/tests/unit/save_rules/test_grid_definition_template_1.py diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py b/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py similarity index 100% rename from iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py rename to src/iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_12.py b/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_12.py similarity index 100% rename from iris_grib/tests/unit/save_rules/test_grid_definition_template_12.py rename to src/iris_grib/tests/unit/save_rules/test_grid_definition_template_12.py diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_140.py b/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_140.py similarity index 100% rename from iris_grib/tests/unit/save_rules/test_grid_definition_template_140.py rename to src/iris_grib/tests/unit/save_rules/test_grid_definition_template_140.py diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_20.py b/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_20.py similarity index 100% rename from iris_grib/tests/unit/save_rules/test_grid_definition_template_20.py rename to src/iris_grib/tests/unit/save_rules/test_grid_definition_template_20.py diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_30.py b/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_30.py similarity index 100% rename from iris_grib/tests/unit/save_rules/test_grid_definition_template_30.py rename to src/iris_grib/tests/unit/save_rules/test_grid_definition_template_30.py diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_4.py b/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_4.py similarity index 100% rename from iris_grib/tests/unit/save_rules/test_grid_definition_template_4.py rename to src/iris_grib/tests/unit/save_rules/test_grid_definition_template_4.py diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_5.py b/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_5.py similarity index 100% rename from iris_grib/tests/unit/save_rules/test_grid_definition_template_5.py rename to src/iris_grib/tests/unit/save_rules/test_grid_definition_template_5.py diff --git a/iris_grib/tests/unit/save_rules/test_identification.py b/src/iris_grib/tests/unit/save_rules/test_identification.py similarity index 100% rename from iris_grib/tests/unit/save_rules/test_identification.py rename to src/iris_grib/tests/unit/save_rules/test_identification.py diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_1.py b/src/iris_grib/tests/unit/save_rules/test_product_definition_template_1.py similarity index 100% rename from iris_grib/tests/unit/save_rules/test_product_definition_template_1.py rename to src/iris_grib/tests/unit/save_rules/test_product_definition_template_1.py diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_10.py b/src/iris_grib/tests/unit/save_rules/test_product_definition_template_10.py similarity index 100% rename from iris_grib/tests/unit/save_rules/test_product_definition_template_10.py rename to src/iris_grib/tests/unit/save_rules/test_product_definition_template_10.py diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_11.py b/src/iris_grib/tests/unit/save_rules/test_product_definition_template_11.py similarity index 100% rename from iris_grib/tests/unit/save_rules/test_product_definition_template_11.py rename to src/iris_grib/tests/unit/save_rules/test_product_definition_template_11.py diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py b/src/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py similarity index 100% rename from iris_grib/tests/unit/save_rules/test_product_definition_template_15.py rename to src/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_40.py b/src/iris_grib/tests/unit/save_rules/test_product_definition_template_40.py similarity index 100% rename from iris_grib/tests/unit/save_rules/test_product_definition_template_40.py rename to src/iris_grib/tests/unit/save_rules/test_product_definition_template_40.py diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_6.py b/src/iris_grib/tests/unit/save_rules/test_product_definition_template_6.py similarity index 100% rename from iris_grib/tests/unit/save_rules/test_product_definition_template_6.py rename to src/iris_grib/tests/unit/save_rules/test_product_definition_template_6.py diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_8.py b/src/iris_grib/tests/unit/save_rules/test_product_definition_template_8.py similarity index 100% rename from iris_grib/tests/unit/save_rules/test_product_definition_template_8.py rename to src/iris_grib/tests/unit/save_rules/test_product_definition_template_8.py diff --git a/iris_grib/tests/unit/save_rules/test_reference_time.py b/src/iris_grib/tests/unit/save_rules/test_reference_time.py similarity index 100% rename from iris_grib/tests/unit/save_rules/test_reference_time.py rename to src/iris_grib/tests/unit/save_rules/test_reference_time.py diff --git a/iris_grib/tests/unit/save_rules/test_set_discipline_and_parameter.py b/src/iris_grib/tests/unit/save_rules/test_set_discipline_and_parameter.py similarity index 100% rename from iris_grib/tests/unit/save_rules/test_set_discipline_and_parameter.py rename to src/iris_grib/tests/unit/save_rules/test_set_discipline_and_parameter.py diff --git a/iris_grib/tests/unit/save_rules/test_set_fixed_surfaces.py b/src/iris_grib/tests/unit/save_rules/test_set_fixed_surfaces.py similarity index 100% rename from iris_grib/tests/unit/save_rules/test_set_fixed_surfaces.py rename to src/iris_grib/tests/unit/save_rules/test_set_fixed_surfaces.py diff --git a/iris_grib/tests/unit/save_rules/test_set_time_increment.py b/src/iris_grib/tests/unit/save_rules/test_set_time_increment.py similarity index 100% rename from iris_grib/tests/unit/save_rules/test_set_time_increment.py rename to src/iris_grib/tests/unit/save_rules/test_set_time_increment.py diff --git a/iris_grib/tests/unit/save_rules/test_set_time_range.py b/src/iris_grib/tests/unit/save_rules/test_set_time_range.py similarity index 100% rename from iris_grib/tests/unit/save_rules/test_set_time_range.py rename to src/iris_grib/tests/unit/save_rules/test_set_time_range.py diff --git a/iris_grib/tests/unit/test_GribWrapper.py b/src/iris_grib/tests/unit/test_GribWrapper.py similarity index 100% rename from iris_grib/tests/unit/test_GribWrapper.py rename to src/iris_grib/tests/unit/test_GribWrapper.py diff --git a/iris_grib/tests/unit/test__load_generate.py b/src/iris_grib/tests/unit/test__load_generate.py similarity index 100% rename from iris_grib/tests/unit/test__load_generate.py rename to src/iris_grib/tests/unit/test__load_generate.py diff --git a/iris_grib/tests/unit/test_load_cubes.py b/src/iris_grib/tests/unit/test_load_cubes.py similarity index 100% rename from iris_grib/tests/unit/test_load_cubes.py rename to src/iris_grib/tests/unit/test_load_cubes.py diff --git a/iris_grib/tests/unit/test_load_pairs_from_fields.py b/src/iris_grib/tests/unit/test_load_pairs_from_fields.py similarity index 100% rename from iris_grib/tests/unit/test_load_pairs_from_fields.py rename to src/iris_grib/tests/unit/test_load_pairs_from_fields.py diff --git a/iris_grib/tests/unit/test_save_grib2.py b/src/iris_grib/tests/unit/test_save_grib2.py similarity index 100% rename from iris_grib/tests/unit/test_save_grib2.py rename to src/iris_grib/tests/unit/test_save_grib2.py diff --git a/iris_grib/tests/unit/test_save_messages.py b/src/iris_grib/tests/unit/test_save_messages.py similarity index 100% rename from iris_grib/tests/unit/test_save_messages.py rename to src/iris_grib/tests/unit/test_save_messages.py From f393b9587ae474891acac312eaaddf9684bf95a5 Mon Sep 17 00:00:00 2001 From: Bill Little Date: Wed, 24 Apr 2024 15:00:43 +0100 Subject: [PATCH 297/583] nep29: drop py39 and support py312 (#453) * nep29: drop py39, adopt py312 * refresh lockfiles * fix mock * ruff non-complance fixes --- .github/workflows/ci-tests.yml | 10 +-- noxfile.py | 2 +- pyproject.toml | 4 +- requirements/iris-grib.yml | 2 +- requirements/locks/py310-linux-64.lock | 34 +++++--- requirements/locks/py311-linux-64.lock | 18 ++--- ...py39-linux-64.lock => py312-linux-64.lock} | 81 +++++++++++-------- requirements/py310.yml | 8 +- requirements/py311.yml | 4 +- requirements/{py39.yml => py312.yml} | 9 ++- requirements/readthedocs.yml | 2 +- requirements/setup.txt | 2 +- src/iris_grib/_save_rules.py | 4 +- .../grib_phenom_translation/_gribcode.py | 4 +- src/iris_grib/tests/__init__.py | 2 +- .../load_convert/test_generating_process.py | 2 +- .../test_grid_definition_template_90.py | 4 +- src/iris_grib/tests/unit/test_save_grib2.py | 4 +- 18 files changed, 117 insertions(+), 79 deletions(-) rename requirements/locks/{py39-linux-64.lock => py312-linux-64.lock} (80%) rename requirements/{py39.yml => py312.yml} (72%) diff --git a/.github/workflows/ci-tests.yml b/.github/workflows/ci-tests.yml index d266bb1a..c76994b2 100644 --- a/.github/workflows/ci-tests.yml +++ b/.github/workflows/ci-tests.yml @@ -35,25 +35,25 @@ jobs: fail-fast: false matrix: os: ["ubuntu-latest"] - python-version: ["3.11"] + python-version: ["3.12"] session: ["doctest", "linkcheck"] iris-source : ["conda-forge"] include: - os: "ubuntu-latest" - python-version: "3.11" + python-version: "3.12" session: "tests" iris-source: "conda-forge" coverage: "--coverage" - os: "ubuntu-latest" - python-version: "3.11" + python-version: "3.12" session: "tests" iris-source: "source" - os: "ubuntu-latest" - python-version: "3.10" + python-version: "3.11" session: "tests" iris-source: "conda-forge" - os: "ubuntu-latest" - python-version: "3.9" + python-version: "3.10" session: "tests" iris-source: "conda-forge" diff --git a/noxfile.py b/noxfile.py index a8166b71..7d68435f 100644 --- a/noxfile.py +++ b/noxfile.py @@ -24,7 +24,7 @@ PACKAGE = str("iris_grib") #: Cirrus-CI environment variable hook. -PY_VER = os.environ.get("PY_VER", ["3.9", "3.10", "3.11"]) +PY_VER = os.environ.get("PY_VER", ["3.10", "3.11", "3.12"]) IRIS_SOURCE = os.environ.get("IRIS_SOURCE", ["source", "conda-forge"]) #: Default cartopy cache directory. diff --git a/pyproject.toml b/pyproject.toml index 34f41a93..f3e27649 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,9 +23,9 @@ classifiers = [ "Operating System :: Unix", "Programming Language :: Python", "Programming Language :: Python :: 3 :: Only", - "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", "Programming Language :: Python :: Implementation :: CPython", "Topic :: Scientific/Engineering", "Topic :: Scientific/Engineering :: Atmospheric Science", @@ -46,7 +46,7 @@ keywords = [ ] license = {text = "BSD-3-Clause"} name = "iris-grib" -requires-python = ">=3.9" +requires-python = ">=3.10" [project.urls] Code = "https://github.com/SciTools/iris-grib" diff --git a/requirements/iris-grib.yml b/requirements/iris-grib.yml index b0c50b8b..331a25f1 120000 --- a/requirements/iris-grib.yml +++ b/requirements/iris-grib.yml @@ -1 +1 @@ -py311.yml \ No newline at end of file +py312.yml \ No newline at end of file diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 3108a123..bb4587ab 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -1,16 +1,16 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 8b47e0a77f6ce801a2c484d9a593594c1998ce2d1b9fe3dc1e03225261de4b51 +# input_hash: bb88ce5d10a10e0a0df2ba8800b44ef1b44c069439153d3d6e424343ba556057 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_5.conda#f6f6600d18a4047b54f803cf708b868a +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h55db66e_0.conda#10569984e7db886e4f1abc2b47ad79a1 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h95c4c6d_6.conda#3cfab3e709f77e9f1b3d380eb622494a https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-4_cp310.conda#26322ec5d7712c3ded99dd656142b8ce https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_5.conda#d211c42b9ce49aee3734fdc828731689 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-hc881cc4_6.conda#aae89d3736661c36a5591788aebd0817 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_5.conda#d4ff227c46917d3b4565302a2bbb276b +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-hc881cc4_6.conda#df88796bd09a0d2ed292e59101478ad8 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.28.1-hd590300_0.conda#dcde58ff9a1f30b0037a2315d1846d1f https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d @@ -23,7 +23,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.20-hd590300_0.conda https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_5.conda#7a6bd7a12a4bd359e2afe6c0fa1acace +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-h43f5ff8_6.conda#e54a5ddc67e673f9105cf2a2e9c070b0 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d @@ -50,7 +50,7 @@ https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd7 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_5.conda#e73e9cfd1191783392131e6238bdb3e9 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_6.conda#3666a850342f8f3be88f9a93d948d027 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.3-h2797004_0.conda#b3316cbe90249da4f8e84cd66e1cc55b @@ -74,6 +74,7 @@ https://conda.anaconda.org/conda-forge/linux-64/python-3.10.14-hd12c33a_0_cpytho https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.3-h2c6b66d_0.conda#be7d70f2db41b674733667bdd69bd000 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-h8ee46fc_0.conda#077b6e8ad6a3ddb741fce2496dd01bec +https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda#5e4c0743c70186509d1412e03c2d8dfa https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f @@ -84,11 +85,13 @@ https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.cond https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.conda#753d29fe41bb881e4b9c004f0abf973f https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 +https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py310hff52083_3.conda#c159dcd29bbd80b187b1c5d5f73cc971 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.4-pyhd8ed1ab_0.conda#6baa2e7fc09bd2c7c82cb6662d5f1d36 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.3.1-pyhca7485f_0.conda#b7f0662ef2c9d4404f0af9eef5ed2fde https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda#c0cc1420498b17414d8617d0b9f506ca +https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 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/kiwisolver-1.4.5-py310hd41b1e2_1.conda#b8d67603d43b23ce7e988a5d81a7ab79 @@ -100,15 +103,19 @@ https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py310h2372a71_0 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#248f521b64ce055e7feae3105e7abeb8 -https://conda.anaconda.org/conda-forge/noarch/pluggy-1.4.0-pyhd8ed1ab_0.conda#139e9feb65187e916162917bb2484976 +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 +https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda#140a7f159396547e9799aa98f9f0742e https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py310h2372a71_0.conda#b631b889b0b4bc2fca7b8b977ca484b2 +https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py310h2372a71_1.conda#bb010e368de4940771368bc3dc4c63e7 https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda#7462280d81f639363e6e63c81276bd9e https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 +https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda#6ef2fc37559256cf682d8b3375e89b80 @@ -117,6 +124,7 @@ https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda#0b https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a +https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py310h2fee648_0.conda#45846a970e71ac98fd327da5d40a0a2c https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.51.0-py310h2372a71_0.conda#1a4773624145c15b92820fe6c87c5fcd https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_100.conda#d471a5c3abc984b662d9bae3bb7fd8a5 @@ -156,4 +164,12 @@ https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py310h62c0 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py310hba70d50_100.conda#e19392760c7e4da3b9cb0ee5bf61bc4b https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py310hcc13569_0.conda#89a13de526ea3008341e3a2aeab4da7e https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.0-py310h1f7b6fc_1.conda#f020ac07b7df9c4b0bd0ece3055b5bd2 -https://conda.anaconda.org/conda-forge/noarch/iris-3.8.1-pyha770c72_0.conda#b08a116ef1607e7e960a4caa902e3a90 +https://conda.anaconda.org/conda-forge/noarch/iris-3.9.0-pyha770c72_0.conda#efaf150eb009f04efa58f1401c767192 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda#611a35a27914fac3aa37611a6fe40bb5 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.6-pyhd8ed1ab_0.conda#d7e4954df0d3aea2eacc7835ad12671d +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.5-pyhd8ed1ab_0.conda#7e1e7437273682ada2ed5e9e9714b140 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jquery-4.1-pyhd8ed1ab_0.conda#914897066d5873acfb13e75705276ad1 +https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-2.0.0-pyha770c72_0.conda#baf6d9a33df1a789ca55e3b404c7ea28 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.7-pyhd8ed1ab_0.conda#26acae54b06f178681bfb551760f5dd1 +https://conda.anaconda.org/conda-forge/noarch/sphinx-7.3.7-pyhd8ed1ab_0.conda#7b1465205e28d75d2c0e1a868ee00a67 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda#e507335cb4ca9cff4c3d0fa9cdab255e diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index e60a1822..11d8baef 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -1,16 +1,16 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 86ed0486ae4fc60e1f46ac8a62982bc103c806ab18fe04e57c4c75fe1eb391d3 +# input_hash: 1279dfdc9dd0c047ff7eaebc0d9b8b86d968c282cc67f8db940122c918a0dc4a @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_5.conda#f6f6600d18a4047b54f803cf708b868a +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h55db66e_0.conda#10569984e7db886e4f1abc2b47ad79a1 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h95c4c6d_6.conda#3cfab3e709f77e9f1b3d380eb622494a https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-4_cp311.conda#d786502c97404c94d7d58d258a445a65 https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_5.conda#d211c42b9ce49aee3734fdc828731689 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-hc881cc4_6.conda#aae89d3736661c36a5591788aebd0817 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_5.conda#d4ff227c46917d3b4565302a2bbb276b +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-hc881cc4_6.conda#df88796bd09a0d2ed292e59101478ad8 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.28.1-hd590300_0.conda#dcde58ff9a1f30b0037a2315d1846d1f https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d @@ -23,7 +23,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.20-hd590300_0.conda https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_5.conda#7a6bd7a12a4bd359e2afe6c0fa1acace +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-h43f5ff8_6.conda#e54a5ddc67e673f9105cf2a2e9c070b0 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d @@ -50,7 +50,7 @@ https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd7 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_5.conda#e73e9cfd1191783392131e6238bdb3e9 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_6.conda#3666a850342f8f3be88f9a93d948d027 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.3-h2797004_0.conda#b3316cbe90249da4f8e84cd66e1cc55b @@ -103,7 +103,7 @@ https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py311h459d7ec_0 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#248f521b64ce055e7feae3105e7abeb8 -https://conda.anaconda.org/conda-forge/noarch/pluggy-1.4.0-pyhd8ed1ab_0.conda#139e9feb65187e916162917bb2484976 +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda#140a7f159396547e9799aa98f9f0742e https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f @@ -163,7 +163,7 @@ https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py311h54ef https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py311he8ad708_100.conda#597b1ad6cb7011b7561c20ea30295cae https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py311h320fe9a_0.conda#fcda2652548238199b7de71dbde4e7fe https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.0-py311h1f0f07a_1.conda#74e551cef928303ec57f42828c51cf87 -https://conda.anaconda.org/conda-forge/noarch/iris-3.8.1-pyha770c72_0.conda#b08a116ef1607e7e960a4caa902e3a90 +https://conda.anaconda.org/conda-forge/noarch/iris-3.9.0-pyha770c72_0.conda#efaf150eb009f04efa58f1401c767192 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda#611a35a27914fac3aa37611a6fe40bb5 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.6-pyhd8ed1ab_0.conda#d7e4954df0d3aea2eacc7835ad12671d https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.5-pyhd8ed1ab_0.conda#7e1e7437273682ada2ed5e9e9714b140 diff --git a/requirements/locks/py39-linux-64.lock b/requirements/locks/py312-linux-64.lock similarity index 80% rename from requirements/locks/py39-linux-64.lock rename to requirements/locks/py312-linux-64.lock index 2ea6dacc..c02d488f 100644 --- a/requirements/locks/py39-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -1,16 +1,16 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 7e7dd4cf74148655349102a6a27dccab372cc945b64fe069cbb5be59c905fb6d +# input_hash: 2303059b56cea7e0a0d3f3356752a792ae2582a7d26e089af84842308db60b23 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_5.conda#f6f6600d18a4047b54f803cf708b868a -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.9-4_cp39.conda#bfe4b3259a8ac6cdf0037752904da6a7 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h55db66e_0.conda#10569984e7db886e4f1abc2b47ad79a1 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h95c4c6d_6.conda#3cfab3e709f77e9f1b3d380eb622494a +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-4_cp312.conda#dccc2d142812964fcc6abdc97b672dff https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_5.conda#d211c42b9ce49aee3734fdc828731689 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-hc881cc4_6.conda#aae89d3736661c36a5591788aebd0817 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_5.conda#d4ff227c46917d3b4565302a2bbb276b +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-hc881cc4_6.conda#df88796bd09a0d2ed292e59101478ad8 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.28.1-hd590300_0.conda#dcde58ff9a1f30b0037a2315d1846d1f https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d @@ -23,7 +23,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.20-hd590300_0.conda https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_5.conda#7a6bd7a12a4bd359e2afe6c0fa1acace +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-h43f5ff8_6.conda#e54a5ddc67e673f9105cf2a2e9c070b0 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d @@ -50,7 +50,7 @@ https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd7 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_5.conda#e73e9cfd1191783392131e6238bdb3e9 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_6.conda#3666a850342f8f3be88f9a93d948d027 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.3-h2797004_0.conda#b3316cbe90249da4f8e84cd66e1cc55b @@ -70,64 +70,70 @@ https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_h413a1c8_0.conda#a356024784da6dfd4683dc5ecf45b155 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda#66f03896ffbe1a110ffda05c7a856504 -https://conda.anaconda.org/conda-forge/linux-64/python-3.9.19-h0755675_0_cpython.conda#d9ee3647fbd9e8595b8df759b2bbefb8 +https://conda.anaconda.org/conda-forge/linux-64/python-3.12.3-hab00c5b_0_cpython.conda#2540b74d304f71d3e89c81209db4db84 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.3-h2c6b66d_0.conda#be7d70f2db41b674733667bdd69bd000 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-h8ee46fc_0.conda#077b6e8ad6a3ddb741fce2496dd01bec +https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda#5e4c0743c70186509d1412e03c2d8dfa https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py39h3d6467e_1.conda#c48418c8b35f1d59ae9ae1174812b40a +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h30efb56_1.conda#45801a89533d3336a365284d93298e36 https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda#0876280e409658fc6f9e75d035960333 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.conda#753d29fe41bb881e4b9c004f0abf973f https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 +https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py312h7900ff3_3.conda#1b90835ae26b9b8250b302649359a989 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.4-pyhd8ed1ab_0.conda#6baa2e7fc09bd2c7c82cb6662d5f1d36 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.3.1-pyhca7485f_0.conda#b7f0662ef2c9d4404f0af9eef5ed2fde https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda#c0cc1420498b17414d8617d0b9f506ca +https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 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/kiwisolver-1.4.5-py39h7633fee_1.conda#c9f74d717e5a2847a9f8b779c54130f2 +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py312h8572e83_1.conda#c1e71f2bc05d8e8e033aefac2c490d05 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-22_linux64_openblas.conda#1a2a0cd3153464fee6646f3dd6dad9b8 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.7.1-hca28451_0.conda#755c7f876815003337d2c61ff5d047e5 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py39hd1e30aa_0.conda#9a9a22eb1f83c44953319ee3b027769f +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py312h98912ed_0.conda#6ff0b9582da2d4a74a1f9ae1f9ce2af6 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#248f521b64ce055e7feae3105e7abeb8 -https://conda.anaconda.org/conda-forge/noarch/pluggy-1.4.0-pyhd8ed1ab_0.conda#139e9feb65187e916162917bb2484976 +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 +https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda#140a7f159396547e9799aa98f9f0742e https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 -https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py39hd1e30aa_0.conda#756cb152772a225587a05ca0ec68fc08 -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py39hd1e30aa_1.conda#37218233bcdc310e4fde6453bc1b40d8 +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py312h98912ed_0.conda#a8f9739e0ada2320148c92ddd608864f +https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py312h98912ed_1.conda#e3fd78d8d490af1d84763b9fe3f2e552 https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda#7462280d81f639363e6e63c81276bd9e https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 +https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda#6ef2fc37559256cf682d8b3375e89b80 -https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py39hd1e30aa_0.conda#1da984bbb6e765743e13388ba7b7b2c8 https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda#0b5293a157c2b5cd513dd1b03d8d3aae https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a -https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py39h7a31438_0.conda#ac992767d7f8ed2cb27e71e78f0fb2d7 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.51.0-py39hd1e30aa_0.conda#79f5dd8778873faa54e8f7b2729fe8a6 +https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py312hf06ca03_0.conda#56b0ca764ce23cc54f3f7e2a7b970f6d +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.51.0-py312h98912ed_0.conda#f0cd0e54adf65aaa976f5731b7a3f383 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_100.conda#d471a5c3abc984b662d9bae3bb7fd8a5 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda#0896606848b2dc5cebdf111b6543aa04 -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda#c5d3907ad8bd7bf557521a1833cf7e6d https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda#e7d8df6509ba635247ff9aea31134262 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda#4b31699e0ec5de64d5896e580389c9a1 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_openblas.conda#b083767b6c877e24ee597d93b87ab838 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 -https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py39h90c7501_0.conda#1e3b6af9592be71ce19f0a6aae05d97b +https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py312hdcec9eb_0.conda#425bb325f970e57a047ac57c4586489d https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.1-h1d62c97_0.conda#44ec51d0857d9be26158bb85caa74fdb https://conda.anaconda.org/conda-forge/noarch/pytest-8.1.1-pyhd8ed1ab_0.conda#94ff09cdedcb7b17e9cd5097ee2cfcff @@ -136,26 +142,33 @@ https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.11.0-hd8ed1ab_ https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 -https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.4.0-pyhd8ed1ab_0.conda#dcbadab7a68738a028e195ab68ab2d2e https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.1.0-hd8ed1ab_0.conda#6ef2b72d291b39e479d7694efa2b2b98 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h9612171_113.conda#b2414908e43c442ddc68e6148774a304 -https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py39h474f0d3_0.conda#aa265f5697237aa13cc10f53fa8acc4f -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py39h15b0fa6_5.conda#85e186c7ff673b0d0026782ec353fb2a +https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda#d8285bea2a350f63fab23bf460221f3f +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py312h38f1c37_5.conda#867baf2a7c5c6147e05ecc90f6c52a0c https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.0.4-pyhd8ed1ab_1.conda#a1986ad21c766ff22f7bae93f0641020 -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py39h44dd56e_0.conda#baea2f5dfb3ab7b1c836385d2e1daca7 -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py39h7633fee_0.conda#bdc188e59857d6efab332714e0d01d93 +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py312hc7c0aa3_0.conda#bd11505f0fe9bd8bcec01ce1220f63c7 +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py312h8572e83_0.conda#12c6a831ef734f0b2dd4caff514cbb7f https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.4.2-pyhd8ed1ab_0.conda#bb4e6c52855aa64a5443ca4eedaa6cfe https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.3-he6dfbbe_0.conda#05c1609de571f7a9a40e6d7d4116c21a -https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py39hd1e30aa_1.conda#ca63612907462c8e36edcc9bbacc253e -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py39h474f0d3_0.conda#46ae0ecba9726ab4fa44c78fefa522cf +https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py312h98912ed_1.conda#d5273d1e67b7b3a871a0a711c6532a2f +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py312heda63a1_0.conda#c53b9f319cafc679476f5613599857e8 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.0.4-hd8ed1ab_1.conda#b065535ca8ca824703ae5537087e2206 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py39h6404dd3_0.conda#c33c60a88dad5df6960c4da482f9e313 -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py39h44dd56e_4.conda#81310d21bf9d91754c1220c585bb72d6 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py312h9e6bd2c_0.conda#770f506aa607cb6ff2a57e35e289ab20 +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py312hc7c0aa3_4.conda#d9c9fa64fdf4e57d7f8957b957d784a0 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.35.0-he84ddb8_0.conda#2d01dfbe537478e7a1a495b9639edd45 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py39he9076e7_0.conda#1919384a8420e7bb25f6c3a582e0857c -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py39h4282601_100.conda#d2809fbf0d8ae7b8ca92c456cb44a7d4 -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py39hddac248_0.conda#aa02350ccb542c83272f9cb7e4dfe15e -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.0-py39h44dd56e_1.conda#629e8d066a330f729d0085d86681fd01 -https://conda.anaconda.org/conda-forge/noarch/iris-3.8.1-pyha770c72_0.conda#b08a116ef1607e7e960a4caa902e3a90 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py312he5832f3_0.conda#5377a9a29f607eebe4ad63eb82bcb575 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py312h26027e0_100.conda#2d7b4954dc5a090796e0ba89c325d09b +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py312hfb8ada1_0.conda#73e223e294f96540f293bf977a37696c +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.0-py312hc7c0aa3_1.conda#2df4c1f4d317ff0eb339f1a035dd717d +https://conda.anaconda.org/conda-forge/noarch/iris-3.9.0-pyha770c72_0.conda#efaf150eb009f04efa58f1401c767192 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda#611a35a27914fac3aa37611a6fe40bb5 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.6-pyhd8ed1ab_0.conda#d7e4954df0d3aea2eacc7835ad12671d +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.5-pyhd8ed1ab_0.conda#7e1e7437273682ada2ed5e9e9714b140 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jquery-4.1-pyhd8ed1ab_0.conda#914897066d5873acfb13e75705276ad1 +https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-2.0.0-pyha770c72_0.conda#baf6d9a33df1a789ca55e3b404c7ea28 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.7-pyhd8ed1ab_0.conda#26acae54b06f178681bfb551760f5dd1 +https://conda.anaconda.org/conda-forge/noarch/sphinx-7.3.7-pyhd8ed1ab_0.conda#7b1465205e28d75d2c0e1a868ee00a67 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda#e507335cb4ca9cff4c3d0fa9cdab255e diff --git a/requirements/py310.yml b/requirements/py310.yml index 6e24376a..99073e85 100644 --- a/requirements/py310.yml +++ b/requirements/py310.yml @@ -7,8 +7,8 @@ dependencies: - python=3.10 # Setup dependencies. - - setuptools - - setuptools_scm >=7 + - setuptools>=64 + - setuptools_scm>=8 # Core dependencies. - iris>=3.0.2 @@ -26,4 +26,6 @@ dependencies: - pytest - pytest-mock - +# Documentation dependencies. + - sphinx + - sphinx_rtd_theme diff --git a/requirements/py311.yml b/requirements/py311.yml index 61600305..384398e7 100644 --- a/requirements/py311.yml +++ b/requirements/py311.yml @@ -7,8 +7,8 @@ dependencies: - python=3.11 # Setup dependencies. - - setuptools - - setuptools_scm >=7 + - setuptools>=64 + - setuptools_scm>=8 # Core dependencies. - iris>=3.0.2 diff --git a/requirements/py39.yml b/requirements/py312.yml similarity index 72% rename from requirements/py39.yml rename to requirements/py312.yml index 302f8305..ef2d96c3 100644 --- a/requirements/py39.yml +++ b/requirements/py312.yml @@ -4,11 +4,11 @@ channels: - conda-forge dependencies: - - python=3.9 + - python=3.12 # Setup dependencies. - - setuptools - - setuptools_scm >=7 + - setuptools>=64 + - setuptools_scm>=8 # Core dependencies. - iris>=3.0.2 @@ -26,3 +26,6 @@ dependencies: - pytest - pytest-mock +# Documentation dependencies. + - sphinx + - sphinx_rtd_theme diff --git a/requirements/readthedocs.yml b/requirements/readthedocs.yml index b0c50b8b..331a25f1 120000 --- a/requirements/readthedocs.yml +++ b/requirements/readthedocs.yml @@ -1 +1 @@ -py311.yml \ No newline at end of file +py312.yml \ No newline at end of file diff --git a/requirements/setup.txt b/requirements/setup.txt index fb07d5ac..33d6aa01 100644 --- a/requirements/setup.txt +++ b/requirements/setup.txt @@ -1,4 +1,4 @@ # Dependencies necessary to run setup.py of iris-grib # --------------------------------------------------- -setuptools +setuptools>=64 diff --git a/src/iris_grib/_save_rules.py b/src/iris_grib/_save_rules.py index 3e8cb295..cb5ae00b 100644 --- a/src/iris_grib/_save_rules.py +++ b/src/iris_grib/_save_rules.py @@ -989,7 +989,7 @@ def set_fixed_surfaces(cube, grib, full3d_cube=None): hybrid_factories = [ factory for factory in cube.aux_factories - if isinstance(factory, (HybridHeightFactory, HybridPressureFactory)) + if isinstance(factory, HybridHeightFactory | HybridPressureFactory) ] if not hybrid_factories: hybrid_factory = None @@ -1145,7 +1145,7 @@ def set_fixed_surfaces(cube, grib, full3d_cube=None): n_coeffs = n_levels + 1 coeffs_array = np.zeros(n_coeffs * 2, dtype=np.float32) for n_lev, height, sigma in zip( - model_levels, level_delta_coord.points, sigma_coord.points + model_levels, level_delta_coord.points, sigma_coord.points, strict=False ): # Record all the level coefficients coming from the 'full' cube. # Note: if some model levels are missing, we must still have the diff --git a/src/iris_grib/grib_phenom_translation/_gribcode.py b/src/iris_grib/grib_phenom_translation/_gribcode.py index 5dfe5c5d..24fb0503 100644 --- a/src/iris_grib/grib_phenom_translation/_gribcode.py +++ b/src/iris_grib/grib_phenom_translation/_gribcode.py @@ -101,7 +101,9 @@ def GRIBCode(edition, *args, **kwargs): if nargs != 4: _invalid_nargs(args) - for i_arg, (arg, name) in enumerate(zip(args, instance_cls.argnames)): + for i_arg, (arg, name) in enumerate( + zip(args, instance_cls.argnames, strict=False) + ): if name in kwargs: msg = ( f"Keyword {name!r}={kwargs[name]!r} " diff --git a/src/iris_grib/tests/__init__.py b/src/iris_grib/tests/__init__.py index 197ff1b8..a0427b3e 100644 --- a/src/iris_grib/tests/__init__.py +++ b/src/iris_grib/tests/__init__.py @@ -168,7 +168,7 @@ def assertGribMessageDifference( messages1 = list(GribMessage.messages_from_filename(filename1)) messages2 = list(GribMessage.messages_from_filename(filename2)) self.assertEqual(len(messages1), len(messages2)) - for m1, m2 in zip(messages1, messages2): + for m1, m2 in zip(messages1, messages2, strict=False): m1_sect = set(m1.sections.keys()) m2_sect = set(m2.sections.keys()) diff --git a/src/iris_grib/tests/unit/load_convert/test_generating_process.py b/src/iris_grib/tests/unit/load_convert/test_generating_process.py index 479a8ecc..35c0dc93 100644 --- a/src/iris_grib/tests/unit/load_convert/test_generating_process.py +++ b/src/iris_grib/tests/unit/load_convert/test_generating_process.py @@ -39,7 +39,7 @@ def _check_warnings(self, with_forecast=True): generating_process(*call_args, **call_kwargs) got_msgs = [call[0][0] for call in self.warn_patch.call_args_list] for got_msg, expected_fragment in zip( - sorted(got_msgs), sorted(expected_fragments) + sorted(got_msgs), sorted(expected_fragments), strict=False ): self.assertIn(expected_fragment, got_msg) diff --git a/src/iris_grib/tests/unit/load_convert/test_grid_definition_template_90.py b/src/iris_grib/tests/unit/load_convert/test_grid_definition_template_90.py index 202132d2..7f6ece4f 100644 --- a/src/iris_grib/tests/unit/load_convert/test_grid_definition_template_90.py +++ b/src/iris_grib/tests/unit/load_convert/test_grid_definition_template_90.py @@ -96,7 +96,9 @@ def compare(self, metadata, expected): len(metadata["dim_coords_and_dims"]), len(expected["dim_coords_and_dims"]) ) for result_pair, expected_pair in zip( - metadata["dim_coords_and_dims"], expected["dim_coords_and_dims"] + metadata["dim_coords_and_dims"], + expected["dim_coords_and_dims"], + strict=False, ): result_coord, result_dims = result_pair expected_coord, expected_dims = expected_pair diff --git a/src/iris_grib/tests/unit/test_save_grib2.py b/src/iris_grib/tests/unit/test_save_grib2.py index 44603b30..fad92b3c 100644 --- a/src/iris_grib/tests/unit/test_save_grib2.py +++ b/src/iris_grib/tests/unit/test_save_grib2.py @@ -20,14 +20,14 @@ def setUp(self): func = "iris_grib.save_pairs_from_cube" self.messages = list(range(10)) slices = self.messages - side_effect = [zip(slices, self.messages)] + side_effect = [zip(slices, self.messages, strict=False)] self.save_pairs_from_cube = self.patch(func, side_effect=side_effect) func = "iris_grib.save_messages" self.save_messages = self.patch(func) def _check(self, append=False): iris_grib.save_grib2(self.cube, self.target, append=append) - self.save_pairs_from_cube.called_once_with(self.cube) + self.save_pairs_from_cube.assert_called_once_with(self.cube) args, kwargs = self.save_messages.call_args self.assertEqual(len(args), 2) messages, target = args From a59d5367f11f75e042cb5b1a614d9309f583cc15 Mon Sep 17 00:00:00 2001 From: Bill Little Date: Thu, 25 Apr 2024 12:53:00 +0100 Subject: [PATCH 298/583] ignore noisy pull-requests with .git-blame-ignore-revs (#452) * ignore noisy pull-requests with .git-blame-ignore-revs * update manifest --------- Co-authored-by: Patrick Peglar --- .git-blame-ignore-revs | 5 +++++ MANIFEST.in | 1 + 2 files changed, 6 insertions(+) create mode 100644 .git-blame-ignore-revs diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs new file mode 100644 index 00000000..595c9be9 --- /dev/null +++ b/.git-blame-ignore-revs @@ -0,0 +1,5 @@ +# adopt ruff (#430) +669a5daf1433a99766f0ecbf1513758f3c97e6d6 + +# migrate iris_grib to src/iris_grib (#450) +e57dac079591b978806e55c7450b61d62b9342f5 diff --git a/MANIFEST.in b/MANIFEST.in index d8e2ea0b..38779ee5 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -7,6 +7,7 @@ recursive-include src *.cml *.grib2 *.json *.nc *.py exclude .coveragerc exclude .flake8 +exclude .git-blame-ignore-revs exclude .gitignore exclude .pre-commit-config.yaml exclude .readthedocs.yml From c43905d2b2f9f827bd5377beb175bf1535290556 Mon Sep 17 00:00:00 2001 From: Bill Little Date: Thu, 25 Apr 2024 14:50:11 +0100 Subject: [PATCH 299/583] update dependencies and enable codecov (#454) * update dependencies * update lock files * enable codecov report * change ci-tests matrix job name * update badge * iris cut'n paste correction --- .github/workflows/ci-tests.yml | 12 ++++++----- README.md | 2 +- noxfile.py | 8 +++++-- pyproject.toml | 11 ++++++---- requirements/all.txt | 3 --- requirements/core.txt | 4 ---- requirements/locks/py310-linux-64.lock | 21 ++++++++++++++++++- requirements/locks/py311-linux-64.lock | 21 ++++++++++++++++++- requirements/locks/py312-linux-64.lock | 21 ++++++++++++++++++- requirements/py310.yml | 4 ++++ requirements/py311.yml | 4 ++++ requirements/py312.yml | 4 ++++ requirements/pypi-core.txt | 2 ++ requirements/pypi-optional-dev.txt | 2 ++ .../{test.txt => pypi-optional-test.txt} | 5 +++-- requirements/setup.txt | 4 ---- 16 files changed, 100 insertions(+), 28 deletions(-) delete mode 100644 requirements/all.txt delete mode 100644 requirements/core.txt create mode 100644 requirements/pypi-core.txt create mode 100644 requirements/pypi-optional-dev.txt rename requirements/{test.txt => pypi-optional-test.txt} (70%) delete mode 100644 requirements/setup.txt diff --git a/.github/workflows/ci-tests.yml b/.github/workflows/ci-tests.yml index c76994b2..7be851f4 100644 --- a/.github/workflows/ci-tests.yml +++ b/.github/workflows/ci-tests.yml @@ -23,7 +23,7 @@ concurrency: jobs: tests: - name: "${{ matrix.session }} (py${{ matrix.python-version }} ${{ matrix.os }}) [${{ matrix.iris-source }}]" + name: "${{ matrix.session }} py${{ matrix.python-version }} [${{ matrix.iris-source }}]" runs-on: ${{ matrix.os }} @@ -123,14 +123,16 @@ jobs: env_name: ${{ env.ENV_NAME }} lock_file: ${{ env.LOCK_FILE }} - - name: "iris ${{ matrix.session }}" + - name: "iris-grib ${{ matrix.session }}" env: IRIS_SOURCE: ${{ matrix.iris-source }} PY_COLORS: 1 PY_VER: ${{ matrix.python-version }} run: | - nox --session ${{ matrix.session }} -- --test-data-dir ${HOME}/iris-test-data/test_data + nox --session ${{ matrix.session }} -- ${{ matrix.coverage }} --test-data-dir ${HOME}/iris-test-data/test_data - - name: "Upload coverage report" + - name: "upload coverage report" + if: ${{ matrix.coverage }} uses: codecov/codecov-action@v4 - if: ${{ matrix.coverage }} \ No newline at end of file + with: + token: ${{ secrets.CODECOV_TOKEN }} diff --git a/README.md b/README.md index 32fb3a20..78fffb13 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ | ⚙️ CI | [![ci-manifest](https://github.com/SciTools/iris-grib/actions/workflows/ci-manifest.yml/badge.svg)](https://github.com/SciTools/iris-grib/actions/workflows/ci-manifest.yml) [![ci-tests](https://github.com/SciTools/iris-grib/actions/workflows/ci-tests.yml/badge.svg)](https://github.com/SciTools/iris-grib/actions/workflows/ci-tests.yml) [![pre-commit](https://results.pre-commit.ci/badge/github/SciTools/iris-grib/main.svg)](https://results.pre-commit.ci/latest/github/SciTools/iris-grib/main) | | 💬 Community | [![GH Discussions](https://img.shields.io/badge/github-discussions%20%F0%9F%92%AC-yellow?logo=github&logoColor=lightgrey)](https://github.com/SciTools/iris-grib/discussions) | | 📖 Documentation | [![rtd](https://readthedocs.org/projects/iris-grib/badge/?version=latest)](https://iris-grib.readthedocs.io/en/latest/?badge=latest) | -| 📈 Health | [![coveralls](https://coveralls.io/repos/github/SciTools/iris-grib/badge.svg?branch=main)](https://coveralls.io/github/SciTools/iris-grib?branch=main) | +| 📈 Health | [![codecov](https://codecov.io/gh/SciTools/iris-grib/graph/badge.svg?token=5VtBaElXFW)](https://codecov.io/gh/SciTools/iris-grib) | | ✨ Meta | [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff) [![NEP29](https://raster.shields.io/badge/follows-NEP29-orange.png)](https://numpy.org/neps/nep-0029-deprecation_policy.html) [![license - bds-3-clause](https://img.shields.io/github/license/SciTools/iris-grib)](https://github.com/SciTools/iris-grib/blob/main/LICENSE) [![conda platform](https://img.shields.io/conda/pn/conda-forge/iris-grib.svg)](https://anaconda.org/conda-forge/iris-grib) | | 📦 Package | [![conda-forge](https://img.shields.io/conda/vn/conda-forge/iris-grib?color=orange&label=conda-forge&logo=conda-forge&logoColor=white)](https://anaconda.org/conda-forge/iris-grib) [![pypi](https://img.shields.io/pypi/v/iris-grib?color=orange&label=pypi&logo=python&logoColor=white)](https://pypi.org/project/iris-grib/) [![pypi - python version](https://img.shields.io/pypi/pyversions/iris-grib.svg?color=orange&logo=python&label=python&logoColor=white)](https://pypi.org/project/iris-grib/) | | 🧰 Repo | [![commits-since](https://img.shields.io/github/commits-since/SciTools/iris-grib/latest.svg)](https://github.com/SciTools/iris-grib/commits/main) [![contributors](https://img.shields.io/github/contributors/SciTools/iris-grib)](https://github.com/SciTools/iris-grib/graphs/contributors) [![release](https://img.shields.io/github/v/release/scitools/iris-grib)](https://github.com/SciTools/iris-grib/releases) | diff --git a/noxfile.py b/noxfile.py index 7d68435f..1b77a7d5 100644 --- a/noxfile.py +++ b/noxfile.py @@ -270,11 +270,15 @@ def tests(session: nox.sessions.Session, iris_source: str): session.run("python", "-m", "eccodes", "selfcheck") - session.run( + run_args = [ "pytest", "--pyargs", "iris_grib", - ) + ] + + if "-c" in session.posargs or "--coverage" in session.posargs: + run_args.extend(["--cov=iris_grib", "--cov-report=xml"]) + session.run(*run_args) @nox.session(python=PY_VER, venv_backend="conda") diff --git a/pyproject.toml b/pyproject.toml index f3e27649..6fdd7592 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,12 +31,13 @@ classifiers = [ "Topic :: Scientific/Engineering :: Atmospheric Science", "Topic :: Scientific/Engineering :: Visualization", ] +description = "Functionality for converting between weather/climate datasets stored as GRIB files and SciTools-Iris Cubes" dynamic = [ "dependencies", + "optional-dependencies", "readme", "version", ] -description = "Functionality for converting between weather/climate datasets stored as GRIB files and SciTools-Iris Cubes" keywords = [ "iris", "GRIB", @@ -58,10 +59,12 @@ Issues = "https://github.com/SciTools/iris-grib/issues" license-files = ["LICENSE"] [tool.setuptools.dynamic] -dependencies = {file = "requirements/core.txt"} +dependencies = {file = "requirements/pypi-core.txt"} readme = {file = "README.md", content-type = "text/markdown"} -optional-dependencies.all = {file = "requirements/all.txt"} -optional-dependencies.test = {file = "requirements/test.txt"} + +[tool.setuptools.dynamic.optional-dependencies] +dev = {file = "requirements/pypi-optional-dev.txt"} +test = {file = "requirements/pypi-optional-test.txt"} [tool.setuptools.packages.find] include = ["iris_grib*"] diff --git a/requirements/all.txt b/requirements/all.txt deleted file mode 100644 index e776a67c..00000000 --- a/requirements/all.txt +++ /dev/null @@ -1,3 +0,0 @@ -# Optional dependencies. - -mo_pack diff --git a/requirements/core.txt b/requirements/core.txt deleted file mode 100644 index 142dd757..00000000 --- a/requirements/core.txt +++ /dev/null @@ -1,4 +0,0 @@ -# Core dependencies. - -scitools-iris>=3.0.2 -eccodes>=1.6.1 \ No newline at end of file diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index bb4587ab..5a17684f 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: bb88ce5d10a10e0a0df2ba8800b44ef1b44c069439153d3d6e424343ba556057 +# input_hash: 4c1c053d02dd4f1e5cf7ab187666840f573cfba8ed9387d768c66010531db165 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef @@ -76,15 +76,21 @@ https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-h8ee46fc_0.conda#077b6e8ad6a3ddb741fce2496dd01bec https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 +https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.3.0-pyhd8ed1ab_0.conda#f42f433e48d6a715c0978b44a9219406 https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda#5e4c0743c70186509d1412e03c2d8dfa https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hc6cd4ac_1.conda#1f95722c94f00b69af69a066c7433714 +https://conda.anaconda.org/conda-forge/noarch/cachetools-5.3.3-pyhd8ed1ab_0.conda#cd4c26c702a9bcdc70ff05b609ddacbe https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda#0876280e409658fc6f9e75d035960333 +https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2#ebb5f5f7dc4f1a3780ef7ea7738db08c +https://conda.anaconda.org/conda-forge/linux-64/chardet-5.2.0-py310hff52083_1.conda#a677136a83b823803d2f92045f885be2 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.conda#753d29fe41bb881e4b9c004f0abf973f https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 +https://conda.anaconda.org/conda-forge/linux-64/colorlog-6.8.2-py310hff52083_0.conda#db1be62a6a5d51f5a36fb99b2cc12972 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 +https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py310hff52083_3.conda#c159dcd29bbd80b187b1c5d5f73cc971 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.4-pyhd8ed1ab_0.conda#6baa2e7fc09bd2c7c82cb6662d5f1d36 @@ -103,6 +109,7 @@ https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py310h2372a71_0 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#248f521b64ce055e7feae3105e7abeb8 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.1-pyhd8ed1ab_0.conda#d478a8a3044cdff1aa6e62f9269cefe0 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda#140a7f159396547e9799aa98f9f0742e @@ -116,6 +123,7 @@ https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 +https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda#6ef2fc37559256cf682d8b3375e89b80 @@ -126,6 +134,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_10 https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py310h2fee648_0.conda#45846a970e71ac98fd327da5d40a0a2c +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.0-py310hc51659f_0.conda#3609fdb03842f67e2ec68a9c137221b8 https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.51.0-py310h2372a71_0.conda#1a4773624145c15b92820fe6c87c5fcd https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_100.conda#d471a5c3abc984b662d9bae3bb7fd8a5 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda#0896606848b2dc5cebdf111b6543aa04 @@ -133,35 +142,45 @@ https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda#e7 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda#4b31699e0ec5de64d5896e580389c9a1 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_openblas.conda#b083767b6c877e24ee597d93b87ab838 +https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda#2a75b296096adabbabadd5e9782e5fcc https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py310hf73ecf8_0.conda#1de56cf017dfd02aa84093206a0141a8 https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.1-h1d62c97_0.conda#44ec51d0857d9be26158bb85caa74fdb +https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.6.1-pyhd8ed1ab_0.conda#1815c7974568079cf384f012de5ea1b7 https://conda.anaconda.org/conda-forge/noarch/pytest-8.1.1-pyhd8ed1ab_0.conda#94ff09cdedcb7b17e9cd5097ee2cfcff https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.11.0-hd8ed1ab_0.conda#471e3988f8ca5e9eb3ce6be7eac3bcee https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.0-pyhd8ed1ab_0.conda#7d2bc38bd1777c86cc345e510735d9ff https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.1.0-hd8ed1ab_0.conda#6ef2b72d291b39e479d7694efa2b2b98 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h9612171_113.conda#b2414908e43c442ddc68e6148774a304 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py310hb13e2d6_0.conda#6593de64c935768b6bad3e19b3e978be https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py310hd5c30f3_5.conda#dc2ee770a2299307f3c127af79160d25 +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.0.4-pyhd8ed1ab_1.conda#a1986ad21c766ff22f7bae93f0641020 +https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310hd41b1e2_4.conda#35e87277fba9944b8a975113538bb5df https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py310h1f7b6fc_0.conda#31beda75384647959d5792a1a7dc571a +https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_0.conda#2cc61ba1dd53f0806247333f1294e058 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py310hd41b1e2_0.conda#60ee50b1968f802f2a487ba36d4cce0d https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.4.2-pyhd8ed1ab_0.conda#bb4e6c52855aa64a5443ca4eedaa6cfe +https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda#ba68cb5105760379432cebc82b45af40 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.3-he6dfbbe_0.conda#05c1609de571f7a9a40e6d7d4116c21a https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py310h2372a71_1.conda#dfcf64f67961eb9686676f96fdb4b4d1 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py310hb13e2d6_0.conda#512cfc0369e247e3993a76030671cce0 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.0.4-hd8ed1ab_1.conda#b065535ca8ca824703ae5537087e2206 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py310hc3e127f_0.conda#5cc13dc3d6981b2187616b824e1c5fae +https://conda.anaconda.org/conda-forge/noarch/tox-4.14.2-pyhd8ed1ab_0.conda#0c3413e30566dbc162c71ef7190259c4 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py310h1f7b6fc_4.conda#0ca55ca20891d393846695354b32ebc5 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.35.0-he84ddb8_0.conda#2d01dfbe537478e7a1a495b9639edd45 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py310h62c0568_0.conda#bdfa3aee52579c6b3dde12f52e266ef2 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py310hba70d50_100.conda#e19392760c7e4da3b9cb0ee5bf61bc4b +https://conda.anaconda.org/conda-forge/noarch/nox-2024.4.15-pyhff2d567_0.conda#600c0de12125f473d8099c0b3e6f88d4 +https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.0-pyha770c72_0.conda#846ba0877cda9c4f11e13720cacd1968 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py310hcc13569_0.conda#89a13de526ea3008341e3a2aeab4da7e https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.0-py310h1f7b6fc_1.conda#f020ac07b7df9c4b0bd0ece3055b5bd2 https://conda.anaconda.org/conda-forge/noarch/iris-3.9.0-pyha770c72_0.conda#efaf150eb009f04efa58f1401c767192 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 11d8baef..4624e860 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 1279dfdc9dd0c047ff7eaebc0d9b8b86d968c282cc67f8db940122c918a0dc4a +# input_hash: 6a68a02a78ade04a4a59ce590941c300e88b24a33dba39a768238431f8839a35 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef @@ -76,15 +76,21 @@ https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-h8ee46fc_0.conda#077b6e8ad6a3ddb741fce2496dd01bec https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 +https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.3.0-pyhd8ed1ab_0.conda#f42f433e48d6a715c0978b44a9219406 https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda#5e4c0743c70186509d1412e03c2d8dfa https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hb755f60_1.conda#cce9e7c3f1c307f2a5fb08a2922d6164 +https://conda.anaconda.org/conda-forge/noarch/cachetools-5.3.3-pyhd8ed1ab_0.conda#cd4c26c702a9bcdc70ff05b609ddacbe https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda#0876280e409658fc6f9e75d035960333 +https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2#ebb5f5f7dc4f1a3780ef7ea7738db08c +https://conda.anaconda.org/conda-forge/linux-64/chardet-5.2.0-py311h38be061_1.conda#b8cfb13de4dbe349a41800644391de6a https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.conda#753d29fe41bb881e4b9c004f0abf973f https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 +https://conda.anaconda.org/conda-forge/linux-64/colorlog-6.8.2-py311h38be061_0.conda#69ddfed4db722e2b6ab93dd6c66df163 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 +https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py311h38be061_3.conda#1c33f55e5cdcc2a2b973c432b5225bfe https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.4-pyhd8ed1ab_0.conda#6baa2e7fc09bd2c7c82cb6662d5f1d36 @@ -103,6 +109,7 @@ https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py311h459d7ec_0 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#248f521b64ce055e7feae3105e7abeb8 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.1-pyhd8ed1ab_0.conda#d478a8a3044cdff1aa6e62f9269cefe0 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda#140a7f159396547e9799aa98f9f0742e @@ -116,6 +123,7 @@ https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 +https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda#6ef2fc37559256cf682d8b3375e89b80 @@ -125,6 +133,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_10 https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py311hb3a22ac_0.conda#b3469563ac5e808b0cd92810d0697043 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.0-py311h331c9d8_0.conda#5420e3594638adf670fca1a601d7efb9 https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.51.0-py311h459d7ec_0.conda#17e1997cc17c571d5ad27bd0159f616c https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_100.conda#d471a5c3abc984b662d9bae3bb7fd8a5 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda#0896606848b2dc5cebdf111b6543aa04 @@ -132,35 +141,45 @@ https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda#e7 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda#4b31699e0ec5de64d5896e580389c9a1 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_openblas.conda#b083767b6c877e24ee597d93b87ab838 +https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda#2a75b296096adabbabadd5e9782e5fcc https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py311h18e6fac_0.conda#6c520a9d36c9d7270988c7a6c360d6d4 https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.1-h1d62c97_0.conda#44ec51d0857d9be26158bb85caa74fdb +https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.6.1-pyhd8ed1ab_0.conda#1815c7974568079cf384f012de5ea1b7 https://conda.anaconda.org/conda-forge/noarch/pytest-8.1.1-pyhd8ed1ab_0.conda#94ff09cdedcb7b17e9cd5097ee2cfcff https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.11.0-hd8ed1ab_0.conda#471e3988f8ca5e9eb3ce6be7eac3bcee https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.0-pyhd8ed1ab_0.conda#7d2bc38bd1777c86cc345e510735d9ff https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.1.0-hd8ed1ab_0.conda#6ef2b72d291b39e479d7694efa2b2b98 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h9612171_113.conda#b2414908e43c442ddc68e6148774a304 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.conda#a502d7aad449a1206efb366d6a12c52d https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311hca0b8b9_5.conda#cac429fcb9126d5e6f02c8ba61c2a811 +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.0.4-pyhd8ed1ab_1.conda#a1986ad21c766ff22f7bae93f0641020 +https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311h9547e67_4.conda#586da7df03b68640de14dc3e8bcbf76f https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py311h1f0f07a_0.conda#b7e6d52b39e199238c3400cafaabafb3 +https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_0.conda#2cc61ba1dd53f0806247333f1294e058 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py311h9547e67_0.conda#74ad0ae64f1ef565e27eda87fa749e84 https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.4.2-pyhd8ed1ab_0.conda#bb4e6c52855aa64a5443ca4eedaa6cfe +https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda#ba68cb5105760379432cebc82b45af40 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.3-he6dfbbe_0.conda#05c1609de571f7a9a40e6d7d4116c21a https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py311h459d7ec_1.conda#45b8d355bbcdd27588c2d266bcfdff84 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py311h64a7726_0.conda#d443c70b4a05f50236c70b9c79beff64 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.0.4-hd8ed1ab_1.conda#b065535ca8ca824703ae5537087e2206 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py311h2032efe_0.conda#c99302680ce37b15bcda8152976cb3ba +https://conda.anaconda.org/conda-forge/noarch/tox-4.14.2-pyhd8ed1ab_0.conda#0c3413e30566dbc162c71ef7190259c4 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h1f0f07a_4.conda#1e105c1a8ea2163507726144b401eb1b https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.35.0-he84ddb8_0.conda#2d01dfbe537478e7a1a495b9639edd45 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py311h54ef318_0.conda#150186110f111b458f86c04361351337 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py311he8ad708_100.conda#597b1ad6cb7011b7561c20ea30295cae +https://conda.anaconda.org/conda-forge/noarch/nox-2024.4.15-pyhff2d567_0.conda#600c0de12125f473d8099c0b3e6f88d4 +https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.0-pyha770c72_0.conda#846ba0877cda9c4f11e13720cacd1968 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py311h320fe9a_0.conda#fcda2652548238199b7de71dbde4e7fe https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.0-py311h1f0f07a_1.conda#74e551cef928303ec57f42828c51cf87 https://conda.anaconda.org/conda-forge/noarch/iris-3.9.0-pyha770c72_0.conda#efaf150eb009f04efa58f1401c767192 diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index c02d488f..932a4e63 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 2303059b56cea7e0a0d3f3356752a792ae2582a7d26e089af84842308db60b23 +# input_hash: e331628709411f536645415b97f6e9a33cc09a114009b8a454673ee8d5392707 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef @@ -76,15 +76,21 @@ https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-h8ee46fc_0.conda#077b6e8ad6a3ddb741fce2496dd01bec https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 +https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.3.0-pyhd8ed1ab_0.conda#f42f433e48d6a715c0978b44a9219406 https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda#5e4c0743c70186509d1412e03c2d8dfa https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h30efb56_1.conda#45801a89533d3336a365284d93298e36 +https://conda.anaconda.org/conda-forge/noarch/cachetools-5.3.3-pyhd8ed1ab_0.conda#cd4c26c702a9bcdc70ff05b609ddacbe https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda#0876280e409658fc6f9e75d035960333 +https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2#ebb5f5f7dc4f1a3780ef7ea7738db08c +https://conda.anaconda.org/conda-forge/linux-64/chardet-5.2.0-py312h7900ff3_1.conda#af3980cc4690716a5510c8a08cb06238 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.conda#753d29fe41bb881e4b9c004f0abf973f https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 +https://conda.anaconda.org/conda-forge/linux-64/colorlog-6.8.2-py312h7900ff3_0.conda#0c03a414b685c2406126b677a8f0e083 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 +https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py312h7900ff3_3.conda#1b90835ae26b9b8250b302649359a989 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.4-pyhd8ed1ab_0.conda#6baa2e7fc09bd2c7c82cb6662d5f1d36 @@ -103,6 +109,7 @@ https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py312h98912ed_0 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#248f521b64ce055e7feae3105e7abeb8 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.1-pyhd8ed1ab_0.conda#d478a8a3044cdff1aa6e62f9269cefe0 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda#140a7f159396547e9799aa98f9f0742e @@ -116,6 +123,7 @@ https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 +https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda#6ef2fc37559256cf682d8b3375e89b80 @@ -125,6 +133,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_10 https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py312hf06ca03_0.conda#56b0ca764ce23cc54f3f7e2a7b970f6d +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.0-py312h9a8786e_0.conda#25044745b530207291239ad6f914c1d8 https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.51.0-py312h98912ed_0.conda#f0cd0e54adf65aaa976f5731b7a3f383 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_100.conda#d471a5c3abc984b662d9bae3bb7fd8a5 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda#0896606848b2dc5cebdf111b6543aa04 @@ -132,35 +141,45 @@ https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda#e7 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda#4b31699e0ec5de64d5896e580389c9a1 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_openblas.conda#b083767b6c877e24ee597d93b87ab838 +https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda#2a75b296096adabbabadd5e9782e5fcc https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py312hdcec9eb_0.conda#425bb325f970e57a047ac57c4586489d https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.1-h1d62c97_0.conda#44ec51d0857d9be26158bb85caa74fdb +https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.6.1-pyhd8ed1ab_0.conda#1815c7974568079cf384f012de5ea1b7 https://conda.anaconda.org/conda-forge/noarch/pytest-8.1.1-pyhd8ed1ab_0.conda#94ff09cdedcb7b17e9cd5097ee2cfcff https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.11.0-hd8ed1ab_0.conda#471e3988f8ca5e9eb3ce6be7eac3bcee https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.0-pyhd8ed1ab_0.conda#7d2bc38bd1777c86cc345e510735d9ff https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.1.0-hd8ed1ab_0.conda#6ef2b72d291b39e479d7694efa2b2b98 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h9612171_113.conda#b2414908e43c442ddc68e6148774a304 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda#d8285bea2a350f63fab23bf460221f3f https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py312h38f1c37_5.conda#867baf2a7c5c6147e05ecc90f6c52a0c +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.0.4-pyhd8ed1ab_1.conda#a1986ad21c766ff22f7bae93f0641020 +https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h8572e83_4.conda#52c9e25ee0a32485a102eeecdb7eef52 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py312hc7c0aa3_0.conda#bd11505f0fe9bd8bcec01ce1220f63c7 +https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_0.conda#2cc61ba1dd53f0806247333f1294e058 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py312h8572e83_0.conda#12c6a831ef734f0b2dd4caff514cbb7f https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.4.2-pyhd8ed1ab_0.conda#bb4e6c52855aa64a5443ca4eedaa6cfe +https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda#ba68cb5105760379432cebc82b45af40 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.3-he6dfbbe_0.conda#05c1609de571f7a9a40e6d7d4116c21a https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py312h98912ed_1.conda#d5273d1e67b7b3a871a0a711c6532a2f https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py312heda63a1_0.conda#c53b9f319cafc679476f5613599857e8 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.0.4-hd8ed1ab_1.conda#b065535ca8ca824703ae5537087e2206 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py312h9e6bd2c_0.conda#770f506aa607cb6ff2a57e35e289ab20 +https://conda.anaconda.org/conda-forge/noarch/tox-4.14.2-pyhd8ed1ab_0.conda#0c3413e30566dbc162c71ef7190259c4 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py312hc7c0aa3_4.conda#d9c9fa64fdf4e57d7f8957b957d784a0 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.35.0-he84ddb8_0.conda#2d01dfbe537478e7a1a495b9639edd45 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py312he5832f3_0.conda#5377a9a29f607eebe4ad63eb82bcb575 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py312h26027e0_100.conda#2d7b4954dc5a090796e0ba89c325d09b +https://conda.anaconda.org/conda-forge/noarch/nox-2024.4.15-pyhff2d567_0.conda#600c0de12125f473d8099c0b3e6f88d4 +https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.0-pyha770c72_0.conda#846ba0877cda9c4f11e13720cacd1968 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py312hfb8ada1_0.conda#73e223e294f96540f293bf977a37696c https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.0-py312hc7c0aa3_1.conda#2df4c1f4d317ff0eb339f1a035dd717d https://conda.anaconda.org/conda-forge/noarch/iris-3.9.0-pyha770c72_0.conda#efaf150eb009f04efa58f1401c767192 diff --git a/requirements/py310.yml b/requirements/py310.yml index 99073e85..cebb4883 100644 --- a/requirements/py310.yml +++ b/requirements/py310.yml @@ -18,12 +18,16 @@ dependencies: # Optional dependencies. - mo_pack - pip + - pre-commit # Test dependencies. + - codecov - filelock + - nox - requests - iris-sample-data - pytest + - pytest-cov - pytest-mock # Documentation dependencies. diff --git a/requirements/py311.yml b/requirements/py311.yml index 384398e7..00df5e42 100644 --- a/requirements/py311.yml +++ b/requirements/py311.yml @@ -18,12 +18,16 @@ dependencies: # Optional dependencies. - mo_pack - pip + - pre-commit # Test dependencies. + - codecov - filelock + - nox - requests - iris-sample-data - pytest + - pytest-cov - pytest-mock # Documentation dependencies. diff --git a/requirements/py312.yml b/requirements/py312.yml index ef2d96c3..5fbd4be4 100644 --- a/requirements/py312.yml +++ b/requirements/py312.yml @@ -18,12 +18,16 @@ dependencies: # Optional dependencies. - mo_pack - pip + - pre-commit # Test dependencies. + - codecov - filelock + - nox - requests - iris-sample-data - pytest + - pytest-cov - pytest-mock # Documentation dependencies. diff --git a/requirements/pypi-core.txt b/requirements/pypi-core.txt new file mode 100644 index 00000000..0c3e69c5 --- /dev/null +++ b/requirements/pypi-core.txt @@ -0,0 +1,2 @@ +scitools-iris>=3.0.2 +eccodes>=1.6.1 diff --git a/requirements/pypi-optional-dev.txt b/requirements/pypi-optional-dev.txt new file mode 100644 index 00000000..a00c05de --- /dev/null +++ b/requirements/pypi-optional-dev.txt @@ -0,0 +1,2 @@ +mo_pack +pre-commit diff --git a/requirements/test.txt b/requirements/pypi-optional-test.txt similarity index 70% rename from requirements/test.txt rename to requirements/pypi-optional-test.txt index 8fc06edb..0fd077b3 100644 --- a/requirements/test.txt +++ b/requirements/pypi-optional-test.txt @@ -1,7 +1,8 @@ -# Test dependencies. - +codecov filelock +nox requests iris-sample-data pytest +pytest-cov pytest-mock diff --git a/requirements/setup.txt b/requirements/setup.txt deleted file mode 100644 index 33d6aa01..00000000 --- a/requirements/setup.txt +++ /dev/null @@ -1,4 +0,0 @@ -# Dependencies necessary to run setup.py of iris-grib -# --------------------------------------------------- - -setuptools>=64 From fea1607d756b57d49e3b029513f332d45f33478d Mon Sep 17 00:00:00 2001 From: tkknight <2108488+tkknight@users.noreply.github.com> Date: Thu, 25 Apr 2024 15:12:31 +0100 Subject: [PATCH 300/583] fix formatting. (#455) --- docs/index.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index d021c57d..f8fceba9 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -219,13 +219,13 @@ To ensure all ``iris-grib`` dependencies, it is sufficient to have installed The simplest way to install is with `conda `_ , using the `package on conda-forge `_ , -with the command +with the command:: $ conda install -c conda-forge iris-grib Pip can also be used, to install from the `package on PyPI `_ , -with the command +with the command:: $ pip install iris-grib From c0b68b75271402bd54953cf0742982edd49b003a Mon Sep 17 00:00:00 2001 From: Bill Little Date: Thu, 25 Apr 2024 18:15:48 +0100 Subject: [PATCH 301/583] adopt repo-review pre-commit hook (#456) --- .pre-commit-config.yaml | 7 +++++++ pyproject.toml | 13 +++++++++++++ 2 files changed, 20 insertions(+) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 05c15276..c7cc3174 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -74,6 +74,13 @@ repos: hooks: - id: validate-pyproject +- repo: https://github.com/scientific-python/cookie + rev: 2024.03.10 + hooks: + - id: sp-repo-review + additional_dependencies: ["repo-review[cli]"] + args: ["--show=errskip"] + # TODO: pending the addition of numpydoc, including config file(s). #- repo: https://github.com/numpy/numpydoc # rev: v1.7.0 diff --git a/pyproject.toml b/pyproject.toml index 6fdd7592..4f844692 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -108,6 +108,7 @@ ignore = [ # See https://mypy.readthedocs.io/en/stable/config_file.html ignore_missing_imports = true warn_unused_configs = true +warn_unreachable = true enable_error_code = ["ignore-without-code", "redundant-expr", "truthy-bool"] exclude = [ 'noxfile\.py', @@ -133,6 +134,18 @@ minversion = "6.0" testpaths = "src/iris_grib" xfail_strict = "True" +[tool.repo-review] +ignore = [ + # https://learn.scientific-python.org/development/guides/style/#MY102 + "MY102", # MyPy show_error_codes deprecated + # https://learn.scientific-python.org/development/guides/style/#PC170 + "PC170", # Uses PyGrep hooks + # https://learn.scientific-python.org/development/guides/style/#PC180 + "PC180", # Uses prettier + # https://learn.scientific-python.org/development/guides/pytest/#PP309 + "PP309", # Filter warnings specified +] + [tool.ruff] # Exclude the following, in addition to the standard set of exclusions. # https://docs.astral.sh/ruff/settings/#exclude From b96d4c6de6d188ce449682022ea2bbd4504aa68e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Apr 2024 09:40:12 +0100 Subject: [PATCH 302/583] Bump scitools/workflows in the dependencies group (#457) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2024.04.2 to 2024.04.3 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2024.04.2...2024.04.3) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 2c9e2467..5b1675b9 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.04.2 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.04.3 diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 7f356b4d..929d29b6 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.04.2 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.04.3 secrets: inherit From 5e7ba9bf74ea5ef79c482869073331c51c524e65 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 30 Apr 2024 10:20:57 +0100 Subject: [PATCH 303/583] chore: update pre-commit hooks (#462) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.4.1 → v0.4.2](https://github.com/astral-sh/ruff-pre-commit/compare/v0.4.1...v0.4.2) - [github.com/pre-commit/mirrors-mypy: v1.9.0 → v1.10.0](https://github.com/pre-commit/mirrors-mypy/compare/v1.9.0...v1.10.0) - [github.com/scientific-python/cookie: 2024.03.10 → 2024.04.23](https://github.com/scientific-python/cookie/compare/2024.03.10...2024.04.23) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c7cc3174..af9d8f2a 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -36,7 +36,7 @@ repos: - id: no-commit-to-branch - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.4.1" + rev: "v0.4.2" hooks: - id: ruff types: [file, python] @@ -64,7 +64,7 @@ repos: types: [file, python] - repo: https://github.com/pre-commit/mirrors-mypy - rev: 'v1.9.0' + rev: 'v1.10.0' hooks: - id: mypy exclude: 'noxfile\.py|docs/conf\.py' @@ -75,7 +75,7 @@ repos: - id: validate-pyproject - repo: https://github.com/scientific-python/cookie - rev: 2024.03.10 + rev: 2024.04.23 hooks: - id: sp-repo-review additional_dependencies: ["repo-review[cli]"] From 0be789edf60c0c7bba40a4ecb76530a717beda07 Mon Sep 17 00:00:00 2001 From: Bill Little Date: Thu, 2 May 2024 11:25:54 +0100 Subject: [PATCH 304/583] update .gitignore (#461) Co-authored-by: Patrick Peglar --- .gitignore | 186 ++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 162 insertions(+), 24 deletions(-) diff --git a/.gitignore b/.gitignore index ccb41249..8b7d2cc5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,33 +1,171 @@ -*.py[co] - -# setuptools-scm +# VCS by setuptools-scm _version.py -# Packages -*.egg -*.egg-info -dist -build -eggs -parts -bin -var -sdist -develop-eggs +# Created by editors +*~ +\#* +\.\#* +*.swp +.idea/ +.vscode/ + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ .installed.cfg +*.egg +MANIFEST -# test -.nox/ +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec # Installer logs pip-log.txt +pip-delete-this-directory.txt -#shared objects -*.so +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ -# Created by editors -*~ -\#* -\.\#* -*.swp -.vscode/ \ No newline at end of file +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +.idea/ From b6d4eec1a95aee76ca41016882deb54cc3c75b1e Mon Sep 17 00:00:00 2001 From: Bill Little Date: Thu, 2 May 2024 11:40:52 +0100 Subject: [PATCH 305/583] add codecov configuration (#459) Co-authored-by: Patrick Peglar --- MANIFEST.in | 1 + codecov.yml | 8 ++++++++ 2 files changed, 9 insertions(+) create mode 100644 codecov.yml diff --git a/MANIFEST.in b/MANIFEST.in index 38779ee5..07fbbc06 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -12,5 +12,6 @@ exclude .gitignore exclude .pre-commit-config.yaml exclude .readthedocs.yml exclude .ruff.toml +exclude codecov.yml include *.md include *.py diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 00000000..b41476dc --- /dev/null +++ b/codecov.yml @@ -0,0 +1,8 @@ +coverage: + # see https://docs.codecov.com/docs/commit-status + status: + project: + default: + target: auto + threshold: 5% # coverage can drop by up to % while still posting success + patch: off From 976279613b99f63a156a941b46d78e2014434db3 Mon Sep 17 00:00:00 2001 From: Bill Little Date: Thu, 2 May 2024 11:57:01 +0100 Subject: [PATCH 306/583] add code-of-conduct (#460) Co-authored-by: Patrick Peglar --- CODE_OF_CONDUCT.md | 133 +++++++++++++++++++++++++++++++++++++++++++++ MANIFEST.in | 1 + README.md | 2 +- 3 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 CODE_OF_CONDUCT.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..a959e3ed --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,133 @@ + +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, caste, color, religion, or sexual +identity and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the overall + community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or advances of + any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email address, + without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +geovista.pub@gmail.com. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series of +actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or permanent +ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within the +community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.1, available at +[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]. + +Community Impact Guidelines were inspired by +[Mozilla's code of conduct enforcement ladder][Mozilla CoC]. + +For answers to common questions about this code of conduct, see the FAQ at +[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at +[https://www.contributor-covenant.org/translations][translations]. + +[homepage]: https://www.contributor-covenant.org +[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html +[Mozilla CoC]: https://github.com/mozilla/diversity +[FAQ]: https://www.contributor-covenant.org/faq +[translations]: https://www.contributor-covenant.org/translations diff --git a/MANIFEST.in b/MANIFEST.in index 07fbbc06..562e6a72 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -12,6 +12,7 @@ exclude .gitignore exclude .pre-commit-config.yaml exclude .readthedocs.yml exclude .ruff.toml +exclude CODE_OF_CONDUCT.md exclude codecov.yml include *.md include *.py diff --git a/README.md b/README.md index 78fffb13..14412ad0 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ | | | |------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | ⚙️ CI | [![ci-manifest](https://github.com/SciTools/iris-grib/actions/workflows/ci-manifest.yml/badge.svg)](https://github.com/SciTools/iris-grib/actions/workflows/ci-manifest.yml) [![ci-tests](https://github.com/SciTools/iris-grib/actions/workflows/ci-tests.yml/badge.svg)](https://github.com/SciTools/iris-grib/actions/workflows/ci-tests.yml) [![pre-commit](https://results.pre-commit.ci/badge/github/SciTools/iris-grib/main.svg)](https://results.pre-commit.ci/latest/github/SciTools/iris-grib/main) | -| 💬 Community | [![GH Discussions](https://img.shields.io/badge/github-discussions%20%F0%9F%92%AC-yellow?logo=github&logoColor=lightgrey)](https://github.com/SciTools/iris-grib/discussions) | +| 💬 Community | [![Contributor Covenant](https://img.shields.io/badge/contributor%20covenant-2.1-4baaaa.svg)](https://www.contributor-covenant.org/version/2/1/code_of_conduct/) [![GH Discussions](https://img.shields.io/badge/github-discussions%20%F0%9F%92%AC-yellow?logo=github&logoColor=lightgrey)](https://github.com/SciTools/iris-grib/discussions) | | 📖 Documentation | [![rtd](https://readthedocs.org/projects/iris-grib/badge/?version=latest)](https://iris-grib.readthedocs.io/en/latest/?badge=latest) | | 📈 Health | [![codecov](https://codecov.io/gh/SciTools/iris-grib/graph/badge.svg?token=5VtBaElXFW)](https://codecov.io/gh/SciTools/iris-grib) | | ✨ Meta | [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff) [![NEP29](https://raster.shields.io/badge/follows-NEP29-orange.png)](https://numpy.org/neps/nep-0029-deprecation_policy.html) [![license - bds-3-clause](https://img.shields.io/github/license/SciTools/iris-grib)](https://github.com/SciTools/iris-grib/blob/main/LICENSE) [![conda platform](https://img.shields.io/conda/pn/conda-forge/iris-grib.svg)](https://anaconda.org/conda-forge/iris-grib) | From 273203010f7ba772348ab7fda79f468a49bf8fe6 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Thu, 2 May 2024 23:35:40 +0100 Subject: [PATCH 307/583] Provide masked/unmasked meta for calls to 'as_lazy_data' (#463) * Provide masked/unmasked meta for calls to new 'as_lazy_data' : See iris#5801. * Call the Iris 'as_lazy_data' routine depending on its keywords. * Tidy code, do routine introspection just once. --- src/iris_grib/__init__.py | 47 +++++++++++++++++-- src/iris_grib/message.py | 16 ++++++- .../tests/unit/test__load_generate.py | 2 +- 3 files changed, 58 insertions(+), 7 deletions(-) diff --git a/src/iris_grib/__init__.py b/src/iris_grib/__init__.py index bb02e15b..c9265e06 100644 --- a/src/iris_grib/__init__.py +++ b/src/iris_grib/__init__.py @@ -153,6 +153,39 @@ def __setstate__(self, state): setattr(self, key, value) +# Utility routines for the use of dask 'meta' in wrapping proxies +def _aslazydata_has_meta(): + """ + Work out whether 'iris._lazy_data.as_lazy_data' takes a "meta" kwarg. + + Up to Iris 3.8.0, "as_lazy_data" did not have a 'meta' keyword, but + since https://github.com/SciTools/iris/pull/5801, it now *requires* one, + if the wrapped object is anything other than a numpy or dask array. + """ + from inspect import signature + from iris._lazy_data import as_lazy_data + + sig = signature(as_lazy_data) + return "meta" in sig.parameters + + +# Work this out just once. +_ASLAZYDATA_NEEDS_META = _aslazydata_has_meta() + + +def _make_dask_meta(shape, dtype, is_masked=True): + """ + Construct a dask 'meta' object for use in 'dask.array.from_array'. + + A "meta" array is made from the dtype and shape of the array-like to be + wrapped, plus whether it will return masked or unmasked data. + """ + meta_shape = tuple([0 for _ in shape]) + array_class = np.ma if is_masked else np + meta = array_class.zeros(meta_shape, dtype=dtype) + return meta + + class GribWrapper: """ Contains a pygrib object plus some extra keys of our own. @@ -162,7 +195,7 @@ class GribWrapper: """ - def __init__(self, grib_message, grib_fh=None): + def __init__(self, grib_message, grib_fh=None, has_bitmap=True): """Store the grib message and compute our extra keys.""" self.grib_message = grib_message @@ -195,8 +228,13 @@ def __init__(self, grib_message, grib_fh=None): if deferred: # Wrap the reference to the data payload within the data proxy # in order to support deferred data loading. - proxy = GribDataProxy(shape, np.array([0.0]).dtype, grib_fh.name, offset) - self._data = as_lazy_data(proxy) + dtype = np.dtype(float) # Use default dtype for python float + proxy = GribDataProxy(shape, dtype, grib_fh.name, offset) + as_lazy_kwargs = {} + if _ASLAZYDATA_NEEDS_META: + meta = _make_dask_meta(shape, dtype, is_masked=has_bitmap) + as_lazy_kwargs["meta"] = meta + self._data = as_lazy_data(proxy, **as_lazy_kwargs) else: self.data = _message_values(grib_message, shape) @@ -712,9 +750,10 @@ def _load_generate(filename): for message in messages: editionNumber = message.sections[0]["editionNumber"] if editionNumber == 1: + has_bitmap = 3 in message.sections message_id = message._raw_message._message_id grib_fh = message._file_ref.open_file - message = GribWrapper(message_id, grib_fh=grib_fh) + message = GribWrapper(message_id, grib_fh=grib_fh, has_bitmap=has_bitmap) elif editionNumber != 2: emsg = "GRIB edition {} is not supported by {!r}." raise TranslationError(emsg.format(editionNumber, type(message).__name__)) diff --git a/src/iris_grib/message.py b/src/iris_grib/message.py index f416dd7f..6f5ad948 100644 --- a/src/iris_grib/message.py +++ b/src/iris_grib/message.py @@ -166,8 +166,20 @@ def data(self): shape = (grid_section["numberOfDataPoints"],) else: shape = (grid_section["Nj"], grid_section["Ni"]) - proxy = _DataProxy(shape, np.dtype("f8"), self._recreate_raw) - data = as_lazy_data(proxy) + + dtype = np.dtype("f8") + proxy = _DataProxy(shape, dtype, self._recreate_raw) + + as_lazy_kwargs = {} + from . import _ASLAZYDATA_NEEDS_META, _make_dask_meta + + if _ASLAZYDATA_NEEDS_META: + has_bitmap = 6 in sections + meta = _make_dask_meta(shape, dtype, is_masked=has_bitmap) + as_lazy_kwargs["meta"] = meta + + data = as_lazy_data(proxy, **as_lazy_kwargs) + else: fmt = "Grid definition template {} is not supported" raise TranslationError(fmt.format(template)) diff --git a/src/iris_grib/tests/unit/test__load_generate.py b/src/iris_grib/tests/unit/test__load_generate.py index 7a10db44..43a24508 100644 --- a/src/iris_grib/tests/unit/test__load_generate.py +++ b/src/iris_grib/tests/unit/test__load_generate.py @@ -37,7 +37,7 @@ def test_grib1(self): mock_func.assert_called_once_with(self.fname) self.assertIsInstance(field, GribWrapper) mock_wrapper.assert_called_once_with( - self.message_id, grib_fh=self.grib_fh + self.message_id, grib_fh=self.grib_fh, has_bitmap=False ) def test_grib2(self): From ccf89cdd05144c4c5c0b2bb43cb7026df63b748e Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Fri, 3 May 2024 00:08:33 +0100 Subject: [PATCH 308/583] Updated environment lockfiles (#458) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 2 +- requirements/locks/py311-linux-64.lock | 2 +- requirements/locks/py312-linux-64.lock | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 5a17684f..f002b06e 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 4c1c053d02dd4f1e5cf7ab187666840f573cfba8ed9387d768c66010531db165 +# input_hash: d87fbf5e6b13b3bed3ae08420cfaea150d8e5ff6b469b3591861318a87b0a278 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 4624e860..9ec14c61 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 6a68a02a78ade04a4a59ce590941c300e88b24a33dba39a768238431f8839a35 +# input_hash: 60217b599fcbadcfc8eab3310daf72f9d8a52a7ee931c9b04e0861ad9ae71313 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 932a4e63..98a0bc8b 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: e331628709411f536645415b97f6e9a33cc09a114009b8a454673ee8d5392707 +# input_hash: aceb4f254f1d98ca662bbb35c77671dac9f062d5c373bd67050bbb9b99171617 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef From be1c6ffb924a4784e518265843aea783d0fc7b63 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Sat, 4 May 2024 11:01:56 +0100 Subject: [PATCH 309/583] Updated environment lockfiles (#466) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 28 +++++++++++++------------- requirements/locks/py311-linux-64.lock | 28 +++++++++++++------------- requirements/locks/py312-linux-64.lock | 28 +++++++++++++------------- 3 files changed, 42 insertions(+), 42 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index f002b06e..f5c21b04 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -5,12 +5,12 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h55db66e_0.conda#10569984e7db886e4f1abc2b47ad79a1 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h95c4c6d_6.conda#3cfab3e709f77e9f1b3d380eb622494a +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_6.conda#2f18345bbc433c8a1ed887d7161e86a6 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-4_cp310.conda#26322ec5d7712c3ded99dd656142b8ce https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-hc881cc4_6.conda#aae89d3736661c36a5591788aebd0817 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_6.conda#e733e0573651a1f0639fa8ce066a286e https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-hc881cc4_6.conda#df88796bd09a0d2ed292e59101478ad8 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_6.conda#4398809ac84d0b8c28beebaaa83277f5 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.28.1-hd590300_0.conda#dcde58ff9a1f30b0037a2315d1846d1f https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d @@ -34,7 +34,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.cond https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4.20240210-h59595ed_0.conda#97da8860a0da5413c7c98a3b3838a645 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.1-hd590300_1.conda#9d731343cff6ee2e5a25c4a091bf8e2a +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.0-hd590300_0.conda#c0f3abb4a16477208bbd43a39bd56f18 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.0-hdb0a2a9_1.conda#843bbb8ace1d64ac50d64639ff38b014 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b @@ -63,7 +63,7 @@ https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda#68c34ec6149623be41a1933ab996a209 -https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.5-hfc55251_0.conda#04b88013080254850d6c01ed54810589 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-hc2324a3_1.conda#11d76bee958b1989bd1ac6ee7372ea6d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda#39f910d205726805a958da408ca194ba https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb @@ -93,7 +93,7 @@ https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5 https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py310hff52083_3.conda#c159dcd29bbd80b187b1c5d5f73cc971 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa -https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.4-pyhd8ed1ab_0.conda#6baa2e7fc09bd2c7c82cb6662d5f1d36 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.14.0-pyhd8ed1ab_0.conda#831d85ae0acfba31b8efd0f0d07da736 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.3.1-pyhca7485f_0.conda#b7f0662ef2c9d4404f0af9eef5ed2fde https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda#c0cc1420498b17414d8617d0b9f506ca @@ -136,7 +136,7 @@ https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#96 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py310h2fee648_0.conda#45846a970e71ac98fd327da5d40a0a2c https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.0-py310hc51659f_0.conda#3609fdb03842f67e2ec68a9c137221b8 https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.51.0-py310h2372a71_0.conda#1a4773624145c15b92820fe6c87c5fcd -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_100.conda#d471a5c3abc984b662d9bae3bb7fd8a5 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_101.conda#7e98860d08eea82c8057abd78864fcb4 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda#0896606848b2dc5cebdf111b6543aa04 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda#e7d8df6509ba635247ff9aea31134262 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda#4b31699e0ec5de64d5896e580389c9a1 @@ -146,19 +146,19 @@ https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda#2 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py310hf73ecf8_0.conda#1de56cf017dfd02aa84093206a0141a8 https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.1-h1d62c97_0.conda#44ec51d0857d9be26158bb85caa74fdb +https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.0-h1d62c97_1.conda#113f894e5019db2e2705645ee3bcf91a https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.6.1-pyhd8ed1ab_0.conda#1815c7974568079cf384f012de5ea1b7 -https://conda.anaconda.org/conda-forge/noarch/pytest-8.1.1-pyhd8ed1ab_0.conda#94ff09cdedcb7b17e9cd5097ee2cfcff +https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.0-pyhd8ed1ab_0.conda#088ff7e08f4f10a06190468048c2a353 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.11.0-hd8ed1ab_0.conda#471e3988f8ca5e9eb3ce6be7eac3bcee https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.0-pyhd8ed1ab_0.conda#7d2bc38bd1777c86cc345e510735d9ff +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.1-pyhd8ed1ab_0.conda#4e1cd2faf006a6e62c148f95cef0cac2 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.1.0-hd8ed1ab_0.conda#6ef2b72d291b39e479d7694efa2b2b98 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h9612171_113.conda#b2414908e43c442ddc68e6148774a304 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py310hb13e2d6_0.conda#6593de64c935768b6bad3e19b3e978be -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py310hd5c30f3_5.conda#dc2ee770a2299307f3c127af79160d25 +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py310h7677b6e_6.conda#e45659a778e2be5fc94a816fe7129f1d https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b @@ -167,14 +167,14 @@ https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310hd41b1e2_4.co https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py310h1f7b6fc_0.conda#31beda75384647959d5792a1a7dc571a https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_0.conda#2cc61ba1dd53f0806247333f1294e058 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py310hd41b1e2_0.conda#60ee50b1968f802f2a487ba36d4cce0d -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.4.2-pyhd8ed1ab_0.conda#bb4e6c52855aa64a5443ca4eedaa6cfe +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.5.0-pyhd8ed1ab_0.conda#8472f598970b9af96ca8106fa243ab67 https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda#ba68cb5105760379432cebc82b45af40 -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.3-he6dfbbe_0.conda#05c1609de571f7a9a40e6d7d4116c21a +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py310h2372a71_1.conda#dfcf64f67961eb9686676f96fdb4b4d1 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py310hb13e2d6_0.conda#512cfc0369e247e3993a76030671cce0 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.0.4-hd8ed1ab_1.conda#b065535ca8ca824703ae5537087e2206 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py310hc3e127f_0.conda#5cc13dc3d6981b2187616b824e1c5fae -https://conda.anaconda.org/conda-forge/noarch/tox-4.14.2-pyhd8ed1ab_0.conda#0c3413e30566dbc162c71ef7190259c4 +https://conda.anaconda.org/conda-forge/noarch/tox-4.15.0-pyhd8ed1ab_0.conda#9dd85f9dfd5a48e795153df39b102aa1 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py310h1f7b6fc_4.conda#0ca55ca20891d393846695354b32ebc5 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.35.0-he84ddb8_0.conda#2d01dfbe537478e7a1a495b9639edd45 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py310h62c0568_0.conda#bdfa3aee52579c6b3dde12f52e266ef2 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 9ec14c61..66512512 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -5,12 +5,12 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h55db66e_0.conda#10569984e7db886e4f1abc2b47ad79a1 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h95c4c6d_6.conda#3cfab3e709f77e9f1b3d380eb622494a +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_6.conda#2f18345bbc433c8a1ed887d7161e86a6 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-4_cp311.conda#d786502c97404c94d7d58d258a445a65 https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-hc881cc4_6.conda#aae89d3736661c36a5591788aebd0817 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_6.conda#e733e0573651a1f0639fa8ce066a286e https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-hc881cc4_6.conda#df88796bd09a0d2ed292e59101478ad8 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_6.conda#4398809ac84d0b8c28beebaaa83277f5 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.28.1-hd590300_0.conda#dcde58ff9a1f30b0037a2315d1846d1f https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d @@ -34,7 +34,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.cond https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4.20240210-h59595ed_0.conda#97da8860a0da5413c7c98a3b3838a645 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.1-hd590300_1.conda#9d731343cff6ee2e5a25c4a091bf8e2a +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.0-hd590300_0.conda#c0f3abb4a16477208bbd43a39bd56f18 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.0-hdb0a2a9_1.conda#843bbb8ace1d64ac50d64639ff38b014 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b @@ -63,7 +63,7 @@ https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda#68c34ec6149623be41a1933ab996a209 -https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.5-hfc55251_0.conda#04b88013080254850d6c01ed54810589 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-hc2324a3_1.conda#11d76bee958b1989bd1ac6ee7372ea6d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda#39f910d205726805a958da408ca194ba https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb @@ -93,7 +93,7 @@ https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5 https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py311h38be061_3.conda#1c33f55e5cdcc2a2b973c432b5225bfe https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa -https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.4-pyhd8ed1ab_0.conda#6baa2e7fc09bd2c7c82cb6662d5f1d36 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.14.0-pyhd8ed1ab_0.conda#831d85ae0acfba31b8efd0f0d07da736 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.3.1-pyhca7485f_0.conda#b7f0662ef2c9d4404f0af9eef5ed2fde https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda#c0cc1420498b17414d8617d0b9f506ca @@ -135,7 +135,7 @@ https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#96 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py311hb3a22ac_0.conda#b3469563ac5e808b0cd92810d0697043 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.0-py311h331c9d8_0.conda#5420e3594638adf670fca1a601d7efb9 https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.51.0-py311h459d7ec_0.conda#17e1997cc17c571d5ad27bd0159f616c -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_100.conda#d471a5c3abc984b662d9bae3bb7fd8a5 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_101.conda#7e98860d08eea82c8057abd78864fcb4 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda#0896606848b2dc5cebdf111b6543aa04 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda#e7d8df6509ba635247ff9aea31134262 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda#4b31699e0ec5de64d5896e580389c9a1 @@ -145,19 +145,19 @@ https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda#2 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py311h18e6fac_0.conda#6c520a9d36c9d7270988c7a6c360d6d4 https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.1-h1d62c97_0.conda#44ec51d0857d9be26158bb85caa74fdb +https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.0-h1d62c97_1.conda#113f894e5019db2e2705645ee3bcf91a https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.6.1-pyhd8ed1ab_0.conda#1815c7974568079cf384f012de5ea1b7 -https://conda.anaconda.org/conda-forge/noarch/pytest-8.1.1-pyhd8ed1ab_0.conda#94ff09cdedcb7b17e9cd5097ee2cfcff +https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.0-pyhd8ed1ab_0.conda#088ff7e08f4f10a06190468048c2a353 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.11.0-hd8ed1ab_0.conda#471e3988f8ca5e9eb3ce6be7eac3bcee https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.0-pyhd8ed1ab_0.conda#7d2bc38bd1777c86cc345e510735d9ff +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.1-pyhd8ed1ab_0.conda#4e1cd2faf006a6e62c148f95cef0cac2 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.1.0-hd8ed1ab_0.conda#6ef2b72d291b39e479d7694efa2b2b98 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h9612171_113.conda#b2414908e43c442ddc68e6148774a304 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.conda#a502d7aad449a1206efb366d6a12c52d -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311hca0b8b9_5.conda#cac429fcb9126d5e6f02c8ba61c2a811 +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311hb3a3e68_6.conda#bce79adf84cd7cd9b9b14e43d6d52daf https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b @@ -166,14 +166,14 @@ https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311h9547e67_4.co https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py311h1f0f07a_0.conda#b7e6d52b39e199238c3400cafaabafb3 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_0.conda#2cc61ba1dd53f0806247333f1294e058 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py311h9547e67_0.conda#74ad0ae64f1ef565e27eda87fa749e84 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.4.2-pyhd8ed1ab_0.conda#bb4e6c52855aa64a5443ca4eedaa6cfe +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.5.0-pyhd8ed1ab_0.conda#8472f598970b9af96ca8106fa243ab67 https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda#ba68cb5105760379432cebc82b45af40 -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.3-he6dfbbe_0.conda#05c1609de571f7a9a40e6d7d4116c21a +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py311h459d7ec_1.conda#45b8d355bbcdd27588c2d266bcfdff84 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py311h64a7726_0.conda#d443c70b4a05f50236c70b9c79beff64 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.0.4-hd8ed1ab_1.conda#b065535ca8ca824703ae5537087e2206 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py311h2032efe_0.conda#c99302680ce37b15bcda8152976cb3ba -https://conda.anaconda.org/conda-forge/noarch/tox-4.14.2-pyhd8ed1ab_0.conda#0c3413e30566dbc162c71ef7190259c4 +https://conda.anaconda.org/conda-forge/noarch/tox-4.15.0-pyhd8ed1ab_0.conda#9dd85f9dfd5a48e795153df39b102aa1 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h1f0f07a_4.conda#1e105c1a8ea2163507726144b401eb1b https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.35.0-he84ddb8_0.conda#2d01dfbe537478e7a1a495b9639edd45 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py311h54ef318_0.conda#150186110f111b458f86c04361351337 diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 98a0bc8b..3e3e8ce3 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -5,12 +5,12 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h55db66e_0.conda#10569984e7db886e4f1abc2b47ad79a1 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h95c4c6d_6.conda#3cfab3e709f77e9f1b3d380eb622494a +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_6.conda#2f18345bbc433c8a1ed887d7161e86a6 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-4_cp312.conda#dccc2d142812964fcc6abdc97b672dff https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-hc881cc4_6.conda#aae89d3736661c36a5591788aebd0817 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_6.conda#e733e0573651a1f0639fa8ce066a286e https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-hc881cc4_6.conda#df88796bd09a0d2ed292e59101478ad8 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_6.conda#4398809ac84d0b8c28beebaaa83277f5 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.28.1-hd590300_0.conda#dcde58ff9a1f30b0037a2315d1846d1f https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d @@ -34,7 +34,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.cond https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4.20240210-h59595ed_0.conda#97da8860a0da5413c7c98a3b3838a645 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.1-hd590300_1.conda#9d731343cff6ee2e5a25c4a091bf8e2a +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.0-hd590300_0.conda#c0f3abb4a16477208bbd43a39bd56f18 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.0-hdb0a2a9_1.conda#843bbb8ace1d64ac50d64639ff38b014 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b @@ -63,7 +63,7 @@ https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda#68c34ec6149623be41a1933ab996a209 -https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.5-hfc55251_0.conda#04b88013080254850d6c01ed54810589 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-hc2324a3_1.conda#11d76bee958b1989bd1ac6ee7372ea6d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda#39f910d205726805a958da408ca194ba https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb @@ -93,7 +93,7 @@ https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5 https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py312h7900ff3_3.conda#1b90835ae26b9b8250b302649359a989 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa -https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.4-pyhd8ed1ab_0.conda#6baa2e7fc09bd2c7c82cb6662d5f1d36 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.14.0-pyhd8ed1ab_0.conda#831d85ae0acfba31b8efd0f0d07da736 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.3.1-pyhca7485f_0.conda#b7f0662ef2c9d4404f0af9eef5ed2fde https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda#c0cc1420498b17414d8617d0b9f506ca @@ -135,7 +135,7 @@ https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#96 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py312hf06ca03_0.conda#56b0ca764ce23cc54f3f7e2a7b970f6d https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.0-py312h9a8786e_0.conda#25044745b530207291239ad6f914c1d8 https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.51.0-py312h98912ed_0.conda#f0cd0e54adf65aaa976f5731b7a3f383 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_100.conda#d471a5c3abc984b662d9bae3bb7fd8a5 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_101.conda#7e98860d08eea82c8057abd78864fcb4 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda#0896606848b2dc5cebdf111b6543aa04 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda#e7d8df6509ba635247ff9aea31134262 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda#4b31699e0ec5de64d5896e580389c9a1 @@ -145,19 +145,19 @@ https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda#2 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py312hdcec9eb_0.conda#425bb325f970e57a047ac57c4586489d https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.1-h1d62c97_0.conda#44ec51d0857d9be26158bb85caa74fdb +https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.0-h1d62c97_1.conda#113f894e5019db2e2705645ee3bcf91a https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.6.1-pyhd8ed1ab_0.conda#1815c7974568079cf384f012de5ea1b7 -https://conda.anaconda.org/conda-forge/noarch/pytest-8.1.1-pyhd8ed1ab_0.conda#94ff09cdedcb7b17e9cd5097ee2cfcff +https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.0-pyhd8ed1ab_0.conda#088ff7e08f4f10a06190468048c2a353 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.11.0-hd8ed1ab_0.conda#471e3988f8ca5e9eb3ce6be7eac3bcee https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.0-pyhd8ed1ab_0.conda#7d2bc38bd1777c86cc345e510735d9ff +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.1-pyhd8ed1ab_0.conda#4e1cd2faf006a6e62c148f95cef0cac2 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.1.0-hd8ed1ab_0.conda#6ef2b72d291b39e479d7694efa2b2b98 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h9612171_113.conda#b2414908e43c442ddc68e6148774a304 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda#d8285bea2a350f63fab23bf460221f3f -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py312h38f1c37_5.conda#867baf2a7c5c6147e05ecc90f6c52a0c +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py312hb591178_6.conda#e5a041de2ecaee7e02c40cf82afa132e https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b @@ -166,14 +166,14 @@ https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h8572e83_4.co https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py312hc7c0aa3_0.conda#bd11505f0fe9bd8bcec01ce1220f63c7 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_0.conda#2cc61ba1dd53f0806247333f1294e058 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py312h8572e83_0.conda#12c6a831ef734f0b2dd4caff514cbb7f -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.4.2-pyhd8ed1ab_0.conda#bb4e6c52855aa64a5443ca4eedaa6cfe +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.5.0-pyhd8ed1ab_0.conda#8472f598970b9af96ca8106fa243ab67 https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda#ba68cb5105760379432cebc82b45af40 -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.3-he6dfbbe_0.conda#05c1609de571f7a9a40e6d7d4116c21a +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py312h98912ed_1.conda#d5273d1e67b7b3a871a0a711c6532a2f https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py312heda63a1_0.conda#c53b9f319cafc679476f5613599857e8 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.0.4-hd8ed1ab_1.conda#b065535ca8ca824703ae5537087e2206 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py312h9e6bd2c_0.conda#770f506aa607cb6ff2a57e35e289ab20 -https://conda.anaconda.org/conda-forge/noarch/tox-4.14.2-pyhd8ed1ab_0.conda#0c3413e30566dbc162c71ef7190259c4 +https://conda.anaconda.org/conda-forge/noarch/tox-4.15.0-pyhd8ed1ab_0.conda#9dd85f9dfd5a48e795153df39b102aa1 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py312hc7c0aa3_4.conda#d9c9fa64fdf4e57d7f8957b957d784a0 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.35.0-he84ddb8_0.conda#2d01dfbe537478e7a1a495b9639edd45 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py312he5832f3_0.conda#5377a9a29f607eebe4ad63eb82bcb575 From fd9f85329ddfd06abae8af939a267d45bd860e3a Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 7 May 2024 09:45:12 +0100 Subject: [PATCH 310/583] chore: update pre-commit hooks (#467) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.4.2 → v0.4.3](https://github.com/astral-sh/ruff-pre-commit/compare/v0.4.2...v0.4.3) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index af9d8f2a..601b5342 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -36,7 +36,7 @@ repos: - id: no-commit-to-branch - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.4.2" + rev: "v0.4.3" hooks: - id: ruff types: [file, python] From efa362c66854117ffb51940c04f0f23fbdabc6b0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 May 2024 10:07:25 +0100 Subject: [PATCH 311/583] Bump scitools/workflows in the dependencies group (#468) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2024.04.3 to 2024.05.0 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2024.04.3...2024.05.0) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 5b1675b9..5d9f7ba0 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.04.3 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.05.0 diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 929d29b6..cfaae4f4 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.04.3 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.05.0 secrets: inherit From e847e1106a9b03121703c2a0a571b44260ac6437 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Sat, 11 May 2024 23:31:44 +0100 Subject: [PATCH 312/583] Updated environment lockfiles (#469) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 26 +++++++++++++------------- requirements/locks/py311-linux-64.lock | 26 +++++++++++++------------- requirements/locks/py312-linux-64.lock | 26 +++++++++++++------------- 3 files changed, 39 insertions(+), 39 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index f5c21b04..9b7f4343 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -5,12 +5,12 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h55db66e_0.conda#10569984e7db886e4f1abc2b47ad79a1 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_6.conda#2f18345bbc433c8a1ed887d7161e86a6 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_7.conda#53ebd4c833fa01cb2c6353e99f905406 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-4_cp310.conda#26322ec5d7712c3ded99dd656142b8ce https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_6.conda#e733e0573651a1f0639fa8ce066a286e +https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_7.conda#abf3fec87c2563697defa759dec3d639 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_6.conda#4398809ac84d0b8c28beebaaa83277f5 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_7.conda#72ec1b1b04c4d15d4204ece1ecea5978 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.28.1-hd590300_0.conda#dcde58ff9a1f30b0037a2315d1846d1f https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d @@ -23,7 +23,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.20-hd590300_0.conda https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-h43f5ff8_6.conda#e54a5ddc67e673f9105cf2a2e9c070b0 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-hca663fb_7.conda#c0bd771f09a326fdcd95a60b617795bf https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d @@ -33,7 +33,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.co https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4.20240210-h59595ed_0.conda#97da8860a0da5413c7c98a3b3838a645 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.0-hd590300_0.conda#c0f3abb4a16477208bbd43a39bd56f18 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.0-hdb0a2a9_1.conda#843bbb8ace1d64ac50d64639ff38b014 @@ -50,7 +50,7 @@ https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd7 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_6.conda#3666a850342f8f3be88f9a93d948d027 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_7.conda#1b84f26d9f4f6026e179e7805d5a15cd https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.3-h2797004_0.conda#b3316cbe90249da4f8e84cd66e1cc55b @@ -112,7 +112,7 @@ https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda# https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.1-pyhd8ed1ab_0.conda#d478a8a3044cdff1aa6e62f9269cefe0 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 -https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda#140a7f159396547e9799aa98f9f0742e +https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda#b7f5c092b8f9800150d998a71b76d5a1 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 @@ -134,16 +134,16 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_10 https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py310h2fee648_0.conda#45846a970e71ac98fd327da5d40a0a2c -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.0-py310hc51659f_0.conda#3609fdb03842f67e2ec68a9c137221b8 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.1-py310hc51659f_0.conda#64f82ee7706c57c55e61d267134786bf https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.51.0-py310h2372a71_0.conda#1a4773624145c15b92820fe6c87c5fcd https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_101.conda#7e98860d08eea82c8057abd78864fcb4 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda#0896606848b2dc5cebdf111b6543aa04 -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda#e7d8df6509ba635247ff9aea31134262 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda#4b31699e0ec5de64d5896e580389c9a1 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_openblas.conda#b083767b6c877e24ee597d93b87ab838 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda#2a75b296096adabbabadd5e9782e5fcc -https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 +https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py310hf73ecf8_0.conda#1de56cf017dfd02aa84093206a0141a8 https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.0-h1d62c97_1.conda#113f894e5019db2e2705645ee3bcf91a @@ -162,7 +162,7 @@ https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py310h7677b6e_6.con https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b -https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.0.4-pyhd8ed1ab_1.conda#a1986ad21c766ff22f7bae93f0641020 +https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda#ba9f7f0ec4f2a18de3e7bce67c4a431e https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310hd41b1e2_4.conda#35e87277fba9944b8a975113538bb5df https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py310h1f7b6fc_0.conda#31beda75384647959d5792a1a7dc571a https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_0.conda#2cc61ba1dd53f0806247333f1294e058 @@ -171,8 +171,8 @@ https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.5.0-pyhd8ed1ab_0.co https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda#ba68cb5105760379432cebc82b45af40 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py310h2372a71_1.conda#dfcf64f67961eb9686676f96fdb4b4d1 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py310hb13e2d6_0.conda#512cfc0369e247e3993a76030671cce0 -https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.0.4-hd8ed1ab_1.conda#b065535ca8ca824703ae5537087e2206 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py310h93e2701_1.conda#4a9ff9702042bbccfe40c8bdacb479fa +https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.1.0-hd8ed1ab_0.conda#7ed7b077f6c6ebcb5fc66f23985df487 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py310hc3e127f_0.conda#5cc13dc3d6981b2187616b824e1c5fae https://conda.anaconda.org/conda-forge/noarch/tox-4.15.0-pyhd8ed1ab_0.conda#9dd85f9dfd5a48e795153df39b102aa1 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py310h1f7b6fc_4.conda#0ca55ca20891d393846695354b32ebc5 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 66512512..102f5a4e 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -5,12 +5,12 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h55db66e_0.conda#10569984e7db886e4f1abc2b47ad79a1 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_6.conda#2f18345bbc433c8a1ed887d7161e86a6 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_7.conda#53ebd4c833fa01cb2c6353e99f905406 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-4_cp311.conda#d786502c97404c94d7d58d258a445a65 https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_6.conda#e733e0573651a1f0639fa8ce066a286e +https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_7.conda#abf3fec87c2563697defa759dec3d639 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_6.conda#4398809ac84d0b8c28beebaaa83277f5 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_7.conda#72ec1b1b04c4d15d4204ece1ecea5978 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.28.1-hd590300_0.conda#dcde58ff9a1f30b0037a2315d1846d1f https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d @@ -23,7 +23,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.20-hd590300_0.conda https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-h43f5ff8_6.conda#e54a5ddc67e673f9105cf2a2e9c070b0 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-hca663fb_7.conda#c0bd771f09a326fdcd95a60b617795bf https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d @@ -33,7 +33,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.co https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4.20240210-h59595ed_0.conda#97da8860a0da5413c7c98a3b3838a645 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.0-hd590300_0.conda#c0f3abb4a16477208bbd43a39bd56f18 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.0-hdb0a2a9_1.conda#843bbb8ace1d64ac50d64639ff38b014 @@ -50,7 +50,7 @@ https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd7 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_6.conda#3666a850342f8f3be88f9a93d948d027 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_7.conda#1b84f26d9f4f6026e179e7805d5a15cd https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.3-h2797004_0.conda#b3316cbe90249da4f8e84cd66e1cc55b @@ -112,7 +112,7 @@ https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda# https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.1-pyhd8ed1ab_0.conda#d478a8a3044cdff1aa6e62f9269cefe0 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 -https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda#140a7f159396547e9799aa98f9f0742e +https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda#b7f5c092b8f9800150d998a71b76d5a1 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 @@ -133,16 +133,16 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_10 https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py311hb3a22ac_0.conda#b3469563ac5e808b0cd92810d0697043 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.0-py311h331c9d8_0.conda#5420e3594638adf670fca1a601d7efb9 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.1-py311h331c9d8_0.conda#9f35e13e3b9e05e153b78f42662061f6 https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.51.0-py311h459d7ec_0.conda#17e1997cc17c571d5ad27bd0159f616c https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_101.conda#7e98860d08eea82c8057abd78864fcb4 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda#0896606848b2dc5cebdf111b6543aa04 -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda#e7d8df6509ba635247ff9aea31134262 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda#4b31699e0ec5de64d5896e580389c9a1 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_openblas.conda#b083767b6c877e24ee597d93b87ab838 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda#2a75b296096adabbabadd5e9782e5fcc -https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 +https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py311h18e6fac_0.conda#6c520a9d36c9d7270988c7a6c360d6d4 https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.0-h1d62c97_1.conda#113f894e5019db2e2705645ee3bcf91a @@ -161,7 +161,7 @@ https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311hb3a3e68_6.con https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b -https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.0.4-pyhd8ed1ab_1.conda#a1986ad21c766ff22f7bae93f0641020 +https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda#ba9f7f0ec4f2a18de3e7bce67c4a431e https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311h9547e67_4.conda#586da7df03b68640de14dc3e8bcbf76f https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py311h1f0f07a_0.conda#b7e6d52b39e199238c3400cafaabafb3 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_0.conda#2cc61ba1dd53f0806247333f1294e058 @@ -170,8 +170,8 @@ https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.5.0-pyhd8ed1ab_0.co https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda#ba68cb5105760379432cebc82b45af40 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py311h459d7ec_1.conda#45b8d355bbcdd27588c2d266bcfdff84 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py311h64a7726_0.conda#d443c70b4a05f50236c70b9c79beff64 -https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.0.4-hd8ed1ab_1.conda#b065535ca8ca824703ae5537087e2206 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py311h517d4fd_1.conda#a86b8bea39e292a23b2cf9a750f49ea1 +https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.1.0-hd8ed1ab_0.conda#7ed7b077f6c6ebcb5fc66f23985df487 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py311h2032efe_0.conda#c99302680ce37b15bcda8152976cb3ba https://conda.anaconda.org/conda-forge/noarch/tox-4.15.0-pyhd8ed1ab_0.conda#9dd85f9dfd5a48e795153df39b102aa1 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h1f0f07a_4.conda#1e105c1a8ea2163507726144b401eb1b diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 3e3e8ce3..076a4812 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -5,12 +5,12 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h55db66e_0.conda#10569984e7db886e4f1abc2b47ad79a1 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_6.conda#2f18345bbc433c8a1ed887d7161e86a6 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_7.conda#53ebd4c833fa01cb2c6353e99f905406 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-4_cp312.conda#dccc2d142812964fcc6abdc97b672dff https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_6.conda#e733e0573651a1f0639fa8ce066a286e +https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_7.conda#abf3fec87c2563697defa759dec3d639 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_6.conda#4398809ac84d0b8c28beebaaa83277f5 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_7.conda#72ec1b1b04c4d15d4204ece1ecea5978 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.28.1-hd590300_0.conda#dcde58ff9a1f30b0037a2315d1846d1f https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d @@ -23,7 +23,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.20-hd590300_0.conda https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-h43f5ff8_6.conda#e54a5ddc67e673f9105cf2a2e9c070b0 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-hca663fb_7.conda#c0bd771f09a326fdcd95a60b617795bf https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d @@ -33,7 +33,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.co https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4.20240210-h59595ed_0.conda#97da8860a0da5413c7c98a3b3838a645 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.0-hd590300_0.conda#c0f3abb4a16477208bbd43a39bd56f18 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.0-hdb0a2a9_1.conda#843bbb8ace1d64ac50d64639ff38b014 @@ -50,7 +50,7 @@ https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd7 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_6.conda#3666a850342f8f3be88f9a93d948d027 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_7.conda#1b84f26d9f4f6026e179e7805d5a15cd https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.3-h2797004_0.conda#b3316cbe90249da4f8e84cd66e1cc55b @@ -112,7 +112,7 @@ https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda# https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.1-pyhd8ed1ab_0.conda#d478a8a3044cdff1aa6e62f9269cefe0 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 -https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda#140a7f159396547e9799aa98f9f0742e +https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda#b7f5c092b8f9800150d998a71b76d5a1 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 @@ -133,16 +133,16 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_10 https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py312hf06ca03_0.conda#56b0ca764ce23cc54f3f7e2a7b970f6d -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.0-py312h9a8786e_0.conda#25044745b530207291239ad6f914c1d8 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.1-py312h9a8786e_0.conda#2d24a25dab0d00182eeed1ba9b64a12d https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.51.0-py312h98912ed_0.conda#f0cd0e54adf65aaa976f5731b7a3f383 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_101.conda#7e98860d08eea82c8057abd78864fcb4 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda#0896606848b2dc5cebdf111b6543aa04 -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda#e7d8df6509ba635247ff9aea31134262 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda#4b31699e0ec5de64d5896e580389c9a1 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_openblas.conda#b083767b6c877e24ee597d93b87ab838 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda#2a75b296096adabbabadd5e9782e5fcc -https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 +https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py312hdcec9eb_0.conda#425bb325f970e57a047ac57c4586489d https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.0-h1d62c97_1.conda#113f894e5019db2e2705645ee3bcf91a @@ -161,7 +161,7 @@ https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py312hb591178_6.con https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b -https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.0.4-pyhd8ed1ab_1.conda#a1986ad21c766ff22f7bae93f0641020 +https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda#ba9f7f0ec4f2a18de3e7bce67c4a431e https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h8572e83_4.conda#52c9e25ee0a32485a102eeecdb7eef52 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py312hc7c0aa3_0.conda#bd11505f0fe9bd8bcec01ce1220f63c7 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_0.conda#2cc61ba1dd53f0806247333f1294e058 @@ -170,8 +170,8 @@ https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.5.0-pyhd8ed1ab_0.co https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda#ba68cb5105760379432cebc82b45af40 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py312h98912ed_1.conda#d5273d1e67b7b3a871a0a711c6532a2f -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py312heda63a1_0.conda#c53b9f319cafc679476f5613599857e8 -https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.0.4-hd8ed1ab_1.conda#b065535ca8ca824703ae5537087e2206 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py312hc2bc53b_1.conda#d2dcf3642236a13c4212437104eb9275 +https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.1.0-hd8ed1ab_0.conda#7ed7b077f6c6ebcb5fc66f23985df487 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py312h9e6bd2c_0.conda#770f506aa607cb6ff2a57e35e289ab20 https://conda.anaconda.org/conda-forge/noarch/tox-4.15.0-pyhd8ed1ab_0.conda#9dd85f9dfd5a48e795153df39b102aa1 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py312hc7c0aa3_4.conda#d9c9fa64fdf4e57d7f8957b957d784a0 From 0bd635133b3121eb05dc0d3b65c668af9b4ddf33 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 13 May 2024 19:26:35 +0100 Subject: [PATCH 313/583] chore: update pre-commit hooks (#470) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.4.3 → v0.4.4](https://github.com/astral-sh/ruff-pre-commit/compare/v0.4.3...v0.4.4) - [github.com/abravalheri/validate-pyproject: v0.16 → v0.17](https://github.com/abravalheri/validate-pyproject/compare/v0.16...v0.17) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 601b5342..851b6f27 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -36,7 +36,7 @@ repos: - id: no-commit-to-branch - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.4.3" + rev: "v0.4.4" hooks: - id: ruff types: [file, python] @@ -70,7 +70,7 @@ repos: exclude: 'noxfile\.py|docs/conf\.py' - repo: https://github.com/abravalheri/validate-pyproject - rev: "v0.16" + rev: "v0.17" hooks: - id: validate-pyproject From 9c6ae18b095b9ac335cf732f6b2b26dd03d06fe6 Mon Sep 17 00:00:00 2001 From: tkknight <2108488+tkknight@users.noreply.github.com> Date: Tue, 14 May 2024 15:39:43 +0100 Subject: [PATCH 314/583] ensure no warnings on docs build (#471) --- docs/Makefile | 5 ++++- docs/conf.py | 2 +- docs/ref/release_notes.rst | 2 ++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/docs/Makefile b/docs/Makefile index 6e35eea2..d9ed9c70 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -19,6 +19,9 @@ ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . # the i18n builder cannot share the environment and doctrees with the others I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . +# See https://www.sphinx-doc.org/en/master/man/sphinx-build.html?highlight=--keep-going#cmdoption-sphinx-build-W +WARNING_TO_ERROR = -W --keep-going + .PHONY: help help: @echo "Please use \`make ' where is one of" @@ -55,7 +58,7 @@ clean: .PHONY: html html: - $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + $(SPHINXBUILD) $(WARNING_TO_ERROR) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." diff --git a/docs/conf.py b/docs/conf.py index d70991db..395a8ff9 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -303,6 +303,6 @@ # Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = { - "python": ("https://docs.python.org/", None), + "python": ("https://docs.python.org/3/", None), "iris": ("https://scitools-iris.readthedocs.io/en/stable/", None), } diff --git a/docs/ref/release_notes.rst b/docs/ref/release_notes.rst index 9ab84444..d69a620c 100644 --- a/docs/ref/release_notes.rst +++ b/docs/ref/release_notes.rst @@ -1,3 +1,5 @@ +:orphan: + .. _release_notes: Release Notes From c3ebcced0a7ace6067e33a27ad602ea566021243 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Sat, 18 May 2024 13:07:02 +0100 Subject: [PATCH 315/583] Updated environment lockfiles (#472) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 26 +++++++++++++------------- requirements/locks/py311-linux-64.lock | 26 +++++++++++++------------- requirements/locks/py312-linux-64.lock | 26 +++++++++++++------------- 3 files changed, 39 insertions(+), 39 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 9b7f4343..054d2264 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -57,7 +57,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.3-h2797004_0.cond https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.6-h232c23b_2.conda#9a3a42df8a95f65334dfc7b80da1195d +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-hc051c1a_0.conda#5d801a4906adc712d480afc362623b59 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc @@ -95,7 +95,7 @@ https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py310hff52083_3. https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa https://conda.anaconda.org/conda-forge/noarch/filelock-3.14.0-pyhd8ed1ab_0.conda#831d85ae0acfba31b8efd0f0d07da736 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.3.1-pyhca7485f_0.conda#b7f0662ef2c9d4404f0af9eef5ed2fde +https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.5.0-pyhff2d567_0.conda#d73e9932511ef7670b2cc0ebd9dfbd30 https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda#c0cc1420498b17414d8617d0b9f506ca https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 @@ -109,7 +109,7 @@ https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py310h2372a71_0 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#248f521b64ce055e7feae3105e7abeb8 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.1-pyhd8ed1ab_0.conda#d478a8a3044cdff1aa6e62f9269cefe0 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.2-pyhd8ed1ab_0.conda#6f6cf28bf8e021933869bae3f84b8fc9 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda#b7f5c092b8f9800150d998a71b76d5a1 @@ -152,7 +152,7 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.0-pyhd8ed1ab_0.conda#08 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.11.0-hd8ed1ab_0.conda#471e3988f8ca5e9eb3ce6be7eac3bcee https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.1-pyhd8ed1ab_0.conda#4e1cd2faf006a6e62c148f95cef0cac2 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.2-pyhd8ed1ab_0.conda#7d36e7a485ea2f5829408813bdbbfb38 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.1.0-hd8ed1ab_0.conda#6ef2b72d291b39e479d7694efa2b2b98 @@ -164,25 +164,25 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.co https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda#ba9f7f0ec4f2a18de3e7bce67c4a431e https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310hd41b1e2_4.conda#35e87277fba9944b8a975113538bb5df -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py310h1f7b6fc_0.conda#31beda75384647959d5792a1a7dc571a +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py310h261611a_1.conda#5db5f54f2a6e689cb261ca4f6d8250db https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_0.conda#2cc61ba1dd53f0806247333f1294e058 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py310hd41b1e2_0.conda#60ee50b1968f802f2a487ba36d4cce0d -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.5.0-pyhd8ed1ab_0.conda#8472f598970b9af96ca8106fa243ab67 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.5.1-pyhd8ed1ab_0.conda#d4f60ccc5421472d2583efd9ce39d8b1 https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda#ba68cb5105760379432cebc82b45af40 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py310h2372a71_1.conda#dfcf64f67961eb9686676f96fdb4b4d1 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py310h93e2701_1.conda#4a9ff9702042bbccfe40c8bdacb479fa https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.1.0-hd8ed1ab_0.conda#7ed7b077f6c6ebcb5fc66f23985df487 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py310hc3e127f_0.conda#5cc13dc3d6981b2187616b824e1c5fae +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py310hec8f0c1_1.conda#baf9a1e8de78418d988232388dc309dc https://conda.anaconda.org/conda-forge/noarch/tox-4.15.0-pyhd8ed1ab_0.conda#9dd85f9dfd5a48e795153df39b102aa1 -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py310h1f7b6fc_4.conda#0ca55ca20891d393846695354b32ebc5 +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py310h261611a_5.conda#643414a9f73226b2a6a43a4800734d3b https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.35.0-he84ddb8_0.conda#2d01dfbe537478e7a1a495b9639edd45 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py310h62c0568_0.conda#bdfa3aee52579c6b3dde12f52e266ef2 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py310hba70d50_100.conda#e19392760c7e4da3b9cb0ee5bf61bc4b +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py310hef631a5_2.conda#b3fa3fc2a0fa8b53b913c94297b12e27 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py310h3aa39b3_101.conda#ff01d25c8eee3db423673eb5bdc072ed https://conda.anaconda.org/conda-forge/noarch/nox-2024.4.15-pyhff2d567_0.conda#600c0de12125f473d8099c0b3e6f88d4 -https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.0-pyha770c72_0.conda#846ba0877cda9c4f11e13720cacd1968 -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py310hcc13569_0.conda#89a13de526ea3008341e3a2aeab4da7e -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.0-py310h1f7b6fc_1.conda#f020ac07b7df9c4b0bd0ece3055b5bd2 +https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda#724bc4489c1174fc8e3233b0624fa51f +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py310hf9f9076_1.conda#dd5c97834c12bae782b35261e0bea7b4 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.0-py310h261611a_2.conda#12e644f3669afe291b68d01b9eab0106 https://conda.anaconda.org/conda-forge/noarch/iris-3.9.0-pyha770c72_0.conda#efaf150eb009f04efa58f1401c767192 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda#611a35a27914fac3aa37611a6fe40bb5 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.6-pyhd8ed1ab_0.conda#d7e4954df0d3aea2eacc7835ad12671d diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 102f5a4e..12731726 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -57,7 +57,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.3-h2797004_0.cond https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.6-h232c23b_2.conda#9a3a42df8a95f65334dfc7b80da1195d +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-hc051c1a_0.conda#5d801a4906adc712d480afc362623b59 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc @@ -95,7 +95,7 @@ https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py311h38be061_3. https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa https://conda.anaconda.org/conda-forge/noarch/filelock-3.14.0-pyhd8ed1ab_0.conda#831d85ae0acfba31b8efd0f0d07da736 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.3.1-pyhca7485f_0.conda#b7f0662ef2c9d4404f0af9eef5ed2fde +https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.5.0-pyhff2d567_0.conda#d73e9932511ef7670b2cc0ebd9dfbd30 https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda#c0cc1420498b17414d8617d0b9f506ca https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 @@ -109,7 +109,7 @@ https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py311h459d7ec_0 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#248f521b64ce055e7feae3105e7abeb8 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.1-pyhd8ed1ab_0.conda#d478a8a3044cdff1aa6e62f9269cefe0 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.2-pyhd8ed1ab_0.conda#6f6cf28bf8e021933869bae3f84b8fc9 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda#b7f5c092b8f9800150d998a71b76d5a1 @@ -151,7 +151,7 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.0-pyhd8ed1ab_0.conda#08 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.11.0-hd8ed1ab_0.conda#471e3988f8ca5e9eb3ce6be7eac3bcee https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.1-pyhd8ed1ab_0.conda#4e1cd2faf006a6e62c148f95cef0cac2 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.2-pyhd8ed1ab_0.conda#7d36e7a485ea2f5829408813bdbbfb38 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.1.0-hd8ed1ab_0.conda#6ef2b72d291b39e479d7694efa2b2b98 @@ -163,25 +163,25 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.co https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda#ba9f7f0ec4f2a18de3e7bce67c4a431e https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311h9547e67_4.conda#586da7df03b68640de14dc3e8bcbf76f -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py311h1f0f07a_0.conda#b7e6d52b39e199238c3400cafaabafb3 +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py311h18e1886_1.conda#f1beb063aad4446eb146d8b88420a4ea https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_0.conda#2cc61ba1dd53f0806247333f1294e058 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py311h9547e67_0.conda#74ad0ae64f1ef565e27eda87fa749e84 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.5.0-pyhd8ed1ab_0.conda#8472f598970b9af96ca8106fa243ab67 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.5.1-pyhd8ed1ab_0.conda#d4f60ccc5421472d2583efd9ce39d8b1 https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda#ba68cb5105760379432cebc82b45af40 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py311h459d7ec_1.conda#45b8d355bbcdd27588c2d266bcfdff84 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py311h517d4fd_1.conda#a86b8bea39e292a23b2cf9a750f49ea1 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.1.0-hd8ed1ab_0.conda#7ed7b077f6c6ebcb5fc66f23985df487 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py311h2032efe_0.conda#c99302680ce37b15bcda8152976cb3ba +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py311h0bed3d6_1.conda#6fb2f733ef405b4bfb4a6a362703457e https://conda.anaconda.org/conda-forge/noarch/tox-4.15.0-pyhd8ed1ab_0.conda#9dd85f9dfd5a48e795153df39b102aa1 -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h1f0f07a_4.conda#1e105c1a8ea2163507726144b401eb1b +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h18e1886_5.conda#6cd3facab7a79de14abb1a86a2d830fa https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.35.0-he84ddb8_0.conda#2d01dfbe537478e7a1a495b9639edd45 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py311h54ef318_0.conda#150186110f111b458f86c04361351337 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py311he8ad708_100.conda#597b1ad6cb7011b7561c20ea30295cae +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py311ha4ca890_2.conda#0848e2084cbb57014f232f48568561af +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py311h74118c1_101.conda#153b3a81c6f11e87b87461247c3cf061 https://conda.anaconda.org/conda-forge/noarch/nox-2024.4.15-pyhff2d567_0.conda#600c0de12125f473d8099c0b3e6f88d4 -https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.0-pyha770c72_0.conda#846ba0877cda9c4f11e13720cacd1968 -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py311h320fe9a_0.conda#fcda2652548238199b7de71dbde4e7fe -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.0-py311h1f0f07a_1.conda#74e551cef928303ec57f42828c51cf87 +https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda#724bc4489c1174fc8e3233b0624fa51f +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py311h14de704_1.conda#27e5956e552c6e71f56cb1ec042617a8 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.0-py311h18e1886_2.conda#80163cbd7ecb799e8556130e443d7d16 https://conda.anaconda.org/conda-forge/noarch/iris-3.9.0-pyha770c72_0.conda#efaf150eb009f04efa58f1401c767192 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda#611a35a27914fac3aa37611a6fe40bb5 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.6-pyhd8ed1ab_0.conda#d7e4954df0d3aea2eacc7835ad12671d diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 076a4812..9a9153ad 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -57,7 +57,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.3-h2797004_0.cond https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.6-h232c23b_2.conda#9a3a42df8a95f65334dfc7b80da1195d +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-hc051c1a_0.conda#5d801a4906adc712d480afc362623b59 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc @@ -95,7 +95,7 @@ https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py312h7900ff3_3. https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa https://conda.anaconda.org/conda-forge/noarch/filelock-3.14.0-pyhd8ed1ab_0.conda#831d85ae0acfba31b8efd0f0d07da736 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.3.1-pyhca7485f_0.conda#b7f0662ef2c9d4404f0af9eef5ed2fde +https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.5.0-pyhff2d567_0.conda#d73e9932511ef7670b2cc0ebd9dfbd30 https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda#c0cc1420498b17414d8617d0b9f506ca https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 @@ -109,7 +109,7 @@ https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py312h98912ed_0 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#248f521b64ce055e7feae3105e7abeb8 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.1-pyhd8ed1ab_0.conda#d478a8a3044cdff1aa6e62f9269cefe0 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.2-pyhd8ed1ab_0.conda#6f6cf28bf8e021933869bae3f84b8fc9 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda#b7f5c092b8f9800150d998a71b76d5a1 @@ -151,7 +151,7 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.0-pyhd8ed1ab_0.conda#08 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.11.0-hd8ed1ab_0.conda#471e3988f8ca5e9eb3ce6be7eac3bcee https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.1-pyhd8ed1ab_0.conda#4e1cd2faf006a6e62c148f95cef0cac2 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.2-pyhd8ed1ab_0.conda#7d36e7a485ea2f5829408813bdbbfb38 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.1.0-hd8ed1ab_0.conda#6ef2b72d291b39e479d7694efa2b2b98 @@ -163,25 +163,25 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.co https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda#ba9f7f0ec4f2a18de3e7bce67c4a431e https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h8572e83_4.conda#52c9e25ee0a32485a102eeecdb7eef52 -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py312hc7c0aa3_0.conda#bd11505f0fe9bd8bcec01ce1220f63c7 +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py312h085067d_1.conda#b121b9dd4935f63959eb35cc6c36973b https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_0.conda#2cc61ba1dd53f0806247333f1294e058 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py312h8572e83_0.conda#12c6a831ef734f0b2dd4caff514cbb7f -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.5.0-pyhd8ed1ab_0.conda#8472f598970b9af96ca8106fa243ab67 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.5.1-pyhd8ed1ab_0.conda#d4f60ccc5421472d2583efd9ce39d8b1 https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda#ba68cb5105760379432cebc82b45af40 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py312h98912ed_1.conda#d5273d1e67b7b3a871a0a711c6532a2f https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py312hc2bc53b_1.conda#d2dcf3642236a13c4212437104eb9275 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.1.0-hd8ed1ab_0.conda#7ed7b077f6c6ebcb5fc66f23985df487 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py312h9e6bd2c_0.conda#770f506aa607cb6ff2a57e35e289ab20 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py312ha5b4d35_1.conda#1248b799f811d8ea215de88f53ae7ffc https://conda.anaconda.org/conda-forge/noarch/tox-4.15.0-pyhd8ed1ab_0.conda#9dd85f9dfd5a48e795153df39b102aa1 -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py312hc7c0aa3_4.conda#d9c9fa64fdf4e57d7f8957b957d784a0 +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py312h085067d_5.conda#b40cdf87aee69ccf162022579cb99afb https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.35.0-he84ddb8_0.conda#2d01dfbe537478e7a1a495b9639edd45 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py312he5832f3_0.conda#5377a9a29f607eebe4ad63eb82bcb575 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py312h26027e0_100.conda#2d7b4954dc5a090796e0ba89c325d09b +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py312h20ab3a6_2.conda#fbfe798f83f0d66410903ad8f40d5283 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py312h39d4375_101.conda#9033de6c10fd3396990890d8d8a6ac4e https://conda.anaconda.org/conda-forge/noarch/nox-2024.4.15-pyhff2d567_0.conda#600c0de12125f473d8099c0b3e6f88d4 -https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.0-pyha770c72_0.conda#846ba0877cda9c4f11e13720cacd1968 -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py312hfb8ada1_0.conda#73e223e294f96540f293bf977a37696c -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.0-py312hc7c0aa3_1.conda#2df4c1f4d317ff0eb339f1a035dd717d +https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda#724bc4489c1174fc8e3233b0624fa51f +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py312h1d6d2e6_1.conda#6392d3ce615ab0f32bc39b07f8f4c300 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.0-py312h085067d_2.conda#158bdc63daac04bcc2991f6e4a5fec5e https://conda.anaconda.org/conda-forge/noarch/iris-3.9.0-pyha770c72_0.conda#efaf150eb009f04efa58f1401c767192 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda#611a35a27914fac3aa37611a6fe40bb5 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.6-pyhd8ed1ab_0.conda#d7e4954df0d3aea2eacc7835ad12671d From 6e74e3d190d0d7a3f930aa5ea15903ed49847566 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 20 May 2024 21:37:22 +0100 Subject: [PATCH 316/583] chore: update pre-commit hooks (#473) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/abravalheri/validate-pyproject: v0.17 → v0.18](https://github.com/abravalheri/validate-pyproject/compare/v0.17...v0.18) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 851b6f27..d6040816 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -70,7 +70,7 @@ repos: exclude: 'noxfile\.py|docs/conf\.py' - repo: https://github.com/abravalheri/validate-pyproject - rev: "v0.17" + rev: "v0.18" hooks: - id: validate-pyproject From 0c5938f008c78c2e46f9cfce530055f1fbec595e Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Sat, 25 May 2024 06:30:37 +0100 Subject: [PATCH 317/583] Updated environment lockfiles (#474) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 14 +++++++------- requirements/locks/py311-linux-64.lock | 14 +++++++------- requirements/locks/py312-linux-64.lock | 14 +++++++------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 054d2264..9b0cf478 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -4,7 +4,7 @@ @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h55db66e_0.conda#10569984e7db886e4f1abc2b47ad79a1 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_1.conda#33b7851c39c25da14f6a233a8ccbeeca https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_7.conda#53ebd4c833fa01cb2c6353e99f905406 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-4_cp310.conda#26322ec5d7712c3ded99dd656142b8ce https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 @@ -34,7 +34,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.cond https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.0-hd590300_0.conda#c0f3abb4a16477208bbd43a39bd56f18 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.0-h4ab18f5_3.conda#12ea6d0d4ed54530eaed18e4835c1f7c https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.0-hdb0a2a9_1.conda#843bbb8ace1d64ac50d64639ff38b014 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b @@ -103,7 +103,7 @@ https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.4.0-pyhd8ed1ab_ https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py310hd41b1e2_1.conda#b8d67603d43b23ce7e988a5d81a7ab79 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-22_linux64_openblas.conda#1a2a0cd3153464fee6646f3dd6dad9b8 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.7.1-hca28451_0.conda#755c7f876815003337d2c61ff5d047e5 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.8.0-hca28451_0.conda#f21c27f076a07907e70c49bb57bd0f20 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py310h2372a71_0.conda#f6703fa0214a00bf49d1bef6dc7672d0 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 @@ -119,7 +119,7 @@ https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py310h2372a71_0.conda#b631b889b0b4bc2fca7b8b977ca484b2 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py310h2372a71_1.conda#bb010e368de4940771368bc3dc4c63e7 -https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda#7462280d81f639363e6e63c81276bd9e +https://conda.anaconda.org/conda-forge/noarch/setuptools-70.0.0-pyhd8ed1ab_0.conda#c8ddb4f34a208df4dd42509a0f6a1c89 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 @@ -148,7 +148,7 @@ https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py310hf73ecf8_0.co https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.0-h1d62c97_1.conda#113f894e5019db2e2705645ee3bcf91a https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.6.1-pyhd8ed1ab_0.conda#1815c7974568079cf384f012de5ea1b7 -https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.0-pyhd8ed1ab_0.conda#088ff7e08f4f10a06190468048c2a353 +https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.1-pyhd8ed1ab_0.conda#e4418e8bdbaa8eea28e047531e6763c8 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.11.0-hd8ed1ab_0.conda#471e3988f8ca5e9eb3ce6be7eac3bcee https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 @@ -161,7 +161,7 @@ https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py310hb13e2d6_0.con https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py310h7677b6e_6.conda#e45659a778e2be5fc94a816fe7129f1d https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e -https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.2-pyhd8ed1ab_0.conda#e1643b34b19df8c028a4f00bf5df58a6 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda#ba9f7f0ec4f2a18de3e7bce67c4a431e https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310hd41b1e2_4.conda#35e87277fba9944b8a975113538bb5df https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py310h261611a_1.conda#5db5f54f2a6e689cb261ca4f6d8250db @@ -171,7 +171,7 @@ https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.5.1-pyhd8ed1ab_0.co https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda#ba68cb5105760379432cebc82b45af40 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py310h2372a71_1.conda#dfcf64f67961eb9686676f96fdb4b4d1 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py310h93e2701_1.conda#4a9ff9702042bbccfe40c8bdacb479fa +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.1-py310h93e2701_0.conda#9a697144b2f3adc88ada6b6201b379c4 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.1.0-hd8ed1ab_0.conda#7ed7b077f6c6ebcb5fc66f23985df487 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py310hec8f0c1_1.conda#baf9a1e8de78418d988232388dc309dc https://conda.anaconda.org/conda-forge/noarch/tox-4.15.0-pyhd8ed1ab_0.conda#9dd85f9dfd5a48e795153df39b102aa1 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 12731726..3f7f2b35 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -4,7 +4,7 @@ @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h55db66e_0.conda#10569984e7db886e4f1abc2b47ad79a1 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_1.conda#33b7851c39c25da14f6a233a8ccbeeca https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_7.conda#53ebd4c833fa01cb2c6353e99f905406 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-4_cp311.conda#d786502c97404c94d7d58d258a445a65 https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 @@ -34,7 +34,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.cond https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.0-hd590300_0.conda#c0f3abb4a16477208bbd43a39bd56f18 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.0-h4ab18f5_3.conda#12ea6d0d4ed54530eaed18e4835c1f7c https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.0-hdb0a2a9_1.conda#843bbb8ace1d64ac50d64639ff38b014 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b @@ -103,7 +103,7 @@ https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.4.0-pyhd8ed1ab_ https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py311h9547e67_1.conda#2c65bdf442b0d37aad080c8a4e0d452f https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-22_linux64_openblas.conda#1a2a0cd3153464fee6646f3dd6dad9b8 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.7.1-hca28451_0.conda#755c7f876815003337d2c61ff5d047e5 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.8.0-hca28451_0.conda#f21c27f076a07907e70c49bb57bd0f20 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py311h459d7ec_0.conda#a322b4185121935c871d201ae00ac143 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 @@ -119,7 +119,7 @@ https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py311h459d7ec_0.conda#60b5332b3989fda37884b92c7afd6a91 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py311h459d7ec_1.conda#52719a74ad130de8fb5d047dc91f247a -https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda#7462280d81f639363e6e63c81276bd9e +https://conda.anaconda.org/conda-forge/noarch/setuptools-70.0.0-pyhd8ed1ab_0.conda#c8ddb4f34a208df4dd42509a0f6a1c89 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 @@ -147,7 +147,7 @@ https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py311h18e6fac_0.co https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.0-h1d62c97_1.conda#113f894e5019db2e2705645ee3bcf91a https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.6.1-pyhd8ed1ab_0.conda#1815c7974568079cf384f012de5ea1b7 -https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.0-pyhd8ed1ab_0.conda#088ff7e08f4f10a06190468048c2a353 +https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.1-pyhd8ed1ab_0.conda#e4418e8bdbaa8eea28e047531e6763c8 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.11.0-hd8ed1ab_0.conda#471e3988f8ca5e9eb3ce6be7eac3bcee https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 @@ -160,7 +160,7 @@ https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.con https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311hb3a3e68_6.conda#bce79adf84cd7cd9b9b14e43d6d52daf https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e -https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.2-pyhd8ed1ab_0.conda#e1643b34b19df8c028a4f00bf5df58a6 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda#ba9f7f0ec4f2a18de3e7bce67c4a431e https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311h9547e67_4.conda#586da7df03b68640de14dc3e8bcbf76f https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py311h18e1886_1.conda#f1beb063aad4446eb146d8b88420a4ea @@ -170,7 +170,7 @@ https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.5.1-pyhd8ed1ab_0.co https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda#ba68cb5105760379432cebc82b45af40 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py311h459d7ec_1.conda#45b8d355bbcdd27588c2d266bcfdff84 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py311h517d4fd_1.conda#a86b8bea39e292a23b2cf9a750f49ea1 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.1-py311h517d4fd_0.conda#764b0e055f59dbd7d114d32b8c6e55e6 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.1.0-hd8ed1ab_0.conda#7ed7b077f6c6ebcb5fc66f23985df487 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py311h0bed3d6_1.conda#6fb2f733ef405b4bfb4a6a362703457e https://conda.anaconda.org/conda-forge/noarch/tox-4.15.0-pyhd8ed1ab_0.conda#9dd85f9dfd5a48e795153df39b102aa1 diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 9a9153ad..dc1a02a8 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -4,7 +4,7 @@ @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h55db66e_0.conda#10569984e7db886e4f1abc2b47ad79a1 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_1.conda#33b7851c39c25da14f6a233a8ccbeeca https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_7.conda#53ebd4c833fa01cb2c6353e99f905406 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-4_cp312.conda#dccc2d142812964fcc6abdc97b672dff https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 @@ -34,7 +34,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.cond https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.0-hd590300_0.conda#c0f3abb4a16477208bbd43a39bd56f18 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.0-h4ab18f5_3.conda#12ea6d0d4ed54530eaed18e4835c1f7c https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.0-hdb0a2a9_1.conda#843bbb8ace1d64ac50d64639ff38b014 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b @@ -103,7 +103,7 @@ https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.4.0-pyhd8ed1ab_ https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py312h8572e83_1.conda#c1e71f2bc05d8e8e033aefac2c490d05 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-22_linux64_openblas.conda#1a2a0cd3153464fee6646f3dd6dad9b8 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.7.1-hca28451_0.conda#755c7f876815003337d2c61ff5d047e5 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.8.0-hca28451_0.conda#f21c27f076a07907e70c49bb57bd0f20 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py312h98912ed_0.conda#6ff0b9582da2d4a74a1f9ae1f9ce2af6 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 @@ -119,7 +119,7 @@ https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py312h98912ed_0.conda#a8f9739e0ada2320148c92ddd608864f https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py312h98912ed_1.conda#e3fd78d8d490af1d84763b9fe3f2e552 -https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda#7462280d81f639363e6e63c81276bd9e +https://conda.anaconda.org/conda-forge/noarch/setuptools-70.0.0-pyhd8ed1ab_0.conda#c8ddb4f34a208df4dd42509a0f6a1c89 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 @@ -147,7 +147,7 @@ https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py312hdcec9eb_0.co https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.0-h1d62c97_1.conda#113f894e5019db2e2705645ee3bcf91a https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.6.1-pyhd8ed1ab_0.conda#1815c7974568079cf384f012de5ea1b7 -https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.0-pyhd8ed1ab_0.conda#088ff7e08f4f10a06190468048c2a353 +https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.1-pyhd8ed1ab_0.conda#e4418e8bdbaa8eea28e047531e6763c8 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.11.0-hd8ed1ab_0.conda#471e3988f8ca5e9eb3ce6be7eac3bcee https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 @@ -160,7 +160,7 @@ https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.con https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py312hb591178_6.conda#e5a041de2ecaee7e02c40cf82afa132e https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e -https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.2-pyhd8ed1ab_0.conda#e1643b34b19df8c028a4f00bf5df58a6 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda#ba9f7f0ec4f2a18de3e7bce67c4a431e https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h8572e83_4.conda#52c9e25ee0a32485a102eeecdb7eef52 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py312h085067d_1.conda#b121b9dd4935f63959eb35cc6c36973b @@ -170,7 +170,7 @@ https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.5.1-pyhd8ed1ab_0.co https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda#ba68cb5105760379432cebc82b45af40 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py312h98912ed_1.conda#d5273d1e67b7b3a871a0a711c6532a2f -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py312hc2bc53b_1.conda#d2dcf3642236a13c4212437104eb9275 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.1-py312hc2bc53b_0.conda#864b2399a9c998e17d1a9a4e0c601285 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.1.0-hd8ed1ab_0.conda#7ed7b077f6c6ebcb5fc66f23985df487 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py312ha5b4d35_1.conda#1248b799f811d8ea215de88f53ae7ffc https://conda.anaconda.org/conda-forge/noarch/tox-4.15.0-pyhd8ed1ab_0.conda#9dd85f9dfd5a48e795153df39b102aa1 From 95e3912c87842b8cc46138b491d65676114479d7 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Fri, 31 May 2024 15:24:33 +0100 Subject: [PATCH 318/583] =?UTF-8?q?=F0=9F=91=81=20TEMPLATE=20DEVIATIONS:?= =?UTF-8?q?=20synced=20file(s)=20with=20SciTools/.github=20(#464)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 👁 TEMPLATE DEVIATIONS: synced local '.pre-commit-config.yaml' with remote 'templates/.pre-commit-config.yaml' * Exclude numpydoc for iris-grib --------- Co-authored-by: scitools-ci[bot] <107775138+scitools-ci[bot]@users.noreply.github.com> Co-authored-by: Martin Yeo <40734014+trexfeathers@users.noreply.github.com> --- .pre-commit-config.yaml | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index d6040816..e8bbc3eb 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -8,12 +8,15 @@ ci: autoupdate_commit_msg: "chore: update pre-commit hooks" +# Alphabetised, for lack of a better order. files: | (?x)( + benchmarks\/.+\.py| + docs\/.+\.py| + lib\/.+\.py| noxfile\.py| pyproject\.toml| - docs\/.+\.py| - benchmarks\/.+\.py| + setup\.py| src\/.+\.py ) minimum_pre_commit_version: 1.21.0 @@ -26,14 +29,26 @@ repos: - id: check-added-large-files # Check whether files parse as valid Python. - id: check-ast - # Check for file name conflicts on case-insensitive filesytems. + # Check for file name conflicts on case-insensitive filesystems. - id: check-case-conflict # Check for files that contain merge conflict strings. - id: check-merge-conflict # Check for debugger imports and py37+ `breakpoint()` calls in Python source. - id: debug-statements + # Check TOML file syntax. + - id: check-toml + # Check YAML file syntax. + - id: check-yaml + # Makes sure files end in a newline and only a newline. + # Duplicates Ruff W292 but also works on non-Python files. + - id: end-of-file-fixer + # Replaces or checks mixed line ending. + - id: mixed-line-ending # Don't commit to main branch. - id: no-commit-to-branch + # Trims trailing whitespace. + # Duplicates Ruff W291 but also works on non-Python files. + - id: trailing-whitespace - repo: https://github.com/astral-sh/ruff-pre-commit rev: "v0.4.4" @@ -70,6 +85,7 @@ repos: exclude: 'noxfile\.py|docs/conf\.py' - repo: https://github.com/abravalheri/validate-pyproject + # More exhaustive than Ruff RUF200. rev: "v0.18" hooks: - id: validate-pyproject From 27f9dc2a5f100c21ad72f8b0a03d8908251bd415 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Sun, 2 Jun 2024 21:35:08 +0100 Subject: [PATCH 319/583] Updated environment lockfiles (#476) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 14 +++++++------- requirements/locks/py311-linux-64.lock | 14 +++++++------- requirements/locks/py312-linux-64.lock | 14 +++++++------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 9b0cf478..b0b1b959 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -31,7 +31,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc -https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h4ab18f5_6.conda#27329162c0dc732bcf67a4e0cd488125 https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.0-h4ab18f5_3.conda#12ea6d0d4ed54530eaed18e4835c1f7c @@ -62,7 +62,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#a https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 -https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda#68c34ec6149623be41a1933ab996a209 +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-h4ab18f5_6.conda#559d338a4234c2ad6e676f460a093e67 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-hc2324a3_1.conda#11d76bee958b1989bd1ac6ee7372ea6d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda#39f910d205726805a958da408ca194ba @@ -134,9 +134,9 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_10 https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py310h2fee648_0.conda#45846a970e71ac98fd327da5d40a0a2c -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.1-py310hc51659f_0.conda#64f82ee7706c57c55e61d267134786bf -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.51.0-py310h2372a71_0.conda#1a4773624145c15b92820fe6c87c5fcd -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_101.conda#7e98860d08eea82c8057abd78864fcb4 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.3-py310hc51659f_0.conda#4be0e55c0f724d339be3d4dc9dfc5752 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.52.4-py310hc51659f_0.conda#d6790ea21183a72fcd40691f191a9b8f +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_102.conda#d8cb3688b92e891e1e5f613517a50ca8 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda#0896606848b2dc5cebdf111b6543aa04 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda#4b31699e0ec5de64d5896e580389c9a1 @@ -161,13 +161,13 @@ https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py310hb13e2d6_0.con https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py310h7677b6e_6.conda#e45659a778e2be5fc94a816fe7129f1d https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.2-pyhd8ed1ab_0.conda#e1643b34b19df8c028a4f00bf5df58a6 +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda#ba9f7f0ec4f2a18de3e7bce67c4a431e https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310hd41b1e2_4.conda#35e87277fba9944b8a975113538bb5df https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py310h261611a_1.conda#5db5f54f2a6e689cb261ca4f6d8250db https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_0.conda#2cc61ba1dd53f0806247333f1294e058 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py310hd41b1e2_0.conda#60ee50b1968f802f2a487ba36d4cce0d -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.5.1-pyhd8ed1ab_0.conda#d4f60ccc5421472d2583efd9ce39d8b1 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.5.2-pyhd8ed1ab_0.conda#1a57a819915e1c169b74933720b138f2 https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda#ba68cb5105760379432cebc82b45af40 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py310h2372a71_1.conda#dfcf64f67961eb9686676f96fdb4b4d1 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 3f7f2b35..9f35012e 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -31,7 +31,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc -https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h4ab18f5_6.conda#27329162c0dc732bcf67a4e0cd488125 https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.0-h4ab18f5_3.conda#12ea6d0d4ed54530eaed18e4835c1f7c @@ -62,7 +62,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#a https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 -https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda#68c34ec6149623be41a1933ab996a209 +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-h4ab18f5_6.conda#559d338a4234c2ad6e676f460a093e67 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-hc2324a3_1.conda#11d76bee958b1989bd1ac6ee7372ea6d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda#39f910d205726805a958da408ca194ba @@ -133,9 +133,9 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_10 https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py311hb3a22ac_0.conda#b3469563ac5e808b0cd92810d0697043 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.1-py311h331c9d8_0.conda#9f35e13e3b9e05e153b78f42662061f6 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.51.0-py311h459d7ec_0.conda#17e1997cc17c571d5ad27bd0159f616c -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_101.conda#7e98860d08eea82c8057abd78864fcb4 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.3-py311h331c9d8_0.conda#543dd05fd661e4e9c9deb3b37093d6a2 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.52.4-py311h331c9d8_0.conda#0a5e7e2aca2a4217b2036e0d661dcfb0 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_102.conda#d8cb3688b92e891e1e5f613517a50ca8 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda#0896606848b2dc5cebdf111b6543aa04 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda#4b31699e0ec5de64d5896e580389c9a1 @@ -160,13 +160,13 @@ https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.con https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311hb3a3e68_6.conda#bce79adf84cd7cd9b9b14e43d6d52daf https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.2-pyhd8ed1ab_0.conda#e1643b34b19df8c028a4f00bf5df58a6 +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda#ba9f7f0ec4f2a18de3e7bce67c4a431e https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311h9547e67_4.conda#586da7df03b68640de14dc3e8bcbf76f https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py311h18e1886_1.conda#f1beb063aad4446eb146d8b88420a4ea https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_0.conda#2cc61ba1dd53f0806247333f1294e058 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py311h9547e67_0.conda#74ad0ae64f1ef565e27eda87fa749e84 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.5.1-pyhd8ed1ab_0.conda#d4f60ccc5421472d2583efd9ce39d8b1 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.5.2-pyhd8ed1ab_0.conda#1a57a819915e1c169b74933720b138f2 https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda#ba68cb5105760379432cebc82b45af40 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py311h459d7ec_1.conda#45b8d355bbcdd27588c2d266bcfdff84 diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index dc1a02a8..4a94e031 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -31,7 +31,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc -https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h4ab18f5_6.conda#27329162c0dc732bcf67a4e0cd488125 https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.0-h4ab18f5_3.conda#12ea6d0d4ed54530eaed18e4835c1f7c @@ -62,7 +62,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#a https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 -https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda#68c34ec6149623be41a1933ab996a209 +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-h4ab18f5_6.conda#559d338a4234c2ad6e676f460a093e67 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-hc2324a3_1.conda#11d76bee958b1989bd1ac6ee7372ea6d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda#39f910d205726805a958da408ca194ba @@ -133,9 +133,9 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_10 https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py312hf06ca03_0.conda#56b0ca764ce23cc54f3f7e2a7b970f6d -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.1-py312h9a8786e_0.conda#2d24a25dab0d00182eeed1ba9b64a12d -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.51.0-py312h98912ed_0.conda#f0cd0e54adf65aaa976f5731b7a3f383 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_101.conda#7e98860d08eea82c8057abd78864fcb4 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.3-py312h9a8786e_0.conda#f01930d0afe8ac5f8062c98e6b8d1fd0 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.52.4-py312h9a8786e_0.conda#004bb0afcd1a70ed4201245383c51b03 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_102.conda#d8cb3688b92e891e1e5f613517a50ca8 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda#0896606848b2dc5cebdf111b6543aa04 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda#4b31699e0ec5de64d5896e580389c9a1 @@ -160,13 +160,13 @@ https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.con https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py312hb591178_6.conda#e5a041de2ecaee7e02c40cf82afa132e https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.2-pyhd8ed1ab_0.conda#e1643b34b19df8c028a4f00bf5df58a6 +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda#ba9f7f0ec4f2a18de3e7bce67c4a431e https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h8572e83_4.conda#52c9e25ee0a32485a102eeecdb7eef52 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py312h085067d_1.conda#b121b9dd4935f63959eb35cc6c36973b https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_0.conda#2cc61ba1dd53f0806247333f1294e058 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py312h8572e83_0.conda#12c6a831ef734f0b2dd4caff514cbb7f -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.5.1-pyhd8ed1ab_0.conda#d4f60ccc5421472d2583efd9ce39d8b1 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.5.2-pyhd8ed1ab_0.conda#1a57a819915e1c169b74933720b138f2 https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda#ba68cb5105760379432cebc82b45af40 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py312h98912ed_1.conda#d5273d1e67b7b3a871a0a711c6532a2f From edf2e340f03dbfcd0a474ca3845bc0949c99642d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Jun 2024 10:06:09 +0100 Subject: [PATCH 320/583] Bump scitools/workflows in the dependencies group (#477) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2024.05.0 to 2024.05.1 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2024.05.0...2024.05.1) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 5d9f7ba0..81c4d801 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.05.0 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.05.1 diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index cfaae4f4..72c331a2 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.05.0 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.05.1 secrets: inherit From a1900ab88502499091d4e86dc0395127809f340e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 4 Jun 2024 09:38:54 +0100 Subject: [PATCH 321/583] chore: update pre-commit hooks (#475) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.4.4 → v0.4.7](https://github.com/astral-sh/ruff-pre-commit/compare/v0.4.4...v0.4.7) - [github.com/codespell-project/codespell: v2.2.6 → v2.3.0](https://github.com/codespell-project/codespell/compare/v2.2.6...v2.3.0) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index e8bbc3eb..832f93e8 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -51,7 +51,7 @@ repos: - id: trailing-whitespace - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.4.4" + rev: "v0.4.7" hooks: - id: ruff types: [file, python] @@ -60,7 +60,7 @@ repos: types: [file, python] - repo: https://github.com/codespell-project/codespell - rev: "v2.2.6" + rev: "v2.3.0" hooks: - id: codespell types_or: [asciidoc, python, markdown, rst] From d8a7ab63a4c3729ea79ccc631a685c9fca6452cc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 4 Jun 2024 11:46:20 +0100 Subject: [PATCH 322/583] Bump scitools/workflows from 2024.05.1 to 2024.06.0 in the dependencies group (#478) * Bump scitools/workflows in the dependencies group Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2024.05.1 to 2024.06.0 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2024.05.1...2024.06.0) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] * fix codespell (#479) --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Martin Yeo <40734014+trexfeathers@users.noreply.github.com> Co-authored-by: Bill Little --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- CONTRIBUTING.md | 2 +- docs/ref/release_notes.rst | 4 ++-- pyproject.toml | 4 ++-- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 81c4d801..09d38e0d 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.05.1 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.06.0 diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 72c331a2..7aa5e2b3 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.05.1 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.06.0 secrets: inherit diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e03d71f9..a4ce74ad 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -12,7 +12,7 @@ Getting started 1. If you've not already got one, sign up for a [GitHub account](https://github.com/signup/free). 2. Fork the iris-grib repository, create your new fix/feature branch, and - start commiting code. + start committing code. - The main [Iris development guide](https://scitools-iris.readthedocs.io/en/latest/developers_guide/gitwash/index.html) has more detail. diff --git a/docs/ref/release_notes.rst b/docs/ref/release_notes.rst index d69a620c..3a2049d7 100644 --- a/docs/ref/release_notes.rst +++ b/docs/ref/release_notes.rst @@ -275,7 +275,7 @@ Bugs Fixed system, since eccodes versions >= 1.19. This resulted from a change to eccodes, which now returns a different 'shapeOfTheEarth' parameter. This resulted in a coordinate system with a different earth radius. - For backwards compatibilty, the earth radius has now been fixed to the same value as previously. + For backwards compatibility, the earth radius has now been fixed to the same value as previously. However, pending further investigation, this value may be technically incorrect and we may yet decide to change it in a future release. `(PR#240) `_ @@ -448,7 +448,7 @@ Bug Fixes .. note:: This changes loading behaviour for data on hybrid pressure levels only. - This is an incompatible change, but the coefficent values previously + This is an incompatible change, but the coefficient values previously returned were essentially useless, with some values missing. diff --git a/pyproject.toml b/pyproject.toml index 4f844692..b08943c7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -96,8 +96,8 @@ exclude_lines = [ [tool.codespell] # See https://github.com/codespell-project/codespell/tree/master?tab=readme-ov-file#using-a-config-file -ignore-words-list = "alpha-numeric,degreee,discontiguities,lazyness,meaned,nin" -skip = "_build,*.css,*.ipynb,*.js,*.html,*.svg,*.xml,.git,generated" +ignore-words-list = "alpha-numeric,assertIn,degreee,discontiguities,lazyness,meaned,nin" +skip = "./CODE_OF_CONDUCT.md,_build,*.css,*.ipynb,*.js,*.html,*.svg,*.xml,.git,generated" [tool.check-manifest] ignore = [ From f62aea958bcd1a080f93c44a44b2a7c75222c945 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Sun, 9 Jun 2024 14:21:30 +0100 Subject: [PATCH 323/583] Updated environment lockfiles (#481) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 36 +++++++++++++------------- requirements/locks/py311-linux-64.lock | 36 +++++++++++++------------- requirements/locks/py312-linux-64.lock | 36 +++++++++++++------------- 3 files changed, 54 insertions(+), 54 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index b0b1b959..c5bdf649 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -3,8 +3,8 @@ # input_hash: d87fbf5e6b13b3bed3ae08420cfaea150d8e5ff6b469b3591861318a87b0a278 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_1.conda#33b7851c39c25da14f6a233a8ccbeeca +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.6.2-hbcca054_0.conda#847c3c2905cc467cea52c24f9cfa8080 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_2.conda#61b0bd5219ce7192b4e3633521a78975 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_7.conda#53ebd4c833fa01cb2c6353e99f905406 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-4_cp310.conda#26322ec5d7712c3ded99dd656142b8ce https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 @@ -31,10 +31,10 @@ https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc -https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h4ab18f5_6.conda#27329162c0dc732bcf67a4e0cd488125 +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.0-h4ab18f5_3.conda#12ea6d0d4ed54530eaed18e4835c1f7c +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4ab18f5_0.conda#a41fa0e391cc9e0d6b78ac69ca047a6c https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.0-hdb0a2a9_1.conda#843bbb8ace1d64ac50d64639ff38b014 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b @@ -57,12 +57,12 @@ https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.3-h2797004_0.cond https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-hc051c1a_0.conda#5d801a4906adc712d480afc362623b59 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-hc051c1a_1.conda#340278ded8b0dc3a73f3660bbb0adbc6 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 -https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-h4ab18f5_6.conda#559d338a4234c2ad6e676f460a093e67 +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-h4ab18f5_1.conda#9653f1bf3766164d0e65fa723cabbc54 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-hc2324a3_1.conda#11d76bee958b1989bd1ac6ee7372ea6d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda#39f910d205726805a958da408ca194ba @@ -95,7 +95,7 @@ https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py310hff52083_3. https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa https://conda.anaconda.org/conda-forge/noarch/filelock-3.14.0-pyhd8ed1ab_0.conda#831d85ae0acfba31b8efd0f0d07da736 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.5.0-pyhff2d567_0.conda#d73e9932511ef7670b2cc0ebd9dfbd30 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.6.0-pyhff2d567_0.conda#ad6af3f92e71b1579ac2362b6cf29105 https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda#c0cc1420498b17414d8617d0b9f506ca https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 @@ -126,7 +126,7 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda#6ef2fc37559256cf682d8b3375e89b80 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda#ebe6952715e1d5eb567eeebf25250fa7 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py310h2372a71_0.conda#72637c58d36d9475fda24700c9796f19 https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda#0b5293a157c2b5cd513dd1b03d8d3aae https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec @@ -135,30 +135,30 @@ https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4 https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py310h2fee648_0.conda#45846a970e71ac98fd327da5d40a0a2c https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.3-py310hc51659f_0.conda#4be0e55c0f724d339be3d4dc9dfc5752 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.52.4-py310hc51659f_0.conda#d6790ea21183a72fcd40691f191a9b8f -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_102.conda#d8cb3688b92e891e1e5f613517a50ca8 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.0-py310hc51659f_0.conda#0b6cd00b80d5af0bbfa261606ed56a18 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda#0896606848b2dc5cebdf111b6543aa04 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda#4b31699e0ec5de64d5896e580389c9a1 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_openblas.conda#b083767b6c877e24ee597d93b87ab838 -https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda#2a75b296096adabbabadd5e9782e5fcc +https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda#dfe0528d0f1c16c1f7c528ea5536ab30 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py310hf73ecf8_0.conda#1de56cf017dfd02aa84093206a0141a8 https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.0-h1d62c97_1.conda#113f894e5019db2e2705645ee3bcf91a +https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.0-hb784bbd_2.conda#b0683c229de4c4c676450d24ff87538c https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.6.1-pyhd8ed1ab_0.conda#1815c7974568079cf384f012de5ea1b7 -https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.1-pyhd8ed1ab_0.conda#e4418e8bdbaa8eea28e047531e6763c8 +https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.2-pyhd8ed1ab_0.conda#0f3f49c22c7ef3a1195fa61dad3c43be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.11.0-hd8ed1ab_0.conda#471e3988f8ca5e9eb3ce6be7eac3bcee +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.2-pyhd8ed1ab_0.conda#7d36e7a485ea2f5829408813bdbbfb38 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.1.0-hd8ed1ab_0.conda#6ef2b72d291b39e479d7694efa2b2b98 -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h9612171_113.conda#b2414908e43c442ddc68e6148774a304 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h135f659_114.conda#a908e463c710bd6b10a9eaa89fdf003c https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py310hb13e2d6_0.conda#6593de64c935768b6bad3e19b3e978be -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py310h7677b6e_6.conda#e45659a778e2be5fc94a816fe7129f1d +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py310hf666db6_7.conda#577d33875077f2ae50b13dd56e4d90f8 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 @@ -174,11 +174,11 @@ https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py310h2372a71_1.co https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.1-py310h93e2701_0.conda#9a697144b2f3adc88ada6b6201b379c4 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.1.0-hd8ed1ab_0.conda#7ed7b077f6c6ebcb5fc66f23985df487 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py310hec8f0c1_1.conda#baf9a1e8de78418d988232388dc309dc -https://conda.anaconda.org/conda-forge/noarch/tox-4.15.0-pyhd8ed1ab_0.conda#9dd85f9dfd5a48e795153df39b102aa1 +https://conda.anaconda.org/conda-forge/noarch/tox-4.15.1-pyhd8ed1ab_0.conda#d010e869d9708130ab2206267eac3e92 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py310h261611a_5.conda#643414a9f73226b2a6a43a4800734d3b https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.35.0-he84ddb8_0.conda#2d01dfbe537478e7a1a495b9639edd45 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py310hef631a5_2.conda#b3fa3fc2a0fa8b53b913c94297b12e27 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py310h3aa39b3_101.conda#ff01d25c8eee3db423673eb5bdc072ed +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py310h3aa39b3_102.conda#d29d8f13fb26c2851588384a13e3ef4b https://conda.anaconda.org/conda-forge/noarch/nox-2024.4.15-pyhff2d567_0.conda#600c0de12125f473d8099c0b3e6f88d4 https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda#724bc4489c1174fc8e3233b0624fa51f https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py310hf9f9076_1.conda#dd5c97834c12bae782b35261e0bea7b4 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 9f35012e..2f4a3aa0 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -3,8 +3,8 @@ # input_hash: 60217b599fcbadcfc8eab3310daf72f9d8a52a7ee931c9b04e0861ad9ae71313 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_1.conda#33b7851c39c25da14f6a233a8ccbeeca +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.6.2-hbcca054_0.conda#847c3c2905cc467cea52c24f9cfa8080 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_2.conda#61b0bd5219ce7192b4e3633521a78975 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_7.conda#53ebd4c833fa01cb2c6353e99f905406 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-4_cp311.conda#d786502c97404c94d7d58d258a445a65 https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 @@ -31,10 +31,10 @@ https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc -https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h4ab18f5_6.conda#27329162c0dc732bcf67a4e0cd488125 +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.0-h4ab18f5_3.conda#12ea6d0d4ed54530eaed18e4835c1f7c +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4ab18f5_0.conda#a41fa0e391cc9e0d6b78ac69ca047a6c https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.0-hdb0a2a9_1.conda#843bbb8ace1d64ac50d64639ff38b014 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b @@ -57,12 +57,12 @@ https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.3-h2797004_0.cond https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-hc051c1a_0.conda#5d801a4906adc712d480afc362623b59 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-hc051c1a_1.conda#340278ded8b0dc3a73f3660bbb0adbc6 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 -https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-h4ab18f5_6.conda#559d338a4234c2ad6e676f460a093e67 +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-h4ab18f5_1.conda#9653f1bf3766164d0e65fa723cabbc54 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-hc2324a3_1.conda#11d76bee958b1989bd1ac6ee7372ea6d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda#39f910d205726805a958da408ca194ba @@ -95,7 +95,7 @@ https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py311h38be061_3. https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa https://conda.anaconda.org/conda-forge/noarch/filelock-3.14.0-pyhd8ed1ab_0.conda#831d85ae0acfba31b8efd0f0d07da736 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.5.0-pyhff2d567_0.conda#d73e9932511ef7670b2cc0ebd9dfbd30 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.6.0-pyhff2d567_0.conda#ad6af3f92e71b1579ac2362b6cf29105 https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda#c0cc1420498b17414d8617d0b9f506ca https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 @@ -126,7 +126,7 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda#6ef2fc37559256cf682d8b3375e89b80 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda#ebe6952715e1d5eb567eeebf25250fa7 https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda#0b5293a157c2b5cd513dd1b03d8d3aae https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a @@ -134,30 +134,30 @@ https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4 https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py311hb3a22ac_0.conda#b3469563ac5e808b0cd92810d0697043 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.3-py311h331c9d8_0.conda#543dd05fd661e4e9c9deb3b37093d6a2 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.52.4-py311h331c9d8_0.conda#0a5e7e2aca2a4217b2036e0d661dcfb0 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_102.conda#d8cb3688b92e891e1e5f613517a50ca8 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.0-py311h331c9d8_0.conda#2daef6c4ce74840c8d7a431498be83e9 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda#0896606848b2dc5cebdf111b6543aa04 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda#4b31699e0ec5de64d5896e580389c9a1 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_openblas.conda#b083767b6c877e24ee597d93b87ab838 -https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda#2a75b296096adabbabadd5e9782e5fcc +https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda#dfe0528d0f1c16c1f7c528ea5536ab30 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py311h18e6fac_0.conda#6c520a9d36c9d7270988c7a6c360d6d4 https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.0-h1d62c97_1.conda#113f894e5019db2e2705645ee3bcf91a +https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.0-hb784bbd_2.conda#b0683c229de4c4c676450d24ff87538c https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.6.1-pyhd8ed1ab_0.conda#1815c7974568079cf384f012de5ea1b7 -https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.1-pyhd8ed1ab_0.conda#e4418e8bdbaa8eea28e047531e6763c8 +https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.2-pyhd8ed1ab_0.conda#0f3f49c22c7ef3a1195fa61dad3c43be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.11.0-hd8ed1ab_0.conda#471e3988f8ca5e9eb3ce6be7eac3bcee +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.2-pyhd8ed1ab_0.conda#7d36e7a485ea2f5829408813bdbbfb38 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.1.0-hd8ed1ab_0.conda#6ef2b72d291b39e479d7694efa2b2b98 -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h9612171_113.conda#b2414908e43c442ddc68e6148774a304 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h135f659_114.conda#a908e463c710bd6b10a9eaa89fdf003c https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.conda#a502d7aad449a1206efb366d6a12c52d -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311hb3a3e68_6.conda#bce79adf84cd7cd9b9b14e43d6d52daf +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311hc21b84f_7.conda#0d55a70a8c2160a7f3cbe9fcfd87f82a https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 @@ -173,11 +173,11 @@ https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py311h459d7ec_1.co https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.1-py311h517d4fd_0.conda#764b0e055f59dbd7d114d32b8c6e55e6 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.1.0-hd8ed1ab_0.conda#7ed7b077f6c6ebcb5fc66f23985df487 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py311h0bed3d6_1.conda#6fb2f733ef405b4bfb4a6a362703457e -https://conda.anaconda.org/conda-forge/noarch/tox-4.15.0-pyhd8ed1ab_0.conda#9dd85f9dfd5a48e795153df39b102aa1 +https://conda.anaconda.org/conda-forge/noarch/tox-4.15.1-pyhd8ed1ab_0.conda#d010e869d9708130ab2206267eac3e92 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h18e1886_5.conda#6cd3facab7a79de14abb1a86a2d830fa https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.35.0-he84ddb8_0.conda#2d01dfbe537478e7a1a495b9639edd45 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py311ha4ca890_2.conda#0848e2084cbb57014f232f48568561af -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py311h74118c1_101.conda#153b3a81c6f11e87b87461247c3cf061 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py311h74118c1_102.conda#5f98c1d56c5853270c7876bb1000a631 https://conda.anaconda.org/conda-forge/noarch/nox-2024.4.15-pyhff2d567_0.conda#600c0de12125f473d8099c0b3e6f88d4 https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda#724bc4489c1174fc8e3233b0624fa51f https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py311h14de704_1.conda#27e5956e552c6e71f56cb1ec042617a8 diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 4a94e031..e164ae8f 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -3,8 +3,8 @@ # input_hash: aceb4f254f1d98ca662bbb35c77671dac9f062d5c373bd67050bbb9b99171617 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_1.conda#33b7851c39c25da14f6a233a8ccbeeca +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.6.2-hbcca054_0.conda#847c3c2905cc467cea52c24f9cfa8080 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_2.conda#61b0bd5219ce7192b4e3633521a78975 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_7.conda#53ebd4c833fa01cb2c6353e99f905406 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-4_cp312.conda#dccc2d142812964fcc6abdc97b672dff https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 @@ -31,10 +31,10 @@ https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc -https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h4ab18f5_6.conda#27329162c0dc732bcf67a4e0cd488125 +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.0-h4ab18f5_3.conda#12ea6d0d4ed54530eaed18e4835c1f7c +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4ab18f5_0.conda#a41fa0e391cc9e0d6b78ac69ca047a6c https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.0-hdb0a2a9_1.conda#843bbb8ace1d64ac50d64639ff38b014 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b @@ -57,12 +57,12 @@ https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.3-h2797004_0.cond https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-hc051c1a_0.conda#5d801a4906adc712d480afc362623b59 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-hc051c1a_1.conda#340278ded8b0dc3a73f3660bbb0adbc6 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 -https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-h4ab18f5_6.conda#559d338a4234c2ad6e676f460a093e67 +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-h4ab18f5_1.conda#9653f1bf3766164d0e65fa723cabbc54 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-hc2324a3_1.conda#11d76bee958b1989bd1ac6ee7372ea6d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda#39f910d205726805a958da408ca194ba @@ -95,7 +95,7 @@ https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py312h7900ff3_3. https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa https://conda.anaconda.org/conda-forge/noarch/filelock-3.14.0-pyhd8ed1ab_0.conda#831d85ae0acfba31b8efd0f0d07da736 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.5.0-pyhff2d567_0.conda#d73e9932511ef7670b2cc0ebd9dfbd30 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.6.0-pyhff2d567_0.conda#ad6af3f92e71b1579ac2362b6cf29105 https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda#c0cc1420498b17414d8617d0b9f506ca https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 @@ -126,7 +126,7 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda#6ef2fc37559256cf682d8b3375e89b80 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda#ebe6952715e1d5eb567eeebf25250fa7 https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda#0b5293a157c2b5cd513dd1b03d8d3aae https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a @@ -134,30 +134,30 @@ https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4 https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py312hf06ca03_0.conda#56b0ca764ce23cc54f3f7e2a7b970f6d https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.3-py312h9a8786e_0.conda#f01930d0afe8ac5f8062c98e6b8d1fd0 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.52.4-py312h9a8786e_0.conda#004bb0afcd1a70ed4201245383c51b03 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_102.conda#d8cb3688b92e891e1e5f613517a50ca8 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.0-py312h9a8786e_0.conda#8490346e9d5efd7a6869582aa0c95b25 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda#0896606848b2dc5cebdf111b6543aa04 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda#4b31699e0ec5de64d5896e580389c9a1 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_openblas.conda#b083767b6c877e24ee597d93b87ab838 -https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda#2a75b296096adabbabadd5e9782e5fcc +https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda#dfe0528d0f1c16c1f7c528ea5536ab30 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py312hdcec9eb_0.conda#425bb325f970e57a047ac57c4586489d https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.0-h1d62c97_1.conda#113f894e5019db2e2705645ee3bcf91a +https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.0-hb784bbd_2.conda#b0683c229de4c4c676450d24ff87538c https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.6.1-pyhd8ed1ab_0.conda#1815c7974568079cf384f012de5ea1b7 -https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.1-pyhd8ed1ab_0.conda#e4418e8bdbaa8eea28e047531e6763c8 +https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.2-pyhd8ed1ab_0.conda#0f3f49c22c7ef3a1195fa61dad3c43be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.11.0-hd8ed1ab_0.conda#471e3988f8ca5e9eb3ce6be7eac3bcee +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.2-pyhd8ed1ab_0.conda#7d36e7a485ea2f5829408813bdbbfb38 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.1.0-hd8ed1ab_0.conda#6ef2b72d291b39e479d7694efa2b2b98 -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h9612171_113.conda#b2414908e43c442ddc68e6148774a304 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h135f659_114.conda#a908e463c710bd6b10a9eaa89fdf003c https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda#d8285bea2a350f63fab23bf460221f3f -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py312hb591178_6.conda#e5a041de2ecaee7e02c40cf82afa132e +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py312h5d05ceb_7.conda#b53ddc25da04839cc62b0b158a7ecb38 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 @@ -173,11 +173,11 @@ https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py312h98912ed_1.co https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.1-py312hc2bc53b_0.conda#864b2399a9c998e17d1a9a4e0c601285 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.1.0-hd8ed1ab_0.conda#7ed7b077f6c6ebcb5fc66f23985df487 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py312ha5b4d35_1.conda#1248b799f811d8ea215de88f53ae7ffc -https://conda.anaconda.org/conda-forge/noarch/tox-4.15.0-pyhd8ed1ab_0.conda#9dd85f9dfd5a48e795153df39b102aa1 +https://conda.anaconda.org/conda-forge/noarch/tox-4.15.1-pyhd8ed1ab_0.conda#d010e869d9708130ab2206267eac3e92 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py312h085067d_5.conda#b40cdf87aee69ccf162022579cb99afb https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.35.0-he84ddb8_0.conda#2d01dfbe537478e7a1a495b9639edd45 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py312h20ab3a6_2.conda#fbfe798f83f0d66410903ad8f40d5283 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py312h39d4375_101.conda#9033de6c10fd3396990890d8d8a6ac4e +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py312h39d4375_102.conda#2c0df33e745d3bd509f76217b8c79096 https://conda.anaconda.org/conda-forge/noarch/nox-2024.4.15-pyhff2d567_0.conda#600c0de12125f473d8099c0b3e6f88d4 https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda#724bc4489c1174fc8e3233b0624fa51f https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py312h1d6d2e6_1.conda#6392d3ce615ab0f32bc39b07f8f4c300 From 506825715a6ee1d85a3f0fd2c2dbcd326e78bc71 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 10 Jun 2024 21:31:35 +0100 Subject: [PATCH 324/583] chore: update pre-commit hooks (#482) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.4.7 → v0.4.8](https://github.com/astral-sh/ruff-pre-commit/compare/v0.4.7...v0.4.8) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 832f93e8..adeef626 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -51,7 +51,7 @@ repos: - id: trailing-whitespace - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.4.7" + rev: "v0.4.8" hooks: - id: ruff types: [file, python] From 2acdf7f8ba441bd7af48cb0e892cf80e66352a9f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Jun 2024 10:33:54 +0100 Subject: [PATCH 325/583] Bump scitools/workflows in the dependencies group (#483) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2024.06.0 to 2024.06.1 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2024.06.0...2024.06.1) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 09d38e0d..9962edc6 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.06.0 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.06.1 diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 7aa5e2b3..18ee36fa 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.06.0 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.06.1 secrets: inherit From 825044506286d07b0cb9bc502797723bbbe2b9f1 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Sat, 15 Jun 2024 10:08:22 +0100 Subject: [PATCH 326/583] Updated environment lockfiles (#485) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 46 +++++++++++++------------- requirements/locks/py311-linux-64.lock | 46 +++++++++++++------------- requirements/locks/py312-linux-64.lock | 46 +++++++++++++------------- 3 files changed, 69 insertions(+), 69 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index c5bdf649..195743f4 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -4,39 +4,32 @@ @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.6.2-hbcca054_0.conda#847c3c2905cc467cea52c24f9cfa8080 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_2.conda#61b0bd5219ce7192b4e3633521a78975 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_7.conda#53ebd4c833fa01cb2c6353e99f905406 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_4.conda#02d936b69ab683fc6755c236996f8b51 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-4_cp310.conda#26322ec5d7712c3ded99dd656142b8ce https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_7.conda#abf3fec87c2563697defa759dec3d639 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_9.conda#0d0ad0fdee21442a479005ef5f3a02e8 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_7.conda#72ec1b1b04c4d15d4204ece1ecea5978 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_9.conda#f23bc130bc3d2bbd9d9d6892609546ea https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.28.1-hd590300_0.conda#dcde58ff9a1f30b0037a2315d1846d1f -https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d -https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 -https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f -https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.20-hd590300_0.conda#8e88f9389f1165d7c0936fe40d9a9a79 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-hca663fb_7.conda#c0bd771f09a326fdcd95a60b617795bf +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-h3d2ce59_9.conda#2f2a59af95aed6024368b8dbaf9591d8 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 -https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_9.conda#2075df518ef9d09f1ae209c83116e808 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 -https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4ab18f5_0.conda#a41fa0e391cc9e0d6b78ac69ca047a6c https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 -https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.0-hdb0a2a9_1.conda#843bbb8ace1d64ac50d64639ff38b014 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda#2c80dc38fface310c9bd81b17037fee5 @@ -46,20 +39,26 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae +https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 +https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff +https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f +https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_7.conda#1b84f26d9f4f6026e179e7805d5a15cd +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_9.conda#90a8b0f4e0d4a333f54d0c33b882ee9a +https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.3-h2797004_0.conda#b3316cbe90249da4f8e84cd66e1cc55b +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda#18aa975d2094c34aef978060ae7da7d8 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-hc051c1a_1.conda#340278ded8b0dc3a73f3660bbb0adbc6 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b +https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 +https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.0-hdb0a2a9_1.conda#843bbb8ace1d64ac50d64639ff38b014 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-h4ab18f5_1.conda#9653f1bf3766164d0e65fa723cabbc54 @@ -70,8 +69,9 @@ https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_h413a1c8_0.conda#a356024784da6dfd4683dc5ecf45b155 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda#66f03896ffbe1a110ffda05c7a856504 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-hc051c1a_1.conda#340278ded8b0dc3a73f3660bbb0adbc6 https://conda.anaconda.org/conda-forge/linux-64/python-3.10.14-hd12c33a_0_cpython.conda#2b4ba962994e8bd4be9ff5b64b75aff2 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.3-h2c6b66d_0.conda#be7d70f2db41b674733667bdd69bd000 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.46.0-h6d4b2fc_0.conda#77ea8dff5cf8550cc8f5629a6af56323 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-h8ee46fc_0.conda#077b6e8ad6a3ddb741fce2496dd01bec https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb @@ -81,7 +81,7 @@ https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda#5e https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hc6cd4ac_1.conda#1f95722c94f00b69af69a066c7433714 https://conda.anaconda.org/conda-forge/noarch/cachetools-5.3.3-pyhd8ed1ab_0.conda#cd4c26c702a9bcdc70ff05b609ddacbe -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda#0876280e409658fc6f9e75d035960333 +https://conda.anaconda.org/conda-forge/noarch/certifi-2024.6.2-pyhd8ed1ab_0.conda#8821ec1c8fcdc9e1d291d7b9f6e9968a https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2#ebb5f5f7dc4f1a3780ef7ea7738db08c https://conda.anaconda.org/conda-forge/linux-64/chardet-5.2.0-py310hff52083_1.conda#a677136a83b823803d2f92045f885be2 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a @@ -93,7 +93,7 @@ https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5 https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py310hff52083_3.conda#c159dcd29bbd80b187b1c5d5f73cc971 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa -https://conda.anaconda.org/conda-forge/noarch/filelock-3.14.0-pyhd8ed1ab_0.conda#831d85ae0acfba31b8efd0f0d07da736 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.1-pyhd8ed1ab_0.conda#ca4149866d80007713ff47906bba8cb3 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.6.0-pyhff2d567_0.conda#ad6af3f92e71b1579ac2362b6cf29105 https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda#c0cc1420498b17414d8617d0b9f506ca @@ -108,7 +108,7 @@ https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2# https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py310h2372a71_0.conda#f6703fa0214a00bf49d1bef6dc7672d0 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 -https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#248f521b64ce055e7feae3105e7abeb8 +https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.2-pyhd8ed1ab_0.conda#6f6cf28bf8e021933869bae3f84b8fc9 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 @@ -131,7 +131,7 @@ https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py310h2372a7 https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda#0b5293a157c2b5cd513dd1b03d8d3aae https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a -https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a +https://conda.anaconda.org/conda-forge/noarch/zipp-3.19.2-pyhd8ed1ab_0.conda#49808e59df5535116f6878b2a820d6f4 https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py310h2fee648_0.conda#45846a970e71ac98fd327da5d40a0a2c https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.3-py310hc51659f_0.conda#4be0e55c0f724d339be3d4dc9dfc5752 @@ -146,7 +146,7 @@ https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda#d https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py310hf73ecf8_0.conda#1de56cf017dfd02aa84093206a0141a8 https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.0-hb784bbd_2.conda#b0683c229de4c4c676450d24ff87538c +https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.1-hb784bbd_0.conda#c38c5246d064ef16eba065d93c46f1c6 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.6.1-pyhd8ed1ab_0.conda#1815c7974568079cf384f012de5ea1b7 https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.2-pyhd8ed1ab_0.conda#0f3f49c22c7ef3a1195fa61dad3c43be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c @@ -164,10 +164,10 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.co https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda#ba9f7f0ec4f2a18de3e7bce67c4a431e https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310hd41b1e2_4.conda#35e87277fba9944b8a975113538bb5df -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py310h261611a_1.conda#5db5f54f2a6e689cb261ca4f6d8250db +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310h261611a_0.conda#5c0e2cd80ceab2ac5201459cc016b88b https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_0.conda#2cc61ba1dd53f0806247333f1294e058 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py310hd41b1e2_0.conda#60ee50b1968f802f2a487ba36d4cce0d -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.5.2-pyhd8ed1ab_0.conda#1a57a819915e1c169b74933720b138f2 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.6.0-pyhd8ed1ab_0.conda#edf709967712b2953ab4189256266adc https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda#ba68cb5105760379432cebc82b45af40 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py310h2372a71_1.conda#dfcf64f67961eb9686676f96fdb4b4d1 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 2f4a3aa0..bd751b68 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -4,39 +4,32 @@ @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.6.2-hbcca054_0.conda#847c3c2905cc467cea52c24f9cfa8080 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_2.conda#61b0bd5219ce7192b4e3633521a78975 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_7.conda#53ebd4c833fa01cb2c6353e99f905406 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_4.conda#02d936b69ab683fc6755c236996f8b51 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-4_cp311.conda#d786502c97404c94d7d58d258a445a65 https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_7.conda#abf3fec87c2563697defa759dec3d639 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_9.conda#0d0ad0fdee21442a479005ef5f3a02e8 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_7.conda#72ec1b1b04c4d15d4204ece1ecea5978 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_9.conda#f23bc130bc3d2bbd9d9d6892609546ea https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.28.1-hd590300_0.conda#dcde58ff9a1f30b0037a2315d1846d1f -https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d -https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 -https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f -https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.20-hd590300_0.conda#8e88f9389f1165d7c0936fe40d9a9a79 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-hca663fb_7.conda#c0bd771f09a326fdcd95a60b617795bf +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-h3d2ce59_9.conda#2f2a59af95aed6024368b8dbaf9591d8 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 -https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_9.conda#2075df518ef9d09f1ae209c83116e808 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 -https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4ab18f5_0.conda#a41fa0e391cc9e0d6b78ac69ca047a6c https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 -https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.0-hdb0a2a9_1.conda#843bbb8ace1d64ac50d64639ff38b014 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda#2c80dc38fface310c9bd81b17037fee5 @@ -46,20 +39,26 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae +https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 +https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff +https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f +https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_7.conda#1b84f26d9f4f6026e179e7805d5a15cd +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_9.conda#90a8b0f4e0d4a333f54d0c33b882ee9a +https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.3-h2797004_0.conda#b3316cbe90249da4f8e84cd66e1cc55b +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda#18aa975d2094c34aef978060ae7da7d8 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-hc051c1a_1.conda#340278ded8b0dc3a73f3660bbb0adbc6 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b +https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 +https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.0-hdb0a2a9_1.conda#843bbb8ace1d64ac50d64639ff38b014 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-h4ab18f5_1.conda#9653f1bf3766164d0e65fa723cabbc54 @@ -70,8 +69,9 @@ https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_h413a1c8_0.conda#a356024784da6dfd4683dc5ecf45b155 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda#66f03896ffbe1a110ffda05c7a856504 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-hc051c1a_1.conda#340278ded8b0dc3a73f3660bbb0adbc6 https://conda.anaconda.org/conda-forge/linux-64/python-3.11.9-hb806964_0_cpython.conda#ac68acfa8b558ed406c75e98d3428d7b -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.3-h2c6b66d_0.conda#be7d70f2db41b674733667bdd69bd000 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.46.0-h6d4b2fc_0.conda#77ea8dff5cf8550cc8f5629a6af56323 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-h8ee46fc_0.conda#077b6e8ad6a3ddb741fce2496dd01bec https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb @@ -81,7 +81,7 @@ https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda#5e https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hb755f60_1.conda#cce9e7c3f1c307f2a5fb08a2922d6164 https://conda.anaconda.org/conda-forge/noarch/cachetools-5.3.3-pyhd8ed1ab_0.conda#cd4c26c702a9bcdc70ff05b609ddacbe -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda#0876280e409658fc6f9e75d035960333 +https://conda.anaconda.org/conda-forge/noarch/certifi-2024.6.2-pyhd8ed1ab_0.conda#8821ec1c8fcdc9e1d291d7b9f6e9968a https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2#ebb5f5f7dc4f1a3780ef7ea7738db08c https://conda.anaconda.org/conda-forge/linux-64/chardet-5.2.0-py311h38be061_1.conda#b8cfb13de4dbe349a41800644391de6a https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a @@ -93,7 +93,7 @@ https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5 https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py311h38be061_3.conda#1c33f55e5cdcc2a2b973c432b5225bfe https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa -https://conda.anaconda.org/conda-forge/noarch/filelock-3.14.0-pyhd8ed1ab_0.conda#831d85ae0acfba31b8efd0f0d07da736 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.1-pyhd8ed1ab_0.conda#ca4149866d80007713ff47906bba8cb3 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.6.0-pyhff2d567_0.conda#ad6af3f92e71b1579ac2362b6cf29105 https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda#c0cc1420498b17414d8617d0b9f506ca @@ -108,7 +108,7 @@ https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2# https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py311h459d7ec_0.conda#a322b4185121935c871d201ae00ac143 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 -https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#248f521b64ce055e7feae3105e7abeb8 +https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.2-pyhd8ed1ab_0.conda#6f6cf28bf8e021933869bae3f84b8fc9 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 @@ -130,7 +130,7 @@ https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c7 https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda#0b5293a157c2b5cd513dd1b03d8d3aae https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a -https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a +https://conda.anaconda.org/conda-forge/noarch/zipp-3.19.2-pyhd8ed1ab_0.conda#49808e59df5535116f6878b2a820d6f4 https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py311hb3a22ac_0.conda#b3469563ac5e808b0cd92810d0697043 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.3-py311h331c9d8_0.conda#543dd05fd661e4e9c9deb3b37093d6a2 @@ -145,7 +145,7 @@ https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda#d https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py311h18e6fac_0.conda#6c520a9d36c9d7270988c7a6c360d6d4 https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.0-hb784bbd_2.conda#b0683c229de4c4c676450d24ff87538c +https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.1-hb784bbd_0.conda#c38c5246d064ef16eba065d93c46f1c6 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.6.1-pyhd8ed1ab_0.conda#1815c7974568079cf384f012de5ea1b7 https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.2-pyhd8ed1ab_0.conda#0f3f49c22c7ef3a1195fa61dad3c43be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c @@ -163,10 +163,10 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.co https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda#ba9f7f0ec4f2a18de3e7bce67c4a431e https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311h9547e67_4.conda#586da7df03b68640de14dc3e8bcbf76f -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py311h18e1886_1.conda#f1beb063aad4446eb146d8b88420a4ea +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h18e1886_0.conda#0eb1e6c7d10285ec12e01f73d1896d93 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_0.conda#2cc61ba1dd53f0806247333f1294e058 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py311h9547e67_0.conda#74ad0ae64f1ef565e27eda87fa749e84 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.5.2-pyhd8ed1ab_0.conda#1a57a819915e1c169b74933720b138f2 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.6.0-pyhd8ed1ab_0.conda#edf709967712b2953ab4189256266adc https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda#ba68cb5105760379432cebc82b45af40 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py311h459d7ec_1.conda#45b8d355bbcdd27588c2d266bcfdff84 diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index e164ae8f..9ad70c8a 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -4,39 +4,32 @@ @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.6.2-hbcca054_0.conda#847c3c2905cc467cea52c24f9cfa8080 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_2.conda#61b0bd5219ce7192b4e3633521a78975 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_7.conda#53ebd4c833fa01cb2c6353e99f905406 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_4.conda#02d936b69ab683fc6755c236996f8b51 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-4_cp312.conda#dccc2d142812964fcc6abdc97b672dff https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_7.conda#abf3fec87c2563697defa759dec3d639 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_9.conda#0d0ad0fdee21442a479005ef5f3a02e8 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_7.conda#72ec1b1b04c4d15d4204ece1ecea5978 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_9.conda#f23bc130bc3d2bbd9d9d6892609546ea https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.28.1-hd590300_0.conda#dcde58ff9a1f30b0037a2315d1846d1f -https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d -https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 -https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f -https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.20-hd590300_0.conda#8e88f9389f1165d7c0936fe40d9a9a79 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-hca663fb_7.conda#c0bd771f09a326fdcd95a60b617795bf +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-h3d2ce59_9.conda#2f2a59af95aed6024368b8dbaf9591d8 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 -https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_9.conda#2075df518ef9d09f1ae209c83116e808 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 -https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4ab18f5_0.conda#a41fa0e391cc9e0d6b78ac69ca047a6c https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 -https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.0-hdb0a2a9_1.conda#843bbb8ace1d64ac50d64639ff38b014 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda#2c80dc38fface310c9bd81b17037fee5 @@ -46,20 +39,26 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae +https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 +https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff +https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f +https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_7.conda#1b84f26d9f4f6026e179e7805d5a15cd +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_9.conda#90a8b0f4e0d4a333f54d0c33b882ee9a +https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.3-h2797004_0.conda#b3316cbe90249da4f8e84cd66e1cc55b +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda#18aa975d2094c34aef978060ae7da7d8 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-hc051c1a_1.conda#340278ded8b0dc3a73f3660bbb0adbc6 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b +https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 +https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.0-hdb0a2a9_1.conda#843bbb8ace1d64ac50d64639ff38b014 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-h4ab18f5_1.conda#9653f1bf3766164d0e65fa723cabbc54 @@ -70,8 +69,9 @@ https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_h413a1c8_0.conda#a356024784da6dfd4683dc5ecf45b155 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda#66f03896ffbe1a110ffda05c7a856504 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-hc051c1a_1.conda#340278ded8b0dc3a73f3660bbb0adbc6 https://conda.anaconda.org/conda-forge/linux-64/python-3.12.3-hab00c5b_0_cpython.conda#2540b74d304f71d3e89c81209db4db84 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.3-h2c6b66d_0.conda#be7d70f2db41b674733667bdd69bd000 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.46.0-h6d4b2fc_0.conda#77ea8dff5cf8550cc8f5629a6af56323 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-h8ee46fc_0.conda#077b6e8ad6a3ddb741fce2496dd01bec https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb @@ -81,7 +81,7 @@ https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda#5e https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h30efb56_1.conda#45801a89533d3336a365284d93298e36 https://conda.anaconda.org/conda-forge/noarch/cachetools-5.3.3-pyhd8ed1ab_0.conda#cd4c26c702a9bcdc70ff05b609ddacbe -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda#0876280e409658fc6f9e75d035960333 +https://conda.anaconda.org/conda-forge/noarch/certifi-2024.6.2-pyhd8ed1ab_0.conda#8821ec1c8fcdc9e1d291d7b9f6e9968a https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2#ebb5f5f7dc4f1a3780ef7ea7738db08c https://conda.anaconda.org/conda-forge/linux-64/chardet-5.2.0-py312h7900ff3_1.conda#af3980cc4690716a5510c8a08cb06238 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a @@ -93,7 +93,7 @@ https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5 https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py312h7900ff3_3.conda#1b90835ae26b9b8250b302649359a989 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa -https://conda.anaconda.org/conda-forge/noarch/filelock-3.14.0-pyhd8ed1ab_0.conda#831d85ae0acfba31b8efd0f0d07da736 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.1-pyhd8ed1ab_0.conda#ca4149866d80007713ff47906bba8cb3 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.6.0-pyhff2d567_0.conda#ad6af3f92e71b1579ac2362b6cf29105 https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda#c0cc1420498b17414d8617d0b9f506ca @@ -108,7 +108,7 @@ https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2# https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py312h98912ed_0.conda#6ff0b9582da2d4a74a1f9ae1f9ce2af6 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 -https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#248f521b64ce055e7feae3105e7abeb8 +https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.2-pyhd8ed1ab_0.conda#6f6cf28bf8e021933869bae3f84b8fc9 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 @@ -130,7 +130,7 @@ https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c7 https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda#0b5293a157c2b5cd513dd1b03d8d3aae https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a -https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a +https://conda.anaconda.org/conda-forge/noarch/zipp-3.19.2-pyhd8ed1ab_0.conda#49808e59df5535116f6878b2a820d6f4 https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py312hf06ca03_0.conda#56b0ca764ce23cc54f3f7e2a7b970f6d https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.3-py312h9a8786e_0.conda#f01930d0afe8ac5f8062c98e6b8d1fd0 @@ -145,7 +145,7 @@ https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda#d https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py312hdcec9eb_0.conda#425bb325f970e57a047ac57c4586489d https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.0-hb784bbd_2.conda#b0683c229de4c4c676450d24ff87538c +https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.1-hb784bbd_0.conda#c38c5246d064ef16eba065d93c46f1c6 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.6.1-pyhd8ed1ab_0.conda#1815c7974568079cf384f012de5ea1b7 https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.2-pyhd8ed1ab_0.conda#0f3f49c22c7ef3a1195fa61dad3c43be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c @@ -163,10 +163,10 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.co https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda#ba9f7f0ec4f2a18de3e7bce67c4a431e https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h8572e83_4.conda#52c9e25ee0a32485a102eeecdb7eef52 -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py312h085067d_1.conda#b121b9dd4935f63959eb35cc6c36973b +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312h085067d_0.conda#864d9e92f012bcc49650428d5343c98a https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_0.conda#2cc61ba1dd53f0806247333f1294e058 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py312h8572e83_0.conda#12c6a831ef734f0b2dd4caff514cbb7f -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.5.2-pyhd8ed1ab_0.conda#1a57a819915e1c169b74933720b138f2 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.6.0-pyhd8ed1ab_0.conda#edf709967712b2953ab4189256266adc https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda#ba68cb5105760379432cebc82b45af40 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py312h98912ed_1.conda#d5273d1e67b7b3a871a0a711c6532a2f From 1983ac3240c1c705dcfa4f27c1ccaf175b79e7c6 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 17 Jun 2024 21:06:18 +0100 Subject: [PATCH 327/583] chore: update pre-commit hooks (#486) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.4.8 → v0.4.9](https://github.com/astral-sh/ruff-pre-commit/compare/v0.4.8...v0.4.9) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index adeef626..f63ceb74 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -51,7 +51,7 @@ repos: - id: trailing-whitespace - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.4.8" + rev: "v0.4.9" hooks: - id: ruff types: [file, python] From 9b31ccce96ccc5efe9edabbd9590a66c844d625e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Jun 2024 09:53:17 +0100 Subject: [PATCH 328/583] Bump scitools/workflows in the dependencies group (#487) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2024.06.1 to 2024.06.2 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2024.06.1...2024.06.2) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 9962edc6..b2a80905 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.06.1 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.06.2 diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 18ee36fa..3933350f 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.06.1 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.06.2 secrets: inherit From b30d84cc1bda2f4015daaa1be3d810d195125fa4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 20 Jun 2024 10:59:06 +0100 Subject: [PATCH 329/583] Bump scitools/workflows in the dependencies group (#491) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2024.06.2 to 2024.06.3 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2024.06.2...2024.06.3) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index b2a80905..6007a71d 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.06.2 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.06.3 diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 3933350f..e84f6ef8 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.06.2 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.06.3 secrets: inherit From e6e3d5ac1d90b8851b9625a2b3df2af1a14f168f Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Sat, 22 Jun 2024 22:31:14 +0100 Subject: [PATCH 330/583] Updated environment lockfiles (#493) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 30 ++++++++++++------------ requirements/locks/py311-linux-64.lock | 30 ++++++++++++------------ requirements/locks/py312-linux-64.lock | 32 +++++++++++++------------- 3 files changed, 46 insertions(+), 46 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 195743f4..a112b602 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -4,12 +4,12 @@ @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.6.2-hbcca054_0.conda#847c3c2905cc467cea52c24f9cfa8080 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_4.conda#02d936b69ab683fc6755c236996f8b51 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda#b80f2f396ca2c28b8c14c437a4ed1e74 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-4_cp310.conda#26322ec5d7712c3ded99dd656142b8ce https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_9.conda#0d0ad0fdee21442a479005ef5f3a02e8 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_11.conda#8c462ced2af33648195dc9459f331f31 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_9.conda#f23bc130bc3d2bbd9d9d6892609546ea +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_11.conda#0b3b218a596bb4c3854cc9ee799f94e5 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.28.1-hd590300_0.conda#dcde58ff9a1f30b0037a2315d1846d1f https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 @@ -18,11 +18,11 @@ https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.20-hd590300_0.conda https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-h3d2ce59_9.conda#2f2a59af95aed6024368b8dbaf9591d8 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-h3d2ce59_11.conda#c485da4fdb454539f852a90ae06e9bb7 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_9.conda#2075df518ef9d09f1ae209c83116e808 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_11.conda#eaa8ea74083fb4a78ae19e431e556003 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc @@ -47,7 +47,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_9.conda#90a8b0f4e0d4a333f54d0c33b882ee9a +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_11.conda#4c3e460d6acf8e43e4ce8bf405187eb7 https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae @@ -76,7 +76,7 @@ https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-h8ee46fc_0.conda#077b6e8ad6a3ddb741fce2496dd01bec https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 -https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.3.0-pyhd8ed1ab_0.conda#f42f433e48d6a715c0978b44a9219406 +https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.4.0-pyhd8ed1ab_0.conda#9f736cae0da3365a4dbbfbadfac9f3a2 https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda#5e4c0743c70186509d1412e03c2d8dfa https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hc6cd4ac_1.conda#1f95722c94f00b69af69a066c7433714 @@ -93,7 +93,7 @@ https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5 https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py310hff52083_3.conda#c159dcd29bbd80b187b1c5d5f73cc971 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa -https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.1-pyhd8ed1ab_0.conda#ca4149866d80007713ff47906bba8cb3 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.3-pyhd8ed1ab_0.conda#eae681f708bd52d9d172bd5c9af23898 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.6.0-pyhff2d567_0.conda#ad6af3f92e71b1579ac2362b6cf29105 https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda#c0cc1420498b17414d8617d0b9f506ca @@ -119,7 +119,7 @@ https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py310h2372a71_0.conda#b631b889b0b4bc2fca7b8b977ca484b2 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py310h2372a71_1.conda#bb010e368de4940771368bc3dc4c63e7 -https://conda.anaconda.org/conda-forge/noarch/setuptools-70.0.0-pyhd8ed1ab_0.conda#c8ddb4f34a208df4dd42509a0f6a1c89 +https://conda.anaconda.org/conda-forge/noarch/setuptools-70.1.0-pyhd8ed1ab_0.conda#258e66f95f814d51ada2a1fe9274039b https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 @@ -137,7 +137,7 @@ https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py310h2fee648_0.cond https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.3-py310hc51659f_0.conda#4be0e55c0f724d339be3d4dc9dfc5752 https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.0-py310hc51659f_0.conda#0b6cd00b80d5af0bbfa261606ed56a18 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda#0896606848b2dc5cebdf111b6543aa04 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.2.0-pyha770c72_0.conda#e1d9f6dc77209defc283bdf61588e968 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda#4b31699e0ec5de64d5896e580389c9a1 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca @@ -151,11 +151,11 @@ https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.6.1-pyhd8ed1ab_0.c https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.2-pyhd8ed1ab_0.conda#0f3f49c22c7ef3a1195fa61dad3c43be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_0.conda#92cdb6fe54b78739ad70637e4f0deb07 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.2-pyhd8ed1ab_0.conda#7d36e7a485ea2f5829408813bdbbfb38 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.1.0-hd8ed1ab_0.conda#6ef2b72d291b39e479d7694efa2b2b98 +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.2.0-hd8ed1ab_0.conda#3de0087b2b86443cfae650dea6ecec6f https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h135f659_114.conda#a908e463c710bd6b10a9eaa89fdf003c https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py310hb13e2d6_0.conda#6593de64c935768b6bad3e19b3e978be https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py310hf666db6_7.conda#577d33875077f2ae50b13dd56e4d90f8 @@ -167,7 +167,7 @@ https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310hd41b1e2_4.co https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310h261611a_0.conda#5c0e2cd80ceab2ac5201459cc016b88b https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_0.conda#2cc61ba1dd53f0806247333f1294e058 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py310hd41b1e2_0.conda#60ee50b1968f802f2a487ba36d4cce0d -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.6.0-pyhd8ed1ab_0.conda#edf709967712b2953ab4189256266adc +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.6.2-pyhd8ed1ab_0.conda#048ca0ec2cd1f3995d2d36dec0efd99a https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda#ba68cb5105760379432cebc82b45af40 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py310h2372a71_1.conda#dfcf64f67961eb9686676f96fdb4b4d1 @@ -178,11 +178,11 @@ https://conda.anaconda.org/conda-forge/noarch/tox-4.15.1-pyhd8ed1ab_0.conda#d010 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py310h261611a_5.conda#643414a9f73226b2a6a43a4800734d3b https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.35.0-he84ddb8_0.conda#2d01dfbe537478e7a1a495b9639edd45 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py310hef631a5_2.conda#b3fa3fc2a0fa8b53b913c94297b12e27 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py310h3aa39b3_102.conda#d29d8f13fb26c2851588384a13e3ef4b +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.1-nompi_py310hf3005e6_101.conda#409736627835306542425033e2a41dd2 https://conda.anaconda.org/conda-forge/noarch/nox-2024.4.15-pyhff2d567_0.conda#600c0de12125f473d8099c0b3e6f88d4 https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda#724bc4489c1174fc8e3233b0624fa51f https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py310hf9f9076_1.conda#dd5c97834c12bae782b35261e0bea7b4 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.0-py310h261611a_2.conda#12e644f3669afe291b68d01b9eab0106 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.1-py310h261611a_0.conda#b577e192825e3037fb39498f3603df05 https://conda.anaconda.org/conda-forge/noarch/iris-3.9.0-pyha770c72_0.conda#efaf150eb009f04efa58f1401c767192 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda#611a35a27914fac3aa37611a6fe40bb5 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.6-pyhd8ed1ab_0.conda#d7e4954df0d3aea2eacc7835ad12671d diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index bd751b68..0a22d621 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -4,12 +4,12 @@ @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.6.2-hbcca054_0.conda#847c3c2905cc467cea52c24f9cfa8080 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_4.conda#02d936b69ab683fc6755c236996f8b51 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda#b80f2f396ca2c28b8c14c437a4ed1e74 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-4_cp311.conda#d786502c97404c94d7d58d258a445a65 https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_9.conda#0d0ad0fdee21442a479005ef5f3a02e8 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_11.conda#8c462ced2af33648195dc9459f331f31 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_9.conda#f23bc130bc3d2bbd9d9d6892609546ea +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_11.conda#0b3b218a596bb4c3854cc9ee799f94e5 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.28.1-hd590300_0.conda#dcde58ff9a1f30b0037a2315d1846d1f https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 @@ -18,11 +18,11 @@ https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.20-hd590300_0.conda https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-h3d2ce59_9.conda#2f2a59af95aed6024368b8dbaf9591d8 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-h3d2ce59_11.conda#c485da4fdb454539f852a90ae06e9bb7 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_9.conda#2075df518ef9d09f1ae209c83116e808 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_11.conda#eaa8ea74083fb4a78ae19e431e556003 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc @@ -47,7 +47,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_9.conda#90a8b0f4e0d4a333f54d0c33b882ee9a +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_11.conda#4c3e460d6acf8e43e4ce8bf405187eb7 https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae @@ -76,7 +76,7 @@ https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-h8ee46fc_0.conda#077b6e8ad6a3ddb741fce2496dd01bec https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 -https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.3.0-pyhd8ed1ab_0.conda#f42f433e48d6a715c0978b44a9219406 +https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.4.0-pyhd8ed1ab_0.conda#9f736cae0da3365a4dbbfbadfac9f3a2 https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda#5e4c0743c70186509d1412e03c2d8dfa https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hb755f60_1.conda#cce9e7c3f1c307f2a5fb08a2922d6164 @@ -93,7 +93,7 @@ https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5 https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py311h38be061_3.conda#1c33f55e5cdcc2a2b973c432b5225bfe https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa -https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.1-pyhd8ed1ab_0.conda#ca4149866d80007713ff47906bba8cb3 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.3-pyhd8ed1ab_0.conda#eae681f708bd52d9d172bd5c9af23898 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.6.0-pyhff2d567_0.conda#ad6af3f92e71b1579ac2362b6cf29105 https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda#c0cc1420498b17414d8617d0b9f506ca @@ -119,7 +119,7 @@ https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py311h459d7ec_0.conda#60b5332b3989fda37884b92c7afd6a91 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py311h459d7ec_1.conda#52719a74ad130de8fb5d047dc91f247a -https://conda.anaconda.org/conda-forge/noarch/setuptools-70.0.0-pyhd8ed1ab_0.conda#c8ddb4f34a208df4dd42509a0f6a1c89 +https://conda.anaconda.org/conda-forge/noarch/setuptools-70.1.0-pyhd8ed1ab_0.conda#258e66f95f814d51ada2a1fe9274039b https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 @@ -136,7 +136,7 @@ https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py311hb3a22ac_0.cond https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.3-py311h331c9d8_0.conda#543dd05fd661e4e9c9deb3b37093d6a2 https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.0-py311h331c9d8_0.conda#2daef6c4ce74840c8d7a431498be83e9 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda#0896606848b2dc5cebdf111b6543aa04 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.2.0-pyha770c72_0.conda#e1d9f6dc77209defc283bdf61588e968 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda#4b31699e0ec5de64d5896e580389c9a1 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca @@ -150,11 +150,11 @@ https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.6.1-pyhd8ed1ab_0.c https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.2-pyhd8ed1ab_0.conda#0f3f49c22c7ef3a1195fa61dad3c43be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_0.conda#92cdb6fe54b78739ad70637e4f0deb07 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.2-pyhd8ed1ab_0.conda#7d36e7a485ea2f5829408813bdbbfb38 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.1.0-hd8ed1ab_0.conda#6ef2b72d291b39e479d7694efa2b2b98 +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.2.0-hd8ed1ab_0.conda#3de0087b2b86443cfae650dea6ecec6f https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h135f659_114.conda#a908e463c710bd6b10a9eaa89fdf003c https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.conda#a502d7aad449a1206efb366d6a12c52d https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311hc21b84f_7.conda#0d55a70a8c2160a7f3cbe9fcfd87f82a @@ -166,7 +166,7 @@ https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311h9547e67_4.co https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h18e1886_0.conda#0eb1e6c7d10285ec12e01f73d1896d93 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_0.conda#2cc61ba1dd53f0806247333f1294e058 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py311h9547e67_0.conda#74ad0ae64f1ef565e27eda87fa749e84 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.6.0-pyhd8ed1ab_0.conda#edf709967712b2953ab4189256266adc +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.6.2-pyhd8ed1ab_0.conda#048ca0ec2cd1f3995d2d36dec0efd99a https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda#ba68cb5105760379432cebc82b45af40 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py311h459d7ec_1.conda#45b8d355bbcdd27588c2d266bcfdff84 @@ -177,11 +177,11 @@ https://conda.anaconda.org/conda-forge/noarch/tox-4.15.1-pyhd8ed1ab_0.conda#d010 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h18e1886_5.conda#6cd3facab7a79de14abb1a86a2d830fa https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.35.0-he84ddb8_0.conda#2d01dfbe537478e7a1a495b9639edd45 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py311ha4ca890_2.conda#0848e2084cbb57014f232f48568561af -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py311h74118c1_102.conda#5f98c1d56c5853270c7876bb1000a631 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.1-nompi_py311h25b3b55_101.conda#936afeddfa3704eb834d0887b0838826 https://conda.anaconda.org/conda-forge/noarch/nox-2024.4.15-pyhff2d567_0.conda#600c0de12125f473d8099c0b3e6f88d4 https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda#724bc4489c1174fc8e3233b0624fa51f https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py311h14de704_1.conda#27e5956e552c6e71f56cb1ec042617a8 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.0-py311h18e1886_2.conda#80163cbd7ecb799e8556130e443d7d16 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.1-py311h18e1886_0.conda#a54e480c5d7adceb6a84a16a29498449 https://conda.anaconda.org/conda-forge/noarch/iris-3.9.0-pyha770c72_0.conda#efaf150eb009f04efa58f1401c767192 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda#611a35a27914fac3aa37611a6fe40bb5 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.6-pyhd8ed1ab_0.conda#d7e4954df0d3aea2eacc7835ad12671d diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 9ad70c8a..293ec530 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -4,12 +4,12 @@ @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.6.2-hbcca054_0.conda#847c3c2905cc467cea52c24f9cfa8080 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_4.conda#02d936b69ab683fc6755c236996f8b51 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda#b80f2f396ca2c28b8c14c437a4ed1e74 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-4_cp312.conda#dccc2d142812964fcc6abdc97b672dff https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_9.conda#0d0ad0fdee21442a479005ef5f3a02e8 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_11.conda#8c462ced2af33648195dc9459f331f31 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_9.conda#f23bc130bc3d2bbd9d9d6892609546ea +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_11.conda#0b3b218a596bb4c3854cc9ee799f94e5 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.28.1-hd590300_0.conda#dcde58ff9a1f30b0037a2315d1846d1f https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 @@ -18,11 +18,11 @@ https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.20-hd590300_0.conda https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-h3d2ce59_9.conda#2f2a59af95aed6024368b8dbaf9591d8 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-h3d2ce59_11.conda#c485da4fdb454539f852a90ae06e9bb7 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_9.conda#2075df518ef9d09f1ae209c83116e808 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_11.conda#eaa8ea74083fb4a78ae19e431e556003 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc @@ -47,7 +47,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_9.conda#90a8b0f4e0d4a333f54d0c33b882ee9a +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_11.conda#4c3e460d6acf8e43e4ce8bf405187eb7 https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae @@ -70,13 +70,13 @@ https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd9 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_h413a1c8_0.conda#a356024784da6dfd4683dc5ecf45b155 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda#66f03896ffbe1a110ffda05c7a856504 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-hc051c1a_1.conda#340278ded8b0dc3a73f3660bbb0adbc6 -https://conda.anaconda.org/conda-forge/linux-64/python-3.12.3-hab00c5b_0_cpython.conda#2540b74d304f71d3e89c81209db4db84 +https://conda.anaconda.org/conda-forge/linux-64/python-3.12.4-h194c7f8_0_cpython.conda#d73490214f536cccb5819e9873048c92 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.46.0-h6d4b2fc_0.conda#77ea8dff5cf8550cc8f5629a6af56323 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-h8ee46fc_0.conda#077b6e8ad6a3ddb741fce2496dd01bec https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 -https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.3.0-pyhd8ed1ab_0.conda#f42f433e48d6a715c0978b44a9219406 +https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.4.0-pyhd8ed1ab_0.conda#9f736cae0da3365a4dbbfbadfac9f3a2 https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda#5e4c0743c70186509d1412e03c2d8dfa https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h30efb56_1.conda#45801a89533d3336a365284d93298e36 @@ -93,7 +93,7 @@ https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5 https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py312h7900ff3_3.conda#1b90835ae26b9b8250b302649359a989 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa -https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.1-pyhd8ed1ab_0.conda#ca4149866d80007713ff47906bba8cb3 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.3-pyhd8ed1ab_0.conda#eae681f708bd52d9d172bd5c9af23898 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.6.0-pyhff2d567_0.conda#ad6af3f92e71b1579ac2362b6cf29105 https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda#c0cc1420498b17414d8617d0b9f506ca @@ -119,7 +119,7 @@ https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py312h98912ed_0.conda#a8f9739e0ada2320148c92ddd608864f https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py312h98912ed_1.conda#e3fd78d8d490af1d84763b9fe3f2e552 -https://conda.anaconda.org/conda-forge/noarch/setuptools-70.0.0-pyhd8ed1ab_0.conda#c8ddb4f34a208df4dd42509a0f6a1c89 +https://conda.anaconda.org/conda-forge/noarch/setuptools-70.1.0-pyhd8ed1ab_0.conda#258e66f95f814d51ada2a1fe9274039b https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 @@ -136,7 +136,7 @@ https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py312hf06ca03_0.cond https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.3-py312h9a8786e_0.conda#f01930d0afe8ac5f8062c98e6b8d1fd0 https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.0-py312h9a8786e_0.conda#8490346e9d5efd7a6869582aa0c95b25 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda#0896606848b2dc5cebdf111b6543aa04 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.2.0-pyha770c72_0.conda#e1d9f6dc77209defc283bdf61588e968 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda#4b31699e0ec5de64d5896e580389c9a1 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca @@ -150,11 +150,11 @@ https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.6.1-pyhd8ed1ab_0.c https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.2-pyhd8ed1ab_0.conda#0f3f49c22c7ef3a1195fa61dad3c43be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_0.conda#92cdb6fe54b78739ad70637e4f0deb07 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.2-pyhd8ed1ab_0.conda#7d36e7a485ea2f5829408813bdbbfb38 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.1.0-hd8ed1ab_0.conda#6ef2b72d291b39e479d7694efa2b2b98 +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.2.0-hd8ed1ab_0.conda#3de0087b2b86443cfae650dea6ecec6f https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h135f659_114.conda#a908e463c710bd6b10a9eaa89fdf003c https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda#d8285bea2a350f63fab23bf460221f3f https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py312h5d05ceb_7.conda#b53ddc25da04839cc62b0b158a7ecb38 @@ -166,7 +166,7 @@ https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h8572e83_4.co https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312h085067d_0.conda#864d9e92f012bcc49650428d5343c98a https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_0.conda#2cc61ba1dd53f0806247333f1294e058 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py312h8572e83_0.conda#12c6a831ef734f0b2dd4caff514cbb7f -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.6.0-pyhd8ed1ab_0.conda#edf709967712b2953ab4189256266adc +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.6.2-pyhd8ed1ab_0.conda#048ca0ec2cd1f3995d2d36dec0efd99a https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda#ba68cb5105760379432cebc82b45af40 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py312h98912ed_1.conda#d5273d1e67b7b3a871a0a711c6532a2f @@ -177,11 +177,11 @@ https://conda.anaconda.org/conda-forge/noarch/tox-4.15.1-pyhd8ed1ab_0.conda#d010 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py312h085067d_5.conda#b40cdf87aee69ccf162022579cb99afb https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.35.0-he84ddb8_0.conda#2d01dfbe537478e7a1a495b9639edd45 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py312h20ab3a6_2.conda#fbfe798f83f0d66410903ad8f40d5283 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py312h39d4375_102.conda#2c0df33e745d3bd509f76217b8c79096 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.1-nompi_py312h1ef7fb6_101.conda#c67cc8e3a34c5cb8920c79918112e96f https://conda.anaconda.org/conda-forge/noarch/nox-2024.4.15-pyhff2d567_0.conda#600c0de12125f473d8099c0b3e6f88d4 https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda#724bc4489c1174fc8e3233b0624fa51f https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py312h1d6d2e6_1.conda#6392d3ce615ab0f32bc39b07f8f4c300 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.0-py312h085067d_2.conda#158bdc63daac04bcc2991f6e4a5fec5e +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.1-py312h085067d_0.conda#5f96475aa30552797f8099ccee24feaa https://conda.anaconda.org/conda-forge/noarch/iris-3.9.0-pyha770c72_0.conda#efaf150eb009f04efa58f1401c767192 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda#611a35a27914fac3aa37611a6fe40bb5 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.6-pyhd8ed1ab_0.conda#d7e4954df0d3aea2eacc7835ad12671d From df5471f85f3cc52d15e88562567fb35a784d20ce Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 25 Jun 2024 10:13:54 +0100 Subject: [PATCH 331/583] chore: update pre-commit hooks (#494) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.4.9 → v0.4.10](https://github.com/astral-sh/ruff-pre-commit/compare/v0.4.9...v0.4.10) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f63ceb74..713a378b 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -51,7 +51,7 @@ repos: - id: trailing-whitespace - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.4.9" + rev: "v0.4.10" hooks: - id: ruff types: [file, python] From f26971d12f7c2d8ae129ecae4439227c168905c9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 26 Jun 2024 09:41:04 +0100 Subject: [PATCH 332/583] Bump scitools/workflows in the dependencies group across 1 directory (#495) Bumps the dependencies group with 1 update in the / directory: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2024.06.3 to 2024.06.5 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2024.06.3...2024.06.5) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 6007a71d..f92b2207 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.06.3 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.06.5 diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index e84f6ef8..b6bca79b 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.06.3 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.06.5 secrets: inherit From 0e49a55fd00e97f50a3ca6eef28360487a4d3cb6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Jul 2024 13:07:36 +0100 Subject: [PATCH 333/583] Bump scitools/workflows in the dependencies group across 1 directory (#505) Bumps the dependencies group with 1 update in the / directory: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2024.06.5 to 2024.07.1 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2024.06.5...2024.07.1) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index f92b2207..b7f80edb 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.06.5 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.07.1 diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index b6bca79b..609fdc3c 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.06.5 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.07.1 secrets: inherit From 6b97a7e5b3bce9d543848972055e39104a0f4e7b Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 15 Jul 2024 07:05:22 -0400 Subject: [PATCH 334/583] Remove MyPy redundant-expr error (#497) * Remove MyPy redundant-expr error * Added redundant-expr to ignore list --- pyproject.toml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index b08943c7..653661f7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -109,7 +109,7 @@ ignore = [ ignore_missing_imports = true warn_unused_configs = true warn_unreachable = true -enable_error_code = ["ignore-without-code", "redundant-expr", "truthy-bool"] +enable_error_code = ["ignore-without-code", "truthy-bool"] exclude = [ 'noxfile\.py', 'docs/conf\.py' @@ -138,6 +138,8 @@ xfail_strict = "True" ignore = [ # https://learn.scientific-python.org/development/guides/style/#MY102 "MY102", # MyPy show_error_codes deprecated + # https://learn.scientific-python.org/development/guides/style/#MY105 + "MY105", # MyPy redundant-expr deprecated # https://learn.scientific-python.org/development/guides/style/#PC170 "PC170", # Uses PyGrep hooks # https://learn.scientific-python.org/development/guides/style/#PC180 From 79a6b05f6fe634d38aa45c7cdc8a05b8f7c03c9b Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Wed, 17 Jul 2024 09:46:09 +0100 Subject: [PATCH 335/583] Eccodes 2v36 (#504) * Changed key name for eccodes 2v36. * Set scanningMode instead of bitwise keys, readonly in eccodes >= 2.36. * Update eccodes version requirements. Add release note. --- docs/ref/release_notes.rst | 10 ++++++++++ requirements/py310.yml | 2 +- requirements/py311.yml | 2 +- requirements/py312.yml | 2 +- src/iris_grib/_load_convert.py | 18 +++++++++--------- src/iris_grib/_save_rules.py | 16 +++++++++------- src/iris_grib/message.py | 2 ++ .../load_convert/test_forecast_period_coord.py | 6 +++--- .../test_product_definition_template_0.py | 2 +- .../test_product_definition_template_15.py | 2 +- .../test_product_definition_template_40.py | 2 +- .../test_statistical_forecast_period_coord.py | 2 +- .../tests/unit/save_rules/__init__.py | 10 ++++++++++ .../test_grid_definition_template_0.py | 6 ++---- .../test_grid_definition_template_1.py | 6 ++---- .../test_grid_definition_template_10.py | 6 ++---- .../test_grid_definition_template_12.py | 6 ++---- .../test_grid_definition_template_140.py | 6 ++---- .../test_grid_definition_template_20.py | 6 ++---- .../test_grid_definition_template_30.py | 6 ++---- .../test_grid_definition_template_4.py | 6 ++---- .../test_grid_definition_template_5.py | 6 ++---- 22 files changed, 68 insertions(+), 62 deletions(-) diff --git a/docs/ref/release_notes.rst b/docs/ref/release_notes.rst index 3a2049d7..b27c08b4 100644 --- a/docs/ref/release_notes.rst +++ b/docs/ref/release_notes.rst @@ -30,6 +30,7 @@ Features grid definition template 20 - polar stereographic. `(PR#405) `_ + Documentation ^^^^^^^^^^^^^ * `@pp-mo `_ reworked the main docs page to : @@ -43,6 +44,15 @@ Dependencies * `@bjlittle `_ migrated to ``pytest``. `(PR#420) `_ +* `@pp-mo `_ enabled support for + `eccodes v2.36 `_. + Eccodes v2.36 has implemented some backwards incompatible changes : + The ``indicatorOfUnitOfTimeRange`` key was removed, to be replaced with + ``indicatorOfUnitForForecastTime`` (but only in GRIB v2 messages only, not GRIB 1); + and the ``iScansPositively`` and ``jScansPositively`` keys became read-only. + The resulting changes mean **we now only support eccodes >=2.33**. + `(PR#504) `_ + What's new in iris-grib v0.19.1 ------------------------------- diff --git a/requirements/py310.yml b/requirements/py310.yml index cebb4883..ad16eaf9 100644 --- a/requirements/py310.yml +++ b/requirements/py310.yml @@ -13,7 +13,7 @@ dependencies: # Core dependencies. - iris>=3.0.2 - python-eccodes>=1.6.1 - - eccodes>=2.32.1 + - eccodes>=2.33 # Optional dependencies. - mo_pack diff --git a/requirements/py311.yml b/requirements/py311.yml index 00df5e42..9913a3d6 100644 --- a/requirements/py311.yml +++ b/requirements/py311.yml @@ -13,7 +13,7 @@ dependencies: # Core dependencies. - iris>=3.0.2 - python-eccodes>=1.6.1 - - eccodes>=2.32.1 + - eccodes>=2.33 # Optional dependencies. - mo_pack diff --git a/requirements/py312.yml b/requirements/py312.yml index 5fbd4be4..be7e9980 100644 --- a/requirements/py312.yml +++ b/requirements/py312.yml @@ -13,7 +13,7 @@ dependencies: # Core dependencies. - iris>=3.0.2 - python-eccodes>=1.6.1 - - eccodes>=2.32.1 + - eccodes>=2.33 # Optional dependencies. - mo_pack diff --git a/src/iris_grib/_load_convert.py b/src/iris_grib/_load_convert.py index 9b30eaf2..504a1f70 100644 --- a/src/iris_grib/_load_convert.py +++ b/src/iris_grib/_load_convert.py @@ -1530,14 +1530,14 @@ def ensure_surface_air_pressure_name(cube): return {"standard_name": "surface_air_pressure"} -def time_range_unit(indicatorOfUnitOfTimeRange): +def time_range_unit(indicatorOfUnitForForecastTime): """ Translate the time range indicator to an equivalent :class:`cf_units.Unit`. Args: - * indicatorOfUnitOfTimeRange: + * indicatorOfUnitForForecastTime: Message section 4, octet 18. Returns: @@ -1545,11 +1545,11 @@ def time_range_unit(indicatorOfUnitOfTimeRange): """ try: - unit = Unit(_TIME_RANGE_UNITS[indicatorOfUnitOfTimeRange]) + unit = Unit(_TIME_RANGE_UNITS[indicatorOfUnitForForecastTime]) except (KeyError, ValueError): msg = ( "Product definition section 4 contains unsupported " - "time range unit [{}]".format(indicatorOfUnitOfTimeRange) + "time range unit [{}]".format(indicatorOfUnitForForecastTime) ) raise TranslationError(msg) return unit @@ -1755,13 +1755,13 @@ def vertical_coords(section, metadata): metadata["aux_coords_and_dims"].append((coord, None)) -def forecast_period_coord(indicatorOfUnitOfTimeRange, forecastTime): +def forecast_period_coord(indicatorOfUnitForForecastTime, forecastTime): """ Create the forecast period coordinate. Args: - * indicatorOfUnitOfTimeRange: + * indicatorOfUnitForForecastTime: Message section 4, octets 18. * forecastTime: @@ -1772,7 +1772,7 @@ def forecast_period_coord(indicatorOfUnitOfTimeRange, forecastTime): """ # Determine the forecast period and associated units. - unit = time_range_unit(indicatorOfUnitOfTimeRange) + unit = time_range_unit(indicatorOfUnitForForecastTime) point = unit.convert(forecastTime, "hours") # Create the forecast period scalar coordinate. coord = DimCoord(point, standard_name="forecast_period", units="hours") @@ -1816,7 +1816,7 @@ def statistical_forecast_period_coord(section, frt_coord): if options.support_hindcast_values: # Apply the hindcast fix. forecast_time = _hindcast_fix(forecast_time) - forecast_units = time_range_unit(section["indicatorOfUnitOfTimeRange"]) + forecast_units = time_range_unit(section["indicatorOfUnitForForecastTime"]) forecast_seconds = forecast_units.convert(forecast_time, "seconds") start_time_delta = timedelta(seconds=forecast_seconds) @@ -1958,7 +1958,7 @@ def time_coords(section, metadata, rt_coord): # Calculate the forecast period coordinate. fp_coord = forecast_period_coord( - section["indicatorOfUnitOfTimeRange"], forecast_time + section["indicatorOfUnitForForecastTime"], forecast_time ) # Add the forecast period coordinate to the metadata aux coords. metadata["aux_coords_and_dims"].append((fp_coord, None)) diff --git a/src/iris_grib/_save_rules.py b/src/iris_grib/_save_rules.py index cb5ae00b..62293a25 100644 --- a/src/iris_grib/_save_rules.py +++ b/src/iris_grib/_save_rules.py @@ -230,12 +230,14 @@ def dx_dy(x_coord, y_coord, grib): def scanning_mode_flags(x_coord, y_coord, grib): - eccodes.codes_set_long( - grib, "iScansPositively", int(x_coord.points[1] - x_coord.points[0] > 0) - ) - eccodes.codes_set_long( - grib, "jScansPositively", int(y_coord.points[1] - y_coord.points[0] > 0) - ) + x_positive = x_coord.points[1] - x_coord.points[0] > 0 + y_positive = y_coord.points[1] - y_coord.points[0] > 0 + scanningMode = 0 + if not x_positive: + scanningMode |= 0x80 # "bit 1" has negative sense : set=decreasing + if y_positive: + scanningMode |= 0x40 # "bit2" has positive sense : set=increasing + eccodes.codes_set_long(grib, "scanningMode", scanningMode) def horizontal_grid_common(cube, grib, xy=False): @@ -977,7 +979,7 @@ def set_forecast_time(cube, grib): else: _, _, fp, grib_time_code = _missing_forecast_period(cube) - eccodes.codes_set(grib, "indicatorOfUnitOfTimeRange", grib_time_code) + eccodes.codes_set(grib, "indicatorOfUnitForForecastTime", grib_time_code) eccodes.codes_set(grib, "forecastTime", fp) diff --git a/src/iris_grib/message.py b/src/iris_grib/message.py index 6f5ad948..0351ba6b 100644 --- a/src/iris_grib/message.py +++ b/src/iris_grib/message.py @@ -25,6 +25,8 @@ "longitude": "longitudes", "latitudes": "latitude", "longitudes": "longitude", + # Support older form of key which used to exist before eccodes 2v36 + "indicatorOfUnitForForecastTime": "indicatorOfUnitOfTimeRange", } diff --git a/src/iris_grib/tests/unit/load_convert/test_forecast_period_coord.py b/src/iris_grib/tests/unit/load_convert/test_forecast_period_coord.py index 75de7fac..29ef27c4 100644 --- a/src/iris_grib/tests/unit/load_convert/test_forecast_period_coord.py +++ b/src/iris_grib/tests/unit/load_convert/test_forecast_period_coord.py @@ -18,7 +18,7 @@ class Test(tests.IrisGribTest): def test(self): - # (indicatorOfUnitOfTimeRange, forecastTime, expected-hours) + # (indicatorOfUnitForForecastTime, forecastTime, expected-hours) times = [ (0, 60, 1), # minutes (1, 2, 2), # hours @@ -29,8 +29,8 @@ def test(self): (13, 3600, 1), ] # seconds - for indicatorOfUnitOfTimeRange, forecastTime, hours in times: - coord = forecast_period_coord(indicatorOfUnitOfTimeRange, forecastTime) + for indicatorOfUnitForForecastTime, forecastTime, hours in times: + coord = forecast_period_coord(indicatorOfUnitForForecastTime, forecastTime) self.assertIsInstance(coord, DimCoord) self.assertEqual(coord.standard_name, "forecast_period") self.assertEqual(coord.units, "hours") diff --git a/src/iris_grib/tests/unit/load_convert/test_product_definition_template_0.py b/src/iris_grib/tests/unit/load_convert/test_product_definition_template_0.py index 0fa8a04a..451995b8 100644 --- a/src/iris_grib/tests/unit/load_convert/test_product_definition_template_0.py +++ b/src/iris_grib/tests/unit/load_convert/test_product_definition_template_0.py @@ -28,7 +28,7 @@ def section_4(): return { "hoursAfterDataCutoff": MDI, "minutesAfterDataCutoff": MDI, - "indicatorOfUnitOfTimeRange": 0, # minutes + "indicatorOfUnitForForecastTime": 0, # minutes "forecastTime": 360, "NV": 0, "typeOfFirstFixedSurface": 103, diff --git a/src/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py b/src/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py index 8e81457e..970cb37b 100644 --- a/src/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py +++ b/src/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py @@ -32,7 +32,7 @@ def section_4_sample(): "productDefinitionTemplateNumber": 15, "hoursAfterDataCutoff": MDI, "minutesAfterDataCutoff": MDI, - "indicatorOfUnitOfTimeRange": 0, # minutes + "indicatorOfUnitForForecastTime": 0, # minutes "forecastTime": 360, "NV": 0, "typeOfFirstFixedSurface": 103, diff --git a/src/iris_grib/tests/unit/load_convert/test_product_definition_template_40.py b/src/iris_grib/tests/unit/load_convert/test_product_definition_template_40.py index a7c0b3b2..9a7cc456 100644 --- a/src/iris_grib/tests/unit/load_convert/test_product_definition_template_40.py +++ b/src/iris_grib/tests/unit/load_convert/test_product_definition_template_40.py @@ -23,7 +23,7 @@ def setUp(self): "hoursAfterDataCutoff": _MDI, "minutesAfterDataCutoff": _MDI, "constituentType": 1, - "indicatorOfUnitOfTimeRange": 0, # minutes + "indicatorOfUnitForForecastTime": 0, # minutes "startStep": 360, "NV": 0, "typeOfFirstFixedSurface": 103, diff --git a/src/iris_grib/tests/unit/load_convert/test_statistical_forecast_period_coord.py b/src/iris_grib/tests/unit/load_convert/test_statistical_forecast_period_coord.py index b825edc6..21fae48c 100644 --- a/src/iris_grib/tests/unit/load_convert/test_statistical_forecast_period_coord.py +++ b/src/iris_grib/tests/unit/load_convert/test_statistical_forecast_period_coord.py @@ -39,7 +39,7 @@ def setUp(self): self.section["minuteOfEndOfOverallTimeInterval"] = 0 self.section["secondOfEndOfOverallTimeInterval"] = 0 self.section["forecastTime"] = mock.Mock() - self.section["indicatorOfUnitOfTimeRange"] = mock.Mock() + self.section["indicatorOfUnitForForecastTime"] = mock.Mock() def test_basic(self): coord = statistical_forecast_period_coord(self.section, self.frt_coord) diff --git a/src/iris_grib/tests/unit/save_rules/__init__.py b/src/iris_grib/tests/unit/save_rules/__init__.py index e64ef6fc..cc2c8b99 100644 --- a/src/iris_grib/tests/unit/save_rules/__init__.py +++ b/src/iris_grib/tests/unit/save_rules/__init__.py @@ -84,3 +84,13 @@ def _check_key(self, name, value): self.assertEqual(0, 1, msg_fmt.format(name, value, "((UNSET))")) else: self.assertArrayEqual(found, value, msg_fmt.format(name, value, found)) + + def _check_scanmode(self, x_direction, y_direction): + expected = 0 + if x_direction < 0: + # "bit 1" set if x scans negatively + expected |= 0x80 + if y_direction >= 0: + # "bit 2" set if y does *not* scan negatively + expected |= 0x40 + self._check_key("scanningMode", expected) diff --git a/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_0.py b/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_0.py index 1c238183..24921e52 100644 --- a/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_0.py +++ b/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_0.py @@ -63,14 +63,12 @@ def test__grid_points(self): def test__scanmode(self): grid_definition_template_0(self.test_cube, self.mock_grib) - self._check_key("iScansPositively", 1) - self._check_key("jScansPositively", 1) + self._check_scanmode(+1, +1) def test__scanmode_reverse(self): test_cube = self._make_test_cube(x_points=np.arange(7, 0, -1)) grid_definition_template_0(test_cube, self.mock_grib) - self._check_key("iScansPositively", 0) - self._check_key("jScansPositively", 1) + self._check_scanmode(-1, +1) if __name__ == "__main__": diff --git a/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_1.py b/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_1.py index ee0bb6f5..7d87cd85 100644 --- a/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_1.py +++ b/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_1.py @@ -85,14 +85,12 @@ def test__grid_points(self): def test__scanmode(self): grid_definition_template_1(self.test_cube, self.mock_grib) - self._check_key("iScansPositively", 1) - self._check_key("jScansPositively", 1) + self._check_scanmode(+1, +1) def test__scanmode_reverse(self): test_cube = self._make_test_cube(x_points=np.arange(7, 0, -1)) grid_definition_template_1(test_cube, self.mock_grib) - self._check_key("iScansPositively", 0) - self._check_key("jScansPositively", 1) + self._check_scanmode(-1, +1) def test__rotated_pole(self): cs = RotatedGeogCS( diff --git a/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py b/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py index 521f6001..20488a1f 100644 --- a/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py +++ b/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py @@ -72,16 +72,14 @@ def test__template_specifics(self): def test__scanmode(self): grid_definition_template_10(self.mercator_test_cube, self.mock_grib) - self._check_key("iScansPositively", 1) - self._check_key("jScansPositively", 1) + self._check_scanmode(+1, +1) def test__scanmode_reverse(self): test_cube = self._make_test_cube( x_points=np.arange(7e6, 0, -1e6), coord_units="m" ) grid_definition_template_10(test_cube, self.mock_grib) - self._check_key("iScansPositively", 0) - self._check_key("jScansPositively", 1) + self._check_scanmode(-1, +1) if __name__ == "__main__": diff --git a/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_12.py b/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_12.py index 3b841e54..3b438b1b 100644 --- a/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_12.py +++ b/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_12.py @@ -126,14 +126,12 @@ def test__scale_factor(self): def test__scanmode(self): grid_definition_template_12(self.test_cube, self.mock_grib) - self._check_key("iScansPositively", 1) - self._check_key("jScansPositively", 1) + self._check_scanmode(+1, +1) def test__scanmode_reverse(self): test_cube = self._make_test_cube(x_points=np.arange(7, 0, -1)) grid_definition_template_12(test_cube, self.mock_grib) - self._check_key("iScansPositively", 0) - self._check_key("jScansPositively", 1) + self._check_scanmode(-1, +1) if __name__ == "__main__": diff --git a/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_140.py b/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_140.py index dcc7bb41..878d2f16 100644 --- a/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_140.py +++ b/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_140.py @@ -101,14 +101,12 @@ def test__template_specifics(self): def test__scanmode(self): grid_definition_template(self.test_cube, self.mock_grib) - self._check_key("iScansPositively", 1) - self._check_key("jScansPositively", 1) + self._check_scanmode(+1, +1) def test__scanmode_reverse(self): test_cube = self._make_test_cube(x_points=np.arange(7e6, 0, -1e6)) grid_definition_template(test_cube, self.mock_grib) - self._check_key("iScansPositively", 0) - self._check_key("jScansPositively", 1) + self._check_scanmode(-1, +1) def __fail_false_easting_northing(self, false_easting, false_northing): cs = self._default_coord_system( diff --git a/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_20.py b/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_20.py index fb7db975..7907f8c7 100644 --- a/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_20.py +++ b/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_20.py @@ -74,16 +74,14 @@ def test__template_specifics(self): def test__scanmode(self): grid_definition_template_20(self.stereo_test_cube, self.mock_grib) - self._check_key("iScansPositively", 1) - self._check_key("jScansPositively", 1) + self._check_scanmode(+1, +1) def test__scanmode_reverse(self): stereo_test_cube = self._make_test_cube( x_points=np.arange(7e6, 0, -1e6), coord_units="m" ) grid_definition_template_20(stereo_test_cube, self.mock_grib) - self._check_key("iScansPositively", 0) - self._check_key("jScansPositively", 1) + self._check_scanmode(-1, +1) def test_projection_centre(self): grid_definition_template_20(self.stereo_test_cube, self.mock_grib) diff --git a/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_30.py b/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_30.py index 96a02b02..fb182904 100644 --- a/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_30.py +++ b/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_30.py @@ -103,14 +103,12 @@ def test__template_specifics(self): def test__scanmode(self): grid_definition_template_30(self.test_cube, self.mock_grib) - self._check_key("iScansPositively", 1) - self._check_key("jScansPositively", 1) + self._check_scanmode(+1, +1) def test__scanmode_reverse(self): test_cube = self._make_test_cube(x_points=np.arange(7e6, 0, -1e6)) grid_definition_template_30(test_cube, self.mock_grib) - self._check_key("iScansPositively", 0) - self._check_key("jScansPositively", 1) + self._check_scanmode(-1, +1) def test_projection_centre(self): grid_definition_template_30(self.test_cube, self.mock_grib) diff --git a/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_4.py b/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_4.py index 8e4e1b80..d24604e9 100644 --- a/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_4.py +++ b/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_4.py @@ -64,14 +64,12 @@ def test__grid_points(self): def test__scanmode(self): grid_definition_template_4(self.test_cube, self.mock_grib) - self._check_key("iScansPositively", 1) - self._check_key("jScansPositively", 1) + self._check_scanmode(+1, +1) def test__scanmode_reverse(self): test_cube = self._make_test_cube(x_points=np.arange(7, 0, -1)) grid_definition_template_4(test_cube, self.mock_grib) - self._check_key("iScansPositively", 0) - self._check_key("jScansPositively", 1) + self._check_scanmode(-1, +1) if __name__ == "__main__": diff --git a/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_5.py b/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_5.py index be789823..aa19a7fc 100644 --- a/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_5.py +++ b/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_5.py @@ -78,14 +78,12 @@ def test__grid_shape(self): def test__scanmode(self): grid_definition_template_5(self.test_cube, self.mock_grib) - self._check_key("iScansPositively", 1) - self._check_key("jScansPositively", 1) + self._check_scanmode(+1, +1) def test__scanmode_reverse(self): test_cube = self._make_test_cube(y_points=[5.0, 2.0]) grid_definition_template_5(test_cube, self.mock_grib) - self._check_key("iScansPositively", 1) - self._check_key("jScansPositively", 0) + self._check_scanmode(+1, -1) def test__rotated_pole(self): cs = RotatedGeogCS( From 1ba6eca2e3dbf58cb27e4bcd769b0653186fac72 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Thu, 18 Jul 2024 00:47:08 +0100 Subject: [PATCH 336/583] Updated environment lockfiles (#499) Co-authored-by: Lockfile bot Co-authored-by: Patrick Peglar --- requirements/locks/py310-linux-64.lock | 87 ++++++++++++++------------ requirements/locks/py311-linux-64.lock | 87 ++++++++++++++------------ requirements/locks/py312-linux-64.lock | 87 ++++++++++++++------------ 3 files changed, 138 insertions(+), 123 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index a112b602..770bac99 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -3,32 +3,32 @@ # input_hash: d87fbf5e6b13b3bed3ae08420cfaea150d8e5ff6b469b3591861318a87b0a278 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.6.2-hbcca054_0.conda#847c3c2905cc467cea52c24f9cfa8080 +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.7.4-hbcca054_0.conda#23ab7665c5f63cfb9f1f6195256daac6 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda#b80f2f396ca2c28b8c14c437a4ed1e74 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-4_cp310.conda#26322ec5d7712c3ded99dd656142b8ce https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_11.conda#8c462ced2af33648195dc9459f331f31 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_0.conda#ae061a5ed5f05818acdf9adab72c146d https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_11.conda#0b3b218a596bb4c3854cc9ee799f94e5 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h77fa898_0.conda#ca0fad6a41ddaef54a153b78eccb5037 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.28.1-hd590300_0.conda#dcde58ff9a1f30b0037a2315d1846d1f +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.32.1-h4bc722e_0.conda#7ed005e0df2bd50406b110b48ac4587b https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.20-hd590300_0.conda#8e88f9389f1165d7c0936fe40d9a9a79 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-h3d2ce59_11.conda#c485da4fdb454539f852a90ae06e9bb7 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.1.0-hc5f4f2c_0.conda#6456c2620c990cd8dde2428a27ba0bc5 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_11.conda#eaa8ea74083fb4a78ae19e431e556003 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.1.0-hc0a3c3a_0.conda#1cb187a157136398ddbaae90713e2498 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4ab18f5_0.conda#a41fa0e391cc9e0d6b78ac69ca047a6c +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4ab18f5_1.conda#b1e9d076f14e8d776213fd5047b4c3d9 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a @@ -39,7 +39,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae -https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d +https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.2-hac33072_0.conda#621d814955342209dc8e7f87c41f1ba0 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f @@ -47,33 +47,34 @@ https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_11.conda#4c3e460d6acf8e43e4ce8bf405187eb7 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.1.0-h69a702a_0.conda#f4ca84fbd6d06b0a052fb2d5b96dde41 https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda#18aa975d2094c34aef978060ae7da7d8 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 -https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c +https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.16-hd590300_0.conda#151cba22b85a989c2d6ef9633ffee1e4 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 +https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 -https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.0-hdb0a2a9_1.conda#843bbb8ace1d64ac50d64639ff38b014 +https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-ha2e4443_0.conda#6b7dcc7349efd123d493d2dbe85a045f https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-h4ab18f5_1.conda#9653f1bf3766164d0e65fa723cabbc54 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 -https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-hc2324a3_1.conda#11d76bee958b1989bd1ac6ee7372ea6d +https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-hef167b5_0.conda#54fe76ab3d0189acaef95156874db7f9 https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda#39f910d205726805a958da408ca194ba https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb -https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_h413a1c8_0.conda#a356024784da6dfd4683dc5ecf45b155 +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_hac2b453_1.conda#ae05ece66d3924ac3d48b4aa3fa96cec https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda#66f03896ffbe1a110ffda05c7a856504 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-hc051c1a_1.conda#340278ded8b0dc3a73f3660bbb0adbc6 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-h4c95cb1_3.conda#0ac9aff6010a7751961c8e4b863a40e7 https://conda.anaconda.org/conda-forge/linux-64/python-3.10.14-hd12c33a_0_cpython.conda#2b4ba962994e8bd4be9ff5b64b75aff2 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.46.0-h6d4b2fc_0.conda#77ea8dff5cf8550cc8f5629a6af56323 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-h8ee46fc_0.conda#077b6e8ad6a3ddb741fce2496dd01bec +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-hb711507_1.conda#4a6d410296d7e39f00bacdee7df046e9 https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.4.0-pyhd8ed1ab_0.conda#9f736cae0da3365a4dbbfbadfac9f3a2 @@ -81,7 +82,7 @@ https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda#5e https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hc6cd4ac_1.conda#1f95722c94f00b69af69a066c7433714 https://conda.anaconda.org/conda-forge/noarch/cachetools-5.3.3-pyhd8ed1ab_0.conda#cd4c26c702a9bcdc70ff05b609ddacbe -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.6.2-pyhd8ed1ab_0.conda#8821ec1c8fcdc9e1d291d7b9f6e9968a +https://conda.anaconda.org/conda-forge/noarch/certifi-2024.7.4-pyhd8ed1ab_0.conda#24e7fd6ca65997938fff9e5ab6f653e4 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2#ebb5f5f7dc4f1a3780ef7ea7738db08c https://conda.anaconda.org/conda-forge/linux-64/chardet-5.2.0-py310hff52083_1.conda#a677136a83b823803d2f92045f885be2 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a @@ -93,9 +94,11 @@ https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5 https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py310hff52083_3.conda#c159dcd29bbd80b187b1c5d5f73cc971 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa -https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.3-pyhd8ed1ab_0.conda#eae681f708bd52d9d172bd5c9af23898 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.4-pyhd8ed1ab_0.conda#0e7e4388e9d5283e22b35a9443bdbcc9 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.6.0-pyhff2d567_0.conda#ad6af3f92e71b1579ac2362b6cf29105 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.6.1-pyhff2d567_0.conda#996bf792cdb8c0ac38ff54b9fde56841 +https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 +https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2#9f765cbfab6870c8435b9eefecd7a1f4 https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda#c0cc1420498b17414d8617d0b9f506ca https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 @@ -103,7 +106,7 @@ https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.4.0-pyhd8ed1ab_ https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py310hd41b1e2_1.conda#b8d67603d43b23ce7e988a5d81a7ab79 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-22_linux64_openblas.conda#1a2a0cd3153464fee6646f3dd6dad9b8 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.8.0-hca28451_0.conda#f21c27f076a07907e70c49bb57bd0f20 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.8.0-hca28451_1.conda#b8afb3e3cb3423cc445cf611ab95fdb0 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py310h2372a71_0.conda#f6703fa0214a00bf49d1bef6dc7672d0 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 @@ -119,7 +122,7 @@ https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py310h2372a71_0.conda#b631b889b0b4bc2fca7b8b977ca484b2 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py310h2372a71_1.conda#bb010e368de4940771368bc3dc4c63e7 -https://conda.anaconda.org/conda-forge/noarch/setuptools-70.1.0-pyhd8ed1ab_0.conda#258e66f95f814d51ada2a1fe9274039b +https://conda.anaconda.org/conda-forge/noarch/setuptools-70.3.0-pyhd8ed1ab_0.conda#693bb57e8f92120caa956898065f3627 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 @@ -134,54 +137,56 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_10 https://conda.anaconda.org/conda-forge/noarch/zipp-3.19.2-pyhd8ed1ab_0.conda#49808e59df5535116f6878b2a820d6f4 https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py310h2fee648_0.conda#45846a970e71ac98fd327da5d40a0a2c -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.3-py310hc51659f_0.conda#4be0e55c0f724d339be3d4dc9dfc5752 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.0-py310hc51659f_0.conda#0b6cd00b80d5af0bbfa261606ed56a18 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.0-py310h5b4e0ec_0.conda#a13d72c877b47870042897a0e667cd3a +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.1-py310h5b4e0ec_0.conda#2c5257cb35d1946f5e80a0cfd69ed7ec +https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.2.0-pyha770c72_0.conda#e1d9f6dc77209defc283bdf61588e968 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.0.0-pyha770c72_0.conda#3286556cdd99048d198f72c3f6f69103 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda#4b31699e0ec5de64d5896e580389c9a1 -https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca +https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-ha6d2627_1004.conda#df069bea331c8486ac21814969301c1f https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_openblas.conda#b083767b6c877e24ee597d93b87ab838 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda#dfe0528d0f1c16c1f7c528ea5536ab30 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py310hf73ecf8_0.conda#1de56cf017dfd02aa84093206a0141a8 +https://conda.anaconda.org/conda-forge/linux-64/pillow-10.4.0-py310hebfe307_0.conda#89d70dfe2d59edcefc3881be6bff33a6 https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.1-hb784bbd_0.conda#c38c5246d064ef16eba065d93c46f1c6 -https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.6.1-pyhd8ed1ab_0.conda#1815c7974568079cf384f012de5ea1b7 +https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.7.1-pyhd8ed1ab_0.conda#8e2946459d7f721f8e85b6db185d6338 https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.2-pyhd8ed1ab_0.conda#0f3f49c22c7ef3a1195fa61dad3c43be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_0.conda#92cdb6fe54b78739ad70637e4f0deb07 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.2-pyhd8ed1ab_0.conda#7d36e7a485ea2f5829408813bdbbfb38 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.3-pyhd8ed1ab_0.conda#284008712816c64c85bf2b7fa9f3b264 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 -https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.2.0-hd8ed1ab_0.conda#3de0087b2b86443cfae650dea6ecec6f +https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.0.0-hd8ed1ab_0.conda#5f8c8ebbe6413a7838cf6ecf14d5d31b https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h135f659_114.conda#a908e463c710bd6b10a9eaa89fdf003c https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py310hb13e2d6_0.conda#6593de64c935768b6bad3e19b3e978be https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py310hf666db6_7.conda#577d33875077f2ae50b13dd56e4d90f8 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda#ba9f7f0ec4f2a18de3e7bce67c4a431e +https://conda.anaconda.org/conda-forge/noarch/tox-4.16.0-pyhd8ed1ab_0.conda#d97aec372c67e16eb447adc90fbac149 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310hd41b1e2_4.conda#35e87277fba9944b8a975113538bb5df +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.22.0-py310hab88d88_1.conda#f997c26e250f125a1a297589a95ae79d https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310h261611a_0.conda#5c0e2cd80ceab2ac5201459cc016b88b -https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_0.conda#2cc61ba1dd53f0806247333f1294e058 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py310hd41b1e2_0.conda#60ee50b1968f802f2a487ba36d4cce0d -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.6.2-pyhd8ed1ab_0.conda#048ca0ec2cd1f3995d2d36dec0efd99a -https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda#ba68cb5105760379432cebc82b45af40 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.7.0-pyhd8ed1ab_0.conda#755e47653ae38f5c50f1435af756e844 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.0-pyhd8ed1ab_0.conda#f80cc5989f445f23b1622d6c455896d9 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py310h2372a71_1.conda#dfcf64f67961eb9686676f96fdb4b4d1 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.1-py310h93e2701_0.conda#9a697144b2f3adc88ada6b6201b379c4 +https://conda.anaconda.org/conda-forge/noarch/nox-2024.4.15-pyhff2d567_0.conda#600c0de12125f473d8099c0b3e6f88d4 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.0-py310h93e2701_1.conda#c6b2a8134aa49940afe552f69bdef957 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.1.0-hd8ed1ab_0.conda#7ed7b077f6c6ebcb5fc66f23985df487 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py310hec8f0c1_1.conda#baf9a1e8de78418d988232388dc309dc -https://conda.anaconda.org/conda-forge/noarch/tox-4.15.1-pyhd8ed1ab_0.conda#d010e869d9708130ab2206267eac3e92 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py310h019a838_2.conda#562a95785a35adacf472e22b8f00dd81 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py310h261611a_5.conda#643414a9f73226b2a6a43a4800734d3b -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.35.0-he84ddb8_0.conda#2d01dfbe537478e7a1a495b9639edd45 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py310hef631a5_2.conda#b3fa3fc2a0fa8b53b913c94297b12e27 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.36.0-h762793a_0.conda#6d8c86d0368625b6503d696db70ea041 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.1-py310h0b1de36_0.conda#5341c2c1a7f0a9d196f8070bfa4e16ba https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.1-nompi_py310hf3005e6_101.conda#409736627835306542425033e2a41dd2 -https://conda.anaconda.org/conda-forge/noarch/nox-2024.4.15-pyhff2d567_0.conda#600c0de12125f473d8099c0b3e6f88d4 https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda#724bc4489c1174fc8e3233b0624fa51f +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py310hf9f9076_1.conda#dd5c97834c12bae782b35261e0bea7b4 +https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_0.conda#2cc61ba1dd53f0806247333f1294e058 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.1-py310h261611a_0.conda#b577e192825e3037fb39498f3603df05 https://conda.anaconda.org/conda-forge/noarch/iris-3.9.0-pyha770c72_0.conda#efaf150eb009f04efa58f1401c767192 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda#611a35a27914fac3aa37611a6fe40bb5 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 0a22d621..4ab2346b 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -3,32 +3,32 @@ # input_hash: 60217b599fcbadcfc8eab3310daf72f9d8a52a7ee931c9b04e0861ad9ae71313 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.6.2-hbcca054_0.conda#847c3c2905cc467cea52c24f9cfa8080 +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.7.4-hbcca054_0.conda#23ab7665c5f63cfb9f1f6195256daac6 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda#b80f2f396ca2c28b8c14c437a4ed1e74 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-4_cp311.conda#d786502c97404c94d7d58d258a445a65 https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_11.conda#8c462ced2af33648195dc9459f331f31 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_0.conda#ae061a5ed5f05818acdf9adab72c146d https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_11.conda#0b3b218a596bb4c3854cc9ee799f94e5 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h77fa898_0.conda#ca0fad6a41ddaef54a153b78eccb5037 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.28.1-hd590300_0.conda#dcde58ff9a1f30b0037a2315d1846d1f +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.32.1-h4bc722e_0.conda#7ed005e0df2bd50406b110b48ac4587b https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.20-hd590300_0.conda#8e88f9389f1165d7c0936fe40d9a9a79 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-h3d2ce59_11.conda#c485da4fdb454539f852a90ae06e9bb7 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.1.0-hc5f4f2c_0.conda#6456c2620c990cd8dde2428a27ba0bc5 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_11.conda#eaa8ea74083fb4a78ae19e431e556003 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.1.0-hc0a3c3a_0.conda#1cb187a157136398ddbaae90713e2498 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4ab18f5_0.conda#a41fa0e391cc9e0d6b78ac69ca047a6c +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4ab18f5_1.conda#b1e9d076f14e8d776213fd5047b4c3d9 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a @@ -39,7 +39,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae -https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d +https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.2-hac33072_0.conda#621d814955342209dc8e7f87c41f1ba0 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f @@ -47,33 +47,34 @@ https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_11.conda#4c3e460d6acf8e43e4ce8bf405187eb7 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.1.0-h69a702a_0.conda#f4ca84fbd6d06b0a052fb2d5b96dde41 https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda#18aa975d2094c34aef978060ae7da7d8 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 -https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c +https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.16-hd590300_0.conda#151cba22b85a989c2d6ef9633ffee1e4 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 +https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 -https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.0-hdb0a2a9_1.conda#843bbb8ace1d64ac50d64639ff38b014 +https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-ha2e4443_0.conda#6b7dcc7349efd123d493d2dbe85a045f https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-h4ab18f5_1.conda#9653f1bf3766164d0e65fa723cabbc54 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 -https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-hc2324a3_1.conda#11d76bee958b1989bd1ac6ee7372ea6d +https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-hef167b5_0.conda#54fe76ab3d0189acaef95156874db7f9 https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda#39f910d205726805a958da408ca194ba https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb -https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_h413a1c8_0.conda#a356024784da6dfd4683dc5ecf45b155 +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_hac2b453_1.conda#ae05ece66d3924ac3d48b4aa3fa96cec https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda#66f03896ffbe1a110ffda05c7a856504 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-hc051c1a_1.conda#340278ded8b0dc3a73f3660bbb0adbc6 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-h4c95cb1_3.conda#0ac9aff6010a7751961c8e4b863a40e7 https://conda.anaconda.org/conda-forge/linux-64/python-3.11.9-hb806964_0_cpython.conda#ac68acfa8b558ed406c75e98d3428d7b https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.46.0-h6d4b2fc_0.conda#77ea8dff5cf8550cc8f5629a6af56323 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-h8ee46fc_0.conda#077b6e8ad6a3ddb741fce2496dd01bec +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-hb711507_1.conda#4a6d410296d7e39f00bacdee7df046e9 https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.4.0-pyhd8ed1ab_0.conda#9f736cae0da3365a4dbbfbadfac9f3a2 @@ -81,7 +82,7 @@ https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda#5e https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hb755f60_1.conda#cce9e7c3f1c307f2a5fb08a2922d6164 https://conda.anaconda.org/conda-forge/noarch/cachetools-5.3.3-pyhd8ed1ab_0.conda#cd4c26c702a9bcdc70ff05b609ddacbe -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.6.2-pyhd8ed1ab_0.conda#8821ec1c8fcdc9e1d291d7b9f6e9968a +https://conda.anaconda.org/conda-forge/noarch/certifi-2024.7.4-pyhd8ed1ab_0.conda#24e7fd6ca65997938fff9e5ab6f653e4 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2#ebb5f5f7dc4f1a3780ef7ea7738db08c https://conda.anaconda.org/conda-forge/linux-64/chardet-5.2.0-py311h38be061_1.conda#b8cfb13de4dbe349a41800644391de6a https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a @@ -93,9 +94,11 @@ https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5 https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py311h38be061_3.conda#1c33f55e5cdcc2a2b973c432b5225bfe https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa -https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.3-pyhd8ed1ab_0.conda#eae681f708bd52d9d172bd5c9af23898 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.4-pyhd8ed1ab_0.conda#0e7e4388e9d5283e22b35a9443bdbcc9 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.6.0-pyhff2d567_0.conda#ad6af3f92e71b1579ac2362b6cf29105 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.6.1-pyhff2d567_0.conda#996bf792cdb8c0ac38ff54b9fde56841 +https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 +https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2#9f765cbfab6870c8435b9eefecd7a1f4 https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda#c0cc1420498b17414d8617d0b9f506ca https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 @@ -103,7 +106,7 @@ https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.4.0-pyhd8ed1ab_ https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py311h9547e67_1.conda#2c65bdf442b0d37aad080c8a4e0d452f https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-22_linux64_openblas.conda#1a2a0cd3153464fee6646f3dd6dad9b8 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.8.0-hca28451_0.conda#f21c27f076a07907e70c49bb57bd0f20 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.8.0-hca28451_1.conda#b8afb3e3cb3423cc445cf611ab95fdb0 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py311h459d7ec_0.conda#a322b4185121935c871d201ae00ac143 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 @@ -119,7 +122,7 @@ https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py311h459d7ec_0.conda#60b5332b3989fda37884b92c7afd6a91 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py311h459d7ec_1.conda#52719a74ad130de8fb5d047dc91f247a -https://conda.anaconda.org/conda-forge/noarch/setuptools-70.1.0-pyhd8ed1ab_0.conda#258e66f95f814d51ada2a1fe9274039b +https://conda.anaconda.org/conda-forge/noarch/setuptools-70.3.0-pyhd8ed1ab_0.conda#693bb57e8f92120caa956898065f3627 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 @@ -133,54 +136,56 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_10 https://conda.anaconda.org/conda-forge/noarch/zipp-3.19.2-pyhd8ed1ab_0.conda#49808e59df5535116f6878b2a820d6f4 https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py311hb3a22ac_0.conda#b3469563ac5e808b0cd92810d0697043 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.3-py311h331c9d8_0.conda#543dd05fd661e4e9c9deb3b37093d6a2 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.0-py311h331c9d8_0.conda#2daef6c4ce74840c8d7a431498be83e9 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.0-py311h61187de_0.conda#88eac8e0e69d850b235824f87e5cfd1b +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.1-py311h61187de_0.conda#bcbe6c9db1c25900c3808b8974e1bb90 +https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.2.0-pyha770c72_0.conda#e1d9f6dc77209defc283bdf61588e968 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.0.0-pyha770c72_0.conda#3286556cdd99048d198f72c3f6f69103 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda#4b31699e0ec5de64d5896e580389c9a1 -https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca +https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-ha6d2627_1004.conda#df069bea331c8486ac21814969301c1f https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_openblas.conda#b083767b6c877e24ee597d93b87ab838 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda#dfe0528d0f1c16c1f7c528ea5536ab30 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py311h18e6fac_0.conda#6c520a9d36c9d7270988c7a6c360d6d4 +https://conda.anaconda.org/conda-forge/linux-64/pillow-10.4.0-py311h82a398c_0.conda#b9e0ac1f5564b6572a6d702c04207be8 https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.1-hb784bbd_0.conda#c38c5246d064ef16eba065d93c46f1c6 -https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.6.1-pyhd8ed1ab_0.conda#1815c7974568079cf384f012de5ea1b7 +https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.7.1-pyhd8ed1ab_0.conda#8e2946459d7f721f8e85b6db185d6338 https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.2-pyhd8ed1ab_0.conda#0f3f49c22c7ef3a1195fa61dad3c43be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_0.conda#92cdb6fe54b78739ad70637e4f0deb07 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.2-pyhd8ed1ab_0.conda#7d36e7a485ea2f5829408813bdbbfb38 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.3-pyhd8ed1ab_0.conda#284008712816c64c85bf2b7fa9f3b264 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 -https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.2.0-hd8ed1ab_0.conda#3de0087b2b86443cfae650dea6ecec6f +https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.0.0-hd8ed1ab_0.conda#5f8c8ebbe6413a7838cf6ecf14d5d31b https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h135f659_114.conda#a908e463c710bd6b10a9eaa89fdf003c https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.conda#a502d7aad449a1206efb366d6a12c52d https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311hc21b84f_7.conda#0d55a70a8c2160a7f3cbe9fcfd87f82a https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda#ba9f7f0ec4f2a18de3e7bce67c4a431e +https://conda.anaconda.org/conda-forge/noarch/tox-4.16.0-pyhd8ed1ab_0.conda#d97aec372c67e16eb447adc90fbac149 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311h9547e67_4.conda#586da7df03b68640de14dc3e8bcbf76f +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.22.0-py311hb6f056b_1.conda#72e84ef20a510ab5fca1f3d80a16e9e2 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h18e1886_0.conda#0eb1e6c7d10285ec12e01f73d1896d93 -https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_0.conda#2cc61ba1dd53f0806247333f1294e058 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py311h9547e67_0.conda#74ad0ae64f1ef565e27eda87fa749e84 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.6.2-pyhd8ed1ab_0.conda#048ca0ec2cd1f3995d2d36dec0efd99a -https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda#ba68cb5105760379432cebc82b45af40 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.7.0-pyhd8ed1ab_0.conda#755e47653ae38f5c50f1435af756e844 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.0-pyhd8ed1ab_0.conda#f80cc5989f445f23b1622d6c455896d9 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py311h459d7ec_1.conda#45b8d355bbcdd27588c2d266bcfdff84 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.1-py311h517d4fd_0.conda#764b0e055f59dbd7d114d32b8c6e55e6 +https://conda.anaconda.org/conda-forge/noarch/nox-2024.4.15-pyhff2d567_0.conda#600c0de12125f473d8099c0b3e6f88d4 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.0-py311h517d4fd_1.conda#481fd009b2d863f526f60ca19cb7880b https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.1.0-hd8ed1ab_0.conda#7ed7b077f6c6ebcb5fc66f23985df487 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py311h0bed3d6_1.conda#6fb2f733ef405b4bfb4a6a362703457e -https://conda.anaconda.org/conda-forge/noarch/tox-4.15.1-pyhd8ed1ab_0.conda#d010e869d9708130ab2206267eac3e92 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py311h5925939_2.conda#eaebac048378462f21e0f8737cf05496 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h18e1886_5.conda#6cd3facab7a79de14abb1a86a2d830fa -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.35.0-he84ddb8_0.conda#2d01dfbe537478e7a1a495b9639edd45 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py311ha4ca890_2.conda#0848e2084cbb57014f232f48568561af +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.36.0-h762793a_0.conda#6d8c86d0368625b6503d696db70ea041 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.1-py311hffb96ce_0.conda#990bc73fa802e6387f683d0fbc6b7bd4 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.1-nompi_py311h25b3b55_101.conda#936afeddfa3704eb834d0887b0838826 -https://conda.anaconda.org/conda-forge/noarch/nox-2024.4.15-pyhff2d567_0.conda#600c0de12125f473d8099c0b3e6f88d4 https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda#724bc4489c1174fc8e3233b0624fa51f +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py311h14de704_1.conda#27e5956e552c6e71f56cb1ec042617a8 +https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_0.conda#2cc61ba1dd53f0806247333f1294e058 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.1-py311h18e1886_0.conda#a54e480c5d7adceb6a84a16a29498449 https://conda.anaconda.org/conda-forge/noarch/iris-3.9.0-pyha770c72_0.conda#efaf150eb009f04efa58f1401c767192 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda#611a35a27914fac3aa37611a6fe40bb5 diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 293ec530..a6e6db28 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -3,32 +3,32 @@ # input_hash: aceb4f254f1d98ca662bbb35c77671dac9f062d5c373bd67050bbb9b99171617 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.6.2-hbcca054_0.conda#847c3c2905cc467cea52c24f9cfa8080 +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.7.4-hbcca054_0.conda#23ab7665c5f63cfb9f1f6195256daac6 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda#b80f2f396ca2c28b8c14c437a4ed1e74 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-4_cp312.conda#dccc2d142812964fcc6abdc97b672dff https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_11.conda#8c462ced2af33648195dc9459f331f31 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_0.conda#ae061a5ed5f05818acdf9adab72c146d https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_11.conda#0b3b218a596bb4c3854cc9ee799f94e5 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h77fa898_0.conda#ca0fad6a41ddaef54a153b78eccb5037 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.28.1-hd590300_0.conda#dcde58ff9a1f30b0037a2315d1846d1f +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.32.1-h4bc722e_0.conda#7ed005e0df2bd50406b110b48ac4587b https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.20-hd590300_0.conda#8e88f9389f1165d7c0936fe40d9a9a79 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-h3d2ce59_11.conda#c485da4fdb454539f852a90ae06e9bb7 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.1.0-hc5f4f2c_0.conda#6456c2620c990cd8dde2428a27ba0bc5 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_11.conda#eaa8ea74083fb4a78ae19e431e556003 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.1.0-hc0a3c3a_0.conda#1cb187a157136398ddbaae90713e2498 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4ab18f5_0.conda#a41fa0e391cc9e0d6b78ac69ca047a6c +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4ab18f5_1.conda#b1e9d076f14e8d776213fd5047b4c3d9 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a @@ -39,7 +39,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae -https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d +https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.2-hac33072_0.conda#621d814955342209dc8e7f87c41f1ba0 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f @@ -47,33 +47,34 @@ https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_11.conda#4c3e460d6acf8e43e4ce8bf405187eb7 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.1.0-h69a702a_0.conda#f4ca84fbd6d06b0a052fb2d5b96dde41 https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda#18aa975d2094c34aef978060ae7da7d8 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 -https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c +https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.16-hd590300_0.conda#151cba22b85a989c2d6ef9633ffee1e4 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 +https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 -https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.0-hdb0a2a9_1.conda#843bbb8ace1d64ac50d64639ff38b014 +https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-ha2e4443_0.conda#6b7dcc7349efd123d493d2dbe85a045f https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-h4ab18f5_1.conda#9653f1bf3766164d0e65fa723cabbc54 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 -https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-hc2324a3_1.conda#11d76bee958b1989bd1ac6ee7372ea6d +https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-hef167b5_0.conda#54fe76ab3d0189acaef95156874db7f9 https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda#39f910d205726805a958da408ca194ba https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb -https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_h413a1c8_0.conda#a356024784da6dfd4683dc5ecf45b155 +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_hac2b453_1.conda#ae05ece66d3924ac3d48b4aa3fa96cec https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda#66f03896ffbe1a110ffda05c7a856504 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-hc051c1a_1.conda#340278ded8b0dc3a73f3660bbb0adbc6 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-h4c95cb1_3.conda#0ac9aff6010a7751961c8e4b863a40e7 https://conda.anaconda.org/conda-forge/linux-64/python-3.12.4-h194c7f8_0_cpython.conda#d73490214f536cccb5819e9873048c92 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.46.0-h6d4b2fc_0.conda#77ea8dff5cf8550cc8f5629a6af56323 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-h8ee46fc_0.conda#077b6e8ad6a3ddb741fce2496dd01bec +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-hb711507_1.conda#4a6d410296d7e39f00bacdee7df046e9 https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.4.0-pyhd8ed1ab_0.conda#9f736cae0da3365a4dbbfbadfac9f3a2 @@ -81,7 +82,7 @@ https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda#5e https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h30efb56_1.conda#45801a89533d3336a365284d93298e36 https://conda.anaconda.org/conda-forge/noarch/cachetools-5.3.3-pyhd8ed1ab_0.conda#cd4c26c702a9bcdc70ff05b609ddacbe -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.6.2-pyhd8ed1ab_0.conda#8821ec1c8fcdc9e1d291d7b9f6e9968a +https://conda.anaconda.org/conda-forge/noarch/certifi-2024.7.4-pyhd8ed1ab_0.conda#24e7fd6ca65997938fff9e5ab6f653e4 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2#ebb5f5f7dc4f1a3780ef7ea7738db08c https://conda.anaconda.org/conda-forge/linux-64/chardet-5.2.0-py312h7900ff3_1.conda#af3980cc4690716a5510c8a08cb06238 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a @@ -93,9 +94,11 @@ https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5 https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py312h7900ff3_3.conda#1b90835ae26b9b8250b302649359a989 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa -https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.3-pyhd8ed1ab_0.conda#eae681f708bd52d9d172bd5c9af23898 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.4-pyhd8ed1ab_0.conda#0e7e4388e9d5283e22b35a9443bdbcc9 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.6.0-pyhff2d567_0.conda#ad6af3f92e71b1579ac2362b6cf29105 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.6.1-pyhff2d567_0.conda#996bf792cdb8c0ac38ff54b9fde56841 +https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 +https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2#9f765cbfab6870c8435b9eefecd7a1f4 https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda#c0cc1420498b17414d8617d0b9f506ca https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 @@ -103,7 +106,7 @@ https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.4.0-pyhd8ed1ab_ https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py312h8572e83_1.conda#c1e71f2bc05d8e8e033aefac2c490d05 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-22_linux64_openblas.conda#1a2a0cd3153464fee6646f3dd6dad9b8 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.8.0-hca28451_0.conda#f21c27f076a07907e70c49bb57bd0f20 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.8.0-hca28451_1.conda#b8afb3e3cb3423cc445cf611ab95fdb0 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py312h98912ed_0.conda#6ff0b9582da2d4a74a1f9ae1f9ce2af6 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 @@ -119,7 +122,7 @@ https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py312h98912ed_0.conda#a8f9739e0ada2320148c92ddd608864f https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py312h98912ed_1.conda#e3fd78d8d490af1d84763b9fe3f2e552 -https://conda.anaconda.org/conda-forge/noarch/setuptools-70.1.0-pyhd8ed1ab_0.conda#258e66f95f814d51ada2a1fe9274039b +https://conda.anaconda.org/conda-forge/noarch/setuptools-70.3.0-pyhd8ed1ab_0.conda#693bb57e8f92120caa956898065f3627 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 @@ -133,54 +136,56 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_10 https://conda.anaconda.org/conda-forge/noarch/zipp-3.19.2-pyhd8ed1ab_0.conda#49808e59df5535116f6878b2a820d6f4 https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py312hf06ca03_0.conda#56b0ca764ce23cc54f3f7e2a7b970f6d -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.3-py312h9a8786e_0.conda#f01930d0afe8ac5f8062c98e6b8d1fd0 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.0-py312h9a8786e_0.conda#8490346e9d5efd7a6869582aa0c95b25 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.0-py312h41a817b_0.conda#66c68c204a3eaabc3b4221f1c4bcebbe +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.1-py312h41a817b_0.conda#da921c56bcf69a8b97216ecec0cc4015 +https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.2.0-pyha770c72_0.conda#e1d9f6dc77209defc283bdf61588e968 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.0.0-pyha770c72_0.conda#3286556cdd99048d198f72c3f6f69103 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda#4b31699e0ec5de64d5896e580389c9a1 -https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca +https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-ha6d2627_1004.conda#df069bea331c8486ac21814969301c1f https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_openblas.conda#b083767b6c877e24ee597d93b87ab838 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda#dfe0528d0f1c16c1f7c528ea5536ab30 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py312hdcec9eb_0.conda#425bb325f970e57a047ac57c4586489d +https://conda.anaconda.org/conda-forge/linux-64/pillow-10.4.0-py312h287a98d_0.conda#59ea71eed98aee0bebbbdd3b118167c7 https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.1-hb784bbd_0.conda#c38c5246d064ef16eba065d93c46f1c6 -https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.6.1-pyhd8ed1ab_0.conda#1815c7974568079cf384f012de5ea1b7 +https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.7.1-pyhd8ed1ab_0.conda#8e2946459d7f721f8e85b6db185d6338 https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.2-pyhd8ed1ab_0.conda#0f3f49c22c7ef3a1195fa61dad3c43be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_0.conda#92cdb6fe54b78739ad70637e4f0deb07 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.2-pyhd8ed1ab_0.conda#7d36e7a485ea2f5829408813bdbbfb38 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.3-pyhd8ed1ab_0.conda#284008712816c64c85bf2b7fa9f3b264 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 -https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.2.0-hd8ed1ab_0.conda#3de0087b2b86443cfae650dea6ecec6f +https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.0.0-hd8ed1ab_0.conda#5f8c8ebbe6413a7838cf6ecf14d5d31b https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h135f659_114.conda#a908e463c710bd6b10a9eaa89fdf003c https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda#d8285bea2a350f63fab23bf460221f3f https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py312h5d05ceb_7.conda#b53ddc25da04839cc62b0b158a7ecb38 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda#ba9f7f0ec4f2a18de3e7bce67c4a431e +https://conda.anaconda.org/conda-forge/noarch/tox-4.16.0-pyhd8ed1ab_0.conda#d97aec372c67e16eb447adc90fbac149 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h8572e83_4.conda#52c9e25ee0a32485a102eeecdb7eef52 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.22.0-py312h5b18bf6_1.conda#27fe79bbc4dd3767be554fb171df362c https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312h085067d_0.conda#864d9e92f012bcc49650428d5343c98a -https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_0.conda#2cc61ba1dd53f0806247333f1294e058 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py312h8572e83_0.conda#12c6a831ef734f0b2dd4caff514cbb7f -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.6.2-pyhd8ed1ab_0.conda#048ca0ec2cd1f3995d2d36dec0efd99a -https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda#ba68cb5105760379432cebc82b45af40 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.7.0-pyhd8ed1ab_0.conda#755e47653ae38f5c50f1435af756e844 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.0-pyhd8ed1ab_0.conda#f80cc5989f445f23b1622d6c455896d9 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py312h98912ed_1.conda#d5273d1e67b7b3a871a0a711c6532a2f -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.1-py312hc2bc53b_0.conda#864b2399a9c998e17d1a9a4e0c601285 +https://conda.anaconda.org/conda-forge/noarch/nox-2024.4.15-pyhff2d567_0.conda#600c0de12125f473d8099c0b3e6f88d4 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.0-py312hc2bc53b_1.conda#eae80145f63aa04a02dda456d4883b46 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.1.0-hd8ed1ab_0.conda#7ed7b077f6c6ebcb5fc66f23985df487 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py312ha5b4d35_1.conda#1248b799f811d8ea215de88f53ae7ffc -https://conda.anaconda.org/conda-forge/noarch/tox-4.15.1-pyhd8ed1ab_0.conda#d010e869d9708130ab2206267eac3e92 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py312h8413631_2.conda#d5e52d9b72a86920926ca5fd8fec7394 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py312h085067d_5.conda#b40cdf87aee69ccf162022579cb99afb -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.35.0-he84ddb8_0.conda#2d01dfbe537478e7a1a495b9639edd45 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py312h20ab3a6_2.conda#fbfe798f83f0d66410903ad8f40d5283 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.36.0-h762793a_0.conda#6d8c86d0368625b6503d696db70ea041 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.1-py312h9201f00_0.conda#e1dc3a7d999666f5c58cbb391940e235 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.1-nompi_py312h1ef7fb6_101.conda#c67cc8e3a34c5cb8920c79918112e96f -https://conda.anaconda.org/conda-forge/noarch/nox-2024.4.15-pyhff2d567_0.conda#600c0de12125f473d8099c0b3e6f88d4 https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda#724bc4489c1174fc8e3233b0624fa51f +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py312h1d6d2e6_1.conda#6392d3ce615ab0f32bc39b07f8f4c300 +https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_0.conda#2cc61ba1dd53f0806247333f1294e058 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.1-py312h085067d_0.conda#5f96475aa30552797f8099ccee24feaa https://conda.anaconda.org/conda-forge/noarch/iris-3.9.0-pyha770c72_0.conda#efaf150eb009f04efa58f1401c767192 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda#611a35a27914fac3aa37611a6fe40bb5 From 4f1877f29edf2e8952a5fb765de4149cdf06dde6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 18 Jul 2024 01:03:38 +0100 Subject: [PATCH 337/583] Bump scitools/workflows in the dependencies group (#506) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2024.07.1 to 2024.07.2 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2024.07.1...2024.07.2) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Patrick Peglar --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index b7f80edb..fe8d6a04 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.07.1 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.07.2 diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 609fdc3c..08167bd7 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.07.1 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.07.2 secrets: inherit From 305fb7f08c1b545072f29f2f384fbb0717042fcf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 18 Jul 2024 09:42:26 +0100 Subject: [PATCH 338/583] Bump scitools/workflows in the dependencies group (#507) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2024.07.2 to 2024.07.3 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2024.07.2...2024.07.3) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index fe8d6a04..b2e7befe 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.07.2 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.07.3 diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 08167bd7..9848e964 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.07.2 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.07.3 secrets: inherit From 3e4f3b88bb77d606e677544610532ad7c624a663 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 18 Jul 2024 13:12:45 +0100 Subject: [PATCH 339/583] chore: update pre-commit hooks (#501) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: update pre-commit hooks updates: - [github.com/astral-sh/ruff-pre-commit: v0.4.10 → v0.5.2](https://github.com/astral-sh/ruff-pre-commit/compare/v0.4.10...v0.5.2) - [github.com/adamchainz/blacken-docs: 1.16.0 → 1.18.0](https://github.com/adamchainz/blacken-docs/compare/1.16.0...1.18.0) - [github.com/pre-commit/mirrors-mypy: v1.10.0 → v1.10.1](https://github.com/pre-commit/mirrors-mypy/compare/v1.10.0...v1.10.1) * Use is not == for type identity checks. --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Patrick Peglar --- .pre-commit-config.yaml | 6 +++--- src/iris_grib/__init__.py | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 713a378b..6401409e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -51,7 +51,7 @@ repos: - id: trailing-whitespace - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.4.10" + rev: "v0.5.2" hooks: - id: ruff types: [file, python] @@ -67,7 +67,7 @@ repos: additional_dependencies: [tomli] - repo: https://github.com/adamchainz/blacken-docs - rev: 1.16.0 + rev: 1.18.0 hooks: - id: blacken-docs types: [file, rst] @@ -79,7 +79,7 @@ repos: types: [file, python] - repo: https://github.com/pre-commit/mirrors-mypy - rev: 'v1.10.0' + rev: 'v1.10.1' hooks: - id: mypy exclude: 'noxfile\.py|docs/conf\.py' diff --git a/src/iris_grib/__init__.py b/src/iris_grib/__init__.py index c9265e06..7c35d4af 100644 --- a/src/iris_grib/__init__.py +++ b/src/iris_grib/__init__.py @@ -259,14 +259,14 @@ def __getattr__(self, key): res = np.int32(eccodes.codes_get_long(self.grib_message, key)) else: key_type = eccodes.codes_get_native_type(self.grib_message, key) - if key_type == int: + if key_type is int: res = np.int32(eccodes.codes_get_long(self.grib_message, key)) - elif key_type == float: + elif key_type is float: # Because some computer keys are floats, like # longitudeOfFirstGridPointInDegrees, a float32 # is not always enough... res = np.float64(eccodes.codes_get_double(self.grib_message, key)) - elif key_type == str: + elif key_type is str: res = eccodes.codes_get_string(self.grib_message, key) else: emsg = "Unknown type for {} : {}" From ef5e2b604ffadd56b6792580ab1b66f08de4c8e4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Jul 2024 10:20:11 +0100 Subject: [PATCH 340/583] Bump scitools/workflows in the dependencies group (#509) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2024.07.3 to 2024.07.4 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2024.07.3...2024.07.4) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index b2e7befe..e420d1d3 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.07.3 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.07.4 diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 9848e964..11291bac 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.07.3 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.07.4 secrets: inherit From c31ef21f3fb67249debad9f8525f5c1b34300bf3 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 22 Jul 2024 11:55:07 +0100 Subject: [PATCH 341/583] Updated environment lockfiles (#508) Co-authored-by: Lockfile bot Co-authored-by: Patrick Peglar --- requirements/locks/py310-linux-64.lock | 24 ++++++++++++------------ requirements/locks/py311-linux-64.lock | 24 ++++++++++++------------ requirements/locks/py312-linux-64.lock | 24 ++++++++++++------------ 3 files changed, 36 insertions(+), 36 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 770bac99..c44b14b3 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: d87fbf5e6b13b3bed3ae08420cfaea150d8e5ff6b469b3591861318a87b0a278 +# input_hash: 4b79cfcae8adfdca32dfc1151f0085dbb2a52a32b9d8bcaa79abfaa5ca75f98b @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.7.4-hbcca054_0.conda#23ab7665c5f63cfb9f1f6195256daac6 @@ -10,8 +10,8 @@ https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#1610 https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_0.conda#ae061a5ed5f05818acdf9adab72c146d https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h77fa898_0.conda#ca0fad6a41ddaef54a153b78eccb5037 -https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.32.1-h4bc722e_0.conda#7ed005e0df2bd50406b110b48ac4587b +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.32.2-h4bc722e_0.conda#8024af1ee7078e37fa3101c0a0296af2 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.20-hd590300_0.conda#8e88f9389f1165d7c0936fe40d9a9a79 @@ -28,7 +28,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.co https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4ab18f5_1.conda#b1e9d076f14e8d776213fd5047b4c3d9 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4bc722e_2.conda#e1b454497f9f7c1147fdde4b53f1b512 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a @@ -41,7 +41,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.2-hac33072_0.conda#621d814955342209dc8e7f87c41f1ba0 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 -https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff +https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f @@ -70,7 +70,7 @@ https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_hac2b453_1.conda#ae05ece66d3924ac3d48b4aa3fa96cec https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda#66f03896ffbe1a110ffda05c7a856504 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-h4c95cb1_3.conda#0ac9aff6010a7751961c8e4b863a40e7 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-he7c6b58_4.conda#08a9265c637230c37cb1be4a6cad4536 https://conda.anaconda.org/conda-forge/linux-64/python-3.10.14-hd12c33a_0_cpython.conda#2b4ba962994e8bd4be9ff5b64b75aff2 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.46.0-h6d4b2fc_0.conda#77ea8dff5cf8550cc8f5629a6af56323 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 @@ -81,7 +81,7 @@ https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.4.0-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda#5e4c0743c70186509d1412e03c2d8dfa https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hc6cd4ac_1.conda#1f95722c94f00b69af69a066c7433714 -https://conda.anaconda.org/conda-forge/noarch/cachetools-5.3.3-pyhd8ed1ab_0.conda#cd4c26c702a9bcdc70ff05b609ddacbe +https://conda.anaconda.org/conda-forge/noarch/cachetools-5.4.0-pyhd8ed1ab_0.conda#c55fbbc5bac8e9efbba71c0d1ed57713 https://conda.anaconda.org/conda-forge/noarch/certifi-2024.7.4-pyhd8ed1ab_0.conda#24e7fd6ca65997938fff9e5ab6f653e4 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2#ebb5f5f7dc4f1a3780ef7ea7738db08c https://conda.anaconda.org/conda-forge/linux-64/chardet-5.2.0-py310hff52083_1.conda#a677136a83b823803d2f92045f885be2 @@ -93,7 +93,7 @@ https://conda.anaconda.org/conda-forge/linux-64/colorlog-6.8.2-py310hff52083_0.c https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py310hff52083_3.conda#c159dcd29bbd80b187b1c5d5f73cc971 -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.4-pyhd8ed1ab_0.conda#0e7e4388e9d5283e22b35a9443bdbcc9 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.6.1-pyhff2d567_0.conda#996bf792cdb8c0ac38ff54b9fde56841 @@ -122,7 +122,7 @@ https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py310h2372a71_0.conda#b631b889b0b4bc2fca7b8b977ca484b2 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py310h2372a71_1.conda#bb010e368de4940771368bc3dc4c63e7 -https://conda.anaconda.org/conda-forge/noarch/setuptools-70.3.0-pyhd8ed1ab_0.conda#693bb57e8f92120caa956898065f3627 +https://conda.anaconda.org/conda-forge/noarch/setuptools-71.0.3-pyhd8ed1ab_0.conda#d4b6e6ce2f7bcaec484b81c447df1028 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 @@ -167,7 +167,7 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.co https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda#ba9f7f0ec4f2a18de3e7bce67c4a431e https://conda.anaconda.org/conda-forge/noarch/tox-4.16.0-pyhd8ed1ab_0.conda#d97aec372c67e16eb447adc90fbac149 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310hd41b1e2_4.conda#35e87277fba9944b8a975113538bb5df -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.22.0-py310hab88d88_1.conda#f997c26e250f125a1a297589a95ae79d +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310h64cae3c_0.conda#b527de1849629f2635dafc77745b015a https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310h261611a_0.conda#5c0e2cd80ceab2ac5201459cc016b88b https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py310hd41b1e2_0.conda#60ee50b1968f802f2a487ba36d4cce0d https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.7.0-pyhd8ed1ab_0.conda#755e47653ae38f5c50f1435af756e844 @@ -177,7 +177,7 @@ https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py310h2372a71_1.co https://conda.anaconda.org/conda-forge/noarch/nox-2024.4.15-pyhff2d567_0.conda#600c0de12125f473d8099c0b3e6f88d4 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.0-py310h93e2701_1.conda#c6b2a8134aa49940afe552f69bdef957 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.1.0-hd8ed1ab_0.conda#7ed7b077f6c6ebcb5fc66f23985df487 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py310h019a838_2.conda#562a95785a35adacf472e22b8f00dd81 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.5-py310h019a838_0.conda#2902ec08257b19d75d08a375cdc37c2c https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py310h261611a_5.conda#643414a9f73226b2a6a43a4800734d3b https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.36.0-h762793a_0.conda#6d8c86d0368625b6503d696db70ea041 @@ -195,5 +195,5 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.5-pyhd8 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jquery-4.1-pyhd8ed1ab_0.conda#914897066d5873acfb13e75705276ad1 https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-2.0.0-pyha770c72_0.conda#baf6d9a33df1a789ca55e3b404c7ea28 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.7-pyhd8ed1ab_0.conda#26acae54b06f178681bfb551760f5dd1 -https://conda.anaconda.org/conda-forge/noarch/sphinx-7.3.7-pyhd8ed1ab_0.conda#7b1465205e28d75d2c0e1a868ee00a67 +https://conda.anaconda.org/conda-forge/noarch/sphinx-7.4.5-pyhd8ed1ab_0.conda#98a3e9786dd637216c6a028f5061cd71 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda#e507335cb4ca9cff4c3d0fa9cdab255e diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 4ab2346b..2add444c 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 60217b599fcbadcfc8eab3310daf72f9d8a52a7ee931c9b04e0861ad9ae71313 +# input_hash: fe5452e41de90dae4e169a25fead307770c576d24c6b8b5ccaf1c6db315e8ae0 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.7.4-hbcca054_0.conda#23ab7665c5f63cfb9f1f6195256daac6 @@ -10,8 +10,8 @@ https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#1610 https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_0.conda#ae061a5ed5f05818acdf9adab72c146d https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h77fa898_0.conda#ca0fad6a41ddaef54a153b78eccb5037 -https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.32.1-h4bc722e_0.conda#7ed005e0df2bd50406b110b48ac4587b +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.32.2-h4bc722e_0.conda#8024af1ee7078e37fa3101c0a0296af2 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.20-hd590300_0.conda#8e88f9389f1165d7c0936fe40d9a9a79 @@ -28,7 +28,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.co https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4ab18f5_1.conda#b1e9d076f14e8d776213fd5047b4c3d9 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4bc722e_2.conda#e1b454497f9f7c1147fdde4b53f1b512 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a @@ -41,7 +41,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.2-hac33072_0.conda#621d814955342209dc8e7f87c41f1ba0 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 -https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff +https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f @@ -70,7 +70,7 @@ https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_hac2b453_1.conda#ae05ece66d3924ac3d48b4aa3fa96cec https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda#66f03896ffbe1a110ffda05c7a856504 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-h4c95cb1_3.conda#0ac9aff6010a7751961c8e4b863a40e7 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-he7c6b58_4.conda#08a9265c637230c37cb1be4a6cad4536 https://conda.anaconda.org/conda-forge/linux-64/python-3.11.9-hb806964_0_cpython.conda#ac68acfa8b558ed406c75e98d3428d7b https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.46.0-h6d4b2fc_0.conda#77ea8dff5cf8550cc8f5629a6af56323 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 @@ -81,7 +81,7 @@ https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.4.0-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda#5e4c0743c70186509d1412e03c2d8dfa https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hb755f60_1.conda#cce9e7c3f1c307f2a5fb08a2922d6164 -https://conda.anaconda.org/conda-forge/noarch/cachetools-5.3.3-pyhd8ed1ab_0.conda#cd4c26c702a9bcdc70ff05b609ddacbe +https://conda.anaconda.org/conda-forge/noarch/cachetools-5.4.0-pyhd8ed1ab_0.conda#c55fbbc5bac8e9efbba71c0d1ed57713 https://conda.anaconda.org/conda-forge/noarch/certifi-2024.7.4-pyhd8ed1ab_0.conda#24e7fd6ca65997938fff9e5ab6f653e4 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2#ebb5f5f7dc4f1a3780ef7ea7738db08c https://conda.anaconda.org/conda-forge/linux-64/chardet-5.2.0-py311h38be061_1.conda#b8cfb13de4dbe349a41800644391de6a @@ -93,7 +93,7 @@ https://conda.anaconda.org/conda-forge/linux-64/colorlog-6.8.2-py311h38be061_0.c https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py311h38be061_3.conda#1c33f55e5cdcc2a2b973c432b5225bfe -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.4-pyhd8ed1ab_0.conda#0e7e4388e9d5283e22b35a9443bdbcc9 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.6.1-pyhff2d567_0.conda#996bf792cdb8c0ac38ff54b9fde56841 @@ -122,7 +122,7 @@ https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py311h459d7ec_0.conda#60b5332b3989fda37884b92c7afd6a91 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py311h459d7ec_1.conda#52719a74ad130de8fb5d047dc91f247a -https://conda.anaconda.org/conda-forge/noarch/setuptools-70.3.0-pyhd8ed1ab_0.conda#693bb57e8f92120caa956898065f3627 +https://conda.anaconda.org/conda-forge/noarch/setuptools-71.0.3-pyhd8ed1ab_0.conda#d4b6e6ce2f7bcaec484b81c447df1028 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 @@ -166,7 +166,7 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.co https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda#ba9f7f0ec4f2a18de3e7bce67c4a431e https://conda.anaconda.org/conda-forge/noarch/tox-4.16.0-pyhd8ed1ab_0.conda#d97aec372c67e16eb447adc90fbac149 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311h9547e67_4.conda#586da7df03b68640de14dc3e8bcbf76f -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.22.0-py311hb6f056b_1.conda#72e84ef20a510ab5fca1f3d80a16e9e2 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311h5cd10c7_0.conda#8efe4fe2396281627b3450af8357b190 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h18e1886_0.conda#0eb1e6c7d10285ec12e01f73d1896d93 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py311h9547e67_0.conda#74ad0ae64f1ef565e27eda87fa749e84 https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.7.0-pyhd8ed1ab_0.conda#755e47653ae38f5c50f1435af756e844 @@ -176,7 +176,7 @@ https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py311h459d7ec_1.co https://conda.anaconda.org/conda-forge/noarch/nox-2024.4.15-pyhff2d567_0.conda#600c0de12125f473d8099c0b3e6f88d4 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.0-py311h517d4fd_1.conda#481fd009b2d863f526f60ca19cb7880b https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.1.0-hd8ed1ab_0.conda#7ed7b077f6c6ebcb5fc66f23985df487 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py311h5925939_2.conda#eaebac048378462f21e0f8737cf05496 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.5-py311h5925939_0.conda#105ce0d9e7aa0324031a3abaf9ec71f7 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h18e1886_5.conda#6cd3facab7a79de14abb1a86a2d830fa https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.36.0-h762793a_0.conda#6d8c86d0368625b6503d696db70ea041 @@ -194,5 +194,5 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.5-pyhd8 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jquery-4.1-pyhd8ed1ab_0.conda#914897066d5873acfb13e75705276ad1 https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-2.0.0-pyha770c72_0.conda#baf6d9a33df1a789ca55e3b404c7ea28 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.7-pyhd8ed1ab_0.conda#26acae54b06f178681bfb551760f5dd1 -https://conda.anaconda.org/conda-forge/noarch/sphinx-7.3.7-pyhd8ed1ab_0.conda#7b1465205e28d75d2c0e1a868ee00a67 +https://conda.anaconda.org/conda-forge/noarch/sphinx-7.4.5-pyhd8ed1ab_0.conda#98a3e9786dd637216c6a028f5061cd71 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda#e507335cb4ca9cff4c3d0fa9cdab255e diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index a6e6db28..8c118da7 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: aceb4f254f1d98ca662bbb35c77671dac9f062d5c373bd67050bbb9b99171617 +# input_hash: e86d945e803f06926278032cd38065b8f5ad074d360d325088b9a2f395cf50c0 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.7.4-hbcca054_0.conda#23ab7665c5f63cfb9f1f6195256daac6 @@ -10,8 +10,8 @@ https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#1610 https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_0.conda#ae061a5ed5f05818acdf9adab72c146d https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h77fa898_0.conda#ca0fad6a41ddaef54a153b78eccb5037 -https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.32.1-h4bc722e_0.conda#7ed005e0df2bd50406b110b48ac4587b +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.32.2-h4bc722e_0.conda#8024af1ee7078e37fa3101c0a0296af2 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.20-hd590300_0.conda#8e88f9389f1165d7c0936fe40d9a9a79 @@ -28,7 +28,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.co https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4ab18f5_1.conda#b1e9d076f14e8d776213fd5047b4c3d9 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4bc722e_2.conda#e1b454497f9f7c1147fdde4b53f1b512 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a @@ -41,7 +41,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.2-hac33072_0.conda#621d814955342209dc8e7f87c41f1ba0 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 -https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff +https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f @@ -70,7 +70,7 @@ https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_hac2b453_1.conda#ae05ece66d3924ac3d48b4aa3fa96cec https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda#66f03896ffbe1a110ffda05c7a856504 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-h4c95cb1_3.conda#0ac9aff6010a7751961c8e4b863a40e7 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-he7c6b58_4.conda#08a9265c637230c37cb1be4a6cad4536 https://conda.anaconda.org/conda-forge/linux-64/python-3.12.4-h194c7f8_0_cpython.conda#d73490214f536cccb5819e9873048c92 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.46.0-h6d4b2fc_0.conda#77ea8dff5cf8550cc8f5629a6af56323 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 @@ -81,7 +81,7 @@ https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.4.0-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda#5e4c0743c70186509d1412e03c2d8dfa https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h30efb56_1.conda#45801a89533d3336a365284d93298e36 -https://conda.anaconda.org/conda-forge/noarch/cachetools-5.3.3-pyhd8ed1ab_0.conda#cd4c26c702a9bcdc70ff05b609ddacbe +https://conda.anaconda.org/conda-forge/noarch/cachetools-5.4.0-pyhd8ed1ab_0.conda#c55fbbc5bac8e9efbba71c0d1ed57713 https://conda.anaconda.org/conda-forge/noarch/certifi-2024.7.4-pyhd8ed1ab_0.conda#24e7fd6ca65997938fff9e5ab6f653e4 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2#ebb5f5f7dc4f1a3780ef7ea7738db08c https://conda.anaconda.org/conda-forge/linux-64/chardet-5.2.0-py312h7900ff3_1.conda#af3980cc4690716a5510c8a08cb06238 @@ -93,7 +93,7 @@ https://conda.anaconda.org/conda-forge/linux-64/colorlog-6.8.2-py312h7900ff3_0.c https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py312h7900ff3_3.conda#1b90835ae26b9b8250b302649359a989 -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.4-pyhd8ed1ab_0.conda#0e7e4388e9d5283e22b35a9443bdbcc9 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.6.1-pyhff2d567_0.conda#996bf792cdb8c0ac38ff54b9fde56841 @@ -122,7 +122,7 @@ https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py312h98912ed_0.conda#a8f9739e0ada2320148c92ddd608864f https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py312h98912ed_1.conda#e3fd78d8d490af1d84763b9fe3f2e552 -https://conda.anaconda.org/conda-forge/noarch/setuptools-70.3.0-pyhd8ed1ab_0.conda#693bb57e8f92120caa956898065f3627 +https://conda.anaconda.org/conda-forge/noarch/setuptools-71.0.3-pyhd8ed1ab_0.conda#d4b6e6ce2f7bcaec484b81c447df1028 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 @@ -166,7 +166,7 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.co https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda#ba9f7f0ec4f2a18de3e7bce67c4a431e https://conda.anaconda.org/conda-forge/noarch/tox-4.16.0-pyhd8ed1ab_0.conda#d97aec372c67e16eb447adc90fbac149 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h8572e83_4.conda#52c9e25ee0a32485a102eeecdb7eef52 -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.22.0-py312h5b18bf6_1.conda#27fe79bbc4dd3767be554fb171df362c +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312h3483029_0.conda#eab52e88c858d87cf5a069f79d10bb50 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312h085067d_0.conda#864d9e92f012bcc49650428d5343c98a https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py312h8572e83_0.conda#12c6a831ef734f0b2dd4caff514cbb7f https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.7.0-pyhd8ed1ab_0.conda#755e47653ae38f5c50f1435af756e844 @@ -176,7 +176,7 @@ https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py312h98912ed_1.co https://conda.anaconda.org/conda-forge/noarch/nox-2024.4.15-pyhff2d567_0.conda#600c0de12125f473d8099c0b3e6f88d4 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.0-py312hc2bc53b_1.conda#eae80145f63aa04a02dda456d4883b46 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.1.0-hd8ed1ab_0.conda#7ed7b077f6c6ebcb5fc66f23985df487 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py312h8413631_2.conda#d5e52d9b72a86920926ca5fd8fec7394 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.5-py312h8413631_0.conda#3e67354b24c7ee057ddee367f310ad3e https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py312h085067d_5.conda#b40cdf87aee69ccf162022579cb99afb https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.36.0-h762793a_0.conda#6d8c86d0368625b6503d696db70ea041 @@ -194,5 +194,5 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.5-pyhd8 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jquery-4.1-pyhd8ed1ab_0.conda#914897066d5873acfb13e75705276ad1 https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-2.0.0-pyha770c72_0.conda#baf6d9a33df1a789ca55e3b404c7ea28 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.7-pyhd8ed1ab_0.conda#26acae54b06f178681bfb551760f5dd1 -https://conda.anaconda.org/conda-forge/noarch/sphinx-7.3.7-pyhd8ed1ab_0.conda#7b1465205e28d75d2c0e1a868ee00a67 +https://conda.anaconda.org/conda-forge/noarch/sphinx-7.4.5-pyhd8ed1ab_0.conda#98a3e9786dd637216c6a028f5061cd71 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda#e507335cb4ca9cff4c3d0fa9cdab255e From 00b202b2ffdfcefc6ddf91dd4d8c6ec79efe2aa5 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 22 Jul 2024 20:22:50 +0100 Subject: [PATCH 342/583] chore: update pre-commit hooks (#510) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.5.2 → v0.5.4](https://github.com/astral-sh/ruff-pre-commit/compare/v0.5.2...v0.5.4) - [github.com/pre-commit/mirrors-mypy: v1.10.1 → v1.11.0](https://github.com/pre-commit/mirrors-mypy/compare/v1.10.1...v1.11.0) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 6401409e..49f64b81 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -51,7 +51,7 @@ repos: - id: trailing-whitespace - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.5.2" + rev: "v0.5.4" hooks: - id: ruff types: [file, python] @@ -79,7 +79,7 @@ repos: types: [file, python] - repo: https://github.com/pre-commit/mirrors-mypy - rev: 'v1.10.1' + rev: 'v1.11.0' hooks: - id: mypy exclude: 'noxfile\.py|docs/conf\.py' From 3cd6b60bf160020d08c209b19f7694d8d8eb986c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 Jul 2024 10:36:53 +0100 Subject: [PATCH 343/583] Bump scitools/workflows in the dependencies group (#511) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2024.07.4 to 2024.07.5 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2024.07.4...2024.07.5) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index e420d1d3..c0b76c1e 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.07.4 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.07.5 diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 11291bac..d8ed49ed 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.07.4 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.07.5 secrets: inherit From 842380ff7a16040e820625b77f3a395e9a439ca5 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Sat, 27 Jul 2024 18:20:45 +0100 Subject: [PATCH 344/583] Updated environment lockfiles (#512) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 28 +++++++++++++------------- requirements/locks/py311-linux-64.lock | 28 +++++++++++++------------- requirements/locks/py312-linux-64.lock | 28 +++++++++++++------------- 3 files changed, 42 insertions(+), 42 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index c44b14b3..a43708b6 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -11,7 +11,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_0.conda# https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h77fa898_0.conda#ca0fad6a41ddaef54a153b78eccb5037 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.32.2-h4bc722e_0.conda#8024af1ee7078e37fa3101c0a0296af2 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.32.3-h4bc722e_0.conda#7624e34ee6baebfc80d67bac76cc9d9d https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.20-hd590300_0.conda#8e88f9389f1165d7c0936fe40d9a9a79 @@ -39,7 +39,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae -https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.2-hac33072_0.conda#621d814955342209dc8e7f87c41f1ba0 +https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.2-he02047a_1.conda#aab9195bc018b82dc77a84584b36cce9 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f @@ -105,8 +105,8 @@ https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda 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/kiwisolver-1.4.5-py310hd41b1e2_1.conda#b8d67603d43b23ce7e988a5d81a7ab79 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-22_linux64_openblas.conda#1a2a0cd3153464fee6646f3dd6dad9b8 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.8.0-hca28451_1.conda#b8afb3e3cb3423cc445cf611ab95fdb0 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-23_linux64_openblas.conda#96c8450a40aa2b9733073a9460de972c +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.9.0-hdb1bdb2_0.conda#5badfbdb2688d8aaca7bd3c98d557b97 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py310h2372a71_0.conda#f6703fa0214a00bf49d1bef6dc7672d0 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 @@ -122,7 +122,7 @@ https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py310h2372a71_0.conda#b631b889b0b4bc2fca7b8b977ca484b2 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py310h2372a71_1.conda#bb010e368de4940771368bc3dc4c63e7 -https://conda.anaconda.org/conda-forge/noarch/setuptools-71.0.3-pyhd8ed1ab_0.conda#d4b6e6ce2f7bcaec484b81c447df1028 +https://conda.anaconda.org/conda-forge/noarch/setuptools-71.0.4-pyhd8ed1ab_0.conda#ee78ac9c720d0d02fcfd420866b82ab1 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 @@ -141,24 +141,24 @@ https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.0-py310h5b4e0ec_0.c https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.1-py310h5b4e0ec_0.conda#2c5257cb35d1946f5e80a0cfd69ed7ec https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.0.0-pyha770c72_0.conda#3286556cdd99048d198f72c3f6f69103 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.2.0-pyha770c72_0.conda#c261d14fc7f49cdd403868998a18c318 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda#4b31699e0ec5de64d5896e580389c9a1 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-23_linux64_openblas.conda#eede29b40efa878cbe5bdcb767e97310 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-ha6d2627_1004.conda#df069bea331c8486ac21814969301c1f -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_openblas.conda#b083767b6c877e24ee597d93b87ab838 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-23_linux64_openblas.conda#2af0879961951987e464722fd00ec1e0 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda#dfe0528d0f1c16c1f7c528ea5536ab30 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.4.0-py310hebfe307_0.conda#89d70dfe2d59edcefc3881be6bff33a6 https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.1-hb784bbd_0.conda#c38c5246d064ef16eba065d93c46f1c6 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.7.1-pyhd8ed1ab_0.conda#8e2946459d7f721f8e85b6db185d6338 -https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.2-pyhd8ed1ab_0.conda#0f3f49c22c7ef3a1195fa61dad3c43be +https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.2-pyhd8ed1ab_0.conda#e010a224b90f1f623a917c35addbb924 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.3-pyhd8ed1ab_0.conda#284008712816c64c85bf2b7fa9f3b264 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.0.0-hd8ed1ab_0.conda#5f8c8ebbe6413a7838cf6ecf14d5d31b +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.2.0-hd8ed1ab_0.conda#0fd030dce707a6654472cf7619b0b01b https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h135f659_114.conda#a908e463c710bd6b10a9eaa89fdf003c https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py310hb13e2d6_0.conda#6593de64c935768b6bad3e19b3e978be https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py310hf666db6_7.conda#577d33875077f2ae50b13dd56e4d90f8 @@ -170,7 +170,7 @@ https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310hd41b1e2_4.co https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310h64cae3c_0.conda#b527de1849629f2635dafc77745b015a https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310h261611a_0.conda#5c0e2cd80ceab2ac5201459cc016b88b https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py310hd41b1e2_0.conda#60ee50b1968f802f2a487ba36d4cce0d -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.7.0-pyhd8ed1ab_0.conda#755e47653ae38f5c50f1435af756e844 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.7.1-pyhd8ed1ab_0.conda#80f7ce024289c333fdc5ad54a194fc86 https://conda.anaconda.org/conda-forge/noarch/identify-2.6.0-pyhd8ed1ab_0.conda#f80cc5989f445f23b1622d6c455896d9 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py310h2372a71_1.conda#dfcf64f67961eb9686676f96fdb4b4d1 @@ -191,9 +191,9 @@ https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.1-py310h26161 https://conda.anaconda.org/conda-forge/noarch/iris-3.9.0-pyha770c72_0.conda#efaf150eb009f04efa58f1401c767192 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda#611a35a27914fac3aa37611a6fe40bb5 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.6-pyhd8ed1ab_0.conda#d7e4954df0d3aea2eacc7835ad12671d -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.5-pyhd8ed1ab_0.conda#7e1e7437273682ada2ed5e9e9714b140 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.6-pyhd8ed1ab_0.conda#d6f4b617daa8c677f60c06a3a61e2743 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jquery-4.1-pyhd8ed1ab_0.conda#914897066d5873acfb13e75705276ad1 https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-2.0.0-pyha770c72_0.conda#baf6d9a33df1a789ca55e3b404c7ea28 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.7-pyhd8ed1ab_0.conda#26acae54b06f178681bfb551760f5dd1 -https://conda.anaconda.org/conda-forge/noarch/sphinx-7.4.5-pyhd8ed1ab_0.conda#98a3e9786dd637216c6a028f5061cd71 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.8-pyhd8ed1ab_0.conda#179912c661d6aa9fe794e81c854f8d9f +https://conda.anaconda.org/conda-forge/noarch/sphinx-7.4.7-pyhd8ed1ab_0.conda#c568e260463da2528ecfd7c5a0b41bbd https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda#e507335cb4ca9cff4c3d0fa9cdab255e diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 2add444c..186a62b0 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -11,7 +11,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_0.conda# https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h77fa898_0.conda#ca0fad6a41ddaef54a153b78eccb5037 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.32.2-h4bc722e_0.conda#8024af1ee7078e37fa3101c0a0296af2 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.32.3-h4bc722e_0.conda#7624e34ee6baebfc80d67bac76cc9d9d https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.20-hd590300_0.conda#8e88f9389f1165d7c0936fe40d9a9a79 @@ -39,7 +39,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae -https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.2-hac33072_0.conda#621d814955342209dc8e7f87c41f1ba0 +https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.2-he02047a_1.conda#aab9195bc018b82dc77a84584b36cce9 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f @@ -105,8 +105,8 @@ https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda 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/kiwisolver-1.4.5-py311h9547e67_1.conda#2c65bdf442b0d37aad080c8a4e0d452f https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-22_linux64_openblas.conda#1a2a0cd3153464fee6646f3dd6dad9b8 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.8.0-hca28451_1.conda#b8afb3e3cb3423cc445cf611ab95fdb0 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-23_linux64_openblas.conda#96c8450a40aa2b9733073a9460de972c +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.9.0-hdb1bdb2_0.conda#5badfbdb2688d8aaca7bd3c98d557b97 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py311h459d7ec_0.conda#a322b4185121935c871d201ae00ac143 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 @@ -122,7 +122,7 @@ https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py311h459d7ec_0.conda#60b5332b3989fda37884b92c7afd6a91 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py311h459d7ec_1.conda#52719a74ad130de8fb5d047dc91f247a -https://conda.anaconda.org/conda-forge/noarch/setuptools-71.0.3-pyhd8ed1ab_0.conda#d4b6e6ce2f7bcaec484b81c447df1028 +https://conda.anaconda.org/conda-forge/noarch/setuptools-71.0.4-pyhd8ed1ab_0.conda#ee78ac9c720d0d02fcfd420866b82ab1 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 @@ -140,24 +140,24 @@ https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.0-py311h61187de_0.c https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.1-py311h61187de_0.conda#bcbe6c9db1c25900c3808b8974e1bb90 https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.0.0-pyha770c72_0.conda#3286556cdd99048d198f72c3f6f69103 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.2.0-pyha770c72_0.conda#c261d14fc7f49cdd403868998a18c318 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda#4b31699e0ec5de64d5896e580389c9a1 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-23_linux64_openblas.conda#eede29b40efa878cbe5bdcb767e97310 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-ha6d2627_1004.conda#df069bea331c8486ac21814969301c1f -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_openblas.conda#b083767b6c877e24ee597d93b87ab838 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-23_linux64_openblas.conda#2af0879961951987e464722fd00ec1e0 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda#dfe0528d0f1c16c1f7c528ea5536ab30 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.4.0-py311h82a398c_0.conda#b9e0ac1f5564b6572a6d702c04207be8 https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.1-hb784bbd_0.conda#c38c5246d064ef16eba065d93c46f1c6 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.7.1-pyhd8ed1ab_0.conda#8e2946459d7f721f8e85b6db185d6338 -https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.2-pyhd8ed1ab_0.conda#0f3f49c22c7ef3a1195fa61dad3c43be +https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.2-pyhd8ed1ab_0.conda#e010a224b90f1f623a917c35addbb924 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.3-pyhd8ed1ab_0.conda#284008712816c64c85bf2b7fa9f3b264 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.0.0-hd8ed1ab_0.conda#5f8c8ebbe6413a7838cf6ecf14d5d31b +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.2.0-hd8ed1ab_0.conda#0fd030dce707a6654472cf7619b0b01b https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h135f659_114.conda#a908e463c710bd6b10a9eaa89fdf003c https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.conda#a502d7aad449a1206efb366d6a12c52d https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311hc21b84f_7.conda#0d55a70a8c2160a7f3cbe9fcfd87f82a @@ -169,7 +169,7 @@ https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311h9547e67_4.co https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311h5cd10c7_0.conda#8efe4fe2396281627b3450af8357b190 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h18e1886_0.conda#0eb1e6c7d10285ec12e01f73d1896d93 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py311h9547e67_0.conda#74ad0ae64f1ef565e27eda87fa749e84 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.7.0-pyhd8ed1ab_0.conda#755e47653ae38f5c50f1435af756e844 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.7.1-pyhd8ed1ab_0.conda#80f7ce024289c333fdc5ad54a194fc86 https://conda.anaconda.org/conda-forge/noarch/identify-2.6.0-pyhd8ed1ab_0.conda#f80cc5989f445f23b1622d6c455896d9 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py311h459d7ec_1.conda#45b8d355bbcdd27588c2d266bcfdff84 @@ -190,9 +190,9 @@ https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.1-py311h18e18 https://conda.anaconda.org/conda-forge/noarch/iris-3.9.0-pyha770c72_0.conda#efaf150eb009f04efa58f1401c767192 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda#611a35a27914fac3aa37611a6fe40bb5 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.6-pyhd8ed1ab_0.conda#d7e4954df0d3aea2eacc7835ad12671d -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.5-pyhd8ed1ab_0.conda#7e1e7437273682ada2ed5e9e9714b140 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.6-pyhd8ed1ab_0.conda#d6f4b617daa8c677f60c06a3a61e2743 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jquery-4.1-pyhd8ed1ab_0.conda#914897066d5873acfb13e75705276ad1 https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-2.0.0-pyha770c72_0.conda#baf6d9a33df1a789ca55e3b404c7ea28 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.7-pyhd8ed1ab_0.conda#26acae54b06f178681bfb551760f5dd1 -https://conda.anaconda.org/conda-forge/noarch/sphinx-7.4.5-pyhd8ed1ab_0.conda#98a3e9786dd637216c6a028f5061cd71 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.8-pyhd8ed1ab_0.conda#179912c661d6aa9fe794e81c854f8d9f +https://conda.anaconda.org/conda-forge/noarch/sphinx-7.4.7-pyhd8ed1ab_0.conda#c568e260463da2528ecfd7c5a0b41bbd https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda#e507335cb4ca9cff4c3d0fa9cdab255e diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 8c118da7..aeef6a3d 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -11,7 +11,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_0.conda# https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h77fa898_0.conda#ca0fad6a41ddaef54a153b78eccb5037 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.32.2-h4bc722e_0.conda#8024af1ee7078e37fa3101c0a0296af2 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.32.3-h4bc722e_0.conda#7624e34ee6baebfc80d67bac76cc9d9d https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.20-hd590300_0.conda#8e88f9389f1165d7c0936fe40d9a9a79 @@ -39,7 +39,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae -https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.2-hac33072_0.conda#621d814955342209dc8e7f87c41f1ba0 +https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.2-he02047a_1.conda#aab9195bc018b82dc77a84584b36cce9 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f @@ -105,8 +105,8 @@ https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda 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/kiwisolver-1.4.5-py312h8572e83_1.conda#c1e71f2bc05d8e8e033aefac2c490d05 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-22_linux64_openblas.conda#1a2a0cd3153464fee6646f3dd6dad9b8 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.8.0-hca28451_1.conda#b8afb3e3cb3423cc445cf611ab95fdb0 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-23_linux64_openblas.conda#96c8450a40aa2b9733073a9460de972c +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.9.0-hdb1bdb2_0.conda#5badfbdb2688d8aaca7bd3c98d557b97 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py312h98912ed_0.conda#6ff0b9582da2d4a74a1f9ae1f9ce2af6 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 @@ -122,7 +122,7 @@ https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py312h98912ed_0.conda#a8f9739e0ada2320148c92ddd608864f https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py312h98912ed_1.conda#e3fd78d8d490af1d84763b9fe3f2e552 -https://conda.anaconda.org/conda-forge/noarch/setuptools-71.0.3-pyhd8ed1ab_0.conda#d4b6e6ce2f7bcaec484b81c447df1028 +https://conda.anaconda.org/conda-forge/noarch/setuptools-71.0.4-pyhd8ed1ab_0.conda#ee78ac9c720d0d02fcfd420866b82ab1 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 @@ -140,24 +140,24 @@ https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.0-py312h41a817b_0.c https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.1-py312h41a817b_0.conda#da921c56bcf69a8b97216ecec0cc4015 https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.0.0-pyha770c72_0.conda#3286556cdd99048d198f72c3f6f69103 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.2.0-pyha770c72_0.conda#c261d14fc7f49cdd403868998a18c318 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda#4b31699e0ec5de64d5896e580389c9a1 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-23_linux64_openblas.conda#eede29b40efa878cbe5bdcb767e97310 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-ha6d2627_1004.conda#df069bea331c8486ac21814969301c1f -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_openblas.conda#b083767b6c877e24ee597d93b87ab838 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-23_linux64_openblas.conda#2af0879961951987e464722fd00ec1e0 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda#dfe0528d0f1c16c1f7c528ea5536ab30 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.4.0-py312h287a98d_0.conda#59ea71eed98aee0bebbbdd3b118167c7 https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.1-hb784bbd_0.conda#c38c5246d064ef16eba065d93c46f1c6 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.7.1-pyhd8ed1ab_0.conda#8e2946459d7f721f8e85b6db185d6338 -https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.2-pyhd8ed1ab_0.conda#0f3f49c22c7ef3a1195fa61dad3c43be +https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.2-pyhd8ed1ab_0.conda#e010a224b90f1f623a917c35addbb924 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.3-pyhd8ed1ab_0.conda#284008712816c64c85bf2b7fa9f3b264 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.0.0-hd8ed1ab_0.conda#5f8c8ebbe6413a7838cf6ecf14d5d31b +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.2.0-hd8ed1ab_0.conda#0fd030dce707a6654472cf7619b0b01b https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h135f659_114.conda#a908e463c710bd6b10a9eaa89fdf003c https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda#d8285bea2a350f63fab23bf460221f3f https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py312h5d05ceb_7.conda#b53ddc25da04839cc62b0b158a7ecb38 @@ -169,7 +169,7 @@ https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h8572e83_4.co https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312h3483029_0.conda#eab52e88c858d87cf5a069f79d10bb50 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312h085067d_0.conda#864d9e92f012bcc49650428d5343c98a https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py312h8572e83_0.conda#12c6a831ef734f0b2dd4caff514cbb7f -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.7.0-pyhd8ed1ab_0.conda#755e47653ae38f5c50f1435af756e844 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.7.1-pyhd8ed1ab_0.conda#80f7ce024289c333fdc5ad54a194fc86 https://conda.anaconda.org/conda-forge/noarch/identify-2.6.0-pyhd8ed1ab_0.conda#f80cc5989f445f23b1622d6c455896d9 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py312h98912ed_1.conda#d5273d1e67b7b3a871a0a711c6532a2f @@ -190,9 +190,9 @@ https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.1-py312h08506 https://conda.anaconda.org/conda-forge/noarch/iris-3.9.0-pyha770c72_0.conda#efaf150eb009f04efa58f1401c767192 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda#611a35a27914fac3aa37611a6fe40bb5 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.6-pyhd8ed1ab_0.conda#d7e4954df0d3aea2eacc7835ad12671d -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.5-pyhd8ed1ab_0.conda#7e1e7437273682ada2ed5e9e9714b140 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.6-pyhd8ed1ab_0.conda#d6f4b617daa8c677f60c06a3a61e2743 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jquery-4.1-pyhd8ed1ab_0.conda#914897066d5873acfb13e75705276ad1 https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-2.0.0-pyha770c72_0.conda#baf6d9a33df1a789ca55e3b404c7ea28 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.7-pyhd8ed1ab_0.conda#26acae54b06f178681bfb551760f5dd1 -https://conda.anaconda.org/conda-forge/noarch/sphinx-7.4.5-pyhd8ed1ab_0.conda#98a3e9786dd637216c6a028f5061cd71 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.8-pyhd8ed1ab_0.conda#179912c661d6aa9fe794e81c854f8d9f +https://conda.anaconda.org/conda-forge/noarch/sphinx-7.4.7-pyhd8ed1ab_0.conda#c568e260463da2528ecfd7c5a0b41bbd https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda#e507335cb4ca9cff4c3d0fa9cdab255e From b444e1813d974880553f060c15c424de5fc60f6b Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 29 Jul 2024 22:08:19 +0100 Subject: [PATCH 345/583] chore: update pre-commit hooks (#513) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.5.4 → v0.5.5](https://github.com/astral-sh/ruff-pre-commit/compare/v0.5.4...v0.5.5) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 49f64b81..9584c2ca 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -51,7 +51,7 @@ repos: - id: trailing-whitespace - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.5.4" + rev: "v0.5.5" hooks: - id: ruff types: [file, python] From 52649af459ffd209e041b94f2b8d08318aac2e4c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Jul 2024 10:47:25 +0100 Subject: [PATCH 346/583] Bump scitools/workflows in the dependencies group (#514) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2024.07.5 to 2024.07.6 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2024.07.5...2024.07.6) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index c0b76c1e..1d623680 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.07.5 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.07.6 diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index d8ed49ed..71513850 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.07.5 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.07.6 secrets: inherit From f27b2668de58ed6b72bf0f51085f94be22847f39 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 5 Aug 2024 21:23:37 +0100 Subject: [PATCH 347/583] chore: update pre-commit hooks (#516) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.5.5 → v0.5.6](https://github.com/astral-sh/ruff-pre-commit/compare/v0.5.5...v0.5.6) - [github.com/pre-commit/mirrors-mypy: v1.11.0 → v1.11.1](https://github.com/pre-commit/mirrors-mypy/compare/v1.11.0...v1.11.1) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 9584c2ca..025a4ad1 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -51,7 +51,7 @@ repos: - id: trailing-whitespace - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.5.5" + rev: "v0.5.6" hooks: - id: ruff types: [file, python] @@ -79,7 +79,7 @@ repos: types: [file, python] - repo: https://github.com/pre-commit/mirrors-mypy - rev: 'v1.11.0' + rev: 'v1.11.1' hooks: - id: mypy exclude: 'noxfile\.py|docs/conf\.py' From 5b4758cbc4c982c38717b8b1529c907d20e82ccf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 6 Aug 2024 11:38:08 +0100 Subject: [PATCH 348/583] Bump scitools/workflows in the dependencies group (#517) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2024.07.6 to 2024.08.0 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2024.07.6...2024.08.0) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 1d623680..241c005f 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.07.6 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.08.0 diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 71513850..2a973fad 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.07.6 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.08.0 secrets: inherit From 48691f3f6f92146834b6a7d2c3909f4f461ad516 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Sat, 10 Aug 2024 14:09:17 +0100 Subject: [PATCH 349/583] Updated environment lockfiles (#518) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 44 ++++++++++++------------ requirements/locks/py311-linux-64.lock | 44 ++++++++++++------------ requirements/locks/py312-linux-64.lock | 46 +++++++++++++------------- 3 files changed, 67 insertions(+), 67 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index a43708b6..d851c60a 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -14,7 +14,7 @@ https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62e https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.32.3-h4bc722e_0.conda#7624e34ee6baebfc80d67bac76cc9d9d https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.20-hd590300_0.conda#8e88f9389f1165d7c0936fe40d9a9a79 +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.21-h4bc722e_0.conda#36ce76665bf67f5aac36be7a0d21b7f3 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 @@ -69,7 +69,7 @@ https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.cond https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_hac2b453_1.conda#ae05ece66d3924ac3d48b4aa3fa96cec -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda#66f03896ffbe1a110ffda05c7a856504 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h46a8edc_4.conda#a7e3a62981350e232e0e7345b5aea580 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-he7c6b58_4.conda#08a9265c637230c37cb1be4a6cad4536 https://conda.anaconda.org/conda-forge/linux-64/python-3.10.14-hd12c33a_0_cpython.conda#2b4ba962994e8bd4be9ff5b64b75aff2 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.46.0-h6d4b2fc_0.conda#77ea8dff5cf8550cc8f5629a6af56323 @@ -77,8 +77,8 @@ https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-hb711507_1.conda#4a6d410296d7e39f00bacdee7df046e9 https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 -https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.4.0-pyhd8ed1ab_0.conda#9f736cae0da3365a4dbbfbadfac9f3a2 -https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda#5e4c0743c70186509d1412e03c2d8dfa +https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.5.0-pyhd8ed1ab_0.conda#58d664381a6dd4238cf40b7e2ba3309d +https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda#6732fa52eb8e66e5afeb32db8701a791 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hc6cd4ac_1.conda#1f95722c94f00b69af69a066c7433714 https://conda.anaconda.org/conda-forge/noarch/cachetools-5.4.0-pyhd8ed1ab_0.conda#c55fbbc5bac8e9efbba71c0d1ed57713 @@ -106,7 +106,7 @@ https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.4.0-pyhd8ed1ab_ https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py310hd41b1e2_1.conda#b8d67603d43b23ce7e988a5d81a7ab79 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-23_linux64_openblas.conda#96c8450a40aa2b9733073a9460de972c -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.9.0-hdb1bdb2_0.conda#5badfbdb2688d8aaca7bd3c98d557b97 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.9.1-hdb1bdb2_0.conda#7da1d242ca3591e174a3c7d82230d3c0 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py310h2372a71_0.conda#f6703fa0214a00bf49d1bef6dc7672d0 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 @@ -121,8 +121,8 @@ https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#9 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py310h2372a71_0.conda#b631b889b0b4bc2fca7b8b977ca484b2 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py310h2372a71_1.conda#bb010e368de4940771368bc3dc4c63e7 -https://conda.anaconda.org/conda-forge/noarch/setuptools-71.0.4-pyhd8ed1ab_0.conda#ee78ac9c720d0d02fcfd420866b82ab1 +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py310h5b4e0ec_0.conda#ad8de7b4ac482217959cc1e8fe0cc56d +https://conda.anaconda.org/conda-forge/noarch/setuptools-72.1.0-pyhd8ed1ab_0.conda#e06d4c26df4f958a8d38696f2c344d15 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 @@ -131,13 +131,13 @@ https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda#ebe6952715e1d5eb567eeebf25250fa7 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py310h2372a71_0.conda#72637c58d36d9475fda24700c9796f19 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda#0b5293a157c2b5cd513dd1b03d8d3aae +https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda#d44e3b085abcaef02983c6305b84b584 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/noarch/zipp-3.19.2-pyhd8ed1ab_0.conda#49808e59df5535116f6878b2a820d6f4 https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e -https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py310h2fee648_0.conda#45846a970e71ac98fd327da5d40a0a2c -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.0-py310h5b4e0ec_0.conda#a13d72c877b47870042897a0e667cd3a +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.0-py310h2fdcea3_0.conda#6ac912f6208a15d35955ab73a4e5efda +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.1-py310h5b4e0ec_0.conda#9767c8416fd3b2197dbfedd5ea971337 https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.1-py310h5b4e0ec_0.conda#2c5257cb35d1946f5e80a0cfd69ed7ec https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 @@ -149,28 +149,28 @@ https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-23_linux64_openb https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda#dfe0528d0f1c16c1f7c528ea5536ab30 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.4.0-py310hebfe307_0.conda#89d70dfe2d59edcefc3881be6bff33a6 -https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.1-hb784bbd_0.conda#c38c5246d064ef16eba065d93c46f1c6 +https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyhd8ed1ab_0.conda#6721aef6bfe5937abe70181545dd2c51 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.1-h54d7996_1.conda#e479d1991c725e1a355f33c0e40dbc66 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.7.1-pyhd8ed1ab_0.conda#8e2946459d7f721f8e85b6db185d6338 https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.2-pyhd8ed1ab_0.conda#e010a224b90f1f623a917c35addbb924 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.3-pyhd8ed1ab_0.conda#284008712816c64c85bf2b7fa9f3b264 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h4bc722e_1.conda#749baebe7e2ff3360630e069175e528b https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.2.0-hd8ed1ab_0.conda#0fd030dce707a6654472cf7619b0b01b https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h135f659_114.conda#a908e463c710bd6b10a9eaa89fdf003c https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py310hb13e2d6_0.conda#6593de64c935768b6bad3e19b3e978be -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py310hf666db6_7.conda#577d33875077f2ae50b13dd56e4d90f8 +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py310h8efdad9_8.conda#141894c09837c83a396fce6eb629c1ab https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda#ba9f7f0ec4f2a18de3e7bce67c4a431e -https://conda.anaconda.org/conda-forge/noarch/tox-4.16.0-pyhd8ed1ab_0.conda#d97aec372c67e16eb447adc90fbac149 +https://conda.anaconda.org/conda-forge/noarch/tox-4.17.1-pyhd8ed1ab_0.conda#4e9d4aead975d82afcc06caae91f196f https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310hd41b1e2_4.conda#35e87277fba9944b8a975113538bb5df https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310h64cae3c_0.conda#b527de1849629f2635dafc77745b015a https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310h261611a_0.conda#5c0e2cd80ceab2ac5201459cc016b88b https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py310hd41b1e2_0.conda#60ee50b1968f802f2a487ba36d4cce0d -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.7.1-pyhd8ed1ab_0.conda#80f7ce024289c333fdc5ad54a194fc86 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.0-pyhd8ed1ab_0.conda#bf68bf9ff9a18f1b17aa8c817225aee0 https://conda.anaconda.org/conda-forge/noarch/identify-2.6.0-pyhd8ed1ab_0.conda#f80cc5989f445f23b1622d6c455896d9 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py310h2372a71_1.conda#dfcf64f67961eb9686676f96fdb4b4d1 @@ -181,19 +181,19 @@ https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.5-py310h019a838_0.co https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py310h261611a_5.conda#643414a9f73226b2a6a43a4800734d3b https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.36.0-h762793a_0.conda#6d8c86d0368625b6503d696db70ea041 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.1-py310h0b1de36_0.conda#5341c2c1a7f0a9d196f8070bfa4e16ba +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.1-py310hf02ac8c_2.conda#123acef757eb89e8dd6eb37af3f65821 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.1-nompi_py310hf3005e6_101.conda#409736627835306542425033e2a41dd2 -https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda#724bc4489c1174fc8e3233b0624fa51f +https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.8.0-pyha770c72_0.conda#1822e87a5d357f79c6aab871d86fb062 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py310hf9f9076_1.conda#dd5c97834c12bae782b35261e0bea7b4 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_0.conda#2cc61ba1dd53f0806247333f1294e058 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.1-py310h261611a_0.conda#b577e192825e3037fb39498f3603df05 https://conda.anaconda.org/conda-forge/noarch/iris-3.9.0-pyha770c72_0.conda#efaf150eb009f04efa58f1401c767192 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda#611a35a27914fac3aa37611a6fe40bb5 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.6-pyhd8ed1ab_0.conda#d7e4954df0d3aea2eacc7835ad12671d -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.6-pyhd8ed1ab_0.conda#d6f4b617daa8c677f60c06a3a61e2743 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_0.conda#9075bd8c033f0257122300db914e49c9 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_0.conda#b3bcc38c471ebb738854f52a36059b48 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_0.conda#e25640d692c02e8acfff0372f547e940 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jquery-4.1-pyhd8ed1ab_0.conda#914897066d5873acfb13e75705276ad1 https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-2.0.0-pyha770c72_0.conda#baf6d9a33df1a789ca55e3b404c7ea28 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.8-pyhd8ed1ab_0.conda#179912c661d6aa9fe794e81c854f8d9f +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_0.conda#d6e5ea5fe00164ac6c2dcc5d76a42192 https://conda.anaconda.org/conda-forge/noarch/sphinx-7.4.7-pyhd8ed1ab_0.conda#c568e260463da2528ecfd7c5a0b41bbd https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda#e507335cb4ca9cff4c3d0fa9cdab255e diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 186a62b0..016d5959 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -14,7 +14,7 @@ https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62e https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.32.3-h4bc722e_0.conda#7624e34ee6baebfc80d67bac76cc9d9d https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.20-hd590300_0.conda#8e88f9389f1165d7c0936fe40d9a9a79 +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.21-h4bc722e_0.conda#36ce76665bf67f5aac36be7a0d21b7f3 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 @@ -69,7 +69,7 @@ https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.cond https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_hac2b453_1.conda#ae05ece66d3924ac3d48b4aa3fa96cec -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda#66f03896ffbe1a110ffda05c7a856504 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h46a8edc_4.conda#a7e3a62981350e232e0e7345b5aea580 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-he7c6b58_4.conda#08a9265c637230c37cb1be4a6cad4536 https://conda.anaconda.org/conda-forge/linux-64/python-3.11.9-hb806964_0_cpython.conda#ac68acfa8b558ed406c75e98d3428d7b https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.46.0-h6d4b2fc_0.conda#77ea8dff5cf8550cc8f5629a6af56323 @@ -77,8 +77,8 @@ https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-hb711507_1.conda#4a6d410296d7e39f00bacdee7df046e9 https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 -https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.4.0-pyhd8ed1ab_0.conda#9f736cae0da3365a4dbbfbadfac9f3a2 -https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda#5e4c0743c70186509d1412e03c2d8dfa +https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.5.0-pyhd8ed1ab_0.conda#58d664381a6dd4238cf40b7e2ba3309d +https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda#6732fa52eb8e66e5afeb32db8701a791 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hb755f60_1.conda#cce9e7c3f1c307f2a5fb08a2922d6164 https://conda.anaconda.org/conda-forge/noarch/cachetools-5.4.0-pyhd8ed1ab_0.conda#c55fbbc5bac8e9efbba71c0d1ed57713 @@ -106,7 +106,7 @@ https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.4.0-pyhd8ed1ab_ https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py311h9547e67_1.conda#2c65bdf442b0d37aad080c8a4e0d452f https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-23_linux64_openblas.conda#96c8450a40aa2b9733073a9460de972c -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.9.0-hdb1bdb2_0.conda#5badfbdb2688d8aaca7bd3c98d557b97 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.9.1-hdb1bdb2_0.conda#7da1d242ca3591e174a3c7d82230d3c0 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py311h459d7ec_0.conda#a322b4185121935c871d201ae00ac143 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 @@ -121,8 +121,8 @@ https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#9 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py311h459d7ec_0.conda#60b5332b3989fda37884b92c7afd6a91 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py311h459d7ec_1.conda#52719a74ad130de8fb5d047dc91f247a -https://conda.anaconda.org/conda-forge/noarch/setuptools-71.0.4-pyhd8ed1ab_0.conda#ee78ac9c720d0d02fcfd420866b82ab1 +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py311h61187de_0.conda#76439451605390254b85d8da6f8d962a +https://conda.anaconda.org/conda-forge/noarch/setuptools-72.1.0-pyhd8ed1ab_0.conda#e06d4c26df4f958a8d38696f2c344d15 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 @@ -130,13 +130,13 @@ https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda#ebe6952715e1d5eb567eeebf25250fa7 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda#0b5293a157c2b5cd513dd1b03d8d3aae +https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda#d44e3b085abcaef02983c6305b84b584 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/noarch/zipp-3.19.2-pyhd8ed1ab_0.conda#49808e59df5535116f6878b2a820d6f4 https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e -https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py311hb3a22ac_0.conda#b3469563ac5e808b0cd92810d0697043 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.0-py311h61187de_0.conda#88eac8e0e69d850b235824f87e5cfd1b +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.0-py311ha8e6434_0.conda#32259cd17741b52be10cd23a26cca23a +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.1-py311h61187de_0.conda#1a4c475c89ad142967256d0c7237f298 https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.1-py311h61187de_0.conda#bcbe6c9db1c25900c3808b8974e1bb90 https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 @@ -148,28 +148,28 @@ https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-23_linux64_openb https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda#dfe0528d0f1c16c1f7c528ea5536ab30 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.4.0-py311h82a398c_0.conda#b9e0ac1f5564b6572a6d702c04207be8 -https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.1-hb784bbd_0.conda#c38c5246d064ef16eba065d93c46f1c6 +https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyhd8ed1ab_0.conda#6721aef6bfe5937abe70181545dd2c51 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.1-h54d7996_1.conda#e479d1991c725e1a355f33c0e40dbc66 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.7.1-pyhd8ed1ab_0.conda#8e2946459d7f721f8e85b6db185d6338 https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.2-pyhd8ed1ab_0.conda#e010a224b90f1f623a917c35addbb924 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.3-pyhd8ed1ab_0.conda#284008712816c64c85bf2b7fa9f3b264 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h4bc722e_1.conda#749baebe7e2ff3360630e069175e528b https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.2.0-hd8ed1ab_0.conda#0fd030dce707a6654472cf7619b0b01b https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h135f659_114.conda#a908e463c710bd6b10a9eaa89fdf003c https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.conda#a502d7aad449a1206efb366d6a12c52d -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311hc21b84f_7.conda#0d55a70a8c2160a7f3cbe9fcfd87f82a +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311ha1c4eca_8.conda#5e89d863aff561261ef8f3c7ed29d6e8 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda#ba9f7f0ec4f2a18de3e7bce67c4a431e -https://conda.anaconda.org/conda-forge/noarch/tox-4.16.0-pyhd8ed1ab_0.conda#d97aec372c67e16eb447adc90fbac149 +https://conda.anaconda.org/conda-forge/noarch/tox-4.17.1-pyhd8ed1ab_0.conda#4e9d4aead975d82afcc06caae91f196f https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311h9547e67_4.conda#586da7df03b68640de14dc3e8bcbf76f https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311h5cd10c7_0.conda#8efe4fe2396281627b3450af8357b190 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h18e1886_0.conda#0eb1e6c7d10285ec12e01f73d1896d93 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py311h9547e67_0.conda#74ad0ae64f1ef565e27eda87fa749e84 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.7.1-pyhd8ed1ab_0.conda#80f7ce024289c333fdc5ad54a194fc86 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.0-pyhd8ed1ab_0.conda#bf68bf9ff9a18f1b17aa8c817225aee0 https://conda.anaconda.org/conda-forge/noarch/identify-2.6.0-pyhd8ed1ab_0.conda#f80cc5989f445f23b1622d6c455896d9 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py311h459d7ec_1.conda#45b8d355bbcdd27588c2d266bcfdff84 @@ -180,19 +180,19 @@ https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.5-py311h5925939_0.co https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h18e1886_5.conda#6cd3facab7a79de14abb1a86a2d830fa https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.36.0-h762793a_0.conda#6d8c86d0368625b6503d696db70ea041 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.1-py311hffb96ce_0.conda#990bc73fa802e6387f683d0fbc6b7bd4 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.1-py311h74b4f7c_2.conda#e4a26e6bd32d4af38492ba68caaa16d1 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.1-nompi_py311h25b3b55_101.conda#936afeddfa3704eb834d0887b0838826 -https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda#724bc4489c1174fc8e3233b0624fa51f +https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.8.0-pyha770c72_0.conda#1822e87a5d357f79c6aab871d86fb062 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py311h14de704_1.conda#27e5956e552c6e71f56cb1ec042617a8 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_0.conda#2cc61ba1dd53f0806247333f1294e058 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.1-py311h18e1886_0.conda#a54e480c5d7adceb6a84a16a29498449 https://conda.anaconda.org/conda-forge/noarch/iris-3.9.0-pyha770c72_0.conda#efaf150eb009f04efa58f1401c767192 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda#611a35a27914fac3aa37611a6fe40bb5 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.6-pyhd8ed1ab_0.conda#d7e4954df0d3aea2eacc7835ad12671d -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.6-pyhd8ed1ab_0.conda#d6f4b617daa8c677f60c06a3a61e2743 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_0.conda#9075bd8c033f0257122300db914e49c9 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_0.conda#b3bcc38c471ebb738854f52a36059b48 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_0.conda#e25640d692c02e8acfff0372f547e940 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jquery-4.1-pyhd8ed1ab_0.conda#914897066d5873acfb13e75705276ad1 https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-2.0.0-pyha770c72_0.conda#baf6d9a33df1a789ca55e3b404c7ea28 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.8-pyhd8ed1ab_0.conda#179912c661d6aa9fe794e81c854f8d9f +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_0.conda#d6e5ea5fe00164ac6c2dcc5d76a42192 https://conda.anaconda.org/conda-forge/noarch/sphinx-7.4.7-pyhd8ed1ab_0.conda#c568e260463da2528ecfd7c5a0b41bbd https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda#e507335cb4ca9cff4c3d0fa9cdab255e diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index aeef6a3d..dff69116 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -14,7 +14,7 @@ https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62e https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.32.3-h4bc722e_0.conda#7624e34ee6baebfc80d67bac76cc9d9d https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.20-hd590300_0.conda#8e88f9389f1165d7c0936fe40d9a9a79 +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.21-h4bc722e_0.conda#36ce76665bf67f5aac36be7a0d21b7f3 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 @@ -69,16 +69,16 @@ https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.cond https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_hac2b453_1.conda#ae05ece66d3924ac3d48b4aa3fa96cec -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda#66f03896ffbe1a110ffda05c7a856504 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h46a8edc_4.conda#a7e3a62981350e232e0e7345b5aea580 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-he7c6b58_4.conda#08a9265c637230c37cb1be4a6cad4536 -https://conda.anaconda.org/conda-forge/linux-64/python-3.12.4-h194c7f8_0_cpython.conda#d73490214f536cccb5819e9873048c92 +https://conda.anaconda.org/conda-forge/linux-64/python-3.12.5-h2ad013b_0_cpython.conda#9c56c4df45f6571b13111d8df2448692 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.46.0-h6d4b2fc_0.conda#77ea8dff5cf8550cc8f5629a6af56323 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-hb711507_1.conda#4a6d410296d7e39f00bacdee7df046e9 https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 -https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.4.0-pyhd8ed1ab_0.conda#9f736cae0da3365a4dbbfbadfac9f3a2 -https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda#5e4c0743c70186509d1412e03c2d8dfa +https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.5.0-pyhd8ed1ab_0.conda#58d664381a6dd4238cf40b7e2ba3309d +https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda#6732fa52eb8e66e5afeb32db8701a791 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h30efb56_1.conda#45801a89533d3336a365284d93298e36 https://conda.anaconda.org/conda-forge/noarch/cachetools-5.4.0-pyhd8ed1ab_0.conda#c55fbbc5bac8e9efbba71c0d1ed57713 @@ -106,7 +106,7 @@ https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.4.0-pyhd8ed1ab_ https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py312h8572e83_1.conda#c1e71f2bc05d8e8e033aefac2c490d05 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-23_linux64_openblas.conda#96c8450a40aa2b9733073a9460de972c -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.9.0-hdb1bdb2_0.conda#5badfbdb2688d8aaca7bd3c98d557b97 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.9.1-hdb1bdb2_0.conda#7da1d242ca3591e174a3c7d82230d3c0 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py312h98912ed_0.conda#6ff0b9582da2d4a74a1f9ae1f9ce2af6 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 @@ -121,8 +121,8 @@ https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#9 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py312h98912ed_0.conda#a8f9739e0ada2320148c92ddd608864f https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py312h98912ed_1.conda#e3fd78d8d490af1d84763b9fe3f2e552 -https://conda.anaconda.org/conda-forge/noarch/setuptools-71.0.4-pyhd8ed1ab_0.conda#ee78ac9c720d0d02fcfd420866b82ab1 +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h41a817b_0.conda#1779c9cbd9006415ab7bb9e12747e9d1 +https://conda.anaconda.org/conda-forge/noarch/setuptools-72.1.0-pyhd8ed1ab_0.conda#e06d4c26df4f958a8d38696f2c344d15 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 @@ -130,13 +130,13 @@ https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda#ebe6952715e1d5eb567eeebf25250fa7 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda#0b5293a157c2b5cd513dd1b03d8d3aae +https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda#d44e3b085abcaef02983c6305b84b584 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/noarch/zipp-3.19.2-pyhd8ed1ab_0.conda#49808e59df5535116f6878b2a820d6f4 https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e -https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py312hf06ca03_0.conda#56b0ca764ce23cc54f3f7e2a7b970f6d -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.0-py312h41a817b_0.conda#66c68c204a3eaabc3b4221f1c4bcebbe +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.0-py312h1671c18_0.conda#33dee889f41b0ba6dbe5ddbe70ebf263 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.1-py312h41a817b_0.conda#4006636c39312dc42f8504475be3800f https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.1-py312h41a817b_0.conda#da921c56bcf69a8b97216ecec0cc4015 https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 @@ -148,28 +148,28 @@ https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-23_linux64_openb https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda#dfe0528d0f1c16c1f7c528ea5536ab30 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.4.0-py312h287a98d_0.conda#59ea71eed98aee0bebbbdd3b118167c7 -https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.1-hb784bbd_0.conda#c38c5246d064ef16eba065d93c46f1c6 +https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyhd8ed1ab_0.conda#6721aef6bfe5937abe70181545dd2c51 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.1-h54d7996_1.conda#e479d1991c725e1a355f33c0e40dbc66 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.7.1-pyhd8ed1ab_0.conda#8e2946459d7f721f8e85b6db185d6338 https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.2-pyhd8ed1ab_0.conda#e010a224b90f1f623a917c35addbb924 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.3-pyhd8ed1ab_0.conda#284008712816c64c85bf2b7fa9f3b264 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h4bc722e_1.conda#749baebe7e2ff3360630e069175e528b https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.2.0-hd8ed1ab_0.conda#0fd030dce707a6654472cf7619b0b01b https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h135f659_114.conda#a908e463c710bd6b10a9eaa89fdf003c https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda#d8285bea2a350f63fab23bf460221f3f -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py312h5d05ceb_7.conda#b53ddc25da04839cc62b0b158a7ecb38 +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py312h01329cd_8.conda#ca4d166cb45c07aff3bee9091866c7dd https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda#ba9f7f0ec4f2a18de3e7bce67c4a431e -https://conda.anaconda.org/conda-forge/noarch/tox-4.16.0-pyhd8ed1ab_0.conda#d97aec372c67e16eb447adc90fbac149 +https://conda.anaconda.org/conda-forge/noarch/tox-4.17.1-pyhd8ed1ab_0.conda#4e9d4aead975d82afcc06caae91f196f https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h8572e83_4.conda#52c9e25ee0a32485a102eeecdb7eef52 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312h3483029_0.conda#eab52e88c858d87cf5a069f79d10bb50 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312h085067d_0.conda#864d9e92f012bcc49650428d5343c98a https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py312h8572e83_0.conda#12c6a831ef734f0b2dd4caff514cbb7f -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.7.1-pyhd8ed1ab_0.conda#80f7ce024289c333fdc5ad54a194fc86 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.0-pyhd8ed1ab_0.conda#bf68bf9ff9a18f1b17aa8c817225aee0 https://conda.anaconda.org/conda-forge/noarch/identify-2.6.0-pyhd8ed1ab_0.conda#f80cc5989f445f23b1622d6c455896d9 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py312h98912ed_1.conda#d5273d1e67b7b3a871a0a711c6532a2f @@ -180,19 +180,19 @@ https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.5-py312h8413631_0.co https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py312h085067d_5.conda#b40cdf87aee69ccf162022579cb99afb https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.36.0-h762793a_0.conda#6d8c86d0368625b6503d696db70ea041 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.1-py312h9201f00_0.conda#e1dc3a7d999666f5c58cbb391940e235 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.1-py312h854627b_2.conda#2a49f2a9c0447bc1bdaec98e3ee59117 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.1-nompi_py312h1ef7fb6_101.conda#c67cc8e3a34c5cb8920c79918112e96f -https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda#724bc4489c1174fc8e3233b0624fa51f +https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.8.0-pyha770c72_0.conda#1822e87a5d357f79c6aab871d86fb062 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py312h1d6d2e6_1.conda#6392d3ce615ab0f32bc39b07f8f4c300 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_0.conda#2cc61ba1dd53f0806247333f1294e058 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.1-py312h085067d_0.conda#5f96475aa30552797f8099ccee24feaa https://conda.anaconda.org/conda-forge/noarch/iris-3.9.0-pyha770c72_0.conda#efaf150eb009f04efa58f1401c767192 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda#611a35a27914fac3aa37611a6fe40bb5 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.6-pyhd8ed1ab_0.conda#d7e4954df0d3aea2eacc7835ad12671d -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.6-pyhd8ed1ab_0.conda#d6f4b617daa8c677f60c06a3a61e2743 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_0.conda#9075bd8c033f0257122300db914e49c9 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_0.conda#b3bcc38c471ebb738854f52a36059b48 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_0.conda#e25640d692c02e8acfff0372f547e940 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jquery-4.1-pyhd8ed1ab_0.conda#914897066d5873acfb13e75705276ad1 https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-2.0.0-pyha770c72_0.conda#baf6d9a33df1a789ca55e3b404c7ea28 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.8-pyhd8ed1ab_0.conda#179912c661d6aa9fe794e81c854f8d9f +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_0.conda#d6e5ea5fe00164ac6c2dcc5d76a42192 https://conda.anaconda.org/conda-forge/noarch/sphinx-7.4.7-pyhd8ed1ab_0.conda#c568e260463da2528ecfd7c5a0b41bbd https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda#e507335cb4ca9cff4c3d0fa9cdab255e From 93126894cae9fd0583d9ec8c4377224fe702de47 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 13 Aug 2024 11:05:43 +0100 Subject: [PATCH 350/583] chore: update pre-commit hooks (#519) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.5.6 → v0.5.7](https://github.com/astral-sh/ruff-pre-commit/compare/v0.5.6...v0.5.7) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 025a4ad1..a2183595 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -51,7 +51,7 @@ repos: - id: trailing-whitespace - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.5.6" + rev: "v0.5.7" hooks: - id: ruff types: [file, python] From 2a34b39a93feaecb735d3699f6b57e2fa31b5573 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 14 Aug 2024 12:18:16 +0100 Subject: [PATCH 351/583] Bump scitools/workflows in the dependencies group (#521) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2024.08.0 to 2024.08.1 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2024.08.0...2024.08.1) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 241c005f..6f9bf492 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.08.0 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.08.1 diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 2a973fad..5731ed0c 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.08.0 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.08.1 secrets: inherit From 49749e9531911d58f6e0ba189a287f0b79b13b7a Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Sun, 18 Aug 2024 16:14:58 +0100 Subject: [PATCH 352/583] Updated environment lockfiles (#522) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 14 +++++++------- requirements/locks/py311-linux-64.lock | 14 +++++++------- requirements/locks/py312-linux-64.lock | 14 +++++++------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index d851c60a..12f39063 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -5,13 +5,13 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.7.4-hbcca054_0.conda#23ab7665c5f63cfb9f1f6195256daac6 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda#b80f2f396ca2c28b8c14c437a4ed1e74 -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-4_cp310.conda#26322ec5d7712c3ded99dd656142b8ce +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-5_cp310.conda#2921c34715e74b3587b4cff4d36844f9 https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_0.conda#ae061a5ed5f05818acdf9adab72c146d https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h77fa898_0.conda#ca0fad6a41ddaef54a153b78eccb5037 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.32.3-h4bc722e_0.conda#7624e34ee6baebfc80d67bac76cc9d9d +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.33.0-ha66036c_0.conda#b6927f788e85267beef6cbb292aaebdd https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.21-h4bc722e_0.conda#36ce76665bf67f5aac36be7a0d21b7f3 @@ -134,7 +134,7 @@ https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py310h2372a7 https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda#d44e3b085abcaef02983c6305b84b584 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a -https://conda.anaconda.org/conda-forge/noarch/zipp-3.19.2-pyhd8ed1ab_0.conda#49808e59df5535116f6878b2a820d6f4 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.0-pyhd8ed1ab_0.conda#05b6bcb391b5be17374f7ad0aeedc479 https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.0-py310h2fdcea3_0.conda#6ac912f6208a15d35955ab73a4e5efda https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.1-py310h5b4e0ec_0.conda#9767c8416fd3b2197dbfedd5ea971337 @@ -165,12 +165,12 @@ https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py310h8efdad9_8.con https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda#ba9f7f0ec4f2a18de3e7bce67c4a431e -https://conda.anaconda.org/conda-forge/noarch/tox-4.17.1-pyhd8ed1ab_0.conda#4e9d4aead975d82afcc06caae91f196f +https://conda.anaconda.org/conda-forge/noarch/tox-4.18.0-pyhd8ed1ab_0.conda#d9fd7cdd9af0da9b217f1c31f03c930a https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310hd41b1e2_4.conda#35e87277fba9944b8a975113538bb5df https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310h64cae3c_0.conda#b527de1849629f2635dafc77745b015a https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310h261611a_0.conda#5c0e2cd80ceab2ac5201459cc016b88b https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py310hd41b1e2_0.conda#60ee50b1968f802f2a487ba36d4cce0d -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.0-pyhd8ed1ab_0.conda#bf68bf9ff9a18f1b17aa8c817225aee0 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.1-pyhd8ed1ab_0.conda#8fe3858b19843234b331d8459db3a7a1 https://conda.anaconda.org/conda-forge/noarch/identify-2.6.0-pyhd8ed1ab_0.conda#f80cc5989f445f23b1622d6c455896d9 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py310h2372a71_1.conda#dfcf64f67961eb9686676f96fdb4b4d1 @@ -181,14 +181,14 @@ https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.5-py310h019a838_0.co https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py310h261611a_5.conda#643414a9f73226b2a6a43a4800734d3b https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.36.0-h762793a_0.conda#6d8c86d0368625b6503d696db70ea041 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.1-py310hf02ac8c_2.conda#123acef757eb89e8dd6eb37af3f65821 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.2-py310hf02ac8c_0.conda#394fef7267dfc5bc139ba72b05560b75 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.1-nompi_py310hf3005e6_101.conda#409736627835306542425033e2a41dd2 https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.8.0-pyha770c72_0.conda#1822e87a5d357f79c6aab871d86fb062 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py310hf9f9076_1.conda#dd5c97834c12bae782b35261e0bea7b4 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_0.conda#2cc61ba1dd53f0806247333f1294e058 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.1-py310h261611a_0.conda#b577e192825e3037fb39498f3603df05 -https://conda.anaconda.org/conda-forge/noarch/iris-3.9.0-pyha770c72_0.conda#efaf150eb009f04efa58f1401c767192 +https://conda.anaconda.org/conda-forge/noarch/iris-3.10.0-pyha770c72_1.conda#b7212cd8247ce909631fdcb77015914a https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_0.conda#9075bd8c033f0257122300db914e49c9 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_0.conda#b3bcc38c471ebb738854f52a36059b48 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_0.conda#e25640d692c02e8acfff0372f547e940 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 016d5959..54c93407 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -5,13 +5,13 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.7.4-hbcca054_0.conda#23ab7665c5f63cfb9f1f6195256daac6 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda#b80f2f396ca2c28b8c14c437a4ed1e74 -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-4_cp311.conda#d786502c97404c94d7d58d258a445a65 +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-5_cp311.conda#139a8d40c8a2f430df31048949e450de https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_0.conda#ae061a5ed5f05818acdf9adab72c146d https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h77fa898_0.conda#ca0fad6a41ddaef54a153b78eccb5037 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.32.3-h4bc722e_0.conda#7624e34ee6baebfc80d67bac76cc9d9d +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.33.0-ha66036c_0.conda#b6927f788e85267beef6cbb292aaebdd https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.21-h4bc722e_0.conda#36ce76665bf67f5aac36be7a0d21b7f3 @@ -133,7 +133,7 @@ https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c7 https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda#d44e3b085abcaef02983c6305b84b584 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a -https://conda.anaconda.org/conda-forge/noarch/zipp-3.19.2-pyhd8ed1ab_0.conda#49808e59df5535116f6878b2a820d6f4 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.0-pyhd8ed1ab_0.conda#05b6bcb391b5be17374f7ad0aeedc479 https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.0-py311ha8e6434_0.conda#32259cd17741b52be10cd23a26cca23a https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.1-py311h61187de_0.conda#1a4c475c89ad142967256d0c7237f298 @@ -164,12 +164,12 @@ https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311ha1c4eca_8.con https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda#ba9f7f0ec4f2a18de3e7bce67c4a431e -https://conda.anaconda.org/conda-forge/noarch/tox-4.17.1-pyhd8ed1ab_0.conda#4e9d4aead975d82afcc06caae91f196f +https://conda.anaconda.org/conda-forge/noarch/tox-4.18.0-pyhd8ed1ab_0.conda#d9fd7cdd9af0da9b217f1c31f03c930a https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311h9547e67_4.conda#586da7df03b68640de14dc3e8bcbf76f https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311h5cd10c7_0.conda#8efe4fe2396281627b3450af8357b190 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h18e1886_0.conda#0eb1e6c7d10285ec12e01f73d1896d93 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py311h9547e67_0.conda#74ad0ae64f1ef565e27eda87fa749e84 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.0-pyhd8ed1ab_0.conda#bf68bf9ff9a18f1b17aa8c817225aee0 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.1-pyhd8ed1ab_0.conda#8fe3858b19843234b331d8459db3a7a1 https://conda.anaconda.org/conda-forge/noarch/identify-2.6.0-pyhd8ed1ab_0.conda#f80cc5989f445f23b1622d6c455896d9 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py311h459d7ec_1.conda#45b8d355bbcdd27588c2d266bcfdff84 @@ -180,14 +180,14 @@ https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.5-py311h5925939_0.co https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h18e1886_5.conda#6cd3facab7a79de14abb1a86a2d830fa https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.36.0-h762793a_0.conda#6d8c86d0368625b6503d696db70ea041 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.1-py311h74b4f7c_2.conda#e4a26e6bd32d4af38492ba68caaa16d1 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.2-py311h74b4f7c_0.conda#de8e36c9792f14eed7e11e672f03fbf0 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.1-nompi_py311h25b3b55_101.conda#936afeddfa3704eb834d0887b0838826 https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.8.0-pyha770c72_0.conda#1822e87a5d357f79c6aab871d86fb062 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py311h14de704_1.conda#27e5956e552c6e71f56cb1ec042617a8 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_0.conda#2cc61ba1dd53f0806247333f1294e058 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.1-py311h18e1886_0.conda#a54e480c5d7adceb6a84a16a29498449 -https://conda.anaconda.org/conda-forge/noarch/iris-3.9.0-pyha770c72_0.conda#efaf150eb009f04efa58f1401c767192 +https://conda.anaconda.org/conda-forge/noarch/iris-3.10.0-pyha770c72_1.conda#b7212cd8247ce909631fdcb77015914a https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_0.conda#9075bd8c033f0257122300db914e49c9 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_0.conda#b3bcc38c471ebb738854f52a36059b48 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_0.conda#e25640d692c02e8acfff0372f547e940 diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index dff69116..292a73b4 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -5,13 +5,13 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.7.4-hbcca054_0.conda#23ab7665c5f63cfb9f1f6195256daac6 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda#b80f2f396ca2c28b8c14c437a4ed1e74 -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-4_cp312.conda#dccc2d142812964fcc6abdc97b672dff +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda#0424ae29b104430108f5218a66db7260 https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_0.conda#ae061a5ed5f05818acdf9adab72c146d https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h77fa898_0.conda#ca0fad6a41ddaef54a153b78eccb5037 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.32.3-h4bc722e_0.conda#7624e34ee6baebfc80d67bac76cc9d9d +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.33.0-ha66036c_0.conda#b6927f788e85267beef6cbb292aaebdd https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.21-h4bc722e_0.conda#36ce76665bf67f5aac36be7a0d21b7f3 @@ -133,7 +133,7 @@ https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c7 https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda#d44e3b085abcaef02983c6305b84b584 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a -https://conda.anaconda.org/conda-forge/noarch/zipp-3.19.2-pyhd8ed1ab_0.conda#49808e59df5535116f6878b2a820d6f4 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.0-pyhd8ed1ab_0.conda#05b6bcb391b5be17374f7ad0aeedc479 https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.0-py312h1671c18_0.conda#33dee889f41b0ba6dbe5ddbe70ebf263 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.1-py312h41a817b_0.conda#4006636c39312dc42f8504475be3800f @@ -164,12 +164,12 @@ https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py312h01329cd_8.con https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda#ba9f7f0ec4f2a18de3e7bce67c4a431e -https://conda.anaconda.org/conda-forge/noarch/tox-4.17.1-pyhd8ed1ab_0.conda#4e9d4aead975d82afcc06caae91f196f +https://conda.anaconda.org/conda-forge/noarch/tox-4.18.0-pyhd8ed1ab_0.conda#d9fd7cdd9af0da9b217f1c31f03c930a https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h8572e83_4.conda#52c9e25ee0a32485a102eeecdb7eef52 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312h3483029_0.conda#eab52e88c858d87cf5a069f79d10bb50 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312h085067d_0.conda#864d9e92f012bcc49650428d5343c98a https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py312h8572e83_0.conda#12c6a831ef734f0b2dd4caff514cbb7f -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.0-pyhd8ed1ab_0.conda#bf68bf9ff9a18f1b17aa8c817225aee0 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.1-pyhd8ed1ab_0.conda#8fe3858b19843234b331d8459db3a7a1 https://conda.anaconda.org/conda-forge/noarch/identify-2.6.0-pyhd8ed1ab_0.conda#f80cc5989f445f23b1622d6c455896d9 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py312h98912ed_1.conda#d5273d1e67b7b3a871a0a711c6532a2f @@ -180,14 +180,14 @@ https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.5-py312h8413631_0.co https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py312h085067d_5.conda#b40cdf87aee69ccf162022579cb99afb https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.36.0-h762793a_0.conda#6d8c86d0368625b6503d696db70ea041 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.1-py312h854627b_2.conda#2a49f2a9c0447bc1bdaec98e3ee59117 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.2-py312h854627b_0.conda#a57b0ae7c0aac603839a4e83a3e997d6 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.1-nompi_py312h1ef7fb6_101.conda#c67cc8e3a34c5cb8920c79918112e96f https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.8.0-pyha770c72_0.conda#1822e87a5d357f79c6aab871d86fb062 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py312h1d6d2e6_1.conda#6392d3ce615ab0f32bc39b07f8f4c300 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_0.conda#2cc61ba1dd53f0806247333f1294e058 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.1-py312h085067d_0.conda#5f96475aa30552797f8099ccee24feaa -https://conda.anaconda.org/conda-forge/noarch/iris-3.9.0-pyha770c72_0.conda#efaf150eb009f04efa58f1401c767192 +https://conda.anaconda.org/conda-forge/noarch/iris-3.10.0-pyha770c72_1.conda#b7212cd8247ce909631fdcb77015914a https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_0.conda#9075bd8c033f0257122300db914e49c9 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_0.conda#b3bcc38c471ebb738854f52a36059b48 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_0.conda#e25640d692c02e8acfff0372f547e940 From c30a3e54798f9d1a5e2a23c1078fa9b86794b656 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 20 Aug 2024 17:59:37 +0100 Subject: [PATCH 353/583] chore: update pre-commit hooks (#523) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.5.7 → v0.6.1](https://github.com/astral-sh/ruff-pre-commit/compare/v0.5.7...v0.6.1) - [github.com/abravalheri/validate-pyproject: v0.18 → v0.19](https://github.com/abravalheri/validate-pyproject/compare/v0.18...v0.19) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a2183595..916f177f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -51,7 +51,7 @@ repos: - id: trailing-whitespace - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.5.7" + rev: "v0.6.1" hooks: - id: ruff types: [file, python] @@ -86,7 +86,7 @@ repos: - repo: https://github.com/abravalheri/validate-pyproject # More exhaustive than Ruff RUF200. - rev: "v0.18" + rev: "v0.19" hooks: - id: validate-pyproject From 602d914f38d0f9647bc45fc46f809e7c1dcafcbb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Aug 2024 11:53:58 +0100 Subject: [PATCH 354/583] Bump scitools/workflows in the dependencies group (#524) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2024.08.1 to 2024.08.2 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2024.08.1...2024.08.2) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 6f9bf492..b4c101bd 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.08.1 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.08.2 diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 5731ed0c..d7512731 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.08.1 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.08.2 secrets: inherit From 9d29fffba3bab75f93f7fee8467bbf86b14e2655 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Sat, 24 Aug 2024 21:16:27 +0100 Subject: [PATCH 355/583] Updated environment lockfiles (#525) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 22 +++++++++++----------- requirements/locks/py311-linux-64.lock | 22 +++++++++++----------- requirements/locks/py312-linux-64.lock | 22 +++++++++++----------- 3 files changed, 33 insertions(+), 33 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 12f39063..ca19de8d 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -11,7 +11,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_0.conda# https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h77fa898_0.conda#ca0fad6a41ddaef54a153b78eccb5037 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.33.0-ha66036c_0.conda#b6927f788e85267beef6cbb292aaebdd +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.33.1-heb4867d_0.conda#0d3c60291342c0c025db231353376dfb https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.21-h4bc722e_0.conda#36ce76665bf67f5aac36be7a0d21b7f3 @@ -28,7 +28,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.co https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4bc722e_2.conda#e1b454497f9f7c1147fdde4b53f1b512 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-hb9d3cd8_3.conda#6c566a46baae794daf34775d41eb180a https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a @@ -54,7 +54,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#0 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda#18aa975d2094c34aef978060ae7da7d8 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 -https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.16-hd590300_0.conda#151cba22b85a989c2d6ef9633ffee1e4 +https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.16-hb9d3cd8_1.conda#3601598f0db0470af28985e3e7ad0158 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 @@ -81,7 +81,7 @@ https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.5.0-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda#6732fa52eb8e66e5afeb32db8701a791 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hc6cd4ac_1.conda#1f95722c94f00b69af69a066c7433714 -https://conda.anaconda.org/conda-forge/noarch/cachetools-5.4.0-pyhd8ed1ab_0.conda#c55fbbc5bac8e9efbba71c0d1ed57713 +https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.0-pyhd8ed1ab_0.conda#5bad039db72bd8f134a5cff3ebaa190d https://conda.anaconda.org/conda-forge/noarch/certifi-2024.7.4-pyhd8ed1ab_0.conda#24e7fd6ca65997938fff9e5ab6f653e4 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2#ebb5f5f7dc4f1a3780ef7ea7738db08c https://conda.anaconda.org/conda-forge/linux-64/chardet-5.2.0-py310hff52083_1.conda#a677136a83b823803d2f92045f885be2 @@ -99,7 +99,7 @@ https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda# https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.6.1-pyhff2d567_0.conda#996bf792cdb8c0ac38ff54b9fde56841 https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2#9f765cbfab6870c8435b9eefecd7a1f4 -https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda#c0cc1420498b17414d8617d0b9f506ca +https://conda.anaconda.org/conda-forge/noarch/idna-3.8-pyhd8ed1ab_0.conda#99e164522f6bdf23c177c8d9ae63f975 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.4.0-pyhd8ed1ab_0.tar.bz2#18ee9c07cf945a33f92caf1ee3d23ad9 @@ -119,10 +119,10 @@ https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 -https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py310h2372a71_0.conda#b631b889b0b4bc2fca7b8b977ca484b2 +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py310h5b4e0ec_0.conda#9bd328236a2db02a858d1d5c913536db https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py310h5b4e0ec_0.conda#ad8de7b4ac482217959cc1e8fe0cc56d -https://conda.anaconda.org/conda-forge/noarch/setuptools-72.1.0-pyhd8ed1ab_0.conda#e06d4c26df4f958a8d38696f2c344d15 +https://conda.anaconda.org/conda-forge/noarch/setuptools-72.2.0-pyhd8ed1ab_0.conda#1462aa8b243aad09ef5d0841c745eb89 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 @@ -141,7 +141,7 @@ https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.1-py310h5b4e0ec_0.c https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.1-py310h5b4e0ec_0.conda#2c5257cb35d1946f5e80a0cfd69ed7ec https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.2.0-pyha770c72_0.conda#c261d14fc7f49cdd403868998a18c318 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.4.0-pyha770c72_0.conda#6e3dbc422d3749ad72659243d6ac8b2b https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-23_linux64_openblas.conda#eede29b40efa878cbe5bdcb767e97310 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-ha6d2627_1004.conda#df069bea331c8486ac21814969301c1f @@ -158,7 +158,7 @@ https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_ https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.3-pyhd8ed1ab_0.conda#284008712816c64c85bf2b7fa9f3b264 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h4bc722e_1.conda#749baebe7e2ff3360630e069175e528b https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.2.0-hd8ed1ab_0.conda#0fd030dce707a6654472cf7619b0b01b +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.4.0-hd8ed1ab_0.conda#01b7411c765c3d863dcc920207f258bd https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h135f659_114.conda#a908e463c710bd6b10a9eaa89fdf003c https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py310hb13e2d6_0.conda#6593de64c935768b6bad3e19b3e978be https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py310h8efdad9_8.conda#141894c09837c83a396fce6eb629c1ab @@ -175,9 +175,9 @@ https://conda.anaconda.org/conda-forge/noarch/identify-2.6.0-pyhd8ed1ab_0.conda# https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py310h2372a71_1.conda#dfcf64f67961eb9686676f96fdb4b4d1 https://conda.anaconda.org/conda-forge/noarch/nox-2024.4.15-pyhff2d567_0.conda#600c0de12125f473d8099c0b3e6f88d4 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.0-py310h93e2701_1.conda#c6b2a8134aa49940afe552f69bdef957 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.1-py310ha3fb0e1_0.conda#dcca3051fda0f861e8111c6368842a28 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.1.0-hd8ed1ab_0.conda#7ed7b077f6c6ebcb5fc66f23985df487 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.5-py310h019a838_0.conda#2902ec08257b19d75d08a375cdc37c2c +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.6-py310h019a838_0.conda#3cc218355d15acfa3680fb913048d79f https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py310h261611a_5.conda#643414a9f73226b2a6a43a4800734d3b https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.36.0-h762793a_0.conda#6d8c86d0368625b6503d696db70ea041 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 54c93407..86bc7a94 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -11,7 +11,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_0.conda# https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h77fa898_0.conda#ca0fad6a41ddaef54a153b78eccb5037 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.33.0-ha66036c_0.conda#b6927f788e85267beef6cbb292aaebdd +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.33.1-heb4867d_0.conda#0d3c60291342c0c025db231353376dfb https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.21-h4bc722e_0.conda#36ce76665bf67f5aac36be7a0d21b7f3 @@ -28,7 +28,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.co https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4bc722e_2.conda#e1b454497f9f7c1147fdde4b53f1b512 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-hb9d3cd8_3.conda#6c566a46baae794daf34775d41eb180a https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a @@ -54,7 +54,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#0 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda#18aa975d2094c34aef978060ae7da7d8 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 -https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.16-hd590300_0.conda#151cba22b85a989c2d6ef9633ffee1e4 +https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.16-hb9d3cd8_1.conda#3601598f0db0470af28985e3e7ad0158 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 @@ -81,7 +81,7 @@ https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.5.0-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda#6732fa52eb8e66e5afeb32db8701a791 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hb755f60_1.conda#cce9e7c3f1c307f2a5fb08a2922d6164 -https://conda.anaconda.org/conda-forge/noarch/cachetools-5.4.0-pyhd8ed1ab_0.conda#c55fbbc5bac8e9efbba71c0d1ed57713 +https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.0-pyhd8ed1ab_0.conda#5bad039db72bd8f134a5cff3ebaa190d https://conda.anaconda.org/conda-forge/noarch/certifi-2024.7.4-pyhd8ed1ab_0.conda#24e7fd6ca65997938fff9e5ab6f653e4 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2#ebb5f5f7dc4f1a3780ef7ea7738db08c https://conda.anaconda.org/conda-forge/linux-64/chardet-5.2.0-py311h38be061_1.conda#b8cfb13de4dbe349a41800644391de6a @@ -99,7 +99,7 @@ https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda# https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.6.1-pyhff2d567_0.conda#996bf792cdb8c0ac38ff54b9fde56841 https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2#9f765cbfab6870c8435b9eefecd7a1f4 -https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda#c0cc1420498b17414d8617d0b9f506ca +https://conda.anaconda.org/conda-forge/noarch/idna-3.8-pyhd8ed1ab_0.conda#99e164522f6bdf23c177c8d9ae63f975 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.4.0-pyhd8ed1ab_0.tar.bz2#18ee9c07cf945a33f92caf1ee3d23ad9 @@ -119,10 +119,10 @@ https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 -https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py311h459d7ec_0.conda#60b5332b3989fda37884b92c7afd6a91 +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py311h61187de_0.conda#44bac99d0125c748894b9ffb6ce97811 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py311h61187de_0.conda#76439451605390254b85d8da6f8d962a -https://conda.anaconda.org/conda-forge/noarch/setuptools-72.1.0-pyhd8ed1ab_0.conda#e06d4c26df4f958a8d38696f2c344d15 +https://conda.anaconda.org/conda-forge/noarch/setuptools-72.2.0-pyhd8ed1ab_0.conda#1462aa8b243aad09ef5d0841c745eb89 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 @@ -140,7 +140,7 @@ https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.1-py311h61187de_0.c https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.1-py311h61187de_0.conda#bcbe6c9db1c25900c3808b8974e1bb90 https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.2.0-pyha770c72_0.conda#c261d14fc7f49cdd403868998a18c318 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.4.0-pyha770c72_0.conda#6e3dbc422d3749ad72659243d6ac8b2b https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-23_linux64_openblas.conda#eede29b40efa878cbe5bdcb767e97310 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-ha6d2627_1004.conda#df069bea331c8486ac21814969301c1f @@ -157,7 +157,7 @@ https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_ https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.3-pyhd8ed1ab_0.conda#284008712816c64c85bf2b7fa9f3b264 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h4bc722e_1.conda#749baebe7e2ff3360630e069175e528b https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.2.0-hd8ed1ab_0.conda#0fd030dce707a6654472cf7619b0b01b +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.4.0-hd8ed1ab_0.conda#01b7411c765c3d863dcc920207f258bd https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h135f659_114.conda#a908e463c710bd6b10a9eaa89fdf003c https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.conda#a502d7aad449a1206efb366d6a12c52d https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311ha1c4eca_8.conda#5e89d863aff561261ef8f3c7ed29d6e8 @@ -174,9 +174,9 @@ https://conda.anaconda.org/conda-forge/noarch/identify-2.6.0-pyhd8ed1ab_0.conda# https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py311h459d7ec_1.conda#45b8d355bbcdd27588c2d266bcfdff84 https://conda.anaconda.org/conda-forge/noarch/nox-2024.4.15-pyhff2d567_0.conda#600c0de12125f473d8099c0b3e6f88d4 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.0-py311h517d4fd_1.conda#481fd009b2d863f526f60ca19cb7880b +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.1-py311he1f765f_0.conda#eb7e2a849cd47483d7e9eeb728c7a8c5 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.1.0-hd8ed1ab_0.conda#7ed7b077f6c6ebcb5fc66f23985df487 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.5-py311h5925939_0.conda#105ce0d9e7aa0324031a3abaf9ec71f7 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.6-py311h5925939_0.conda#651516baf63771ee70a7d613efd11e0e https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h18e1886_5.conda#6cd3facab7a79de14abb1a86a2d830fa https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.36.0-h762793a_0.conda#6d8c86d0368625b6503d696db70ea041 diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 292a73b4..d2e523f3 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -11,7 +11,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_0.conda# https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h77fa898_0.conda#ca0fad6a41ddaef54a153b78eccb5037 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.33.0-ha66036c_0.conda#b6927f788e85267beef6cbb292aaebdd +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.33.1-heb4867d_0.conda#0d3c60291342c0c025db231353376dfb https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.21-h4bc722e_0.conda#36ce76665bf67f5aac36be7a0d21b7f3 @@ -28,7 +28,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.co https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4bc722e_2.conda#e1b454497f9f7c1147fdde4b53f1b512 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-hb9d3cd8_3.conda#6c566a46baae794daf34775d41eb180a https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a @@ -54,7 +54,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#0 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda#18aa975d2094c34aef978060ae7da7d8 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 -https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.16-hd590300_0.conda#151cba22b85a989c2d6ef9633ffee1e4 +https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.16-hb9d3cd8_1.conda#3601598f0db0470af28985e3e7ad0158 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 @@ -81,7 +81,7 @@ https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.5.0-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda#6732fa52eb8e66e5afeb32db8701a791 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h30efb56_1.conda#45801a89533d3336a365284d93298e36 -https://conda.anaconda.org/conda-forge/noarch/cachetools-5.4.0-pyhd8ed1ab_0.conda#c55fbbc5bac8e9efbba71c0d1ed57713 +https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.0-pyhd8ed1ab_0.conda#5bad039db72bd8f134a5cff3ebaa190d https://conda.anaconda.org/conda-forge/noarch/certifi-2024.7.4-pyhd8ed1ab_0.conda#24e7fd6ca65997938fff9e5ab6f653e4 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2#ebb5f5f7dc4f1a3780ef7ea7738db08c https://conda.anaconda.org/conda-forge/linux-64/chardet-5.2.0-py312h7900ff3_1.conda#af3980cc4690716a5510c8a08cb06238 @@ -99,7 +99,7 @@ https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda# https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.6.1-pyhff2d567_0.conda#996bf792cdb8c0ac38ff54b9fde56841 https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2#9f765cbfab6870c8435b9eefecd7a1f4 -https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda#c0cc1420498b17414d8617d0b9f506ca +https://conda.anaconda.org/conda-forge/noarch/idna-3.8-pyhd8ed1ab_0.conda#99e164522f6bdf23c177c8d9ae63f975 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.4.0-pyhd8ed1ab_0.tar.bz2#18ee9c07cf945a33f92caf1ee3d23ad9 @@ -119,10 +119,10 @@ https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 -https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py312h98912ed_0.conda#a8f9739e0ada2320148c92ddd608864f +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h41a817b_0.conda#82f34b1b827ffd579547fce6fe6e3157 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h41a817b_0.conda#1779c9cbd9006415ab7bb9e12747e9d1 -https://conda.anaconda.org/conda-forge/noarch/setuptools-72.1.0-pyhd8ed1ab_0.conda#e06d4c26df4f958a8d38696f2c344d15 +https://conda.anaconda.org/conda-forge/noarch/setuptools-72.2.0-pyhd8ed1ab_0.conda#1462aa8b243aad09ef5d0841c745eb89 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 @@ -140,7 +140,7 @@ https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.1-py312h41a817b_0.c https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.1-py312h41a817b_0.conda#da921c56bcf69a8b97216ecec0cc4015 https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.2.0-pyha770c72_0.conda#c261d14fc7f49cdd403868998a18c318 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.4.0-pyha770c72_0.conda#6e3dbc422d3749ad72659243d6ac8b2b https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-23_linux64_openblas.conda#eede29b40efa878cbe5bdcb767e97310 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-ha6d2627_1004.conda#df069bea331c8486ac21814969301c1f @@ -157,7 +157,7 @@ https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_ https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.3-pyhd8ed1ab_0.conda#284008712816c64c85bf2b7fa9f3b264 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h4bc722e_1.conda#749baebe7e2ff3360630e069175e528b https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.2.0-hd8ed1ab_0.conda#0fd030dce707a6654472cf7619b0b01b +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.4.0-hd8ed1ab_0.conda#01b7411c765c3d863dcc920207f258bd https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h135f659_114.conda#a908e463c710bd6b10a9eaa89fdf003c https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda#d8285bea2a350f63fab23bf460221f3f https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py312h01329cd_8.conda#ca4d166cb45c07aff3bee9091866c7dd @@ -174,9 +174,9 @@ https://conda.anaconda.org/conda-forge/noarch/identify-2.6.0-pyhd8ed1ab_0.conda# https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py312h98912ed_1.conda#d5273d1e67b7b3a871a0a711c6532a2f https://conda.anaconda.org/conda-forge/noarch/nox-2024.4.15-pyhff2d567_0.conda#600c0de12125f473d8099c0b3e6f88d4 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.0-py312hc2bc53b_1.conda#eae80145f63aa04a02dda456d4883b46 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.1-py312h7d485d2_0.conda#7418a22e73008356d9aba99d93dfeeee https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.1.0-hd8ed1ab_0.conda#7ed7b077f6c6ebcb5fc66f23985df487 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.5-py312h8413631_0.conda#3e67354b24c7ee057ddee367f310ad3e +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.6-py312h8413631_0.conda#e82236100a899ce6504435fbc8c48f63 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py312h085067d_5.conda#b40cdf87aee69ccf162022579cb99afb https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.36.0-h762793a_0.conda#6d8c86d0368625b6503d696db70ea041 From 38fe5969c0b4e92c5efcd2e6d10c883ec2123db6 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 21:45:01 +0100 Subject: [PATCH 356/583] chore: update pre-commit hooks (#526) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.6.1 → v0.6.2](https://github.com/astral-sh/ruff-pre-commit/compare/v0.6.1...v0.6.2) - [github.com/pre-commit/mirrors-mypy: v1.11.1 → v1.11.2](https://github.com/pre-commit/mirrors-mypy/compare/v1.11.1...v1.11.2) - [github.com/scientific-python/cookie: 2024.04.23 → 2024.08.19](https://github.com/scientific-python/cookie/compare/2024.04.23...2024.08.19) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 916f177f..5039d0d8 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -51,7 +51,7 @@ repos: - id: trailing-whitespace - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.6.1" + rev: "v0.6.2" hooks: - id: ruff types: [file, python] @@ -79,7 +79,7 @@ repos: types: [file, python] - repo: https://github.com/pre-commit/mirrors-mypy - rev: 'v1.11.1' + rev: 'v1.11.2' hooks: - id: mypy exclude: 'noxfile\.py|docs/conf\.py' @@ -91,7 +91,7 @@ repos: - id: validate-pyproject - repo: https://github.com/scientific-python/cookie - rev: 2024.04.23 + rev: 2024.08.19 hooks: - id: sp-repo-review additional_dependencies: ["repo-review[cli]"] From 83fa2521254332040496c1c68052c8eaa54fcd2b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Aug 2024 11:57:19 +0100 Subject: [PATCH 357/583] Bump scitools/workflows in the dependencies group (#527) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2024.08.2 to 2024.08.3 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2024.08.2...2024.08.3) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index b4c101bd..863bdbb9 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.08.2 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.08.3 diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index d7512731..21772970 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.08.2 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.08.3 secrets: inherit From ed1964b9fe9f425c504e1eb4e740a4696c7032b6 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Fri, 30 Aug 2024 13:28:42 +0100 Subject: [PATCH 358/583] Whatsnew updates for v0.20.0 . (#528) * Whatsnew updates for v0.20.0 . * Further improvements * Adjust version on main page. * Fix issue/pr ref * Update docs/ref/release_notes.rst Co-authored-by: Martin Yeo <40734014+trexfeathers@users.noreply.github.com> * Update docs/ref/release_notes.rst Co-authored-by: Martin Yeo <40734014+trexfeathers@users.noreply.github.com> * Further whatsnew updates --------- Co-authored-by: Martin Yeo <40734014+trexfeathers@users.noreply.github.com> --- docs/index.rst | 4 +- docs/ref/release_notes.rst | 195 +++++++++++++++++++++++++++++++++++-- 2 files changed, 189 insertions(+), 10 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index f8fceba9..2ee20638 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -3,8 +3,8 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -Iris-grib v0.20 (unreleased) -============================ +Iris-grib v0.20 +=============== The library ``iris-grib`` provides functionality for converting between weather and climate datasets that are stored as GRIB files and Iris :class:`~iris.cube.Cube`\s. diff --git a/docs/ref/release_notes.rst b/docs/ref/release_notes.rst index b27c08b4..deed099d 100644 --- a/docs/ref/release_notes.rst +++ b/docs/ref/release_notes.rst @@ -10,49 +10,227 @@ What's new in iris-grib v0.20.0 ------------------------------- :Release: 0.20.0 -:Date: [unreleased] +:Date: 29 August 2024 Features ^^^^^^^^ +* `@abooton `_ added support for saving data on a + Lambert Azimuthal Equal Area (LAEA) projection, as grid definition template 3.140. + `(ISSUE#344) `_, + `(PR#343) `_ + * `@trexfeathers `_, `@mo-marqh `_ and `@pp-mo `_ added support for production definition template 4.6, i.e. percentile forecasts. - `(PR#401) `_ + `(PR#401) `_, + `(PR#295) `_, + `(PR#271) `_ * `@pp-mo `_ expanded the use of the "GRIB_PARAM" - attributes to GRIB1 loading, and document it more thoroughly. + attributes to GRIB1 loading, and documented it more thoroughly. `(ISSUE#330) `_, `(PR#402) `_ * `@DPeterK `_ and `@trexfeathers `_ added saving support for grid definition template 20 - polar stereographic. + `(ISSUE#122) `_, `(PR#405) `_ Documentation ^^^^^^^^^^^^^ +* `@tkknight `_ fixed docs building on ReadTheDocs, and + enabled a test docs-build for each individual PR. + `(ISSUE#365) `_, + `(PR#366) `_ + +* `@tkknight `_ made docs builds treat warnings as errors. + `(PR#471) `_ + * `@pp-mo `_ reworked the main docs page to : headline basic load + save with Iris, rather than lower-level functions; better explain load-pairs and save-pairs usage; make all usage examples into doctests. - `(ISSUE#398) `_ + `(ISSUE#398) `_, + `(PR#402) `_ + +* `@bjlittle `_ updated the readme, replacing README.rst + with README.md and adding a logo . + `(PR#440) `_, + `(PR#447) `_ + +* `@tkknight `_ fixed the display formatting of linux + commands. + `(PR#455) `_ + Dependencies ^^^^^^^^^^^^ -* `@bjlittle `_ migrated to ``pytest``. - `(PR#420) `_ - * `@pp-mo `_ enabled support for `eccodes v2.36 `_. Eccodes v2.36 has implemented some backwards incompatible changes : The ``indicatorOfUnitOfTimeRange`` key was removed, to be replaced with - ``indicatorOfUnitForForecastTime`` (but only in GRIB v2 messages only, not GRIB 1); + ``indicatorOfUnitForForecastTime`` (but only in GRIB v2 messages, not GRIB 1); and the ``iScansPositively`` and ``jScansPositively`` keys became read-only. The resulting changes mean **we now only support eccodes >=2.33**. `(PR#504) `_ +* `@bjlittle `_ added iris-sample-data as a dependency, + as required for doctests. + `(PR#413) `_ + +* `@pp-mo `_ made essential changes for compatibility with + Iris >= 3.10. + `(PR#463) `_ + + +Internal +^^^^^^^^ +* `@trexfeathers `_ updated CONTRIBUTING.md in line with the + newer v5 SciTools CLA. `(PR#371) `_ + +* `@pp-mo `_ updated an obsolete license header in one test. + `(PR#374) `_ + +* `@trexfeathers `_ and + `@pp-mo `_ added a pre-commit configuration and got all + checks passing. + `(ISSUE#388) `_, + `(PR#400) `_, + `(PR#406) `_ + +* `@HGWright `_ and + `@trexfeathers `_ replaced setup.py with + pyproject.toml. + `(ISSUE#387) `_, + `(PR#408) `_, + `(PR#429) `_ + +* `@stephenworsley `_ configured for MyPy checking via + pre-commit. + `(ISSUE#386) `_, + `(PR#407) `_ + +* `@ESadek-MO `_ and + `@bjlittle `_ migrated CI testing from Cirrus to + GitHub Actions. + `(ISSUE#340) `_, + `(PR#415) `_, + `(PR#425) `_, + `(PR#432) `_ + +* `@trexfeathers `_ and + `@HGWright `_ adopted Ruff for code style checking. + `(ISSUE#384) `_, + `(PR#430) `_, + `(PR#419) `_ + +* `@bjlittle `_ migrated the test runs from + nose to pytest. + `(ISSUE#253) `_, + `(ISSUE#412) `_, + `(PR#420) `_, + `(PR#424) `_ + +* `@stephenworsley `_ removed the now-redundant + _iris_mercator_support.py. + `(ISSUE#431) `_, + `(PR#433) `_, + `(PR#435) `_ + +* `@bjlittle `_ added build manifest checking in GHA. + `(PR#427) `_, + `(PR#436) `_, + `(PR#441) `_ + +* `@bjlittle `_ added dependabot checking. + `(PR#426) `_ + +* `@bjlittle `_ removed 'wheel' dependency from build + system, as-per + `repo-review `_. + `(PR#437) `_ + +* `@bjlittle `_ fixed blacken-docs url in pre-commit, + as per + `repo-review `_. + `(PR#438) `_ + +* `@bjlittle `_ provided a custom per-commit.ci message, + as per + `repo-review `_. + `(PR#439) `_ + +* `@pp-mo `_ removed obsolete workaround routines relating to + older eccodes versions. + `(ISSUE#239) `_, + `(PR#410) `_ + +* `@HGWright `_ implemented version handling with + setuptools.scm . + `(ISSUE#418) `_, + `(PR#444) `_ + +* `@bjlittle `_ moved the top-level ``./iris_grib`` folder + to ``./src/iris_grib``, in line with modern practice, as per + `repo-review `_. + `(ISSUE#421) `_, + `(PR#450) `_ + +* `@bjlittle `_ adopted .git-blame-ignore-revs to exclude + some very noisy PRs from file "blame" views + `(PR#452) `_ + +* `@bjlittle `_ dropped Python 3.9 support and added 3.12, + in accordance with `nep29 `_. + `(PR#453) `_ + +* `@bjlittle `_ updated all optional dependency + requirements, and added codecov support. + `(PR#454) `_, + `(PR#459) `_ + +* `@bjlittle `_ added repository health checking with + `repo-review `_ + via pre-commit. + `(ISSUE#392) `_, + `(PR#456) `_ + +* `@bjlittle `_ added a CODE_OF_CONDUCT.md . + `(PR#460) `_ + +* `@bjlittle `_ aligned .gitignore with a suggested + standard form + `(PR#461) `_ + +* `@bjlittle `_ fixed some spelling errors to satisfy + codespell + `(PR#479) `_ + +* `@githubalexliu `_ fixed a problem with the MyPy + checking. + `(ISSUE#496) `_, + `(PR#497) `_ + +* `@trexfeathers `_ aligned the pre-commit-config with + the SciTools "reference" version. + `(PR#464) `_, + + +New Contributors +^^^^^^^^^^^^^^^^ +Welcome to + +* `@abooton `_ +* `@githubalexliu `_ +* `@stephenworsley `_ +* `@tkknight `_ fixed the display formatting of linux +* `@DPeterK `_ +* `@ESadek-MO `_ +* `@HGWright `_ + What's new in iris-grib v0.19.1 ------------------------------- @@ -130,6 +308,7 @@ Dependencies New Contributors ^^^^^^^^^^^^^^^^ Welcome to + * `@s-boardman `_ * `@david-bentley `_ * `@valeriupredoi `_ From 1eec6a6af05d8d40080e9669a0cedc693a4809fe Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Sat, 31 Aug 2024 13:17:06 +0100 Subject: [PATCH 359/583] Updated environment lockfiles (#529) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 41 ++++++++++++++------------ requirements/locks/py311-linux-64.lock | 41 ++++++++++++++------------ requirements/locks/py312-linux-64.lock | 41 ++++++++++++++------------ 3 files changed, 66 insertions(+), 57 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index ca19de8d..599c0921 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -3,13 +3,16 @@ # input_hash: 4b79cfcae8adfdca32dfc1151f0085dbb2a52a32b9d8bcaa79abfaa5ca75f98b @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.7.4-hbcca054_0.conda#23ab7665c5f63cfb9f1f6195256daac6 +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.8.30-hbcca054_0.conda#c27d1c142233b5bc9ca570c6e2e0c244 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda#b80f2f396ca2c28b8c14c437a4ed1e74 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-5_cp310.conda#2921c34715e74b3587b4cff4d36844f9 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_0.conda#ae061a5ed5f05818acdf9adab72c146d +https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda#8bfdead4e0fff0383ae4c9c50d0531bd +https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_1.conda#23c255b008c4f2ae008f81edcabaca89 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h77fa898_0.conda#ca0fad6a41ddaef54a153b78eccb5037 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.1.0-h77fa898_1.conda#002ef4463dd1e2b44a94a4ace468f5d2 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h69a702a_1.conda#1efc0ad219877a73ef977af7dbb51f17 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.1.0-hc5f4f2c_1.conda#10a0cef64b784d6ab6da50ebca4e984d +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.1.0-hc0a3c3a_1.conda#9dbb9699ea467983ba8a4ba89b08b066 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.33.1-heb4867d_0.conda#0d3c60291342c0c025db231353376dfb https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 @@ -18,16 +21,16 @@ https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.21-h4bc722e_0.conda https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.1.0-hc5f4f2c_0.conda#6456c2620c990cd8dde2428a27ba0bc5 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.1.0-h69a702a_1.conda#591e631bc1ae62c64f2ab4f66178c097 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.1.0-hc0a3c3a_0.conda#1cb187a157136398ddbaae90713e2498 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.1.0-h4852527_1.conda#bd2598399a70bb86d8218e95548d735e https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda#70caf8bb6cf39a0b6b7efc885f51c0fe https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-hb9d3cd8_3.conda#6c566a46baae794daf34775d41eb180a https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b @@ -47,7 +50,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.1.0-h69a702a_0.conda#f4ca84fbd6d06b0a052fb2d5b96dde41 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.1.0-h69a702a_1.conda#16cec94c5992d7f42ae3f9fa8b25df8d https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae @@ -84,12 +87,12 @@ https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hc6cd4a https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.0-pyhd8ed1ab_0.conda#5bad039db72bd8f134a5cff3ebaa190d https://conda.anaconda.org/conda-forge/noarch/certifi-2024.7.4-pyhd8ed1ab_0.conda#24e7fd6ca65997938fff9e5ab6f653e4 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2#ebb5f5f7dc4f1a3780ef7ea7738db08c -https://conda.anaconda.org/conda-forge/linux-64/chardet-5.2.0-py310hff52083_1.conda#a677136a83b823803d2f92045f885be2 +https://conda.anaconda.org/conda-forge/linux-64/chardet-5.2.0-py310hff52083_2.conda#e94bf593fe645f6b85a9c8b2d52caae6 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.conda#753d29fe41bb881e4b9c004f0abf973f https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 -https://conda.anaconda.org/conda-forge/linux-64/colorlog-6.8.2-py310hff52083_0.conda#db1be62a6a5d51f5a36fb99b2cc12972 +https://conda.anaconda.org/conda-forge/linux-64/colorlog-6.8.2-py310hff52083_1.conda#135e349cbfd9fc63061800d3e13936ab https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py310hff52083_3.conda#c159dcd29bbd80b187b1c5d5f73cc971 @@ -103,12 +106,12 @@ https://conda.anaconda.org/conda-forge/noarch/idna-3.8-pyhd8ed1ab_0.conda#99e164 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 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/kiwisolver-1.4.5-py310hd41b1e2_1.conda#b8d67603d43b23ce7e988a5d81a7ab79 +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py310h3788b33_2.conda#48c1eab50327b5d002d8cf8f53c4ca34 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-23_linux64_openblas.conda#96c8450a40aa2b9733073a9460de972c https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.9.1-hdb1bdb2_0.conda#7da1d242ca3591e174a3c7d82230d3c0 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py310h2372a71_0.conda#f6703fa0214a00bf49d1bef6dc7672d0 +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py310ha75aee5_1.conda#14ae296598aab54a26ab8c095f57db10 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db @@ -116,7 +119,7 @@ https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.2-pyhd8ed1ab_0.co https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda#b7f5c092b8f9800150d998a71b76d5a1 -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.4-pyhd8ed1ab_0.conda#4d91352a50949d049cf9714c8563d433 https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py310h5b4e0ec_0.conda#9bd328236a2db02a858d1d5c913536db @@ -134,10 +137,10 @@ https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py310h2372a7 https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda#d44e3b085abcaef02983c6305b84b584 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a -https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.0-pyhd8ed1ab_0.conda#05b6bcb391b5be17374f7ad0aeedc479 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.1-pyhd8ed1ab_0.conda#74a4befb4b38897e19a107693e49da20 https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e -https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.0-py310h2fdcea3_0.conda#6ac912f6208a15d35955ab73a4e5efda -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.1-py310h5b4e0ec_0.conda#9767c8416fd3b2197dbfedd5ea971337 +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.0-py310h8deb56e_1.conda#6d9cb6134a936dbb7fae44cd21d8d9fc +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.1-py310ha75aee5_1.conda#69521d4acef78a85e81ddf512977157b https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.1-py310h5b4e0ec_0.conda#2c5257cb35d1946f5e80a0cfd69ed7ec https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 @@ -149,7 +152,7 @@ https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-23_linux64_openb https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda#dfe0528d0f1c16c1f7c528ea5536ab30 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.4.0-py310hebfe307_0.conda#89d70dfe2d59edcefc3881be6bff33a6 -https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyhd8ed1ab_0.conda#6721aef6bfe5937abe70181545dd2c51 +https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda#6c78fbb8ddfd64bcb55b5cbafd2d2c43 https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.1-h54d7996_1.conda#e479d1991c725e1a355f33c0e40dbc66 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.7.1-pyhd8ed1ab_0.conda#8e2946459d7f721f8e85b6db185d6338 https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.2-pyhd8ed1ab_0.conda#e010a224b90f1f623a917c35addbb924 @@ -169,8 +172,8 @@ https://conda.anaconda.org/conda-forge/noarch/tox-4.18.0-pyhd8ed1ab_0.conda#d9fd https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310hd41b1e2_4.conda#35e87277fba9944b8a975113538bb5df https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310h64cae3c_0.conda#b527de1849629f2635dafc77745b015a https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310h261611a_0.conda#5c0e2cd80ceab2ac5201459cc016b88b -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py310hd41b1e2_0.conda#60ee50b1968f802f2a487ba36d4cce0d -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.1-pyhd8ed1ab_0.conda#8fe3858b19843234b331d8459db3a7a1 +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.0-py310h3788b33_0.conda#a5a6c54a0d6cf32736ede926fad0bc95 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 https://conda.anaconda.org/conda-forge/noarch/identify-2.6.0-pyhd8ed1ab_0.conda#f80cc5989f445f23b1622d6c455896d9 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py310h2372a71_1.conda#dfcf64f67961eb9686676f96fdb4b4d1 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 86bc7a94..2df116db 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -3,13 +3,16 @@ # input_hash: fe5452e41de90dae4e169a25fead307770c576d24c6b8b5ccaf1c6db315e8ae0 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.7.4-hbcca054_0.conda#23ab7665c5f63cfb9f1f6195256daac6 +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.8.30-hbcca054_0.conda#c27d1c142233b5bc9ca570c6e2e0c244 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda#b80f2f396ca2c28b8c14c437a4ed1e74 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-5_cp311.conda#139a8d40c8a2f430df31048949e450de -https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_0.conda#ae061a5ed5f05818acdf9adab72c146d +https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda#8bfdead4e0fff0383ae4c9c50d0531bd +https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_1.conda#23c255b008c4f2ae008f81edcabaca89 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h77fa898_0.conda#ca0fad6a41ddaef54a153b78eccb5037 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.1.0-h77fa898_1.conda#002ef4463dd1e2b44a94a4ace468f5d2 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h69a702a_1.conda#1efc0ad219877a73ef977af7dbb51f17 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.1.0-hc5f4f2c_1.conda#10a0cef64b784d6ab6da50ebca4e984d +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.1.0-hc0a3c3a_1.conda#9dbb9699ea467983ba8a4ba89b08b066 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.33.1-heb4867d_0.conda#0d3c60291342c0c025db231353376dfb https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 @@ -18,16 +21,16 @@ https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.21-h4bc722e_0.conda https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.1.0-hc5f4f2c_0.conda#6456c2620c990cd8dde2428a27ba0bc5 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.1.0-h69a702a_1.conda#591e631bc1ae62c64f2ab4f66178c097 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.1.0-hc0a3c3a_0.conda#1cb187a157136398ddbaae90713e2498 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.1.0-h4852527_1.conda#bd2598399a70bb86d8218e95548d735e https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda#70caf8bb6cf39a0b6b7efc885f51c0fe https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-hb9d3cd8_3.conda#6c566a46baae794daf34775d41eb180a https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b @@ -47,7 +50,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.1.0-h69a702a_0.conda#f4ca84fbd6d06b0a052fb2d5b96dde41 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.1.0-h69a702a_1.conda#16cec94c5992d7f42ae3f9fa8b25df8d https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae @@ -84,12 +87,12 @@ https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hb755f6 https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.0-pyhd8ed1ab_0.conda#5bad039db72bd8f134a5cff3ebaa190d https://conda.anaconda.org/conda-forge/noarch/certifi-2024.7.4-pyhd8ed1ab_0.conda#24e7fd6ca65997938fff9e5ab6f653e4 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2#ebb5f5f7dc4f1a3780ef7ea7738db08c -https://conda.anaconda.org/conda-forge/linux-64/chardet-5.2.0-py311h38be061_1.conda#b8cfb13de4dbe349a41800644391de6a +https://conda.anaconda.org/conda-forge/linux-64/chardet-5.2.0-py311h38be061_2.conda#00f0ad2aed7e65c9392a067ce7882b28 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.conda#753d29fe41bb881e4b9c004f0abf973f https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 -https://conda.anaconda.org/conda-forge/linux-64/colorlog-6.8.2-py311h38be061_0.conda#69ddfed4db722e2b6ab93dd6c66df163 +https://conda.anaconda.org/conda-forge/linux-64/colorlog-6.8.2-py311h38be061_1.conda#031e8b480898f5c6c36eab8814d2d48d https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py311h38be061_3.conda#1c33f55e5cdcc2a2b973c432b5225bfe @@ -103,12 +106,12 @@ https://conda.anaconda.org/conda-forge/noarch/idna-3.8-pyhd8ed1ab_0.conda#99e164 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 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/kiwisolver-1.4.5-py311h9547e67_1.conda#2c65bdf442b0d37aad080c8a4e0d452f +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py311hd18a35c_2.conda#aaa5af16dd32c4b1ad72ffb7ec1e3269 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-23_linux64_openblas.conda#96c8450a40aa2b9733073a9460de972c https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.9.1-hdb1bdb2_0.conda#7da1d242ca3591e174a3c7d82230d3c0 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py311h459d7ec_0.conda#a322b4185121935c871d201ae00ac143 +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py311h9ecbd09_1.conda#c30e9e5aef9e9ff7fb593736ce2a4546 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db @@ -116,7 +119,7 @@ https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.2-pyhd8ed1ab_0.co https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda#b7f5c092b8f9800150d998a71b76d5a1 -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.4-pyhd8ed1ab_0.conda#4d91352a50949d049cf9714c8563d433 https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py311h61187de_0.conda#44bac99d0125c748894b9ffb6ce97811 @@ -133,10 +136,10 @@ https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c7 https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda#d44e3b085abcaef02983c6305b84b584 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a -https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.0-pyhd8ed1ab_0.conda#05b6bcb391b5be17374f7ad0aeedc479 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.1-pyhd8ed1ab_0.conda#74a4befb4b38897e19a107693e49da20 https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e -https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.0-py311ha8e6434_0.conda#32259cd17741b52be10cd23a26cca23a -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.1-py311h61187de_0.conda#1a4c475c89ad142967256d0c7237f298 +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.0-py311hf29c0ef_1.conda#9ecc57f5f6a25fabc0bc1d4adc01ce89 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.1-py311h9ecbd09_1.conda#a36ccf0f3d2eb95a0ecc293f5f56e080 https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.1-py311h61187de_0.conda#bcbe6c9db1c25900c3808b8974e1bb90 https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 @@ -148,7 +151,7 @@ https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-23_linux64_openb https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda#dfe0528d0f1c16c1f7c528ea5536ab30 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.4.0-py311h82a398c_0.conda#b9e0ac1f5564b6572a6d702c04207be8 -https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyhd8ed1ab_0.conda#6721aef6bfe5937abe70181545dd2c51 +https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda#6c78fbb8ddfd64bcb55b5cbafd2d2c43 https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.1-h54d7996_1.conda#e479d1991c725e1a355f33c0e40dbc66 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.7.1-pyhd8ed1ab_0.conda#8e2946459d7f721f8e85b6db185d6338 https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.2-pyhd8ed1ab_0.conda#e010a224b90f1f623a917c35addbb924 @@ -168,8 +171,8 @@ https://conda.anaconda.org/conda-forge/noarch/tox-4.18.0-pyhd8ed1ab_0.conda#d9fd https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311h9547e67_4.conda#586da7df03b68640de14dc3e8bcbf76f https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311h5cd10c7_0.conda#8efe4fe2396281627b3450af8357b190 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h18e1886_0.conda#0eb1e6c7d10285ec12e01f73d1896d93 -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py311h9547e67_0.conda#74ad0ae64f1ef565e27eda87fa749e84 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.1-pyhd8ed1ab_0.conda#8fe3858b19843234b331d8459db3a7a1 +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.0-py311hd18a35c_0.conda#8ac48241408201d209b0dd99b86cdf04 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 https://conda.anaconda.org/conda-forge/noarch/identify-2.6.0-pyhd8ed1ab_0.conda#f80cc5989f445f23b1622d6c455896d9 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py311h459d7ec_1.conda#45b8d355bbcdd27588c2d266bcfdff84 diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index d2e523f3..4c029516 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -3,13 +3,16 @@ # input_hash: e86d945e803f06926278032cd38065b8f5ad074d360d325088b9a2f395cf50c0 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.7.4-hbcca054_0.conda#23ab7665c5f63cfb9f1f6195256daac6 +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.8.30-hbcca054_0.conda#c27d1c142233b5bc9ca570c6e2e0c244 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda#b80f2f396ca2c28b8c14c437a4ed1e74 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda#0424ae29b104430108f5218a66db7260 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_0.conda#ae061a5ed5f05818acdf9adab72c146d +https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda#8bfdead4e0fff0383ae4c9c50d0531bd +https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_1.conda#23c255b008c4f2ae008f81edcabaca89 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h77fa898_0.conda#ca0fad6a41ddaef54a153b78eccb5037 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.1.0-h77fa898_1.conda#002ef4463dd1e2b44a94a4ace468f5d2 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h69a702a_1.conda#1efc0ad219877a73ef977af7dbb51f17 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.1.0-hc5f4f2c_1.conda#10a0cef64b784d6ab6da50ebca4e984d +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.1.0-hc0a3c3a_1.conda#9dbb9699ea467983ba8a4ba89b08b066 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.33.1-heb4867d_0.conda#0d3c60291342c0c025db231353376dfb https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 @@ -18,16 +21,16 @@ https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.21-h4bc722e_0.conda https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.1.0-hc5f4f2c_0.conda#6456c2620c990cd8dde2428a27ba0bc5 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.1.0-h69a702a_1.conda#591e631bc1ae62c64f2ab4f66178c097 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.1.0-hc0a3c3a_0.conda#1cb187a157136398ddbaae90713e2498 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.1.0-h4852527_1.conda#bd2598399a70bb86d8218e95548d735e https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda#70caf8bb6cf39a0b6b7efc885f51c0fe https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-hb9d3cd8_3.conda#6c566a46baae794daf34775d41eb180a https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b @@ -47,7 +50,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.1.0-h69a702a_0.conda#f4ca84fbd6d06b0a052fb2d5b96dde41 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.1.0-h69a702a_1.conda#16cec94c5992d7f42ae3f9fa8b25df8d https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae @@ -84,12 +87,12 @@ https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h30efb5 https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.0-pyhd8ed1ab_0.conda#5bad039db72bd8f134a5cff3ebaa190d https://conda.anaconda.org/conda-forge/noarch/certifi-2024.7.4-pyhd8ed1ab_0.conda#24e7fd6ca65997938fff9e5ab6f653e4 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2#ebb5f5f7dc4f1a3780ef7ea7738db08c -https://conda.anaconda.org/conda-forge/linux-64/chardet-5.2.0-py312h7900ff3_1.conda#af3980cc4690716a5510c8a08cb06238 +https://conda.anaconda.org/conda-forge/linux-64/chardet-5.2.0-py312h7900ff3_2.conda#01b1679726675bf49851cdb507de4a24 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.conda#753d29fe41bb881e4b9c004f0abf973f https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 -https://conda.anaconda.org/conda-forge/linux-64/colorlog-6.8.2-py312h7900ff3_0.conda#0c03a414b685c2406126b677a8f0e083 +https://conda.anaconda.org/conda-forge/linux-64/colorlog-6.8.2-py312h7900ff3_1.conda#0ff09e95b90aafc66fefd6a34e7d923b https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py312h7900ff3_3.conda#1b90835ae26b9b8250b302649359a989 @@ -103,12 +106,12 @@ https://conda.anaconda.org/conda-forge/noarch/idna-3.8-pyhd8ed1ab_0.conda#99e164 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 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/kiwisolver-1.4.5-py312h8572e83_1.conda#c1e71f2bc05d8e8e033aefac2c490d05 +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py312h68727a3_2.conda#88b640176acf9ff4b936d681102ca33f https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-23_linux64_openblas.conda#96c8450a40aa2b9733073a9460de972c https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.9.1-hdb1bdb2_0.conda#7da1d242ca3591e174a3c7d82230d3c0 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py312h98912ed_0.conda#6ff0b9582da2d4a74a1f9ae1f9ce2af6 +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py312h66e93f0_1.conda#80b79ce0d3dc127e96002dfdcec0a2a5 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db @@ -116,7 +119,7 @@ https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.2-pyhd8ed1ab_0.co https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda#b7f5c092b8f9800150d998a71b76d5a1 -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.4-pyhd8ed1ab_0.conda#4d91352a50949d049cf9714c8563d433 https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h41a817b_0.conda#82f34b1b827ffd579547fce6fe6e3157 @@ -133,10 +136,10 @@ https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c7 https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda#d44e3b085abcaef02983c6305b84b584 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a -https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.0-pyhd8ed1ab_0.conda#05b6bcb391b5be17374f7ad0aeedc479 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.1-pyhd8ed1ab_0.conda#74a4befb4b38897e19a107693e49da20 https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e -https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.0-py312h1671c18_0.conda#33dee889f41b0ba6dbe5ddbe70ebf263 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.1-py312h41a817b_0.conda#4006636c39312dc42f8504475be3800f +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.0-py312h06ac9bb_1.conda#db9bdbaee0f524ead0471689f002781e +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.1-py312h66e93f0_1.conda#5dc6e358ee0af388564bd0eba635cf9e https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.1-py312h41a817b_0.conda#da921c56bcf69a8b97216ecec0cc4015 https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 @@ -148,7 +151,7 @@ https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-23_linux64_openb https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda#dfe0528d0f1c16c1f7c528ea5536ab30 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.4.0-py312h287a98d_0.conda#59ea71eed98aee0bebbbdd3b118167c7 -https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyhd8ed1ab_0.conda#6721aef6bfe5937abe70181545dd2c51 +https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda#6c78fbb8ddfd64bcb55b5cbafd2d2c43 https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.1-h54d7996_1.conda#e479d1991c725e1a355f33c0e40dbc66 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.7.1-pyhd8ed1ab_0.conda#8e2946459d7f721f8e85b6db185d6338 https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.2-pyhd8ed1ab_0.conda#e010a224b90f1f623a917c35addbb924 @@ -168,8 +171,8 @@ https://conda.anaconda.org/conda-forge/noarch/tox-4.18.0-pyhd8ed1ab_0.conda#d9fd https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h8572e83_4.conda#52c9e25ee0a32485a102eeecdb7eef52 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312h3483029_0.conda#eab52e88c858d87cf5a069f79d10bb50 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312h085067d_0.conda#864d9e92f012bcc49650428d5343c98a -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py312h8572e83_0.conda#12c6a831ef734f0b2dd4caff514cbb7f -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.1-pyhd8ed1ab_0.conda#8fe3858b19843234b331d8459db3a7a1 +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.0-py312h68727a3_0.conda#32288f0a0f762d91971f004b0f5ef573 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 https://conda.anaconda.org/conda-forge/noarch/identify-2.6.0-pyhd8ed1ab_0.conda#f80cc5989f445f23b1622d6c455896d9 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py312h98912ed_1.conda#d5273d1e67b7b3a871a0a711c6532a2f From 4c62241c081f39b0e00ccb6a7a3c21c77b5f4b5d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Sep 2024 09:37:57 +0100 Subject: [PATCH 360/583] Bump scitools/workflows in the dependencies group (#532) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2024.08.3 to 2024.09.0 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2024.08.3...2024.09.0) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 863bdbb9..b5043da6 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.08.3 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.09.0 diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 21772970..a7f40609 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.08.3 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.09.0 secrets: inherit From ab5b7a3b8efd76f30818d1ac1be8478d3402df3d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 3 Sep 2024 09:40:29 +0100 Subject: [PATCH 361/583] chore: update pre-commit hooks (#531) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.6.2 → v0.6.3](https://github.com/astral-sh/ruff-pre-commit/compare/v0.6.2...v0.6.3) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 5039d0d8..1095537f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -51,7 +51,7 @@ repos: - id: trailing-whitespace - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.6.2" + rev: "v0.6.3" hooks: - id: ruff types: [file, python] From c4dc5afe9b3c5a0b75ac0f676562f12fd9391e6c Mon Sep 17 00:00:00 2001 From: Martin Yeo <40734014+trexfeathers@users.noreply.github.com> Date: Tue, 3 Sep 2024 15:52:16 +0100 Subject: [PATCH 362/583] Dependabot check weekly. (#533) --- .github/dependabot.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 773fd464..6ce59a36 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -8,8 +8,12 @@ updates: - package-ecosystem: "github-actions" directory: "/" schedule: - # Check for updates to GitHub Actions every weekday - interval: "daily" + # Check later in the week - the upstream dependabot check in `workflows` runs deliberately early in the week. + # Therefore allowing time for the `workflows` update to be merged-and-released first. + interval: "weekly" + day: "thursday" + time: "01:00" + timezone: "Europe/London" groups: dependencies: patterns: From 5854b23d29cd81ecacdc3f5fa66db76b88afb332 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Sep 2024 16:00:21 +0100 Subject: [PATCH 363/583] Bump scitools/workflows in the dependencies group (#534) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2024.09.0 to 2024.09.1 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2024.09.0...2024.09.1) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index b5043da6..63523df5 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.09.0 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.09.1 diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index a7f40609..52f35d8b 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.09.0 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.09.1 secrets: inherit From aa626e308aa097d19c573504fda09407be37e3c5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 5 Sep 2024 09:40:49 +0100 Subject: [PATCH 364/583] Bump scitools/workflows in the dependencies group (#535) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2024.09.1 to 2024.09.2 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2024.09.1...2024.09.2) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 63523df5..dc699355 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.09.1 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.09.2 diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 52f35d8b..0d976fdb 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.09.1 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.09.2 secrets: inherit From 9176450e4669ba983094795a44a30db28da7a937 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Sat, 7 Sep 2024 16:25:20 +0100 Subject: [PATCH 365/583] Updated environment lockfiles (#536) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 58 +++++++++++++------------- requirements/locks/py311-linux-64.lock | 58 +++++++++++++------------- requirements/locks/py312-linux-64.lock | 58 +++++++++++++------------- 3 files changed, 87 insertions(+), 87 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 599c0921..3b89424c 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -10,28 +10,31 @@ https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda#8bfd https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_1.conda#23c255b008c4f2ae008f81edcabaca89 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.1.0-h77fa898_1.conda#002ef4463dd1e2b44a94a4ace468f5d2 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.3-h5888daf_0.conda#59f4c43bb1b5ef1c71946ff2cbf59524 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h69a702a_1.conda#1efc0ad219877a73ef977af7dbb51f17 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.1.0-hc5f4f2c_1.conda#10a0cef64b784d6ab6da50ebca4e984d https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.1.0-hc0a3c3a_1.conda#9dbb9699ea467983ba8a4ba89b08b066 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.2-hb9d3cd8_0.conda#4d638782050ab6faa27275bed57e9b4e https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.33.1-heb4867d_0.conda#0d3c60291342c0c025db231353376dfb https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 -https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.21-h4bc722e_0.conda#36ce76665bf67f5aac36be7a0d21b7f3 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.1.0-h69a702a_1.conda#591e631bc1ae62c64f2ab4f66178c097 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.1.0-h4852527_1.conda#bd2598399a70bb86d8218e95548d735e +https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda#70caf8bb6cf39a0b6b7efc885f51c0fe -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-hb9d3cd8_3.conda#6c566a46baae794daf34775d41eb180a https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a @@ -42,21 +45,19 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae +https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.2-he02047a_1.conda#aab9195bc018b82dc77a84584b36cce9 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa -https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f -https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.1.0-h69a702a_1.conda#16cec94c5992d7f42ae3f9fa8b25df8d https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda#18aa975d2094c34aef978060ae7da7d8 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.1-hadc24fc_0.conda#36f79405ab16bf271edb55b213836dac https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe -https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.16-hb9d3cd8_1.conda#3601598f0db0470af28985e3e7ad0158 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 @@ -64,28 +65,27 @@ https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#35 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-ha2e4443_0.conda#6b7dcc7349efd123d493d2dbe85a045f https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc +https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-h4ab18f5_1.conda#9653f1bf3766164d0e65fa723cabbc54 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-hef167b5_0.conda#54fe76ab3d0189acaef95156874db7f9 -https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda#39f910d205726805a958da408ca194ba +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_hac2b453_1.conda#ae05ece66d3924ac3d48b4aa3fa96cec https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h46a8edc_4.conda#a7e3a62981350e232e0e7345b5aea580 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-he7c6b58_4.conda#08a9265c637230c37cb1be4a6cad4536 https://conda.anaconda.org/conda-forge/linux-64/python-3.10.14-hd12c33a_0_cpython.conda#2b4ba962994e8bd4be9ff5b64b75aff2 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.46.0-h6d4b2fc_0.conda#77ea8dff5cf8550cc8f5629a6af56323 -https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.46.1-h9eae976_0.conda#b2b3e737da0ae347e16ef1970a5d3f14 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-hb711507_1.conda#4a6d410296d7e39f00bacdee7df046e9 https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.5.0-pyhd8ed1ab_0.conda#58d664381a6dd4238cf40b7e2ba3309d https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda#6732fa52eb8e66e5afeb32db8701a791 -https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hc6cd4ac_1.conda#1f95722c94f00b69af69a066c7433714 +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_2.conda#bf502c169c71e3c6ac0d6175addfacc2 https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.0-pyhd8ed1ab_0.conda#5bad039db72bd8f134a5cff3ebaa190d -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.7.4-pyhd8ed1ab_0.conda#24e7fd6ca65997938fff9e5ab6f653e4 +https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda#12f7d00853807b0531775e9be891cb11 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2#ebb5f5f7dc4f1a3780ef7ea7738db08c https://conda.anaconda.org/conda-forge/linux-64/chardet-5.2.0-py310hff52083_2.conda#e94bf593fe645f6b85a9c8b2d52caae6 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a @@ -99,14 +99,14 @@ https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py310hff52083_3. https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.4-pyhd8ed1ab_0.conda#0e7e4388e9d5283e22b35a9443bdbcc9 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.6.1-pyhff2d567_0.conda#996bf792cdb8c0ac38ff54b9fde56841 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.9.0-pyhff2d567_0.conda#ace4329fbff4c69ab0309db6da182987 https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2#9f765cbfab6870c8435b9eefecd7a1f4 https://conda.anaconda.org/conda-forge/noarch/idna-3.8-pyhd8ed1ab_0.conda#99e164522f6bdf23c177c8d9ae63f975 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 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/kiwisolver-1.4.5-py310h3788b33_2.conda#48c1eab50327b5d002d8cf8f53c4ca34 +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py310h3788b33_0.conda#4186d9b4d004b0fe0de6aa62496fb48a https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-23_linux64_openblas.conda#96c8450a40aa2b9733073a9460de972c https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.9.1-hdb1bdb2_0.conda#7da1d242ca3591e174a3c7d82230d3c0 @@ -122,10 +122,10 @@ https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.4-pyhd8ed1ab_0.conda#4d91352a50949d049cf9714c8563d433 https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 -https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py310h5b4e0ec_0.conda#9bd328236a2db02a858d1d5c913536db +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py310ha75aee5_1.conda#8b430470d53744289cb5499bc99a6485 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py310h5b4e0ec_0.conda#ad8de7b4ac482217959cc1e8fe0cc56d -https://conda.anaconda.org/conda-forge/noarch/setuptools-72.2.0-pyhd8ed1ab_0.conda#1462aa8b243aad09ef5d0841c745eb89 +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py310ha75aee5_1.conda#0d4c5c76ae5f5aac6f0be419963a19dd +https://conda.anaconda.org/conda-forge/noarch/setuptools-73.0.1-pyhd8ed1ab_0.conda#f0b618d7673d1b2464f600b34d912f6f https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 @@ -139,9 +139,9 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.1-pyhd8ed1ab_0.conda#74a4befb4b38897e19a107693e49da20 https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e -https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.0-py310h8deb56e_1.conda#6d9cb6134a936dbb7fae44cd21d8d9fc +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h8deb56e_0.conda#1fc24a3196ad5ede2a68148be61894f4 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.1-py310ha75aee5_1.conda#69521d4acef78a85e81ddf512977157b -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.1-py310h5b4e0ec_0.conda#2c5257cb35d1946f5e80a0cfd69ed7ec +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.1-py310ha75aee5_1.conda#75fd6c3b4cd1d22955bf5fb78eae6c12 https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.4.0-pyha770c72_0.conda#6e3dbc422d3749ad72659243d6ac8b2b @@ -164,15 +164,15 @@ https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda# https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.4.0-hd8ed1ab_0.conda#01b7411c765c3d863dcc920207f258bd https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h135f659_114.conda#a908e463c710bd6b10a9eaa89fdf003c https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py310hb13e2d6_0.conda#6593de64c935768b6bad3e19b3e978be -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py310h8efdad9_8.conda#141894c09837c83a396fce6eb629c1ab +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py310h3160ae9_9.conda#b6401dcb8cc978d5c8eb40cbacc7540a https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda#ba9f7f0ec4f2a18de3e7bce67c4a431e https://conda.anaconda.org/conda-forge/noarch/tox-4.18.0-pyhd8ed1ab_0.conda#d9fd7cdd9af0da9b217f1c31f03c930a https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310hd41b1e2_4.conda#35e87277fba9944b8a975113538bb5df -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310h64cae3c_0.conda#b527de1849629f2635dafc77745b015a -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310h261611a_0.conda#5c0e2cd80ceab2ac5201459cc016b88b -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.0-py310h3788b33_0.conda#a5a6c54a0d6cf32736ede926fad0bc95 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha39cb0e_1.conda#f49de34fb99934bf49ab330b5caffd64 +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310hf462985_1.conda#c2d5289e6cbcecf2c549e01772fe5274 +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.0-py310h3788b33_1.conda#05eccc0bacdbcc8a5ad3c7b35b7e1cd5 https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 https://conda.anaconda.org/conda-forge/noarch/identify-2.6.0-pyhd8ed1ab_0.conda#f80cc5989f445f23b1622d6c455896d9 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 @@ -180,17 +180,17 @@ https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py310h2372a71_1.co https://conda.anaconda.org/conda-forge/noarch/nox-2024.4.15-pyhff2d567_0.conda#600c0de12125f473d8099c0b3e6f88d4 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.1-py310ha3fb0e1_0.conda#dcca3051fda0f861e8111c6368842a28 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.1.0-hd8ed1ab_0.conda#7ed7b077f6c6ebcb5fc66f23985df487 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.6-py310h019a838_0.conda#3cc218355d15acfa3680fb913048d79f +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.6-py310h64a4ca9_1.conda#cac7e9a8dcd64d40a83fafff87fbf3c1 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py310h261611a_5.conda#643414a9f73226b2a6a43a4800734d3b -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.36.0-h762793a_0.conda#6d8c86d0368625b6503d696db70ea041 +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py310hf462985_6.conda#b8ad2d561f4e0db4f09d06cc0e73e0b0 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.37.0-h8bb6dbc_0.conda#977e230843c4747236c5972a69b1121d https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.2-py310hf02ac8c_0.conda#394fef7267dfc5bc139ba72b05560b75 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.1-nompi_py310hf3005e6_101.conda#409736627835306542425033e2a41dd2 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.1-nompi_py310h9f0ad05_102.conda#fafb8cd70d84eab5df8d03a432890474 https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.8.0-pyha770c72_0.conda#1822e87a5d357f79c6aab871d86fb062 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py310hf9f9076_1.conda#dd5c97834c12bae782b35261e0bea7b4 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_0.conda#2cc61ba1dd53f0806247333f1294e058 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.1-py310h261611a_0.conda#b577e192825e3037fb39498f3603df05 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.1-py310hf462985_1.conda#48507377f93d355b7f7564121cfacf63 https://conda.anaconda.org/conda-forge/noarch/iris-3.10.0-pyha770c72_1.conda#b7212cd8247ce909631fdcb77015914a https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_0.conda#9075bd8c033f0257122300db914e49c9 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_0.conda#b3bcc38c471ebb738854f52a36059b48 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 2df116db..31a6fb12 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -10,28 +10,31 @@ https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda#8bfd https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_1.conda#23c255b008c4f2ae008f81edcabaca89 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.1.0-h77fa898_1.conda#002ef4463dd1e2b44a94a4ace468f5d2 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.3-h5888daf_0.conda#59f4c43bb1b5ef1c71946ff2cbf59524 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h69a702a_1.conda#1efc0ad219877a73ef977af7dbb51f17 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.1.0-hc5f4f2c_1.conda#10a0cef64b784d6ab6da50ebca4e984d https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.1.0-hc0a3c3a_1.conda#9dbb9699ea467983ba8a4ba89b08b066 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.2-hb9d3cd8_0.conda#4d638782050ab6faa27275bed57e9b4e https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.33.1-heb4867d_0.conda#0d3c60291342c0c025db231353376dfb https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 -https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.21-h4bc722e_0.conda#36ce76665bf67f5aac36be7a0d21b7f3 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.1.0-h69a702a_1.conda#591e631bc1ae62c64f2ab4f66178c097 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.1.0-h4852527_1.conda#bd2598399a70bb86d8218e95548d735e +https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda#70caf8bb6cf39a0b6b7efc885f51c0fe -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-hb9d3cd8_3.conda#6c566a46baae794daf34775d41eb180a https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a @@ -42,21 +45,19 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae +https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.2-he02047a_1.conda#aab9195bc018b82dc77a84584b36cce9 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa -https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f -https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.1.0-h69a702a_1.conda#16cec94c5992d7f42ae3f9fa8b25df8d https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda#18aa975d2094c34aef978060ae7da7d8 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.1-hadc24fc_0.conda#36f79405ab16bf271edb55b213836dac https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe -https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.16-hb9d3cd8_1.conda#3601598f0db0470af28985e3e7ad0158 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 @@ -64,28 +65,27 @@ https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#35 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-ha2e4443_0.conda#6b7dcc7349efd123d493d2dbe85a045f https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc +https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-h4ab18f5_1.conda#9653f1bf3766164d0e65fa723cabbc54 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-hef167b5_0.conda#54fe76ab3d0189acaef95156874db7f9 -https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda#39f910d205726805a958da408ca194ba +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_hac2b453_1.conda#ae05ece66d3924ac3d48b4aa3fa96cec https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h46a8edc_4.conda#a7e3a62981350e232e0e7345b5aea580 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-he7c6b58_4.conda#08a9265c637230c37cb1be4a6cad4536 https://conda.anaconda.org/conda-forge/linux-64/python-3.11.9-hb806964_0_cpython.conda#ac68acfa8b558ed406c75e98d3428d7b -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.46.0-h6d4b2fc_0.conda#77ea8dff5cf8550cc8f5629a6af56323 -https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.46.1-h9eae976_0.conda#b2b3e737da0ae347e16ef1970a5d3f14 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-hb711507_1.conda#4a6d410296d7e39f00bacdee7df046e9 https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.5.0-pyhd8ed1ab_0.conda#58d664381a6dd4238cf40b7e2ba3309d https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda#6732fa52eb8e66e5afeb32db8701a791 -https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hb755f60_1.conda#cce9e7c3f1c307f2a5fb08a2922d6164 +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hfdbb021_2.conda#d21daab070d76490cb39a8f1d1729d79 https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.0-pyhd8ed1ab_0.conda#5bad039db72bd8f134a5cff3ebaa190d -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.7.4-pyhd8ed1ab_0.conda#24e7fd6ca65997938fff9e5ab6f653e4 +https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda#12f7d00853807b0531775e9be891cb11 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2#ebb5f5f7dc4f1a3780ef7ea7738db08c https://conda.anaconda.org/conda-forge/linux-64/chardet-5.2.0-py311h38be061_2.conda#00f0ad2aed7e65c9392a067ce7882b28 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a @@ -99,14 +99,14 @@ https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py311h38be061_3. https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.4-pyhd8ed1ab_0.conda#0e7e4388e9d5283e22b35a9443bdbcc9 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.6.1-pyhff2d567_0.conda#996bf792cdb8c0ac38ff54b9fde56841 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.9.0-pyhff2d567_0.conda#ace4329fbff4c69ab0309db6da182987 https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2#9f765cbfab6870c8435b9eefecd7a1f4 https://conda.anaconda.org/conda-forge/noarch/idna-3.8-pyhd8ed1ab_0.conda#99e164522f6bdf23c177c8d9ae63f975 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 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/kiwisolver-1.4.5-py311hd18a35c_2.conda#aaa5af16dd32c4b1ad72ffb7ec1e3269 +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py311hd18a35c_0.conda#be34c90cce87090d24da64a7c239ca96 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-23_linux64_openblas.conda#96c8450a40aa2b9733073a9460de972c https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.9.1-hdb1bdb2_0.conda#7da1d242ca3591e174a3c7d82230d3c0 @@ -122,10 +122,10 @@ https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.4-pyhd8ed1ab_0.conda#4d91352a50949d049cf9714c8563d433 https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 -https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py311h61187de_0.conda#44bac99d0125c748894b9ffb6ce97811 +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py311h9ecbd09_1.conda#b1796d741ca619dbacb79917b20e5a05 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py311h61187de_0.conda#76439451605390254b85d8da6f8d962a -https://conda.anaconda.org/conda-forge/noarch/setuptools-72.2.0-pyhd8ed1ab_0.conda#1462aa8b243aad09ef5d0841c745eb89 +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py311h9ecbd09_1.conda#abeb54d40f439b86f75ea57045ab8496 +https://conda.anaconda.org/conda-forge/noarch/setuptools-73.0.1-pyhd8ed1ab_0.conda#f0b618d7673d1b2464f600b34d912f6f https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 @@ -138,9 +138,9 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.1-pyhd8ed1ab_0.conda#74a4befb4b38897e19a107693e49da20 https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e -https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.0-py311hf29c0ef_1.conda#9ecc57f5f6a25fabc0bc1d4adc01ce89 +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311hf29c0ef_0.conda#55553ecd5328336368db611f350b7039 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.1-py311h9ecbd09_1.conda#a36ccf0f3d2eb95a0ecc293f5f56e080 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.1-py311h61187de_0.conda#bcbe6c9db1c25900c3808b8974e1bb90 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.1-py311h9ecbd09_1.conda#89ed1820af1523df84171049199ed915 https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.4.0-pyha770c72_0.conda#6e3dbc422d3749ad72659243d6ac8b2b @@ -163,15 +163,15 @@ https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda# https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.4.0-hd8ed1ab_0.conda#01b7411c765c3d863dcc920207f258bd https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h135f659_114.conda#a908e463c710bd6b10a9eaa89fdf003c https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.conda#a502d7aad449a1206efb366d6a12c52d -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311ha1c4eca_8.conda#5e89d863aff561261ef8f3c7ed29d6e8 +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311h58d3061_9.conda#27b5add49cad0a417cb22f067f89955c https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda#ba9f7f0ec4f2a18de3e7bce67c4a431e https://conda.anaconda.org/conda-forge/noarch/tox-4.18.0-pyhd8ed1ab_0.conda#d9fd7cdd9af0da9b217f1c31f03c930a https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311h9547e67_4.conda#586da7df03b68640de14dc3e8bcbf76f -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311h5cd10c7_0.conda#8efe4fe2396281627b3450af8357b190 -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h18e1886_0.conda#0eb1e6c7d10285ec12e01f73d1896d93 -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.0-py311hd18a35c_0.conda#8ac48241408201d209b0dd99b86cdf04 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311hbc35293_1.conda#aec590674ba365e50ae83aa2d6e1efae +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h9f3472d_1.conda#2c3c4f115d28ed9e001a271d5d8585aa +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.0-py311hd18a35c_1.conda#f709f23e2b1b93b3b6a20e9e7217a258 https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 https://conda.anaconda.org/conda-forge/noarch/identify-2.6.0-pyhd8ed1ab_0.conda#f80cc5989f445f23b1622d6c455896d9 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 @@ -179,17 +179,17 @@ https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py311h459d7ec_1.co https://conda.anaconda.org/conda-forge/noarch/nox-2024.4.15-pyhff2d567_0.conda#600c0de12125f473d8099c0b3e6f88d4 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.1-py311he1f765f_0.conda#eb7e2a849cd47483d7e9eeb728c7a8c5 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.1.0-hd8ed1ab_0.conda#7ed7b077f6c6ebcb5fc66f23985df487 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.6-py311h5925939_0.conda#651516baf63771ee70a7d613efd11e0e +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.6-py311h9036bbf_1.conda#03346d2520dd112d92380c08ee3f66fe https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h18e1886_5.conda#6cd3facab7a79de14abb1a86a2d830fa -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.36.0-h762793a_0.conda#6d8c86d0368625b6503d696db70ea041 +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h9f3472d_6.conda#ac7dc7f70f8d2c1d96ecb7e4cb196498 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.37.0-h8bb6dbc_0.conda#977e230843c4747236c5972a69b1121d https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.2-py311h74b4f7c_0.conda#de8e36c9792f14eed7e11e672f03fbf0 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.1-nompi_py311h25b3b55_101.conda#936afeddfa3704eb834d0887b0838826 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.1-nompi_py311hae66bec_102.conda#87b59caea7db5b79766e0776953d8c66 https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.8.0-pyha770c72_0.conda#1822e87a5d357f79c6aab871d86fb062 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py311h14de704_1.conda#27e5956e552c6e71f56cb1ec042617a8 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_0.conda#2cc61ba1dd53f0806247333f1294e058 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.1-py311h18e1886_0.conda#a54e480c5d7adceb6a84a16a29498449 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.1-py311h9f3472d_1.conda#9abbec46f2f53df6be65f0dfdf85358a https://conda.anaconda.org/conda-forge/noarch/iris-3.10.0-pyha770c72_1.conda#b7212cd8247ce909631fdcb77015914a https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_0.conda#9075bd8c033f0257122300db914e49c9 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_0.conda#b3bcc38c471ebb738854f52a36059b48 diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 4c029516..3c8557b9 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -10,28 +10,31 @@ https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda#8bfd https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_1.conda#23c255b008c4f2ae008f81edcabaca89 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.1.0-h77fa898_1.conda#002ef4463dd1e2b44a94a4ace468f5d2 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.3-h5888daf_0.conda#59f4c43bb1b5ef1c71946ff2cbf59524 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h69a702a_1.conda#1efc0ad219877a73ef977af7dbb51f17 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.1.0-hc5f4f2c_1.conda#10a0cef64b784d6ab6da50ebca4e984d https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.1.0-hc0a3c3a_1.conda#9dbb9699ea467983ba8a4ba89b08b066 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.2-hb9d3cd8_0.conda#4d638782050ab6faa27275bed57e9b4e https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.33.1-heb4867d_0.conda#0d3c60291342c0c025db231353376dfb https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 -https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.21-h4bc722e_0.conda#36ce76665bf67f5aac36be7a0d21b7f3 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.1.0-h69a702a_1.conda#591e631bc1ae62c64f2ab4f66178c097 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.1.0-h4852527_1.conda#bd2598399a70bb86d8218e95548d735e +https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda#70caf8bb6cf39a0b6b7efc885f51c0fe -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-hb9d3cd8_3.conda#6c566a46baae794daf34775d41eb180a https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a @@ -42,21 +45,19 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae +https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.2-he02047a_1.conda#aab9195bc018b82dc77a84584b36cce9 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa -https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f -https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.1.0-h69a702a_1.conda#16cec94c5992d7f42ae3f9fa8b25df8d https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda#18aa975d2094c34aef978060ae7da7d8 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.1-hadc24fc_0.conda#36f79405ab16bf271edb55b213836dac https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe -https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.16-hb9d3cd8_1.conda#3601598f0db0470af28985e3e7ad0158 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 @@ -64,28 +65,27 @@ https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#35 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-ha2e4443_0.conda#6b7dcc7349efd123d493d2dbe85a045f https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc +https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-h4ab18f5_1.conda#9653f1bf3766164d0e65fa723cabbc54 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-hef167b5_0.conda#54fe76ab3d0189acaef95156874db7f9 -https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda#39f910d205726805a958da408ca194ba +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_hac2b453_1.conda#ae05ece66d3924ac3d48b4aa3fa96cec https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h46a8edc_4.conda#a7e3a62981350e232e0e7345b5aea580 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-he7c6b58_4.conda#08a9265c637230c37cb1be4a6cad4536 https://conda.anaconda.org/conda-forge/linux-64/python-3.12.5-h2ad013b_0_cpython.conda#9c56c4df45f6571b13111d8df2448692 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.46.0-h6d4b2fc_0.conda#77ea8dff5cf8550cc8f5629a6af56323 -https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.46.1-h9eae976_0.conda#b2b3e737da0ae347e16ef1970a5d3f14 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-hb711507_1.conda#4a6d410296d7e39f00bacdee7df046e9 https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.5.0-pyhd8ed1ab_0.conda#58d664381a6dd4238cf40b7e2ba3309d https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda#6732fa52eb8e66e5afeb32db8701a791 -https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h30efb56_1.conda#45801a89533d3336a365284d93298e36 +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda#b0b867af6fc74b2a0aa206da29c0f3cf https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.0-pyhd8ed1ab_0.conda#5bad039db72bd8f134a5cff3ebaa190d -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.7.4-pyhd8ed1ab_0.conda#24e7fd6ca65997938fff9e5ab6f653e4 +https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda#12f7d00853807b0531775e9be891cb11 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2#ebb5f5f7dc4f1a3780ef7ea7738db08c https://conda.anaconda.org/conda-forge/linux-64/chardet-5.2.0-py312h7900ff3_2.conda#01b1679726675bf49851cdb507de4a24 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a @@ -99,14 +99,14 @@ https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py312h7900ff3_3. https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.4-pyhd8ed1ab_0.conda#0e7e4388e9d5283e22b35a9443bdbcc9 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.6.1-pyhff2d567_0.conda#996bf792cdb8c0ac38ff54b9fde56841 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.9.0-pyhff2d567_0.conda#ace4329fbff4c69ab0309db6da182987 https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2#9f765cbfab6870c8435b9eefecd7a1f4 https://conda.anaconda.org/conda-forge/noarch/idna-3.8-pyhd8ed1ab_0.conda#99e164522f6bdf23c177c8d9ae63f975 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 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/kiwisolver-1.4.5-py312h68727a3_2.conda#88b640176acf9ff4b936d681102ca33f +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py312h68727a3_0.conda#444266743652a4f1538145e9362f6d3b https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-23_linux64_openblas.conda#96c8450a40aa2b9733073a9460de972c https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.9.1-hdb1bdb2_0.conda#7da1d242ca3591e174a3c7d82230d3c0 @@ -122,10 +122,10 @@ https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.4-pyhd8ed1ab_0.conda#4d91352a50949d049cf9714c8563d433 https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 -https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h41a817b_0.conda#82f34b1b827ffd579547fce6fe6e3157 +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f0_1.conda#39aed2afe4d0cf76ab3d6b09eecdbea7 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h41a817b_0.conda#1779c9cbd9006415ab7bb9e12747e9d1 -https://conda.anaconda.org/conda-forge/noarch/setuptools-72.2.0-pyhd8ed1ab_0.conda#1462aa8b243aad09ef5d0841c745eb89 +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h66e93f0_1.conda#549e5930e768548a89c23f595dac5a95 +https://conda.anaconda.org/conda-forge/noarch/setuptools-73.0.1-pyhd8ed1ab_0.conda#f0b618d7673d1b2464f600b34d912f6f https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 @@ -138,9 +138,9 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.1-pyhd8ed1ab_0.conda#74a4befb4b38897e19a107693e49da20 https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e -https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.0-py312h06ac9bb_1.conda#db9bdbaee0f524ead0471689f002781e +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda#a861504bbea4161a9170b85d4d2be840 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.1-py312h66e93f0_1.conda#5dc6e358ee0af388564bd0eba635cf9e -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.1-py312h41a817b_0.conda#da921c56bcf69a8b97216ecec0cc4015 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.1-py312h66e93f0_1.conda#7abb7d39d482ac3b8e27e6c0fff3b168 https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.4.0-pyha770c72_0.conda#6e3dbc422d3749ad72659243d6ac8b2b @@ -163,15 +163,15 @@ https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda# https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.4.0-hd8ed1ab_0.conda#01b7411c765c3d863dcc920207f258bd https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h135f659_114.conda#a908e463c710bd6b10a9eaa89fdf003c https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda#d8285bea2a350f63fab23bf460221f3f -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py312h01329cd_8.conda#ca4d166cb45c07aff3bee9091866c7dd +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py312h9211aeb_9.conda#173afeb0d112c854fd1a9fcac4b5cce3 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda#ba9f7f0ec4f2a18de3e7bce67c4a431e https://conda.anaconda.org/conda-forge/noarch/tox-4.18.0-pyhd8ed1ab_0.conda#d9fd7cdd9af0da9b217f1c31f03c930a https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h8572e83_4.conda#52c9e25ee0a32485a102eeecdb7eef52 -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312h3483029_0.conda#eab52e88c858d87cf5a069f79d10bb50 -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312h085067d_0.conda#864d9e92f012bcc49650428d5343c98a -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.0-py312h68727a3_0.conda#32288f0a0f762d91971f004b0f5ef573 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda#8b7069e9792ee4e5b4919a7a306d2e67 +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312hc0a28a1_1.conda#990033147b0a998e756eaaed6b28f48d +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.0-py312h68727a3_1.conda#6b9f9141c247bdd61a2d6d37e0a8b530 https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 https://conda.anaconda.org/conda-forge/noarch/identify-2.6.0-pyhd8ed1ab_0.conda#f80cc5989f445f23b1622d6c455896d9 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 @@ -179,17 +179,17 @@ https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py312h98912ed_1.co https://conda.anaconda.org/conda-forge/noarch/nox-2024.4.15-pyhff2d567_0.conda#600c0de12125f473d8099c0b3e6f88d4 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.1-py312h7d485d2_0.conda#7418a22e73008356d9aba99d93dfeeee https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.1.0-hd8ed1ab_0.conda#7ed7b077f6c6ebcb5fc66f23985df487 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.6-py312h8413631_0.conda#e82236100a899ce6504435fbc8c48f63 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.6-py312h6cab151_1.conda#5be02e05e1adaa42826cc6800ce399bc https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py312h085067d_5.conda#b40cdf87aee69ccf162022579cb99afb -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.36.0-h762793a_0.conda#6d8c86d0368625b6503d696db70ea041 +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py312hc0a28a1_6.conda#fa4853d25b6fbfef5eb7b3e1b5616dd5 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.37.0-h8bb6dbc_0.conda#977e230843c4747236c5972a69b1121d https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.2-py312h854627b_0.conda#a57b0ae7c0aac603839a4e83a3e997d6 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.1-nompi_py312h1ef7fb6_101.conda#c67cc8e3a34c5cb8920c79918112e96f +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.1-nompi_py312h21d6d8e_102.conda#9049ba34261ce7106220711d313fcf61 https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.8.0-pyha770c72_0.conda#1822e87a5d357f79c6aab871d86fb062 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py312h1d6d2e6_1.conda#6392d3ce615ab0f32bc39b07f8f4c300 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_0.conda#2cc61ba1dd53f0806247333f1294e058 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.1-py312h085067d_0.conda#5f96475aa30552797f8099ccee24feaa +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.1-py312hc0a28a1_1.conda#2c25b6709962640f7b6ecffeeeb456a6 https://conda.anaconda.org/conda-forge/noarch/iris-3.10.0-pyha770c72_1.conda#b7212cd8247ce909631fdcb77015914a https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_0.conda#9075bd8c033f0257122300db914e49c9 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_0.conda#b3bcc38c471ebb738854f52a36059b48 From 824a60fef1e0278ab132191ff533a61285ae8d34 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 10 Sep 2024 00:36:22 +0100 Subject: [PATCH 366/583] chore: update pre-commit hooks (#537) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.6.3 → v0.6.4](https://github.com/astral-sh/ruff-pre-commit/compare/v0.6.3...v0.6.4) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 1095537f..c77cd76a 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -51,7 +51,7 @@ repos: - id: trailing-whitespace - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.6.3" + rev: "v0.6.4" hooks: - id: ruff types: [file, python] From 73924f33d1ea8081c8baebe953188501f69c6e6a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 12 Sep 2024 07:48:59 +0100 Subject: [PATCH 367/583] Bump scitools/workflows in the dependencies group (#541) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2024.09.2 to 2024.09.4 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2024.09.2...2024.09.4) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index dc699355..63f6ed89 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.09.2 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.09.4 diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 0d976fdb..d089db21 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.09.2 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.09.4 secrets: inherit From 1e652bc6e4dda338810c02a9c9e98abcdf629399 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Sat, 14 Sep 2024 06:31:06 +0100 Subject: [PATCH 368/583] Updated environment lockfiles (#542) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 36 ++++++++++++------------ requirements/locks/py311-linux-64.lock | 38 +++++++++++++------------- requirements/locks/py312-linux-64.lock | 36 ++++++++++++------------ 3 files changed, 55 insertions(+), 55 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 3b89424c..8620773f 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -55,7 +55,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2. https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.1.0-h69a702a_1.conda#16cec94c5992d7f42ae3f9fa8b25df8d https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda#f4cc49d7aa68316213e4b12be35308d1 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.1-hadc24fc_0.conda#36f79405ab16bf271edb55b213836dac https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.16-hb9d3cd8_1.conda#3601598f0db0470af28985e3e7ad0158 @@ -97,7 +97,7 @@ https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5 https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py310hff52083_3.conda#c159dcd29bbd80b187b1c5d5f73cc971 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 -https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.4-pyhd8ed1ab_0.conda#0e7e4388e9d5283e22b35a9443bdbcc9 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.0-pyhd8ed1ab_0.conda#ec288789b07ae3be555046e099798a56 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.9.0-pyhff2d567_0.conda#ace4329fbff4c69ab0309db6da182987 https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 @@ -109,13 +109,13 @@ https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.4.0-pyhd8ed1ab_ https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py310h3788b33_0.conda#4186d9b4d004b0fe0de6aa62496fb48a https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-23_linux64_openblas.conda#96c8450a40aa2b9733073a9460de972c -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.9.1-hdb1bdb2_0.conda#7da1d242ca3591e174a3c7d82230d3c0 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.10.0-hbbe4b11_0.conda#657ea309ad90675ef144e7d27a271ab9 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py310ha75aee5_1.conda#14ae296598aab54a26ab8c095f57db10 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.2-pyhd8ed1ab_0.conda#6f6cf28bf8e021933869bae3f84b8fc9 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.2-pyhd8ed1ab_0.conda#e1a2dfcd5695f0744f1bcd3bbfe02523 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda#b7f5c092b8f9800150d998a71b76d5a1 @@ -123,7 +123,7 @@ https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.4-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py310ha75aee5_1.conda#8b430470d53744289cb5499bc99a6485 -https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad +https://conda.anaconda.org/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_0.conda#260009d03c9d5c0f111904d851f053dc https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py310ha75aee5_1.conda#0d4c5c76ae5f5aac6f0be419963a19dd https://conda.anaconda.org/conda-forge/noarch/setuptools-73.0.1-pyhd8ed1ab_0.conda#f0b618d7673d1b2464f600b34d912f6f https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 @@ -137,43 +137,43 @@ https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py310h2372a7 https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda#d44e3b085abcaef02983c6305b84b584 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a -https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.1-pyhd8ed1ab_0.conda#74a4befb4b38897e19a107693e49da20 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.2-pyhd8ed1ab_0.conda#4daaed111c05672ae669f7036ee5bba3 https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h8deb56e_0.conda#1fc24a3196ad5ede2a68148be61894f4 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.1-py310ha75aee5_1.conda#69521d4acef78a85e81ddf512977157b https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.1-py310ha75aee5_1.conda#75fd6c3b4cd1d22955bf5fb78eae6c12 https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.4.0-pyha770c72_0.conda#6e3dbc422d3749ad72659243d6ac8b2b +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda#54198435fce4d64d8a89af22573012a8 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-23_linux64_openblas.conda#eede29b40efa878cbe5bdcb767e97310 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-ha6d2627_1004.conda#df069bea331c8486ac21814969301c1f https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-23_linux64_openblas.conda#2af0879961951987e464722fd00ec1e0 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda#dfe0528d0f1c16c1f7c528ea5536ab30 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/linux-64/pillow-10.4.0-py310hebfe307_0.conda#89d70dfe2d59edcefc3881be6bff33a6 +https://conda.anaconda.org/conda-forge/linux-64/pillow-10.4.0-py310he228d35_1.conda#267bd9088c6aa5ae96dceb470fa6efa9 https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda#6c78fbb8ddfd64bcb55b5cbafd2d2c43 https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.1-h54d7996_1.conda#e479d1991c725e1a355f33c0e40dbc66 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.7.1-pyhd8ed1ab_0.conda#8e2946459d7f721f8e85b6db185d6338 -https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.2-pyhd8ed1ab_0.conda#e010a224b90f1f623a917c35addbb924 +https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda#c03d61f31f38fdb9facf70c29958bf7a https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.3-pyhd8ed1ab_0.conda#284008712816c64c85bf2b7fa9f3b264 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.4-pyhd8ed1ab_0.conda#14c15fa7def506fe7d1a0e3abdc212d6 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h4bc722e_1.conda#749baebe7e2ff3360630e069175e528b https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.4.0-hd8ed1ab_0.conda#01b7411c765c3d863dcc920207f258bd +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.5.0-hd8ed1ab_0.conda#2a92e152208121afadf85a5e1f3a5f4d https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h135f659_114.conda#a908e463c710bd6b10a9eaa89fdf003c https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py310hb13e2d6_0.conda#6593de64c935768b6bad3e19b3e978be https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py310h3160ae9_9.conda#b6401dcb8cc978d5c8eb40cbacc7540a https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda#ba9f7f0ec4f2a18de3e7bce67c4a431e -https://conda.anaconda.org/conda-forge/noarch/tox-4.18.0-pyhd8ed1ab_0.conda#d9fd7cdd9af0da9b217f1c31f03c930a -https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310hd41b1e2_4.conda#35e87277fba9944b8a975113538bb5df +https://conda.anaconda.org/conda-forge/noarch/tox-4.18.1-pyhd8ed1ab_0.conda#67049306e39f2f9828069ec6fecebb54 +https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310h3788b33_5.conda#e05b0475166b68c9dc4d7937e0315654 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha39cb0e_1.conda#f49de34fb99934bf49ab330b5caffd64 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310hf462985_1.conda#c2d5289e6cbcecf2c549e01772fe5274 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.0-py310h3788b33_1.conda#05eccc0bacdbcc8a5ad3c7b35b7e1cd5 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.9.0-pyhd8ed1ab_0.conda#8e6585b996dfa6fff92d7ccd0f18bb99 https://conda.anaconda.org/conda-forge/noarch/identify-2.6.0-pyhd8ed1ab_0.conda#f80cc5989f445f23b1622d6c455896d9 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py310h2372a71_1.conda#dfcf64f67961eb9686676f96fdb4b4d1 @@ -184,13 +184,13 @@ https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.6-py310h64a4ca9_1.co https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py310hf462985_6.conda#b8ad2d561f4e0db4f09d06cc0e73e0b0 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.37.0-h8bb6dbc_0.conda#977e230843c4747236c5972a69b1121d -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.2-py310hf02ac8c_0.conda#394fef7267dfc5bc139ba72b05560b75 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.2-py310h68603db_1.conda#989ef368e7b81b6c28e608e651a2a7d8 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.1-nompi_py310h9f0ad05_102.conda#fafb8cd70d84eab5df8d03a432890474 -https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.8.0-pyha770c72_0.conda#1822e87a5d357f79c6aab871d86fb062 +https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.8.0-pyha770c72_1.conda#004cff3a7f6fafb0a041fb575de85185 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py310hf9f9076_1.conda#dd5c97834c12bae782b35261e0bea7b4 +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py310h5eaa309_2.conda#7eecc124f1b4ebd547b0e5f2ad6c9e2f https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_0.conda#2cc61ba1dd53f0806247333f1294e058 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.1-py310hf462985_1.conda#48507377f93d355b7f7564121cfacf63 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py310hf462985_0.conda#93ae40b74b2baea09ddeaa287b09e705 https://conda.anaconda.org/conda-forge/noarch/iris-3.10.0-pyha770c72_1.conda#b7212cd8247ce909631fdcb77015914a https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_0.conda#9075bd8c033f0257122300db914e49c9 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_0.conda#b3bcc38c471ebb738854f52a36059b48 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 31a6fb12..6e8e830a 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -55,7 +55,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2. https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.1.0-h69a702a_1.conda#16cec94c5992d7f42ae3f9fa8b25df8d https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda#f4cc49d7aa68316213e4b12be35308d1 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.1-hadc24fc_0.conda#36f79405ab16bf271edb55b213836dac https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.16-hb9d3cd8_1.conda#3601598f0db0470af28985e3e7ad0158 @@ -76,7 +76,7 @@ https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f4 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_hac2b453_1.conda#ae05ece66d3924ac3d48b4aa3fa96cec https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h46a8edc_4.conda#a7e3a62981350e232e0e7345b5aea580 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-he7c6b58_4.conda#08a9265c637230c37cb1be4a6cad4536 -https://conda.anaconda.org/conda-forge/linux-64/python-3.11.9-hb806964_0_cpython.conda#ac68acfa8b558ed406c75e98d3428d7b +https://conda.anaconda.org/conda-forge/linux-64/python-3.11.10-hc5c86c4_0_cpython.conda#43a02ff0a2dafe8a8a1b6a9eacdbd2cc https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.46.1-h9eae976_0.conda#b2b3e737da0ae347e16ef1970a5d3f14 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-hb711507_1.conda#4a6d410296d7e39f00bacdee7df046e9 https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb @@ -97,7 +97,7 @@ https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5 https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py311h38be061_3.conda#1c33f55e5cdcc2a2b973c432b5225bfe https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 -https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.4-pyhd8ed1ab_0.conda#0e7e4388e9d5283e22b35a9443bdbcc9 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.0-pyhd8ed1ab_0.conda#ec288789b07ae3be555046e099798a56 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.9.0-pyhff2d567_0.conda#ace4329fbff4c69ab0309db6da182987 https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 @@ -109,13 +109,13 @@ https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.4.0-pyhd8ed1ab_ https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py311hd18a35c_0.conda#be34c90cce87090d24da64a7c239ca96 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-23_linux64_openblas.conda#96c8450a40aa2b9733073a9460de972c -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.9.1-hdb1bdb2_0.conda#7da1d242ca3591e174a3c7d82230d3c0 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.10.0-hbbe4b11_0.conda#657ea309ad90675ef144e7d27a271ab9 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py311h9ecbd09_1.conda#c30e9e5aef9e9ff7fb593736ce2a4546 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.2-pyhd8ed1ab_0.conda#6f6cf28bf8e021933869bae3f84b8fc9 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.2-pyhd8ed1ab_0.conda#e1a2dfcd5695f0744f1bcd3bbfe02523 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda#b7f5c092b8f9800150d998a71b76d5a1 @@ -123,7 +123,7 @@ https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.4-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py311h9ecbd09_1.conda#b1796d741ca619dbacb79917b20e5a05 -https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad +https://conda.anaconda.org/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_0.conda#260009d03c9d5c0f111904d851f053dc https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py311h9ecbd09_1.conda#abeb54d40f439b86f75ea57045ab8496 https://conda.anaconda.org/conda-forge/noarch/setuptools-73.0.1-pyhd8ed1ab_0.conda#f0b618d7673d1b2464f600b34d912f6f https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 @@ -136,43 +136,43 @@ https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c7 https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda#d44e3b085abcaef02983c6305b84b584 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a -https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.1-pyhd8ed1ab_0.conda#74a4befb4b38897e19a107693e49da20 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.2-pyhd8ed1ab_0.conda#4daaed111c05672ae669f7036ee5bba3 https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311hf29c0ef_0.conda#55553ecd5328336368db611f350b7039 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.1-py311h9ecbd09_1.conda#a36ccf0f3d2eb95a0ecc293f5f56e080 https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.1-py311h9ecbd09_1.conda#89ed1820af1523df84171049199ed915 https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.4.0-pyha770c72_0.conda#6e3dbc422d3749ad72659243d6ac8b2b +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda#54198435fce4d64d8a89af22573012a8 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-23_linux64_openblas.conda#eede29b40efa878cbe5bdcb767e97310 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-ha6d2627_1004.conda#df069bea331c8486ac21814969301c1f https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-23_linux64_openblas.conda#2af0879961951987e464722fd00ec1e0 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda#dfe0528d0f1c16c1f7c528ea5536ab30 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/linux-64/pillow-10.4.0-py311h82a398c_0.conda#b9e0ac1f5564b6572a6d702c04207be8 +https://conda.anaconda.org/conda-forge/linux-64/pillow-10.4.0-py311h4aec55e_1.conda#4484d021b3bf4938b8c75fe418bfd27b https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda#6c78fbb8ddfd64bcb55b5cbafd2d2c43 https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.1-h54d7996_1.conda#e479d1991c725e1a355f33c0e40dbc66 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.7.1-pyhd8ed1ab_0.conda#8e2946459d7f721f8e85b6db185d6338 -https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.2-pyhd8ed1ab_0.conda#e010a224b90f1f623a917c35addbb924 +https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda#c03d61f31f38fdb9facf70c29958bf7a https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.3-pyhd8ed1ab_0.conda#284008712816c64c85bf2b7fa9f3b264 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.4-pyhd8ed1ab_0.conda#14c15fa7def506fe7d1a0e3abdc212d6 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h4bc722e_1.conda#749baebe7e2ff3360630e069175e528b https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.4.0-hd8ed1ab_0.conda#01b7411c765c3d863dcc920207f258bd +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.5.0-hd8ed1ab_0.conda#2a92e152208121afadf85a5e1f3a5f4d https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h135f659_114.conda#a908e463c710bd6b10a9eaa89fdf003c https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.conda#a502d7aad449a1206efb366d6a12c52d https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311h58d3061_9.conda#27b5add49cad0a417cb22f067f89955c https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda#ba9f7f0ec4f2a18de3e7bce67c4a431e -https://conda.anaconda.org/conda-forge/noarch/tox-4.18.0-pyhd8ed1ab_0.conda#d9fd7cdd9af0da9b217f1c31f03c930a -https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311h9547e67_4.conda#586da7df03b68640de14dc3e8bcbf76f +https://conda.anaconda.org/conda-forge/noarch/tox-4.18.1-pyhd8ed1ab_0.conda#67049306e39f2f9828069ec6fecebb54 +https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hd18a35c_5.conda#4e8447ca8558a203ec0577b4730073f3 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311hbc35293_1.conda#aec590674ba365e50ae83aa2d6e1efae https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h9f3472d_1.conda#2c3c4f115d28ed9e001a271d5d8585aa https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.0-py311hd18a35c_1.conda#f709f23e2b1b93b3b6a20e9e7217a258 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.9.0-pyhd8ed1ab_0.conda#8e6585b996dfa6fff92d7ccd0f18bb99 https://conda.anaconda.org/conda-forge/noarch/identify-2.6.0-pyhd8ed1ab_0.conda#f80cc5989f445f23b1622d6c455896d9 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py311h459d7ec_1.conda#45b8d355bbcdd27588c2d266bcfdff84 @@ -183,13 +183,13 @@ https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.6-py311h9036bbf_1.co https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h9f3472d_6.conda#ac7dc7f70f8d2c1d96ecb7e4cb196498 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.37.0-h8bb6dbc_0.conda#977e230843c4747236c5972a69b1121d -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.2-py311h74b4f7c_0.conda#de8e36c9792f14eed7e11e672f03fbf0 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.2-py311h2b939e6_1.conda#db431da3476c884ef08d9f42a32913b6 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.1-nompi_py311hae66bec_102.conda#87b59caea7db5b79766e0776953d8c66 -https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.8.0-pyha770c72_0.conda#1822e87a5d357f79c6aab871d86fb062 +https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.8.0-pyha770c72_1.conda#004cff3a7f6fafb0a041fb575de85185 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py311h14de704_1.conda#27e5956e552c6e71f56cb1ec042617a8 +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py311h7db5c69_2.conda#abbee22293e6c094fbe139615cba1572 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_0.conda#2cc61ba1dd53f0806247333f1294e058 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.1-py311h9f3472d_1.conda#9abbec46f2f53df6be65f0dfdf85358a +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py311h9f3472d_0.conda#648bccc358ec5b19dec01a5685f3aeb9 https://conda.anaconda.org/conda-forge/noarch/iris-3.10.0-pyha770c72_1.conda#b7212cd8247ce909631fdcb77015914a https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_0.conda#9075bd8c033f0257122300db914e49c9 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_0.conda#b3bcc38c471ebb738854f52a36059b48 diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 3c8557b9..b96d1cb7 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -55,7 +55,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2. https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.1.0-h69a702a_1.conda#16cec94c5992d7f42ae3f9fa8b25df8d https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda#f4cc49d7aa68316213e4b12be35308d1 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.1-hadc24fc_0.conda#36f79405ab16bf271edb55b213836dac https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.16-hb9d3cd8_1.conda#3601598f0db0470af28985e3e7ad0158 @@ -97,7 +97,7 @@ https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5 https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py312h7900ff3_3.conda#1b90835ae26b9b8250b302649359a989 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 -https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.4-pyhd8ed1ab_0.conda#0e7e4388e9d5283e22b35a9443bdbcc9 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.0-pyhd8ed1ab_0.conda#ec288789b07ae3be555046e099798a56 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.9.0-pyhff2d567_0.conda#ace4329fbff4c69ab0309db6da182987 https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 @@ -109,13 +109,13 @@ https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.4.0-pyhd8ed1ab_ https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py312h68727a3_0.conda#444266743652a4f1538145e9362f6d3b https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-23_linux64_openblas.conda#96c8450a40aa2b9733073a9460de972c -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.9.1-hdb1bdb2_0.conda#7da1d242ca3591e174a3c7d82230d3c0 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.10.0-hbbe4b11_0.conda#657ea309ad90675ef144e7d27a271ab9 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py312h66e93f0_1.conda#80b79ce0d3dc127e96002dfdcec0a2a5 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.2-pyhd8ed1ab_0.conda#6f6cf28bf8e021933869bae3f84b8fc9 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.2-pyhd8ed1ab_0.conda#e1a2dfcd5695f0744f1bcd3bbfe02523 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda#b7f5c092b8f9800150d998a71b76d5a1 @@ -123,7 +123,7 @@ https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.4-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f0_1.conda#39aed2afe4d0cf76ab3d6b09eecdbea7 -https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad +https://conda.anaconda.org/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_0.conda#260009d03c9d5c0f111904d851f053dc https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h66e93f0_1.conda#549e5930e768548a89c23f595dac5a95 https://conda.anaconda.org/conda-forge/noarch/setuptools-73.0.1-pyhd8ed1ab_0.conda#f0b618d7673d1b2464f600b34d912f6f https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 @@ -136,43 +136,43 @@ https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c7 https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda#d44e3b085abcaef02983c6305b84b584 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a -https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.1-pyhd8ed1ab_0.conda#74a4befb4b38897e19a107693e49da20 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.2-pyhd8ed1ab_0.conda#4daaed111c05672ae669f7036ee5bba3 https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda#a861504bbea4161a9170b85d4d2be840 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.1-py312h66e93f0_1.conda#5dc6e358ee0af388564bd0eba635cf9e https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.1-py312h66e93f0_1.conda#7abb7d39d482ac3b8e27e6c0fff3b168 https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.4.0-pyha770c72_0.conda#6e3dbc422d3749ad72659243d6ac8b2b +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda#54198435fce4d64d8a89af22573012a8 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-23_linux64_openblas.conda#eede29b40efa878cbe5bdcb767e97310 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-ha6d2627_1004.conda#df069bea331c8486ac21814969301c1f https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-23_linux64_openblas.conda#2af0879961951987e464722fd00ec1e0 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda#dfe0528d0f1c16c1f7c528ea5536ab30 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/linux-64/pillow-10.4.0-py312h287a98d_0.conda#59ea71eed98aee0bebbbdd3b118167c7 +https://conda.anaconda.org/conda-forge/linux-64/pillow-10.4.0-py312h56024de_1.conda#4bd6077376c7f9c1ce33fd8319069e5b https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda#6c78fbb8ddfd64bcb55b5cbafd2d2c43 https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.1-h54d7996_1.conda#e479d1991c725e1a355f33c0e40dbc66 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.7.1-pyhd8ed1ab_0.conda#8e2946459d7f721f8e85b6db185d6338 -https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.2-pyhd8ed1ab_0.conda#e010a224b90f1f623a917c35addbb924 +https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda#c03d61f31f38fdb9facf70c29958bf7a https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.3-pyhd8ed1ab_0.conda#284008712816c64c85bf2b7fa9f3b264 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.4-pyhd8ed1ab_0.conda#14c15fa7def506fe7d1a0e3abdc212d6 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h4bc722e_1.conda#749baebe7e2ff3360630e069175e528b https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.4.0-hd8ed1ab_0.conda#01b7411c765c3d863dcc920207f258bd +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.5.0-hd8ed1ab_0.conda#2a92e152208121afadf85a5e1f3a5f4d https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h135f659_114.conda#a908e463c710bd6b10a9eaa89fdf003c https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda#d8285bea2a350f63fab23bf460221f3f https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py312h9211aeb_9.conda#173afeb0d112c854fd1a9fcac4b5cce3 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda#ba9f7f0ec4f2a18de3e7bce67c4a431e -https://conda.anaconda.org/conda-forge/noarch/tox-4.18.0-pyhd8ed1ab_0.conda#d9fd7cdd9af0da9b217f1c31f03c930a -https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h8572e83_4.conda#52c9e25ee0a32485a102eeecdb7eef52 +https://conda.anaconda.org/conda-forge/noarch/tox-4.18.1-pyhd8ed1ab_0.conda#67049306e39f2f9828069ec6fecebb54 +https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h68727a3_5.conda#f9664ee31aed96c85b7319ab0a693341 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda#8b7069e9792ee4e5b4919a7a306d2e67 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312hc0a28a1_1.conda#990033147b0a998e756eaaed6b28f48d https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.0-py312h68727a3_1.conda#6b9f9141c247bdd61a2d6d37e0a8b530 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.9.0-pyhd8ed1ab_0.conda#8e6585b996dfa6fff92d7ccd0f18bb99 https://conda.anaconda.org/conda-forge/noarch/identify-2.6.0-pyhd8ed1ab_0.conda#f80cc5989f445f23b1622d6c455896d9 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py312h98912ed_1.conda#d5273d1e67b7b3a871a0a711c6532a2f @@ -183,13 +183,13 @@ https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.6-py312h6cab151_1.co https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py312hc0a28a1_6.conda#fa4853d25b6fbfef5eb7b3e1b5616dd5 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.37.0-h8bb6dbc_0.conda#977e230843c4747236c5972a69b1121d -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.2-py312h854627b_0.conda#a57b0ae7c0aac603839a4e83a3e997d6 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.2-py312hd3ec401_1.conda#2f4f3854f23be30de29e9e4d39758349 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.1-nompi_py312h21d6d8e_102.conda#9049ba34261ce7106220711d313fcf61 -https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.8.0-pyha770c72_0.conda#1822e87a5d357f79c6aab871d86fb062 +https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.8.0-pyha770c72_1.conda#004cff3a7f6fafb0a041fb575de85185 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py312h1d6d2e6_1.conda#6392d3ce615ab0f32bc39b07f8f4c300 +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py312hf9745cd_2.conda#cc3ecff140731b46b970a7c4787b1823 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_0.conda#2cc61ba1dd53f0806247333f1294e058 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.1-py312hc0a28a1_1.conda#2c25b6709962640f7b6ecffeeeb456a6 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py312hc0a28a1_0.conda#476b0357e207e10d2b7b13ed82156e6d https://conda.anaconda.org/conda-forge/noarch/iris-3.10.0-pyha770c72_1.conda#b7212cd8247ce909631fdcb77015914a https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_0.conda#9075bd8c033f0257122300db914e49c9 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_0.conda#b3bcc38c471ebb738854f52a36059b48 From 10ea0015895d7fcc53a99320ef2a87b8ef3b9c4a Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 17 Sep 2024 12:26:25 +0100 Subject: [PATCH 369/583] chore: update pre-commit hooks (#543) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.6.4 → v0.6.5](https://github.com/astral-sh/ruff-pre-commit/compare/v0.6.4...v0.6.5) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c77cd76a..013bbdd7 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -51,7 +51,7 @@ repos: - id: trailing-whitespace - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.6.4" + rev: "v0.6.5" hooks: - id: ruff types: [file, python] From 8e23944f895da1be2ab6bd4d2f13b2359d8193df Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 19 Sep 2024 18:21:05 +0100 Subject: [PATCH 370/583] Bump scitools/workflows in the dependencies group (#544) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2024.09.4 to 2024.09.6 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2024.09.4...2024.09.6) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 63f6ed89..567bc9c9 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.09.4 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.09.6 diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index d089db21..8c240da3 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.09.4 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.09.6 secrets: inherit From 2d8a565641261b445f88c4c4dea322804ac4090c Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2024 11:43:09 +0100 Subject: [PATCH 371/583] Updated environment lockfiles (#545) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 48 +++++++++++++------------- requirements/locks/py311-linux-64.lock | 46 ++++++++++++------------ requirements/locks/py312-linux-64.lock | 46 ++++++++++++------------ 3 files changed, 70 insertions(+), 70 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 8620773f..d81a639a 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -16,6 +16,11 @@ https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h69a702a_1.cond https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.1.0-hc5f4f2c_1.conda#10a0cef64b784d6ab6da50ebca4e984d https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.1.0-hc0a3c3a_1.conda#9dbb9699ea467983ba8a4ba89b08b066 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.2-hb9d3cd8_0.conda#4d638782050ab6faa27275bed57e9b4e +https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e +https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-hb9d3cd8_1003.conda#32623b33f2047dbc9ae2f2e8fd3880e9 +https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-hb9d3cd8_1003.conda#e87bfacb110d85e1eb6099c9ed8e7236 +https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-hb9d3cd8_1004.conda#bc4cd53a083b6720d61a1519a1900878 +https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-hb9d3cd8_1008.conda#a63f5b66876bb1ec734ab4bdc4d11e86 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.33.1-heb4867d_0.conda#0d3c60291342c0c025db231353376dfb https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 @@ -35,13 +40,9 @@ https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.co https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda#70caf8bb6cf39a0b6b7efc885f51c0fe -https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 -https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b -https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a +https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda#2c80dc38fface310c9bd81b17037fee5 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2#be93aabceefa2fac576e971aef407908 -https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h0b41bf4_1003.conda#bce9f945da8ad2ae9b1d7165a64d0f87 -https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007.tar.bz2#b4a4381d54784606820704f7b5f05a15 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae @@ -59,14 +60,13 @@ https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda#f https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.1-hadc24fc_0.conda#36f79405ab16bf271edb55b213836dac https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.16-hb9d3cd8_1.conda#3601598f0db0470af28985e3e7ad0158 -https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b +https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.1-hf83b1b0_0.conda#e8536ec89df2aec5f65fefcf4ccd58ba https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-ha2e4443_0.conda#6b7dcc7349efd123d493d2dbe85a045f https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 -https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-h4ab18f5_1.conda#9653f1bf3766164d0e65fa723cabbc54 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-hef167b5_0.conda#54fe76ab3d0189acaef95156874db7f9 @@ -74,9 +74,9 @@ https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_hac2b453_1.conda#ae05ece66d3924ac3d48b4aa3fa96cec -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h46a8edc_4.conda#a7e3a62981350e232e0e7345b5aea580 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-h6565414_0.conda#80eaf80d84668fa5620ac9ec1b4bf56f https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-he7c6b58_4.conda#08a9265c637230c37cb1be4a6cad4536 -https://conda.anaconda.org/conda-forge/linux-64/python-3.10.14-hd12c33a_0_cpython.conda#2b4ba962994e8bd4be9ff5b64b75aff2 +https://conda.anaconda.org/conda-forge/linux-64/python-3.10.15-h4a871b0_0_cpython.conda#f5c36ac89c928702bcfd2e2d567048d9 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.46.1-h9eae976_0.conda#b2b3e737da0ae347e16ef1970a5d3f14 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-hb711507_1.conda#4a6d410296d7e39f00bacdee7df046e9 https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb @@ -97,25 +97,25 @@ https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5 https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py310hff52083_3.conda#c159dcd29bbd80b187b1c5d5f73cc971 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 -https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.0-pyhd8ed1ab_0.conda#ec288789b07ae3be555046e099798a56 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_0.conda#916f8ec5dd4128cd5f207a3c4c07b2c6 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.9.0-pyhff2d567_0.conda#ace4329fbff4c69ab0309db6da182987 https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2#9f765cbfab6870c8435b9eefecd7a1f4 -https://conda.anaconda.org/conda-forge/noarch/idna-3.8-pyhd8ed1ab_0.conda#99e164522f6bdf23c177c8d9ae63f975 +https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_0.conda#7ba2ede0e7c795ff95088daf0dc59753 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 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/kiwisolver-1.4.7-py310h3788b33_0.conda#4186d9b4d004b0fe0de6aa62496fb48a https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-23_linux64_openblas.conda#96c8450a40aa2b9733073a9460de972c -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.10.0-hbbe4b11_0.conda#657ea309ad90675ef144e7d27a271ab9 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-24_linux64_openblas.conda#80aea6603a6813b16ec119d00382b772 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.10.1-hbbe4b11_0.conda#6e801c50a40301f6978c53976917b277 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py310ha75aee5_1.conda#14ae296598aab54a26ab8c095f57db10 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.2-pyhd8ed1ab_0.conda#e1a2dfcd5695f0744f1bcd3bbfe02523 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_0.conda#fd8f2b18b65bbf62e8f653100690c8d2 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda#b7f5c092b8f9800150d998a71b76d5a1 @@ -125,7 +125,7 @@ https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py310ha75aee5_1.conda#8b430470d53744289cb5499bc99a6485 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_0.conda#260009d03c9d5c0f111904d851f053dc https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py310ha75aee5_1.conda#0d4c5c76ae5f5aac6f0be419963a19dd -https://conda.anaconda.org/conda-forge/noarch/setuptools-73.0.1-pyhd8ed1ab_0.conda#f0b618d7673d1b2464f600b34d912f6f +https://conda.anaconda.org/conda-forge/noarch/setuptools-74.1.2-pyhd8ed1ab_0.conda#56c9c11d004428e81d02eeb730fc6336 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 @@ -146,42 +146,42 @@ https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda#54198435fce4d64d8a89af22573012a8 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-23_linux64_openblas.conda#eede29b40efa878cbe5bdcb767e97310 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-24_linux64_openblas.conda#f5b8822297c9c790cec0795ca1fc9be6 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-ha6d2627_1004.conda#df069bea331c8486ac21814969301c1f -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-23_linux64_openblas.conda#2af0879961951987e464722fd00ec1e0 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-24_linux64_openblas.conda#fd540578678aefe025705f4b58b36b2e https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda#dfe0528d0f1c16c1f7c528ea5536ab30 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.4.0-py310he228d35_1.conda#267bd9088c6aa5ae96dceb470fa6efa9 https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda#6c78fbb8ddfd64bcb55b5cbafd2d2c43 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.1-h54d7996_1.conda#e479d1991c725e1a355f33c0e40dbc66 -https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.7.1-pyhd8ed1ab_0.conda#8e2946459d7f721f8e85b6db185d6338 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.5.0-h12925eb_0.conda#8c29983ebe50cc7e0998c34bc7614222 +https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.8.0-pyhd8ed1ab_0.conda#43bc5b655d19dd7e9bd5951b11cfa0a0 https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda#c03d61f31f38fdb9facf70c29958bf7a https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.4-pyhd8ed1ab_0.conda#14c15fa7def506fe7d1a0e3abdc212d6 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.5-pyhd8ed1ab_0.conda#949a6778521278cb96d7491bd99a5418 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h4bc722e_1.conda#749baebe7e2ff3360630e069175e528b https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.5.0-hd8ed1ab_0.conda#2a92e152208121afadf85a5e1f3a5f4d https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h135f659_114.conda#a908e463c710bd6b10a9eaa89fdf003c https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py310hb13e2d6_0.conda#6593de64c935768b6bad3e19b3e978be -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py310h3160ae9_9.conda#b6401dcb8cc978d5c8eb40cbacc7540a +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py310h2e9f774_10.conda#094677406ae61569cc928f53522a3c19 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda#ba9f7f0ec4f2a18de3e7bce67c4a431e -https://conda.anaconda.org/conda-forge/noarch/tox-4.18.1-pyhd8ed1ab_0.conda#67049306e39f2f9828069ec6fecebb54 +https://conda.anaconda.org/conda-forge/noarch/tox-4.20.0-pyhd8ed1ab_0.conda#d6681d3720a2cb12f2d6184d9a75ad81 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310h3788b33_5.conda#e05b0475166b68c9dc4d7937e0315654 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha39cb0e_1.conda#f49de34fb99934bf49ab330b5caffd64 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310hf462985_1.conda#c2d5289e6cbcecf2c549e01772fe5274 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.0-py310h3788b33_1.conda#05eccc0bacdbcc8a5ad3c7b35b7e1cd5 https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.9.0-pyhd8ed1ab_0.conda#8e6585b996dfa6fff92d7ccd0f18bb99 -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.0-pyhd8ed1ab_0.conda#f80cc5989f445f23b1622d6c455896d9 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.1-pyhd8ed1ab_0.conda#43f629202f9eec21be5f71171fb5daf8 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py310h2372a71_1.conda#dfcf64f67961eb9686676f96fdb4b4d1 https://conda.anaconda.org/conda-forge/noarch/nox-2024.4.15-pyhff2d567_0.conda#600c0de12125f473d8099c0b3e6f88d4 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.1-py310ha3fb0e1_0.conda#dcca3051fda0f861e8111c6368842a28 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.1.0-hd8ed1ab_0.conda#7ed7b077f6c6ebcb5fc66f23985df487 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.6-py310h64a4ca9_1.conda#cac7e9a8dcd64d40a83fafff87fbf3c1 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.3-pyhd8ed1ab_0.conda#6b55867f385dd762ed99ea687af32a69 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py310hf462985_6.conda#b8ad2d561f4e0db4f09d06cc0e73e0b0 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.37.0-h8bb6dbc_0.conda#977e230843c4747236c5972a69b1121d https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.2-py310h68603db_1.conda#989ef368e7b81b6c28e608e651a2a7d8 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 6e8e830a..d3adc82e 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -16,6 +16,11 @@ https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h69a702a_1.cond https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.1.0-hc5f4f2c_1.conda#10a0cef64b784d6ab6da50ebca4e984d https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.1.0-hc0a3c3a_1.conda#9dbb9699ea467983ba8a4ba89b08b066 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.2-hb9d3cd8_0.conda#4d638782050ab6faa27275bed57e9b4e +https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e +https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-hb9d3cd8_1003.conda#32623b33f2047dbc9ae2f2e8fd3880e9 +https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-hb9d3cd8_1003.conda#e87bfacb110d85e1eb6099c9ed8e7236 +https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-hb9d3cd8_1004.conda#bc4cd53a083b6720d61a1519a1900878 +https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-hb9d3cd8_1008.conda#a63f5b66876bb1ec734ab4bdc4d11e86 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.33.1-heb4867d_0.conda#0d3c60291342c0c025db231353376dfb https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 @@ -35,13 +40,9 @@ https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.co https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda#70caf8bb6cf39a0b6b7efc885f51c0fe -https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 -https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b -https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a +https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda#2c80dc38fface310c9bd81b17037fee5 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2#be93aabceefa2fac576e971aef407908 -https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h0b41bf4_1003.conda#bce9f945da8ad2ae9b1d7165a64d0f87 -https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007.tar.bz2#b4a4381d54784606820704f7b5f05a15 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae @@ -59,14 +60,13 @@ https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda#f https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.1-hadc24fc_0.conda#36f79405ab16bf271edb55b213836dac https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.16-hb9d3cd8_1.conda#3601598f0db0470af28985e3e7ad0158 -https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b +https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.1-hf83b1b0_0.conda#e8536ec89df2aec5f65fefcf4ccd58ba https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-ha2e4443_0.conda#6b7dcc7349efd123d493d2dbe85a045f https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 -https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-h4ab18f5_1.conda#9653f1bf3766164d0e65fa723cabbc54 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-hef167b5_0.conda#54fe76ab3d0189acaef95156874db7f9 @@ -74,7 +74,7 @@ https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_hac2b453_1.conda#ae05ece66d3924ac3d48b4aa3fa96cec -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h46a8edc_4.conda#a7e3a62981350e232e0e7345b5aea580 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-h6565414_0.conda#80eaf80d84668fa5620ac9ec1b4bf56f https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-he7c6b58_4.conda#08a9265c637230c37cb1be4a6cad4536 https://conda.anaconda.org/conda-forge/linux-64/python-3.11.10-hc5c86c4_0_cpython.conda#43a02ff0a2dafe8a8a1b6a9eacdbd2cc https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.46.1-h9eae976_0.conda#b2b3e737da0ae347e16ef1970a5d3f14 @@ -97,25 +97,25 @@ https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5 https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py311h38be061_3.conda#1c33f55e5cdcc2a2b973c432b5225bfe https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 -https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.0-pyhd8ed1ab_0.conda#ec288789b07ae3be555046e099798a56 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_0.conda#916f8ec5dd4128cd5f207a3c4c07b2c6 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.9.0-pyhff2d567_0.conda#ace4329fbff4c69ab0309db6da182987 https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2#9f765cbfab6870c8435b9eefecd7a1f4 -https://conda.anaconda.org/conda-forge/noarch/idna-3.8-pyhd8ed1ab_0.conda#99e164522f6bdf23c177c8d9ae63f975 +https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_0.conda#7ba2ede0e7c795ff95088daf0dc59753 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 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/kiwisolver-1.4.7-py311hd18a35c_0.conda#be34c90cce87090d24da64a7c239ca96 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-23_linux64_openblas.conda#96c8450a40aa2b9733073a9460de972c -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.10.0-hbbe4b11_0.conda#657ea309ad90675ef144e7d27a271ab9 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-24_linux64_openblas.conda#80aea6603a6813b16ec119d00382b772 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.10.1-hbbe4b11_0.conda#6e801c50a40301f6978c53976917b277 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py311h9ecbd09_1.conda#c30e9e5aef9e9ff7fb593736ce2a4546 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.2-pyhd8ed1ab_0.conda#e1a2dfcd5695f0744f1bcd3bbfe02523 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_0.conda#fd8f2b18b65bbf62e8f653100690c8d2 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda#b7f5c092b8f9800150d998a71b76d5a1 @@ -125,7 +125,7 @@ https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py311h9ecbd09_1.conda#b1796d741ca619dbacb79917b20e5a05 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_0.conda#260009d03c9d5c0f111904d851f053dc https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py311h9ecbd09_1.conda#abeb54d40f439b86f75ea57045ab8496 -https://conda.anaconda.org/conda-forge/noarch/setuptools-73.0.1-pyhd8ed1ab_0.conda#f0b618d7673d1b2464f600b34d912f6f +https://conda.anaconda.org/conda-forge/noarch/setuptools-74.1.2-pyhd8ed1ab_0.conda#56c9c11d004428e81d02eeb730fc6336 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 @@ -145,42 +145,42 @@ https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda#54198435fce4d64d8a89af22573012a8 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-23_linux64_openblas.conda#eede29b40efa878cbe5bdcb767e97310 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-24_linux64_openblas.conda#f5b8822297c9c790cec0795ca1fc9be6 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-ha6d2627_1004.conda#df069bea331c8486ac21814969301c1f -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-23_linux64_openblas.conda#2af0879961951987e464722fd00ec1e0 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-24_linux64_openblas.conda#fd540578678aefe025705f4b58b36b2e https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda#dfe0528d0f1c16c1f7c528ea5536ab30 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.4.0-py311h4aec55e_1.conda#4484d021b3bf4938b8c75fe418bfd27b https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda#6c78fbb8ddfd64bcb55b5cbafd2d2c43 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.1-h54d7996_1.conda#e479d1991c725e1a355f33c0e40dbc66 -https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.7.1-pyhd8ed1ab_0.conda#8e2946459d7f721f8e85b6db185d6338 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.5.0-h12925eb_0.conda#8c29983ebe50cc7e0998c34bc7614222 +https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.8.0-pyhd8ed1ab_0.conda#43bc5b655d19dd7e9bd5951b11cfa0a0 https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda#c03d61f31f38fdb9facf70c29958bf7a https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.4-pyhd8ed1ab_0.conda#14c15fa7def506fe7d1a0e3abdc212d6 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.5-pyhd8ed1ab_0.conda#949a6778521278cb96d7491bd99a5418 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h4bc722e_1.conda#749baebe7e2ff3360630e069175e528b https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.5.0-hd8ed1ab_0.conda#2a92e152208121afadf85a5e1f3a5f4d https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h135f659_114.conda#a908e463c710bd6b10a9eaa89fdf003c https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.conda#a502d7aad449a1206efb366d6a12c52d -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311h58d3061_9.conda#27b5add49cad0a417cb22f067f89955c +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311h0f98d5a_10.conda#37f7e40c0afe09d0f15f0da92bbde054 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda#ba9f7f0ec4f2a18de3e7bce67c4a431e -https://conda.anaconda.org/conda-forge/noarch/tox-4.18.1-pyhd8ed1ab_0.conda#67049306e39f2f9828069ec6fecebb54 +https://conda.anaconda.org/conda-forge/noarch/tox-4.20.0-pyhd8ed1ab_0.conda#d6681d3720a2cb12f2d6184d9a75ad81 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hd18a35c_5.conda#4e8447ca8558a203ec0577b4730073f3 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311hbc35293_1.conda#aec590674ba365e50ae83aa2d6e1efae https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h9f3472d_1.conda#2c3c4f115d28ed9e001a271d5d8585aa https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.0-py311hd18a35c_1.conda#f709f23e2b1b93b3b6a20e9e7217a258 https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.9.0-pyhd8ed1ab_0.conda#8e6585b996dfa6fff92d7ccd0f18bb99 -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.0-pyhd8ed1ab_0.conda#f80cc5989f445f23b1622d6c455896d9 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.1-pyhd8ed1ab_0.conda#43f629202f9eec21be5f71171fb5daf8 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py311h459d7ec_1.conda#45b8d355bbcdd27588c2d266bcfdff84 https://conda.anaconda.org/conda-forge/noarch/nox-2024.4.15-pyhff2d567_0.conda#600c0de12125f473d8099c0b3e6f88d4 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.1-py311he1f765f_0.conda#eb7e2a849cd47483d7e9eeb728c7a8c5 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.1.0-hd8ed1ab_0.conda#7ed7b077f6c6ebcb5fc66f23985df487 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.6-py311h9036bbf_1.conda#03346d2520dd112d92380c08ee3f66fe -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.3-pyhd8ed1ab_0.conda#6b55867f385dd762ed99ea687af32a69 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h9f3472d_6.conda#ac7dc7f70f8d2c1d96ecb7e4cb196498 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.37.0-h8bb6dbc_0.conda#977e230843c4747236c5972a69b1121d https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.2-py311h2b939e6_1.conda#db431da3476c884ef08d9f42a32913b6 diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index b96d1cb7..d94ed97a 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -16,6 +16,11 @@ https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h69a702a_1.cond https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.1.0-hc5f4f2c_1.conda#10a0cef64b784d6ab6da50ebca4e984d https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.1.0-hc0a3c3a_1.conda#9dbb9699ea467983ba8a4ba89b08b066 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.2-hb9d3cd8_0.conda#4d638782050ab6faa27275bed57e9b4e +https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e +https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-hb9d3cd8_1003.conda#32623b33f2047dbc9ae2f2e8fd3880e9 +https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-hb9d3cd8_1003.conda#e87bfacb110d85e1eb6099c9ed8e7236 +https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-hb9d3cd8_1004.conda#bc4cd53a083b6720d61a1519a1900878 +https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-hb9d3cd8_1008.conda#a63f5b66876bb1ec734ab4bdc4d11e86 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.33.1-heb4867d_0.conda#0d3c60291342c0c025db231353376dfb https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 @@ -35,13 +40,9 @@ https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.co https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda#70caf8bb6cf39a0b6b7efc885f51c0fe -https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 -https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b -https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a +https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda#2c80dc38fface310c9bd81b17037fee5 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2#be93aabceefa2fac576e971aef407908 -https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h0b41bf4_1003.conda#bce9f945da8ad2ae9b1d7165a64d0f87 -https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007.tar.bz2#b4a4381d54784606820704f7b5f05a15 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae @@ -59,14 +60,13 @@ https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda#f https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.1-hadc24fc_0.conda#36f79405ab16bf271edb55b213836dac https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.16-hb9d3cd8_1.conda#3601598f0db0470af28985e3e7ad0158 -https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b +https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.1-hf83b1b0_0.conda#e8536ec89df2aec5f65fefcf4ccd58ba https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-ha2e4443_0.conda#6b7dcc7349efd123d493d2dbe85a045f https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 -https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-h4ab18f5_1.conda#9653f1bf3766164d0e65fa723cabbc54 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-hef167b5_0.conda#54fe76ab3d0189acaef95156874db7f9 @@ -74,7 +74,7 @@ https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_hac2b453_1.conda#ae05ece66d3924ac3d48b4aa3fa96cec -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h46a8edc_4.conda#a7e3a62981350e232e0e7345b5aea580 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-h6565414_0.conda#80eaf80d84668fa5620ac9ec1b4bf56f https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-he7c6b58_4.conda#08a9265c637230c37cb1be4a6cad4536 https://conda.anaconda.org/conda-forge/linux-64/python-3.12.5-h2ad013b_0_cpython.conda#9c56c4df45f6571b13111d8df2448692 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.46.1-h9eae976_0.conda#b2b3e737da0ae347e16ef1970a5d3f14 @@ -97,25 +97,25 @@ https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5 https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py312h7900ff3_3.conda#1b90835ae26b9b8250b302649359a989 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 -https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.0-pyhd8ed1ab_0.conda#ec288789b07ae3be555046e099798a56 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_0.conda#916f8ec5dd4128cd5f207a3c4c07b2c6 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.9.0-pyhff2d567_0.conda#ace4329fbff4c69ab0309db6da182987 https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2#9f765cbfab6870c8435b9eefecd7a1f4 -https://conda.anaconda.org/conda-forge/noarch/idna-3.8-pyhd8ed1ab_0.conda#99e164522f6bdf23c177c8d9ae63f975 +https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_0.conda#7ba2ede0e7c795ff95088daf0dc59753 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 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/kiwisolver-1.4.7-py312h68727a3_0.conda#444266743652a4f1538145e9362f6d3b https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-23_linux64_openblas.conda#96c8450a40aa2b9733073a9460de972c -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.10.0-hbbe4b11_0.conda#657ea309ad90675ef144e7d27a271ab9 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-24_linux64_openblas.conda#80aea6603a6813b16ec119d00382b772 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.10.1-hbbe4b11_0.conda#6e801c50a40301f6978c53976917b277 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py312h66e93f0_1.conda#80b79ce0d3dc127e96002dfdcec0a2a5 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.2-pyhd8ed1ab_0.conda#e1a2dfcd5695f0744f1bcd3bbfe02523 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_0.conda#fd8f2b18b65bbf62e8f653100690c8d2 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda#b7f5c092b8f9800150d998a71b76d5a1 @@ -125,7 +125,7 @@ https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f0_1.conda#39aed2afe4d0cf76ab3d6b09eecdbea7 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_0.conda#260009d03c9d5c0f111904d851f053dc https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h66e93f0_1.conda#549e5930e768548a89c23f595dac5a95 -https://conda.anaconda.org/conda-forge/noarch/setuptools-73.0.1-pyhd8ed1ab_0.conda#f0b618d7673d1b2464f600b34d912f6f +https://conda.anaconda.org/conda-forge/noarch/setuptools-74.1.2-pyhd8ed1ab_0.conda#56c9c11d004428e81d02eeb730fc6336 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 @@ -145,42 +145,42 @@ https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda#54198435fce4d64d8a89af22573012a8 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-23_linux64_openblas.conda#eede29b40efa878cbe5bdcb767e97310 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-24_linux64_openblas.conda#f5b8822297c9c790cec0795ca1fc9be6 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-ha6d2627_1004.conda#df069bea331c8486ac21814969301c1f -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-23_linux64_openblas.conda#2af0879961951987e464722fd00ec1e0 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-24_linux64_openblas.conda#fd540578678aefe025705f4b58b36b2e https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda#dfe0528d0f1c16c1f7c528ea5536ab30 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.4.0-py312h56024de_1.conda#4bd6077376c7f9c1ce33fd8319069e5b https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda#6c78fbb8ddfd64bcb55b5cbafd2d2c43 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.1-h54d7996_1.conda#e479d1991c725e1a355f33c0e40dbc66 -https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.7.1-pyhd8ed1ab_0.conda#8e2946459d7f721f8e85b6db185d6338 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.5.0-h12925eb_0.conda#8c29983ebe50cc7e0998c34bc7614222 +https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.8.0-pyhd8ed1ab_0.conda#43bc5b655d19dd7e9bd5951b11cfa0a0 https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda#c03d61f31f38fdb9facf70c29958bf7a https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.4-pyhd8ed1ab_0.conda#14c15fa7def506fe7d1a0e3abdc212d6 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.5-pyhd8ed1ab_0.conda#949a6778521278cb96d7491bd99a5418 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h4bc722e_1.conda#749baebe7e2ff3360630e069175e528b https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.5.0-hd8ed1ab_0.conda#2a92e152208121afadf85a5e1f3a5f4d https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h135f659_114.conda#a908e463c710bd6b10a9eaa89fdf003c https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda#d8285bea2a350f63fab23bf460221f3f -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py312h9211aeb_9.conda#173afeb0d112c854fd1a9fcac4b5cce3 +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py312he630544_10.conda#16371eff7aed913326c41984c8287e8e https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda#ba9f7f0ec4f2a18de3e7bce67c4a431e -https://conda.anaconda.org/conda-forge/noarch/tox-4.18.1-pyhd8ed1ab_0.conda#67049306e39f2f9828069ec6fecebb54 +https://conda.anaconda.org/conda-forge/noarch/tox-4.20.0-pyhd8ed1ab_0.conda#d6681d3720a2cb12f2d6184d9a75ad81 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h68727a3_5.conda#f9664ee31aed96c85b7319ab0a693341 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda#8b7069e9792ee4e5b4919a7a306d2e67 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312hc0a28a1_1.conda#990033147b0a998e756eaaed6b28f48d https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.0-py312h68727a3_1.conda#6b9f9141c247bdd61a2d6d37e0a8b530 https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.9.0-pyhd8ed1ab_0.conda#8e6585b996dfa6fff92d7ccd0f18bb99 -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.0-pyhd8ed1ab_0.conda#f80cc5989f445f23b1622d6c455896d9 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.1-pyhd8ed1ab_0.conda#43f629202f9eec21be5f71171fb5daf8 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py312h98912ed_1.conda#d5273d1e67b7b3a871a0a711c6532a2f https://conda.anaconda.org/conda-forge/noarch/nox-2024.4.15-pyhff2d567_0.conda#600c0de12125f473d8099c0b3e6f88d4 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.1-py312h7d485d2_0.conda#7418a22e73008356d9aba99d93dfeeee https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.1.0-hd8ed1ab_0.conda#7ed7b077f6c6ebcb5fc66f23985df487 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.6-py312h6cab151_1.conda#5be02e05e1adaa42826cc6800ce399bc -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.3-pyhd8ed1ab_0.conda#6b55867f385dd762ed99ea687af32a69 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py312hc0a28a1_6.conda#fa4853d25b6fbfef5eb7b3e1b5616dd5 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.37.0-h8bb6dbc_0.conda#977e230843c4747236c5972a69b1121d https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.2-py312hd3ec401_1.conda#2f4f3854f23be30de29e9e4d39758349 From bad5d9cd00250eb565f83ee439eeec74545068d8 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 24 Sep 2024 09:40:52 +0100 Subject: [PATCH 372/583] chore: update pre-commit hooks (#546) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.6.5 → v0.6.7](https://github.com/astral-sh/ruff-pre-commit/compare/v0.6.5...v0.6.7) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 013bbdd7..7cca504b 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -51,7 +51,7 @@ repos: - id: trailing-whitespace - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.6.5" + rev: "v0.6.7" hooks: - id: ruff types: [file, python] From 51c0c7d51e23fdf6dc7efa9d7bdacbaa935b5abb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 Sep 2024 09:45:43 +0100 Subject: [PATCH 373/583] Bump scitools/workflows in the dependencies group (#547) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2024.09.6 to 2024.09.8 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2024.09.6...2024.09.8) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 567bc9c9..a3bc6b32 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.09.6 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.09.8 diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 8c240da3..9a5d9014 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.09.6 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.09.8 secrets: inherit From ec0f9757ce01a615dfcad0cda6b4681e51cf8087 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 1 Oct 2024 01:22:01 +0100 Subject: [PATCH 374/583] chore: update pre-commit hooks (#548) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.6.7 → v0.6.8](https://github.com/astral-sh/ruff-pre-commit/compare/v0.6.7...v0.6.8) - [github.com/abravalheri/validate-pyproject: v0.19 → v0.20.2](https://github.com/abravalheri/validate-pyproject/compare/v0.19...v0.20.2) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 7cca504b..867e417d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -51,7 +51,7 @@ repos: - id: trailing-whitespace - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.6.7" + rev: "v0.6.8" hooks: - id: ruff types: [file, python] @@ -86,7 +86,7 @@ repos: - repo: https://github.com/abravalheri/validate-pyproject # More exhaustive than Ruff RUF200. - rev: "v0.19" + rev: "v0.20.2" hooks: - id: validate-pyproject From 3dd0d01bf11ce89c00d0f4355436f06ea95682a2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Oct 2024 12:05:58 +0100 Subject: [PATCH 375/583] Bump scitools/workflows in the dependencies group (#549) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2024.09.8 to 2024.09.9 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2024.09.8...2024.09.9) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index a3bc6b32..09ccc26f 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.09.8 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.09.9 diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 9a5d9014..2b91d46a 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.09.8 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.09.9 secrets: inherit From 1133e13b815391914830325de6fafff32c6aaa05 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 8 Oct 2024 09:26:34 +0100 Subject: [PATCH 376/583] chore: update pre-commit hooks (#551) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/pre-commit/pre-commit-hooks: v4.6.0 → v5.0.0](https://github.com/pre-commit/pre-commit-hooks/compare/v4.6.0...v5.0.0) - [github.com/astral-sh/ruff-pre-commit: v0.6.8 → v0.6.9](https://github.com/astral-sh/ruff-pre-commit/compare/v0.6.8...v0.6.9) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 867e417d..5a3637f1 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -23,7 +23,7 @@ minimum_pre_commit_version: 1.21.0 repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.6.0 + rev: v5.0.0 hooks: # Prevent giant files from being committed. - id: check-added-large-files @@ -51,7 +51,7 @@ repos: - id: trailing-whitespace - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.6.8" + rev: "v0.6.9" hooks: - id: ruff types: [file, python] From 24d70103639ae61fa065e1c3ef7edb239c0fb037 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 10 Oct 2024 09:48:45 +0100 Subject: [PATCH 377/583] Bump scitools/workflows in the dependencies group (#552) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2024.09.9 to 2024.10.0 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2024.09.9...2024.10.0) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 09ccc26f..682ca029 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.09.9 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.10.0 diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 2b91d46a..a9004495 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.09.9 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.10.0 secrets: inherit From 12bb4a34572c71c8cddfa8e309f4422c5f774203 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 15 Oct 2024 10:07:40 +0100 Subject: [PATCH 378/583] chore: update pre-commit hooks (#554) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/adamchainz/blacken-docs: 1.18.0 → 1.19.0](https://github.com/adamchainz/blacken-docs/compare/1.18.0...1.19.0) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 5a3637f1..1df7c69d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -67,7 +67,7 @@ repos: additional_dependencies: [tomli] - repo: https://github.com/adamchainz/blacken-docs - rev: 1.18.0 + rev: 1.19.0 hooks: - id: blacken-docs types: [file, rst] From b466270711a8a4158af923eb3de84afeb5fd502e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 23 Oct 2024 17:14:56 +0100 Subject: [PATCH 379/583] chore: update pre-commit hooks (#556) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.6.9 → v0.7.0](https://github.com/astral-sh/ruff-pre-commit/compare/v0.6.9...v0.7.0) - [github.com/pre-commit/mirrors-mypy: v1.11.2 → v1.12.1](https://github.com/pre-commit/mirrors-mypy/compare/v1.11.2...v1.12.1) - [github.com/abravalheri/validate-pyproject: v0.20.2 → v0.21](https://github.com/abravalheri/validate-pyproject/compare/v0.20.2...v0.21) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 1df7c69d..f93ea86d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -51,7 +51,7 @@ repos: - id: trailing-whitespace - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.6.9" + rev: "v0.7.0" hooks: - id: ruff types: [file, python] @@ -79,14 +79,14 @@ repos: types: [file, python] - repo: https://github.com/pre-commit/mirrors-mypy - rev: 'v1.11.2' + rev: 'v1.12.1' hooks: - id: mypy exclude: 'noxfile\.py|docs/conf\.py' - repo: https://github.com/abravalheri/validate-pyproject # More exhaustive than Ruff RUF200. - rev: "v0.20.2" + rev: "v0.21" hooks: - id: validate-pyproject From fafe6578e4c818d73d60f592d30843da64fcb8f4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 23 Oct 2024 17:22:56 +0100 Subject: [PATCH 380/583] Bump scitools/workflows in the dependencies group (#555) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2024.10.0 to 2024.10.1 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2024.10.0...2024.10.1) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 682ca029..4b847a8e 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.10.0 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.10.1 diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index a9004495..303a7a97 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.10.0 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.10.1 secrets: inherit From 11a2c5e4273079b8315cbeecf28e9a621e9a5dea Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 24 Oct 2024 09:52:35 +0100 Subject: [PATCH 381/583] Bump scitools/workflows in the dependencies group (#557) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2024.10.1 to 2024.10.2 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2024.10.1...2024.10.2) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 4b847a8e..1f8011e2 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.10.1 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.10.2 diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 303a7a97..438eabab 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.10.1 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.10.2 secrets: inherit From 17022ee578a26fc8ab7c370e723edf0e74aee1eb Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 30 Oct 2024 17:11:53 +0000 Subject: [PATCH 382/583] chore: update pre-commit hooks (#558) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.7.0 → v0.7.1](https://github.com/astral-sh/ruff-pre-commit/compare/v0.7.0...v0.7.1) - [github.com/adamchainz/blacken-docs: 1.19.0 → 1.19.1](https://github.com/adamchainz/blacken-docs/compare/1.19.0...1.19.1) - [github.com/pre-commit/mirrors-mypy: v1.12.1 → v1.13.0](https://github.com/pre-commit/mirrors-mypy/compare/v1.12.1...v1.13.0) - [github.com/abravalheri/validate-pyproject: v0.21 → v0.22](https://github.com/abravalheri/validate-pyproject/compare/v0.21...v0.22) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f93ea86d..87c9b5a6 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -51,7 +51,7 @@ repos: - id: trailing-whitespace - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.7.0" + rev: "v0.7.1" hooks: - id: ruff types: [file, python] @@ -67,7 +67,7 @@ repos: additional_dependencies: [tomli] - repo: https://github.com/adamchainz/blacken-docs - rev: 1.19.0 + rev: 1.19.1 hooks: - id: blacken-docs types: [file, rst] @@ -79,14 +79,14 @@ repos: types: [file, python] - repo: https://github.com/pre-commit/mirrors-mypy - rev: 'v1.12.1' + rev: 'v1.13.0' hooks: - id: mypy exclude: 'noxfile\.py|docs/conf\.py' - repo: https://github.com/abravalheri/validate-pyproject # More exhaustive than Ruff RUF200. - rev: "v0.21" + rev: "v0.22" hooks: - id: validate-pyproject From 9059a0a361e50c82f5aa0e49670614705eafeae7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 31 Oct 2024 10:14:06 +0000 Subject: [PATCH 383/583] Bump scitools/workflows in the dependencies group (#559) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2024.10.2 to 2024.10.3 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2024.10.2...2024.10.3) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 1f8011e2..9ef80cad 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.10.2 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.10.3 diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 438eabab..1ed1a784 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.10.2 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.10.3 secrets: inherit From a333829a354d6e5149278201a8435b0544353410 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 5 Nov 2024 14:43:33 +0000 Subject: [PATCH 384/583] chore: update pre-commit hooks (#561) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.7.1 → v0.7.2](https://github.com/astral-sh/ruff-pre-commit/compare/v0.7.1...v0.7.2) - [github.com/aio-libs/sort-all: v1.2.0 → v1.3.0](https://github.com/aio-libs/sort-all/compare/v1.2.0...v1.3.0) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 87c9b5a6..0473d2b3 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -51,7 +51,7 @@ repos: - id: trailing-whitespace - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.7.1" + rev: "v0.7.2" hooks: - id: ruff types: [file, python] @@ -73,7 +73,7 @@ repos: types: [file, rst] - repo: https://github.com/aio-libs/sort-all - rev: v1.2.0 + rev: v1.3.0 hooks: - id: sort-all types: [file, python] From 5a1f8588e2e71827892bf5ee0e8d28f6f3305596 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Nov 2024 15:46:05 +0000 Subject: [PATCH 385/583] Bump scitools/workflows in the dependencies group (#562) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2024.10.3 to 2024.11.2 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2024.10.3...2024.11.2) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 9ef80cad..f25f7838 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.10.3 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.11.2 diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 1ed1a784..99d5c003 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.10.3 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.11.2 secrets: inherit From d00965d4b411e12c4e6a166ee7903a2d1129c05e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Nov 2024 14:51:52 +0000 Subject: [PATCH 386/583] Bump scitools/workflows in the dependencies group (#565) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2024.11.2 to 2024.11.3 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2024.11.2...2024.11.3) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index f25f7838..538c8ef1 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.11.2 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.11.3 diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 99d5c003..84a7d588 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.11.2 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.11.3 secrets: inherit From 9425d192e626112eafa0026d9dfc3511b56ea257 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 15 Nov 2024 11:12:20 +0000 Subject: [PATCH 387/583] chore: update pre-commit hooks (#563) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.7.2 → v0.7.3](https://github.com/astral-sh/ruff-pre-commit/compare/v0.7.2...v0.7.3) - [github.com/abravalheri/validate-pyproject: v0.22 → v0.23](https://github.com/abravalheri/validate-pyproject/compare/v0.22...v0.23) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0473d2b3..754afbad 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -51,7 +51,7 @@ repos: - id: trailing-whitespace - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.7.2" + rev: "v0.7.3" hooks: - id: ruff types: [file, python] @@ -86,7 +86,7 @@ repos: - repo: https://github.com/abravalheri/validate-pyproject # More exhaustive than Ruff RUF200. - rev: "v0.22" + rev: "v0.23" hooks: - id: validate-pyproject From a9d656c849d8246afb68574792eb8fe27dc96813 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Thu, 21 Nov 2024 09:28:13 +0000 Subject: [PATCH 388/583] Code qa refresh (#568) * Turn on numpydoc : with these exceptions, all pre-commit now passing. * Add rst files to check, so blacken-docs can work. * Enable those numpydocs-validate checks which are relatively easy to do. * Alphabetical order of pre-commit hooks, to match the template in SciTools/.github * Update ruff hook version. * Set mypy strict=false, with specific individual disables to allow it. --------- Co-authored-by: Chris Bunney <48915820+ukmo-ccbunney@users.noreply.github.com> --- .pre-commit-config.yaml | 57 ++++---- docs/index.rst | 7 +- docs/ref/iris_grib.rst | 1 - docs/ref/message/message.rst | 1 - pyproject.toml | 64 ++++++++- src/iris_grib/__init__.py | 29 +++- src/iris_grib/_grib1_load_rules.py | 2 +- src/iris_grib/_load_convert.py | 130 +++++++++++++----- src/iris_grib/_save_rules.py | 62 ++++++++- .../grib_phenom_translation/_gribcode.py | 4 +- src/iris_grib/message.py | 54 +++++--- 11 files changed, 312 insertions(+), 99 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 754afbad..4af10e5f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -13,6 +13,7 @@ files: | (?x)( benchmarks\/.+\.py| docs\/.+\.py| + docs\/.+\.rst| lib\/.+\.py| noxfile\.py| pyproject\.toml| @@ -50,14 +51,11 @@ repos: # Duplicates Ruff W291 but also works on non-Python files. - id: trailing-whitespace -- repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.7.3" +- repo: https://github.com/adamchainz/blacken-docs + rev: 1.19.1 hooks: - - id: ruff - types: [file, python] - args: [--fix, --show-fixes] - - id: ruff-format - types: [file, python] + - id: blacken-docs + types: [file, rst] - repo: https://github.com/codespell-project/codespell rev: "v2.3.0" @@ -66,29 +64,33 @@ repos: types_or: [asciidoc, python, markdown, rst] additional_dependencies: [tomli] -- repo: https://github.com/adamchainz/blacken-docs - rev: 1.19.1 +- repo: https://github.com/pre-commit/mirrors-mypy + rev: 'v1.13.0' hooks: - - id: blacken-docs - types: [file, rst] + - id: mypy + exclude: 'noxfile\.py|docs/conf\.py' -- repo: https://github.com/aio-libs/sort-all - rev: v1.3.0 +- repo: https://github.com/numpy/numpydoc + rev: v1.8.0 hooks: - - id: sort-all + - id: numpydoc-validation + exclude: "src/iris_grib/tests/|noxfile.py" types: [file, python] -- repo: https://github.com/pre-commit/mirrors-mypy - rev: 'v1.13.0' +- repo: https://github.com/astral-sh/ruff-pre-commit + rev: "v0.7.4" hooks: - - id: mypy - exclude: 'noxfile\.py|docs/conf\.py' + - id: ruff + types: [file, python] + args: [--fix, --show-fixes] + - id: ruff-format + types: [file, python] -- repo: https://github.com/abravalheri/validate-pyproject - # More exhaustive than Ruff RUF200. - rev: "v0.23" +- repo: https://github.com/aio-libs/sort-all + rev: v1.3.0 hooks: - - id: validate-pyproject + - id: sort-all + types: [file, python] - repo: https://github.com/scientific-python/cookie rev: 2024.08.19 @@ -97,9 +99,8 @@ repos: additional_dependencies: ["repo-review[cli]"] args: ["--show=errskip"] -# TODO: pending the addition of numpydoc, including config file(s). -#- repo: https://github.com/numpy/numpydoc -# rev: v1.7.0 -# hooks: -# - id: numpydoc-validation -# types: [file, python] +- repo: https://github.com/abravalheri/validate-pyproject + # More exhaustive than Ruff RUF200. + rev: "v0.23" + hooks: + - id: validate-pyproject diff --git a/docs/index.rst b/docs/index.rst index 2ee20638..b74521a9 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -26,9 +26,10 @@ and ``iris-grib`` installed in your Python environment. import iris import iris_grib import warnings - warnings.simplefilter('ignore') + + warnings.simplefilter("ignore") cube = iris.load_cube(iris.sample_data_path("rotated_pole.nc")) - iris.save(cube, 'testfile.grib', saver='grib2') + iris.save(cube, "testfile.grib", saver="grib2") For example, to load GRIB data : @@ -185,6 +186,7 @@ You can convert Iris cubes to eccodes messages, and modify or filter them before from iris.coords import DimCoord import eccodes + cube_height_2m5 = iris.load_cube(iris.sample_data_path("rotated_pole.nc")) cube_height_2m5.add_aux_coord(DimCoord([2.5], standard_name="height", units="m"), ()) @@ -255,4 +257,3 @@ See also: * :ref:`genindex` * :ref:`modindex` * :ref:`search` - diff --git a/docs/ref/iris_grib.rst b/docs/ref/iris_grib.rst index 30836f85..e78c322e 100644 --- a/docs/ref/iris_grib.rst +++ b/docs/ref/iris_grib.rst @@ -22,4 +22,3 @@ In this module: .. autofunction:: iris_grib.save_pairs_from_cube .. autofunction:: iris_grib.save_messages - diff --git a/docs/ref/message/message.rst b/docs/ref/message/message.rst index f025ce09..7af17341 100644 --- a/docs/ref/message/message.rst +++ b/docs/ref/message/message.rst @@ -15,4 +15,3 @@ In this module: .. autoclass:: iris_grib.message.Section :members: - diff --git a/pyproject.toml b/pyproject.toml index 653661f7..d663a8b4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -106,15 +106,31 @@ ignore = [ [tool.mypy] # See https://mypy.readthedocs.io/en/stable/config_file.html -ignore_missing_imports = true + +# Extra checks we have chosen to enable. warn_unused_configs = true warn_unreachable = true enable_error_code = ["ignore-without-code", "truthy-bool"] + +# Checks we have temporarily *disabled* +# NOTE: +# * Some of these settings are also disabled by "strict = false" +# * See "$ mypy --help" for which +# * Given these settings, "strict = true" generates no errors +# TODO: all of these should eventually be removed +disallow_any_generics = false # 5 errors +disallow_subclassing_any = false # 14 errors +disallow_untyped_calls = false # 8 errors +disallow_untyped_defs = false # 964 errors +disallow_incomplete_defs = false # 3 errors +check_untyped_defs = false # 100 errors +no_implicit_reexport = false # 134 errors + exclude = [ 'noxfile\.py', 'docs/conf\.py' ] -strict = false # Default value, make true when introducing type hinting. +strict = true # Default value, make true when introducing type hinting. [tool.pytest.ini_options] # See https://docs.pytest.org/en/stable/reference/customize.html @@ -190,3 +206,47 @@ known-first-party = ["iris_grib"] [tool.ruff.lint.pydocstyle] convention = "numpy" + +[tool.numpydoc_validation] +checks = [ + "all", # Enable all numpydoc validation rules, apart from the following: + + # -> Docstring text (summary) should start in the line immediately + # after the opening quotes (not in the same line, or leaving a + # blank line in between) + "GL01", # Permit summary line on same line as docstring opening quotes. + + # -> Closing quotes should be placed in the line after the last text + # in the docstring (do not close the quotes in the same line as + # the text, or leave a blank line between the last text and the + # quotes) + "GL02", # Permit a blank line before docstring closing quotes. + + # -> Double line break found; please use only one blank line to + # separate sections or paragraphs, and do not leave blank lines + # at the end of docstrings + "GL03", # Ignoring. + + # -> See Also section not found + "SA01", # Not all docstrings require a "See Also" section. + + # -> No extended summary found + "ES01", # Not all docstrings require an "Extended Summary" section. + + # -> No examples section found + "EX01", # Not all docstrings require an "Examples" section. + + # -> No Yields section found + "YD01", # Not all docstrings require a "Yields" section. + + # Record temporarily ignored checks below; will be reviewed at a later date: + # TODO: work to remove these at a later date. + "GL08", # *975 The object does not have a docstring + "PR01", # *149 Parameters ... not documented + "RT01", # *9 No Returns section found +] +exclude = [ + '\.__eq__$', + '\.__ne__$', + '\.__repr__$', +] diff --git a/src/iris_grib/__init__.py b/src/iris_grib/__init__.py index 7c35d4af..2304d984 100644 --- a/src/iris_grib/__init__.py +++ b/src/iris_grib/__init__.py @@ -692,8 +692,9 @@ def core_data(self): def phenomenon_points(self, time_unit): """ - Return the phenomenon time point offset from the epoch time reference - measured in the appropriate time units. + Return the phenomenon time points. + + As offsets from the epoch time reference, measured in appropriate time units. """ time_reference = "%s since epoch" % time_unit @@ -705,8 +706,9 @@ def phenomenon_points(self, time_unit): def phenomenon_bounds(self, time_unit): """ - Return the phenomenon time bound offsets from the epoch time reference - measured in the appropriate time units. + Return the phenomenon time bounds. + + As offsets from the epoch time reference, measured in appropriate time units. """ # TODO #576 Investigate when it's valid to get phenomenon_bounds @@ -762,7 +764,7 @@ def _load_generate(filename): def load_cubes(filenames, callback=None): """ - Returns an iterator over cubes from the given list of filenames. + Return an iterator over cubes from the given list of filenames. Args: @@ -786,9 +788,21 @@ def load_cubes(filenames, callback=None): def load_pairs_from_fields(grib_messages): """ - Convert an iterable of GRIB messages into an iterable of - (Cube, Grib message) tuples. + Convert an GRIB messages into (Cube, Grib message) tuples. + + Parameters + ---------- + grib_messages : iterable on (cube, message) + An iterable of :class:`GribMessage`. + Returns + ------- + iterable of (cube, message) + An iterable of (:class:`~iris.Cube`, :class:`GribMessage`), + pairing each message with a corresponding generated cube. + + Notes + ----- This capability can be used to filter out fields before they are passed to the load pipeline, and amend the cubes once they are created, using GRIB metadata conditions. Where the filtering @@ -894,6 +908,7 @@ def save_pairs_from_cube(cube): def save_messages(messages, target, append=False): """ Save messages to a GRIB2 file. + The messages will be released as part of the save. Args: diff --git a/src/iris_grib/_grib1_load_rules.py b/src/iris_grib/_grib1_load_rules.py index 0b670ad9..c0790831 100644 --- a/src/iris_grib/_grib1_load_rules.py +++ b/src/iris_grib/_grib1_load_rules.py @@ -17,7 +17,7 @@ def grib1_convert(grib): """ - Converts a GRIB1 message into the corresponding items of Cube metadata. + Convert a GRIB1 message into the corresponding items of Cube metadata. Args: diff --git a/src/iris_grib/_load_convert.py b/src/iris_grib/_load_convert.py index 504a1f70..1a055e15 100644 --- a/src/iris_grib/_load_convert.py +++ b/src/iris_grib/_load_convert.py @@ -3,8 +3,9 @@ # This file is part of iris-grib and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """ -Module to support the loading and conversion of a GRIB2 message into -cube metadata. +Module to support loading of GRIB2 data. + +Code to convert a GRIB2 message into cube metadata. """ @@ -143,7 +144,7 @@ # Regulation 92.1.12 def unscale(value, factor): """ - Implements Regulation 92.1.12. + Implement Regulation 92.1.12. Args: @@ -364,8 +365,9 @@ def resolution_flags(resolutionAndComponentFlags): def ellipsoid(shapeOfTheEarth, major, minor, radius): """ - Translate the shape of the earth to an appropriate coordinate - reference system. + Translate the shape of the earth code. + + Convert the code to an appropriate Iris coordinate system. For MDI set either major and minor or radius to :data:`numpy.ma.masked` @@ -472,7 +474,9 @@ def ellipsoid_geometry(section): def _calculate_increment(first_point, last_point, n_increments, mod=math.inf): """ - Calculates the directional increment from the difference between the grid + Calculate a directional increment. + + Calculate the directional increment from the difference between the grid point values divided by the total number of increments. Required by template 0 & 40 when no increment values are provided. """ @@ -481,7 +485,10 @@ def _calculate_increment(first_point, last_point, n_increments, mod=math.inf): def grid_definition_template_0_and_1(section, metadata, y_name, x_name, cs): """ - Translate templates representing regularly spaced latitude/longitude + Translate grid definition templates 0 and 1. + + Translate elements common to templates 0 and 1. + These templates represent regularly spaced latitude/longitude on either a standard or rotated grid. Updates the metadata in-place with the translations. @@ -576,8 +583,9 @@ def grid_definition_template_0_and_1(section, metadata, y_name, x_name, cs): def grid_definition_template_0(section, metadata): """ - Translate template representing regular latitude/longitude - grid (regular_ll). + Translate grid definition template 0. + + Template representing regular latitude/longitude grid (regular_ll). Updates the metadata in-place with the translations. @@ -598,7 +606,9 @@ def grid_definition_template_0(section, metadata): def grid_definition_template_1(section, metadata): """ - Translate template representing rotated latitude/longitude grid. + Translate grid definition template 1. + + Template representing rotated latitude/longitude grid. Updates the metadata in-place with the translations. @@ -628,8 +638,11 @@ def grid_definition_template_1(section, metadata): def grid_definition_template_4_and_5(section, metadata, y_name, x_name, cs): """ - Translate template representing variable resolution latitude/longitude - and common variable resolution rotated latitude/longitude. + Translate grid definition templates 4 and 5. + + Translate elements common to templates 4 and 5. + These templates represent variable-resolution latitude/longitude + and common forms of variable-resolution rotated latitude/longitude. Updates the metadata in-place with the translations. @@ -704,7 +717,9 @@ def grid_definition_template_4_and_5(section, metadata, y_name, x_name, cs): def grid_definition_template_4(section, metadata): """ - Translate template representing variable resolution latitude/longitude. + Translate grid definition template 4. + + This template represents variable resolution latitude/longitude. Updates the metadata in-place with the translations. @@ -725,7 +740,9 @@ def grid_definition_template_4(section, metadata): def grid_definition_template_5(section, metadata): """ - Translate template representing variable resolution rotated + Translate grid definition template 5. + + This template represents variable resolution rotated latitude/longitude. Updates the metadata in-place with the translations. @@ -756,7 +773,9 @@ def grid_definition_template_5(section, metadata): def grid_definition_template_10(section, metadata): """ - Translate template representing a Mercator grid. + Translate grid definition template 10. + + This template represents a Mercator grid. Updates the metadata in-place with the translations. @@ -793,7 +812,9 @@ def grid_definition_template_10(section, metadata): def grid_definition_template_12(section, metadata): """ - Translate template representing transverse Mercator. + Translate grid definition template 12. + + This template represents transverse Mercator. Updates the metadata in-place with the translations. @@ -883,7 +904,9 @@ def scan_str(scanning_bool): def grid_definition_template_20(section, metadata): """ - Translate template representing a Polar Stereographic grid. + Translate grid definition template 20. + + This template represents a Polar Stereographic grid. Updates the metadata in-place with the translations. @@ -983,7 +1006,9 @@ def _calculate_proj_coords_from_grid_lengths(section, cs): def grid_definition_template_30(section, metadata): """ - Translate template representing a Lambert Conformal grid. + Translate grid definition template 30. + + This template represents a Lambert Conformal grid. Updates the metadata in-place with the translations. @@ -1049,7 +1074,9 @@ def grid_definition_template_30(section, metadata): def grid_definition_template_40(section, metadata): """ - Translate template representing a Gaussian grid. + Translate an "irregular form" grid definition template 40. + + This template represents a Gaussian grid. Updates the metadata in-place with the translations. @@ -1076,7 +1103,9 @@ def grid_definition_template_40(section, metadata): def grid_definition_template_40_regular(section, metadata, cs): """ - Translate template representing a regular Gaussian grid. + Translate a "regular form" grid definition template 40. + + This template represents a regular Gaussian grid. """ scan = scanning_mode(section["scanningMode"]) @@ -1163,7 +1192,9 @@ def grid_definition_template_40_regular(section, metadata, cs): def grid_definition_template_40_reduced(section, metadata, cs): """ - Translate template representing a reduced Gaussian grid. + Translate a "reduced form" grid definition template 40. + + This template represents a reduced Gaussian grid. """ # Get the latitude and longitude points. @@ -1194,7 +1225,9 @@ def grid_definition_template_40_reduced(section, metadata, cs): def grid_definition_template_90(section, metadata): """ - Translate template representing space view. + Translate grid definition template 90. + + This template represents a space view. Updates the metadata in-place with the translations. @@ -1309,7 +1342,9 @@ def grid_definition_template_90(section, metadata): def grid_definition_template_140(section, metadata): """ - Translate template representing Lambert Azimuthal Equal Area. + Translate grid definition template 140. + + This template represents Lambert Azimuthal Equal Area. Updates the metadata in-place with the translations. @@ -1532,6 +1567,8 @@ def ensure_surface_air_pressure_name(cube): def time_range_unit(indicatorOfUnitForForecastTime): """ + Translate the time range indicator. + Translate the time range indicator to an equivalent :class:`cf_units.Unit`. @@ -1845,6 +1882,8 @@ def timedelta_hours(timedelta): def other_time_coord(rt_coord, fp_coord): """ + Make the "other" scalar time DimCoord. + Return the counterpart to the given scalar 'time' or 'forecast_reference_time' coordinate, by combining it with the given forecast_period coordinate. @@ -2108,7 +2147,9 @@ def ensemble_identifier(section): def product_definition_template_0(section, metadata, rt_coord): """ - Translate template representing an analysis or forecast at a horizontal + Translate product definition template 0. + + This template represents an analysis or forecast at a horizontal level or in a horizontal layer at a point in time. Updates the metadata in-place with the translations. @@ -2140,7 +2181,9 @@ def product_definition_template_0(section, metadata, rt_coord): def product_definition_template_1(section, metadata, frt_coord): """ - Translate template representing individual ensemble forecast, control + Translate product definition template 1. + + This template represents individual ensemble forecast, control and perturbed, at a horizontal level or in a horizontal layer at a point in time. @@ -2169,7 +2212,9 @@ def product_definition_template_1(section, metadata, frt_coord): def product_definition_template_6(section, metadata, frt_coord): """ - Translate template representing percentile forecast, + Translate product definition template 6. + + This template represents a percentile forecast, at a horizontal level or in a horizontal layer at a point in time. @@ -2198,7 +2243,9 @@ def product_definition_template_6(section, metadata, frt_coord): def product_definition_template_8(section, metadata, frt_coord): """ - Translate template representing average, accumulation and/or extreme values + Translate product definition template 8. + + This template represents average, accumulation and/or extreme values or other statistically processed values at a horizontal level or in a horizontal layer in a continuous or non-continuous time interval. @@ -2248,7 +2295,9 @@ def product_definition_template_8(section, metadata, frt_coord): def product_definition_template_9(section, metadata, frt_coord): """ - Translate template representing probability forecasts at a + Translate product definition template 9. + + This template represents probability forecasts at a horizontal level or in a horizontal layer in a continuous or non-continuous time interval. @@ -2314,7 +2363,9 @@ def product_definition_template_9(section, metadata, frt_coord): def product_definition_template_10(section, metadata, frt_coord): """ - Translate template representing percentile forecasts at a horizontal level + Translate product definition template 10. + + This template represents percentile forecasts at a horizontal level or in a horizontal layer in a continuous or non-continuous time interval. Updates the metadata in-place with the translations. @@ -2343,7 +2394,9 @@ def product_definition_template_10(section, metadata, frt_coord): def product_definition_template_11(section, metadata, frt_coord): """ - Translate template representing individual ensemble forecast, control + Translate product definition template 11. + + This template represents individual ensemble forecast, control or perturbed; average, accumulation and/or extreme values or other statistically processed values at a horizontal level or in a horizontal layer in a continuous or non-continuous time interval. @@ -2372,7 +2425,9 @@ def product_definition_template_11(section, metadata, frt_coord): def product_definition_template_15(section, metadata, frt_coord): """ - Translate template representing : "average, accumulation, extreme values, + Translate product definition template 15. + + This template represents : "average, accumulation, extreme values, or other statistically processed values over a spatial area at a horizontal level or in a horizontal layer at a point in time". @@ -2456,7 +2511,9 @@ def satellite_common(section, metadata): def product_definition_template_31(section, metadata, rt_coord): """ - Translate template representing a satellite product. + Translate product definition template 31. + + This template represents a satellite product. Updates the metadata in-place with the translations. @@ -2482,7 +2539,9 @@ def product_definition_template_31(section, metadata, rt_coord): def product_definition_template_32(section, metadata, rt_coord): """ - Translate template representing an analysis or forecast at a horizontal + Translate product definition template 32. + + This template represents an analysis or forecast at a horizontal level or in a horizontal layer at a point in time for simulated (synthetic) satellite data. @@ -2512,7 +2571,9 @@ def product_definition_template_32(section, metadata, rt_coord): def product_definition_template_40(section, metadata, frt_coord): """ - Translate template representing an analysis or forecast at a horizontal + Translate product definition template 40. + + This template represents an analysis or forecast at a horizontal level or in a horizontal layer at a point in time for atmospheric chemical constituents. @@ -2642,6 +2703,7 @@ def product_definition_section(section, metadata, discipline, tablesVersion, rt_ def data_representation_section(section): """ Translate section 5 from the GRIB2 message. + Grid point template decoding is fully provided by the ECMWF GRIB API, all grid point and spectral templates are supported, the data payload is returned from the GRIB API already unpacked. diff --git a/src/iris_grib/_save_rules.py b/src/iris_grib/_save_rules.py index 62293a25..f8b5b067 100644 --- a/src/iris_grib/_save_rules.py +++ b/src/iris_grib/_save_rules.py @@ -328,6 +328,8 @@ def step(points, atol): def grid_definition_template_0(cube, grib): """ + Write grid definition template 0. + Set keys within the provided grib message based on Grid Definition Template 3.0. @@ -344,6 +346,8 @@ def grid_definition_template_0(cube, grib): def grid_definition_template_1(cube, grib): """ + Write grid definition template 1. + Set keys within the provided grib message based on Grid Definition Template 3.1. @@ -365,6 +369,8 @@ def grid_definition_template_1(cube, grib): def grid_definition_template_4(cube, grib): """ + Write grid definition template 4. + Set keys within the provided grib message based on Grid Definition Template 3.4. @@ -380,6 +386,8 @@ def grid_definition_template_4(cube, grib): def grid_definition_template_5(cube, grib): """ + Write grid definition template 5. + Set keys within the provided grib message based on Grid Definition Template 3.5. @@ -408,6 +416,8 @@ def grid_definition_template_5(cube, grib): def grid_definition_template_10(cube, grib): """ + Write grid definition template 10. + Set keys within the provided grib message based on Grid Definition Template 3.10. @@ -486,6 +496,8 @@ def grid_definition_template_10(cube, grib): def grid_definition_template_12(cube, grib): """ + Write grid definition template 12. + Set keys within the provided grib message based on Grid Definition Template 3.12. @@ -549,6 +561,8 @@ def m_to_cm(value): def _perspective_projection_common(cube, grib): """ + Write grid definition templates 20 and 30. + Common functionality for setting grid keys for the perspective projection grid definition templates (20 and 30; Polar Stereographic and Lambert Conformal. @@ -619,6 +633,8 @@ def _perspective_projection_common(cube, grib): def grid_definition_template_20(cube, grib): """ + Write grid definition template 20. + Set keys within the provided GRIB message based on Grid Definition Template 3.20. @@ -668,6 +684,8 @@ def non_standard_scale_factor_error(message: str): def grid_definition_template_30(cube, grib): """ + Write grid definition template 30. + Set keys within the provided grib message based on Grid Definition Template 3.30. @@ -700,6 +718,8 @@ def grid_definition_template_30(cube, grib): def grid_definition_template_140(cube, grib): """ + Write grid definition template 140. + Set keys within the provided grib message based on Grid Definition Template 3.140. @@ -778,6 +798,8 @@ def grid_definition_template_140(cube, grib): def grid_definition_section(cube, grib): """ + Write the grid definition template. + Set keys within the grid definition section of the provided grib message, based on the properties of the cube. @@ -878,7 +900,11 @@ def set_discipline_and_parameter(cube, grib): def _non_missing_forecast_period(cube): - # Calculate "model start time" to use as the reference time. + """ + Calculate "model start time" to use as the reference time. + + In the case that a forecast-period coord already exists. + """ fp_coord = cube.coord("forecast_period") # Convert fp and t to hours so we can subtract to calculate R. @@ -921,6 +947,8 @@ def _non_missing_forecast_period(cube): def _missing_forecast_period(cube): """ + Create time coords when there is no forecast-period coordinate. + Returns a reference time and significance code together with a forecast period and corresponding units type code. @@ -964,7 +992,9 @@ def _missing_forecast_period(cube): def set_forecast_time(cube, grib): """ - Set the forecast time keys based on the forecast_period coordinate. In + Write the forecast time. + + Set message keys based on the forecast_period coordinate. In the absence of a forecast_period and forecast_reference_time, the forecast time is set to zero. @@ -1165,6 +1195,8 @@ def set_fixed_surfaces(cube, grib, full3d_cube=None): def set_time_range(time_coord, grib): """ + Write the time range. + Set the time range keys in the specified message based on the bounds of the provided time coordinate. @@ -1201,6 +1233,8 @@ def set_time_range(time_coord, grib): def set_time_increment(cell_method, grib): """ + Write the time increment. + Set the time increment keys in the specified message based on the provided cell method. @@ -1340,6 +1374,8 @@ def get_spatial_process_code(spatial_processing_type): def set_ensemble(cube, grib): """ + Write the ensemble number. + Set keys in the provided grib based message relating to ensemble information. @@ -1359,6 +1395,8 @@ def set_ensemble(cube, grib): def product_definition_template_common(cube, grib, full3d_cube=None): """ + Write common parts of the product definition template. + Set keys within the provided grib message that are common across all of the supported product definition templates. @@ -1379,6 +1417,8 @@ def product_definition_template_common(cube, grib, full3d_cube=None): def product_definition_template_0(cube, grib, full3d_cube=None): """ + Write product definition template 0. + Set keys within the provided grib message based on Product Definition Template 4.0. @@ -1392,6 +1432,8 @@ def product_definition_template_0(cube, grib, full3d_cube=None): def product_definition_template_1(cube, grib, full3d_cube=None): """ + Write product definition template 1. + Set keys within the provided grib message based on Product Definition Template 4.1. @@ -1407,6 +1449,8 @@ def product_definition_template_1(cube, grib, full3d_cube=None): def product_definition_template_6(cube, grib, full3d_cube=None): """ + Write product definition template 6. + Set keys within the provided grib message based on Product Definition Template 4.6. @@ -1426,6 +1470,8 @@ def product_definition_template_6(cube, grib, full3d_cube=None): def product_definition_template_8(cube, grib, full3d_cube=None): """ + Write product definition template 8. + Set keys within the provided grib message based on Product Definition Template 4.8. @@ -1439,6 +1485,8 @@ def product_definition_template_8(cube, grib, full3d_cube=None): def product_definition_template_10(cube, grib, full3d_cube=None): """ + Write product definition template 10. + Set keys within the provided grib message based on Product Definition Template 4.10. @@ -1463,6 +1511,8 @@ def product_definition_template_10(cube, grib, full3d_cube=None): def product_definition_template_11(cube, grib, full3d_cube=None): """ + Write product definition template 11. + Set keys within the provided grib message based on Product Definition Template 4.11. @@ -1477,6 +1527,8 @@ def product_definition_template_11(cube, grib, full3d_cube=None): def _product_definition_template_8_10_and_11(cube, grib, full3d_cube=None): """ + Write product definition template 8, 10 and 11. + Set keys within the provided grib message based on common aspects of Product Definition Templates 4.8 and 4.11. @@ -1552,6 +1604,8 @@ def _product_definition_template_8_10_and_11(cube, grib, full3d_cube=None): def product_definition_template_15(cube, grib, full3d_cube=None): """ + Write product definition template 15. + Set keys within the provided grib message based on Product Definition Template 4.15. @@ -1601,6 +1655,8 @@ def product_definition_template_15(cube, grib, full3d_cube=None): def product_definition_template_40(cube, grib, full3d_cube=None): """ + Write product definition template 40. + Set keys within the provided grib message based on Product Definition Template 4.40. @@ -1617,6 +1673,8 @@ def product_definition_template_40(cube, grib, full3d_cube=None): def product_definition_section(cube, grib, full3d_cube=None): """ + Write the product definition template. + Set keys within the product definition section of the provided grib message based on the properties of the cube. diff --git a/src/iris_grib/grib_phenom_translation/_gribcode.py b/src/iris_grib/grib_phenom_translation/_gribcode.py index 24fb0503..5cd92676 100644 --- a/src/iris_grib/grib_phenom_translation/_gribcode.py +++ b/src/iris_grib/grib_phenom_translation/_gribcode.py @@ -3,7 +3,7 @@ # This file is part of iris-grib and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """ -Provide object to represent grib phenomena +Provide object to represent grib phenomena. For use as cube attributes, freely convertible to+from strings """ @@ -120,7 +120,7 @@ def GRIBCode(edition, *args, **kwargs): @dataclass class GenericConcreteGRIBCode: """ - Common behaviour for GRIBCode1 and GRIBCode2 + Common behaviour for GRIBCode1 and GRIBCode2. GRIBCode1 and GRIBCode2 inherit this, making both dataclasses. They contain different data properties. diff --git a/src/iris_grib/message.py b/src/iris_grib/message.py index 0351ba6b..b8f45682 100644 --- a/src/iris_grib/message.py +++ b/src/iris_grib/message.py @@ -32,7 +32,9 @@ class _OpenFileRef: """ - A reference to an open file that ensures that the file is closed + A reference to an open file. + + This object ensures that the file is closed when the object is garbage collected. """ @@ -46,8 +48,9 @@ def __del__(self): class GribMessage: """ - An in-memory representation of a GribMessage, providing - access to the :meth:`~GribMessage.data` payload and the metadata + An in-memory representation of a GribMessage. + + Provides access to the :meth:`~GribMessage.data` payload and the metadata elements by section via the :meth:`~GribMessage.sections` property. """ @@ -55,6 +58,8 @@ class GribMessage: @staticmethod def messages_from_filename(filename): """ + Return the messages in a file. + Return a generator of :class:`GribMessage` instances; one for each message in the supplied GRIB file. @@ -63,6 +68,7 @@ def messages_from_filename(filename): * filename (string): Name of the file to generate fields from. + """ grib_fh = open(filename, "rb") # create an _OpenFileRef to manage the closure of the file handle @@ -79,7 +85,9 @@ def messages_from_filename(filename): def __init__(self, raw_message, recreate_raw, file_ref=None): """ - It is recommended to obtain GribMessage instance from the static method + Create a GribMessage. + + It is recommended to obtain GribMessage instances from the static method :meth:`~GribMessage.messages_from_filename`, rather than creating them directly. @@ -97,8 +105,9 @@ def __init__(self, raw_message, recreate_raw, file_ref=None): @property def sections(self): """ - Return the key-value pairs of the message keys, grouped by containing - section. + Return the key-value pairs of the message keys. + + The key-value pairs are grouped by containing section. Sections in a message are indexed by GRIB section-number, and values in a section are indexed by key strings. @@ -222,8 +231,9 @@ def ndim(self): def _bitmap(self, bitmap_section): """ - Get the bitmap for the data from the message. The GRIB spec defines - that the bitmap is composed of values 0 or 1, where: + Get the bitmap for the data from the message. + + The GRIB spec defines that the bitmap is composed of values 0 or 1, where: * 0: no data value at corresponding data point (data point masked). * 1: data value at corresponding data point (data point unmasked). @@ -323,8 +333,10 @@ def __setstate__(self, state): class _RawGribMessage: """ - Lightweight GRIB message wrapper, containing **only** the coded keys - of the input GRIB message. + Lightweight GRIB message wrapper. + + This contains **only** the coded keys of the input GRIB message. + I.E. excluding any "computed" keys. """ @@ -342,7 +354,9 @@ def from_file_offset(filename, offset): def __init__(self, message_id): """ - A _RawGribMessage object contains the **coded** keys from a + Create a _RawGribMessage object. + + This contains the **coded** keys from a GRIB message that is identified by the input message id. Args: @@ -365,8 +379,9 @@ def __del__(self): @property def sections(self): """ - Return the key-value pairs of the message keys, grouped by containing - section. + Return the key-value pairs of the message keys. + + The key-value pairs are grouped by containing section. Key-value pairs are collected into a dictionary of :class:`Section` objects. One such object is made for @@ -380,7 +395,7 @@ def sections(self): return self._sections def _get_message_keys(self): - """Creates a generator of all the keys in the message.""" + """Create a generator of all the keys in the message.""" keys_itr = eccodes.codes_keys_iterator_new(self._message_id) eccodes.codes_skip_computed(keys_itr) @@ -424,8 +439,9 @@ def _get_message_sections(self): class Section: """ - A Section of a GRIB message, supporting dictionary like access to - attributes using gribapi key strings. + A Section of a GRIB message. + + This supports dictionary-like access to key values, using gribapi key strings. Values for keys may be changed using assignment but this does not write to the file. @@ -518,8 +534,9 @@ def _get_key_value(self, key): def get_computed_key(self, key): """ - Get the computed value associated with the given key in the GRIB - message. + Get the computed value for a given key. + + Returns the value associated with the given key in the GRIB message. Args: @@ -544,6 +561,7 @@ def keys(self): def _get_value_or_missing(self, key, use_int=False): """ Return value of header element, or None if value is encoded as missing. + Implementation of Regulations 92.1.4 and 92.1.5 via ECCodes. """ From 6d5d092d2725b4f65f9de97e44b2159a8e41821b Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Thu, 21 Nov 2024 15:16:22 +0000 Subject: [PATCH 389/583] Update ruff controls (#572) * Remove all the ruff checks which didn't trigger. * Manually re-sort ruff ignore sections. * Remove ruff.toml, and put its content into pyproject.toml * Clarify status + behaviour of D212 checking --- .ruff.toml | 207 ------------------------------------ pyproject.toml | 218 +++++++++++++++++++++++++++++++++++++- src/iris_grib/__init__.py | 33 ++---- 3 files changed, 225 insertions(+), 233 deletions(-) delete mode 100644 .ruff.toml diff --git a/.ruff.toml b/.ruff.toml deleted file mode 100644 index a976ca9f..00000000 --- a/.ruff.toml +++ /dev/null @@ -1,207 +0,0 @@ -extend = "pyproject.toml" - -lint.ignore = [ - # pydocstyle (D) - # https://docs.astral.sh/ruff/rules/#pydocstyle-d - "D100", # Missing docstring in public module - "D101", # Missing docstring in public class - "D102", # Missing docstring in public method - "D103", # Missing docstring in public function - "D105", # Missing docstring in magic method - "D200", # One-line docstring should fit on one line - "D202", # No blank lines allowed after function docstring - "D205", # 1 blank line required between summary line and description - "D212", # Multi-line docstring summary should start at the second line - "D300", # Use triple double quotes """ - "D301", # Use r""" if any backslashes in a docstring - "D400", # First line should end with a period - "D401", # First line of docstring should be in imperative mood - "D406", # Section name should end with a newline - "D407", # Missing dashed underline after section - - # isort (I) - # https://docs.astral.sh/ruff/rules/#isort-i - "I001", # Import block is un-sorted or un-formatted - - # Numpy-specific rules (NPY) - # https://docs.astral.sh/ruff/rules/#numpy-specific-rules-npy - "NPY002", - - # flake8-builtins (A) - # https://docs.astral.sh/ruff/rules/#flake8-builtins-a - "A001", - "A002", - - # flake8-annotations (ANN) - "ANN001", - "ANN002", - "ANN003", - "ANN101", - "ANN102", - "ANN201", - "ANN202", - "ANN204", - "ANN205", - "ANN206", - - # flake8-unused-arguments (ARG) - # https://docs.astral.sh/ruff/rules/#flake8-unused-arguments-arg - "ARG001", - "ARG002", - "ARG005", - - # flake8-bugbear (B) - # https://docs.astral.sh/ruff/rules/#flake8-bugbear-b - "B007", - "B018", - "B028", - "B904", - - # flake8-blind-except (BLE) - # https://docs.astral.sh/ruff/rules/#flake8-blind-except-ble - "BLE001", - - # flake8-comprehensions (C4) - # https://docs.astral.sh/ruff/rules/#flake8-comprehensions-c4 - "C408", - "C901", - - # flake8-datetimez (DTZ) - # https://docs.astral.sh/ruff/rules/#flake8-datetimez-dtz - "DTZ001", - "DTZ006", - - # flake8-errmsg (EM) - "EM101", - "EM102", - "EM103", - - # eradicate (ERA) - # https://docs.astral.sh/ruff/rules/#eradicate-era - "ERA001", - - # flake8-boolean-trap (FBT) - # https://docs.astral.sh/ruff/rules/#flake8-boolean-trap-fbt - "FBT001", - "FBT002", - "FBT003", - - # flake8-fixme (FIX) - # https://docs.astral.sh/ruff/rules/#flake8-fixme-fix - "FIX002", - "FIX003", - - # pep8-naming (N) - # https://docs.astral.sh/ruff/rules/#pep8-naming-n - "N801", - "N802", - "N803", - "N806", - "N999", - - # Perflint (PERF) - # https://docs.astral.sh/ruff/rules/#perflint-perf - "PERF203", - "PERF401", - - # Refactor (R) - # https://docs.astral.sh/ruff/rules/#refactor-r - "PLR0402", - "PLR0912", - "PLR0913", - "PLR0915", - "PLR1714", - "PLR1722", - "PLR2004", - "PLR5501", - - # Warning (W) - # https://docs.astral.sh/ruff/rules/#warning-w - "PLW0602", - "PLW2901", - - # flake8-pytest-style (PT) - "PT009", - "PT027", - - # flake8-use-pathlib (PTH) - # https://docs.astral.sh/ruff/rules/#flake8-use-pathlib-pth - "PTH100", - "PTH107", - "PTH110", - "PTH111", - "PTH112", - "PTH113", - "PTH118", - "PTH120", - "PTH122", - "PTH123", - - # flake8-pyi (PYI) - # https://docs.astral.sh/ruff/rules/#flake8-pyi-pyi - "PYI024", - - # flake8-return (RET) - # https://docs.astral.sh/ruff/rules/#flake8-return-ret - "RET503", - "RET504", - "RET505", - "RET506", - - # flake8-raise (RSE) - # https://docs.astral.sh/ruff/rules/#flake8-raise-rse - "RSE102", - - # Ruff-specific rules (RUF) - # https://docs.astral.sh/ruff/rules/#ruff-specific-rules-ruf - "RUF005", - "RUF012", - "RUF015", - - # flake8-bandit (S) - # https://docs.astral.sh/ruff/rules/#flake8-bandit-s - "S101", - "S110", - "S603", - "S607", - - # flake8-simplify (SIM) - # https://docs.astral.sh/ruff/rules/#flake8-simplify-sim - "SIM102", - "SIM108", - "SIM115", - "SIM117", - "SIM118", - - # flake8-self (SLF) - # https://docs.astral.sh/ruff/rules/#flake8-self-slf - "SLF001", - - # flake8-print (T20) - # https://docs.astral.sh/ruff/rules/#flake8-print-t20 - "T201", - - # flake8-todos (TD) - # https://docs.astral.sh/ruff/rules/#flake8-todos-td - "TD001", - "TD002", - "TD003", - "TD004", - "TD005", - "TD006", - - # tryceratops (TRY) - # https://docs.astral.sh/ruff/rules/#tryceratops-try - "TRY003", - "TRY004", - "TRY301", - - # pyupgrade (UP) - # https://docs.astral.sh/ruff/rules/#pyupgrade-up - "UP008", - "UP009", - "UP018", - "UP027", - "UP031", - "UP032", -] \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index d663a8b4..bdb2a577 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,4 +1,5 @@ # See https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html +# See https://github.com/SciTools/.github/wiki/Linting for common linter rules [build-system] # Defined by PEP 518 @@ -179,7 +180,8 @@ preview = false [tool.ruff.lint] ignore = [ - # NOTE: Non-permanent exclusions should be added to the ".ruff.toml" file. + # The following ruff checks are intended to be *permanently* ignored (by design). + # NOTE: *temporary* ignores are listed separately, below. # flake8-commas (COM) # https://docs.astral.sh/ruff/rules/#flake8-commas-com @@ -190,14 +192,222 @@ ignore = [ # https://docs.astral.sh/ruff/rules/single-line-implicit-string-concatenation/ # NOTE: This rule may cause conflicts when used with "ruff format". "ISC001", # Implicitly concatenate string literals on one line. + + # ============================================== + # From here on, we list the *temporary* check disables + # TODO: eventually, remove all these by either + # 1. fixing all code + # 2. adding per-occurence ignores (#qa comments) where needed + # 3. promote the check to the "permanent disables" list above + + # flake8-builtins (A) + # https://docs.astral.sh/ruff/rules/#flake8-builtins-a + "A001", + "A002", + + # flake8-annotations (ANN) + "ANN001", + "ANN002", + "ANN003", + "ANN101", + "ANN102", + "ANN201", + "ANN202", + "ANN204", + "ANN205", + + # flake8-unused-arguments (ARG) + # https://docs.astral.sh/ruff/rules/#flake8-unused-arguments-arg + "ARG001", + "ARG002", + "ARG005", + + # flake8-bugbear (B) + # https://docs.astral.sh/ruff/rules/#flake8-bugbear-b + "B007", + "B018", + "B028", + "B904", + + # flake8-blind-except (BLE) + # https://docs.astral.sh/ruff/rules/#flake8-blind-except-ble + "BLE001", + + # flake8-comprehensions (C4) + # https://docs.astral.sh/ruff/rules/#flake8-comprehensions-c4 + "C408", + "C901", + + # pydocstyle (D) + # https://docs.astral.sh/ruff/rules/#pydocstyle-d + "D100", # Missing docstring in public module + "D101", # Missing docstring in public class + "D102", # Missing docstring in public method + "D103", # Missing docstring in public function + "D105", # Missing docstring in magic method + "D200", # One-line docstring should fit on one line + "D202", # No blank lines allowed after function docstring + "D205", # 1 blank line required between summary line and description + "D212", # Multi-line docstring summary should start at the second line + "D300", # Use triple double quotes """ + "D301", # Use r""" if any backslashes in a docstring + "D400", # First line should end with a period + "D401", # First line of docstring should be in imperative mood + "D406", # Section name should end with a newline + "D407", # Missing dashed underline after section + + # flake8-datetimez (DTZ) + # https://docs.astral.sh/ruff/rules/#flake8-datetimez-dtz + "DTZ001", + "DTZ006", + + # flake8-errmsg (EM) + "EM101", + "EM102", + "EM103", + + # eradicate (ERA) + # https://docs.astral.sh/ruff/rules/#eradicate-era + "ERA001", + + # flake8-boolean-trap (FBT) + # https://docs.astral.sh/ruff/rules/#flake8-boolean-trap-fbt + "FBT001", + "FBT002", + "FBT003", + + # flake8-fixme (FIX) + # https://docs.astral.sh/ruff/rules/#flake8-fixme-fix + "FIX002", + "FIX003", + + # isort (I) + # https://docs.astral.sh/ruff/rules/#isort-i + "I001", # Import block is un-sorted or un-formatted + + # pep8-naming (N) + # https://docs.astral.sh/ruff/rules/#pep8-naming-n + "N801", + "N802", + "N803", + "N806", + "N999", + + # Numpy-specific rules (NPY) + # https://docs.astral.sh/ruff/rules/#numpy-specific-rules-npy + "NPY002", + + # Perflint (PERF) + # https://docs.astral.sh/ruff/rules/#perflint-perf + "PERF203", + "PERF401", + + # Refactor (R) + # https://docs.astral.sh/ruff/rules/#refactor-r + "PLR0402", + "PLR0912", + "PLR0913", + "PLR0915", + "PLR1714", + "PLR2004", + "PLR5501", + + # Warning (W) + # https://docs.astral.sh/ruff/rules/#warning-w + "PLW0602", + "PLW2901", + + # flake8-pytest-style (PT) + "PT009", + "PT027", + + # flake8-use-pathlib (PTH) + # https://docs.astral.sh/ruff/rules/#flake8-use-pathlib-pth + "PTH100", + "PTH107", + "PTH110", + "PTH111", + "PTH112", + "PTH113", + "PTH118", + "PTH120", + "PTH122", + "PTH123", + + # flake8-pyi (PYI) + # https://docs.astral.sh/ruff/rules/#flake8-pyi-pyi + "PYI024", + + # flake8-return (RET) + # https://docs.astral.sh/ruff/rules/#flake8-return-ret + "RET503", + "RET504", + "RET505", + "RET506", + + # flake8-raise (RSE) + # https://docs.astral.sh/ruff/rules/#flake8-raise-rse + "RSE102", + + # Ruff-specific rules (RUF) + # https://docs.astral.sh/ruff/rules/#ruff-specific-rules-ruf + "RUF005", + "RUF012", + "RUF015", + + # flake8-bandit (S) + # https://docs.astral.sh/ruff/rules/#flake8-bandit-s + "S101", + "S110", + "S603", + "S607", + + # flake8-simplify (SIM) + # https://docs.astral.sh/ruff/rules/#flake8-simplify-sim + "SIM102", + "SIM108", + "SIM115", + "SIM117", + "SIM118", + + # flake8-self (SLF) + # https://docs.astral.sh/ruff/rules/#flake8-self-slf + "SLF001", + + # flake8-print (T20) + # https://docs.astral.sh/ruff/rules/#flake8-print-t20 + "T201", + + # flake8-todos (TD) + # https://docs.astral.sh/ruff/rules/#flake8-todos-td + "TD001", + "TD002", + "TD003", + "TD004", + "TD005", + "TD006", + + # tryceratops (TRY) + # https://docs.astral.sh/ruff/rules/#tryceratops-try + "TRY003", + "TRY004", + "TRY301", + + # pyupgrade (UP) + # https://docs.astral.sh/ruff/rules/#pyupgrade-up + "UP009", + "UP018", + "UP027", + "UP031", + "UP032", ] preview = false select = [ "ALL", - # pydocstyle (D) - # https://docs.astral.sh/ruff/rules/multi-line-summary-first-line/ - "D212", # Multi-line docstring summary should start at the first line + # Note: the above "all" disables conflicting rules, if you want that + # rule it needs to be explicitly enabled below: + "D212", # conflicts with D213 : this one is our choice, so enforce it ] [tool.ruff.lint.isort] diff --git a/src/iris_grib/__init__.py b/src/iris_grib/__init__.py index 2304d984..6bd0c9d0 100644 --- a/src/iris_grib/__init__.py +++ b/src/iris_grib/__init__.py @@ -2,8 +2,7 @@ # # This file is part of iris-grib and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -""" -Conversion of cubes to/from GRIB. +"""Conversion of cubes to/from GRIB. See: `ECMWF GRIB API `_. @@ -155,8 +154,7 @@ def __setstate__(self, state): # Utility routines for the use of dask 'meta' in wrapping proxies def _aslazydata_has_meta(): - """ - Work out whether 'iris._lazy_data.as_lazy_data' takes a "meta" kwarg. + """Work out whether 'iris._lazy_data.as_lazy_data' takes a "meta" kwarg. Up to Iris 3.8.0, "as_lazy_data" did not have a 'meta' keyword, but since https://github.com/SciTools/iris/pull/5801, it now *requires* one, @@ -174,8 +172,7 @@ def _aslazydata_has_meta(): def _make_dask_meta(shape, dtype, is_masked=True): - """ - Construct a dask 'meta' object for use in 'dask.array.from_array'. + """Construct a dask 'meta' object for use in 'dask.array.from_array'. A "meta" array is made from the dtype and shape of the array-like to be wrapped, plus whether it will return masked or unmasked data. @@ -187,8 +184,7 @@ def _make_dask_meta(shape, dtype, is_masked=True): class GribWrapper: - """ - Contains a pygrib object plus some extra keys of our own. + """Contains a pygrib object plus some extra keys of our own. The class :class:`iris_grib.message.GribMessage` provides alternative means of working with GRIB message instances. @@ -691,8 +687,7 @@ def core_data(self): return data def phenomenon_points(self, time_unit): - """ - Return the phenomenon time points. + """Return the phenomenon time points. As offsets from the epoch time reference, measured in appropriate time units. @@ -705,8 +700,7 @@ def phenomenon_points(self, time_unit): ) def phenomenon_bounds(self, time_unit): - """ - Return the phenomenon time bounds. + """Return the phenomenon time bounds. As offsets from the epoch time reference, measured in appropriate time units. @@ -763,8 +757,7 @@ def _load_generate(filename): def load_cubes(filenames, callback=None): - """ - Return an iterator over cubes from the given list of filenames. + """Return an iterator over cubes from the given list of filenames. Args: @@ -787,8 +780,7 @@ def load_cubes(filenames, callback=None): def load_pairs_from_fields(grib_messages): - """ - Convert an GRIB messages into (Cube, Grib message) tuples. + """Convert an GRIB messages into (Cube, Grib message) tuples. Parameters ---------- @@ -851,8 +843,7 @@ def load_pairs_from_fields(grib_messages): def save_grib2(cube, target, append=False): - """ - Save a cube or iterable of cubes to a GRIB2 file. + """Save a cube or iterable of cubes to a GRIB2 file. Args: @@ -876,8 +867,7 @@ def save_grib2(cube, target, append=False): def save_pairs_from_cube(cube): - """ - Convert one or more cubes to (2D cube, GRIB-message-id) pairs. + """Convert one or more cubes to (2D cube, GRIB-message-id) pairs. Produces pairs of 2D cubes and GRIB messages, the result of the 2D cube being processed by the GRIB save rules. @@ -906,8 +896,7 @@ def save_pairs_from_cube(cube): def save_messages(messages, target, append=False): - """ - Save messages to a GRIB2 file. + """Save messages to a GRIB2 file. The messages will be released as part of the save. From bfc4bc7242f69846b3be234ece45cbe5f0a6539f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Nov 2024 16:09:09 +0000 Subject: [PATCH 390/583] Bump the dependencies group with 2 updates (#571) Bumps the dependencies group with 2 updates: [scitools/workflows](https://github.com/scitools/workflows) and [codecov/codecov-action](https://github.com/codecov/codecov-action). Updates `scitools/workflows` from 2024.11.3 to 2024.11.5 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2024.11.3...2024.11.5) Updates `codecov/codecov-action` from 4 to 5 - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/v4...v5) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: codecov/codecov-action dependency-type: direct:production update-type: version-update:semver-major dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/ci-tests.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 538c8ef1..5f0dc5c4 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.11.3 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.11.5 diff --git a/.github/workflows/ci-tests.yml b/.github/workflows/ci-tests.yml index 7be851f4..83a8d183 100644 --- a/.github/workflows/ci-tests.yml +++ b/.github/workflows/ci-tests.yml @@ -133,6 +133,6 @@ jobs: - name: "upload coverage report" if: ${{ matrix.coverage }} - uses: codecov/codecov-action@v4 + uses: codecov/codecov-action@v5 with: token: ${{ secrets.CODECOV_TOKEN }} diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 84a7d588..ab452a9b 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.11.3 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.11.5 secrets: inherit From f0a965772ed88ad444af074f1ed86644e535d6c8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 28 Nov 2024 17:42:08 +0000 Subject: [PATCH 391/583] Bump scitools/workflows in the dependencies group (#575) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2024.11.5 to 2024.11.6 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2024.11.5...2024.11.6) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 5f0dc5c4..36b958dd 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.11.5 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.11.6 diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index ab452a9b..81d57708 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.11.5 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.11.6 secrets: inherit From 07236c3a5584c3e848947d4ff02d6ed6ff082436 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 28 Nov 2024 18:05:00 +0000 Subject: [PATCH 392/583] chore: update pre-commit hooks (#567) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.7.4 → v0.8.0](https://github.com/astral-sh/ruff-pre-commit/compare/v0.7.4...v0.8.0) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 4af10e5f..b2f1d122 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -78,7 +78,7 @@ repos: types: [file, python] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.7.4" + rev: "v0.8.0" hooks: - id: ruff types: [file, python] From b545720ecd1aa5b6ee96534714ac804d442b6122 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Fri, 29 Nov 2024 16:11:03 +0000 Subject: [PATCH 393/583] Fixes for recent merge-with-fails (#576) * Automatic fixes from pre-commit. * Adopt pre-commit auto-fix for PRs --- .pre-commit-config.yaml | 2 +- src/iris_grib/__init__.py | 2 +- src/iris_grib/_grib1_load_rules.py | 7 ++----- src/iris_grib/message.py | 2 +- 4 files changed, 5 insertions(+), 8 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b2f1d122..6dac0ac8 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,7 +4,7 @@ # See https://github.com/scientific-python/cookie#sp-repo-review ci: - autofix_prs: false + autofix_prs: true autoupdate_commit_msg: "chore: update pre-commit hooks" diff --git a/src/iris_grib/__init__.py b/src/iris_grib/__init__.py index 6bd0c9d0..7e50015b 100644 --- a/src/iris_grib/__init__.py +++ b/src/iris_grib/__init__.py @@ -111,7 +111,7 @@ class GribDataProxy: """A reference to the data payload of a single Grib message.""" - __slots__ = ("shape", "dtype", "path", "offset") + __slots__ = ("dtype", "offset", "path", "shape") def __init__(self, shape, dtype, path, offset): self.shape = shape diff --git a/src/iris_grib/_grib1_load_rules.py b/src/iris_grib/_grib1_load_rules.py index c0790831..d5f6bed2 100644 --- a/src/iris_grib/_grib1_load_rules.py +++ b/src/iris_grib/_grib1_load_rules.py @@ -153,11 +153,8 @@ def grib1_convert(grib): # identity. attributes["GRIB_PARAM"] = grib._grib_code - if ( - (grib.table2Version >= 128) - and (grib._cf_data is None) - or (grib.table2Version == 1) - and (grib.indicatorOfParameter >= 128) + if ((grib.table2Version >= 128) and (grib._cf_data is None)) or ( + (grib.table2Version == 1) and (grib.indicatorOfParameter >= 128) ): long_name = ( f"UNKNOWN LOCAL PARAM {grib.indicatorOfParameter}" f".{grib.table2Version}" diff --git a/src/iris_grib/message.py b/src/iris_grib/message.py index b8f45682..aab46f81 100644 --- a/src/iris_grib/message.py +++ b/src/iris_grib/message.py @@ -218,7 +218,7 @@ def __call__(self): class _DataProxy: """A reference to the data payload of a single GRIB message.""" - __slots__ = ("shape", "dtype", "recreate_raw") + __slots__ = ("dtype", "recreate_raw", "shape") def __init__(self, shape, dtype, recreate_raw): self.shape = shape From 180c24ed9dfcb9d7bcac7219677fe4e9a830c17e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 29 Nov 2024 16:15:22 +0000 Subject: [PATCH 394/583] Bump scitools/workflows in the dependencies group (#577) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2024.11.6 to 2024.11.7 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2024.11.6...2024.11.7) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 36b958dd..c94e84bf 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.11.6 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.11.7 diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 81d57708..4be542aa 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.11.6 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.11.7 secrets: inherit From f835fc970419eb80b6875dcc1400bed7e639057d Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Mon, 2 Dec 2024 10:16:12 +0000 Subject: [PATCH 395/583] Keyfix eccodes 2v38 (#578) * Create key alias to fix eccodes v2.38 change, with backwards compatibility. * Fix deprecated operation which fails for numpy 2. --- src/iris_grib/_load_convert.py | 2 +- src/iris_grib/message.py | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/iris_grib/_load_convert.py b/src/iris_grib/_load_convert.py index 1a055e15..d4003285 100644 --- a/src/iris_grib/_load_convert.py +++ b/src/iris_grib/_load_convert.py @@ -209,7 +209,7 @@ def _masker(item): # Non-standardised usage for negative forecast times. def _hindcast_fix(forecast_time): """Return a forecast time interpreted as a possibly negative value.""" - uft = np.uint32(forecast_time) + uft = np.array(forecast_time).astype(np.uint32) HIGHBIT = 2**30 # Workaround grib api's assumption that forecast time is positive. diff --git a/src/iris_grib/message.py b/src/iris_grib/message.py index aab46f81..9adcc3db 100644 --- a/src/iris_grib/message.py +++ b/src/iris_grib/message.py @@ -27,6 +27,8 @@ "longitudes": "longitude", # Support older form of key which used to exist before eccodes 2v36 "indicatorOfUnitForForecastTime": "indicatorOfUnitOfTimeRange", + # Support older name which became an alias at eccodes 2v38 + "numberOfTimeRange": "numberOfTimeRanges", } From 8f1299d5b02d6c1bd830c77753014c2e15025698 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 3 Dec 2024 08:47:45 +0000 Subject: [PATCH 396/583] chore: update pre-commit hooks (#579) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.8.0 → v0.8.1](https://github.com/astral-sh/ruff-pre-commit/compare/v0.8.0...v0.8.1) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 6dac0ac8..0fc0afb5 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -78,7 +78,7 @@ repos: types: [file, python] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.8.0" + rev: "v0.8.1" hooks: - id: ruff types: [file, python] From 6b329125298277d1996a3878c26a89c45b76ef26 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Dec 2024 11:55:19 +0000 Subject: [PATCH 397/583] Bump scitools/workflows in the dependencies group (#581) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2024.11.7 to 2024.12.0 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2024.11.7...2024.12.0) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index c94e84bf..eefe4d8b 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.11.7 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.12.0 diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 4be542aa..d8558537 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.11.7 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.12.0 secrets: inherit From 11169cf2f5477c182dd60974c03c5c820244bcc6 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 10 Dec 2024 10:30:56 +0000 Subject: [PATCH 398/583] chore: update pre-commit hooks (#582) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.8.1 → v0.8.2](https://github.com/astral-sh/ruff-pre-commit/compare/v0.8.1...v0.8.2) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0fc0afb5..644ce46a 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -78,7 +78,7 @@ repos: types: [file, python] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.8.1" + rev: "v0.8.2" hooks: - id: ruff types: [file, python] From 640ebf446096ed5c41e0529e76ce791650b2e48e Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Mon, 16 Dec 2024 14:47:36 +0000 Subject: [PATCH 399/583] Support numpy2 (#580) * Convert hindcast tests to pytest. * Use signed int64 in hindcast conversion: works with numpy 2. * Use pytest mocker to patch. --- src/iris_grib/_load_convert.py | 8 +- .../unit/load_convert/test__hindcast_fix.py | 79 +++++++++---------- 2 files changed, 44 insertions(+), 43 deletions(-) diff --git a/src/iris_grib/_load_convert.py b/src/iris_grib/_load_convert.py index d4003285..8f31650d 100644 --- a/src/iris_grib/_load_convert.py +++ b/src/iris_grib/_load_convert.py @@ -206,10 +206,14 @@ def _masker(item): _MDI = None +class HindcastOverflowWarning(Warning): + pass + + # Non-standardised usage for negative forecast times. def _hindcast_fix(forecast_time): """Return a forecast time interpreted as a possibly negative value.""" - uft = np.array(forecast_time).astype(np.uint32) + uft = np.array(forecast_time).astype(np.int64) HIGHBIT = 2**30 # Workaround grib api's assumption that forecast time is positive. @@ -221,7 +225,7 @@ def _hindcast_fix(forecast_time): msg = "Re-interpreting large grib forecastTime " "from {} to {}.".format( original_forecast_time, forecast_time ) - warnings.warn(msg) + warnings.warn(msg, HindcastOverflowWarning) return forecast_time diff --git a/src/iris_grib/tests/unit/load_convert/test__hindcast_fix.py b/src/iris_grib/tests/unit/load_convert/test__hindcast_fix.py index 7e566ad1..99d13ddd 100644 --- a/src/iris_grib/tests/unit/load_convert/test__hindcast_fix.py +++ b/src/iris_grib/tests/unit/load_convert/test__hindcast_fix.py @@ -7,53 +7,50 @@ """ -# import iris_grib.tests first so that some things can be initialised -# before importing anything else. -import iris_grib.tests as tests - from collections import namedtuple +import warnings -from iris_grib._load_convert import _hindcast_fix as hindcast_fix - +import pytest -class TestHindcastFix(tests.IrisGribTest): - # setup tests : provided value, fix-applies, expected-fixed - FixTest = namedtuple("FixTest", ("given", "fixable", "fixed")) - test_values = [ - FixTest(0, False, None), - FixTest(100, False, None), - FixTest(2 * 2**30 - 1, False, None), - FixTest(2 * 2**30, False, None), - FixTest(2 * 2**30 + 1, True, -1), - FixTest(2 * 2**30 + 2, True, -2), - FixTest(3 * 2**30 - 1, True, -(2**30 - 1)), - FixTest(3 * 2**30, False, None), - ] - - def setUp(self): - self.patch_warn = self.patch("warnings.warn") - - def test_fix(self): +from iris_grib._load_convert import _hindcast_fix as hindcast_fix +from iris_grib._load_convert import HindcastOverflowWarning + + +FixTest = namedtuple("FixTest", ("given", "fixable", "fixed")) +HINDCAST_TESTCASES = { + "zero_x": FixTest(0, False, None), + "n100_x": FixTest(100, False, None), + "n2^31m1_x": FixTest(2 * 2**30 - 1, False, None), + "n2^31_x": FixTest(2 * 2**30, False, None), + "n2^31p1_m1": FixTest(2 * 2**30 + 1, True, -1), + "n2^31p2_m2": FixTest(2 * 2**30 + 2, True, -2), + "n3x2^30m1_m2^30m1": FixTest(3 * 2**30 - 1, True, -(2**30 - 1)), + "n3x2^30^30_x": FixTest(3 * 2**30, False, None), +} + + +class TestHindcastFix: + @pytest.mark.parametrize( + "testval", + list(HINDCAST_TESTCASES.values()), + ids=list(HINDCAST_TESTCASES.keys()), + ) + def test_fix(self, testval): # Check hindcast fixing. - for given, fixable, fixed in self.test_values: - result = hindcast_fix(given) - expected = fixed if fixable else given - self.assertEqual(result, expected) + given, fixable, fixed = testval + result = hindcast_fix(given) + expected = fixed if fixable else given + assert result == expected - def test_fix_warning(self): + def test_fix_warning(self, mocker): # Check warning appears when enabled. - self.patch("iris_grib._load_convert.options.warn_on_unsupported", True) - hindcast_fix(2 * 2**30 + 5) - self.assertEqual(self.patch_warn.call_count, 1) - self.assertIn( - "Re-interpreting large grib forecastTime", self.patch_warn.call_args[0][0] - ) + mocker.patch("iris_grib._load_convert.options.warn_on_unsupported", True) + msg = "Re-interpreting large grib forecastTime" + with pytest.warns(HindcastOverflowWarning, match=msg): + hindcast_fix(2 * 2**30 + 5) def test_fix_warning_disabled(self): # Default is no warning. - hindcast_fix(2 * 2**30 + 5) - self.assertEqual(self.patch_warn.call_count, 0) - - -if __name__ == "__main__": - tests.main() + with warnings.catch_warnings(): + warnings.simplefilter(category=HindcastOverflowWarning, action="error") + hindcast_fix(2 * 2**30 + 5) From d44fdf9c505227c25cd7ee59310880f50130d99a Mon Sep 17 00:00:00 2001 From: Martin Yeo <40734014+trexfeathers@users.noreply.github.com> Date: Mon, 16 Dec 2024 17:36:15 +0000 Subject: [PATCH 400/583] Full test coverage for GRIB1 (#583) * More integration tests for GRIB1 files. * Test coverage for timeRangeIndicators. * Add Polar Stereo South coverage for GRIB1. * Add Reduced GG coverage for GRIB 1. * Add coverage for identification of y-wind in GRIB1. * Add coverage for CF-mapping in GRIB1. * Widen reduced GG GRIB1 test to cover ML level type. * Refactor test_reduced_gg_grib1 into TestBasicLoad. * Tidy new tests. --- .../load_convert/test_sample_file_loads.py | 120 +++++++++++++++++- .../sample_file_loads/bulletin_40bytes.cml | 40 ++++++ .../sample_file_loads/bulletin_41bytes.cml | 47 +++++++ .../mapped_cf_data_grib1.cml | 34 +++++ .../polar_stereo_south_grib1.cml | 39 ++++++ .../sample_file_loads/reduced_gg_grib1.cml | 45 +++++++ .../second_order_packing.cml | 31 +++++ .../sample_file_loads/time_range_0.cml | 35 +++++ .../sample_file_loads/time_range_1.cml | 35 +++++ .../sample_file_loads/time_range_10.cml | 36 ++++++ .../sample_file_loads/time_range_113.cml | 57 +++++++++ .../sample_file_loads/time_range_118.cml | 57 +++++++++ .../sample_file_loads/time_range_123.cml | 57 +++++++++ .../sample_file_loads/time_range_124.cml | 57 +++++++++ .../sample_file_loads/time_range_2.cml | 53 ++++++++ .../sample_file_loads/time_range_3.cml | 57 +++++++++ .../sample_file_loads/time_range_4.cml | 57 +++++++++ .../sample_file_loads/time_range_5.cml | 57 +++++++++ .../sample_file_loads/y_wind_grib1.cml | 36 ++++++ 19 files changed, 949 insertions(+), 1 deletion(-) create mode 100644 src/iris_grib/tests/results/integration/load_convert/sample_file_loads/bulletin_40bytes.cml create mode 100644 src/iris_grib/tests/results/integration/load_convert/sample_file_loads/bulletin_41bytes.cml create mode 100644 src/iris_grib/tests/results/integration/load_convert/sample_file_loads/mapped_cf_data_grib1.cml create mode 100644 src/iris_grib/tests/results/integration/load_convert/sample_file_loads/polar_stereo_south_grib1.cml create mode 100644 src/iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_gg_grib1.cml create mode 100644 src/iris_grib/tests/results/integration/load_convert/sample_file_loads/second_order_packing.cml create mode 100644 src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_range_0.cml create mode 100644 src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_range_1.cml create mode 100644 src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_range_10.cml create mode 100644 src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_range_113.cml create mode 100644 src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_range_118.cml create mode 100644 src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_range_123.cml create mode 100644 src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_range_124.cml create mode 100644 src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_range_2.cml create mode 100644 src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_range_3.cml create mode 100644 src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_range_4.cml create mode 100644 src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_range_5.cml create mode 100644 src/iris_grib/tests/results/integration/load_convert/sample_file_loads/y_wind_grib1.cml diff --git a/src/iris_grib/tests/integration/load_convert/test_sample_file_loads.py b/src/iris_grib/tests/integration/load_convert/test_sample_file_loads.py index 43d04a50..1f2075da 100644 --- a/src/iris_grib/tests/integration/load_convert/test_sample_file_loads.py +++ b/src/iris_grib/tests/integration/load_convert/test_sample_file_loads.py @@ -10,11 +10,18 @@ """ +from __future__ import annotations + # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests +from pathlib import Path + +import eccodes import iris +import pytest + _RESULTDIR_PREFIX = ("integration", "load_convert", "sample_file_loads") @@ -111,12 +118,33 @@ def test_reduced_ll(self): ) self.assertCML(cube, _RESULTDIR_PREFIX + ("reduced_ll_grib1.cml",)) - def test_reduced_gg(self): + def test_reduced_gg_grib1(self): + cube = iris.load_cube( + Path(eccodes.codes_samples_path()) / "reduced_gg_ml_grib1.tmpl" + ) + self.assertCML(cube, _RESULTDIR_PREFIX + ("reduced_gg_grib1.cml",)) + + def test_reduced_gg_grib2(self): cube = iris.load_cube( tests.get_data_path(("GRIB", "reduced", "reduced_gg.grib2")) ) self.assertCML(cube, _RESULTDIR_PREFIX + ("reduced_gg_grib2.cml",)) + def test_second_order_packing(self): + cube = iris.load_cube( + tests.get_data_path( + ("GRIB", "grib1_second_order_packing", "GRIB_00008_FRANX01") + ) + ) + self.assertCML(cube, _RESULTDIR_PREFIX + ("second_order_packing.cml",)) + + def test_bulletin_headers(self): + for byte_len in (40, 41): + cube = iris.load_cube( + tests.get_data_path(("GRIB", "bulletin", f"{byte_len}bytes.grib")) + ) + self.assertCML(cube, _RESULTDIR_PREFIX + (f"bulletin_{byte_len}bytes.cml",)) + @tests.skip_data class TestIjDirections(tests.IrisGribTest): @@ -197,5 +225,95 @@ def test_shape_of_earth_grib1(self): self.assertCML(cube, _RESULTDIR_PREFIX + ("earth_shape_grib1.cml",)) +class TestTimesGrib1: + # Our codebase has support for many timeRangeIndicator values in GRIB1 + # files, but we do not have files demonstrating these. This class + # generates appropriate GRIB1 files so that we can fully refactor the + # loading code while ensuring continued support for all possible + # scenarios. + + @pytest.fixture(params=[1, 2, 3, 4, 5, 10, 113, 118, 123, 124], autouse=True) + # Note that the following values are not supported by Eccodes - it can + # not provide a startStep value unless the timeRangeIndicator is present + # in eccodes/definitions/grib1/localConcepts/edzw/stepType.def: + # [51, 114, 115, 116, 117, 125]. + def _get_time_range_file(self, request, tmp_path): + save_file = tmp_path / "TestTimes.grib1" + time_range_indicator = request.param + + # Make a file with 10 ascending time steps. + with save_file.open("wb") as open_file: + for time_step in range(10): + grib_message = eccodes.codes_grib_new_from_samples("GRIB1") + eccodes.codes_set_long(grib_message, "P1", time_step) + eccodes.codes_set_long(grib_message, "P2", time_step + 1) + eccodes.codes_set_long( + grib_message, "timeRangeIndicator", time_range_indicator + ) + eccodes.codes_write(grib_message, open_file) + eccodes.codes_release(grib_message) + + self.time_range_indicator = time_range_indicator + self.save_file = save_file + + def test_time_range(self): + cube = iris.load_cube(self.save_file) + tests.IrisGribTest().assertCML( + cube, _RESULTDIR_PREFIX + (f"time_range_{self.time_range_indicator}.cml",) + ) + + +class TestFullCoverageGrib1: + # We do not have a full set of GRIB1 files that exercise our entire GRIB1 + # loading code. This class generates files to cover those gaps. We use CML + # testing since, in the absence of bug reports after years of use (time + # of writing: 2024), we must assume that current functionality is + # satisfactory. Integration tests of this sort will allow us to fully + # refactor GRIB1 loading without any change in user experience. + + id_path_codes = [ + ( + "polar_stereo_south", + tests.get_data_path(("GRIB", "polar_stereo", "ST4.2013052210.01h")), + [("projectionCentreFlag", 1)], + ), + ( + "y_wind", + tests.get_data_path(("GRIB", "gaussian", "regular_gg.grib1")), + [("indicatorOfParameter", 34)], + ), + ( + "mapped_cf_data", + Path(eccodes.codes_samples_path()) / "GRIB1.tmpl", + [("table2Version", 128), ("centre", 98), ("indicatorOfParameter", 34)], + ), + ] + + @pytest.fixture( + params=id_path_codes, + ids=[id for id, path, codes in id_path_codes], + autouse=True, + ) + def _get_grib1_file(self, request, tmp_path): + id_, path, codes = request.param + path_original = Path(path) + path_modified = tmp_path / "tmp_file.grib1" + with path_original.open("rb") as file_original: + gid = eccodes.codes_grib_new_from_file(file_original) + for key, value in codes: + eccodes.codes_set(gid, key, value) + with path_modified.open("wb") as file_modified: + eccodes.codes_write(gid, file_modified) + eccodes.codes_release(gid) + self.id_ = id_ + self.file_path = path_modified + + def test_grib1(self): + cube = iris.load_cube(self.file_path) + tests.IrisGribTest().assertCML( + cube, _RESULTDIR_PREFIX + (f"{self.id_}_grib1.cml",) + ) + + if __name__ == "__main__": tests.main() diff --git a/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/bulletin_40bytes.cml b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/bulletin_40bytes.cml new file mode 100644 index 00000000..bd647be5 --- /dev/null +++ b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/bulletin_40bytes.cml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/bulletin_41bytes.cml b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/bulletin_41bytes.cml new file mode 100644 index 00000000..e16224ab --- /dev/null +++ b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/bulletin_41bytes.cml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/mapped_cf_data_grib1.cml b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/mapped_cf_data_grib1.cml new file mode 100644 index 00000000..c70edbe9 --- /dev/null +++ b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/mapped_cf_data_grib1.cml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/polar_stereo_south_grib1.cml b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/polar_stereo_south_grib1.cml new file mode 100644 index 00000000..695c0e4e --- /dev/null +++ b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/polar_stereo_south_grib1.cml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_gg_grib1.cml b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_gg_grib1.cml new file mode 100644 index 00000000..88169ca7 --- /dev/null +++ b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_gg_grib1.cml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/second_order_packing.cml b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/second_order_packing.cml new file mode 100644 index 00000000..a62118c9 --- /dev/null +++ b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/second_order_packing.cml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_range_0.cml b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_range_0.cml new file mode 100644 index 00000000..1a63cce1 --- /dev/null +++ b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_range_0.cml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_range_1.cml b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_range_1.cml new file mode 100644 index 00000000..1a63cce1 --- /dev/null +++ b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_range_1.cml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_range_10.cml b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_range_10.cml new file mode 100644 index 00000000..779c8b9e --- /dev/null +++ b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_range_10.cml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_range_113.cml b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_range_113.cml new file mode 100644 index 00000000..96b259c8 --- /dev/null +++ b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_range_113.cml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_range_118.cml b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_range_118.cml new file mode 100644 index 00000000..41dd27dd --- /dev/null +++ b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_range_118.cml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_range_123.cml b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_range_123.cml new file mode 100644 index 00000000..96b259c8 --- /dev/null +++ b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_range_123.cml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_range_124.cml b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_range_124.cml new file mode 100644 index 00000000..729cbed1 --- /dev/null +++ b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_range_124.cml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_range_2.cml b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_range_2.cml new file mode 100644 index 00000000..baf9ccd4 --- /dev/null +++ b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_range_2.cml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_range_3.cml b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_range_3.cml new file mode 100644 index 00000000..88be2d21 --- /dev/null +++ b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_range_3.cml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_range_4.cml b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_range_4.cml new file mode 100644 index 00000000..e6be9da0 --- /dev/null +++ b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_range_4.cml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_range_5.cml b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_range_5.cml new file mode 100644 index 00000000..857ce756 --- /dev/null +++ b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/time_range_5.cml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/y_wind_grib1.cml b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/y_wind_grib1.cml new file mode 100644 index 00000000..c8eb5d60 --- /dev/null +++ b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/y_wind_grib1.cml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From b80487b006178c05e3237d73a41f1f4099fb853f Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 18 Dec 2024 19:15:16 +0000 Subject: [PATCH 401/583] chore: update pre-commit hooks (#586) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.8.2 → v0.8.3](https://github.com/astral-sh/ruff-pre-commit/compare/v0.8.2...v0.8.3) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 644ce46a..c38f2a2b 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -78,7 +78,7 @@ repos: types: [file, python] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.8.2" + rev: "v0.8.3" hooks: - id: ruff types: [file, python] From fe60f54530498f20dfe904cb56ebd1e338a65c5f Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Thu, 2 Jan 2025 15:29:07 +0000 Subject: [PATCH 402/583] Update to latest refresh-lockfiles shared action. (#590) * Update to latest refresh-lockfiles shared action. * Avoid additional test problem from new warning in Iris 3.11.1 --- .github/workflows/refresh-lockfiles.yml | 2 +- .../test_product_definition_template_0.py | 11 +++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index d8558537..7a51c234 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.12.0 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.12.5 secrets: inherit diff --git a/src/iris_grib/tests/unit/load_convert/test_product_definition_template_0.py b/src/iris_grib/tests/unit/load_convert/test_product_definition_template_0.py index 451995b8..9b317ff8 100644 --- a/src/iris_grib/tests/unit/load_convert/test_product_definition_template_0.py +++ b/src/iris_grib/tests/unit/load_convert/test_product_definition_template_0.py @@ -14,6 +14,7 @@ from unittest import mock +from iris import FUTURE as IRIS_FUTURE import iris.coords import iris_grib @@ -81,8 +82,14 @@ def test_generating_process_warnings(self): emit_warnings = convert_options.warn_on_unsupported try: convert_options.warn_on_unsupported = True - with mock.patch("warnings.warn") as warn: - product_definition_template_0(section_4(), metadata, rt_coord) + future_kwargs = {} + if hasattr(IRIS_FUTURE, "date_microseconds"): + # Avoid an additional awkward warning + # TODO: convert regime to pytest + tidy, but that is a lot of work ! + future_kwargs["date_microseconds"] = True + with IRIS_FUTURE.context(**future_kwargs): + with mock.patch("warnings.warn") as warn: + product_definition_template_0(section_4(), metadata, rt_coord) warn_msgs = [call[1][0] for call in warn.mock_calls] expected = [ "Unable to translate type of generating process.", From b5f6060b5ebb259bc56d593ebac43481a13ebb28 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Fri, 3 Jan 2025 13:31:16 +0000 Subject: [PATCH 403/583] Update to refresh-lockfiles v2025.01.0 for iris 3.11.1 and pin dask to fix pickling. (#591) --- .github/workflows/refresh-lockfiles.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 7a51c234..9ba9210a 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.12.5 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.01.0 secrets: inherit From 051aca11ac775ec8aa9c4f4cbf22d1b9aa8562d8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Jan 2025 14:02:41 +0000 Subject: [PATCH 404/583] Bump scitools/workflows in the dependencies group across 1 directory (#592) Bumps the dependencies group with 1 update in the / directory: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2024.12.0 to 2025.01.0 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2024.12.0...2025.01.0) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index eefe4d8b..4edbead9 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.12.0 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.01.0 From 6c7ca2212ecf375e9ebcf53a00cd938da4a47f47 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Fri, 3 Jan 2025 14:26:59 +0000 Subject: [PATCH 405/583] Updated environment lockfiles (#593) Co-authored-by: Lockfile bot Co-authored-by: Patrick Peglar --- requirements/locks/py310-linux-64.lock | 300 ++++++++++++------------- requirements/locks/py311-linux-64.lock | 299 ++++++++++++------------ requirements/locks/py312-linux-64.lock | 299 ++++++++++++------------ 3 files changed, 450 insertions(+), 448 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index d81a639a..f1cb1bf2 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -3,200 +3,200 @@ # input_hash: 4b79cfcae8adfdca32dfc1151f0085dbb2a52a32b9d8bcaa79abfaa5ca75f98b @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.8.30-hbcca054_0.conda#c27d1c142233b5bc9ca570c6e2e0c244 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda#b80f2f396ca2c28b8c14c437a4ed1e74 +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.12.14-hbcca054_0.conda#720523eb0d6a9b0f6120c16b2aa4e7de https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-5_cp310.conda#2921c34715e74b3587b4cff4d36844f9 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda#8bfdead4e0fff0383ae4c9c50d0531bd -https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_1.conda#23c255b008c4f2ae008f81edcabaca89 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda#8ac3367aafb1cc0a068483c580af8015 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda#048b02e3962f066da18efe3a21b77672 +https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda#cc3573974587f12dda90d96e3e55a702 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.1.0-h77fa898_1.conda#002ef4463dd1e2b44a94a4ace468f5d2 +https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda#c151d5eb730e9b7480e6d48c0fc44048 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda#3cb76c3f10d3bc7f1105b2fc9db984df +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda#e2775acf57efd5af15b8e3d1d74d72d3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.3-h5888daf_0.conda#59f4c43bb1b5ef1c71946ff2cbf59524 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h69a702a_1.conda#1efc0ad219877a73ef977af7dbb51f17 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.1.0-hc5f4f2c_1.conda#10a0cef64b784d6ab6da50ebca4e984d -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.1.0-hc0a3c3a_1.conda#9dbb9699ea467983ba8a4ba89b08b066 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.2-hb9d3cd8_0.conda#4d638782050ab6faa27275bed57e9b4e +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda#8dfae1d2e74767e9ce36d5fa0d8605db +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda#db833e03127376d461e1e13e76f09b6c +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda#e39480b9ca41323497b05492a63bc35b +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hd5240d6_1.conda#9822b874ea29af082e5d36098d25427d +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.3-hb9d3cd8_1.conda#2ecf2f1c7e4e21fcfe6423a51a992d84 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda#234a5554c53625688d51062645337328 +https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-hb9d3cd8_0.conda#23cc74f77eb99315c0360ec3533147a9 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e -https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-hb9d3cd8_1003.conda#32623b33f2047dbc9ae2f2e8fd3880e9 -https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-hb9d3cd8_1003.conda#e87bfacb110d85e1eb6099c9ed8e7236 -https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-hb9d3cd8_1004.conda#bc4cd53a083b6720d61a1519a1900878 -https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-hb9d3cd8_1008.conda#a63f5b66876bb1ec734ab4bdc4d11e86 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.33.1-heb4867d_0.conda#0d3c60291342c0c025db231353376dfb +https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.0-h5888daf_0.conda#40b4ab956c90390e407bb177f8a58bab https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.21-h4bc722e_0.conda#36ce76665bf67f5aac36be7a0d21b7f3 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.1.0-h69a702a_1.conda#591e631bc1ae62c64f2ab4f66178c097 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_1.conda#f1fd30127802683586f768875127a987 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.1.0-h4852527_1.conda#bd2598399a70bb86d8218e95548d735e +https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda#f4cc49d7aa68316213e4b12be35308d1 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.2-hee588c1_0.conda#b58da17db24b6e08bcbf8fed2fb8c915 +https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda#be2de152d8073ef1c01b7728475f2fe7 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda#8371ac6457591af2cf6159439c1fd051 https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b -https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 +https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc -https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 +https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda#70caf8bb6cf39a0b6b7efc885f51c0fe -https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda#2c80dc38fface310c9bd81b17037fee5 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2#be93aabceefa2fac576e971aef407908 +https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda#3b3e64af585eadfb52bb90b553db5edf +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 -https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 -https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.2-he02047a_1.conda#aab9195bc018b82dc77a84584b36cce9 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 -https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa +https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.124-hb9d3cd8_0.conda#8bc89311041d7fcb510238cf0848ccae https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.1.0-h69a702a_1.conda#16cec94c5992d7f42ae3f9fa8b25df8d https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d -https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda#f4cc49d7aa68316213e4b12be35308d1 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.1-hadc24fc_0.conda#36f79405ab16bf271edb55b213836dac -https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe -https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.16-hb9d3cd8_1.conda#3601598f0db0470af28985e3e7ad0158 -https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.1-hf83b1b0_0.conda#e8536ec89df2aec5f65fefcf4ccd58ba -https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 +https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_1.conda#62857b389e42b36b686331bec0922050 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.5-h0d44e9d_1.conda#f5b05674697ae7d2c5932766695945e1 +https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 -https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-ha2e4443_0.conda#6b7dcc7349efd123d493d2dbe85a045f -https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 -https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-h4ab18f5_1.conda#9653f1bf3766164d0e65fa723cabbc54 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.10-h4f16b4b_1.conda#125f34a17d7b4bea418a83904ea82ea6 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 -https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-hef167b5_0.conda#54fe76ab3d0189acaef95156874db7f9 +https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_hac2b453_1.conda#ae05ece66d3924ac3d48b4aa3fa96cec -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-h6565414_0.conda#80eaf80d84668fa5620ac9ec1b4bf56f -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-he7c6b58_4.conda#08a9265c637230c37cb1be4a6cad4536 -https://conda.anaconda.org/conda-forge/linux-64/python-3.10.15-h4a871b0_0_cpython.conda#f5c36ac89c928702bcfd2e2d567048d9 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.46.1-h9eae976_0.conda#b2b3e737da0ae347e16ef1970a5d3f14 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-hb711507_1.conda#4a6d410296d7e39f00bacdee7df046e9 -https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb -https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 -https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.5.0-pyhd8ed1ab_0.conda#58d664381a6dd4238cf40b7e2ba3309d -https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda#6732fa52eb8e66e5afeb32db8701a791 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-26_linux64_openblas.conda#ac52800af2e0c0e7dac770b435ce768a +https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda#0ea6510969e1296cc19966fad481f6de +https://conda.anaconda.org/conda-forge/linux-64/python-3.10.16-he725a3c_1_cpython.conda#b887811a901b3aa622a92caf03bc8917 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.47.2-h9eae976_0.conda#64a954de15d114281535a26fd4d1f294 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 +https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a +https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.5.2-pyhd8ed1ab_0.conda#4229aeacda5e2878871ce03b39d3e11f +https://conda.anaconda.org/conda-forge/noarch/attrs-24.3.0-pyh71513ae_0.conda#356927ace43302bf6f5926e2a58dae6a https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_2.conda#bf502c169c71e3c6ac0d6175addfacc2 -https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.0-pyhd8ed1ab_0.conda#5bad039db72bd8f134a5cff3ebaa190d -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda#12f7d00853807b0531775e9be891cb11 -https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2#ebb5f5f7dc4f1a3780ef7ea7738db08c +https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.0-pyhd8ed1ab_1.conda#0a99af03ccbd19113c1de1c7f16a53d2 +https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda#6feb87357ecd66733be3279f16a8c400 +https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/linux-64/chardet-5.2.0-py310hff52083_2.conda#e94bf593fe645f6b85a9c8b2d52caae6 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a -https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca -https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.conda#753d29fe41bb881e4b9c004f0abf973f -https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 -https://conda.anaconda.org/conda-forge/linux-64/colorlog-6.8.2-py310hff52083_1.conda#135e349cbfd9fc63061800d3e13936ab -https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 -https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 -https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py310hff52083_3.conda#c159dcd29bbd80b187b1c5d5f73cc971 -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 -https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_0.conda#916f8ec5dd4128cd5f207a3c4c07b2c6 +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.0-pyhd8ed1ab_1.conda#6581a17bba6b948bb60130026404a9d6 +https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda#f22f4d4970e09d68a10b922cbb0408d3 +https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.0-pyhd8ed1ab_2.conda#1f76b7e2b3ab88def5aa2f158322c7e6 +https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 +https://conda.anaconda.org/conda-forge/noarch/colorlog-6.9.0-pyh707e725_1.conda#f00fc375bd02bdbbf791f9fe26ae96ec +https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 +https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_1.conda#8d88f4a2242e6b96f9ecff9a6a05b2f1 +https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e +https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_1.conda#d692e9ba6f92dc51484bf3477e36ce7c https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.9.0-pyhff2d567_0.conda#ace4329fbff4c69ab0309db6da182987 -https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 -https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2#9f765cbfab6870c8435b9eefecd7a1f4 -https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_0.conda#7ba2ede0e7c795ff95088daf0dc59753 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.12.0-pyhd8ed1ab_0.conda#e041ad4c43ab5e10c74587f95378ebc7 +https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyhd8ed1ab_1.conda#2aa5ff7fa34a81b9196532c84c10d865 +https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_1.conda#566e75c90c1d0c8c459eb0ad9833dc7a +https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 -https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 -https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.4.0-pyhd8ed1ab_0.tar.bz2#18ee9c07cf945a33f92caf1ee3d23ad9 +https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 +https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.1-pyhd8ed1ab_1.conda#ae376af0a29183e98a95508ed6944664 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py310h3788b33_0.conda#4186d9b4d004b0fe0de6aa62496fb48a https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-24_linux64_openblas.conda#80aea6603a6813b16ec119d00382b772 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.10.1-hbbe4b11_0.conda#6e801c50a40301f6978c53976917b277 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-26_linux64_openblas.conda#ebcc5f37a435aa3c19640533c82f8d76 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.11.1-h332b0f4_0.conda#2b3e0081006dc21e8bf53a91c83a055c +https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-26_linux64_openblas.conda#3792604c43695d6a273bc5faaac47d48 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py310ha75aee5_1.conda#14ae296598aab54a26ab8c095f57db10 +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py310h89163eb_1.conda#8ce3f0332fd6de0d737e2911d329523f https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 -https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_0.conda#fd8f2b18b65bbf62e8f653100690c8d2 -https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf -https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 -https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda#b7f5c092b8f9800150d998a71b76d5a1 -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.4-pyhd8ed1ab_0.conda#4d91352a50949d049cf9714c8563d433 -https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 -https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 +https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda#577852c7e53901ddccc7e6a9959ddebe +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef +https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_1.conda#b38dc0206e2a530e5c2cf11dc086b31a +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.1-pyhd8ed1ab_0.conda#285e237b8f351e85e7574a2c7bfa6d46 +https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_1.conda#856b387c270e9eaf6e41e978057a2b62 +https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py310ha75aee5_1.conda#8b430470d53744289cb5499bc99a6485 -https://conda.anaconda.org/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_0.conda#260009d03c9d5c0f111904d851f053dc +https://conda.anaconda.org/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_1.conda#f26ec986456c30f6dff154b670ae140f https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py310ha75aee5_1.conda#0d4c5c76ae5f5aac6f0be419963a19dd -https://conda.anaconda.org/conda-forge/noarch/setuptools-74.1.2-pyhd8ed1ab_0.conda#56c9c11d004428e81d02eeb730fc6336 -https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 +https://conda.anaconda.org/conda-forge/noarch/setuptools-75.6.0-pyhff2d567_1.conda#fc80f7995e396cbaeabd23cf46c413dc +https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 -https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 -https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 -https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda#ebe6952715e1d5eb567eeebf25250fa7 -https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py310h2372a71_0.conda#72637c58d36d9475fda24700c9796f19 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda#d44e3b085abcaef02983c6305b84b584 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a -https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.2-pyhd8ed1ab_0.conda#4daaed111c05672ae669f7036ee5bba3 -https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb +https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 +https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 +https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_1.conda#40d0ed782a8aaa16ef248e68c06c168d +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda#d17f13df8b65464ca316cbc000a3cb64 +https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py310ha75aee5_1.conda#ee18e67b0bd283f6a75369936451d6ac +https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa +https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3cc595284c5e8f0f9900a9b228a332 +https://conda.anaconda.org/conda-forge/noarch/babel-2.16.0-pyhd8ed1ab_1.conda#3e23f7db93ec14c80525257d8affac28 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h8deb56e_0.conda#1fc24a3196ad5ede2a68148be61894f4 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.1-py310ha75aee5_1.conda#69521d4acef78a85e81ddf512977157b -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.1-py310ha75aee5_1.conda#75fd6c3b4cd1d22955bf5fb78eae6c12 -https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda#54198435fce4d64d8a89af22573012a8 -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-24_linux64_openblas.conda#f5b8822297c9c790cec0795ca1fc9be6 -https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-ha6d2627_1004.conda#df069bea331c8486ac21814969301c1f -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-24_linux64_openblas.conda#fd540578678aefe025705f4b58b36b2e -https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda#dfe0528d0f1c16c1f7c528ea5536ab30 -https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/linux-64/pillow-10.4.0-py310he228d35_1.conda#267bd9088c6aa5ae96dceb470fa6efa9 -https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda#6c78fbb8ddfd64bcb55b5cbafd2d2c43 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.5.0-h12925eb_0.conda#8c29983ebe50cc7e0998c34bc7614222 -https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.8.0-pyhd8ed1ab_0.conda#43bc5b655d19dd7e9bd5951b11cfa0a0 -https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda#c03d61f31f38fdb9facf70c29958bf7a -https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.5-pyhd8ed1ab_0.conda#949a6778521278cb96d7491bd99a5418 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h4bc722e_1.conda#749baebe7e2ff3360630e069175e528b +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.10-py310h89163eb_0.conda#f9bf6ea6ddf8349750f1b455f603b0ae +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.55.3-py310h89163eb_1.conda#c81251a712a36b477ed2330ec0e1a299 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.5.0-hd8ed1ab_0.conda#2a92e152208121afadf85a5e1f3a5f4d -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h135f659_114.conda#a908e463c710bd6b10a9eaa89fdf003c -https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py310hb13e2d6_0.conda#6593de64c935768b6bad3e19b3e978be -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py310h2e9f774_10.conda#094677406ae61569cc928f53522a3c19 -https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 -https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e -https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda#ba9f7f0ec4f2a18de3e7bce67c4a431e -https://conda.anaconda.org/conda-forge/noarch/tox-4.20.0-pyhd8ed1ab_0.conda#d6681d3720a2cb12f2d6184d9a75ad81 -https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310h3788b33_5.conda#e05b0475166b68c9dc4d7937e0315654 -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha39cb0e_1.conda#f49de34fb99934bf49ab330b5caffd64 +https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_1.conda#825927dc7b0f287ef8d4d0011bb113b1 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.4-nompi_h2d575fe_105.conda#d76fff0092b6389a12134ddebc0929bd +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_1.conda#315607a3030ad5d5227e76e0733798ff +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda#2752a6ed44105bfb18c9bef1177d9dcd +https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h03adeef_0.conda#b1df5affe904efe82ef890826b68881d +https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.1-py310h5851e9f_0.conda#d38cb65becc66134ed42a02e6155e8e0 +https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 +https://conda.anaconda.org/conda-forge/linux-64/pillow-11.0.0-py310hfeaa1f3_0.conda#1947280342c7259b82a707e38ebc212e +https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_2.conda#04e691b9fadd93a8a9fad87a81d4fd8f +https://conda.anaconda.org/conda-forge/linux-64/proj-9.5.1-h0054346_0.conda#398cabfd9bd75e90d0901db95224f25f +https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.8.0-pyhd8ed1ab_1.conda#f23e24f1f1b8bdc8f644ffaf195c6684 +https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda#799ed216dc6af62520f32aa39bc1c2bb +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda#b6a408c64b78ec7b779a3e5c7a902433 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.28.0-pyhd8ed1ab_0.conda#1d601bc1d28b5ce6d112b90f4b9b8ede https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310hf462985_1.conda#c2d5289e6cbcecf2c549e01772fe5274 -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.0-py310h3788b33_1.conda#05eccc0bacdbcc8a5ad3c7b35b7e1cd5 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.9.0-pyhd8ed1ab_0.conda#8e6585b996dfa6fff92d7ccd0f18bb99 -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.1-pyhd8ed1ab_0.conda#43f629202f9eec21be5f71171fb5daf8 +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.1-py310h3788b33_0.conda#f993b13665fc2bb262b30217c815d137 +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.5.0-hd8ed1ab_1.conda#c70dd0718dbccdcc6d5828de3e71399d https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 -https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py310h2372a71_1.conda#dfcf64f67961eb9686676f96fdb4b4d1 -https://conda.anaconda.org/conda-forge/noarch/nox-2024.4.15-pyhff2d567_0.conda#600c0de12125f473d8099c0b3e6f88d4 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.1-py310ha3fb0e1_0.conda#dcca3051fda0f861e8111c6368842a28 -https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.1.0-hd8ed1ab_0.conda#7ed7b077f6c6ebcb5fc66f23985df487 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.6-py310h64a4ca9_1.conda#cac7e9a8dcd64d40a83fafff87fbf3c1 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.3-pyhd8ed1ab_0.conda#6b55867f385dd762ed99ea687af32a69 -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py310hf462985_6.conda#b8ad2d561f4e0db4f09d06cc0e73e0b0 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.37.0-h8bb6dbc_0.conda#977e230843c4747236c5972a69b1121d -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.2-py310h68603db_1.conda#989ef368e7b81b6c28e608e651a2a7d8 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.1-nompi_py310h9f0ad05_102.conda#fafb8cd70d84eab5df8d03a432890474 -https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.8.0-pyha770c72_1.conda#004cff3a7f6fafb0a041fb575de85185 -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py310h5eaa309_2.conda#7eecc124f1b4ebd547b0e5f2ad6c9e2f -https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_0.conda#2cc61ba1dd53f0806247333f1294e058 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h5ddbaa4_116.conda#f51573abc223afed7e5374f34135ce05 +https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py310ha75aee5_1.conda#48781b625a5c7701e04d222752cb2f62 +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.0-py310h2e9f774_0.conda#42a3ea3c283d930ae6d156b97ffe4740 +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda#79963c319d1be62c8fd3e34555816e01 +https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.1-py310hfcf56fc_2.conda#b5d548b2a7cf8d0c74fc6c4bf42d1ca5 +https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_1.conda#ac738a7f524d1b157e53fb9734f85e0e +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.6-py310had3dfd6_2.conda#a4166b41e54d22e794859641b7cae2d0 +https://conda.anaconda.org/conda-forge/noarch/tox-4.23.2-pyhd8ed1ab_1.conda#18cdd1546804d0ec2f81fb6b5f2c1bb7 +https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310h3788b33_5.conda#e05b0475166b68c9dc4d7937e0315654 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha39cb0e_1.conda#f49de34fb99934bf49ab330b5caffd64 +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py310hf462985_0.conda#c31938674e4cda43617a4d70f99ffd0c +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.39.0-hf413ef6_1.conda#63ea3e2f32daf4670182a3e6aad0b47b +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.4-pyhd8ed1ab_0.conda#5ec16e7ad9bab911ff0696940953f505 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.0-py310h68603db_0.conda#409498230a11a71578ed49d006165249 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py310h5146f0f_101.conda#3e17df8e4192431b85afc89a539f6c28 +https://conda.anaconda.org/conda-forge/noarch/nox-2024.10.9-pyhd8ed1ab_1.conda#74adbad34c17927dad683cfc2f57cce5 +https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.1.0-hd8ed1ab_1.conda#4b2757cbafd866a23faba9dd2b6fd43e +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py310h5eaa309_0.conda#ca4d935c1715f95b6e86846ad1675a2b +https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.0.1-pyha770c72_1.conda#d0ea6ed474bf7f6db88fc85e6dc809b1 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py310hf462985_0.conda#93ae40b74b2baea09ddeaa287b09e705 -https://conda.anaconda.org/conda-forge/noarch/iris-3.10.0-pyha770c72_1.conda#b7212cd8247ce909631fdcb77015914a -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_0.conda#9075bd8c033f0257122300db914e49c9 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_0.conda#b3bcc38c471ebb738854f52a36059b48 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_0.conda#e25640d692c02e8acfff0372f547e940 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jquery-4.1-pyhd8ed1ab_0.conda#914897066d5873acfb13e75705276ad1 -https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-2.0.0-pyha770c72_0.conda#baf6d9a33df1a789ca55e3b404c7ea28 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_0.conda#d6e5ea5fe00164ac6c2dcc5d76a42192 -https://conda.anaconda.org/conda-forge/noarch/sphinx-7.4.7-pyhd8ed1ab_0.conda#c568e260463da2528ecfd7c5a0b41bbd -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda#e507335cb4ca9cff4c3d0fa9cdab255e +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 +https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 +https://conda.anaconda.org/conda-forge/noarch/iris-3.11.1-pyha770c72_0.conda#ee54ee24030934558ddfc033f178ecbe +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda#e9fb3fe8a5b758b4aff187d434f94f03 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jquery-4.1-pyhd8ed1ab_1.conda#403185829255321ea427333f7773dd1f +https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-3.0.1-pyha770c72_0.conda#740536f8a54250b1964e494c0bf5c9c3 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda#00534ebcc0375929b45c3039b5ba7636 +https://conda.anaconda.org/conda-forge/noarch/sphinx-8.1.3-pyhd8ed1ab_1.conda#1a3281a0dc355c02b5506d87db2d78ac +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda#3bc61f7161d28137797e038263c04c54 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index d3adc82e..4aca7b94 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -3,199 +3,200 @@ # input_hash: fe5452e41de90dae4e169a25fead307770c576d24c6b8b5ccaf1c6db315e8ae0 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.8.30-hbcca054_0.conda#c27d1c142233b5bc9ca570c6e2e0c244 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda#b80f2f396ca2c28b8c14c437a4ed1e74 +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.12.14-hbcca054_0.conda#720523eb0d6a9b0f6120c16b2aa4e7de https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-5_cp311.conda#139a8d40c8a2f430df31048949e450de -https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda#8bfdead4e0fff0383ae4c9c50d0531bd -https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_1.conda#23c255b008c4f2ae008f81edcabaca89 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda#8ac3367aafb1cc0a068483c580af8015 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda#048b02e3962f066da18efe3a21b77672 +https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda#cc3573974587f12dda90d96e3e55a702 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.1.0-h77fa898_1.conda#002ef4463dd1e2b44a94a4ace468f5d2 +https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda#c151d5eb730e9b7480e6d48c0fc44048 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda#3cb76c3f10d3bc7f1105b2fc9db984df +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda#e2775acf57efd5af15b8e3d1d74d72d3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.3-h5888daf_0.conda#59f4c43bb1b5ef1c71946ff2cbf59524 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h69a702a_1.conda#1efc0ad219877a73ef977af7dbb51f17 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.1.0-hc5f4f2c_1.conda#10a0cef64b784d6ab6da50ebca4e984d -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.1.0-hc0a3c3a_1.conda#9dbb9699ea467983ba8a4ba89b08b066 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.2-hb9d3cd8_0.conda#4d638782050ab6faa27275bed57e9b4e +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda#8dfae1d2e74767e9ce36d5fa0d8605db +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda#db833e03127376d461e1e13e76f09b6c +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda#e39480b9ca41323497b05492a63bc35b +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hd5240d6_1.conda#9822b874ea29af082e5d36098d25427d +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.3-hb9d3cd8_1.conda#2ecf2f1c7e4e21fcfe6423a51a992d84 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda#234a5554c53625688d51062645337328 +https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-hb9d3cd8_0.conda#23cc74f77eb99315c0360ec3533147a9 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e -https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-hb9d3cd8_1003.conda#32623b33f2047dbc9ae2f2e8fd3880e9 -https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-hb9d3cd8_1003.conda#e87bfacb110d85e1eb6099c9ed8e7236 -https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-hb9d3cd8_1004.conda#bc4cd53a083b6720d61a1519a1900878 -https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-hb9d3cd8_1008.conda#a63f5b66876bb1ec734ab4bdc4d11e86 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.33.1-heb4867d_0.conda#0d3c60291342c0c025db231353376dfb +https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.0-h5888daf_0.conda#40b4ab956c90390e407bb177f8a58bab https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.21-h4bc722e_0.conda#36ce76665bf67f5aac36be7a0d21b7f3 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.1.0-h69a702a_1.conda#591e631bc1ae62c64f2ab4f66178c097 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_1.conda#f1fd30127802683586f768875127a987 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.1.0-h4852527_1.conda#bd2598399a70bb86d8218e95548d735e +https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda#f4cc49d7aa68316213e4b12be35308d1 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.2-hee588c1_0.conda#b58da17db24b6e08bcbf8fed2fb8c915 +https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda#be2de152d8073ef1c01b7728475f2fe7 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda#8371ac6457591af2cf6159439c1fd051 https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b -https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 +https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc -https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 +https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda#70caf8bb6cf39a0b6b7efc885f51c0fe -https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda#2c80dc38fface310c9bd81b17037fee5 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2#be93aabceefa2fac576e971aef407908 +https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda#3b3e64af585eadfb52bb90b553db5edf +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 -https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 -https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.2-he02047a_1.conda#aab9195bc018b82dc77a84584b36cce9 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 -https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa +https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.124-hb9d3cd8_0.conda#8bc89311041d7fcb510238cf0848ccae https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.1.0-h69a702a_1.conda#16cec94c5992d7f42ae3f9fa8b25df8d https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d -https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda#f4cc49d7aa68316213e4b12be35308d1 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.1-hadc24fc_0.conda#36f79405ab16bf271edb55b213836dac -https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe -https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.16-hb9d3cd8_1.conda#3601598f0db0470af28985e3e7ad0158 -https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.1-hf83b1b0_0.conda#e8536ec89df2aec5f65fefcf4ccd58ba -https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 +https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_1.conda#62857b389e42b36b686331bec0922050 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.5-h0d44e9d_1.conda#f5b05674697ae7d2c5932766695945e1 +https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 -https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-ha2e4443_0.conda#6b7dcc7349efd123d493d2dbe85a045f -https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 -https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-h4ab18f5_1.conda#9653f1bf3766164d0e65fa723cabbc54 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.10-h4f16b4b_1.conda#125f34a17d7b4bea418a83904ea82ea6 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 -https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-hef167b5_0.conda#54fe76ab3d0189acaef95156874db7f9 +https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_hac2b453_1.conda#ae05ece66d3924ac3d48b4aa3fa96cec -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-h6565414_0.conda#80eaf80d84668fa5620ac9ec1b4bf56f -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-he7c6b58_4.conda#08a9265c637230c37cb1be4a6cad4536 -https://conda.anaconda.org/conda-forge/linux-64/python-3.11.10-hc5c86c4_0_cpython.conda#43a02ff0a2dafe8a8a1b6a9eacdbd2cc -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.46.1-h9eae976_0.conda#b2b3e737da0ae347e16ef1970a5d3f14 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-hb711507_1.conda#4a6d410296d7e39f00bacdee7df046e9 -https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb -https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 -https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.5.0-pyhd8ed1ab_0.conda#58d664381a6dd4238cf40b7e2ba3309d -https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda#6732fa52eb8e66e5afeb32db8701a791 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-26_linux64_openblas.conda#ac52800af2e0c0e7dac770b435ce768a +https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda#0ea6510969e1296cc19966fad481f6de +https://conda.anaconda.org/conda-forge/linux-64/python-3.11.11-h9e4cc4f_1_cpython.conda#8387070aa413ce9a8cc35a509fae938b +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.47.2-h9eae976_0.conda#64a954de15d114281535a26fd4d1f294 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 +https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a +https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.5.2-pyhd8ed1ab_0.conda#4229aeacda5e2878871ce03b39d3e11f +https://conda.anaconda.org/conda-forge/noarch/attrs-24.3.0-pyh71513ae_0.conda#356927ace43302bf6f5926e2a58dae6a https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hfdbb021_2.conda#d21daab070d76490cb39a8f1d1729d79 -https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.0-pyhd8ed1ab_0.conda#5bad039db72bd8f134a5cff3ebaa190d -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda#12f7d00853807b0531775e9be891cb11 -https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2#ebb5f5f7dc4f1a3780ef7ea7738db08c +https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.0-pyhd8ed1ab_1.conda#0a99af03ccbd19113c1de1c7f16a53d2 +https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda#6feb87357ecd66733be3279f16a8c400 +https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/linux-64/chardet-5.2.0-py311h38be061_2.conda#00f0ad2aed7e65c9392a067ce7882b28 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a -https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca -https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.conda#753d29fe41bb881e4b9c004f0abf973f -https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 -https://conda.anaconda.org/conda-forge/linux-64/colorlog-6.8.2-py311h38be061_1.conda#031e8b480898f5c6c36eab8814d2d48d -https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 -https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 -https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py311h38be061_3.conda#1c33f55e5cdcc2a2b973c432b5225bfe -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 -https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_0.conda#916f8ec5dd4128cd5f207a3c4c07b2c6 +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.0-pyhd8ed1ab_1.conda#6581a17bba6b948bb60130026404a9d6 +https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda#f22f4d4970e09d68a10b922cbb0408d3 +https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.0-pyhd8ed1ab_2.conda#1f76b7e2b3ab88def5aa2f158322c7e6 +https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 +https://conda.anaconda.org/conda-forge/noarch/colorlog-6.9.0-pyh707e725_1.conda#f00fc375bd02bdbbf791f9fe26ae96ec +https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 +https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_1.conda#8d88f4a2242e6b96f9ecff9a6a05b2f1 +https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e +https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_1.conda#d692e9ba6f92dc51484bf3477e36ce7c https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.9.0-pyhff2d567_0.conda#ace4329fbff4c69ab0309db6da182987 -https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 -https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2#9f765cbfab6870c8435b9eefecd7a1f4 -https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_0.conda#7ba2ede0e7c795ff95088daf0dc59753 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.12.0-pyhd8ed1ab_0.conda#e041ad4c43ab5e10c74587f95378ebc7 +https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyhd8ed1ab_1.conda#2aa5ff7fa34a81b9196532c84c10d865 +https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_1.conda#566e75c90c1d0c8c459eb0ad9833dc7a +https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 -https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 -https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.4.0-pyhd8ed1ab_0.tar.bz2#18ee9c07cf945a33f92caf1ee3d23ad9 +https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 +https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.1-pyhd8ed1ab_1.conda#ae376af0a29183e98a95508ed6944664 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py311hd18a35c_0.conda#be34c90cce87090d24da64a7c239ca96 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-24_linux64_openblas.conda#80aea6603a6813b16ec119d00382b772 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.10.1-hbbe4b11_0.conda#6e801c50a40301f6978c53976917b277 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-26_linux64_openblas.conda#ebcc5f37a435aa3c19640533c82f8d76 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.11.1-h332b0f4_0.conda#2b3e0081006dc21e8bf53a91c83a055c +https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-26_linux64_openblas.conda#3792604c43695d6a273bc5faaac47d48 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py311h9ecbd09_1.conda#c30e9e5aef9e9ff7fb593736ce2a4546 +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py311h2dc5d0c_1.conda#6565a715337ae279e351d0abd8ffe88a https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 -https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_0.conda#fd8f2b18b65bbf62e8f653100690c8d2 -https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf -https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 -https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda#b7f5c092b8f9800150d998a71b76d5a1 -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.4-pyhd8ed1ab_0.conda#4d91352a50949d049cf9714c8563d433 -https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 -https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 +https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda#577852c7e53901ddccc7e6a9959ddebe +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef +https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_1.conda#b38dc0206e2a530e5c2cf11dc086b31a +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.1-pyhd8ed1ab_0.conda#285e237b8f351e85e7574a2c7bfa6d46 +https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_1.conda#856b387c270e9eaf6e41e978057a2b62 +https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py311h9ecbd09_1.conda#b1796d741ca619dbacb79917b20e5a05 -https://conda.anaconda.org/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_0.conda#260009d03c9d5c0f111904d851f053dc +https://conda.anaconda.org/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_1.conda#f26ec986456c30f6dff154b670ae140f https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py311h9ecbd09_1.conda#abeb54d40f439b86f75ea57045ab8496 -https://conda.anaconda.org/conda-forge/noarch/setuptools-74.1.2-pyhd8ed1ab_0.conda#56c9c11d004428e81d02eeb730fc6336 -https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 +https://conda.anaconda.org/conda-forge/noarch/setuptools-75.6.0-pyhff2d567_1.conda#fc80f7995e396cbaeabd23cf46c413dc +https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 -https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 -https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 -https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda#ebe6952715e1d5eb567eeebf25250fa7 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda#d44e3b085abcaef02983c6305b84b584 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a -https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.2-pyhd8ed1ab_0.conda#4daaed111c05672ae669f7036ee5bba3 -https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb +https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 +https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 +https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_1.conda#40d0ed782a8aaa16ef248e68c06c168d +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda#d17f13df8b65464ca316cbc000a3cb64 +https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py311h9ecbd09_1.conda#00895577e2b4c24dca76675ab1862551 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa +https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3cc595284c5e8f0f9900a9b228a332 +https://conda.anaconda.org/conda-forge/noarch/babel-2.16.0-pyhd8ed1ab_1.conda#3e23f7db93ec14c80525257d8affac28 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311hf29c0ef_0.conda#55553ecd5328336368db611f350b7039 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.1-py311h9ecbd09_1.conda#a36ccf0f3d2eb95a0ecc293f5f56e080 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.1-py311h9ecbd09_1.conda#89ed1820af1523df84171049199ed915 -https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda#54198435fce4d64d8a89af22573012a8 -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-24_linux64_openblas.conda#f5b8822297c9c790cec0795ca1fc9be6 -https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-ha6d2627_1004.conda#df069bea331c8486ac21814969301c1f -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-24_linux64_openblas.conda#fd540578678aefe025705f4b58b36b2e -https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda#dfe0528d0f1c16c1f7c528ea5536ab30 -https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/linux-64/pillow-10.4.0-py311h4aec55e_1.conda#4484d021b3bf4938b8c75fe418bfd27b -https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda#6c78fbb8ddfd64bcb55b5cbafd2d2c43 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.5.0-h12925eb_0.conda#8c29983ebe50cc7e0998c34bc7614222 -https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.8.0-pyhd8ed1ab_0.conda#43bc5b655d19dd7e9bd5951b11cfa0a0 -https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda#c03d61f31f38fdb9facf70c29958bf7a -https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.5-pyhd8ed1ab_0.conda#949a6778521278cb96d7491bd99a5418 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h4bc722e_1.conda#749baebe7e2ff3360630e069175e528b +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.10-py311h2dc5d0c_0.conda#2a772b30e69ba8319651e9f3ab01608f +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.55.3-py311h2dc5d0c_1.conda#04c0b385767445be8aefe0d4915cb747 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.5.0-hd8ed1ab_0.conda#2a92e152208121afadf85a5e1f3a5f4d -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h135f659_114.conda#a908e463c710bd6b10a9eaa89fdf003c -https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.conda#a502d7aad449a1206efb366d6a12c52d -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311h0f98d5a_10.conda#37f7e40c0afe09d0f15f0da92bbde054 -https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 -https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e -https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda#ba9f7f0ec4f2a18de3e7bce67c4a431e -https://conda.anaconda.org/conda-forge/noarch/tox-4.20.0-pyhd8ed1ab_0.conda#d6681d3720a2cb12f2d6184d9a75ad81 -https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hd18a35c_5.conda#4e8447ca8558a203ec0577b4730073f3 -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311hbc35293_1.conda#aec590674ba365e50ae83aa2d6e1efae +https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_1.conda#825927dc7b0f287ef8d4d0011bb113b1 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.4-nompi_h2d575fe_105.conda#d76fff0092b6389a12134ddebc0929bd +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_1.conda#315607a3030ad5d5227e76e0733798ff +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda#2752a6ed44105bfb18c9bef1177d9dcd +https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h03adeef_0.conda#b1df5affe904efe82ef890826b68881d +https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.1-py311hf916aec_0.conda#54a2d01ec2cfc01644f17d25978b0ecf +https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 +https://conda.anaconda.org/conda-forge/linux-64/pillow-11.0.0-py311h49e9ac3_0.conda#2bd3d0f839ec0d1eaca817c9d1feb7c2 +https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_2.conda#04e691b9fadd93a8a9fad87a81d4fd8f +https://conda.anaconda.org/conda-forge/linux-64/proj-9.5.1-h0054346_0.conda#398cabfd9bd75e90d0901db95224f25f +https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.8.0-pyhd8ed1ab_1.conda#f23e24f1f1b8bdc8f644ffaf195c6684 +https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda#799ed216dc6af62520f32aa39bc1c2bb +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda#b6a408c64b78ec7b779a3e5c7a902433 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.28.0-pyhd8ed1ab_0.conda#1d601bc1d28b5ce6d112b90f4b9b8ede https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h9f3472d_1.conda#2c3c4f115d28ed9e001a271d5d8585aa -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.0-py311hd18a35c_1.conda#f709f23e2b1b93b3b6a20e9e7217a258 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.9.0-pyhd8ed1ab_0.conda#8e6585b996dfa6fff92d7ccd0f18bb99 -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.1-pyhd8ed1ab_0.conda#43f629202f9eec21be5f71171fb5daf8 +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.1-py311hd18a35c_0.conda#351cb68d2081e249069748b6e60b3cd2 +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.5.0-hd8ed1ab_1.conda#c70dd0718dbccdcc6d5828de3e71399d https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 -https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py311h459d7ec_1.conda#45b8d355bbcdd27588c2d266bcfdff84 -https://conda.anaconda.org/conda-forge/noarch/nox-2024.4.15-pyhff2d567_0.conda#600c0de12125f473d8099c0b3e6f88d4 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.1-py311he1f765f_0.conda#eb7e2a849cd47483d7e9eeb728c7a8c5 -https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.1.0-hd8ed1ab_0.conda#7ed7b077f6c6ebcb5fc66f23985df487 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.6-py311h9036bbf_1.conda#03346d2520dd112d92380c08ee3f66fe -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.3-pyhd8ed1ab_0.conda#6b55867f385dd762ed99ea687af32a69 -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h9f3472d_6.conda#ac7dc7f70f8d2c1d96ecb7e4cb196498 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.37.0-h8bb6dbc_0.conda#977e230843c4747236c5972a69b1121d -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.2-py311h2b939e6_1.conda#db431da3476c884ef08d9f42a32913b6 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.1-nompi_py311hae66bec_102.conda#87b59caea7db5b79766e0776953d8c66 -https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.8.0-pyha770c72_1.conda#004cff3a7f6fafb0a041fb575de85185 -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py311h7db5c69_2.conda#abbee22293e6c094fbe139615cba1572 -https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_0.conda#2cc61ba1dd53f0806247333f1294e058 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h5ddbaa4_116.conda#f51573abc223afed7e5374f34135ce05 +https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py311h9ecbd09_1.conda#28d6b63784b350a2906dc264ad8c7f2a +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.0-py311h0f98d5a_0.conda#22531205a97c116251713008d65dfefd +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda#79963c319d1be62c8fd3e34555816e01 +https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.1-py311he9a78e4_2.conda#c4aee8cadc4c9fc9a91aca0803473690 +https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_1.conda#ac738a7f524d1b157e53fb9734f85e0e +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.6-py311h2fdb869_2.conda#4c78235905053663d1c9e23df3f11b65 +https://conda.anaconda.org/conda-forge/noarch/tox-4.23.2-pyhd8ed1ab_1.conda#18cdd1546804d0ec2f81fb6b5f2c1bb7 +https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hd18a35c_5.conda#4e8447ca8558a203ec0577b4730073f3 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311hbc35293_1.conda#aec590674ba365e50ae83aa2d6e1efae +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py311h9f3472d_0.conda#555b148cafbd96b658499060d5e11a65 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.39.0-hf413ef6_1.conda#63ea3e2f32daf4670182a3e6aad0b47b +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.4-pyhd8ed1ab_0.conda#5ec16e7ad9bab911ff0696940953f505 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.0-py311h2b939e6_0.conda#79239585ea50c427415ef629534bb3aa +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py311h7c29e4f_101.conda#d966f11d28c699da7e9de2aa2f323a4f +https://conda.anaconda.org/conda-forge/noarch/nox-2024.10.9-pyhd8ed1ab_1.conda#74adbad34c17927dad683cfc2f57cce5 +https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.1.0-hd8ed1ab_1.conda#4b2757cbafd866a23faba9dd2b6fd43e +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py311h7db5c69_0.conda#20ba399d57a2b5de789a5b24341481a1 +https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.0.1-pyha770c72_1.conda#d0ea6ed474bf7f6db88fc85e6dc809b1 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py311h9f3472d_0.conda#648bccc358ec5b19dec01a5685f3aeb9 -https://conda.anaconda.org/conda-forge/noarch/iris-3.10.0-pyha770c72_1.conda#b7212cd8247ce909631fdcb77015914a -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_0.conda#9075bd8c033f0257122300db914e49c9 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_0.conda#b3bcc38c471ebb738854f52a36059b48 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_0.conda#e25640d692c02e8acfff0372f547e940 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jquery-4.1-pyhd8ed1ab_0.conda#914897066d5873acfb13e75705276ad1 -https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-2.0.0-pyha770c72_0.conda#baf6d9a33df1a789ca55e3b404c7ea28 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_0.conda#d6e5ea5fe00164ac6c2dcc5d76a42192 -https://conda.anaconda.org/conda-forge/noarch/sphinx-7.4.7-pyhd8ed1ab_0.conda#c568e260463da2528ecfd7c5a0b41bbd -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda#e507335cb4ca9cff4c3d0fa9cdab255e +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 +https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 +https://conda.anaconda.org/conda-forge/noarch/iris-3.11.1-pyha770c72_0.conda#ee54ee24030934558ddfc033f178ecbe +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda#e9fb3fe8a5b758b4aff187d434f94f03 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jquery-4.1-pyhd8ed1ab_1.conda#403185829255321ea427333f7773dd1f +https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-3.0.1-pyha770c72_0.conda#740536f8a54250b1964e494c0bf5c9c3 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda#00534ebcc0375929b45c3039b5ba7636 +https://conda.anaconda.org/conda-forge/noarch/sphinx-8.1.3-pyhd8ed1ab_1.conda#1a3281a0dc355c02b5506d87db2d78ac +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda#3bc61f7161d28137797e038263c04c54 diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index d94ed97a..d05a3892 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -3,199 +3,200 @@ # input_hash: e86d945e803f06926278032cd38065b8f5ad074d360d325088b9a2f395cf50c0 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.8.30-hbcca054_0.conda#c27d1c142233b5bc9ca570c6e2e0c244 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda#b80f2f396ca2c28b8c14c437a4ed1e74 +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.12.14-hbcca054_0.conda#720523eb0d6a9b0f6120c16b2aa4e7de https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda#0424ae29b104430108f5218a66db7260 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda#8bfdead4e0fff0383ae4c9c50d0531bd -https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_1.conda#23c255b008c4f2ae008f81edcabaca89 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda#8ac3367aafb1cc0a068483c580af8015 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda#048b02e3962f066da18efe3a21b77672 +https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda#cc3573974587f12dda90d96e3e55a702 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.1.0-h77fa898_1.conda#002ef4463dd1e2b44a94a4ace468f5d2 +https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda#c151d5eb730e9b7480e6d48c0fc44048 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda#3cb76c3f10d3bc7f1105b2fc9db984df +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda#e2775acf57efd5af15b8e3d1d74d72d3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.3-h5888daf_0.conda#59f4c43bb1b5ef1c71946ff2cbf59524 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h69a702a_1.conda#1efc0ad219877a73ef977af7dbb51f17 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.1.0-hc5f4f2c_1.conda#10a0cef64b784d6ab6da50ebca4e984d -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.1.0-hc0a3c3a_1.conda#9dbb9699ea467983ba8a4ba89b08b066 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.2-hb9d3cd8_0.conda#4d638782050ab6faa27275bed57e9b4e +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda#8dfae1d2e74767e9ce36d5fa0d8605db +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda#db833e03127376d461e1e13e76f09b6c +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda#e39480b9ca41323497b05492a63bc35b +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hd5240d6_1.conda#9822b874ea29af082e5d36098d25427d +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.3-hb9d3cd8_1.conda#2ecf2f1c7e4e21fcfe6423a51a992d84 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda#234a5554c53625688d51062645337328 +https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-hb9d3cd8_0.conda#23cc74f77eb99315c0360ec3533147a9 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e -https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-hb9d3cd8_1003.conda#32623b33f2047dbc9ae2f2e8fd3880e9 -https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-hb9d3cd8_1003.conda#e87bfacb110d85e1eb6099c9ed8e7236 -https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-hb9d3cd8_1004.conda#bc4cd53a083b6720d61a1519a1900878 -https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-hb9d3cd8_1008.conda#a63f5b66876bb1ec734ab4bdc4d11e86 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.33.1-heb4867d_0.conda#0d3c60291342c0c025db231353376dfb +https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.0-h5888daf_0.conda#40b4ab956c90390e407bb177f8a58bab https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.21-h4bc722e_0.conda#36ce76665bf67f5aac36be7a0d21b7f3 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.1.0-h69a702a_1.conda#591e631bc1ae62c64f2ab4f66178c097 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_1.conda#f1fd30127802683586f768875127a987 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.1.0-h4852527_1.conda#bd2598399a70bb86d8218e95548d735e +https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda#f4cc49d7aa68316213e4b12be35308d1 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.2-hee588c1_0.conda#b58da17db24b6e08bcbf8fed2fb8c915 +https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda#be2de152d8073ef1c01b7728475f2fe7 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda#8371ac6457591af2cf6159439c1fd051 https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b -https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 +https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc -https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 +https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda#70caf8bb6cf39a0b6b7efc885f51c0fe -https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda#2c80dc38fface310c9bd81b17037fee5 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2#be93aabceefa2fac576e971aef407908 +https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda#3b3e64af585eadfb52bb90b553db5edf +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 -https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 -https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.2-he02047a_1.conda#aab9195bc018b82dc77a84584b36cce9 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 -https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa +https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.124-hb9d3cd8_0.conda#8bc89311041d7fcb510238cf0848ccae https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.1.0-h69a702a_1.conda#16cec94c5992d7f42ae3f9fa8b25df8d https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d -https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda#f4cc49d7aa68316213e4b12be35308d1 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.1-hadc24fc_0.conda#36f79405ab16bf271edb55b213836dac -https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe -https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.16-hb9d3cd8_1.conda#3601598f0db0470af28985e3e7ad0158 -https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.1-hf83b1b0_0.conda#e8536ec89df2aec5f65fefcf4ccd58ba -https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 +https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_1.conda#62857b389e42b36b686331bec0922050 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.5-h0d44e9d_1.conda#f5b05674697ae7d2c5932766695945e1 +https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 -https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-ha2e4443_0.conda#6b7dcc7349efd123d493d2dbe85a045f -https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 -https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-h4ab18f5_1.conda#9653f1bf3766164d0e65fa723cabbc54 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.10-h4f16b4b_1.conda#125f34a17d7b4bea418a83904ea82ea6 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 -https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-hef167b5_0.conda#54fe76ab3d0189acaef95156874db7f9 +https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_hac2b453_1.conda#ae05ece66d3924ac3d48b4aa3fa96cec -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-h6565414_0.conda#80eaf80d84668fa5620ac9ec1b4bf56f -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-he7c6b58_4.conda#08a9265c637230c37cb1be4a6cad4536 -https://conda.anaconda.org/conda-forge/linux-64/python-3.12.5-h2ad013b_0_cpython.conda#9c56c4df45f6571b13111d8df2448692 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.46.1-h9eae976_0.conda#b2b3e737da0ae347e16ef1970a5d3f14 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-hb711507_1.conda#4a6d410296d7e39f00bacdee7df046e9 -https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb -https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 -https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.5.0-pyhd8ed1ab_0.conda#58d664381a6dd4238cf40b7e2ba3309d -https://conda.anaconda.org/conda-forge/noarch/attrs-24.2.0-pyh71513ae_0.conda#6732fa52eb8e66e5afeb32db8701a791 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-26_linux64_openblas.conda#ac52800af2e0c0e7dac770b435ce768a +https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda#0ea6510969e1296cc19966fad481f6de +https://conda.anaconda.org/conda-forge/linux-64/python-3.12.8-h9e4cc4f_1_cpython.conda#7fd2fd79436d9b473812f14e86746844 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.47.2-h9eae976_0.conda#64a954de15d114281535a26fd4d1f294 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 +https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a +https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.5.2-pyhd8ed1ab_0.conda#4229aeacda5e2878871ce03b39d3e11f +https://conda.anaconda.org/conda-forge/noarch/attrs-24.3.0-pyh71513ae_0.conda#356927ace43302bf6f5926e2a58dae6a https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda#b0b867af6fc74b2a0aa206da29c0f3cf -https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.0-pyhd8ed1ab_0.conda#5bad039db72bd8f134a5cff3ebaa190d -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda#12f7d00853807b0531775e9be891cb11 -https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2#ebb5f5f7dc4f1a3780ef7ea7738db08c +https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.0-pyhd8ed1ab_1.conda#0a99af03ccbd19113c1de1c7f16a53d2 +https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda#6feb87357ecd66733be3279f16a8c400 +https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/linux-64/chardet-5.2.0-py312h7900ff3_2.conda#01b1679726675bf49851cdb507de4a24 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a -https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca -https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.conda#753d29fe41bb881e4b9c004f0abf973f -https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 -https://conda.anaconda.org/conda-forge/linux-64/colorlog-6.8.2-py312h7900ff3_1.conda#0ff09e95b90aafc66fefd6a34e7d923b -https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 -https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 -https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py312h7900ff3_3.conda#1b90835ae26b9b8250b302649359a989 -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 -https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_0.conda#916f8ec5dd4128cd5f207a3c4c07b2c6 +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.0-pyhd8ed1ab_1.conda#6581a17bba6b948bb60130026404a9d6 +https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda#f22f4d4970e09d68a10b922cbb0408d3 +https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.0-pyhd8ed1ab_2.conda#1f76b7e2b3ab88def5aa2f158322c7e6 +https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 +https://conda.anaconda.org/conda-forge/noarch/colorlog-6.9.0-pyh707e725_1.conda#f00fc375bd02bdbbf791f9fe26ae96ec +https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 +https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_1.conda#8d88f4a2242e6b96f9ecff9a6a05b2f1 +https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e +https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_1.conda#d692e9ba6f92dc51484bf3477e36ce7c https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.9.0-pyhff2d567_0.conda#ace4329fbff4c69ab0309db6da182987 -https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 -https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2#9f765cbfab6870c8435b9eefecd7a1f4 -https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_0.conda#7ba2ede0e7c795ff95088daf0dc59753 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.12.0-pyhd8ed1ab_0.conda#e041ad4c43ab5e10c74587f95378ebc7 +https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyhd8ed1ab_1.conda#2aa5ff7fa34a81b9196532c84c10d865 +https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_1.conda#566e75c90c1d0c8c459eb0ad9833dc7a +https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 -https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 -https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.4.0-pyhd8ed1ab_0.tar.bz2#18ee9c07cf945a33f92caf1ee3d23ad9 +https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 +https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.1-pyhd8ed1ab_1.conda#ae376af0a29183e98a95508ed6944664 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py312h68727a3_0.conda#444266743652a4f1538145e9362f6d3b https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-24_linux64_openblas.conda#80aea6603a6813b16ec119d00382b772 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.10.1-hbbe4b11_0.conda#6e801c50a40301f6978c53976917b277 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-26_linux64_openblas.conda#ebcc5f37a435aa3c19640533c82f8d76 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.11.1-h332b0f4_0.conda#2b3e0081006dc21e8bf53a91c83a055c +https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-26_linux64_openblas.conda#3792604c43695d6a273bc5faaac47d48 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py312h66e93f0_1.conda#80b79ce0d3dc127e96002dfdcec0a2a5 +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda#eb227c3e0bf58f5bd69c0532b157975b https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 -https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_0.conda#fd8f2b18b65bbf62e8f653100690c8d2 -https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf -https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 -https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda#b7f5c092b8f9800150d998a71b76d5a1 -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.4-pyhd8ed1ab_0.conda#4d91352a50949d049cf9714c8563d433 -https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 -https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 +https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda#577852c7e53901ddccc7e6a9959ddebe +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef +https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_1.conda#b38dc0206e2a530e5c2cf11dc086b31a +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.1-pyhd8ed1ab_0.conda#285e237b8f351e85e7574a2c7bfa6d46 +https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_1.conda#856b387c270e9eaf6e41e978057a2b62 +https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f0_1.conda#39aed2afe4d0cf76ab3d6b09eecdbea7 -https://conda.anaconda.org/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_0.conda#260009d03c9d5c0f111904d851f053dc +https://conda.anaconda.org/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_1.conda#f26ec986456c30f6dff154b670ae140f https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h66e93f0_1.conda#549e5930e768548a89c23f595dac5a95 -https://conda.anaconda.org/conda-forge/noarch/setuptools-74.1.2-pyhd8ed1ab_0.conda#56c9c11d004428e81d02eeb730fc6336 -https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 +https://conda.anaconda.org/conda-forge/noarch/setuptools-75.6.0-pyhff2d567_1.conda#fc80f7995e396cbaeabd23cf46c413dc +https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 -https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 -https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 -https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda#ebe6952715e1d5eb567eeebf25250fa7 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda#d44e3b085abcaef02983c6305b84b584 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a -https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.2-pyhd8ed1ab_0.conda#4daaed111c05672ae669f7036ee5bba3 -https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb +https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 +https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 +https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_1.conda#40d0ed782a8aaa16ef248e68c06c168d +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda#d17f13df8b65464ca316cbc000a3cb64 +https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py312h66e93f0_1.conda#588486a61153f94c7c13816f7069e440 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa +https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3cc595284c5e8f0f9900a9b228a332 +https://conda.anaconda.org/conda-forge/noarch/babel-2.16.0-pyhd8ed1ab_1.conda#3e23f7db93ec14c80525257d8affac28 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda#a861504bbea4161a9170b85d4d2be840 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.1-py312h66e93f0_1.conda#5dc6e358ee0af388564bd0eba635cf9e -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.1-py312h66e93f0_1.conda#7abb7d39d482ac3b8e27e6c0fff3b168 -https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda#54198435fce4d64d8a89af22573012a8 -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-24_linux64_openblas.conda#f5b8822297c9c790cec0795ca1fc9be6 -https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-ha6d2627_1004.conda#df069bea331c8486ac21814969301c1f -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-24_linux64_openblas.conda#fd540578678aefe025705f4b58b36b2e -https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda#dfe0528d0f1c16c1f7c528ea5536ab30 -https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/linux-64/pillow-10.4.0-py312h56024de_1.conda#4bd6077376c7f9c1ce33fd8319069e5b -https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda#6c78fbb8ddfd64bcb55b5cbafd2d2c43 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.5.0-h12925eb_0.conda#8c29983ebe50cc7e0998c34bc7614222 -https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.8.0-pyhd8ed1ab_0.conda#43bc5b655d19dd7e9bd5951b11cfa0a0 -https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda#c03d61f31f38fdb9facf70c29958bf7a -https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.5-pyhd8ed1ab_0.conda#949a6778521278cb96d7491bd99a5418 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h4bc722e_1.conda#749baebe7e2ff3360630e069175e528b +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.10-py312h178313f_0.conda#df113f58bdfc79c98f5e07b6bd3eb4c2 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.55.3-py312h178313f_1.conda#bc18c46eda4c2b29431981998507e723 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.5.0-hd8ed1ab_0.conda#2a92e152208121afadf85a5e1f3a5f4d -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h135f659_114.conda#a908e463c710bd6b10a9eaa89fdf003c -https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda#d8285bea2a350f63fab23bf460221f3f -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py312he630544_10.conda#16371eff7aed913326c41984c8287e8e -https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 -https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.conda#4b9b5e086812283c052a9105ab1e254e -https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda#ba9f7f0ec4f2a18de3e7bce67c4a431e -https://conda.anaconda.org/conda-forge/noarch/tox-4.20.0-pyhd8ed1ab_0.conda#d6681d3720a2cb12f2d6184d9a75ad81 -https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h68727a3_5.conda#f9664ee31aed96c85b7319ab0a693341 -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda#8b7069e9792ee4e5b4919a7a306d2e67 +https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_1.conda#825927dc7b0f287ef8d4d0011bb113b1 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.4-nompi_h2d575fe_105.conda#d76fff0092b6389a12134ddebc0929bd +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_1.conda#315607a3030ad5d5227e76e0733798ff +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda#2752a6ed44105bfb18c9bef1177d9dcd +https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h03adeef_0.conda#b1df5affe904efe82ef890826b68881d +https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.1-py312h7e784f5_0.conda#6159cab400b61f38579a7692be5e630a +https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 +https://conda.anaconda.org/conda-forge/linux-64/pillow-11.0.0-py312h7b63e92_0.conda#385f46a4df6f97892503a841121a9acf +https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_2.conda#04e691b9fadd93a8a9fad87a81d4fd8f +https://conda.anaconda.org/conda-forge/linux-64/proj-9.5.1-h0054346_0.conda#398cabfd9bd75e90d0901db95224f25f +https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.8.0-pyhd8ed1ab_1.conda#f23e24f1f1b8bdc8f644ffaf195c6684 +https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda#799ed216dc6af62520f32aa39bc1c2bb +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda#b6a408c64b78ec7b779a3e5c7a902433 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.28.0-pyhd8ed1ab_0.conda#1d601bc1d28b5ce6d112b90f4b9b8ede https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312hc0a28a1_1.conda#990033147b0a998e756eaaed6b28f48d -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.0-py312h68727a3_1.conda#6b9f9141c247bdd61a2d6d37e0a8b530 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.9.0-pyhd8ed1ab_0.conda#8e6585b996dfa6fff92d7ccd0f18bb99 -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.1-pyhd8ed1ab_0.conda#43f629202f9eec21be5f71171fb5daf8 +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.1-py312h68727a3_0.conda#f5fbba0394ee45e9a64a73c2a994126a +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.5.0-hd8ed1ab_1.conda#c70dd0718dbccdcc6d5828de3e71399d https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 -https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py312h98912ed_1.conda#d5273d1e67b7b3a871a0a711c6532a2f -https://conda.anaconda.org/conda-forge/noarch/nox-2024.4.15-pyhff2d567_0.conda#600c0de12125f473d8099c0b3e6f88d4 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.1-py312h7d485d2_0.conda#7418a22e73008356d9aba99d93dfeeee -https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.1.0-hd8ed1ab_0.conda#7ed7b077f6c6ebcb5fc66f23985df487 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.6-py312h6cab151_1.conda#5be02e05e1adaa42826cc6800ce399bc -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.3-pyhd8ed1ab_0.conda#6b55867f385dd762ed99ea687af32a69 -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py312hc0a28a1_6.conda#fa4853d25b6fbfef5eb7b3e1b5616dd5 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.37.0-h8bb6dbc_0.conda#977e230843c4747236c5972a69b1121d -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.2-py312hd3ec401_1.conda#2f4f3854f23be30de29e9e4d39758349 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.1-nompi_py312h21d6d8e_102.conda#9049ba34261ce7106220711d313fcf61 -https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.8.0-pyha770c72_1.conda#004cff3a7f6fafb0a041fb575de85185 -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py312hf9745cd_2.conda#cc3ecff140731b46b970a7c4787b1823 -https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_0.conda#2cc61ba1dd53f0806247333f1294e058 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h5ddbaa4_116.conda#f51573abc223afed7e5374f34135ce05 +https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h66e93f0_1.conda#5fef67f50126f40f5966a9451661280d +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.0-py312he630544_0.conda#427799f15b36751761941f4cbd7d780f +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda#79963c319d1be62c8fd3e34555816e01 +https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.1-py312h62794b6_2.conda#94688dd449f6c092e5f951780235aca1 +https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_1.conda#ac738a7f524d1b157e53fb9734f85e0e +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.6-py312h391bc85_2.conda#eb476b4975ea28ac12ff469063a71f5d +https://conda.anaconda.org/conda-forge/noarch/tox-4.23.2-pyhd8ed1ab_1.conda#18cdd1546804d0ec2f81fb6b5f2c1bb7 +https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h68727a3_5.conda#f9664ee31aed96c85b7319ab0a693341 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda#8b7069e9792ee4e5b4919a7a306d2e67 +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py312hc0a28a1_0.conda#8b5b812d4c18cb37bda7a7c8d3a6acb3 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.39.0-hf413ef6_1.conda#63ea3e2f32daf4670182a3e6aad0b47b +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.4-pyhd8ed1ab_0.conda#5ec16e7ad9bab911ff0696940953f505 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.0-py312hd3ec401_0.conda#c27a17a8c54c0d35cf83bbc0de8f7f77 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py312ha728dd9_101.conda#7e41ca6012a6bf609539aec0dfee93f7 +https://conda.anaconda.org/conda-forge/noarch/nox-2024.10.9-pyhd8ed1ab_1.conda#74adbad34c17927dad683cfc2f57cce5 +https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.1.0-hd8ed1ab_1.conda#4b2757cbafd866a23faba9dd2b6fd43e +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py312hf9745cd_0.conda#ea213e31805199cb7d0da457b879ceed +https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.0.1-pyha770c72_1.conda#d0ea6ed474bf7f6db88fc85e6dc809b1 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py312hc0a28a1_0.conda#476b0357e207e10d2b7b13ed82156e6d -https://conda.anaconda.org/conda-forge/noarch/iris-3.10.0-pyha770c72_1.conda#b7212cd8247ce909631fdcb77015914a -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_0.conda#9075bd8c033f0257122300db914e49c9 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_0.conda#b3bcc38c471ebb738854f52a36059b48 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_0.conda#e25640d692c02e8acfff0372f547e940 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jquery-4.1-pyhd8ed1ab_0.conda#914897066d5873acfb13e75705276ad1 -https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-2.0.0-pyha770c72_0.conda#baf6d9a33df1a789ca55e3b404c7ea28 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_0.conda#d6e5ea5fe00164ac6c2dcc5d76a42192 -https://conda.anaconda.org/conda-forge/noarch/sphinx-7.4.7-pyhd8ed1ab_0.conda#c568e260463da2528ecfd7c5a0b41bbd -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda#e507335cb4ca9cff4c3d0fa9cdab255e +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 +https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 +https://conda.anaconda.org/conda-forge/noarch/iris-3.11.1-pyha770c72_0.conda#ee54ee24030934558ddfc033f178ecbe +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda#e9fb3fe8a5b758b4aff187d434f94f03 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jquery-4.1-pyhd8ed1ab_1.conda#403185829255321ea427333f7773dd1f +https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-3.0.1-pyha770c72_0.conda#740536f8a54250b1964e494c0bf5c9c3 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda#00534ebcc0375929b45c3039b5ba7636 +https://conda.anaconda.org/conda-forge/noarch/sphinx-8.1.3-pyhd8ed1ab_1.conda#1a3281a0dc355c02b5506d87db2d78ac +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda#3bc61f7161d28137797e038263c04c54 From 27f8472f922c9d9be6fd22e78b7f36c4e31b719a Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 3 Jan 2025 14:45:58 +0000 Subject: [PATCH 406/583] chore: update pre-commit hooks (#587) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/pre-commit/mirrors-mypy: v1.13.0 → v1.14.0](https://github.com/pre-commit/mirrors-mypy/compare/v1.13.0...v1.14.0) - [github.com/astral-sh/ruff-pre-commit: v0.8.3 → v0.8.4](https://github.com/astral-sh/ruff-pre-commit/compare/v0.8.3...v0.8.4) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Patrick Peglar --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c38f2a2b..c2770b06 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -65,7 +65,7 @@ repos: additional_dependencies: [tomli] - repo: https://github.com/pre-commit/mirrors-mypy - rev: 'v1.13.0' + rev: 'v1.14.0' hooks: - id: mypy exclude: 'noxfile\.py|docs/conf\.py' @@ -78,7 +78,7 @@ repos: types: [file, python] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.8.3" + rev: "v0.8.4" hooks: - id: ruff types: [file, python] From dfc466fb4b33136197111101f66d7aa16dcc5635 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 7 Jan 2025 11:17:50 +0000 Subject: [PATCH 407/583] chore: update pre-commit hooks (#595) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/pre-commit/mirrors-mypy: v1.14.0 → v1.14.1](https://github.com/pre-commit/mirrors-mypy/compare/v1.14.0...v1.14.1) - [github.com/astral-sh/ruff-pre-commit: v0.8.4 → v0.8.6](https://github.com/astral-sh/ruff-pre-commit/compare/v0.8.4...v0.8.6) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c2770b06..97625b8d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -65,7 +65,7 @@ repos: additional_dependencies: [tomli] - repo: https://github.com/pre-commit/mirrors-mypy - rev: 'v1.14.0' + rev: 'v1.14.1' hooks: - id: mypy exclude: 'noxfile\.py|docs/conf\.py' @@ -78,7 +78,7 @@ repos: types: [file, python] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.8.4" + rev: "v0.8.6" hooks: - id: ruff types: [file, python] From a3144fb2d203a5286403a9d11232c6d8580cae71 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Tue, 7 Jan 2025 16:26:47 +0000 Subject: [PATCH 408/583] Release notes for v0.21, to support latest ecCodes. (#597) * Release notes for v0.21, to support latest ecCodes. * Remove private url. --- docs/index.rst | 2 +- docs/ref/release_notes.rst | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/docs/index.rst b/docs/index.rst index b74521a9..39110e68 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -3,7 +3,7 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -Iris-grib v0.20 +Iris-grib v0.21 =============== The library ``iris-grib`` provides functionality for converting between weather and diff --git a/docs/ref/release_notes.rst b/docs/ref/release_notes.rst index deed099d..b013b0d2 100644 --- a/docs/ref/release_notes.rst +++ b/docs/ref/release_notes.rst @@ -6,6 +6,31 @@ Release Notes ============= +What's new in iris-grib v0.21.0 +------------------------------- + +:Release: 0.21.0 +:Date: 07 January 2025 + +Dependencies +^^^^^^^^^^^^ +* `@pp-mo `_ added a fix to support ecCodes versions >= 2.38 + `(PR#578) `_ +* `@pp-mo `_ fixed tests to work with numpy versions >= 2.0 + `(PR#580) `_ + +Internal +^^^^^^^^ +* `@trexfeathers `_ added integration tests to ensure + code coverage of GRIB1 loading code, to enable future refactoring. + `(ISSUE#488) `_, + `(PR#583) `_ +* `@pp-mo `_ updated repository automation to meet current + SciTools code quality recommendations + `(PR#568) `_, + `(PR#572) `_ + + What's new in iris-grib v0.20.0 ------------------------------- From 0ecb45355976706df041aa30dfb17223c00af61a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 Jan 2025 15:29:50 +0000 Subject: [PATCH 409/583] Bump scitools/workflows in the dependencies group (#598) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2025.01.0 to 2025.01.1 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.01.0...2025.01.1) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 4edbead9..f7f95fd7 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.01.0 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.01.1 diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 9ba9210a..d9efbf82 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.01.0 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.01.1 secrets: inherit From 75cdd4a9dec55007347bc37dde896eb499ff2b47 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 13 Jan 2025 18:44:10 +0000 Subject: [PATCH 410/583] chore: update pre-commit hooks (#599) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: update pre-commit hooks updates: - [github.com/astral-sh/ruff-pre-commit: v0.8.6 → v0.9.1](https://github.com/astral-sh/ruff-pre-commit/compare/v0.8.6...v0.9.1) * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- noxfile.py | 4 +- src/iris_grib/__init__.py | 6 +-- src/iris_grib/_grib1_load_rules.py | 2 +- src/iris_grib/_load_convert.py | 37 +++++++------------ src/iris_grib/_save_rules.py | 22 +++++------ .../grib_phenom_translation/__init__.py | 16 ++++---- .../grib_phenom_translation/_gribcode.py | 6 +-- src/iris_grib/message.py | 10 ++--- .../test_grid_definition_section.py | 2 +- src/iris_grib/tests/test_license_headers.py | 4 +- .../test_grib1_load_translations.py | 2 +- .../test_grib_phenom_translation.py | 4 +- .../test_product_definition_template_0.py | 4 +- ...product_definition_template_8_10_and_11.py | 6 +-- .../unit/save_rules/test_data_section.py | 2 +- .../test_product_definition_template_10.py | 4 +- .../test_product_definition_template_15.py | 12 +++--- .../save_rules/test_set_time_increment.py | 2 +- .../unit/save_rules/test_set_time_range.py | 6 +-- 20 files changed, 66 insertions(+), 87 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 97625b8d..3f039325 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -78,7 +78,7 @@ repos: types: [file, python] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.8.6" + rev: "v0.9.1" hooks: - id: ruff types: [file, python] diff --git a/noxfile.py b/noxfile.py index 1b77a7d5..f04ee7b4 100644 --- a/noxfile.py +++ b/noxfile.py @@ -81,9 +81,7 @@ def _write_iris_config(session: nox.sessions.Session) -> None: [Resources] test_data_dir = {test_data_dir} [System] -udunits2_path = { - os.path.join(session.virtualenv.location,'lib', 'libudunits2.so') -} +udunits2_path = {os.path.join(session.virtualenv.location, "lib", "libudunits2.so")} """ print("Iris config\n-----------") diff --git a/src/iris_grib/__init__.py b/src/iris_grib/__init__.py index 7e50015b..e65f5e14 100644 --- a/src/iris_grib/__init__.py +++ b/src/iris_grib/__init__.py @@ -49,7 +49,7 @@ "rjtd": "Tokyo, Japan Meteorological Agency", "55": "San Francisco", "kwbc": ( - "US National Weather Service, National Centres for " "Environmental Prediction" + "US National Weather Service, National Centres for Environmental Prediction" ), } @@ -612,7 +612,7 @@ def _get_verification_date(self): # for all the days included in the P2 period. The units of P2 # are given by the contents of octet 18 and Table 4. raise TranslationError( - "unhandled grib1 timeRangeIndicator " "= 51 (avg of avgs)" + "unhandled grib1 timeRangeIndicator = 51 (avg of avgs)" ) elif time_range_indicator == 113: # Average of N forecasts (or initialized analyses); each @@ -661,7 +661,7 @@ def _get_verification_date(self): time_diff = P1 else: raise TranslationError( - "unhandled grib1 timeRangeIndicator " "= %i" % time_range_indicator + "unhandled grib1 timeRangeIndicator = %i" % time_range_indicator ) # Get the timeunit interval. diff --git a/src/iris_grib/_grib1_load_rules.py b/src/iris_grib/_grib1_load_rules.py index d5f6bed2..6ef233ee 100644 --- a/src/iris_grib/_grib1_load_rules.py +++ b/src/iris_grib/_grib1_load_rules.py @@ -157,7 +157,7 @@ def grib1_convert(grib): (grib.table2Version == 1) and (grib.indicatorOfParameter >= 128) ): long_name = ( - f"UNKNOWN LOCAL PARAM {grib.indicatorOfParameter}" f".{grib.table2Version}" + f"UNKNOWN LOCAL PARAM {grib.indicatorOfParameter}.{grib.table2Version}" ) units = "???" diff --git a/src/iris_grib/_load_convert.py b/src/iris_grib/_load_convert.py index 8f31650d..3d908a58 100644 --- a/src/iris_grib/_load_convert.py +++ b/src/iris_grib/_load_convert.py @@ -222,7 +222,7 @@ def _hindcast_fix(forecast_time): original_forecast_time = forecast_time forecast_time = -(uft - 2 * HIGHBIT) if options.warn_on_unsupported: - msg = "Re-interpreting large grib forecastTime " "from {} to {}.".format( + msg = "Re-interpreting large grib forecastTime from {} to {}.".format( original_forecast_time, forecast_time ) warnings.warn(msg, HindcastOverflowWarning) @@ -521,7 +521,7 @@ def grid_definition_template_0_and_1(section, metadata, y_name, x_name, cs): section["numberOfOctectsForNumberOfPoints"] != 0 or section["interpretationOfNumberOfPoints"] != 0 ): - msg = "Grid definition section 3 contains unsupported " "quasi-regular grid" + msg = "Grid definition section 3 contains unsupported quasi-regular grid" raise TranslationError(msg) scan = scanning_mode(section["scanningMode"]) @@ -1259,7 +1259,7 @@ def grid_definition_template_90(section, metadata): # diameters rely on the satellite being over the equator. if sub_satellite_lat != 0: raise TranslationError( - "Unsupported non-zero latitude for " "space-view perspective." + "Unsupported non-zero latitude for space-view perspective." ) sub_satellite_lon = ( section["longitudeOfSubSatellitePoint"] * _GRID_ACCURACY_IN_DEGREES @@ -2018,13 +2018,9 @@ def generating_process(section, include_forecast_process=True): if options.warn_on_unsupported: # Reference Code Table 4.3. warnings.warn("Unable to translate type of generating process.") - warnings.warn( - "Unable to translate background generating " "process identifier." - ) + warnings.warn("Unable to translate background generating process identifier.") if include_forecast_process: - warnings.warn( - "Unable to translate forecast generating " "process identifier." - ) + warnings.warn("Unable to translate forecast generating process identifier.") def data_cutoff(hoursAfterDataCutoff, minutesAfterDataCutoff): @@ -2043,7 +2039,7 @@ def data_cutoff(hoursAfterDataCutoff, minutesAfterDataCutoff): if hoursAfterDataCutoff != _MDI or minutesAfterDataCutoff != _MDI: if options.warn_on_unsupported: warnings.warn( - 'Unable to translate "hours and/or minutes ' 'after data cutoff".' + 'Unable to translate "hours and/or minutes after data cutoff".' ) @@ -2060,8 +2056,7 @@ def statistical_method_name(section): else: # This should *never* happen, as only called by pdt 8 and 15. msg = ( - "Internal error: can't get statistical method for unsupported " - "pdt : 4.{:d}." + "Internal error: can't get statistical method for unsupported pdt : 4.{:d}." ) raise ValueError(msg.format(section_number)) statistic_code = section[stat_keyname] @@ -2117,7 +2112,7 @@ def statistical_cell_method(section): # is all we currently support. # The exact interpretation of this is still unclear so we also accept # a missing value. - msg = "grib statistic time-increment type [{}] " "is not supported.".format( + msg = "grib statistic time-increment type [{}] is not supported.".format( increment_typecode ) raise TranslationError(msg) @@ -2337,17 +2332,11 @@ def product_definition_template_9(section, metadata, frt_coord): # Type is "above upper level". threshold_value = section["scaledValueOfUpperLimit"] if threshold_value == _MDI: - msg = ( - "Product definition section 4 has missing " - "scaled value of upper limit" - ) + msg = "Product definition section 4 has missing scaled value of upper limit" raise TranslationError(msg) threshold_scaling = section["scaleFactorOfUpperLimit"] if threshold_scaling == _MDI: - msg = ( - "Product definition section 4 has missing " - "scale factor of upper limit" - ) + msg = "Product definition section 4 has missing scale factor of upper limit" raise TranslationError(msg) # Encode threshold information. threshold = unscale(threshold_value, threshold_scaling) @@ -2668,7 +2657,7 @@ def product_definition_section(section, metadata, discipline, tablesVersion, rt_ elif template == 40: product_definition_template_40(section, metadata, rt_coord) else: - msg = "Product definition template [{}] is not " "supported".format(template) + msg = "Product definition template [{}] is not supported".format(template) raise TranslationError(msg) # Translate GRIB2 phenomenon to CF phenomenon. @@ -2722,7 +2711,7 @@ def data_representation_section(section): supported_templates = grid_point_templates + spectral_templates if template not in supported_templates: - msg = "Data Representation Section Template [{}] is not " "supported".format( + msg = "Data Representation Section Template [{}] is not supported".format( template ) raise TranslationError(msg) @@ -2757,7 +2746,7 @@ def bitmap_section(section): bitMapIndicator = section["bitMapIndicator"] if bitMapIndicator not in [_BITMAP_CODE_NONE, _BITMAP_CODE_PRESENT]: - msg = "Bitmap Section 6 contains unsupported " "bitmap indicator [{}]".format( + msg = "Bitmap Section 6 contains unsupported bitmap indicator [{}]".format( bitMapIndicator ) raise TranslationError(msg) diff --git a/src/iris_grib/_save_rules.py b/src/iris_grib/_save_rules.py index f8b5b067..47af1e28 100644 --- a/src/iris_grib/_save_rules.py +++ b/src/iris_grib/_save_rules.py @@ -219,13 +219,13 @@ def dx_dy(x_coord, y_coord, grib): eccodes.codes_set(grib, "iDirectionIncrement", round(1e6 * float(abs(x_step)))) else: raise ValueError( - "X coordinate must be in degrees, not {}" ".".format(x_coord.units) + "X coordinate must be in degrees, not {}.".format(x_coord.units) ) if y_coord.units == "degrees": eccodes.codes_set(grib, "jDirectionIncrement", round(1e6 * float(abs(y_step)))) else: raise ValueError( - "Y coordinate must be in degrees, not {}" ".".format(y_coord.units) + "Y coordinate must be in degrees, not {}.".format(y_coord.units) ) @@ -525,7 +525,7 @@ def grid_definition_template_12(cube, grib): x_step = step(x_cm, atol=1) y_step = step(y_cm, atol=1) except ValueError: - msg = "Irregular coordinates not supported for Transverse " "Mercator." + msg = "Irregular coordinates not supported for Transverse Mercator." raise TranslationError(msg) eccodes.codes_set(grib, "Di", abs(x_step)) eccodes.codes_set(grib, "Dj", abs(y_step)) @@ -747,7 +747,7 @@ def grid_definition_template_140(cube, grib): x_step = step(x_mm, atol=1) y_step = step(y_mm, atol=1) except ValueError: - msg = "Irregular coordinates not supported for Lambert " "Azimuthal Equal Area." + msg = "Irregular coordinates not supported for Lambert Azimuthal Equal Area." raise TranslationError(msg) eccodes.codes_set(grib, "Dx", abs(x_step)) eccodes.codes_set(grib, "Dy", abs(y_step)) @@ -934,12 +934,12 @@ def _non_missing_forecast_period(cube): else: if not fp_coord.has_bounds(): raise TranslationError( - "bounds on 'time' coordinate requires bounds on" " 'forecast_period'." + "bounds on 'time' coordinate requires bounds on 'forecast_period'." ) fp = fp_coord.bounds[0][0] if fp - int(fp): - warnings.warn("forecast_period encoding problem: " "scaling required.") + warnings.warn("forecast_period encoding problem: scaling required.") fp = int(fp) return rt, rt_meaning, fp, grib_time_code @@ -973,7 +973,7 @@ def _missing_forecast_period(cube): fp = t - frt integer_fp = int(fp) if integer_fp != fp: - msg = "Truncating floating point forecast period {} to " "integer value {}" + msg = "Truncating floating point forecast period {} to integer value {}" warnings.warn(msg.format(fp, integer_fp)) fp = integer_fp fp_meaning = 1 # Hours @@ -1168,7 +1168,7 @@ def set_fixed_surfaces(cube, grib, full3d_cube=None): n_levels = np.max(model_levels) max_valid_nlevels = 9999 if n_levels > max_valid_nlevels: - msg = "model_level_number values are > {} : " "maximum value = {}." + msg = "model_level_number values are > {} : maximum value = {}." raise ValueError(msg.format(max_valid_nlevels, n_levels)) # In sample data we have seen, there seems to be an extra missing data # value *before* each set of n-levels coefficients. @@ -1226,7 +1226,7 @@ def set_time_range(time_coord, grib): time_range_in_hours = end_hours - start_hours integer_hours = int(time_range_in_hours) if integer_hours != time_range_in_hours: - msg = "Truncating floating point lengthOfTimeRange {} to " "integer value {}" + msg = "Truncating floating point lengthOfTimeRange {} to integer value {}" warnings.warn(msg.format(time_range_in_hours, integer_hours)) eccodes.codes_set(grib, "lengthOfTimeRange", integer_hours) @@ -1580,9 +1580,7 @@ def _product_definition_template_8_10_and_11(cube, grib, full3d_cube=None): if "time" in cell_method.coord_names ] if not time_cell_methods: - raise ValueError( - "Expected a cell method with a coordinate name " "of 'time'" - ) + raise ValueError("Expected a cell method with a coordinate name of 'time'") if len(time_cell_methods) > 1: raise ValueError("Cannot handle multiple 'time' cell methods") (cell_method,) = time_cell_methods diff --git a/src/iris_grib/grib_phenom_translation/__init__.py b/src/iris_grib/grib_phenom_translation/__init__.py index 1fcb5e60..d32bcaca 100644 --- a/src/iris_grib/grib_phenom_translation/__init__.py +++ b/src/iris_grib/grib_phenom_translation/__init__.py @@ -56,8 +56,9 @@ def __getitem__(self, key): def __setitem__(self, key, value): if key in self and self[key] is not value: raise KeyError( - "Attempted to set dict[{}] = {}, " - "but this is already set to {}.".format(key, value, self[key]) + "Attempted to set dict[{}] = {}, but this is already set to {}.".format( + key, value, self[key] + ) ) self._super.__setitem__(key, value) @@ -106,7 +107,7 @@ def _make_grib1_cf_entry( if standard_name is not None: if standard_name not in iris.std_names.STD_NAMES: warnings.warn( - "{} is not a recognised CF standard name " "(skipping).".format( + "{} is not a recognised CF standard name (skipping).".format( standard_name ) ) @@ -156,8 +157,9 @@ def _make_grib1_cf_entry( ) if len(extra_dimcoord.points) != 1: raise ValueError( - "Implied dimension has {} points, " - "currently can only handle 1.".format(len(extra_dimcoord.points)) + "Implied dimension has {} points, currently can only handle 1.".format( + len(extra_dimcoord.points) + ) ) association_entry = _make_grib1_cf_entry( table2_version=int(grib1data.t2version), @@ -211,7 +213,7 @@ def _make_grib2_cf_entry( if standard_name is not None: if standard_name not in iris.std_names.STD_NAMES: warnings.warn( - "{} is not a recognised CF standard name " "(skipping).".format( + "{} is not a recognised CF standard name (skipping).".format( standard_name ) ) @@ -273,7 +275,7 @@ def _make_cf_grib2_entry( long_name = None if standard_name not in iris.std_names.STD_NAMES: warnings.warn( - "{} is not a recognised CF standard name " "(skipping).".format( + "{} is not a recognised CF standard name (skipping).".format( standard_name ) ) diff --git a/src/iris_grib/grib_phenom_translation/_gribcode.py b/src/iris_grib/grib_phenom_translation/_gribcode.py index 5cd92676..78d007cd 100644 --- a/src/iris_grib/grib_phenom_translation/_gribcode.py +++ b/src/iris_grib/grib_phenom_translation/_gribcode.py @@ -14,7 +14,7 @@ def _invalid_edition(edition): - msg = f"Invalid grib edition, {edition!r}, for GRIBcode : " "can only be 1 or 2." + msg = f"Invalid grib edition, {edition!r}, for GRIBcode : can only be 1 or 2." raise ValueError(msg) @@ -135,9 +135,7 @@ def __init__(self, **kwargs): setattr(self, key, value) def _broken_repr(self): - result = ( - f"<{self.__class__.__name__} with invalid content: " f"{self.__dict__}>" - ) + result = f"<{self.__class__.__name__} with invalid content: {self.__dict__}>" return result def __str__(self): diff --git a/src/iris_grib/message.py b/src/iris_grib/message.py index 9adcc3db..1c03add1 100644 --- a/src/iris_grib/message.py +++ b/src/iris_grib/message.py @@ -157,7 +157,7 @@ def data(self): template = grid_section["gridDefinitionTemplateNumber"] if reduced and template not in (40,): raise TranslationError( - "Grid definition Section 3 contains " "unsupported quasi-regular grid." + "Grid definition Section 3 contains unsupported quasi-regular grid." ) if template in _SUPPORTED_GRID_DEFINITIONS: @@ -265,10 +265,8 @@ def _bitmap(self, bitmap_section): elif bitMapIndicator == 255: bitmap = None else: - msg = ( - "Bitmap Section 6 contains unsupported " "bitmap indicator [{}]".format( - bitMapIndicator - ) + msg = "Bitmap Section 6 contains unsupported bitmap indicator [{}]".format( + bitMapIndicator ) raise TranslationError(msg) return bitmap @@ -490,7 +488,7 @@ def __setitem__(self, key, value): self._cache[key] = value else: raise KeyError( - "{!r} cannot be redefined in " "section {}".format(key, self._number) + "{!r} cannot be redefined in section {}".format(key, self._number) ) def _get_key_value(self, key): diff --git a/src/iris_grib/tests/integration/round_trip/test_grid_definition_section.py b/src/iris_grib/tests/integration/round_trip/test_grid_definition_section.py index 77e5668e..0b885bff 100644 --- a/src/iris_grib/tests/integration/round_trip/test_grid_definition_section.py +++ b/src/iris_grib/tests/integration/round_trip/test_grid_definition_section.py @@ -107,7 +107,7 @@ def test_save_load(self): self.assertEqual( co_load.shape, co_orig.shape, - 'Shape of re-loaded "{}" coord is {} ' "instead of {}".format( + 'Shape of re-loaded "{}" coord is {} instead of {}'.format( coord_name, co_load.shape, co_orig.shape ), ) diff --git a/src/iris_grib/tests/test_license_headers.py b/src/iris_grib/tests/test_license_headers.py index 7779bc2b..61c086c1 100644 --- a/src/iris_grib/tests/test_license_headers.py +++ b/src/iris_grib/tests/test_license_headers.py @@ -100,9 +100,7 @@ def test_license_headers(self): last_change_by_fname = self.last_change_by_fname() except ValueError: # Caught the case where this is not a git repo. - return self.skipTest( - "Iris-grib installation did not look like a " "git repo." - ) + return self.skipTest("Iris-grib installation did not look like a git repo.") failed = False for fname, last_change in sorted(last_change_by_fname.items()): diff --git a/src/iris_grib/tests/unit/grib1_load_rules/test_grib1_load_translations.py b/src/iris_grib/tests/unit/grib1_load_rules/test_grib1_load_translations.py index caf876ee..78c1bcff 100644 --- a/src/iris_grib/tests/unit/grib1_load_rules/test_grib1_load_translations.py +++ b/src/iris_grib/tests/unit/grib1_load_rules/test_grib1_load_translations.py @@ -296,7 +296,7 @@ def test_warn_unknown_pdts(self): with self.assertRaises(iris.exceptions.TranslationError) as t_err: _ = next(cube_generator) self.assertEqual( - "Product definition template [5]" " is not supported", + "Product definition template [5] is not supported", str(t_err.exception), ) diff --git a/src/iris_grib/tests/unit/grib_phenom_translation/test_grib_phenom_translation.py b/src/iris_grib/tests/unit/grib_phenom_translation/test_grib_phenom_translation.py index d16c7f7a..a8fafb8b 100644 --- a/src/iris_grib/tests/unit/grib_phenom_translation/test_grib_phenom_translation.py +++ b/src/iris_grib/tests/unit/grib_phenom_translation/test_grib_phenom_translation.py @@ -345,10 +345,10 @@ def check__repr__(self, edition): result = repr(GRIBCode(edition, 17, 3, 123)) if edition == 1: expected = ( - "GRIBCode(edition=1, table_version=17, " "centre_number=3, number=123)" + "GRIBCode(edition=1, table_version=17, centre_number=3, number=123)" ) elif edition == 2: - expected = "GRIBCode(edition=2, discipline=17, " "category=3, number=123)" + expected = "GRIBCode(edition=2, discipline=17, category=3, number=123)" self.assertEqual(result, expected) def test__repr__grib1(self): diff --git a/src/iris_grib/tests/unit/load_convert/test_product_definition_template_0.py b/src/iris_grib/tests/unit/load_convert/test_product_definition_template_0.py index 9b317ff8..a53bd015 100644 --- a/src/iris_grib/tests/unit/load_convert/test_product_definition_template_0.py +++ b/src/iris_grib/tests/unit/load_convert/test_product_definition_template_0.py @@ -93,8 +93,8 @@ def test_generating_process_warnings(self): warn_msgs = [call[1][0] for call in warn.mock_calls] expected = [ "Unable to translate type of generating process.", - "Unable to translate background generating process " "identifier.", - "Unable to translate forecast generating process " "identifier.", + "Unable to translate background generating process identifier.", + "Unable to translate forecast generating process identifier.", ] self.assertEqual(warn_msgs, expected) finally: diff --git a/src/iris_grib/tests/unit/save_rules/test__product_definition_template_8_10_and_11.py b/src/iris_grib/tests/unit/save_rules/test__product_definition_template_8_10_and_11.py index fd6b0ba4..2d903226 100644 --- a/src/iris_grib/tests/unit/save_rules/test__product_definition_template_8_10_and_11.py +++ b/src/iris_grib/tests/unit/save_rules/test__product_definition_template_8_10_and_11.py @@ -70,7 +70,7 @@ def test_cell_method_coord_name_fail(self, mock_set): cell_method = CellMethod(method="mean", coords=["season"]) cube.add_cell_method(cell_method) with self.assertRaisesRegex( - ValueError, "Expected a cell method with a coordinate " "name of 'time'" + ValueError, "Expected a cell method with a coordinate name of 'time'" ): _product_definition_template_8_10_and_11(cube, mock.sentinel.grib) @@ -102,7 +102,7 @@ def test_no_bounds(self, mock_set): ) self.cube.add_aux_coord(coord) with self.assertRaisesRegex( - ValueError, "Expected time coordinate with two bounds, " "got 0 bounds" + ValueError, "Expected time coordinate with two bounds, got 0 bounds" ): _product_definition_template_8_10_and_11(self.cube, mock.sentinel.grib) @@ -117,7 +117,7 @@ def test_more_than_two_bounds(self, mock_set): ) self.cube.add_aux_coord(coord) with self.assertRaisesRegex( - ValueError, "Expected time coordinate with two bounds, " "got 3 bounds" + ValueError, "Expected time coordinate with two bounds, got 3 bounds" ): _product_definition_template_8_10_and_11(self.cube, mock.sentinel.grib) diff --git a/src/iris_grib/tests/unit/save_rules/test_data_section.py b/src/iris_grib/tests/unit/save_rules/test_data_section.py index 81f073e5..5493ca4e 100644 --- a/src/iris_grib/tests/unit/save_rules/test_data_section.py +++ b/src/iris_grib/tests/unit/save_rules/test_data_section.py @@ -51,7 +51,7 @@ def assertBitmapRange(self, grib_api, min_data, max_data): self.assertEqual(key, "missingValue") self.assertTrue( fill_value < min_data or fill_value > max_data, - "Fill value {} is not outside data range " "{} to {}.".format( + "Fill value {} is not outside data range {} to {}.".format( fill_value, min_data, max_data ), ) diff --git a/src/iris_grib/tests/unit/save_rules/test_product_definition_template_10.py b/src/iris_grib/tests/unit/save_rules/test_product_definition_template_10.py index 64cc01a9..230a1d73 100644 --- a/src/iris_grib/tests/unit/save_rules/test_product_definition_template_10.py +++ b/src/iris_grib/tests/unit/save_rules/test_product_definition_template_10.py @@ -52,9 +52,7 @@ def test_multiple_percentile_value(self, mock_set): cube = self.cube percentile_coord = DimCoord([5, 10, 15], long_name="percentile_over_time") cube.add_aux_coord(percentile_coord, 0) - err_msg = ( - "A cube 'percentile_over_time' coordinate with one point " "is required" - ) + err_msg = "A cube 'percentile_over_time' coordinate with one point is required" with self.assertRaisesRegex(ValueError, err_msg): product_definition_template_10(cube, mock.sentinel.grib) diff --git a/src/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py b/src/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py index 458d03bf..814562b8 100644 --- a/src/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py +++ b/src/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py @@ -56,7 +56,7 @@ def test_cell_method(self, mock_set): @mock.patch.object(eccodes, "codes_set") def test_bilinear_interpolation(self, mock_set): cube_1 = self.cube - cube_1.attributes = dict(spatial_processing_type="Bilinear " "interpolation") + cube_1.attributes = dict(spatial_processing_type="Bilinear interpolation") # If the cube has a bilinear interpolation attribute, spatial # processing code should be 1 and number of points used should be 4. @@ -70,7 +70,7 @@ def test_bilinear_interpolation(self, mock_set): @mock.patch.object(eccodes, "codes_set") def test_bicubic_interpolation(self, mock_set): cube_2 = self.cube - cube_2.attributes = dict(spatial_processing_type="Bicubic " "interpolation") + cube_2.attributes = dict(spatial_processing_type="Bicubic interpolation") # If the cube has a bicubic interpolation attribute, spatial # processing code should be 2 and number of points used should be 4. @@ -85,7 +85,7 @@ def test_bicubic_interpolation(self, mock_set): def test_nearest_neighbour_interpolation(self, mock_set): cube_3 = self.cube cube_3.attributes = dict( - spatial_processing_type="Nearest neighbour " "interpolation" + spatial_processing_type="Nearest neighbour interpolation" ) # If the cube has a nearest neighbour interpolation attribute, spatial @@ -100,7 +100,7 @@ def test_nearest_neighbour_interpolation(self, mock_set): @mock.patch.object(eccodes, "codes_set") def test_budget_interpolation(self, mock_set): cube_4 = self.cube - cube_4.attributes = dict(spatial_processing_type="Budget " "interpolation") + cube_4.attributes = dict(spatial_processing_type="Budget interpolation") # If the cube has a budget interpolation attribute, spatial # processing code should be 4 and number of points used should be 4. @@ -114,7 +114,7 @@ def test_budget_interpolation(self, mock_set): @mock.patch.object(eccodes, "codes_set") def test_spectral_interpolation(self, mock_set): cube_5 = self.cube - cube_5.attributes = dict(spatial_processing_type="Spectral " "interpolation") + cube_5.attributes = dict(spatial_processing_type="Spectral interpolation") # If the cube has a spectral interpolation attribute, spatial # processing code should be 5 and number of points used should be 4. @@ -129,7 +129,7 @@ def test_spectral_interpolation(self, mock_set): def test_neighbour_budget_interpolation(self, mock_set): cube_6 = self.cube cube_6.attributes = dict( - spatial_processing_type="Neighbour-budget " "interpolation" + spatial_processing_type="Neighbour-budget interpolation" ) # If the cube has a neighbour-budget interpolation attribute, spatial diff --git a/src/iris_grib/tests/unit/save_rules/test_set_time_increment.py b/src/iris_grib/tests/unit/save_rules/test_set_time_increment.py index 6f44d88d..643855ae 100644 --- a/src/iris_grib/tests/unit/save_rules/test_set_time_increment.py +++ b/src/iris_grib/tests/unit/save_rules/test_set_time_increment.py @@ -81,7 +81,7 @@ def test_fractional_hours(self, mock_set): with mock.patch("warnings.warn") as warn: set_time_increment(cell_method, mock.sentinel.grib) warn.assert_called_once_with( - "Truncating floating point timeIncrement " "25.9 to integer value 25" + "Truncating floating point timeIncrement 25.9 to integer value 25" ) mock_set.assert_any_call( mock.sentinel.grib, "indicatorOfUnitForTimeIncrement", 1 diff --git a/src/iris_grib/tests/unit/save_rules/test_set_time_range.py b/src/iris_grib/tests/unit/save_rules/test_set_time_range.py index d2f1dacb..8ba5bfff 100644 --- a/src/iris_grib/tests/unit/save_rules/test_set_time_range.py +++ b/src/iris_grib/tests/unit/save_rules/test_set_time_range.py @@ -30,14 +30,14 @@ def setUp(self): def test_no_bounds(self): with self.assertRaisesRegex( - ValueError, "Expected time coordinate " "with two bounds, got 0 bounds" + ValueError, "Expected time coordinate with two bounds, got 0 bounds" ): set_time_range(self.coord, mock.sentinel.grib) def test_three_bounds(self): self.coord.bounds = [0, 1, 2] with self.assertRaisesRegex( - ValueError, "Expected time coordinate " "with two bounds, got 3 bounds" + ValueError, "Expected time coordinate with two bounds, got 3 bounds" ): set_time_range(self.coord, mock.sentinel.grib) @@ -49,7 +49,7 @@ def test_non_scalar(self): units=Unit("hours since epoch", calendar="standard"), ) with self.assertRaisesRegex( - ValueError, "Expected length one time " "coordinate, got 2 points" + ValueError, "Expected length one time coordinate, got 2 points" ): set_time_range(coord, mock.sentinel.grib) From 29e4cd96300d40db0c6460647b180747fcbb3cce Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Sat, 18 Jan 2025 06:30:28 +0000 Subject: [PATCH 411/583] Updated environment lockfiles (#594) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 96 ++++++++++++------------- requirements/locks/py311-linux-64.lock | 96 ++++++++++++------------- requirements/locks/py312-linux-64.lock | 98 +++++++++++++------------- 3 files changed, 145 insertions(+), 145 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index f1cb1bf2..dc062009 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -5,7 +5,7 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.12.14-hbcca054_0.conda#720523eb0d6a9b0f6120c16b2aa4e7de https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-5_cp310.conda#2921c34715e74b3587b4cff4d36844f9 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda#8ac3367aafb1cc0a068483c580af8015 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda#dbcace4706afdfb7eb891f7b37d07c04 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda#048b02e3962f066da18efe3a21b77672 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda#cc3573974587f12dda90d96e3e55a702 @@ -22,7 +22,8 @@ https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.3-hb9d3cd8_1.conda#2 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda#234a5554c53625688d51062645337328 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-hb9d3cd8_0.conda#23cc74f77eb99315c0360ec3533147a9 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_2.conda#04b34b9a40cdc48cfdab261ab176ff74 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda#4ce6875f75469b2757a65e10a5d05e31 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 @@ -31,6 +32,7 @@ https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.0-h5888daf_0.conda#40b https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de +https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20240808-pl5321h7949ede_0.conda#8247f80f3dc464d9322e85007e307fe8 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_1.conda#f1fd30127802683586f768875127a987 @@ -38,8 +40,8 @@ https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda#f4cc49d7aa68316213e4b12be35308d1 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.2-hee588c1_0.conda#b58da17db24b6e08bcbf8fed2fb8c915 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.45-h943b412_0.conda#85cbdaacad93808395ac295b5667d25b +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.48.0-hee588c1_0.conda#84bd1c9a82b455e7a2f390375fb38f90 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda#be2de152d8073ef1c01b7728475f2fe7 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda#8371ac6457591af2cf6159439c1fd051 https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 @@ -47,7 +49,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda# https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda#70caf8bb6cf39a0b6b7efc885f51c0fe +https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda#3b3e64af585eadfb52bb90b553db5edf https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 @@ -56,41 +58,34 @@ https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f0 https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.124-hb9d3cd8_0.conda#8bc89311041d7fcb510238cf0848ccae -https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_1.conda#62857b389e42b36b686331bec0922050 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.5-h0d44e9d_1.conda#f5b05674697ae7d2c5932766695945e1 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba +https://conda.anaconda.org/conda-forge/linux-64/python-3.10.16-he725a3c_1_cpython.conda#b887811a901b3aa622a92caf03bc8917 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.48.0-h9eae976_0.conda#2b3a22991c20ed6ea2ed65d3407a91f4 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.10-h4f16b4b_1.conda#125f34a17d7b4bea418a83904ea82ea6 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 -https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d -https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f -https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-26_linux64_openblas.conda#ac52800af2e0c0e7dac770b435ce768a -https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda#0ea6510969e1296cc19966fad481f6de -https://conda.anaconda.org/conda-forge/linux-64/python-3.10.16-he725a3c_1_cpython.conda#b887811a901b3aa622a92caf03bc8917 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.47.2-h9eae976_0.conda#64a954de15d114281535a26fd4d1f294 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.5.2-pyhd8ed1ab_0.conda#4229aeacda5e2878871ce03b39d3e11f https://conda.anaconda.org/conda-forge/noarch/attrs-24.3.0-pyh71513ae_0.conda#356927ace43302bf6f5926e2a58dae6a +https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_2.conda#bf502c169c71e3c6ac0d6175addfacc2 https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.0-pyhd8ed1ab_1.conda#0a99af03ccbd19113c1de1c7f16a53d2 https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda#6feb87357ecd66733be3279f16a8c400 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/linux-64/chardet-5.2.0-py310hff52083_2.conda#e94bf593fe645f6b85a9c8b2d52caae6 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.0-pyhd8ed1ab_1.conda#6581a17bba6b948bb60130026404a9d6 +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda#e83a31202d1c0a000fce3e9cf3825875 https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda#f22f4d4970e09d68a10b922cbb0408d3 -https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.0-pyhd8ed1ab_2.conda#1f76b7e2b3ab88def5aa2f158322c7e6 +https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.1-pyhd8ed1ab_0.conda#364ba6c9fb03886ac979b482f39ebb92 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/colorlog-6.9.0-pyh707e725_1.conda#f00fc375bd02bdbbf791f9fe26ae96ec https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 @@ -107,27 +102,25 @@ https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.b https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.1-pyhd8ed1ab_1.conda#ae376af0a29183e98a95508ed6944664 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py310h3788b33_0.conda#4186d9b4d004b0fe0de6aa62496fb48a -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-26_linux64_openblas.conda#ebcc5f37a435aa3c19640533c82f8d76 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-26_linux64_openblas.conda#ac52800af2e0c0e7dac770b435ce768a https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.11.1-h332b0f4_0.conda#2b3e0081006dc21e8bf53a91c83a055c -https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-26_linux64_openblas.conda#3792604c43695d6a273bc5faaac47d48 +https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda#0ea6510969e1296cc19966fad481f6de https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py310h89163eb_1.conda#8ce3f0332fd6de0d737e2911d329523f https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda#577852c7e53901ddccc7e6a9959ddebe https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef -https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_1.conda#b38dc0206e2a530e5c2cf11dc086b31a +https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda#232fb4577b6687b2d503ef8e254270c9 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.1-pyhd8ed1ab_0.conda#285e237b8f351e85e7574a2c7bfa6d46 https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_1.conda#856b387c270e9eaf6e41e978057a2b62 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py310ha75aee5_1.conda#8b430470d53744289cb5499bc99a6485 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_1.conda#f26ec986456c30f6dff154b670ae140f https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py310ha75aee5_1.conda#0d4c5c76ae5f5aac6f0be419963a19dd -https://conda.anaconda.org/conda-forge/noarch/setuptools-75.6.0-pyhff2d567_1.conda#fc80f7995e396cbaeabd23cf46c413dc +https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda#8f28e299c11afdd79e0ec1e279dcdc52 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb @@ -135,62 +128,69 @@ https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0d https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_1.conda#40d0ed782a8aaa16ef248e68c06c168d https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda#d17f13df8b65464ca316cbc000a3cb64 -https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py310ha75aee5_1.conda#ee18e67b0bd283f6a75369936451d6ac +https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py310ha75aee5_0.conda#1d7a4b9202cdd10d56ecdd7f6c347190 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3cc595284c5e8f0f9900a9b228a332 https://conda.anaconda.org/conda-forge/noarch/babel-2.16.0-pyhd8ed1ab_1.conda#3e23f7db93ec14c80525257d8affac28 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h8deb56e_0.conda#1fc24a3196ad5ede2a68148be61894f4 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.10-py310h89163eb_0.conda#f9bf6ea6ddf8349750f1b455f603b0ae https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.55.3-py310h89163eb_1.conda#c81251a712a36b477ed2330ec0e1a299 -https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_1.conda#825927dc7b0f287ef8d4d0011bb113b1 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.4-nompi_h2d575fe_105.conda#d76fff0092b6389a12134ddebc0929bd https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_1.conda#315607a3030ad5d5227e76e0733798ff https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda#2752a6ed44105bfb18c9bef1177d9dcd -https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h03adeef_0.conda#b1df5affe904efe82ef890826b68881d +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-26_linux64_openblas.conda#ebcc5f37a435aa3c19640533c82f8d76 +https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-26_linux64_openblas.conda#3792604c43695d6a273bc5faaac47d48 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.1-py310h5851e9f_0.conda#d38cb65becc66134ed42a02e6155e8e0 +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/linux-64/pillow-11.0.0-py310hfeaa1f3_0.conda#1947280342c7259b82a707e38ebc212e https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_2.conda#04e691b9fadd93a8a9fad87a81d4fd8f https://conda.anaconda.org/conda-forge/linux-64/proj-9.5.1-h0054346_0.conda#398cabfd9bd75e90d0901db95224f25f https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.8.0-pyhd8ed1ab_1.conda#f23e24f1f1b8bdc8f644ffaf195c6684 https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda#799ed216dc6af62520f32aa39bc1c2bb https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda#b6a408c64b78ec7b779a3e5c7a902433 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.28.0-pyhd8ed1ab_0.conda#1d601bc1d28b5ce6d112b90f4b9b8ede -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310hf462985_1.conda#c2d5289e6cbcecf2c549e01772fe5274 -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.1-py310h3788b33_0.conda#f993b13665fc2bb262b30217c815d137 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.29.1-pyhd8ed1ab_0.conda#de06336c9833cffd2a4bd6f27c4cf8ea +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa +https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.5.0-hd8ed1ab_1.conda#c70dd0718dbccdcc6d5828de3e71399d -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 +https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h03adeef_0.conda#b1df5affe904efe82ef890826b68881d https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h5ddbaa4_116.conda#f51573abc223afed7e5374f34135ce05 -https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py310ha75aee5_1.conda#48781b625a5c7701e04d222752cb2f62 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.1-py310h5851e9f_0.conda#d38cb65becc66134ed42a02e6155e8e0 +https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py310h7e6dc6c_0.conda#14d300b9e1504748e70cc6499a7b4d25 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.0-py310h2e9f774_0.conda#42a3ea3c283d930ae6d156b97ffe4740 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda#79963c319d1be62c8fd3e34555816e01 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.1-py310hfcf56fc_2.conda#b5d548b2a7cf8d0c74fc6c4bf42d1ca5 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_1.conda#ac738a7f524d1b157e53fb9734f85e0e -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.6-py310had3dfd6_2.conda#a4166b41e54d22e794859641b7cae2d0 https://conda.anaconda.org/conda-forge/noarch/tox-4.23.2-pyhd8ed1ab_1.conda#18cdd1546804d0ec2f81fb6b5f2c1bb7 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310h3788b33_5.conda#e05b0475166b68c9dc4d7937e0315654 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha39cb0e_1.conda#f49de34fb99934bf49ab330b5caffd64 -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py310hf462985_0.conda#c31938674e4cda43617a4d70f99ffd0c +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310hf462985_1.conda#c2d5289e6cbcecf2c549e01772fe5274 +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.1-py310h3788b33_0.conda#f993b13665fc2bb262b30217c815d137 https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.39.0-hf413ef6_1.conda#63ea3e2f32daf4670182a3e6aad0b47b -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.4-pyhd8ed1ab_0.conda#5ec16e7ad9bab911ff0696940953f505 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.0-py310h68603db_0.conda#409498230a11a71578ed49d006165249 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py310h5146f0f_101.conda#3e17df8e4192431b85afc89a539f6c28 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.5-pyhd8ed1ab_0.conda#c1b0f663ff141265d1be1242259063f0 +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 +https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py310ha75aee5_1.conda#48781b625a5c7701e04d222752cb2f62 https://conda.anaconda.org/conda-forge/noarch/nox-2024.10.9-pyhd8ed1ab_1.conda#74adbad34c17927dad683cfc2f57cce5 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.1-py310hfa6ec8c_0.conda#a24baa04ee53ee3078ac1856887c3dea https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.1.0-hd8ed1ab_1.conda#4b2757cbafd866a23faba9dd2b6fd43e +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.6-py310had3dfd6_2.conda#a4166b41e54d22e794859641b7cae2d0 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py310h5eaa309_0.conda#ca4d935c1715f95b6e86846ad1675a2b +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py310hf462985_0.conda#c31938674e4cda43617a4d70f99ffd0c +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.39.0-hf413ef6_1.conda#63ea3e2f32daf4670182a3e6aad0b47b +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.0-py310h68603db_0.conda#409498230a11a71578ed49d006165249 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py310h5146f0f_101.conda#3e17df8e4192431b85afc89a539f6c28 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.0.1-pyha770c72_1.conda#d0ea6ed474bf7f6db88fc85e6dc809b1 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py310hf462985_0.conda#93ae40b74b2baea09ddeaa287b09e705 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py310h5eaa309_0.conda#ca4d935c1715f95b6e86846ad1675a2b https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py310hf462985_0.conda#93ae40b74b2baea09ddeaa287b09e705 https://conda.anaconda.org/conda-forge/noarch/iris-3.11.1-pyha770c72_0.conda#ee54ee24030934558ddfc033f178ecbe https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 4aca7b94..fca2d4fa 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -5,7 +5,7 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.12.14-hbcca054_0.conda#720523eb0d6a9b0f6120c16b2aa4e7de https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-5_cp311.conda#139a8d40c8a2f430df31048949e450de -https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda#8ac3367aafb1cc0a068483c580af8015 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda#dbcace4706afdfb7eb891f7b37d07c04 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda#048b02e3962f066da18efe3a21b77672 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda#cc3573974587f12dda90d96e3e55a702 @@ -22,7 +22,8 @@ https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.3-hb9d3cd8_1.conda#2 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda#234a5554c53625688d51062645337328 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-hb9d3cd8_0.conda#23cc74f77eb99315c0360ec3533147a9 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_2.conda#04b34b9a40cdc48cfdab261ab176ff74 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda#4ce6875f75469b2757a65e10a5d05e31 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 @@ -31,6 +32,7 @@ https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.0-h5888daf_0.conda#40b https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de +https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20240808-pl5321h7949ede_0.conda#8247f80f3dc464d9322e85007e307fe8 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_1.conda#f1fd30127802683586f768875127a987 @@ -38,8 +40,8 @@ https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda#f4cc49d7aa68316213e4b12be35308d1 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.2-hee588c1_0.conda#b58da17db24b6e08bcbf8fed2fb8c915 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.45-h943b412_0.conda#85cbdaacad93808395ac295b5667d25b +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.48.0-hee588c1_0.conda#84bd1c9a82b455e7a2f390375fb38f90 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda#be2de152d8073ef1c01b7728475f2fe7 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda#8371ac6457591af2cf6159439c1fd051 https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 @@ -47,7 +49,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda# https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda#70caf8bb6cf39a0b6b7efc885f51c0fe +https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda#3b3e64af585eadfb52bb90b553db5edf https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 @@ -56,41 +58,34 @@ https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f0 https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.124-hb9d3cd8_0.conda#8bc89311041d7fcb510238cf0848ccae -https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_1.conda#62857b389e42b36b686331bec0922050 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.5-h0d44e9d_1.conda#f5b05674697ae7d2c5932766695945e1 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba +https://conda.anaconda.org/conda-forge/linux-64/python-3.11.11-h9e4cc4f_1_cpython.conda#8387070aa413ce9a8cc35a509fae938b https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.48.0-h9eae976_0.conda#2b3a22991c20ed6ea2ed65d3407a91f4 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.10-h4f16b4b_1.conda#125f34a17d7b4bea418a83904ea82ea6 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 -https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d -https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f -https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-26_linux64_openblas.conda#ac52800af2e0c0e7dac770b435ce768a -https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda#0ea6510969e1296cc19966fad481f6de -https://conda.anaconda.org/conda-forge/linux-64/python-3.11.11-h9e4cc4f_1_cpython.conda#8387070aa413ce9a8cc35a509fae938b -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.47.2-h9eae976_0.conda#64a954de15d114281535a26fd4d1f294 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.5.2-pyhd8ed1ab_0.conda#4229aeacda5e2878871ce03b39d3e11f https://conda.anaconda.org/conda-forge/noarch/attrs-24.3.0-pyh71513ae_0.conda#356927ace43302bf6f5926e2a58dae6a +https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hfdbb021_2.conda#d21daab070d76490cb39a8f1d1729d79 https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.0-pyhd8ed1ab_1.conda#0a99af03ccbd19113c1de1c7f16a53d2 https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda#6feb87357ecd66733be3279f16a8c400 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/linux-64/chardet-5.2.0-py311h38be061_2.conda#00f0ad2aed7e65c9392a067ce7882b28 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.0-pyhd8ed1ab_1.conda#6581a17bba6b948bb60130026404a9d6 +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda#e83a31202d1c0a000fce3e9cf3825875 https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda#f22f4d4970e09d68a10b922cbb0408d3 -https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.0-pyhd8ed1ab_2.conda#1f76b7e2b3ab88def5aa2f158322c7e6 +https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.1-pyhd8ed1ab_0.conda#364ba6c9fb03886ac979b482f39ebb92 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/colorlog-6.9.0-pyh707e725_1.conda#f00fc375bd02bdbbf791f9fe26ae96ec https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 @@ -107,27 +102,25 @@ https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.b https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.1-pyhd8ed1ab_1.conda#ae376af0a29183e98a95508ed6944664 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py311hd18a35c_0.conda#be34c90cce87090d24da64a7c239ca96 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-26_linux64_openblas.conda#ebcc5f37a435aa3c19640533c82f8d76 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-26_linux64_openblas.conda#ac52800af2e0c0e7dac770b435ce768a https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.11.1-h332b0f4_0.conda#2b3e0081006dc21e8bf53a91c83a055c -https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-26_linux64_openblas.conda#3792604c43695d6a273bc5faaac47d48 +https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda#0ea6510969e1296cc19966fad481f6de https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py311h2dc5d0c_1.conda#6565a715337ae279e351d0abd8ffe88a https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda#577852c7e53901ddccc7e6a9959ddebe https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef -https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_1.conda#b38dc0206e2a530e5c2cf11dc086b31a +https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda#232fb4577b6687b2d503ef8e254270c9 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.1-pyhd8ed1ab_0.conda#285e237b8f351e85e7574a2c7bfa6d46 https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_1.conda#856b387c270e9eaf6e41e978057a2b62 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py311h9ecbd09_1.conda#b1796d741ca619dbacb79917b20e5a05 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_1.conda#f26ec986456c30f6dff154b670ae140f https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py311h9ecbd09_1.conda#abeb54d40f439b86f75ea57045ab8496 -https://conda.anaconda.org/conda-forge/noarch/setuptools-75.6.0-pyhff2d567_1.conda#fc80f7995e396cbaeabd23cf46c413dc +https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda#8f28e299c11afdd79e0ec1e279dcdc52 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb @@ -135,62 +128,69 @@ https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0d https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_1.conda#40d0ed782a8aaa16ef248e68c06c168d https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda#d17f13df8b65464ca316cbc000a3cb64 -https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py311h9ecbd09_1.conda#00895577e2b4c24dca76675ab1862551 +https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py311h9ecbd09_0.conda#51a12678b609f5794985fda8372b1a49 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3cc595284c5e8f0f9900a9b228a332 https://conda.anaconda.org/conda-forge/noarch/babel-2.16.0-pyhd8ed1ab_1.conda#3e23f7db93ec14c80525257d8affac28 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311hf29c0ef_0.conda#55553ecd5328336368db611f350b7039 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.10-py311h2dc5d0c_0.conda#2a772b30e69ba8319651e9f3ab01608f https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.55.3-py311h2dc5d0c_1.conda#04c0b385767445be8aefe0d4915cb747 -https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_1.conda#825927dc7b0f287ef8d4d0011bb113b1 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.4-nompi_h2d575fe_105.conda#d76fff0092b6389a12134ddebc0929bd https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_1.conda#315607a3030ad5d5227e76e0733798ff https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda#2752a6ed44105bfb18c9bef1177d9dcd -https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h03adeef_0.conda#b1df5affe904efe82ef890826b68881d +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-26_linux64_openblas.conda#ebcc5f37a435aa3c19640533c82f8d76 +https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-26_linux64_openblas.conda#3792604c43695d6a273bc5faaac47d48 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.1-py311hf916aec_0.conda#54a2d01ec2cfc01644f17d25978b0ecf +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/linux-64/pillow-11.0.0-py311h49e9ac3_0.conda#2bd3d0f839ec0d1eaca817c9d1feb7c2 https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_2.conda#04e691b9fadd93a8a9fad87a81d4fd8f https://conda.anaconda.org/conda-forge/linux-64/proj-9.5.1-h0054346_0.conda#398cabfd9bd75e90d0901db95224f25f https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.8.0-pyhd8ed1ab_1.conda#f23e24f1f1b8bdc8f644ffaf195c6684 https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda#799ed216dc6af62520f32aa39bc1c2bb https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda#b6a408c64b78ec7b779a3e5c7a902433 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.28.0-pyhd8ed1ab_0.conda#1d601bc1d28b5ce6d112b90f4b9b8ede -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h9f3472d_1.conda#2c3c4f115d28ed9e001a271d5d8585aa -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.1-py311hd18a35c_0.conda#351cb68d2081e249069748b6e60b3cd2 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.29.1-pyhd8ed1ab_0.conda#de06336c9833cffd2a4bd6f27c4cf8ea +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa +https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.5.0-hd8ed1ab_1.conda#c70dd0718dbccdcc6d5828de3e71399d -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 +https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h03adeef_0.conda#b1df5affe904efe82ef890826b68881d https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h5ddbaa4_116.conda#f51573abc223afed7e5374f34135ce05 -https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py311h9ecbd09_1.conda#28d6b63784b350a2906dc264ad8c7f2a +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.1-py311hf916aec_0.conda#54a2d01ec2cfc01644f17d25978b0ecf +https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py311h1322bbf_0.conda#9f4f5593335f76c1dbf7381c11fe7155 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.0-py311h0f98d5a_0.conda#22531205a97c116251713008d65dfefd https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda#79963c319d1be62c8fd3e34555816e01 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.1-py311he9a78e4_2.conda#c4aee8cadc4c9fc9a91aca0803473690 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_1.conda#ac738a7f524d1b157e53fb9734f85e0e -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.6-py311h2fdb869_2.conda#4c78235905053663d1c9e23df3f11b65 https://conda.anaconda.org/conda-forge/noarch/tox-4.23.2-pyhd8ed1ab_1.conda#18cdd1546804d0ec2f81fb6b5f2c1bb7 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hd18a35c_5.conda#4e8447ca8558a203ec0577b4730073f3 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311hbc35293_1.conda#aec590674ba365e50ae83aa2d6e1efae -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py311h9f3472d_0.conda#555b148cafbd96b658499060d5e11a65 +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h9f3472d_1.conda#2c3c4f115d28ed9e001a271d5d8585aa +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.1-py311hd18a35c_0.conda#351cb68d2081e249069748b6e60b3cd2 https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.39.0-hf413ef6_1.conda#63ea3e2f32daf4670182a3e6aad0b47b -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.4-pyhd8ed1ab_0.conda#5ec16e7ad9bab911ff0696940953f505 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.0-py311h2b939e6_0.conda#79239585ea50c427415ef629534bb3aa -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py311h7c29e4f_101.conda#d966f11d28c699da7e9de2aa2f323a4f +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.5-pyhd8ed1ab_0.conda#c1b0f663ff141265d1be1242259063f0 +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 +https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py311h9ecbd09_1.conda#28d6b63784b350a2906dc264ad8c7f2a https://conda.anaconda.org/conda-forge/noarch/nox-2024.10.9-pyhd8ed1ab_1.conda#74adbad34c17927dad683cfc2f57cce5 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.1-py311hc1ac118_0.conda#d295a28b9b897945739417e8ed818f82 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.1.0-hd8ed1ab_1.conda#4b2757cbafd866a23faba9dd2b6fd43e +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.6-py311h2fdb869_2.conda#4c78235905053663d1c9e23df3f11b65 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py311h7db5c69_0.conda#20ba399d57a2b5de789a5b24341481a1 +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py311h9f3472d_0.conda#555b148cafbd96b658499060d5e11a65 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.39.0-hf413ef6_1.conda#63ea3e2f32daf4670182a3e6aad0b47b +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.0-py311h2b939e6_0.conda#79239585ea50c427415ef629534bb3aa +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py311h7c29e4f_101.conda#d966f11d28c699da7e9de2aa2f323a4f https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.0.1-pyha770c72_1.conda#d0ea6ed474bf7f6db88fc85e6dc809b1 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py311h9f3472d_0.conda#648bccc358ec5b19dec01a5685f3aeb9 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py311h7db5c69_0.conda#20ba399d57a2b5de789a5b24341481a1 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py311h9f3472d_0.conda#648bccc358ec5b19dec01a5685f3aeb9 https://conda.anaconda.org/conda-forge/noarch/iris-3.11.1-pyha770c72_0.conda#ee54ee24030934558ddfc033f178ecbe https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index d05a3892..6670939a 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -5,7 +5,7 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.12.14-hbcca054_0.conda#720523eb0d6a9b0f6120c16b2aa4e7de https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda#0424ae29b104430108f5218a66db7260 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda#8ac3367aafb1cc0a068483c580af8015 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda#dbcace4706afdfb7eb891f7b37d07c04 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda#048b02e3962f066da18efe3a21b77672 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda#cc3573974587f12dda90d96e3e55a702 @@ -22,7 +22,8 @@ https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.3-hb9d3cd8_1.conda#2 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda#234a5554c53625688d51062645337328 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-hb9d3cd8_0.conda#23cc74f77eb99315c0360ec3533147a9 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_2.conda#04b34b9a40cdc48cfdab261ab176ff74 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda#4ce6875f75469b2757a65e10a5d05e31 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 @@ -31,6 +32,7 @@ https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.0-h5888daf_0.conda#40b https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de +https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20240808-pl5321h7949ede_0.conda#8247f80f3dc464d9322e85007e307fe8 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_1.conda#f1fd30127802683586f768875127a987 @@ -38,8 +40,8 @@ https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda#f4cc49d7aa68316213e4b12be35308d1 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.2-hee588c1_0.conda#b58da17db24b6e08bcbf8fed2fb8c915 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.45-h943b412_0.conda#85cbdaacad93808395ac295b5667d25b +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.48.0-hee588c1_0.conda#84bd1c9a82b455e7a2f390375fb38f90 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda#be2de152d8073ef1c01b7728475f2fe7 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda#8371ac6457591af2cf6159439c1fd051 https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 @@ -47,7 +49,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda# https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda#70caf8bb6cf39a0b6b7efc885f51c0fe +https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda#3b3e64af585eadfb52bb90b553db5edf https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 @@ -56,41 +58,34 @@ https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f0 https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.124-hb9d3cd8_0.conda#8bc89311041d7fcb510238cf0848ccae -https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_1.conda#62857b389e42b36b686331bec0922050 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.5-h0d44e9d_1.conda#f5b05674697ae7d2c5932766695945e1 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba +https://conda.anaconda.org/conda-forge/linux-64/python-3.12.8-h9e4cc4f_1_cpython.conda#7fd2fd79436d9b473812f14e86746844 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.48.0-h9eae976_0.conda#2b3a22991c20ed6ea2ed65d3407a91f4 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.10-h4f16b4b_1.conda#125f34a17d7b4bea418a83904ea82ea6 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 -https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d -https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f -https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-26_linux64_openblas.conda#ac52800af2e0c0e7dac770b435ce768a -https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda#0ea6510969e1296cc19966fad481f6de -https://conda.anaconda.org/conda-forge/linux-64/python-3.12.8-h9e4cc4f_1_cpython.conda#7fd2fd79436d9b473812f14e86746844 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.47.2-h9eae976_0.conda#64a954de15d114281535a26fd4d1f294 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.5.2-pyhd8ed1ab_0.conda#4229aeacda5e2878871ce03b39d3e11f https://conda.anaconda.org/conda-forge/noarch/attrs-24.3.0-pyh71513ae_0.conda#356927ace43302bf6f5926e2a58dae6a +https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda#b0b867af6fc74b2a0aa206da29c0f3cf https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.0-pyhd8ed1ab_1.conda#0a99af03ccbd19113c1de1c7f16a53d2 https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda#6feb87357ecd66733be3279f16a8c400 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/linux-64/chardet-5.2.0-py312h7900ff3_2.conda#01b1679726675bf49851cdb507de4a24 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.0-pyhd8ed1ab_1.conda#6581a17bba6b948bb60130026404a9d6 +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda#e83a31202d1c0a000fce3e9cf3825875 https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda#f22f4d4970e09d68a10b922cbb0408d3 -https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.0-pyhd8ed1ab_2.conda#1f76b7e2b3ab88def5aa2f158322c7e6 +https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.1-pyhd8ed1ab_0.conda#364ba6c9fb03886ac979b482f39ebb92 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/colorlog-6.9.0-pyh707e725_1.conda#f00fc375bd02bdbbf791f9fe26ae96ec https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 @@ -106,28 +101,26 @@ https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.1-pyhd8ed1ab_1.conda#ae376af0a29183e98a95508ed6944664 -https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py312h68727a3_0.conda#444266743652a4f1538145e9362f6d3b -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-26_linux64_openblas.conda#ebcc5f37a435aa3c19640533c82f8d76 +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.8-py312h84d6215_0.conda#6713467dc95509683bfa3aca08524e8a +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-26_linux64_openblas.conda#ac52800af2e0c0e7dac770b435ce768a https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.11.1-h332b0f4_0.conda#2b3e0081006dc21e8bf53a91c83a055c -https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-26_linux64_openblas.conda#3792604c43695d6a273bc5faaac47d48 +https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda#0ea6510969e1296cc19966fad481f6de https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda#eb227c3e0bf58f5bd69c0532b157975b https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda#577852c7e53901ddccc7e6a9959ddebe https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef -https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_1.conda#b38dc0206e2a530e5c2cf11dc086b31a +https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda#232fb4577b6687b2d503ef8e254270c9 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.1-pyhd8ed1ab_0.conda#285e237b8f351e85e7574a2c7bfa6d46 https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_1.conda#856b387c270e9eaf6e41e978057a2b62 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f0_1.conda#39aed2afe4d0cf76ab3d6b09eecdbea7 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_1.conda#f26ec986456c30f6dff154b670ae140f https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h66e93f0_1.conda#549e5930e768548a89c23f595dac5a95 -https://conda.anaconda.org/conda-forge/noarch/setuptools-75.6.0-pyhff2d567_1.conda#fc80f7995e396cbaeabd23cf46c413dc +https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda#8f28e299c11afdd79e0ec1e279dcdc52 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb @@ -135,62 +128,69 @@ https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0d https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_1.conda#40d0ed782a8aaa16ef248e68c06c168d https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda#d17f13df8b65464ca316cbc000a3cb64 -https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py312h66e93f0_1.conda#588486a61153f94c7c13816f7069e440 +https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py312h66e93f0_0.conda#617f5d608ff8c28ad546e5d9671cbb95 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3cc595284c5e8f0f9900a9b228a332 https://conda.anaconda.org/conda-forge/noarch/babel-2.16.0-pyhd8ed1ab_1.conda#3e23f7db93ec14c80525257d8affac28 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda#a861504bbea4161a9170b85d4d2be840 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.10-py312h178313f_0.conda#df113f58bdfc79c98f5e07b6bd3eb4c2 https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.55.3-py312h178313f_1.conda#bc18c46eda4c2b29431981998507e723 -https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_1.conda#825927dc7b0f287ef8d4d0011bb113b1 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.4-nompi_h2d575fe_105.conda#d76fff0092b6389a12134ddebc0929bd https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_1.conda#315607a3030ad5d5227e76e0733798ff https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda#2752a6ed44105bfb18c9bef1177d9dcd -https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h03adeef_0.conda#b1df5affe904efe82ef890826b68881d +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-26_linux64_openblas.conda#ebcc5f37a435aa3c19640533c82f8d76 +https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-26_linux64_openblas.conda#3792604c43695d6a273bc5faaac47d48 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.1-py312h7e784f5_0.conda#6159cab400b61f38579a7692be5e630a +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/linux-64/pillow-11.0.0-py312h7b63e92_0.conda#385f46a4df6f97892503a841121a9acf https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_2.conda#04e691b9fadd93a8a9fad87a81d4fd8f https://conda.anaconda.org/conda-forge/linux-64/proj-9.5.1-h0054346_0.conda#398cabfd9bd75e90d0901db95224f25f https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.8.0-pyhd8ed1ab_1.conda#f23e24f1f1b8bdc8f644ffaf195c6684 https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda#799ed216dc6af62520f32aa39bc1c2bb https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda#b6a408c64b78ec7b779a3e5c7a902433 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.28.0-pyhd8ed1ab_0.conda#1d601bc1d28b5ce6d112b90f4b9b8ede -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312hc0a28a1_1.conda#990033147b0a998e756eaaed6b28f48d -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.1-py312h68727a3_0.conda#f5fbba0394ee45e9a64a73c2a994126a +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.29.1-pyhd8ed1ab_0.conda#de06336c9833cffd2a4bd6f27c4cf8ea +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa +https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.5.0-hd8ed1ab_1.conda#c70dd0718dbccdcc6d5828de3e71399d -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 +https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h03adeef_0.conda#b1df5affe904efe82ef890826b68881d https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h5ddbaa4_116.conda#f51573abc223afed7e5374f34135ce05 -https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h66e93f0_1.conda#5fef67f50126f40f5966a9451661280d +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.1-py312h7e784f5_0.conda#6159cab400b61f38579a7692be5e630a +https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py312h80c1187_0.conda#d3894405f05b2c0f351d5de3ae26fa9c https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.0-py312he630544_0.conda#427799f15b36751761941f4cbd7d780f https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda#79963c319d1be62c8fd3e34555816e01 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.1-py312h62794b6_2.conda#94688dd449f6c092e5f951780235aca1 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_1.conda#ac738a7f524d1b157e53fb9734f85e0e -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.6-py312h391bc85_2.conda#eb476b4975ea28ac12ff469063a71f5d https://conda.anaconda.org/conda-forge/noarch/tox-4.23.2-pyhd8ed1ab_1.conda#18cdd1546804d0ec2f81fb6b5f2c1bb7 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h68727a3_5.conda#f9664ee31aed96c85b7319ab0a693341 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda#8b7069e9792ee4e5b4919a7a306d2e67 -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py312hc0a28a1_0.conda#8b5b812d4c18cb37bda7a7c8d3a6acb3 +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312hc0a28a1_1.conda#990033147b0a998e756eaaed6b28f48d +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.1-py312h68727a3_0.conda#f5fbba0394ee45e9a64a73c2a994126a https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.39.0-hf413ef6_1.conda#63ea3e2f32daf4670182a3e6aad0b47b -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.4-pyhd8ed1ab_0.conda#5ec16e7ad9bab911ff0696940953f505 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.0-py312hd3ec401_0.conda#c27a17a8c54c0d35cf83bbc0de8f7f77 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py312ha728dd9_101.conda#7e41ca6012a6bf609539aec0dfee93f7 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.5-pyhd8ed1ab_0.conda#c1b0f663ff141265d1be1242259063f0 +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 +https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h66e93f0_1.conda#5fef67f50126f40f5966a9451661280d https://conda.anaconda.org/conda-forge/noarch/nox-2024.10.9-pyhd8ed1ab_1.conda#74adbad34c17927dad683cfc2f57cce5 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.1-py312h180e4f1_0.conda#355bcf0f629159c9bd10a406cd8b6c3a https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.1.0-hd8ed1ab_1.conda#4b2757cbafd866a23faba9dd2b6fd43e +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.6-py312h391bc85_2.conda#eb476b4975ea28ac12ff469063a71f5d https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py312hf9745cd_0.conda#ea213e31805199cb7d0da457b879ceed +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py312hc0a28a1_0.conda#8b5b812d4c18cb37bda7a7c8d3a6acb3 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.39.0-hf413ef6_1.conda#63ea3e2f32daf4670182a3e6aad0b47b +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.0-py312hd3ec401_0.conda#c27a17a8c54c0d35cf83bbc0de8f7f77 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py312ha728dd9_101.conda#7e41ca6012a6bf609539aec0dfee93f7 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.0.1-pyha770c72_1.conda#d0ea6ed474bf7f6db88fc85e6dc809b1 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py312hc0a28a1_0.conda#476b0357e207e10d2b7b13ed82156e6d https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py312hf9745cd_0.conda#ea213e31805199cb7d0da457b879ceed https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py312hc0a28a1_0.conda#476b0357e207e10d2b7b13ed82156e6d https://conda.anaconda.org/conda-forge/noarch/iris-3.11.1-pyha770c72_0.conda#ee54ee24030934558ddfc033f178ecbe https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff From a98e84afdfbbca33178fe0e8400102fae7accfb6 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 20 Jan 2025 18:17:09 +0000 Subject: [PATCH 412/583] chore: update pre-commit hooks (#601) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.9.1 → v0.9.2](https://github.com/astral-sh/ruff-pre-commit/compare/v0.9.1...v0.9.2) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3f039325..d8434400 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -78,7 +78,7 @@ repos: types: [file, python] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.9.1" + rev: "v0.9.2" hooks: - id: ruff types: [file, python] From c16df07c9efd594dd9fe240778127afb40756d47 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 23 Jan 2025 10:14:16 +0000 Subject: [PATCH 413/583] Bump scitools/workflows in the dependencies group across 1 directory (#602) Bumps the dependencies group with 1 update in the / directory: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2025.01.1 to 2025.01.4 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.01.1...2025.01.4) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index f7f95fd7..72054813 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.01.1 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.01.4 diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index d9efbf82..a21bb601 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.01.1 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.01.4 secrets: inherit From 62f1924de7b8355e26cfdd60776d89f04ec73e4d Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Sat, 25 Jan 2025 21:46:37 +0000 Subject: [PATCH 414/583] Updated environment lockfiles (#603) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 32 +++++++++++++------------- requirements/locks/py311-linux-64.lock | 32 +++++++++++++------------- requirements/locks/py312-linux-64.lock | 32 +++++++++++++------------- 3 files changed, 48 insertions(+), 48 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index dc062009..f19fd7b6 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -41,7 +41,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.c https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.45-h943b412_0.conda#85cbdaacad93808395ac295b5667d25b -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.48.0-hee588c1_0.conda#84bd1c9a82b455e7a2f390375fb38f90 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.48.0-hee588c1_1.conda#3fa05c528d8a1e2a67bbf1e36f22d3bc https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda#be2de152d8073ef1c01b7728475f2fe7 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda#8371ac6457591af2cf6159439c1fd051 https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 @@ -69,7 +69,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.5-h0d44e9d_1.conda# https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/python-3.10.16-he725a3c_1_cpython.conda#b887811a901b3aa622a92caf03bc8917 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.48.0-h9eae976_0.conda#2b3a22991c20ed6ea2ed65d3407a91f4 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.48.0-h9eae976_1.conda#0ca48fd3357c877f21ea4440fe18e2b7 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.10-h4f16b4b_1.conda#125f34a17d7b4bea418a83904ea82ea6 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 @@ -79,7 +79,7 @@ https://conda.anaconda.org/conda-forge/noarch/attrs-24.3.0-pyh71513ae_0.conda#35 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_2.conda#bf502c169c71e3c6ac0d6175addfacc2 -https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.0-pyhd8ed1ab_1.conda#0a99af03ccbd19113c1de1c7f16a53d2 +https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.1-pyhd8ed1ab_0.conda#6eb7c1074d938746b195f556abf9a28f https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda#6feb87357ecd66733be3279f16a8c400 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/linux-64/chardet-5.2.0-py310hff52083_2.conda#e94bf593fe645f6b85a9c8b2d52caae6 @@ -92,11 +92,11 @@ https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#4 https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_1.conda#8d88f4a2242e6b96f9ecff9a6a05b2f1 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e -https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_1.conda#d692e9ba6f92dc51484bf3477e36ce7c +https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda#7f402b4a1007ee355bc50ce4d24d4a57 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.12.0-pyhd8ed1ab_0.conda#e041ad4c43ab5e10c74587f95378ebc7 -https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyhd8ed1ab_1.conda#2aa5ff7fa34a81b9196532c84c10d865 -https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_1.conda#566e75c90c1d0c8c459eb0ad9833dc7a +https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e +https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 @@ -119,7 +119,7 @@ https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_1.conda#856 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py310ha75aee5_1.conda#8b430470d53744289cb5499bc99a6485 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_1.conda#f26ec986456c30f6dff154b670ae140f -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py310ha75aee5_1.conda#0d4c5c76ae5f5aac6f0be419963a19dd +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py310h89163eb_2.conda#fd343408e64cf1e273ab7c710da374db https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda#8f28e299c11afdd79e0ec1e279dcdc52 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e @@ -136,10 +136,10 @@ https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3 https://conda.anaconda.org/conda-forge/noarch/babel-2.16.0-pyhd8ed1ab_1.conda#3e23f7db93ec14c80525257d8affac28 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h8deb56e_0.conda#1fc24a3196ad5ede2a68148be61894f4 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.10-py310h89163eb_0.conda#f9bf6ea6ddf8349750f1b455f603b0ae -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.55.3-py310h89163eb_1.conda#c81251a712a36b477ed2330ec0e1a299 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.55.5-py310h89163eb_0.conda#f75746e6734b825efaad188e0e2640dc https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_1.conda#825927dc7b0f287ef8d4d0011bb113b1 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.4-nompi_h2d575fe_105.conda#d76fff0092b6389a12134ddebc0929bd -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_1.conda#315607a3030ad5d5227e76e0733798ff +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda#f4b39bf00c69f56ac01e020ebfac066c https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda#2752a6ed44105bfb18c9bef1177d9dcd https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-26_linux64_openblas.conda#ebcc5f37a435aa3c19640533c82f8d76 @@ -150,7 +150,7 @@ https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda# https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_2.conda#04e691b9fadd93a8a9fad87a81d4fd8f https://conda.anaconda.org/conda-forge/linux-64/proj-9.5.1-h0054346_0.conda#398cabfd9bd75e90d0901db95224f25f -https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.8.0-pyhd8ed1ab_1.conda#f23e24f1f1b8bdc8f644ffaf195c6684 +https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.0-pyh29332c3_0.conda#46276968030688a25257b08772c418fc https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda#799ed216dc6af62520f32aa39bc1c2bb https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda#b6a408c64b78ec7b779a3e5c7a902433 @@ -159,22 +159,22 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.5.0-hd8ed1ab_1.conda#c70dd0718dbccdcc6d5828de3e71399d +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.6.1-hd8ed1ab_0.conda#7f46575a91b1307441abc235d01cab66 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h03adeef_0.conda#b1df5affe904efe82ef890826b68881d https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h5ddbaa4_116.conda#f51573abc223afed7e5374f34135ce05 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.1-py310h5851e9f_0.conda#d38cb65becc66134ed42a02e6155e8e0 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.2-py310hefbff90_0.conda#c5d8e63603a198e20eea67a12d039154 https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py310h7e6dc6c_0.conda#14d300b9e1504748e70cc6499a7b4d25 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.0-py310h2e9f774_0.conda#42a3ea3c283d930ae6d156b97ffe4740 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda#79963c319d1be62c8fd3e34555816e01 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_1.conda#ac738a7f524d1b157e53fb9734f85e0e -https://conda.anaconda.org/conda-forge/noarch/tox-4.23.2-pyhd8ed1ab_1.conda#18cdd1546804d0ec2f81fb6b5f2c1bb7 +https://conda.anaconda.org/conda-forge/noarch/tox-4.24.1-pyh29332c3_0.conda#81d5a93243af5f2c6addb3c8a16b4ac6 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310h3788b33_5.conda#e05b0475166b68c9dc4d7937e0315654 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha39cb0e_1.conda#f49de34fb99934bf49ab330b5caffd64 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310hf462985_1.conda#c2d5289e6cbcecf2c549e01772fe5274 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.1-py310h3788b33_0.conda#f993b13665fc2bb262b30217c815d137 https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.5-pyhd8ed1ab_0.conda#c1b0f663ff141265d1be1242259063f0 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.6-pyhd8ed1ab_0.conda#d751c3b4a973ed15b57be90d68c716d1 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py310ha75aee5_1.conda#48781b625a5c7701e04d222752cb2f62 https://conda.anaconda.org/conda-forge/noarch/nox-2024.10.9-pyhd8ed1ab_1.conda#74adbad34c17927dad683cfc2f57cce5 @@ -186,12 +186,12 @@ https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py310hf462985_0.c https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.39.0-hf413ef6_1.conda#63ea3e2f32daf4670182a3e6aad0b47b https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.0-py310h68603db_0.conda#409498230a11a71578ed49d006165249 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py310h5146f0f_101.conda#3e17df8e4192431b85afc89a539f6c28 -https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.0.1-pyha770c72_1.conda#d0ea6ed474bf7f6db88fc85e6dc809b1 +https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.1.0-pyha770c72_0.conda#5353f5eb201a9415b12385e35ed1148d https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py310h5eaa309_0.conda#ca4d935c1715f95b6e86846ad1675a2b https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py310hf462985_0.conda#93ae40b74b2baea09ddeaa287b09e705 -https://conda.anaconda.org/conda-forge/noarch/iris-3.11.1-pyha770c72_0.conda#ee54ee24030934558ddfc033f178ecbe +https://conda.anaconda.org/conda-forge/noarch/iris-3.11.1-pyha770c72_1.conda#f501583062225a070455d011d81b07bf https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda#e9fb3fe8a5b758b4aff187d434f94f03 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index fca2d4fa..63af9b1d 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -41,7 +41,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.c https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.45-h943b412_0.conda#85cbdaacad93808395ac295b5667d25b -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.48.0-hee588c1_0.conda#84bd1c9a82b455e7a2f390375fb38f90 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.48.0-hee588c1_1.conda#3fa05c528d8a1e2a67bbf1e36f22d3bc https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda#be2de152d8073ef1c01b7728475f2fe7 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda#8371ac6457591af2cf6159439c1fd051 https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 @@ -69,7 +69,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.5-h0d44e9d_1.conda# https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/python-3.11.11-h9e4cc4f_1_cpython.conda#8387070aa413ce9a8cc35a509fae938b https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.48.0-h9eae976_0.conda#2b3a22991c20ed6ea2ed65d3407a91f4 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.48.0-h9eae976_1.conda#0ca48fd3357c877f21ea4440fe18e2b7 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.10-h4f16b4b_1.conda#125f34a17d7b4bea418a83904ea82ea6 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 @@ -79,7 +79,7 @@ https://conda.anaconda.org/conda-forge/noarch/attrs-24.3.0-pyh71513ae_0.conda#35 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hfdbb021_2.conda#d21daab070d76490cb39a8f1d1729d79 -https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.0-pyhd8ed1ab_1.conda#0a99af03ccbd19113c1de1c7f16a53d2 +https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.1-pyhd8ed1ab_0.conda#6eb7c1074d938746b195f556abf9a28f https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda#6feb87357ecd66733be3279f16a8c400 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/linux-64/chardet-5.2.0-py311h38be061_2.conda#00f0ad2aed7e65c9392a067ce7882b28 @@ -92,11 +92,11 @@ https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#4 https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_1.conda#8d88f4a2242e6b96f9ecff9a6a05b2f1 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e -https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_1.conda#d692e9ba6f92dc51484bf3477e36ce7c +https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda#7f402b4a1007ee355bc50ce4d24d4a57 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.12.0-pyhd8ed1ab_0.conda#e041ad4c43ab5e10c74587f95378ebc7 -https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyhd8ed1ab_1.conda#2aa5ff7fa34a81b9196532c84c10d865 -https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_1.conda#566e75c90c1d0c8c459eb0ad9833dc7a +https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e +https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 @@ -119,7 +119,7 @@ https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_1.conda#856 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py311h9ecbd09_1.conda#b1796d741ca619dbacb79917b20e5a05 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_1.conda#f26ec986456c30f6dff154b670ae140f -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py311h9ecbd09_1.conda#abeb54d40f439b86f75ea57045ab8496 +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py311h2dc5d0c_2.conda#014417753f948da1f70d132b2de573be https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda#8f28e299c11afdd79e0ec1e279dcdc52 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e @@ -136,10 +136,10 @@ https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3 https://conda.anaconda.org/conda-forge/noarch/babel-2.16.0-pyhd8ed1ab_1.conda#3e23f7db93ec14c80525257d8affac28 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311hf29c0ef_0.conda#55553ecd5328336368db611f350b7039 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.10-py311h2dc5d0c_0.conda#2a772b30e69ba8319651e9f3ab01608f -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.55.3-py311h2dc5d0c_1.conda#04c0b385767445be8aefe0d4915cb747 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.55.5-py311h2dc5d0c_0.conda#2186378b15a749a0dd6f4b6c2a06b528 https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_1.conda#825927dc7b0f287ef8d4d0011bb113b1 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.4-nompi_h2d575fe_105.conda#d76fff0092b6389a12134ddebc0929bd -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_1.conda#315607a3030ad5d5227e76e0733798ff +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda#f4b39bf00c69f56ac01e020ebfac066c https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda#2752a6ed44105bfb18c9bef1177d9dcd https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-26_linux64_openblas.conda#ebcc5f37a435aa3c19640533c82f8d76 @@ -150,7 +150,7 @@ https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda# https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_2.conda#04e691b9fadd93a8a9fad87a81d4fd8f https://conda.anaconda.org/conda-forge/linux-64/proj-9.5.1-h0054346_0.conda#398cabfd9bd75e90d0901db95224f25f -https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.8.0-pyhd8ed1ab_1.conda#f23e24f1f1b8bdc8f644ffaf195c6684 +https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.0-pyh29332c3_0.conda#46276968030688a25257b08772c418fc https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda#799ed216dc6af62520f32aa39bc1c2bb https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda#b6a408c64b78ec7b779a3e5c7a902433 @@ -159,22 +159,22 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.5.0-hd8ed1ab_1.conda#c70dd0718dbccdcc6d5828de3e71399d +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.6.1-hd8ed1ab_0.conda#7f46575a91b1307441abc235d01cab66 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h03adeef_0.conda#b1df5affe904efe82ef890826b68881d https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h5ddbaa4_116.conda#f51573abc223afed7e5374f34135ce05 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.1-py311hf916aec_0.conda#54a2d01ec2cfc01644f17d25978b0ecf +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.2-py311h5d046bc_0.conda#15059981f9cc9b79fff94cc17264356e https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py311h1322bbf_0.conda#9f4f5593335f76c1dbf7381c11fe7155 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.0-py311h0f98d5a_0.conda#22531205a97c116251713008d65dfefd https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda#79963c319d1be62c8fd3e34555816e01 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_1.conda#ac738a7f524d1b157e53fb9734f85e0e -https://conda.anaconda.org/conda-forge/noarch/tox-4.23.2-pyhd8ed1ab_1.conda#18cdd1546804d0ec2f81fb6b5f2c1bb7 +https://conda.anaconda.org/conda-forge/noarch/tox-4.24.1-pyh29332c3_0.conda#81d5a93243af5f2c6addb3c8a16b4ac6 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hd18a35c_5.conda#4e8447ca8558a203ec0577b4730073f3 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311hbc35293_1.conda#aec590674ba365e50ae83aa2d6e1efae https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h9f3472d_1.conda#2c3c4f115d28ed9e001a271d5d8585aa https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.1-py311hd18a35c_0.conda#351cb68d2081e249069748b6e60b3cd2 https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.5-pyhd8ed1ab_0.conda#c1b0f663ff141265d1be1242259063f0 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.6-pyhd8ed1ab_0.conda#d751c3b4a973ed15b57be90d68c716d1 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py311h9ecbd09_1.conda#28d6b63784b350a2906dc264ad8c7f2a https://conda.anaconda.org/conda-forge/noarch/nox-2024.10.9-pyhd8ed1ab_1.conda#74adbad34c17927dad683cfc2f57cce5 @@ -186,12 +186,12 @@ https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py311h9f3472d_0.c https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.39.0-hf413ef6_1.conda#63ea3e2f32daf4670182a3e6aad0b47b https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.0-py311h2b939e6_0.conda#79239585ea50c427415ef629534bb3aa https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py311h7c29e4f_101.conda#d966f11d28c699da7e9de2aa2f323a4f -https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.0.1-pyha770c72_1.conda#d0ea6ed474bf7f6db88fc85e6dc809b1 +https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.1.0-pyha770c72_0.conda#5353f5eb201a9415b12385e35ed1148d https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py311h7db5c69_0.conda#20ba399d57a2b5de789a5b24341481a1 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py311h9f3472d_0.conda#648bccc358ec5b19dec01a5685f3aeb9 -https://conda.anaconda.org/conda-forge/noarch/iris-3.11.1-pyha770c72_0.conda#ee54ee24030934558ddfc033f178ecbe +https://conda.anaconda.org/conda-forge/noarch/iris-3.11.1-pyha770c72_1.conda#f501583062225a070455d011d81b07bf https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda#e9fb3fe8a5b758b4aff187d434f94f03 diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 6670939a..c2ca3955 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -41,7 +41,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.c https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.45-h943b412_0.conda#85cbdaacad93808395ac295b5667d25b -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.48.0-hee588c1_0.conda#84bd1c9a82b455e7a2f390375fb38f90 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.48.0-hee588c1_1.conda#3fa05c528d8a1e2a67bbf1e36f22d3bc https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda#be2de152d8073ef1c01b7728475f2fe7 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda#8371ac6457591af2cf6159439c1fd051 https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 @@ -69,7 +69,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.5-h0d44e9d_1.conda# https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/python-3.12.8-h9e4cc4f_1_cpython.conda#7fd2fd79436d9b473812f14e86746844 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.48.0-h9eae976_0.conda#2b3a22991c20ed6ea2ed65d3407a91f4 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.48.0-h9eae976_1.conda#0ca48fd3357c877f21ea4440fe18e2b7 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.10-h4f16b4b_1.conda#125f34a17d7b4bea418a83904ea82ea6 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 @@ -79,7 +79,7 @@ https://conda.anaconda.org/conda-forge/noarch/attrs-24.3.0-pyh71513ae_0.conda#35 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda#b0b867af6fc74b2a0aa206da29c0f3cf -https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.0-pyhd8ed1ab_1.conda#0a99af03ccbd19113c1de1c7f16a53d2 +https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.1-pyhd8ed1ab_0.conda#6eb7c1074d938746b195f556abf9a28f https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda#6feb87357ecd66733be3279f16a8c400 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/linux-64/chardet-5.2.0-py312h7900ff3_2.conda#01b1679726675bf49851cdb507de4a24 @@ -92,11 +92,11 @@ https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#4 https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_1.conda#8d88f4a2242e6b96f9ecff9a6a05b2f1 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e -https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_1.conda#d692e9ba6f92dc51484bf3477e36ce7c +https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda#7f402b4a1007ee355bc50ce4d24d4a57 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.12.0-pyhd8ed1ab_0.conda#e041ad4c43ab5e10c74587f95378ebc7 -https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyhd8ed1ab_1.conda#2aa5ff7fa34a81b9196532c84c10d865 -https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_1.conda#566e75c90c1d0c8c459eb0ad9833dc7a +https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e +https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 @@ -119,7 +119,7 @@ https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_1.conda#856 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f0_1.conda#39aed2afe4d0cf76ab3d6b09eecdbea7 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_1.conda#f26ec986456c30f6dff154b670ae140f -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h66e93f0_1.conda#549e5930e768548a89c23f595dac5a95 +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h178313f_2.conda#cf2485f39740de96e2a7f2bb18ed2fee https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda#8f28e299c11afdd79e0ec1e279dcdc52 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e @@ -136,10 +136,10 @@ https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3 https://conda.anaconda.org/conda-forge/noarch/babel-2.16.0-pyhd8ed1ab_1.conda#3e23f7db93ec14c80525257d8affac28 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda#a861504bbea4161a9170b85d4d2be840 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.10-py312h178313f_0.conda#df113f58bdfc79c98f5e07b6bd3eb4c2 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.55.3-py312h178313f_1.conda#bc18c46eda4c2b29431981998507e723 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.55.5-py312h178313f_0.conda#3b2d05c3be2f99fe5c40929685a6ed2c https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_1.conda#825927dc7b0f287ef8d4d0011bb113b1 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.4-nompi_h2d575fe_105.conda#d76fff0092b6389a12134ddebc0929bd -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_1.conda#315607a3030ad5d5227e76e0733798ff +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda#f4b39bf00c69f56ac01e020ebfac066c https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda#2752a6ed44105bfb18c9bef1177d9dcd https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-26_linux64_openblas.conda#ebcc5f37a435aa3c19640533c82f8d76 @@ -150,7 +150,7 @@ https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda# https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_2.conda#04e691b9fadd93a8a9fad87a81d4fd8f https://conda.anaconda.org/conda-forge/linux-64/proj-9.5.1-h0054346_0.conda#398cabfd9bd75e90d0901db95224f25f -https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.8.0-pyhd8ed1ab_1.conda#f23e24f1f1b8bdc8f644ffaf195c6684 +https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.0-pyh29332c3_0.conda#46276968030688a25257b08772c418fc https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda#799ed216dc6af62520f32aa39bc1c2bb https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda#b6a408c64b78ec7b779a3e5c7a902433 @@ -159,22 +159,22 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.5.0-hd8ed1ab_1.conda#c70dd0718dbccdcc6d5828de3e71399d +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.6.1-hd8ed1ab_0.conda#7f46575a91b1307441abc235d01cab66 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h03adeef_0.conda#b1df5affe904efe82ef890826b68881d https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h5ddbaa4_116.conda#f51573abc223afed7e5374f34135ce05 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.1-py312h7e784f5_0.conda#6159cab400b61f38579a7692be5e630a +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.2-py312h72c5963_0.conda#7e984cb31e0366d1812096b41b361425 https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py312h80c1187_0.conda#d3894405f05b2c0f351d5de3ae26fa9c https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.0-py312he630544_0.conda#427799f15b36751761941f4cbd7d780f https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda#79963c319d1be62c8fd3e34555816e01 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_1.conda#ac738a7f524d1b157e53fb9734f85e0e -https://conda.anaconda.org/conda-forge/noarch/tox-4.23.2-pyhd8ed1ab_1.conda#18cdd1546804d0ec2f81fb6b5f2c1bb7 +https://conda.anaconda.org/conda-forge/noarch/tox-4.24.1-pyh29332c3_0.conda#81d5a93243af5f2c6addb3c8a16b4ac6 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h68727a3_5.conda#f9664ee31aed96c85b7319ab0a693341 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda#8b7069e9792ee4e5b4919a7a306d2e67 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312hc0a28a1_1.conda#990033147b0a998e756eaaed6b28f48d https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.1-py312h68727a3_0.conda#f5fbba0394ee45e9a64a73c2a994126a https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.5-pyhd8ed1ab_0.conda#c1b0f663ff141265d1be1242259063f0 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.6-pyhd8ed1ab_0.conda#d751c3b4a973ed15b57be90d68c716d1 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h66e93f0_1.conda#5fef67f50126f40f5966a9451661280d https://conda.anaconda.org/conda-forge/noarch/nox-2024.10.9-pyhd8ed1ab_1.conda#74adbad34c17927dad683cfc2f57cce5 @@ -186,12 +186,12 @@ https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py312hc0a28a1_0.c https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.39.0-hf413ef6_1.conda#63ea3e2f32daf4670182a3e6aad0b47b https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.0-py312hd3ec401_0.conda#c27a17a8c54c0d35cf83bbc0de8f7f77 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py312ha728dd9_101.conda#7e41ca6012a6bf609539aec0dfee93f7 -https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.0.1-pyha770c72_1.conda#d0ea6ed474bf7f6db88fc85e6dc809b1 +https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.1.0-pyha770c72_0.conda#5353f5eb201a9415b12385e35ed1148d https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py312hf9745cd_0.conda#ea213e31805199cb7d0da457b879ceed https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py312hc0a28a1_0.conda#476b0357e207e10d2b7b13ed82156e6d -https://conda.anaconda.org/conda-forge/noarch/iris-3.11.1-pyha770c72_0.conda#ee54ee24030934558ddfc033f178ecbe +https://conda.anaconda.org/conda-forge/noarch/iris-3.11.1-pyha770c72_1.conda#f501583062225a070455d011d81b07bf https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda#e9fb3fe8a5b758b4aff187d434f94f03 From 8aee0481df71a13621178228f0379f940b7027ca Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 28 Jan 2025 02:06:27 +0000 Subject: [PATCH 415/583] chore: update pre-commit hooks (#604) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/codespell-project/codespell: v2.3.0 → v2.4.0](https://github.com/codespell-project/codespell/compare/v2.3.0...v2.4.0) - [github.com/astral-sh/ruff-pre-commit: v0.9.2 → v0.9.3](https://github.com/astral-sh/ruff-pre-commit/compare/v0.9.2...v0.9.3) - [github.com/scientific-python/cookie: 2024.08.19 → 2025.01.22](https://github.com/scientific-python/cookie/compare/2024.08.19...2025.01.22) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index d8434400..edaceee3 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -58,7 +58,7 @@ repos: types: [file, rst] - repo: https://github.com/codespell-project/codespell - rev: "v2.3.0" + rev: "v2.4.0" hooks: - id: codespell types_or: [asciidoc, python, markdown, rst] @@ -78,7 +78,7 @@ repos: types: [file, python] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.9.2" + rev: "v0.9.3" hooks: - id: ruff types: [file, python] @@ -93,7 +93,7 @@ repos: types: [file, python] - repo: https://github.com/scientific-python/cookie - rev: 2024.08.19 + rev: 2025.01.22 hooks: - id: sp-repo-review additional_dependencies: ["repo-review[cli]"] From d8b4841388fca7139ef0a5bb0c9fdcf5d3b7df01 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 30 Jan 2025 06:15:09 +0000 Subject: [PATCH 416/583] Bump scitools/workflows in the dependencies group (#605) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2025.01.4 to 2025.01.5 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.01.4...2025.01.5) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 72054813..59b249b2 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.01.4 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.01.5 diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index a21bb601..fb798d73 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.01.4 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.01.5 secrets: inherit From 92e8b07f7c236ce3b2d0661006d750eceba0a1cc Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 4 Feb 2025 08:43:52 +0000 Subject: [PATCH 417/583] chore: update pre-commit hooks (#607) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/codespell-project/codespell: v2.4.0 → v2.4.1](https://github.com/codespell-project/codespell/compare/v2.4.0...v2.4.1) - [github.com/astral-sh/ruff-pre-commit: v0.9.3 → v0.9.4](https://github.com/astral-sh/ruff-pre-commit/compare/v0.9.3...v0.9.4) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index edaceee3..198e50e9 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -58,7 +58,7 @@ repos: types: [file, rst] - repo: https://github.com/codespell-project/codespell - rev: "v2.4.0" + rev: "v2.4.1" hooks: - id: codespell types_or: [asciidoc, python, markdown, rst] @@ -78,7 +78,7 @@ repos: types: [file, python] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.9.3" + rev: "v0.9.4" hooks: - id: ruff types: [file, python] From be700a8605caa3c67b120fc9fb6e025f10c0f905 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Feb 2025 11:04:10 +0000 Subject: [PATCH 418/583] Bump scitools/workflows in the dependencies group (#608) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2025.01.5 to 2025.02.0 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.01.5...2025.02.0) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 59b249b2..b2a81b63 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.01.5 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.02.0 diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index fb798d73..36de6736 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.01.5 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.02.0 secrets: inherit From b3a24e4aceb96da46bf065334186904042bfd9d5 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 10 Feb 2025 11:06:08 +0000 Subject: [PATCH 419/583] Updated environment lockfiles (#606) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 34 +++++++++++++------------- requirements/locks/py311-linux-64.lock | 34 +++++++++++++------------- requirements/locks/py312-linux-64.lock | 34 +++++++++++++------------- 3 files changed, 51 insertions(+), 51 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index f19fd7b6..67049232 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -3,7 +3,7 @@ # input_hash: 4b79cfcae8adfdca32dfc1151f0085dbb2a52a32b9d8bcaa79abfaa5ca75f98b @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.12.14-hbcca054_0.conda#720523eb0d6a9b0f6120c16b2aa4e7de +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda#19f3a56f68d2fd06c516076bff482c52 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-5_cp310.conda#2921c34715e74b3587b4cff4d36844f9 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda#dbcace4706afdfb7eb891f7b37d07c04 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda#048b02e3962f066da18efe3a21b77672 @@ -18,11 +18,11 @@ https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda#db833e03127376d461e1e13e76f09b6c https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda#e39480b9ca41323497b05492a63bc35b https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hd5240d6_1.conda#9822b874ea29af082e5d36098d25427d -https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.3-hb9d3cd8_1.conda#2ecf2f1c7e4e21fcfe6423a51a992d84 +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda#42d5b6a0f30d3c10cd88cb8584fda1cb https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda#234a5554c53625688d51062645337328 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_2.conda#04b34b9a40cdc48cfdab261ab176ff74 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda#4ce6875f75469b2757a65e10a5d05e31 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 @@ -32,7 +32,7 @@ https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.0-h5888daf_0.conda#40b https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de -https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20240808-pl5321h7949ede_0.conda#8247f80f3dc464d9322e85007e307fe8 +https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_1.conda#f1fd30127802683586f768875127a987 @@ -40,7 +40,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.45-h943b412_0.conda#85cbdaacad93808395ac295b5667d25b +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.46-h943b412_0.conda#adcf7bacff219488e29cfa95a2abd8f7 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.48.0-hee588c1_1.conda#3fa05c528d8a1e2a67bbf1e36f22d3bc https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda#be2de152d8073ef1c01b7728475f2fe7 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda#8371ac6457591af2cf6159439c1fd051 @@ -71,11 +71,11 @@ https://conda.anaconda.org/conda-forge/linux-64/python-3.10.16-he725a3c_1_cpytho https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.48.0-h9eae976_1.conda#0ca48fd3357c877f21ea4440fe18e2b7 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.10-h4f16b4b_1.conda#125f34a17d7b4bea418a83904ea82ea6 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.11-h4f16b4b_0.conda#b6eb6d0cb323179af168df8fe16fb0a1 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.5.2-pyhd8ed1ab_0.conda#4229aeacda5e2878871ce03b39d3e11f -https://conda.anaconda.org/conda-forge/noarch/attrs-24.3.0-pyh71513ae_0.conda#356927ace43302bf6f5926e2a58dae6a +https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda#2cc3f588512f04f3a0c64b4e9bedc02d https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_2.conda#bf502c169c71e3c6ac0d6175addfacc2 @@ -94,7 +94,7 @@ https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda#7f402b4a1007ee355bc50ce4d24d4a57 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.12.0-pyhd8ed1ab_0.conda#e041ad4c43ab5e10c74587f95378ebc7 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.2.0-pyhd8ed1ab_0.conda#d9ea16b71920b03beafc17fcca16df90 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 @@ -102,7 +102,7 @@ https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.b https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.1-pyhd8ed1ab_1.conda#ae376af0a29183e98a95508ed6944664 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py310h3788b33_0.conda#4186d9b4d004b0fe0de6aa62496fb48a -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-26_linux64_openblas.conda#ac52800af2e0c0e7dac770b435ce768a +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-28_h59b9bed_openblas.conda#73e2a99fdeb8531d50168987378fda8a https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.11.1-h332b0f4_0.conda#2b3e0081006dc21e8bf53a91c83a055c https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda#0ea6510969e1296cc19966fad481f6de @@ -118,7 +118,7 @@ https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.1-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_1.conda#856b387c270e9eaf6e41e978057a2b62 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py310ha75aee5_1.conda#8b430470d53744289cb5499bc99a6485 -https://conda.anaconda.org/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_1.conda#f26ec986456c30f6dff154b670ae140f +https://conda.anaconda.org/conda-forge/noarch/pytz-2025.1-pyhd8ed1ab_0.conda#d451ccded808abf6511f0a2ac9bb9dcc https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py310h89163eb_2.conda#fd343408e64cf1e273ab7c710da374db https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda#8f28e299c11afdd79e0ec1e279dcdc52 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 @@ -133,22 +133,22 @@ https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3cc595284c5e8f0f9900a9b228a332 -https://conda.anaconda.org/conda-forge/noarch/babel-2.16.0-pyhd8ed1ab_1.conda#3e23f7db93ec14c80525257d8affac28 +https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h8deb56e_0.conda#1fc24a3196ad5ede2a68148be61894f4 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.10-py310h89163eb_0.conda#f9bf6ea6ddf8349750f1b455f603b0ae -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.55.5-py310h89163eb_0.conda#f75746e6734b825efaad188e0e2640dc -https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_1.conda#825927dc7b0f287ef8d4d0011bb113b1 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.56.0-py310h89163eb_0.conda#cd3125e1924bd8699dac9989652bca74 +https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.4-nompi_h2d575fe_105.conda#d76fff0092b6389a12134ddebc0929bd https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda#f4b39bf00c69f56ac01e020ebfac066c https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda#2752a6ed44105bfb18c9bef1177d9dcd https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-26_linux64_openblas.conda#ebcc5f37a435aa3c19640533c82f8d76 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-28_he106b2a_openblas.conda#4e20a1c00b4e8a984aac0f6cce59e3ac https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-26_linux64_openblas.conda#3792604c43695d6a273bc5faaac47d48 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-28_h7ac8fdf_openblas.conda#069f40bfbf1dc55c83ddb07fc6a6ef8d https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_2.conda#04e691b9fadd93a8a9fad87a81d4fd8f +https://conda.anaconda.org/conda-forge/noarch/pip-25.0-pyh8b19718_0.conda#c2548760a02ed818f92dd0d8c81b55b4 https://conda.anaconda.org/conda-forge/linux-64/proj-9.5.1-h0054346_0.conda#398cabfd9bd75e90d0901db95224f25f https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.0-pyh29332c3_0.conda#46276968030688a25257b08772c418fc https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda#799ed216dc6af62520f32aa39bc1c2bb @@ -180,7 +180,7 @@ https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py310ha75aee5_1.co https://conda.anaconda.org/conda-forge/noarch/nox-2024.10.9-pyhd8ed1ab_1.conda#74adbad34c17927dad683cfc2f57cce5 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.1-py310hfa6ec8c_0.conda#a24baa04ee53ee3078ac1856887c3dea https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.1.0-hd8ed1ab_1.conda#4b2757cbafd866a23faba9dd2b6fd43e -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.6-py310had3dfd6_2.conda#a4166b41e54d22e794859641b7cae2d0 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.7-py310had3dfd6_0.conda#27f3e05fb7dd7c300a5567476a9f92d8 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py310hf462985_0.conda#c31938674e4cda43617a4d70f99ffd0c https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.39.0-hf413ef6_1.conda#63ea3e2f32daf4670182a3e6aad0b47b diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 63af9b1d..312503a1 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -3,7 +3,7 @@ # input_hash: fe5452e41de90dae4e169a25fead307770c576d24c6b8b5ccaf1c6db315e8ae0 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.12.14-hbcca054_0.conda#720523eb0d6a9b0f6120c16b2aa4e7de +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda#19f3a56f68d2fd06c516076bff482c52 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-5_cp311.conda#139a8d40c8a2f430df31048949e450de https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda#dbcace4706afdfb7eb891f7b37d07c04 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda#048b02e3962f066da18efe3a21b77672 @@ -18,11 +18,11 @@ https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda#db833e03127376d461e1e13e76f09b6c https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda#e39480b9ca41323497b05492a63bc35b https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hd5240d6_1.conda#9822b874ea29af082e5d36098d25427d -https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.3-hb9d3cd8_1.conda#2ecf2f1c7e4e21fcfe6423a51a992d84 +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda#42d5b6a0f30d3c10cd88cb8584fda1cb https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda#234a5554c53625688d51062645337328 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_2.conda#04b34b9a40cdc48cfdab261ab176ff74 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda#4ce6875f75469b2757a65e10a5d05e31 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 @@ -32,7 +32,7 @@ https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.0-h5888daf_0.conda#40b https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de -https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20240808-pl5321h7949ede_0.conda#8247f80f3dc464d9322e85007e307fe8 +https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_1.conda#f1fd30127802683586f768875127a987 @@ -40,7 +40,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.45-h943b412_0.conda#85cbdaacad93808395ac295b5667d25b +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.46-h943b412_0.conda#adcf7bacff219488e29cfa95a2abd8f7 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.48.0-hee588c1_1.conda#3fa05c528d8a1e2a67bbf1e36f22d3bc https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda#be2de152d8073ef1c01b7728475f2fe7 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda#8371ac6457591af2cf6159439c1fd051 @@ -71,11 +71,11 @@ https://conda.anaconda.org/conda-forge/linux-64/python-3.11.11-h9e4cc4f_1_cpytho https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.48.0-h9eae976_1.conda#0ca48fd3357c877f21ea4440fe18e2b7 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.10-h4f16b4b_1.conda#125f34a17d7b4bea418a83904ea82ea6 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.11-h4f16b4b_0.conda#b6eb6d0cb323179af168df8fe16fb0a1 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.5.2-pyhd8ed1ab_0.conda#4229aeacda5e2878871ce03b39d3e11f -https://conda.anaconda.org/conda-forge/noarch/attrs-24.3.0-pyh71513ae_0.conda#356927ace43302bf6f5926e2a58dae6a +https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda#2cc3f588512f04f3a0c64b4e9bedc02d https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hfdbb021_2.conda#d21daab070d76490cb39a8f1d1729d79 @@ -94,7 +94,7 @@ https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda#7f402b4a1007ee355bc50ce4d24d4a57 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.12.0-pyhd8ed1ab_0.conda#e041ad4c43ab5e10c74587f95378ebc7 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.2.0-pyhd8ed1ab_0.conda#d9ea16b71920b03beafc17fcca16df90 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 @@ -102,7 +102,7 @@ https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.b https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.1-pyhd8ed1ab_1.conda#ae376af0a29183e98a95508ed6944664 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py311hd18a35c_0.conda#be34c90cce87090d24da64a7c239ca96 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-26_linux64_openblas.conda#ac52800af2e0c0e7dac770b435ce768a +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-28_h59b9bed_openblas.conda#73e2a99fdeb8531d50168987378fda8a https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.11.1-h332b0f4_0.conda#2b3e0081006dc21e8bf53a91c83a055c https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda#0ea6510969e1296cc19966fad481f6de @@ -118,7 +118,7 @@ https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.1-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_1.conda#856b387c270e9eaf6e41e978057a2b62 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py311h9ecbd09_1.conda#b1796d741ca619dbacb79917b20e5a05 -https://conda.anaconda.org/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_1.conda#f26ec986456c30f6dff154b670ae140f +https://conda.anaconda.org/conda-forge/noarch/pytz-2025.1-pyhd8ed1ab_0.conda#d451ccded808abf6511f0a2ac9bb9dcc https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py311h2dc5d0c_2.conda#014417753f948da1f70d132b2de573be https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda#8f28e299c11afdd79e0ec1e279dcdc52 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 @@ -133,22 +133,22 @@ https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3cc595284c5e8f0f9900a9b228a332 -https://conda.anaconda.org/conda-forge/noarch/babel-2.16.0-pyhd8ed1ab_1.conda#3e23f7db93ec14c80525257d8affac28 +https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311hf29c0ef_0.conda#55553ecd5328336368db611f350b7039 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.10-py311h2dc5d0c_0.conda#2a772b30e69ba8319651e9f3ab01608f -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.55.5-py311h2dc5d0c_0.conda#2186378b15a749a0dd6f4b6c2a06b528 -https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_1.conda#825927dc7b0f287ef8d4d0011bb113b1 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.56.0-py311h2dc5d0c_0.conda#ca3692015a53c7fcc248a324a540c54c +https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.4-nompi_h2d575fe_105.conda#d76fff0092b6389a12134ddebc0929bd https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda#f4b39bf00c69f56ac01e020ebfac066c https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda#2752a6ed44105bfb18c9bef1177d9dcd https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-26_linux64_openblas.conda#ebcc5f37a435aa3c19640533c82f8d76 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-28_he106b2a_openblas.conda#4e20a1c00b4e8a984aac0f6cce59e3ac https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-26_linux64_openblas.conda#3792604c43695d6a273bc5faaac47d48 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-28_h7ac8fdf_openblas.conda#069f40bfbf1dc55c83ddb07fc6a6ef8d https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_2.conda#04e691b9fadd93a8a9fad87a81d4fd8f +https://conda.anaconda.org/conda-forge/noarch/pip-25.0-pyh8b19718_0.conda#c2548760a02ed818f92dd0d8c81b55b4 https://conda.anaconda.org/conda-forge/linux-64/proj-9.5.1-h0054346_0.conda#398cabfd9bd75e90d0901db95224f25f https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.0-pyh29332c3_0.conda#46276968030688a25257b08772c418fc https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda#799ed216dc6af62520f32aa39bc1c2bb @@ -180,7 +180,7 @@ https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py311h9ecbd09_1.co https://conda.anaconda.org/conda-forge/noarch/nox-2024.10.9-pyhd8ed1ab_1.conda#74adbad34c17927dad683cfc2f57cce5 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.1-py311hc1ac118_0.conda#d295a28b9b897945739417e8ed818f82 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.1.0-hd8ed1ab_1.conda#4b2757cbafd866a23faba9dd2b6fd43e -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.6-py311h2fdb869_2.conda#4c78235905053663d1c9e23df3f11b65 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.7-py311h2fdb869_0.conda#75f428f392207807643fa016a7c57ad8 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py311h9f3472d_0.conda#555b148cafbd96b658499060d5e11a65 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.39.0-hf413ef6_1.conda#63ea3e2f32daf4670182a3e6aad0b47b diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index c2ca3955..b8632f5d 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -3,7 +3,7 @@ # input_hash: e86d945e803f06926278032cd38065b8f5ad074d360d325088b9a2f395cf50c0 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.12.14-hbcca054_0.conda#720523eb0d6a9b0f6120c16b2aa4e7de +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda#19f3a56f68d2fd06c516076bff482c52 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda#0424ae29b104430108f5218a66db7260 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda#dbcace4706afdfb7eb891f7b37d07c04 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda#048b02e3962f066da18efe3a21b77672 @@ -18,11 +18,11 @@ https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda#db833e03127376d461e1e13e76f09b6c https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda#e39480b9ca41323497b05492a63bc35b https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hd5240d6_1.conda#9822b874ea29af082e5d36098d25427d -https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.3-hb9d3cd8_1.conda#2ecf2f1c7e4e21fcfe6423a51a992d84 +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda#42d5b6a0f30d3c10cd88cb8584fda1cb https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda#234a5554c53625688d51062645337328 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_2.conda#04b34b9a40cdc48cfdab261ab176ff74 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda#4ce6875f75469b2757a65e10a5d05e31 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 @@ -32,7 +32,7 @@ https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.0-h5888daf_0.conda#40b https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de -https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20240808-pl5321h7949ede_0.conda#8247f80f3dc464d9322e85007e307fe8 +https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_1.conda#f1fd30127802683586f768875127a987 @@ -40,7 +40,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.45-h943b412_0.conda#85cbdaacad93808395ac295b5667d25b +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.46-h943b412_0.conda#adcf7bacff219488e29cfa95a2abd8f7 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.48.0-hee588c1_1.conda#3fa05c528d8a1e2a67bbf1e36f22d3bc https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda#be2de152d8073ef1c01b7728475f2fe7 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda#8371ac6457591af2cf6159439c1fd051 @@ -71,11 +71,11 @@ https://conda.anaconda.org/conda-forge/linux-64/python-3.12.8-h9e4cc4f_1_cpython https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.48.0-h9eae976_1.conda#0ca48fd3357c877f21ea4440fe18e2b7 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.10-h4f16b4b_1.conda#125f34a17d7b4bea418a83904ea82ea6 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.11-h4f16b4b_0.conda#b6eb6d0cb323179af168df8fe16fb0a1 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.5.2-pyhd8ed1ab_0.conda#4229aeacda5e2878871ce03b39d3e11f -https://conda.anaconda.org/conda-forge/noarch/attrs-24.3.0-pyh71513ae_0.conda#356927ace43302bf6f5926e2a58dae6a +https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda#2cc3f588512f04f3a0c64b4e9bedc02d https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda#b0b867af6fc74b2a0aa206da29c0f3cf @@ -94,7 +94,7 @@ https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda#7f402b4a1007ee355bc50ce4d24d4a57 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.12.0-pyhd8ed1ab_0.conda#e041ad4c43ab5e10c74587f95378ebc7 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.2.0-pyhd8ed1ab_0.conda#d9ea16b71920b03beafc17fcca16df90 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 @@ -102,7 +102,7 @@ https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.b https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.1-pyhd8ed1ab_1.conda#ae376af0a29183e98a95508ed6944664 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.8-py312h84d6215_0.conda#6713467dc95509683bfa3aca08524e8a -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-26_linux64_openblas.conda#ac52800af2e0c0e7dac770b435ce768a +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-28_h59b9bed_openblas.conda#73e2a99fdeb8531d50168987378fda8a https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.11.1-h332b0f4_0.conda#2b3e0081006dc21e8bf53a91c83a055c https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda#0ea6510969e1296cc19966fad481f6de @@ -118,7 +118,7 @@ https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.1-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_1.conda#856b387c270e9eaf6e41e978057a2b62 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f0_1.conda#39aed2afe4d0cf76ab3d6b09eecdbea7 -https://conda.anaconda.org/conda-forge/noarch/pytz-2024.2-pyhd8ed1ab_1.conda#f26ec986456c30f6dff154b670ae140f +https://conda.anaconda.org/conda-forge/noarch/pytz-2025.1-pyhd8ed1ab_0.conda#d451ccded808abf6511f0a2ac9bb9dcc https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h178313f_2.conda#cf2485f39740de96e2a7f2bb18ed2fee https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda#8f28e299c11afdd79e0ec1e279dcdc52 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 @@ -133,22 +133,22 @@ https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3cc595284c5e8f0f9900a9b228a332 -https://conda.anaconda.org/conda-forge/noarch/babel-2.16.0-pyhd8ed1ab_1.conda#3e23f7db93ec14c80525257d8affac28 +https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda#a861504bbea4161a9170b85d4d2be840 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.10-py312h178313f_0.conda#df113f58bdfc79c98f5e07b6bd3eb4c2 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.55.5-py312h178313f_0.conda#3b2d05c3be2f99fe5c40929685a6ed2c -https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_1.conda#825927dc7b0f287ef8d4d0011bb113b1 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.56.0-py312h178313f_0.conda#2f8a66f2f9eb931cdde040d02c6ab54c +https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.4-nompi_h2d575fe_105.conda#d76fff0092b6389a12134ddebc0929bd https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda#f4b39bf00c69f56ac01e020ebfac066c https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda#2752a6ed44105bfb18c9bef1177d9dcd https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-26_linux64_openblas.conda#ebcc5f37a435aa3c19640533c82f8d76 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-28_he106b2a_openblas.conda#4e20a1c00b4e8a984aac0f6cce59e3ac https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-26_linux64_openblas.conda#3792604c43695d6a273bc5faaac47d48 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-28_h7ac8fdf_openblas.conda#069f40bfbf1dc55c83ddb07fc6a6ef8d https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_2.conda#04e691b9fadd93a8a9fad87a81d4fd8f +https://conda.anaconda.org/conda-forge/noarch/pip-25.0-pyh8b19718_0.conda#c2548760a02ed818f92dd0d8c81b55b4 https://conda.anaconda.org/conda-forge/linux-64/proj-9.5.1-h0054346_0.conda#398cabfd9bd75e90d0901db95224f25f https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.0-pyh29332c3_0.conda#46276968030688a25257b08772c418fc https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda#799ed216dc6af62520f32aa39bc1c2bb @@ -180,7 +180,7 @@ https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h66e93f0_1.co https://conda.anaconda.org/conda-forge/noarch/nox-2024.10.9-pyhd8ed1ab_1.conda#74adbad34c17927dad683cfc2f57cce5 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.1-py312h180e4f1_0.conda#355bcf0f629159c9bd10a406cd8b6c3a https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.1.0-hd8ed1ab_1.conda#4b2757cbafd866a23faba9dd2b6fd43e -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.6-py312h391bc85_2.conda#eb476b4975ea28ac12ff469063a71f5d +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.7-py312h391bc85_0.conda#3491bd7e78aa7407c965312c4a5a9254 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py312hc0a28a1_0.conda#8b5b812d4c18cb37bda7a7c8d3a6acb3 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.39.0-hf413ef6_1.conda#63ea3e2f32daf4670182a3e6aad0b47b From 2b204f35aa9369ba951f815e414257db71ecf215 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 12 Feb 2025 14:49:04 +0000 Subject: [PATCH 420/583] chore: update pre-commit hooks (#610) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/pre-commit/mirrors-mypy: v1.14.1 → v1.15.0](https://github.com/pre-commit/mirrors-mypy/compare/v1.14.1...v1.15.0) - [github.com/astral-sh/ruff-pre-commit: v0.9.4 → v0.9.6](https://github.com/astral-sh/ruff-pre-commit/compare/v0.9.4...v0.9.6) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 198e50e9..d696c088 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -65,7 +65,7 @@ repos: additional_dependencies: [tomli] - repo: https://github.com/pre-commit/mirrors-mypy - rev: 'v1.14.1' + rev: 'v1.15.0' hooks: - id: mypy exclude: 'noxfile\.py|docs/conf\.py' @@ -78,7 +78,7 @@ repos: types: [file, python] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.9.4" + rev: "v0.9.6" hooks: - id: ruff types: [file, python] From 353d82af703786e6e26b607ff54ee18eadf23796 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Feb 2025 09:32:41 +0000 Subject: [PATCH 421/583] Bump scitools/workflows in the dependencies group (#611) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2025.02.0 to 2025.02.1 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.02.0...2025.02.1) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index b2a81b63..cffffef3 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.02.0 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.02.1 diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 36de6736..c77b1531 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.02.0 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.02.1 secrets: inherit From e4023a52bb8b2998e7abce94632ca24b05286846 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 20 Feb 2025 10:40:13 +0000 Subject: [PATCH 422/583] Bump scitools/workflows in the dependencies group (#612) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2025.02.1 to 2025.02.2 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.02.1...2025.02.2) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index cffffef3..cedf6476 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.02.1 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.02.2 diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index c77b1531..bd60c3b6 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.02.1 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.02.2 secrets: inherit From c67262c5f274771cdcf7b8459c4ad34731dab888 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 24 Feb 2025 09:37:11 +0000 Subject: [PATCH 423/583] Updated environment lockfiles (#613) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 65 ++++++++++++------------ requirements/locks/py311-linux-64.lock | 68 ++++++++++++++------------ requirements/locks/py312-linux-64.lock | 64 ++++++++++++------------ 3 files changed, 104 insertions(+), 93 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 67049232..9101aa21 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -6,7 +6,7 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.ta https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda#19f3a56f68d2fd06c516076bff482c52 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-5_cp310.conda#2921c34715e74b3587b4cff4d36844f9 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda#dbcace4706afdfb7eb891f7b37d07c04 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda#048b02e3962f066da18efe3a21b77672 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda#cc3573974587f12dda90d96e3e55a702 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d @@ -16,14 +16,16 @@ https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda#e https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda#8dfae1d2e74767e9ce36d5fa0d8605db https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda#db833e03127376d461e1e13e76f09b6c +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda#e3eb7806380bc8bcecba6d749ad5f026 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda#e39480b9ca41323497b05492a63bc35b https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hd5240d6_1.conda#9822b874ea29af082e5d36098d25427d +https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda#42d5b6a0f30d3c10cd88cb8584fda1cb https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda#234a5554c53625688d51062645337328 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda#4ce6875f75469b2757a65e10a5d05e31 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda#41adf927e746dc75ecf0ef841c454e48 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 @@ -34,14 +36,12 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.co https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_1.conda#f1fd30127802683586f768875127a987 -https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.46-h943b412_0.conda#adcf7bacff219488e29cfa95a2abd8f7 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.48.0-hee588c1_1.conda#3fa05c528d8a1e2a67bbf1e36f22d3bc +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda#55199e2ae2c3651f6f9b2a447b47bdc9 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda#73cea06049cc4174578b432320a003b8 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda#be2de152d8073ef1c01b7728475f2fe7 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda#8371ac6457591af2cf6159439c1fd051 https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 @@ -55,32 +55,32 @@ https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.con https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_0.conda#3fe5420e4da42d8110c28f21de6cc127 +https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 +https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.124-hb9d3cd8_0.conda#8bc89311041d7fcb510238cf0848ccae https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_1.conda#62857b389e42b36b686331bec0922050 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.5-h0d44e9d_1.conda#f5b05674697ae7d2c5932766695945e1 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda#0a4d0252248ef9a0f88f2ba8b8a08e12 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/python-3.10.16-he725a3c_1_cpython.conda#b887811a901b3aa622a92caf03bc8917 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.48.0-h9eae976_1.conda#0ca48fd3357c877f21ea4440fe18e2b7 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.49.1-h9eae976_1.conda#069213b4f57ec55bbcfaebe415c758f7 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.11-h4f16b4b_0.conda#b6eb6d0cb323179af168df8fe16fb0a1 -https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.5.2-pyhd8ed1ab_0.conda#4229aeacda5e2878871ce03b39d3e11f https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda#2cc3f588512f04f3a0c64b4e9bedc02d -https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_2.conda#bf502c169c71e3c6ac0d6175addfacc2 -https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.1-pyhd8ed1ab_0.conda#6eb7c1074d938746b195f556abf9a28f -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda#6feb87357ecd66733be3279f16a8c400 +https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.2-pyhd8ed1ab_0.conda#bf9c1698e819fab31f67dbab4256f7ba +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda#c207fa5ac7ea99b149344385a9c0880d https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/linux-64/chardet-5.2.0-py310hff52083_2.conda#e94bf593fe645f6b85a9c8b2d52caae6 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda#e83a31202d1c0a000fce3e9cf3825875 @@ -102,10 +102,11 @@ https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.b https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.1-pyhd8ed1ab_1.conda#ae376af0a29183e98a95508ed6944664 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py310h3788b33_0.conda#4186d9b4d004b0fe0de6aa62496fb48a -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-28_h59b9bed_openblas.conda#73e2a99fdeb8531d50168987378fda8a -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.11.1-h332b0f4_0.conda#2b3e0081006dc21e8bf53a91c83a055c +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda#728dbebd0f7a20337218beacffd37916 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.12.1-h332b0f4_0.conda#45e9dc4e7b25e2841deb392be085500e https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda#0ea6510969e1296cc19966fad481f6de +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.6-h8d12d68_0.conda#328382c0e0ca648e5c189d5ec336c604 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py310h89163eb_1.conda#8ce3f0332fd6de0d737e2911d329523f https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 @@ -135,57 +136,59 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0. https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3cc595284c5e8f0f9900a9b228a332 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h8deb56e_0.conda#1fc24a3196ad5ede2a68148be61894f4 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.10-py310h89163eb_0.conda#f9bf6ea6ddf8349750f1b455f603b0ae +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.12-py310h89163eb_0.conda#6fdad60a1f9adce8c1bf2eca277b3cc8 +https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.0-pyh29332c3_0.conda#b1ed099fbbf189bf23967ed938316d05 https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.56.0-py310h89163eb_0.conda#cd3125e1924bd8699dac9989652bca74 https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.4-nompi_h2d575fe_105.conda#d76fff0092b6389a12134ddebc0929bd +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h2d575fe_109.conda#e7a7a6e6f70553a31e6e79c65768d089 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda#f4b39bf00c69f56ac01e020ebfac066c +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda#2752a6ed44105bfb18c9bef1177d9dcd -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-28_he106b2a_openblas.conda#4e20a1c00b4e8a984aac0f6cce59e3ac +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda#abb32c727da370c481a1c206f5159ce9 https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-28_h7ac8fdf_openblas.conda#069f40bfbf1dc55c83ddb07fc6a6ef8d +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda#452b98eafe050ecff932f0ec832dd03f https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/noarch/pip-25.0-pyh8b19718_0.conda#c2548760a02ed818f92dd0d8c81b55b4 +https://conda.anaconda.org/conda-forge/noarch/pip-25.0.1-pyh8b19718_0.conda#79b5c1440aedc5010f687048d9103628 https://conda.anaconda.org/conda-forge/linux-64/proj-9.5.1-h0054346_0.conda#398cabfd9bd75e90d0901db95224f25f https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.0-pyh29332c3_0.conda#46276968030688a25257b08772c418fc https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda#799ed216dc6af62520f32aa39bc1c2bb https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda#b6a408c64b78ec7b779a3e5c7a902433 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.29.1-pyhd8ed1ab_0.conda#de06336c9833cffd2a4bd6f27c4cf8ea +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.29.2-pyhd8ed1ab_0.conda#d8a3ee355d5ecc9ee2565cafba1d3573 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.6.1-hd8ed1ab_0.conda#7f46575a91b1307441abc235d01cab66 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h03adeef_0.conda#b1df5affe904efe82ef890826b68881d -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h5ddbaa4_116.conda#f51573abc223afed7e5374f34135ce05 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.2-py310hefbff90_0.conda#c5d8e63603a198e20eea67a12d039154 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h00e09a9_116.conda#417864857bdb6c2be2e923e89bffd2e8 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.3-py310hefbff90_0.conda#76ddfda2c3fdab3f39e567fc08307531 https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py310h7e6dc6c_0.conda#14d300b9e1504748e70cc6499a7b4d25 -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.0-py310h2e9f774_0.conda#42a3ea3c283d930ae6d156b97ffe4740 +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py310h2e9f774_0.conda#1bd6b04600df304f7718638b0e21b846 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda#79963c319d1be62c8fd3e34555816e01 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_1.conda#ac738a7f524d1b157e53fb9734f85e0e https://conda.anaconda.org/conda-forge/noarch/tox-4.24.1-pyh29332c3_0.conda#81d5a93243af5f2c6addb3c8a16b4ac6 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310h3788b33_5.conda#e05b0475166b68c9dc4d7937e0315654 -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha39cb0e_1.conda#f49de34fb99934bf49ab330b5caffd64 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.19.0-py310h5764c6d_0.tar.bz2#74ea667169b1296fb31bb86f13abfa49 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310hf462985_1.conda#c2d5289e6cbcecf2c549e01772fe5274 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.1-py310h3788b33_0.conda#f993b13665fc2bb262b30217c815d137 https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.6-pyhd8ed1ab_0.conda#d751c3b4a973ed15b57be90d68c716d1 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.7-pyhd8ed1ab_0.conda#1027da8216437467b4588fa79e143d89 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py310ha75aee5_1.conda#48781b625a5c7701e04d222752cb2f62 -https://conda.anaconda.org/conda-forge/noarch/nox-2024.10.9-pyhd8ed1ab_1.conda#74adbad34c17927dad683cfc2f57cce5 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.1-py310hfa6ec8c_0.conda#a24baa04ee53ee3078ac1856887c3dea +https://conda.anaconda.org/conda-forge/noarch/nox-2025.2.9-pyhd8ed1ab_0.conda#296bd3a16fb2601191e9f32b7cae531e +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.conda#8c29cd33b64b2eb78597fa28b5595c8d https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.1.0-hd8ed1ab_1.conda#4b2757cbafd866a23faba9dd2b6fd43e https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.7-py310had3dfd6_0.conda#27f3e05fb7dd7c300a5567476a9f92d8 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py310hf462985_0.conda#c31938674e4cda43617a4d70f99ffd0c -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.39.0-hf413ef6_1.conda#63ea3e2f32daf4670182a3e6aad0b47b +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.40.0-h8bb6dbc_0.conda#52c8d85ec289a75e7c731932f45c533d https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.0-py310h68603db_0.conda#409498230a11a71578ed49d006165249 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py310h5146f0f_101.conda#3e17df8e4192431b85afc89a539f6c28 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py310h9f0ad05_101.conda#f58947ff305aa8be0b33769ee67ddb10 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.1.0-pyha770c72_0.conda#5353f5eb201a9415b12385e35ed1148d https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py310h5eaa309_0.conda#ca4d935c1715f95b6e86846ad1675a2b diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 312503a1..ddbc4813 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -6,7 +6,7 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.ta https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda#19f3a56f68d2fd06c516076bff482c52 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-5_cp311.conda#139a8d40c8a2f430df31048949e450de https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda#dbcace4706afdfb7eb891f7b37d07c04 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda#048b02e3962f066da18efe3a21b77672 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda#cc3573974587f12dda90d96e3e55a702 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d @@ -16,14 +16,16 @@ https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda#e https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda#8dfae1d2e74767e9ce36d5fa0d8605db https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda#db833e03127376d461e1e13e76f09b6c +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda#e3eb7806380bc8bcecba6d749ad5f026 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda#e39480b9ca41323497b05492a63bc35b https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hd5240d6_1.conda#9822b874ea29af082e5d36098d25427d +https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda#42d5b6a0f30d3c10cd88cb8584fda1cb https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda#234a5554c53625688d51062645337328 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda#4ce6875f75469b2757a65e10a5d05e31 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda#41adf927e746dc75ecf0ef841c454e48 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 @@ -34,14 +36,12 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.co https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_1.conda#f1fd30127802683586f768875127a987 -https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.46-h943b412_0.conda#adcf7bacff219488e29cfa95a2abd8f7 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.48.0-hee588c1_1.conda#3fa05c528d8a1e2a67bbf1e36f22d3bc +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda#55199e2ae2c3651f6f9b2a447b47bdc9 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda#73cea06049cc4174578b432320a003b8 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda#be2de152d8073ef1c01b7728475f2fe7 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda#8371ac6457591af2cf6159439c1fd051 https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 @@ -55,32 +55,32 @@ https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.con https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_0.conda#3fe5420e4da42d8110c28f21de6cc127 +https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 +https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.124-hb9d3cd8_0.conda#8bc89311041d7fcb510238cf0848ccae https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_1.conda#62857b389e42b36b686331bec0922050 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.5-h0d44e9d_1.conda#f5b05674697ae7d2c5932766695945e1 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda#0a4d0252248ef9a0f88f2ba8b8a08e12 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/python-3.11.11-h9e4cc4f_1_cpython.conda#8387070aa413ce9a8cc35a509fae938b https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.48.0-h9eae976_1.conda#0ca48fd3357c877f21ea4440fe18e2b7 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.49.1-h9eae976_1.conda#069213b4f57ec55bbcfaebe415c758f7 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.11-h4f16b4b_0.conda#b6eb6d0cb323179af168df8fe16fb0a1 -https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.5.2-pyhd8ed1ab_0.conda#4229aeacda5e2878871ce03b39d3e11f https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda#2cc3f588512f04f3a0c64b4e9bedc02d -https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hfdbb021_2.conda#d21daab070d76490cb39a8f1d1729d79 -https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.1-pyhd8ed1ab_0.conda#6eb7c1074d938746b195f556abf9a28f -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda#6feb87357ecd66733be3279f16a8c400 +https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.2-pyhd8ed1ab_0.conda#bf9c1698e819fab31f67dbab4256f7ba +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda#c207fa5ac7ea99b149344385a9c0880d https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/linux-64/chardet-5.2.0-py311h38be061_2.conda#00f0ad2aed7e65c9392a067ce7882b28 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda#e83a31202d1c0a000fce3e9cf3825875 @@ -102,10 +102,11 @@ https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.b https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.1-pyhd8ed1ab_1.conda#ae376af0a29183e98a95508ed6944664 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py311hd18a35c_0.conda#be34c90cce87090d24da64a7c239ca96 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-28_h59b9bed_openblas.conda#73e2a99fdeb8531d50168987378fda8a -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.11.1-h332b0f4_0.conda#2b3e0081006dc21e8bf53a91c83a055c +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda#728dbebd0f7a20337218beacffd37916 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.12.1-h332b0f4_0.conda#45e9dc4e7b25e2841deb392be085500e https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda#0ea6510969e1296cc19966fad481f6de +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.6-h8d12d68_0.conda#328382c0e0ca648e5c189d5ec336c604 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py311h2dc5d0c_1.conda#6565a715337ae279e351d0abd8ffe88a https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 @@ -120,6 +121,7 @@ https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#4 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py311h9ecbd09_1.conda#b1796d741ca619dbacb79917b20e5a05 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.1-pyhd8ed1ab_0.conda#d451ccded808abf6511f0a2ac9bb9dcc https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py311h2dc5d0c_2.conda#014417753f948da1f70d132b2de573be +https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-3.0.0-pyhd8ed1ab_0.conda#a41ef9130d163f14f0d62da0d4c12231 https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda#8f28e299c11afdd79e0ec1e279dcdc52 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e @@ -135,57 +137,59 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0. https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3cc595284c5e8f0f9900a9b228a332 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311hf29c0ef_0.conda#55553ecd5328336368db611f350b7039 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.10-py311h2dc5d0c_0.conda#2a772b30e69ba8319651e9f3ab01608f +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.12-py311h2dc5d0c_0.conda#c91e6ee1716a1893dfbbf67e6831516e +https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.0-pyh29332c3_0.conda#b1ed099fbbf189bf23967ed938316d05 https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.56.0-py311h2dc5d0c_0.conda#ca3692015a53c7fcc248a324a540c54c https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.4-nompi_h2d575fe_105.conda#d76fff0092b6389a12134ddebc0929bd +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h2d575fe_109.conda#e7a7a6e6f70553a31e6e79c65768d089 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda#f4b39bf00c69f56ac01e020ebfac066c +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda#2752a6ed44105bfb18c9bef1177d9dcd -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-28_he106b2a_openblas.conda#4e20a1c00b4e8a984aac0f6cce59e3ac +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda#abb32c727da370c481a1c206f5159ce9 https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-28_h7ac8fdf_openblas.conda#069f40bfbf1dc55c83ddb07fc6a6ef8d +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda#452b98eafe050ecff932f0ec832dd03f https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/noarch/pip-25.0-pyh8b19718_0.conda#c2548760a02ed818f92dd0d8c81b55b4 +https://conda.anaconda.org/conda-forge/noarch/pip-25.0.1-pyh8b19718_0.conda#79b5c1440aedc5010f687048d9103628 https://conda.anaconda.org/conda-forge/linux-64/proj-9.5.1-h0054346_0.conda#398cabfd9bd75e90d0901db95224f25f https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.0-pyh29332c3_0.conda#46276968030688a25257b08772c418fc https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda#799ed216dc6af62520f32aa39bc1c2bb https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda#b6a408c64b78ec7b779a3e5c7a902433 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.29.1-pyhd8ed1ab_0.conda#de06336c9833cffd2a4bd6f27c4cf8ea +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.29.2-pyhd8ed1ab_0.conda#d8a3ee355d5ecc9ee2565cafba1d3573 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.6.1-hd8ed1ab_0.conda#7f46575a91b1307441abc235d01cab66 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h03adeef_0.conda#b1df5affe904efe82ef890826b68881d -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h5ddbaa4_116.conda#f51573abc223afed7e5374f34135ce05 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.2-py311h5d046bc_0.conda#15059981f9cc9b79fff94cc17264356e +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h00e09a9_116.conda#417864857bdb6c2be2e923e89bffd2e8 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.3-py311h5d046bc_0.conda#6de29798b2e278c56f1e87b7d6e693bb https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py311h1322bbf_0.conda#9f4f5593335f76c1dbf7381c11fe7155 -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.0-py311h0f98d5a_0.conda#22531205a97c116251713008d65dfefd +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py311h0f98d5a_0.conda#2c17ffd168aafaa12be759e300133e1c https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda#79963c319d1be62c8fd3e34555816e01 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_1.conda#ac738a7f524d1b157e53fb9734f85e0e https://conda.anaconda.org/conda-forge/noarch/tox-4.24.1-pyh29332c3_0.conda#81d5a93243af5f2c6addb3c8a16b4ac6 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hd18a35c_5.conda#4e8447ca8558a203ec0577b4730073f3 -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311hbc35293_1.conda#aec590674ba365e50ae83aa2d6e1efae +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.19.0-py311hd4cff14_0.tar.bz2#056b3271f46abaa4673c8c6783283a07 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h9f3472d_1.conda#2c3c4f115d28ed9e001a271d5d8585aa https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.1-py311hd18a35c_0.conda#351cb68d2081e249069748b6e60b3cd2 https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.6-pyhd8ed1ab_0.conda#d751c3b4a973ed15b57be90d68c716d1 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.7-pyhd8ed1ab_0.conda#1027da8216437467b4588fa79e143d89 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py311h9ecbd09_1.conda#28d6b63784b350a2906dc264ad8c7f2a -https://conda.anaconda.org/conda-forge/noarch/nox-2024.10.9-pyhd8ed1ab_1.conda#74adbad34c17927dad683cfc2f57cce5 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.1-py311hc1ac118_0.conda#d295a28b9b897945739417e8ed818f82 +https://conda.anaconda.org/conda-forge/noarch/nox-2025.2.9-pyhd8ed1ab_0.conda#296bd3a16fb2601191e9f32b7cae531e +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py311h8f841c2_0.conda#5ec0a1732a05376241e1e4c6d50e0e91 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.1.0-hd8ed1ab_1.conda#4b2757cbafd866a23faba9dd2b6fd43e https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.7-py311h2fdb869_0.conda#75f428f392207807643fa016a7c57ad8 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py311h9f3472d_0.conda#555b148cafbd96b658499060d5e11a65 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.39.0-hf413ef6_1.conda#63ea3e2f32daf4670182a3e6aad0b47b +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.40.0-h8bb6dbc_0.conda#52c8d85ec289a75e7c731932f45c533d https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.0-py311h2b939e6_0.conda#79239585ea50c427415ef629534bb3aa -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py311h7c29e4f_101.conda#d966f11d28c699da7e9de2aa2f323a4f +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py311hae66bec_101.conda#776c96dd51168ef9da0d63d5e49785f5 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.1.0-pyha770c72_0.conda#5353f5eb201a9415b12385e35ed1148d https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py311h7db5c69_0.conda#20ba399d57a2b5de789a5b24341481a1 @@ -198,5 +202,5 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jquery-4.1-pyhd8ed1ab_1.conda#403185829255321ea427333f7773dd1f https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-3.0.1-pyha770c72_0.conda#740536f8a54250b1964e494c0bf5c9c3 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda#00534ebcc0375929b45c3039b5ba7636 -https://conda.anaconda.org/conda-forge/noarch/sphinx-8.1.3-pyhd8ed1ab_1.conda#1a3281a0dc355c02b5506d87db2d78ac +https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.0-pyhd8ed1ab_0.conda#b6d68f4484eb21a7daa9123fec3900a2 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda#3bc61f7161d28137797e038263c04c54 diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index b8632f5d..3e0d94e5 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -6,7 +6,7 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.ta https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda#19f3a56f68d2fd06c516076bff482c52 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda#0424ae29b104430108f5218a66db7260 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda#dbcace4706afdfb7eb891f7b37d07c04 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda#048b02e3962f066da18efe3a21b77672 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda#cc3573974587f12dda90d96e3e55a702 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d @@ -16,14 +16,16 @@ https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda#e https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda#8dfae1d2e74767e9ce36d5fa0d8605db https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda#db833e03127376d461e1e13e76f09b6c +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda#e3eb7806380bc8bcecba6d749ad5f026 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda#e39480b9ca41323497b05492a63bc35b https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hd5240d6_1.conda#9822b874ea29af082e5d36098d25427d +https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda#42d5b6a0f30d3c10cd88cb8584fda1cb https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda#234a5554c53625688d51062645337328 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-h7b32b05_1.conda#4ce6875f75469b2757a65e10a5d05e31 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda#41adf927e746dc75ecf0ef841c454e48 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 @@ -34,14 +36,12 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.co https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_1.conda#f1fd30127802683586f768875127a987 -https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.46-h943b412_0.conda#adcf7bacff219488e29cfa95a2abd8f7 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.48.0-hee588c1_1.conda#3fa05c528d8a1e2a67bbf1e36f22d3bc +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda#55199e2ae2c3651f6f9b2a447b47bdc9 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda#73cea06049cc4174578b432320a003b8 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda#be2de152d8073ef1c01b7728475f2fe7 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda#8371ac6457591af2cf6159439c1fd051 https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 @@ -58,18 +58,18 @@ https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f0 https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 +https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.124-hb9d3cd8_0.conda#8bc89311041d7fcb510238cf0848ccae https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_1.conda#62857b389e42b36b686331bec0922050 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.5-h0d44e9d_1.conda#f5b05674697ae7d2c5932766695945e1 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda#0a4d0252248ef9a0f88f2ba8b8a08e12 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba -https://conda.anaconda.org/conda-forge/linux-64/python-3.12.8-h9e4cc4f_1_cpython.conda#7fd2fd79436d9b473812f14e86746844 +https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_0_cpython.conda#5665f0079432f8848079c811cdb537d5 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.48.0-h9eae976_1.conda#0ca48fd3357c877f21ea4440fe18e2b7 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.49.1-h9eae976_1.conda#069213b4f57ec55bbcfaebe415c758f7 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.11-h4f16b4b_0.conda#b6eb6d0cb323179af168df8fe16fb0a1 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 @@ -79,8 +79,8 @@ https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda#2c https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda#b0b867af6fc74b2a0aa206da29c0f3cf -https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.1-pyhd8ed1ab_0.conda#6eb7c1074d938746b195f556abf9a28f -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.12.14-pyhd8ed1ab_0.conda#6feb87357ecd66733be3279f16a8c400 +https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.2-pyhd8ed1ab_0.conda#bf9c1698e819fab31f67dbab4256f7ba +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda#c207fa5ac7ea99b149344385a9c0880d https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/linux-64/chardet-5.2.0-py312h7900ff3_2.conda#01b1679726675bf49851cdb507de4a24 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda#e83a31202d1c0a000fce3e9cf3825875 @@ -102,10 +102,11 @@ https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.b https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.1-pyhd8ed1ab_1.conda#ae376af0a29183e98a95508ed6944664 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.8-py312h84d6215_0.conda#6713467dc95509683bfa3aca08524e8a -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-28_h59b9bed_openblas.conda#73e2a99fdeb8531d50168987378fda8a -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.11.1-h332b0f4_0.conda#2b3e0081006dc21e8bf53a91c83a055c +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda#728dbebd0f7a20337218beacffd37916 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.12.1-h332b0f4_0.conda#45e9dc4e7b25e2841deb392be085500e https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda#0ea6510969e1296cc19966fad481f6de +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.6-h8d12d68_0.conda#328382c0e0ca648e5c189d5ec336c604 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda#eb227c3e0bf58f5bd69c0532b157975b https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 @@ -120,6 +121,7 @@ https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#4 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f0_1.conda#39aed2afe4d0cf76ab3d6b09eecdbea7 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.1-pyhd8ed1ab_0.conda#d451ccded808abf6511f0a2ac9bb9dcc https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h178313f_2.conda#cf2485f39740de96e2a7f2bb18ed2fee +https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-3.0.0-pyhd8ed1ab_0.conda#a41ef9130d163f14f0d62da0d4c12231 https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda#8f28e299c11afdd79e0ec1e279dcdc52 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e @@ -135,36 +137,38 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0. https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3cc595284c5e8f0f9900a9b228a332 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda#a861504bbea4161a9170b85d4d2be840 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.10-py312h178313f_0.conda#df113f58bdfc79c98f5e07b6bd3eb4c2 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.12-py312h178313f_0.conda#5be370f84dac4fbd6596db97924ee101 +https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.0-pyh29332c3_0.conda#b1ed099fbbf189bf23967ed938316d05 https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.56.0-py312h178313f_0.conda#2f8a66f2f9eb931cdde040d02c6ab54c https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.4-nompi_h2d575fe_105.conda#d76fff0092b6389a12134ddebc0929bd +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h2d575fe_109.conda#e7a7a6e6f70553a31e6e79c65768d089 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda#f4b39bf00c69f56ac01e020ebfac066c +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda#2752a6ed44105bfb18c9bef1177d9dcd -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-28_he106b2a_openblas.conda#4e20a1c00b4e8a984aac0f6cce59e3ac +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda#abb32c727da370c481a1c206f5159ce9 https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-28_h7ac8fdf_openblas.conda#069f40bfbf1dc55c83ddb07fc6a6ef8d +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda#452b98eafe050ecff932f0ec832dd03f https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/noarch/pip-25.0-pyh8b19718_0.conda#c2548760a02ed818f92dd0d8c81b55b4 +https://conda.anaconda.org/conda-forge/noarch/pip-25.0.1-pyh8b19718_0.conda#79b5c1440aedc5010f687048d9103628 https://conda.anaconda.org/conda-forge/linux-64/proj-9.5.1-h0054346_0.conda#398cabfd9bd75e90d0901db95224f25f https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.0-pyh29332c3_0.conda#46276968030688a25257b08772c418fc https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda#799ed216dc6af62520f32aa39bc1c2bb https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda#b6a408c64b78ec7b779a3e5c7a902433 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.29.1-pyhd8ed1ab_0.conda#de06336c9833cffd2a4bd6f27c4cf8ea +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.29.2-pyhd8ed1ab_0.conda#d8a3ee355d5ecc9ee2565cafba1d3573 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.6.1-hd8ed1ab_0.conda#7f46575a91b1307441abc235d01cab66 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h03adeef_0.conda#b1df5affe904efe82ef890826b68881d -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h5ddbaa4_116.conda#f51573abc223afed7e5374f34135ce05 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.2-py312h72c5963_0.conda#7e984cb31e0366d1812096b41b361425 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h00e09a9_116.conda#417864857bdb6c2be2e923e89bffd2e8 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.3-py312h72c5963_0.conda#d117e16d71afa469ea26c3d6896291da https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py312h80c1187_0.conda#d3894405f05b2c0f351d5de3ae26fa9c -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.0-py312he630544_0.conda#427799f15b36751761941f4cbd7d780f +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py312he630544_0.conda#ed6a6bbd26559986ecd90b9a1797cbf0 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda#79963c319d1be62c8fd3e34555816e01 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_1.conda#ac738a7f524d1b157e53fb9734f85e0e @@ -174,18 +178,18 @@ https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312hc0a28a1_1.conda#990033147b0a998e756eaaed6b28f48d https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.1-py312h68727a3_0.conda#f5fbba0394ee45e9a64a73c2a994126a https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.6-pyhd8ed1ab_0.conda#d751c3b4a973ed15b57be90d68c716d1 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.7-pyhd8ed1ab_0.conda#1027da8216437467b4588fa79e143d89 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h66e93f0_1.conda#5fef67f50126f40f5966a9451661280d -https://conda.anaconda.org/conda-forge/noarch/nox-2024.10.9-pyhd8ed1ab_1.conda#74adbad34c17927dad683cfc2f57cce5 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.1-py312h180e4f1_0.conda#355bcf0f629159c9bd10a406cd8b6c3a +https://conda.anaconda.org/conda-forge/noarch/nox-2025.2.9-pyhd8ed1ab_0.conda#296bd3a16fb2601191e9f32b7cae531e +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py312ha707e6e_0.conda#00b999c5f9d01fb633db819d79186bd4 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.1.0-hd8ed1ab_1.conda#4b2757cbafd866a23faba9dd2b6fd43e https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.7-py312h391bc85_0.conda#3491bd7e78aa7407c965312c4a5a9254 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py312hc0a28a1_0.conda#8b5b812d4c18cb37bda7a7c8d3a6acb3 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.39.0-hf413ef6_1.conda#63ea3e2f32daf4670182a3e6aad0b47b +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.40.0-h8bb6dbc_0.conda#52c8d85ec289a75e7c731932f45c533d https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.0-py312hd3ec401_0.conda#c27a17a8c54c0d35cf83bbc0de8f7f77 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py312ha728dd9_101.conda#7e41ca6012a6bf609539aec0dfee93f7 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py312h21d6d8e_101.conda#0cabc6745882859ec7be35433c7b8f24 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.1.0-pyha770c72_0.conda#5353f5eb201a9415b12385e35ed1148d https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py312hf9745cd_0.conda#ea213e31805199cb7d0da457b879ceed @@ -198,5 +202,5 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jquery-4.1-pyhd8ed1ab_1.conda#403185829255321ea427333f7773dd1f https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-3.0.1-pyha770c72_0.conda#740536f8a54250b1964e494c0bf5c9c3 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda#00534ebcc0375929b45c3039b5ba7636 -https://conda.anaconda.org/conda-forge/noarch/sphinx-8.1.3-pyhd8ed1ab_1.conda#1a3281a0dc355c02b5506d87db2d78ac +https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.0-pyhd8ed1ab_0.conda#b6d68f4484eb21a7daa9123fec3900a2 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda#3bc61f7161d28137797e038263c04c54 From aed2f8b529ab12d8f5d397aa12d9f18b803b56bb Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 25 Feb 2025 09:00:18 +0000 Subject: [PATCH 424/583] chore: update pre-commit hooks (#614) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.9.6 → v0.9.7](https://github.com/astral-sh/ruff-pre-commit/compare/v0.9.6...v0.9.7) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index d696c088..124389fa 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -78,7 +78,7 @@ repos: types: [file, python] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.9.6" + rev: "v0.9.7" hooks: - id: ruff types: [file, python] From 92154cab9620982b4f86348f6ec462279f9a5c9e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Mar 2025 11:36:38 +0000 Subject: [PATCH 425/583] Bump scitools/workflows in the dependencies group (#615) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2025.02.2 to 2025.02.3 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.02.2...2025.02.3) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index cedf6476..87033891 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.02.2 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.02.3 diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index bd60c3b6..1d91e8c0 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.02.2 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.02.3 secrets: inherit From 98462bd6693a42cfa634d370f460f2ec688fd70e Mon Sep 17 00:00:00 2001 From: Elias <110238618+ESadek-MO@users.noreply.github.com> Date: Wed, 12 Mar 2025 11:50:42 +0000 Subject: [PATCH 426/583] Converted test_pickle_message to pytest, and removed reliance on Iris (#620) * converted to pytest, and removed reliance on iris * fixed tmp_path failing, moved dir and adjusted TODO --- .../iris_integration/test_pickle_message.py | 64 ------------------- .../tests/unit/message/test_pickle_message.py | 48 ++++++++++++++ 2 files changed, 48 insertions(+), 64 deletions(-) delete mode 100644 src/iris_grib/tests/integration/iris_integration/test_pickle_message.py create mode 100644 src/iris_grib/tests/unit/message/test_pickle_message.py diff --git a/src/iris_grib/tests/integration/iris_integration/test_pickle_message.py b/src/iris_grib/tests/integration/iris_integration/test_pickle_message.py deleted file mode 100644 index 6a7a8253..00000000 --- a/src/iris_grib/tests/integration/iris_integration/test_pickle_message.py +++ /dev/null @@ -1,64 +0,0 @@ -# Copyright iris-grib contributors -# -# This file is part of iris-grib and is released under the BSD license. -# See LICENSE in the root of the repository for full licensing details. -"""Check that a GribMessage can be pickled.""" - -# Import iris_grib.tests first so that some things can be initialised before -# importing anything else. -import iris_grib.tests as tests - -import pickle - -from iris.tests.integration.test_pickle import Common as PickleCommon - -from iris_grib.message import GribMessage - - -@tests.skip_data -class TestPickleGribMessage(PickleCommon, tests.IrisGribTest): - # NOTE: based on 'Common' from iris.tests.integration.test_pickle. - def setUp(self): - self.path = tests.get_data_path(("GRIB", "fp_units", "hours.grib2")) - - # NOTE: this looks like it is overriding the parent "pickle_cube", but this - # function is *not* the same thing. - # (a) the tests which use pickle_cube are "test_protocol_XXX", and none - # of those currently work (see overrides below). - # (b) the tests which use *this* function are the extra ones below. - # These check only that a GribMessage, and its lazy ".data", can be - # pickled. However, still, neither reads back successfully. - # TODO: resolve this or remove the test. - def pickle_obj(self, obj): - with self.temp_filename(".pkl") as filename: - with open(filename, "wb") as f: - pickle.dump(obj, f) - # NOTE: *ought* to read back + check equal, but it does not work. - # TODO: fix - - # These probably "ought" to work, but currently fail. - # see https://github.com/SciTools/iris-grib/issues/202 - def test_protocol_0(self): - super().test_protocol_0() - - def test_protocol_1(self): - super().test_protocol_1() - - def test_protocol_2(self): - super().test_protocol_2() - - def test(self): - # Check that a GribMessage pickles without errors. - messages = GribMessage.messages_from_filename(self.path) - obj = next(messages) - self.pickle_obj(obj) - - def test_data(self): - # Check that GribMessage.data pickles without errors. - messages = GribMessage.messages_from_filename(self.path) - obj = next(messages).data - self.pickle_obj(obj) - - -if __name__ == "__main__": - tests.main() diff --git a/src/iris_grib/tests/unit/message/test_pickle_message.py b/src/iris_grib/tests/unit/message/test_pickle_message.py new file mode 100644 index 00000000..9d8626d5 --- /dev/null +++ b/src/iris_grib/tests/unit/message/test_pickle_message.py @@ -0,0 +1,48 @@ +# Copyright iris-grib contributors +# +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +"""Check that a GribMessage can be pickled.""" + +# Import iris_grib.tests first so that some things can be initialised before +# importing anything else. +import iris_grib.tests as tests + +import pickle + +import pytest +from iris_grib.message import GribMessage + +MIN_PICKLE_PROTOCOL = 4 + +TESTED_PROTOCOLS = list(range(MIN_PICKLE_PROTOCOL, pickle.HIGHEST_PROTOCOL + 1)) + + +@tests.skip_data +class TestPickleGribMessage: + @pytest.fixture + def messages(self): + path = tests.get_data_path(("GRIB", "fp_units", "hours.grib2")) + return GribMessage.messages_from_filename(path) + + def pickle_obj(self, obj, protocol, tmp_path): + # NOTE: Neither GribMessage, nor its lazy ".data", read back from + # a pickled obj. Currently, this only checks that they can be pickled + # successfully. + filename = tmp_path / ".pkl" + with open(filename, "wb") as f: + pickle.dump(obj, f, protocol) + # TODO: resolve this or remove the test. + # with open(filename, "rb") as f: + # nobj = pickle.load(f) + # assert nobj == obj + + @pytest.mark.parametrize("protocol", TESTED_PROTOCOLS) + def test_message(self, protocol, messages, tmp_path): + obj = next(messages) + self.pickle_obj(obj, protocol, tmp_path) + + @pytest.mark.parametrize("protocol", TESTED_PROTOCOLS) + def test_message_data(self, protocol, messages, tmp_path): + obj = next(messages).data + self.pickle_obj(obj, protocol, tmp_path) From 43ccdcbab6594d8512b1d883dad91dec3343da24 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 12 Mar 2025 12:18:54 +0000 Subject: [PATCH 427/583] chore: update pre-commit hooks (#618) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.9.7 → v0.9.10](https://github.com/astral-sh/ruff-pre-commit/compare/v0.9.7...v0.9.10) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Martin Yeo <40734014+trexfeathers@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 124389fa..db9ffab8 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -78,7 +78,7 @@ repos: types: [file, python] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.9.7" + rev: "v0.9.10" hooks: - id: ruff types: [file, python] From 2a0732b03dae034008daa288d741ef482bf3bf4a Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Wed, 12 Mar 2025 13:02:09 +0000 Subject: [PATCH 428/583] Updated environment lockfiles (#616) Co-authored-by: Lockfile bot Co-authored-by: Martin Yeo <40734014+trexfeathers@users.noreply.github.com> Co-authored-by: Patrick Peglar --- requirements/locks/py310-linux-64.lock | 46 +++++++++++------------ requirements/locks/py311-linux-64.lock | 52 +++++++++++++------------- requirements/locks/py312-linux-64.lock | 50 ++++++++++++------------- 3 files changed, 74 insertions(+), 74 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 9101aa21..898311d5 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -8,20 +8,20 @@ https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-5_cp310.conda#29 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda#dbcace4706afdfb7eb891f7b37d07c04 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda#cc3573974587f12dda90d96e3e55a702 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda#06d02030237f4d5b3d9a7e7d348fe3c6 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda#c151d5eb730e9b7480e6d48c0fc44048 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda#3cb76c3f10d3bc7f1105b2fc9db984df +https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda#ef504d1acbd74b7cc6849ef8af47dd03 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda#e2775acf57efd5af15b8e3d1d74d72d3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda#8dfae1d2e74767e9ce36d5fa0d8605db https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda#db833e03127376d461e1e13e76f09b6c https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda#e3eb7806380bc8bcecba6d749ad5f026 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda#e39480b9ca41323497b05492a63bc35b -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hd5240d6_1.conda#9822b874ea29af082e5d36098d25427d +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda#a2222a6ada71fb478682efe483ce0f92 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda#42d5b6a0f30d3c10cd88cb8584fda1cb -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda#234a5554c53625688d51062645337328 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda#a78c856b6dc6bf4ea8daeb9beaaa3fb0 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 @@ -29,33 +29,33 @@ https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda#4 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 +https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb9d3cd8_0.conda#2ef1822d8168ed5d79ab1bf01088419a https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 -https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.0-h5888daf_0.conda#40b4ab956c90390e407bb177f8a58bab +https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.1-h97f6797_0.conda#5bc18c66111bc94532b0d2df00731c66 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_1.conda#f1fd30127802683586f768875127a987 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda#fb54c4ea68b460c278d26eea89cfbcc3 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda#55199e2ae2c3651f6f9b2a447b47bdc9 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda#73cea06049cc4174578b432320a003b8 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda#be2de152d8073ef1c01b7728475f2fe7 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda#8371ac6457591af2cf6159439c1fd051 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda#c75da67f045c2627f59e6fcb5f4e3a9b https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 -https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 +https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda#3b3e64af585eadfb52bb90b553db5edf https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc -https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 -https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_0.conda#3fe5420e4da42d8110c28f21de6cc127 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_1.conda#02e4e2fa41a6528afba2e54cbc4280ff https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb @@ -75,7 +75,7 @@ https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.49.1-h9eae976_1.conda#0 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.11-h4f16b4b_0.conda#b6eb6d0cb323179af168df8fe16fb0a1 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a -https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.5.2-pyhd8ed1ab_0.conda#4229aeacda5e2878871ce03b39d3e11f +https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.0-pyhd8ed1ab_0.conda#e2f1a8cb369bc66fd2c1cbf68888956d https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda#2cc3f588512f04f3a0c64b4e9bedc02d https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_2.conda#bf502c169c71e3c6ac0d6175addfacc2 @@ -100,7 +100,7 @@ https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.cond https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 -https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.1-pyhd8ed1ab_1.conda#ae376af0a29183e98a95508ed6944664 +https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py310h3788b33_0.conda#4186d9b4d004b0fe0de6aa62496fb48a https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda#728dbebd0f7a20337218beacffd37916 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.12.1-h332b0f4_0.conda#45e9dc4e7b25e2841deb392be085500e @@ -118,10 +118,10 @@ https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.1-pyhd8ed1ab_0.conda#285e237b8f351e85e7574a2c7bfa6d46 https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_1.conda#856b387c270e9eaf6e41e978057a2b62 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac -https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py310ha75aee5_1.conda#8b430470d53744289cb5499bc99a6485 +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py310ha75aee5_2.conda#af6da4542e91edaf59b614ce7e991700 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.1-pyhd8ed1ab_0.conda#d451ccded808abf6511f0a2ac9bb9dcc https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py310h89163eb_2.conda#fd343408e64cf1e273ab7c710da374db -https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda#8f28e299c11afdd79e0ec1e279dcdc52 +https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.2-pyhff2d567_0.conda#9bddfdbf4e061821a1a443f93223be61 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb @@ -143,7 +143,7 @@ https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754f https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h2d575fe_109.conda#e7a7a6e6f70553a31e6e79c65768d089 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda#f4b39bf00c69f56ac01e020ebfac066c https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda#2752a6ed44105bfb18c9bef1177d9dcd +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda#abb32c727da370c481a1c206f5159ce9 https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a @@ -154,10 +154,10 @@ https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0ba https://conda.anaconda.org/conda-forge/noarch/pip-25.0.1-pyh8b19718_0.conda#79b5c1440aedc5010f687048d9103628 https://conda.anaconda.org/conda-forge/linux-64/proj-9.5.1-h0054346_0.conda#398cabfd9bd75e90d0901db95224f25f https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.0-pyh29332c3_0.conda#46276968030688a25257b08772c418fc -https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda#799ed216dc6af62520f32aa39bc1c2bb +https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda#b6a408c64b78ec7b779a3e5c7a902433 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.29.2-pyhd8ed1ab_0.conda#d8a3ee355d5ecc9ee2565cafba1d3573 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.29.3-pyhd8ed1ab_0.conda#87a2061465e55be9a997dd8cf8b5a578 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa @@ -170,24 +170,24 @@ https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py310h7e6dc6c_0.co https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py310h2e9f774_0.conda#1bd6b04600df304f7718638b0e21b846 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda#79963c319d1be62c8fd3e34555816e01 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 -https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_1.conda#ac738a7f524d1b157e53fb9734f85e0e +https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.2.0-pyhd8ed1ab_0.conda#ff7e641a17f56af4b8f65654d677f5c3 https://conda.anaconda.org/conda-forge/noarch/tox-4.24.1-pyh29332c3_0.conda#81d5a93243af5f2c6addb3c8a16b4ac6 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310h3788b33_5.conda#e05b0475166b68c9dc4d7937e0315654 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.19.0-py310h5764c6d_0.tar.bz2#74ea667169b1296fb31bb86f13abfa49 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310hf462985_1.conda#c2d5289e6cbcecf2c549e01772fe5274 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.1-py310h3788b33_0.conda#f993b13665fc2bb262b30217c815d137 https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.7-pyhd8ed1ab_0.conda#1027da8216437467b4588fa79e143d89 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.8-pyhd8ed1ab_0.conda#153a6ad50ad9db7bb4e042ee52a56f87 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py310ha75aee5_1.conda#48781b625a5c7701e04d222752cb2f62 https://conda.anaconda.org/conda-forge/noarch/nox-2025.2.9-pyhd8ed1ab_0.conda#296bd3a16fb2601191e9f32b7cae531e https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.conda#8c29cd33b64b2eb78597fa28b5595c8d -https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.1.0-hd8ed1ab_1.conda#4b2757cbafd866a23faba9dd2b6fd43e -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.7-py310had3dfd6_0.conda#27f3e05fb7dd7c300a5567476a9f92d8 +https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.2.0-hd8ed1ab_0.conda#391afbc89b2c6a60377400f1d6fdd0b3 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.7-py310h247727d_1.conda#a7e42b858b9635d1c32c948610186d58 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py310hf462985_0.conda#c31938674e4cda43617a4d70f99ffd0c https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.40.0-h8bb6dbc_0.conda#52c8d85ec289a75e7c731932f45c533d -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.0-py310h68603db_0.conda#409498230a11a71578ed49d006165249 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.1-py310h68603db_0.conda#29cf3f5959afb841eda926541f26b0fb https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py310h9f0ad05_101.conda#f58947ff305aa8be0b33769ee67ddb10 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.1.0-pyha770c72_0.conda#5353f5eb201a9415b12385e35ed1148d https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index ddbc4813..1c33a9dc 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -8,20 +8,20 @@ https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-5_cp311.conda#13 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda#dbcace4706afdfb7eb891f7b37d07c04 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda#cc3573974587f12dda90d96e3e55a702 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda#06d02030237f4d5b3d9a7e7d348fe3c6 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda#c151d5eb730e9b7480e6d48c0fc44048 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda#3cb76c3f10d3bc7f1105b2fc9db984df +https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda#ef504d1acbd74b7cc6849ef8af47dd03 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda#e2775acf57efd5af15b8e3d1d74d72d3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda#8dfae1d2e74767e9ce36d5fa0d8605db https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda#db833e03127376d461e1e13e76f09b6c https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda#e3eb7806380bc8bcecba6d749ad5f026 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda#e39480b9ca41323497b05492a63bc35b -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hd5240d6_1.conda#9822b874ea29af082e5d36098d25427d +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda#a2222a6ada71fb478682efe483ce0f92 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda#42d5b6a0f30d3c10cd88cb8584fda1cb -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda#234a5554c53625688d51062645337328 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda#a78c856b6dc6bf4ea8daeb9beaaa3fb0 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 @@ -29,33 +29,33 @@ https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda#4 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 +https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb9d3cd8_0.conda#2ef1822d8168ed5d79ab1bf01088419a https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 -https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.0-h5888daf_0.conda#40b4ab956c90390e407bb177f8a58bab +https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.1-h97f6797_0.conda#5bc18c66111bc94532b0d2df00731c66 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_1.conda#f1fd30127802683586f768875127a987 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda#fb54c4ea68b460c278d26eea89cfbcc3 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda#55199e2ae2c3651f6f9b2a447b47bdc9 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda#73cea06049cc4174578b432320a003b8 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda#be2de152d8073ef1c01b7728475f2fe7 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda#8371ac6457591af2cf6159439c1fd051 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda#c75da67f045c2627f59e6fcb5f4e3a9b https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 -https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 +https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda#3b3e64af585eadfb52bb90b553db5edf https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc -https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 -https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_0.conda#3fe5420e4da42d8110c28f21de6cc127 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_1.conda#02e4e2fa41a6528afba2e54cbc4280ff https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb @@ -69,13 +69,13 @@ https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda#0a4d0252248ef9a0f88f2ba8b8a08e12 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba -https://conda.anaconda.org/conda-forge/linux-64/python-3.11.11-h9e4cc4f_1_cpython.conda#8387070aa413ce9a8cc35a509fae938b +https://conda.anaconda.org/conda-forge/linux-64/python-3.11.11-h9e4cc4f_2_cpython.conda#81dd3e521f9b9eaa58d06213e28aaa9b https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.49.1-h9eae976_1.conda#069213b4f57ec55bbcfaebe415c758f7 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.11-h4f16b4b_0.conda#b6eb6d0cb323179af168df8fe16fb0a1 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a -https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.5.2-pyhd8ed1ab_0.conda#4229aeacda5e2878871ce03b39d3e11f +https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.0-pyhd8ed1ab_0.conda#e2f1a8cb369bc66fd2c1cbf68888956d https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda#2cc3f588512f04f3a0c64b4e9bedc02d https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hfdbb021_2.conda#d21daab070d76490cb39a8f1d1729d79 @@ -100,7 +100,7 @@ https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.cond https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 -https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.1-pyhd8ed1ab_1.conda#ae376af0a29183e98a95508ed6944664 +https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py311hd18a35c_0.conda#be34c90cce87090d24da64a7c239ca96 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda#728dbebd0f7a20337218beacffd37916 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.12.1-h332b0f4_0.conda#45e9dc4e7b25e2841deb392be085500e @@ -118,11 +118,11 @@ https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.1-pyhd8ed1ab_0.conda#285e237b8f351e85e7574a2c7bfa6d46 https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_1.conda#856b387c270e9eaf6e41e978057a2b62 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac -https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py311h9ecbd09_1.conda#b1796d741ca619dbacb79917b20e5a05 +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py311h9ecbd09_2.conda#4b49b833ad54b3e26da1e743a4e4bc13 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.1-pyhd8ed1ab_0.conda#d451ccded808abf6511f0a2ac9bb9dcc https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py311h2dc5d0c_2.conda#014417753f948da1f70d132b2de573be -https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-3.0.0-pyhd8ed1ab_0.conda#a41ef9130d163f14f0d62da0d4c12231 -https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda#8f28e299c11afdd79e0ec1e279dcdc52 +https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-3.1.0-pyhd8ed1ab_0.conda#5f0f24f8032c2c1bb33f59b75974f5fc +https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.2-pyhff2d567_0.conda#9bddfdbf4e061821a1a443f93223be61 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb @@ -144,7 +144,7 @@ https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754f https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h2d575fe_109.conda#e7a7a6e6f70553a31e6e79c65768d089 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda#f4b39bf00c69f56ac01e020ebfac066c https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda#2752a6ed44105bfb18c9bef1177d9dcd +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda#abb32c727da370c481a1c206f5159ce9 https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a @@ -155,10 +155,10 @@ https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0ba https://conda.anaconda.org/conda-forge/noarch/pip-25.0.1-pyh8b19718_0.conda#79b5c1440aedc5010f687048d9103628 https://conda.anaconda.org/conda-forge/linux-64/proj-9.5.1-h0054346_0.conda#398cabfd9bd75e90d0901db95224f25f https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.0-pyh29332c3_0.conda#46276968030688a25257b08772c418fc -https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda#799ed216dc6af62520f32aa39bc1c2bb +https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda#b6a408c64b78ec7b779a3e5c7a902433 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.29.2-pyhd8ed1ab_0.conda#d8a3ee355d5ecc9ee2565cafba1d3573 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.29.3-pyhd8ed1ab_0.conda#87a2061465e55be9a997dd8cf8b5a578 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa @@ -171,24 +171,24 @@ https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py311h1322bbf_0.co https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py311h0f98d5a_0.conda#2c17ffd168aafaa12be759e300133e1c https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda#79963c319d1be62c8fd3e34555816e01 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 -https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_1.conda#ac738a7f524d1b157e53fb9734f85e0e +https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.2.0-pyhd8ed1ab_0.conda#ff7e641a17f56af4b8f65654d677f5c3 https://conda.anaconda.org/conda-forge/noarch/tox-4.24.1-pyh29332c3_0.conda#81d5a93243af5f2c6addb3c8a16b4ac6 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hd18a35c_5.conda#4e8447ca8558a203ec0577b4730073f3 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.19.0-py311hd4cff14_0.tar.bz2#056b3271f46abaa4673c8c6783283a07 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h9f3472d_1.conda#2c3c4f115d28ed9e001a271d5d8585aa https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.1-py311hd18a35c_0.conda#351cb68d2081e249069748b6e60b3cd2 https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.7-pyhd8ed1ab_0.conda#1027da8216437467b4588fa79e143d89 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.8-pyhd8ed1ab_0.conda#153a6ad50ad9db7bb4e042ee52a56f87 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py311h9ecbd09_1.conda#28d6b63784b350a2906dc264ad8c7f2a https://conda.anaconda.org/conda-forge/noarch/nox-2025.2.9-pyhd8ed1ab_0.conda#296bd3a16fb2601191e9f32b7cae531e https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py311h8f841c2_0.conda#5ec0a1732a05376241e1e4c6d50e0e91 -https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.1.0-hd8ed1ab_1.conda#4b2757cbafd866a23faba9dd2b6fd43e -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.7-py311h2fdb869_0.conda#75f428f392207807643fa016a7c57ad8 +https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.2.0-hd8ed1ab_0.conda#391afbc89b2c6a60377400f1d6fdd0b3 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.7-py311h3dc67b8_1.conda#6cbf7751d366a923688ae18530a93047 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py311h9f3472d_0.conda#555b148cafbd96b658499060d5e11a65 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.40.0-h8bb6dbc_0.conda#52c8d85ec289a75e7c731932f45c533d -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.0-py311h2b939e6_0.conda#79239585ea50c427415ef629534bb3aa +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.1-py311h2b939e6_0.conda#eed17bae389043337f33b95a0fd8c172 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py311hae66bec_101.conda#776c96dd51168ef9da0d63d5e49785f5 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.1.0-pyha770c72_0.conda#5353f5eb201a9415b12385e35ed1148d https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 @@ -202,5 +202,5 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jquery-4.1-pyhd8ed1ab_1.conda#403185829255321ea427333f7773dd1f https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-3.0.1-pyha770c72_0.conda#740536f8a54250b1964e494c0bf5c9c3 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda#00534ebcc0375929b45c3039b5ba7636 -https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.0-pyhd8ed1ab_0.conda#b6d68f4484eb21a7daa9123fec3900a2 +https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda#f7af826063ed569bb13f7207d6f949b0 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda#3bc61f7161d28137797e038263c04c54 diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 3e0d94e5..e68d836f 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -8,20 +8,20 @@ https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda#04 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda#dbcace4706afdfb7eb891f7b37d07c04 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda#cc3573974587f12dda90d96e3e55a702 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda#06d02030237f4d5b3d9a7e7d348fe3c6 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda#c151d5eb730e9b7480e6d48c0fc44048 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda#3cb76c3f10d3bc7f1105b2fc9db984df +https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda#ef504d1acbd74b7cc6849ef8af47dd03 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda#e2775acf57efd5af15b8e3d1d74d72d3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda#8dfae1d2e74767e9ce36d5fa0d8605db https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda#db833e03127376d461e1e13e76f09b6c https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda#e3eb7806380bc8bcecba6d749ad5f026 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda#e39480b9ca41323497b05492a63bc35b -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hd5240d6_1.conda#9822b874ea29af082e5d36098d25427d +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda#a2222a6ada71fb478682efe483ce0f92 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda#42d5b6a0f30d3c10cd88cb8584fda1cb -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda#234a5554c53625688d51062645337328 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda#a78c856b6dc6bf4ea8daeb9beaaa3fb0 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 @@ -29,30 +29,30 @@ https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda#4 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 +https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb9d3cd8_0.conda#2ef1822d8168ed5d79ab1bf01088419a https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 -https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.0-h5888daf_0.conda#40b4ab956c90390e407bb177f8a58bab +https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.1-h97f6797_0.conda#5bc18c66111bc94532b0d2df00731c66 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_1.conda#f1fd30127802683586f768875127a987 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda#fb54c4ea68b460c278d26eea89cfbcc3 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda#55199e2ae2c3651f6f9b2a447b47bdc9 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda#73cea06049cc4174578b432320a003b8 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda#be2de152d8073ef1c01b7728475f2fe7 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda#8371ac6457591af2cf6159439c1fd051 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda#c75da67f045c2627f59e6fcb5f4e3a9b https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 -https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 +https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda#3b3e64af585eadfb52bb90b553db5edf https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc -https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 @@ -67,14 +67,14 @@ https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda#0a4d0252248ef9a0f88f2ba8b8a08e12 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba -https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_0_cpython.conda#5665f0079432f8848079c811cdb537d5 +https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_1_cpython.conda#d82342192dfc9145185190e651065aa9 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.49.1-h9eae976_1.conda#069213b4f57ec55bbcfaebe415c758f7 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.11-h4f16b4b_0.conda#b6eb6d0cb323179af168df8fe16fb0a1 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a -https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.5.2-pyhd8ed1ab_0.conda#4229aeacda5e2878871ce03b39d3e11f +https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.0-pyhd8ed1ab_0.conda#e2f1a8cb369bc66fd2c1cbf68888956d https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda#2cc3f588512f04f3a0c64b4e9bedc02d https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f @@ -100,7 +100,7 @@ https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.cond https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 -https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.1-pyhd8ed1ab_1.conda#ae376af0a29183e98a95508ed6944664 +https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.8-py312h84d6215_0.conda#6713467dc95509683bfa3aca08524e8a https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda#728dbebd0f7a20337218beacffd37916 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.12.1-h332b0f4_0.conda#45e9dc4e7b25e2841deb392be085500e @@ -118,11 +118,11 @@ https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.1-pyhd8ed1ab_0.conda#285e237b8f351e85e7574a2c7bfa6d46 https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_1.conda#856b387c270e9eaf6e41e978057a2b62 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac -https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f0_1.conda#39aed2afe4d0cf76ab3d6b09eecdbea7 +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f0_2.conda#cc3f6c452697c1cf7e4e6e5f21861f96 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.1-pyhd8ed1ab_0.conda#d451ccded808abf6511f0a2ac9bb9dcc https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h178313f_2.conda#cf2485f39740de96e2a7f2bb18ed2fee -https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-3.0.0-pyhd8ed1ab_0.conda#a41ef9130d163f14f0d62da0d4c12231 -https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda#8f28e299c11afdd79e0ec1e279dcdc52 +https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-3.1.0-pyhd8ed1ab_0.conda#5f0f24f8032c2c1bb33f59b75974f5fc +https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.2-pyhff2d567_0.conda#9bddfdbf4e061821a1a443f93223be61 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb @@ -144,7 +144,7 @@ https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754f https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h2d575fe_109.conda#e7a7a6e6f70553a31e6e79c65768d089 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda#f4b39bf00c69f56ac01e020ebfac066c https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.5-pyhd8ed1ab_0.conda#2752a6ed44105bfb18c9bef1177d9dcd +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda#abb32c727da370c481a1c206f5159ce9 https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a @@ -155,10 +155,10 @@ https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0ba https://conda.anaconda.org/conda-forge/noarch/pip-25.0.1-pyh8b19718_0.conda#79b5c1440aedc5010f687048d9103628 https://conda.anaconda.org/conda-forge/linux-64/proj-9.5.1-h0054346_0.conda#398cabfd9bd75e90d0901db95224f25f https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.0-pyh29332c3_0.conda#46276968030688a25257b08772c418fc -https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda#799ed216dc6af62520f32aa39bc1c2bb +https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda#b6a408c64b78ec7b779a3e5c7a902433 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.29.2-pyhd8ed1ab_0.conda#d8a3ee355d5ecc9ee2565cafba1d3573 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.29.3-pyhd8ed1ab_0.conda#87a2061465e55be9a997dd8cf8b5a578 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa @@ -171,24 +171,24 @@ https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py312h80c1187_0.co https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py312he630544_0.conda#ed6a6bbd26559986ecd90b9a1797cbf0 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda#79963c319d1be62c8fd3e34555816e01 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 -https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_1.conda#ac738a7f524d1b157e53fb9734f85e0e +https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.2.0-pyhd8ed1ab_0.conda#ff7e641a17f56af4b8f65654d677f5c3 https://conda.anaconda.org/conda-forge/noarch/tox-4.24.1-pyh29332c3_0.conda#81d5a93243af5f2c6addb3c8a16b4ac6 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h68727a3_5.conda#f9664ee31aed96c85b7319ab0a693341 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda#8b7069e9792ee4e5b4919a7a306d2e67 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312hc0a28a1_1.conda#990033147b0a998e756eaaed6b28f48d https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.1-py312h68727a3_0.conda#f5fbba0394ee45e9a64a73c2a994126a https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.7-pyhd8ed1ab_0.conda#1027da8216437467b4588fa79e143d89 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.8-pyhd8ed1ab_0.conda#153a6ad50ad9db7bb4e042ee52a56f87 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h66e93f0_1.conda#5fef67f50126f40f5966a9451661280d https://conda.anaconda.org/conda-forge/noarch/nox-2025.2.9-pyhd8ed1ab_0.conda#296bd3a16fb2601191e9f32b7cae531e https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py312ha707e6e_0.conda#00b999c5f9d01fb633db819d79186bd4 -https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.1.0-hd8ed1ab_1.conda#4b2757cbafd866a23faba9dd2b6fd43e -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.7-py312h391bc85_0.conda#3491bd7e78aa7407c965312c4a5a9254 +https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.2.0-hd8ed1ab_0.conda#391afbc89b2c6a60377400f1d6fdd0b3 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.7-py312h21f5128_1.conda#98d83a309c3f330793a7cc8d48c67f81 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py312hc0a28a1_0.conda#8b5b812d4c18cb37bda7a7c8d3a6acb3 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.40.0-h8bb6dbc_0.conda#52c8d85ec289a75e7c731932f45c533d -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.0-py312hd3ec401_0.conda#c27a17a8c54c0d35cf83bbc0de8f7f77 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.1-py312hd3ec401_0.conda#514d8a6894286f6d9894b352782c7e18 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py312h21d6d8e_101.conda#0cabc6745882859ec7be35433c7b8f24 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.1.0-pyha770c72_0.conda#5353f5eb201a9415b12385e35ed1148d https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 @@ -202,5 +202,5 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jquery-4.1-pyhd8ed1ab_1.conda#403185829255321ea427333f7773dd1f https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-3.0.1-pyha770c72_0.conda#740536f8a54250b1964e494c0bf5c9c3 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda#00534ebcc0375929b45c3039b5ba7636 -https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.0-pyhd8ed1ab_0.conda#b6d68f4484eb21a7daa9123fec3900a2 +https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda#f7af826063ed569bb13f7207d6f949b0 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda#3bc61f7161d28137797e038263c04c54 From 855c912586f07393c7f70d8dc1bfe72a4f72c5ab Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 17 Mar 2025 11:53:33 +0000 Subject: [PATCH 429/583] Updated environment lockfiles (#621) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 20 ++++++++++---------- requirements/locks/py311-linux-64.lock | 20 ++++++++++---------- requirements/locks/py312-linux-64.lock | 24 ++++++++++++------------ 3 files changed, 32 insertions(+), 32 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 898311d5..1ffc7765 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -58,7 +58,7 @@ https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f0 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_1.conda#02e4e2fa41a6528afba2e54cbc4280ff https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-h48d6fc4_0.conda#9ecfd6f2ca17077dd9c2d24770bb9ccd https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 @@ -73,16 +73,16 @@ https://conda.anaconda.org/conda-forge/linux-64/python-3.10.16-he725a3c_1_cpytho https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.49.1-h9eae976_1.conda#069213b4f57ec55bbcfaebe415c758f7 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.11-h4f16b4b_0.conda#b6eb6d0cb323179af168df8fe16fb0a1 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.0-pyhd8ed1ab_0.conda#e2f1a8cb369bc66fd2c1cbf68888956d -https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda#2cc3f588512f04f3a0c64b4e9bedc02d +https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_2.conda#bf502c169c71e3c6ac0d6175addfacc2 https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.2-pyhd8ed1ab_0.conda#bf9c1698e819fab31f67dbab4256f7ba https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda#c207fa5ac7ea99b149344385a9c0880d https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e -https://conda.anaconda.org/conda-forge/linux-64/chardet-5.2.0-py310hff52083_2.conda#e94bf593fe645f6b85a9c8b2d52caae6 +https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda#e83a31202d1c0a000fce3e9cf3825875 https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda#f22f4d4970e09d68a10b922cbb0408d3 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.1-pyhd8ed1ab_0.conda#364ba6c9fb03886ac979b482f39ebb92 @@ -92,9 +92,9 @@ https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#4 https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_1.conda#8d88f4a2242e6b96f9ecff9a6a05b2f1 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e -https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda#7f402b4a1007ee355bc50ce4d24d4a57 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda#4547b39256e296bb758166893e909a7c https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.2.0-pyhd8ed1ab_0.conda#d9ea16b71920b03beafc17fcca16df90 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.0-pyhd8ed1ab_0.conda#5ecafd654e33d1f2ecac5ec97057593b https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 @@ -171,16 +171,16 @@ https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py310h2e9f774_0.con https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda#79963c319d1be62c8fd3e34555816e01 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.2.0-pyhd8ed1ab_0.conda#ff7e641a17f56af4b8f65654d677f5c3 -https://conda.anaconda.org/conda-forge/noarch/tox-4.24.1-pyh29332c3_0.conda#81d5a93243af5f2c6addb3c8a16b4ac6 +https://conda.anaconda.org/conda-forge/noarch/tox-4.24.2-pyh29332c3_0.conda#1688f53edfac107b4153e2b1a418a097 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310h3788b33_5.conda#e05b0475166b68c9dc4d7937e0315654 -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.19.0-py310h5764c6d_0.tar.bz2#74ea667169b1296fb31bb86f13abfa49 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha75aee5_1.conda#0316e8d0e00c00631a6de89207db5b09 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310hf462985_1.conda#c2d5289e6cbcecf2c549e01772fe5274 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.1-py310h3788b33_0.conda#f993b13665fc2bb262b30217c815d137 https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.8-pyhd8ed1ab_0.conda#153a6ad50ad9db7bb4e042ee52a56f87 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.9-pyhd8ed1ab_0.conda#542f45bf054c6b9cf8d00a3b1976f945 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py310ha75aee5_1.conda#48781b625a5c7701e04d222752cb2f62 -https://conda.anaconda.org/conda-forge/noarch/nox-2025.2.9-pyhd8ed1ab_0.conda#296bd3a16fb2601191e9f32b7cae531e +https://conda.anaconda.org/conda-forge/noarch/nox-2025.2.9-pyh29332c3_1.conda#086837aa2602e3aeb38886e4124a6328 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.conda#8c29cd33b64b2eb78597fa28b5595c8d https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.2.0-hd8ed1ab_0.conda#391afbc89b2c6a60377400f1d6fdd0b3 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.7-py310h247727d_1.conda#a7e42b858b9635d1c32c948610186d58 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 1c33a9dc..cc5dcf32 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -58,7 +58,7 @@ https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f0 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_1.conda#02e4e2fa41a6528afba2e54cbc4280ff https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-h48d6fc4_0.conda#9ecfd6f2ca17077dd9c2d24770bb9ccd https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 @@ -73,16 +73,16 @@ https://conda.anaconda.org/conda-forge/linux-64/python-3.11.11-h9e4cc4f_2_cpytho https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.49.1-h9eae976_1.conda#069213b4f57ec55bbcfaebe415c758f7 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.11-h4f16b4b_0.conda#b6eb6d0cb323179af168df8fe16fb0a1 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.0-pyhd8ed1ab_0.conda#e2f1a8cb369bc66fd2c1cbf68888956d -https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda#2cc3f588512f04f3a0c64b4e9bedc02d +https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hfdbb021_2.conda#d21daab070d76490cb39a8f1d1729d79 https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.2-pyhd8ed1ab_0.conda#bf9c1698e819fab31f67dbab4256f7ba https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda#c207fa5ac7ea99b149344385a9c0880d https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e -https://conda.anaconda.org/conda-forge/linux-64/chardet-5.2.0-py311h38be061_2.conda#00f0ad2aed7e65c9392a067ce7882b28 +https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda#e83a31202d1c0a000fce3e9cf3825875 https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda#f22f4d4970e09d68a10b922cbb0408d3 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.1-pyhd8ed1ab_0.conda#364ba6c9fb03886ac979b482f39ebb92 @@ -92,9 +92,9 @@ https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#4 https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_1.conda#8d88f4a2242e6b96f9ecff9a6a05b2f1 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e -https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda#7f402b4a1007ee355bc50ce4d24d4a57 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda#4547b39256e296bb758166893e909a7c https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.2.0-pyhd8ed1ab_0.conda#d9ea16b71920b03beafc17fcca16df90 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.0-pyhd8ed1ab_0.conda#5ecafd654e33d1f2ecac5ec97057593b https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 @@ -172,16 +172,16 @@ https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py311h0f98d5a_0.con https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda#79963c319d1be62c8fd3e34555816e01 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.2.0-pyhd8ed1ab_0.conda#ff7e641a17f56af4b8f65654d677f5c3 -https://conda.anaconda.org/conda-forge/noarch/tox-4.24.1-pyh29332c3_0.conda#81d5a93243af5f2c6addb3c8a16b4ac6 +https://conda.anaconda.org/conda-forge/noarch/tox-4.24.2-pyh29332c3_0.conda#1688f53edfac107b4153e2b1a418a097 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hd18a35c_5.conda#4e8447ca8558a203ec0577b4730073f3 -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.19.0-py311hd4cff14_0.tar.bz2#056b3271f46abaa4673c8c6783283a07 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311h9ecbd09_1.conda#6d229edd907b6bb39961b74e3d52de9c https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h9f3472d_1.conda#2c3c4f115d28ed9e001a271d5d8585aa https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.1-py311hd18a35c_0.conda#351cb68d2081e249069748b6e60b3cd2 https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.8-pyhd8ed1ab_0.conda#153a6ad50ad9db7bb4e042ee52a56f87 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.9-pyhd8ed1ab_0.conda#542f45bf054c6b9cf8d00a3b1976f945 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py311h9ecbd09_1.conda#28d6b63784b350a2906dc264ad8c7f2a -https://conda.anaconda.org/conda-forge/noarch/nox-2025.2.9-pyhd8ed1ab_0.conda#296bd3a16fb2601191e9f32b7cae531e +https://conda.anaconda.org/conda-forge/noarch/nox-2025.2.9-pyh29332c3_1.conda#086837aa2602e3aeb38886e4124a6328 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py311h8f841c2_0.conda#5ec0a1732a05376241e1e4c6d50e0e91 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.2.0-hd8ed1ab_0.conda#391afbc89b2c6a60377400f1d6fdd0b3 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.7-py311h3dc67b8_1.conda#6cbf7751d366a923688ae18530a93047 diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index e68d836f..3eaebb6e 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -55,8 +55,10 @@ https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda#3b https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_1.conda#02e4e2fa41a6528afba2e54cbc4280ff +https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-h48d6fc4_0.conda#9ecfd6f2ca17077dd9c2d24770bb9ccd https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 @@ -71,18 +73,16 @@ https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_1_cpython https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.49.1-h9eae976_1.conda#069213b4f57ec55bbcfaebe415c758f7 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.11-h4f16b4b_0.conda#b6eb6d0cb323179af168df8fe16fb0a1 -https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.0-pyhd8ed1ab_0.conda#e2f1a8cb369bc66fd2c1cbf68888956d -https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda#2cc3f588512f04f3a0c64b4e9bedc02d -https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d +https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda#b0b867af6fc74b2a0aa206da29c0f3cf https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.2-pyhd8ed1ab_0.conda#bf9c1698e819fab31f67dbab4256f7ba https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda#c207fa5ac7ea99b149344385a9c0880d https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e -https://conda.anaconda.org/conda-forge/linux-64/chardet-5.2.0-py312h7900ff3_2.conda#01b1679726675bf49851cdb507de4a24 +https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda#e83a31202d1c0a000fce3e9cf3825875 https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda#f22f4d4970e09d68a10b922cbb0408d3 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.1-pyhd8ed1ab_0.conda#364ba6c9fb03886ac979b482f39ebb92 @@ -92,9 +92,9 @@ https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#4 https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_1.conda#8d88f4a2242e6b96f9ecff9a6a05b2f1 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e -https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda#7f402b4a1007ee355bc50ce4d24d4a57 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda#4547b39256e296bb758166893e909a7c https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.2.0-pyhd8ed1ab_0.conda#d9ea16b71920b03beafc17fcca16df90 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.0-pyhd8ed1ab_0.conda#5ecafd654e33d1f2ecac5ec97057593b https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 @@ -172,16 +172,16 @@ https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py312he630544_0.con https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda#79963c319d1be62c8fd3e34555816e01 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.2.0-pyhd8ed1ab_0.conda#ff7e641a17f56af4b8f65654d677f5c3 -https://conda.anaconda.org/conda-forge/noarch/tox-4.24.1-pyh29332c3_0.conda#81d5a93243af5f2c6addb3c8a16b4ac6 +https://conda.anaconda.org/conda-forge/noarch/tox-4.24.2-pyh29332c3_0.conda#1688f53edfac107b4153e2b1a418a097 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h68727a3_5.conda#f9664ee31aed96c85b7319ab0a693341 -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda#8b7069e9792ee4e5b4919a7a306d2e67 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312h66e93f0_1.conda#d28b82fcc8d1b462b595af4b15a6cdcf https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312hc0a28a1_1.conda#990033147b0a998e756eaaed6b28f48d https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.1-py312h68727a3_0.conda#f5fbba0394ee45e9a64a73c2a994126a https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.8-pyhd8ed1ab_0.conda#153a6ad50ad9db7bb4e042ee52a56f87 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.9-pyhd8ed1ab_0.conda#542f45bf054c6b9cf8d00a3b1976f945 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h66e93f0_1.conda#5fef67f50126f40f5966a9451661280d -https://conda.anaconda.org/conda-forge/noarch/nox-2025.2.9-pyhd8ed1ab_0.conda#296bd3a16fb2601191e9f32b7cae531e +https://conda.anaconda.org/conda-forge/noarch/nox-2025.2.9-pyh29332c3_1.conda#086837aa2602e3aeb38886e4124a6328 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py312ha707e6e_0.conda#00b999c5f9d01fb633db819d79186bd4 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.2.0-hd8ed1ab_0.conda#391afbc89b2c6a60377400f1d6fdd0b3 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.7-py312h21f5128_1.conda#98d83a309c3f330793a7cc8d48c67f81 From 1ee5b6b4c9cb799424fedbf19f757be123d6e1ac Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Mar 2025 11:54:00 +0000 Subject: [PATCH 430/583] Bump scitools/workflows in the dependencies group (#619) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2025.02.3 to 2025.03.1 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.02.3...2025.03.1) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Martin Yeo <40734014+trexfeathers@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 87033891..911179a7 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.02.3 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.03.1 diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 1d91e8c0..caa87f1d 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.02.3 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.03.1 secrets: inherit From 173027954a309f10ef72a37e00469cc4089cb4ea Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Tue, 25 Mar 2025 12:58:29 +0000 Subject: [PATCH 431/583] Updated environment lockfiles (#627) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 23 ++++++++++++----------- requirements/locks/py311-linux-64.lock | 23 ++++++++++++----------- requirements/locks/py312-linux-64.lock | 23 ++++++++++++----------- 3 files changed, 36 insertions(+), 33 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 1ffc7765..edb534b7 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -32,6 +32,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.c https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb9d3cd8_0.conda#2ef1822d8168ed5d79ab1bf01088419a https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.1-h97f6797_0.conda#5bc18c66111bc94532b0d2df00731c66 +https://conda.anaconda.org/conda-forge/linux-64/gtest-1.16.0-h84d6215_0.conda#964fa3cb8fd0f35754535c78d966159e https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de @@ -42,7 +43,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.c https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda#55199e2ae2c3651f6f9b2a447b47bdc9 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda#73cea06049cc4174578b432320a003b8 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_2.conda#962d6ac93c30b1dfc54c9cccafd1003e https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda#be2de152d8073ef1c01b7728475f2fe7 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda#c75da67f045c2627f59e6fcb5f4e3a9b https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 @@ -55,7 +56,7 @@ https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda#3b https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 -https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_1.conda#02e4e2fa41a6528afba2e54cbc4280ff +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-h48d6fc4_0.conda#9ecfd6f2ca17077dd9c2d24770bb9ccd @@ -71,7 +72,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/python-3.10.16-he725a3c_1_cpython.conda#b887811a901b3aa622a92caf03bc8917 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.49.1-h9eae976_1.conda#069213b4f57ec55bbcfaebe415c758f7 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.49.1-h9eae976_2.conda#1894a9d3a8c3ffa53f8ca09fcd2fac25 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a @@ -111,7 +112,7 @@ https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2# https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py310h89163eb_1.conda#8ce3f0332fd6de0d737e2911d329523f https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda#577852c7e53901ddccc7e6a9959ddebe +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.7-pyh29332c3_0.conda#e57da6fe54bb3a5556cf36d199ff07d8 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda#232fb4577b6687b2d503ef8e254270c9 @@ -136,7 +137,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0. https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3cc595284c5e8f0f9900a9b228a332 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h8deb56e_0.conda#1fc24a3196ad5ede2a68148be61894f4 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.12-py310h89163eb_0.conda#6fdad60a1f9adce8c1bf2eca277b3cc8 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.7.1-py310h89163eb_0.conda#edde6b6a84f503e98f72f094e792e07d https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.0-pyh29332c3_0.conda#b1ed099fbbf189bf23967ed938316d05 https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.56.0-py310h89163eb_0.conda#cd3125e1924bd8699dac9989652bca74 https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 @@ -152,7 +153,7 @@ https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/noarch/pip-25.0.1-pyh8b19718_0.conda#79b5c1440aedc5010f687048d9103628 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.5.1-h0054346_0.conda#398cabfd9bd75e90d0901db95224f25f +https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.0-h0054346_0.conda#c2ad1b40a59bb94a629a812c656973e1 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.0-pyh29332c3_0.conda#46276968030688a25257b08772c418fc https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e @@ -165,12 +166,12 @@ https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda# https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.6.1-hd8ed1ab_0.conda#7f46575a91b1307441abc235d01cab66 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h03adeef_0.conda#b1df5affe904efe82ef890826b68881d https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h00e09a9_116.conda#417864857bdb6c2be2e923e89bffd2e8 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.3-py310hefbff90_0.conda#76ddfda2c3fdab3f39e567fc08307531 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.4-py310hefbff90_0.conda#b3a99849aa14b78d32250c0709e8792a https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py310h7e6dc6c_0.conda#14d300b9e1504748e70cc6499a7b4d25 -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py310h2e9f774_0.conda#1bd6b04600df304f7718638b0e21b846 +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py310h71d0299_1.conda#e54b1eaeb50ad1767680181a8575a8db https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda#79963c319d1be62c8fd3e34555816e01 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 -https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.2.0-pyhd8ed1ab_0.conda#ff7e641a17f56af4b8f65654d677f5c3 +https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.2.1-pyhd8ed1ab_0.conda#1f960a50e0fba37b5f04ec766df10657 https://conda.anaconda.org/conda-forge/noarch/tox-4.24.2-pyh29332c3_0.conda#1688f53edfac107b4153e2b1a418a097 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310h3788b33_5.conda#e05b0475166b68c9dc4d7937e0315654 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha75aee5_1.conda#0316e8d0e00c00631a6de89207db5b09 @@ -182,14 +183,14 @@ https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#95 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py310ha75aee5_1.conda#48781b625a5c7701e04d222752cb2f62 https://conda.anaconda.org/conda-forge/noarch/nox-2025.2.9-pyh29332c3_1.conda#086837aa2602e3aeb38886e4124a6328 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.conda#8c29cd33b64b2eb78597fa28b5595c8d -https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.2.0-hd8ed1ab_0.conda#391afbc89b2c6a60377400f1d6fdd0b3 +https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.2.1-hd8ed1ab_0.conda#ba6dd8f5a2d2b46fd52f03ac212e8c6a https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.7-py310h247727d_1.conda#a7e42b858b9635d1c32c948610186d58 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py310hf462985_0.conda#c31938674e4cda43617a4d70f99ffd0c https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.40.0-h8bb6dbc_0.conda#52c8d85ec289a75e7c731932f45c533d https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.1-py310h68603db_0.conda#29cf3f5959afb841eda926541f26b0fb https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py310h9f0ad05_101.conda#f58947ff305aa8be0b33769ee67ddb10 -https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.1.0-pyha770c72_0.conda#5353f5eb201a9415b12385e35ed1148d +https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.2.0-pyha770c72_0.conda#17e487cc8b5507cd3abc09398cf27949 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py310h5eaa309_0.conda#ca4d935c1715f95b6e86846ad1675a2b https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index cc5dcf32..8168f165 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -32,6 +32,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.c https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb9d3cd8_0.conda#2ef1822d8168ed5d79ab1bf01088419a https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.1-h97f6797_0.conda#5bc18c66111bc94532b0d2df00731c66 +https://conda.anaconda.org/conda-forge/linux-64/gtest-1.16.0-h84d6215_0.conda#964fa3cb8fd0f35754535c78d966159e https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de @@ -42,7 +43,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.c https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda#55199e2ae2c3651f6f9b2a447b47bdc9 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda#73cea06049cc4174578b432320a003b8 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_2.conda#962d6ac93c30b1dfc54c9cccafd1003e https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda#be2de152d8073ef1c01b7728475f2fe7 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda#c75da67f045c2627f59e6fcb5f4e3a9b https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 @@ -55,7 +56,7 @@ https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda#3b https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 -https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_1.conda#02e4e2fa41a6528afba2e54cbc4280ff +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-h48d6fc4_0.conda#9ecfd6f2ca17077dd9c2d24770bb9ccd @@ -71,7 +72,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/python-3.11.11-h9e4cc4f_2_cpython.conda#81dd3e521f9b9eaa58d06213e28aaa9b https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.49.1-h9eae976_1.conda#069213b4f57ec55bbcfaebe415c758f7 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.49.1-h9eae976_2.conda#1894a9d3a8c3ffa53f8ca09fcd2fac25 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a @@ -111,7 +112,7 @@ https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2# https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py311h2dc5d0c_1.conda#6565a715337ae279e351d0abd8ffe88a https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda#577852c7e53901ddccc7e6a9959ddebe +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.7-pyh29332c3_0.conda#e57da6fe54bb3a5556cf36d199ff07d8 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda#232fb4577b6687b2d503ef8e254270c9 @@ -137,7 +138,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0. https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3cc595284c5e8f0f9900a9b228a332 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311hf29c0ef_0.conda#55553ecd5328336368db611f350b7039 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.12-py311h2dc5d0c_0.conda#c91e6ee1716a1893dfbbf67e6831516e +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.7.1-py311h2dc5d0c_0.conda#5f57c67f3880dd62b83b3867ea03d9bc https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.0-pyh29332c3_0.conda#b1ed099fbbf189bf23967ed938316d05 https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.56.0-py311h2dc5d0c_0.conda#ca3692015a53c7fcc248a324a540c54c https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 @@ -153,7 +154,7 @@ https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/noarch/pip-25.0.1-pyh8b19718_0.conda#79b5c1440aedc5010f687048d9103628 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.5.1-h0054346_0.conda#398cabfd9bd75e90d0901db95224f25f +https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.0-h0054346_0.conda#c2ad1b40a59bb94a629a812c656973e1 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.0-pyh29332c3_0.conda#46276968030688a25257b08772c418fc https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e @@ -166,12 +167,12 @@ https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda# https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.6.1-hd8ed1ab_0.conda#7f46575a91b1307441abc235d01cab66 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h03adeef_0.conda#b1df5affe904efe82ef890826b68881d https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h00e09a9_116.conda#417864857bdb6c2be2e923e89bffd2e8 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.3-py311h5d046bc_0.conda#6de29798b2e278c56f1e87b7d6e693bb +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.4-py311h5d046bc_0.conda#16ad2b996ea8064e0a7cb8b392d924fd https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py311h1322bbf_0.conda#9f4f5593335f76c1dbf7381c11fe7155 -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py311h0f98d5a_0.conda#2c17ffd168aafaa12be759e300133e1c +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py311h0960b38_1.conda#5e6251fd41d984a9d4fd1fe4b9bdca31 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda#79963c319d1be62c8fd3e34555816e01 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 -https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.2.0-pyhd8ed1ab_0.conda#ff7e641a17f56af4b8f65654d677f5c3 +https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.2.1-pyhd8ed1ab_0.conda#1f960a50e0fba37b5f04ec766df10657 https://conda.anaconda.org/conda-forge/noarch/tox-4.24.2-pyh29332c3_0.conda#1688f53edfac107b4153e2b1a418a097 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hd18a35c_5.conda#4e8447ca8558a203ec0577b4730073f3 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311h9ecbd09_1.conda#6d229edd907b6bb39961b74e3d52de9c @@ -183,14 +184,14 @@ https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#95 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py311h9ecbd09_1.conda#28d6b63784b350a2906dc264ad8c7f2a https://conda.anaconda.org/conda-forge/noarch/nox-2025.2.9-pyh29332c3_1.conda#086837aa2602e3aeb38886e4124a6328 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py311h8f841c2_0.conda#5ec0a1732a05376241e1e4c6d50e0e91 -https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.2.0-hd8ed1ab_0.conda#391afbc89b2c6a60377400f1d6fdd0b3 +https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.2.1-hd8ed1ab_0.conda#ba6dd8f5a2d2b46fd52f03ac212e8c6a https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.7-py311h3dc67b8_1.conda#6cbf7751d366a923688ae18530a93047 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py311h9f3472d_0.conda#555b148cafbd96b658499060d5e11a65 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.40.0-h8bb6dbc_0.conda#52c8d85ec289a75e7c731932f45c533d https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.1-py311h2b939e6_0.conda#eed17bae389043337f33b95a0fd8c172 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py311hae66bec_101.conda#776c96dd51168ef9da0d63d5e49785f5 -https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.1.0-pyha770c72_0.conda#5353f5eb201a9415b12385e35ed1148d +https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.2.0-pyha770c72_0.conda#17e487cc8b5507cd3abc09398cf27949 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py311h7db5c69_0.conda#20ba399d57a2b5de789a5b24341481a1 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 3eaebb6e..2571264a 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -32,6 +32,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.c https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb9d3cd8_0.conda#2ef1822d8168ed5d79ab1bf01088419a https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.1-h97f6797_0.conda#5bc18c66111bc94532b0d2df00731c66 +https://conda.anaconda.org/conda-forge/linux-64/gtest-1.16.0-h84d6215_0.conda#964fa3cb8fd0f35754535c78d966159e https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de @@ -42,7 +43,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.c https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda#55199e2ae2c3651f6f9b2a447b47bdc9 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda#73cea06049cc4174578b432320a003b8 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_2.conda#962d6ac93c30b1dfc54c9cccafd1003e https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda#be2de152d8073ef1c01b7728475f2fe7 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda#c75da67f045c2627f59e6fcb5f4e3a9b https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 @@ -55,7 +56,7 @@ https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda#3b https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 -https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_1.conda#02e4e2fa41a6528afba2e54cbc4280ff +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-h48d6fc4_0.conda#9ecfd6f2ca17077dd9c2d24770bb9ccd @@ -71,7 +72,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_1_cpython.conda#d82342192dfc9145185190e651065aa9 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.49.1-h9eae976_1.conda#069213b4f57ec55bbcfaebe415c758f7 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.49.1-h9eae976_2.conda#1894a9d3a8c3ffa53f8ca09fcd2fac25 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a @@ -111,7 +112,7 @@ https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2# https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda#eb227c3e0bf58f5bd69c0532b157975b https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda#577852c7e53901ddccc7e6a9959ddebe +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.7-pyh29332c3_0.conda#e57da6fe54bb3a5556cf36d199ff07d8 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda#232fb4577b6687b2d503ef8e254270c9 @@ -137,7 +138,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0. https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3cc595284c5e8f0f9900a9b228a332 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda#a861504bbea4161a9170b85d4d2be840 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.12-py312h178313f_0.conda#5be370f84dac4fbd6596db97924ee101 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.7.1-py312h178313f_0.conda#c9c5941aa3ad8c8324edf65128121395 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.0-pyh29332c3_0.conda#b1ed099fbbf189bf23967ed938316d05 https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.56.0-py312h178313f_0.conda#2f8a66f2f9eb931cdde040d02c6ab54c https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 @@ -153,7 +154,7 @@ https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/noarch/pip-25.0.1-pyh8b19718_0.conda#79b5c1440aedc5010f687048d9103628 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.5.1-h0054346_0.conda#398cabfd9bd75e90d0901db95224f25f +https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.0-h0054346_0.conda#c2ad1b40a59bb94a629a812c656973e1 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.0-pyh29332c3_0.conda#46276968030688a25257b08772c418fc https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e @@ -166,12 +167,12 @@ https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda# https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.6.1-hd8ed1ab_0.conda#7f46575a91b1307441abc235d01cab66 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h03adeef_0.conda#b1df5affe904efe82ef890826b68881d https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h00e09a9_116.conda#417864857bdb6c2be2e923e89bffd2e8 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.3-py312h72c5963_0.conda#d117e16d71afa469ea26c3d6896291da +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.4-py312h72c5963_0.conda#3f2871f111d8c0abd9c3150a8627507e https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py312h80c1187_0.conda#d3894405f05b2c0f351d5de3ae26fa9c -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py312he630544_0.conda#ed6a6bbd26559986ecd90b9a1797cbf0 +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py312h03c6e1f_1.conda#f754591f9ec0169e436fa84cb9db0c32 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda#79963c319d1be62c8fd3e34555816e01 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 -https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.2.0-pyhd8ed1ab_0.conda#ff7e641a17f56af4b8f65654d677f5c3 +https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.2.1-pyhd8ed1ab_0.conda#1f960a50e0fba37b5f04ec766df10657 https://conda.anaconda.org/conda-forge/noarch/tox-4.24.2-pyh29332c3_0.conda#1688f53edfac107b4153e2b1a418a097 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h68727a3_5.conda#f9664ee31aed96c85b7319ab0a693341 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312h66e93f0_1.conda#d28b82fcc8d1b462b595af4b15a6cdcf @@ -183,14 +184,14 @@ https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#95 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h66e93f0_1.conda#5fef67f50126f40f5966a9451661280d https://conda.anaconda.org/conda-forge/noarch/nox-2025.2.9-pyh29332c3_1.conda#086837aa2602e3aeb38886e4124a6328 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py312ha707e6e_0.conda#00b999c5f9d01fb633db819d79186bd4 -https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.2.0-hd8ed1ab_0.conda#391afbc89b2c6a60377400f1d6fdd0b3 +https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.2.1-hd8ed1ab_0.conda#ba6dd8f5a2d2b46fd52f03ac212e8c6a https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.7-py312h21f5128_1.conda#98d83a309c3f330793a7cc8d48c67f81 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py312hc0a28a1_0.conda#8b5b812d4c18cb37bda7a7c8d3a6acb3 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.40.0-h8bb6dbc_0.conda#52c8d85ec289a75e7c731932f45c533d https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.1-py312hd3ec401_0.conda#514d8a6894286f6d9894b352782c7e18 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py312h21d6d8e_101.conda#0cabc6745882859ec7be35433c7b8f24 -https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.1.0-pyha770c72_0.conda#5353f5eb201a9415b12385e35ed1148d +https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.2.0-pyha770c72_0.conda#17e487cc8b5507cd3abc09398cf27949 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py312hf9745cd_0.conda#ea213e31805199cb7d0da457b879ceed https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 From 827e3f170a32f04f610b46ddf309cb788f145c94 Mon Sep 17 00:00:00 2001 From: Martin Yeo <40734014+trexfeathers@users.noreply.github.com> Date: Wed, 26 Mar 2025 09:59:34 +0000 Subject: [PATCH 432/583] Add ci-template-check.yml. (#628) --- .github/workflows/ci-template-check.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 .github/workflows/ci-template-check.yml diff --git a/.github/workflows/ci-template-check.yml b/.github/workflows/ci-template-check.yml new file mode 100644 index 00000000..96e55126 --- /dev/null +++ b/.github/workflows/ci-template-check.yml @@ -0,0 +1,16 @@ +# Checks if a PR makes any changes that ought to be shared via templating. +# See the called workflow in the scitools/workflows repo for more details. + +name: ci-template-check + +on: + pull_request_target: + branches: + - main + +jobs: + prompt-share: + uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.03.6 + secrets: inherit + with: + pr_number: ${{ github.event.pull_request.number }} From c665056a81de9136b541b1fbfd89a7073015f1f6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 26 Mar 2025 14:21:02 +0000 Subject: [PATCH 433/583] Bump scitools/workflows in the dependencies group (#626) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2025.03.1 to 2025.03.4 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.03.1...2025.03.4) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 911179a7..39d7db55 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.03.1 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.03.4 diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index caa87f1d..1aa796c1 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.03.1 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.03.4 secrets: inherit From d432e4eeda853a2c5176f75bddbb45f0288c655a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 28 Mar 2025 16:05:14 +0000 Subject: [PATCH 434/583] Bump scitools/workflows in the dependencies group (#629) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2025.03.4 to 2025.03.8 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.03.4...2025.03.8) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/ci-template-check.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 39d7db55..3d8ff173 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.03.4 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.03.8 diff --git a/.github/workflows/ci-template-check.yml b/.github/workflows/ci-template-check.yml index 96e55126..58877cac 100644 --- a/.github/workflows/ci-template-check.yml +++ b/.github/workflows/ci-template-check.yml @@ -10,7 +10,7 @@ on: jobs: prompt-share: - uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.03.6 + uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.03.8 secrets: inherit with: pr_number: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 1aa796c1..c4373f5a 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.03.4 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.03.8 secrets: inherit From 65c5739110f29c8b37e32e306b3fd48a4027cfb1 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 31 Mar 2025 10:30:23 +0100 Subject: [PATCH 435/583] Updated environment lockfiles (#630) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 19 +++++++++---------- requirements/locks/py311-linux-64.lock | 24 +++++++++++------------- requirements/locks/py312-linux-64.lock | 24 +++++++++++------------- 3 files changed, 31 insertions(+), 36 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index edb534b7..e712cbc5 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -5,7 +5,7 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda#19f3a56f68d2fd06c516076bff482c52 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-5_cp310.conda#2921c34715e74b3587b4cff4d36844f9 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda#dbcace4706afdfb7eb891f7b37d07c04 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda#06d02030237f4d5b3d9a7e7d348fe3c6 @@ -50,6 +50,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.co https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h0d44e9d_0.conda#3ac6daa5c1210293a6deaec0c345b230 https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda#3b3e64af585eadfb52bb90b553db5edf @@ -61,7 +62,6 @@ https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-h48d6fc4_0.conda#9ecfd6f2ca17077dd9c2d24770bb9ccd https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 -https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa @@ -76,7 +76,7 @@ https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.49.1-h9eae976_2.conda#1 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a -https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.0-pyhd8ed1ab_0.conda#e2f1a8cb369bc66fd2c1cbf68888956d +https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.1-pyhd8ed1ab_0.conda#a987028d24022ab69e89efda50589832 https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_2.conda#bf502c169c71e3c6ac0d6175addfacc2 @@ -107,7 +107,6 @@ https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openbl https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.12.1-h332b0f4_0.conda#45e9dc4e7b25e2841deb392be085500e https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda#0ea6510969e1296cc19966fad481f6de -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.6-h8d12d68_0.conda#328382c0e0ca648e5c189d5ec336c604 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py310h89163eb_1.conda#8ce3f0332fd6de0d737e2911d329523f https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 @@ -116,11 +115,11 @@ https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.7-pyh29332c3_0.co https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda#232fb4577b6687b2d503ef8e254270c9 -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.1-pyhd8ed1ab_0.conda#285e237b8f351e85e7574a2c7bfa6d46 +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_1.conda#856b387c270e9eaf6e41e978057a2b62 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py310ha75aee5_2.conda#af6da4542e91edaf59b614ce7e991700 -https://conda.anaconda.org/conda-forge/noarch/pytz-2025.1-pyhd8ed1ab_0.conda#d451ccded808abf6511f0a2ac9bb9dcc +https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py310h89163eb_2.conda#fd343408e64cf1e273ab7c710da374db https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.2-pyhff2d567_0.conda#9bddfdbf4e061821a1a443f93223be61 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 @@ -129,7 +128,7 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_1.conda#40d0ed782a8aaa16ef248e68c06c168d -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda#d17f13df8b65464ca316cbc000a3cb64 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.0-pyh29332c3_1.conda#4c446320a86cc5d48e3b80e332d6ebd7 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py310ha75aee5_0.conda#1d7a4b9202cdd10d56ecdd7f6c347190 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d @@ -157,7 +156,7 @@ https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.0-h0054346_0.conda#c2ad https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.0-pyh29332c3_0.conda#46276968030688a25257b08772c418fc https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda#b6a408c64b78ec7b779a3e5c7a902433 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.0-h9fa5a19_1.conda#3fbcc45b908040dca030d3f78ed9a212 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.29.3-pyhd8ed1ab_0.conda#87a2061465e55be9a997dd8cf8b5a578 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 @@ -172,14 +171,14 @@ https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py310h71d0299_1.con https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda#79963c319d1be62c8fd3e34555816e01 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.2.1-pyhd8ed1ab_0.conda#1f960a50e0fba37b5f04ec766df10657 -https://conda.anaconda.org/conda-forge/noarch/tox-4.24.2-pyh29332c3_0.conda#1688f53edfac107b4153e2b1a418a097 +https://conda.anaconda.org/conda-forge/noarch/tox-4.25.0-pyh29332c3_1.conda#33a5663573203748912efecd49a2179d https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310h3788b33_5.conda#e05b0475166b68c9dc4d7937e0315654 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha75aee5_1.conda#0316e8d0e00c00631a6de89207db5b09 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310hf462985_1.conda#c2d5289e6cbcecf2c549e01772fe5274 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.1-py310h3788b33_0.conda#f993b13665fc2bb262b30217c815d137 https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 https://conda.anaconda.org/conda-forge/noarch/identify-2.6.9-pyhd8ed1ab_0.conda#542f45bf054c6b9cf8d00a3b1976f945 -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.5-h1920b20_0.conda#ec8824a45bd7c50a46788fa16216d6c2 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py310ha75aee5_1.conda#48781b625a5c7701e04d222752cb2f62 https://conda.anaconda.org/conda-forge/noarch/nox-2025.2.9-pyh29332c3_1.conda#086837aa2602e3aeb38886e4124a6328 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.conda#8c29cd33b64b2eb78597fa28b5595c8d diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 8168f165..8403d177 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -5,7 +5,7 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda#19f3a56f68d2fd06c516076bff482c52 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-5_cp311.conda#139a8d40c8a2f430df31048949e450de -https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda#dbcace4706afdfb7eb891f7b37d07c04 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda#06d02030237f4d5b3d9a7e7d348fe3c6 @@ -50,6 +50,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.co https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h0d44e9d_0.conda#3ac6daa5c1210293a6deaec0c345b230 https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda#3b3e64af585eadfb52bb90b553db5edf @@ -61,7 +62,6 @@ https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-h48d6fc4_0.conda#9ecfd6f2ca17077dd9c2d24770bb9ccd https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 -https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa @@ -76,7 +76,7 @@ https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.49.1-h9eae976_2.conda#1 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a -https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.0-pyhd8ed1ab_0.conda#e2f1a8cb369bc66fd2c1cbf68888956d +https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.1-pyhd8ed1ab_0.conda#a987028d24022ab69e89efda50589832 https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hfdbb021_2.conda#d21daab070d76490cb39a8f1d1729d79 @@ -107,7 +107,6 @@ https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openbl https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.12.1-h332b0f4_0.conda#45e9dc4e7b25e2841deb392be085500e https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda#0ea6510969e1296cc19966fad481f6de -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.6-h8d12d68_0.conda#328382c0e0ca648e5c189d5ec336c604 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py311h2dc5d0c_1.conda#6565a715337ae279e351d0abd8ffe88a https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 @@ -116,11 +115,11 @@ https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.7-pyh29332c3_0.co https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda#232fb4577b6687b2d503ef8e254270c9 -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.1-pyhd8ed1ab_0.conda#285e237b8f351e85e7574a2c7bfa6d46 +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_1.conda#856b387c270e9eaf6e41e978057a2b62 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py311h9ecbd09_2.conda#4b49b833ad54b3e26da1e743a4e4bc13 -https://conda.anaconda.org/conda-forge/noarch/pytz-2025.1-pyhd8ed1ab_0.conda#d451ccded808abf6511f0a2ac9bb9dcc +https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py311h2dc5d0c_2.conda#014417753f948da1f70d132b2de573be https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-3.1.0-pyhd8ed1ab_0.conda#5f0f24f8032c2c1bb33f59b75974f5fc https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.2-pyhff2d567_0.conda#9bddfdbf4e061821a1a443f93223be61 @@ -130,7 +129,7 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_1.conda#40d0ed782a8aaa16ef248e68c06c168d -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda#d17f13df8b65464ca316cbc000a3cb64 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.0-pyh29332c3_1.conda#4c446320a86cc5d48e3b80e332d6ebd7 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py311h9ecbd09_0.conda#51a12678b609f5794985fda8372b1a49 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d @@ -158,13 +157,13 @@ https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.0-h0054346_0.conda#c2ad https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.0-pyh29332c3_0.conda#46276968030688a25257b08772c418fc https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda#b6a408c64b78ec7b779a3e5c7a902433 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.0-h9fa5a19_1.conda#3fbcc45b908040dca030d3f78ed9a212 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.29.3-pyhd8ed1ab_0.conda#87a2061465e55be9a997dd8cf8b5a578 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa +https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.3.0-pyhd8ed1ab_0.conda#36f6cc22457e3d6a6051c5370832f96c https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.6.1-hd8ed1ab_0.conda#7f46575a91b1307441abc235d01cab66 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h03adeef_0.conda#b1df5affe904efe82ef890826b68881d https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h00e09a9_116.conda#417864857bdb6c2be2e923e89bffd2e8 https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.4-py311h5d046bc_0.conda#16ad2b996ea8064e0a7cb8b392d924fd @@ -173,14 +172,13 @@ https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py311h0960b38_1.con https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda#79963c319d1be62c8fd3e34555816e01 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.2.1-pyhd8ed1ab_0.conda#1f960a50e0fba37b5f04ec766df10657 -https://conda.anaconda.org/conda-forge/noarch/tox-4.24.2-pyh29332c3_0.conda#1688f53edfac107b4153e2b1a418a097 +https://conda.anaconda.org/conda-forge/noarch/tox-4.25.0-pyh29332c3_1.conda#33a5663573203748912efecd49a2179d https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hd18a35c_5.conda#4e8447ca8558a203ec0577b4730073f3 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311h9ecbd09_1.conda#6d229edd907b6bb39961b74e3d52de9c https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h9f3472d_1.conda#2c3c4f115d28ed9e001a271d5d8585aa https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.1-py311hd18a35c_0.conda#351cb68d2081e249069748b6e60b3cd2 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 https://conda.anaconda.org/conda-forge/noarch/identify-2.6.9-pyhd8ed1ab_0.conda#542f45bf054c6b9cf8d00a3b1976f945 -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.5-h1920b20_0.conda#ec8824a45bd7c50a46788fa16216d6c2 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py311h9ecbd09_1.conda#28d6b63784b350a2906dc264ad8c7f2a https://conda.anaconda.org/conda-forge/noarch/nox-2025.2.9-pyh29332c3_1.conda#086837aa2602e3aeb38886e4124a6328 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py311h8f841c2_0.conda#5ec0a1732a05376241e1e4c6d50e0e91 @@ -196,7 +194,7 @@ https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py311h7db5c69_0.conda#20ba399d57a2b5de789a5b24341481a1 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py311h9f3472d_0.conda#648bccc358ec5b19dec01a5685f3aeb9 -https://conda.anaconda.org/conda-forge/noarch/iris-3.11.1-pyha770c72_1.conda#f501583062225a070455d011d81b07bf +https://conda.anaconda.org/conda-forge/noarch/iris-3.12.0-pyha770c72_0.conda#f6551d52c552616493ff211ddfa01ade https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda#e9fb3fe8a5b758b4aff187d434f94f03 diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 2571264a..a0a45295 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -5,7 +5,7 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda#19f3a56f68d2fd06c516076bff482c52 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda#0424ae29b104430108f5218a66db7260 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda#dbcace4706afdfb7eb891f7b37d07c04 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda#06d02030237f4d5b3d9a7e7d348fe3c6 @@ -50,6 +50,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.co https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h0d44e9d_0.conda#3ac6daa5c1210293a6deaec0c345b230 https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda#3b3e64af585eadfb52bb90b553db5edf @@ -61,7 +62,6 @@ https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-h48d6fc4_0.conda#9ecfd6f2ca17077dd9c2d24770bb9ccd https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 -https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa @@ -76,7 +76,7 @@ https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.49.1-h9eae976_2.conda#1 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a -https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.0-pyhd8ed1ab_0.conda#e2f1a8cb369bc66fd2c1cbf68888956d +https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.1-pyhd8ed1ab_0.conda#a987028d24022ab69e89efda50589832 https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda#b0b867af6fc74b2a0aa206da29c0f3cf @@ -107,7 +107,6 @@ https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openbl https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.12.1-h332b0f4_0.conda#45e9dc4e7b25e2841deb392be085500e https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda#0ea6510969e1296cc19966fad481f6de -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.6-h8d12d68_0.conda#328382c0e0ca648e5c189d5ec336c604 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda#eb227c3e0bf58f5bd69c0532b157975b https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 @@ -116,11 +115,11 @@ https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.7-pyh29332c3_0.co https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda#232fb4577b6687b2d503ef8e254270c9 -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.1-pyhd8ed1ab_0.conda#285e237b8f351e85e7574a2c7bfa6d46 +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_1.conda#856b387c270e9eaf6e41e978057a2b62 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f0_2.conda#cc3f6c452697c1cf7e4e6e5f21861f96 -https://conda.anaconda.org/conda-forge/noarch/pytz-2025.1-pyhd8ed1ab_0.conda#d451ccded808abf6511f0a2ac9bb9dcc +https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h178313f_2.conda#cf2485f39740de96e2a7f2bb18ed2fee https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-3.1.0-pyhd8ed1ab_0.conda#5f0f24f8032c2c1bb33f59b75974f5fc https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.2-pyhff2d567_0.conda#9bddfdbf4e061821a1a443f93223be61 @@ -130,7 +129,7 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_1.conda#40d0ed782a8aaa16ef248e68c06c168d -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda#d17f13df8b65464ca316cbc000a3cb64 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.0-pyh29332c3_1.conda#4c446320a86cc5d48e3b80e332d6ebd7 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py312h66e93f0_0.conda#617f5d608ff8c28ad546e5d9671cbb95 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d @@ -158,13 +157,13 @@ https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.0-h0054346_0.conda#c2ad https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.0-pyh29332c3_0.conda#46276968030688a25257b08772c418fc https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda#b6a408c64b78ec7b779a3e5c7a902433 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.0-h9fa5a19_1.conda#3fbcc45b908040dca030d3f78ed9a212 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.29.3-pyhd8ed1ab_0.conda#87a2061465e55be9a997dd8cf8b5a578 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa +https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.3.0-pyhd8ed1ab_0.conda#36f6cc22457e3d6a6051c5370832f96c https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.6.1-hd8ed1ab_0.conda#7f46575a91b1307441abc235d01cab66 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h03adeef_0.conda#b1df5affe904efe82ef890826b68881d https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h00e09a9_116.conda#417864857bdb6c2be2e923e89bffd2e8 https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.4-py312h72c5963_0.conda#3f2871f111d8c0abd9c3150a8627507e @@ -173,14 +172,13 @@ https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py312h03c6e1f_1.con https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda#79963c319d1be62c8fd3e34555816e01 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.2.1-pyhd8ed1ab_0.conda#1f960a50e0fba37b5f04ec766df10657 -https://conda.anaconda.org/conda-forge/noarch/tox-4.24.2-pyh29332c3_0.conda#1688f53edfac107b4153e2b1a418a097 +https://conda.anaconda.org/conda-forge/noarch/tox-4.25.0-pyh29332c3_1.conda#33a5663573203748912efecd49a2179d https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h68727a3_5.conda#f9664ee31aed96c85b7319ab0a693341 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312h66e93f0_1.conda#d28b82fcc8d1b462b595af4b15a6cdcf https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312hc0a28a1_1.conda#990033147b0a998e756eaaed6b28f48d https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.1-py312h68727a3_0.conda#f5fbba0394ee45e9a64a73c2a994126a -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 https://conda.anaconda.org/conda-forge/noarch/identify-2.6.9-pyhd8ed1ab_0.conda#542f45bf054c6b9cf8d00a3b1976f945 -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.5-h1920b20_0.conda#ec8824a45bd7c50a46788fa16216d6c2 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h66e93f0_1.conda#5fef67f50126f40f5966a9451661280d https://conda.anaconda.org/conda-forge/noarch/nox-2025.2.9-pyh29332c3_1.conda#086837aa2602e3aeb38886e4124a6328 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py312ha707e6e_0.conda#00b999c5f9d01fb633db819d79186bd4 @@ -196,7 +194,7 @@ https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py312hf9745cd_0.conda#ea213e31805199cb7d0da457b879ceed https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py312hc0a28a1_0.conda#476b0357e207e10d2b7b13ed82156e6d -https://conda.anaconda.org/conda-forge/noarch/iris-3.11.1-pyha770c72_1.conda#f501583062225a070455d011d81b07bf +https://conda.anaconda.org/conda-forge/noarch/iris-3.12.0-pyha770c72_0.conda#f6551d52c552616493ff211ddfa01ade https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda#e9fb3fe8a5b758b4aff187d434f94f03 From 6d9b79d02d1e4d00675ee4334417cd0b4ac8d125 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Tue, 8 Apr 2025 09:57:04 +0100 Subject: [PATCH 436/583] Updated environment lockfiles (#631) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 33 +++++++++++++------------- requirements/locks/py311-linux-64.lock | 31 ++++++++++++------------ requirements/locks/py312-linux-64.lock | 31 ++++++++++++------------ 3 files changed, 46 insertions(+), 49 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index e712cbc5..338510ab 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -1,10 +1,10 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 4b79cfcae8adfdca32dfc1151f0085dbb2a52a32b9d8bcaa79abfaa5ca75f98b +# input_hash: 465e693fb2ec49a209b717d9a90a53dd6fe098568a8e7ce0928551a756675a55 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda#19f3a56f68d2fd06c516076bff482c52 -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-5_cp310.conda#2921c34715e74b3587b4cff4d36844f9 +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-6_cp310.conda#01f0f2104b8466714804a72e511de599 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 @@ -15,12 +15,12 @@ https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda#e https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda#e2775acf57efd5af15b8e3d1d74d72d3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda#8dfae1d2e74767e9ce36d5fa0d8605db -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda#db833e03127376d461e1e13e76f09b6c -https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda#e3eb7806380bc8bcecba6d749ad5f026 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda#a2222a6ada71fb478682efe483ce0f92 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 -https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda#42d5b6a0f30d3c10cd88cb8584fda1cb +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_0.conda#0e87378639676987af32fee53ba32258 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda#a78c856b6dc6bf4ea8daeb9beaaa3fb0 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 @@ -32,7 +32,6 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.c https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb9d3cd8_0.conda#2ef1822d8168ed5d79ab1bf01088419a https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.1-h97f6797_0.conda#5bc18c66111bc94532b0d2df00731c66 -https://conda.anaconda.org/conda-forge/linux-64/gtest-1.16.0-h84d6215_0.conda#964fa3cb8fd0f35754535c78d966159e https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de @@ -50,7 +49,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.co https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h0d44e9d_0.conda#3ac6daa5c1210293a6deaec0c345b230 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h81593ed_1.conda#0619e8fc4c8025a908ea3a3422d3b775 https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda#3b3e64af585eadfb52bb90b553db5edf @@ -70,13 +69,13 @@ https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda#0a4d0252248ef9a0f88f2ba8b8a08e12 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba -https://conda.anaconda.org/conda-forge/linux-64/python-3.10.16-he725a3c_1_cpython.conda#b887811a901b3aa622a92caf03bc8917 +https://conda.anaconda.org/conda-forge/linux-64/python-3.10.16-habfa6aa_2_cpython.conda#35e864ff2ec654d09fdc189706dfd139 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.49.1-h9eae976_2.conda#1894a9d3a8c3ffa53f8ca09fcd2fac25 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a -https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.1-pyhd8ed1ab_0.conda#a987028d24022ab69e89efda50589832 +https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.2-pyhd8ed1ab_0.conda#eb9d4263271ca287d2e0cf5a86da2d3a https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_2.conda#bf502c169c71e3c6ac0d6175addfacc2 @@ -95,7 +94,7 @@ https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda#4547b39256e296bb758166893e909a7c https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.0-pyhd8ed1ab_0.conda#5ecafd654e33d1f2ecac5ec97057593b +https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.2-pyhd8ed1ab_0.conda#9c40692c3d24c7aaf335f673ac09d308 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 @@ -104,7 +103,7 @@ https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py310h3788b33_0.conda#4186d9b4d004b0fe0de6aa62496fb48a https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda#728dbebd0f7a20337218beacffd37916 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.12.1-h332b0f4_0.conda#45e9dc4e7b25e2841deb392be085500e +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.13.0-h332b0f4_0.conda#cbdc92ac0d93fe3c796e36ad65c7905c https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda#0ea6510969e1296cc19966fad481f6de https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 @@ -121,7 +120,7 @@ https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#4 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py310ha75aee5_2.conda#af6da4542e91edaf59b614ce7e991700 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py310h89163eb_2.conda#fd343408e64cf1e273ab7c710da374db -https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.2-pyhff2d567_0.conda#9bddfdbf4e061821a1a443f93223be61 +https://conda.anaconda.org/conda-forge/noarch/setuptools-78.1.0-pyhff2d567_0.conda#a42da9837e46c53494df0044c3eb1f53 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb @@ -136,9 +135,9 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0. https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3cc595284c5e8f0f9900a9b228a332 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h8deb56e_0.conda#1fc24a3196ad5ede2a68148be61894f4 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.7.1-py310h89163eb_0.conda#edde6b6a84f503e98f72f094e792e07d +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.0-py310h89163eb_0.conda#9f7865c17117d16f804b687b498e35fa https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.0-pyh29332c3_0.conda#b1ed099fbbf189bf23967ed938316d05 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.56.0-py310h89163eb_0.conda#cd3125e1924bd8699dac9989652bca74 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.57.0-py310h89163eb_0.conda#34378af82141b3c1725dcdf898b28fc6 https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h2d575fe_109.conda#e7a7a6e6f70553a31e6e79c65768d089 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda#f4b39bf00c69f56ac01e020ebfac066c @@ -152,12 +151,12 @@ https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/noarch/pip-25.0.1-pyh8b19718_0.conda#79b5c1440aedc5010f687048d9103628 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.0-h0054346_0.conda#c2ad1b40a59bb94a629a812c656973e1 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.0-h0054346_1.conda#a3547a9c204da804d8ef9c40c7ac0b84 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.0-pyh29332c3_0.conda#46276968030688a25257b08772c418fc https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.0-h9fa5a19_1.conda#3fbcc45b908040dca030d3f78ed9a212 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.29.3-pyhd8ed1ab_0.conda#87a2061465e55be9a997dd8cf8b5a578 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.30.0-pyhd8ed1ab_0.conda#c0e0b4a09aa5a698a1bdd4ebfe28be38 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa @@ -183,7 +182,7 @@ https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py310ha75aee5_1.co https://conda.anaconda.org/conda-forge/noarch/nox-2025.2.9-pyh29332c3_1.conda#086837aa2602e3aeb38886e4124a6328 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.conda#8c29cd33b64b2eb78597fa28b5595c8d https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.2.1-hd8ed1ab_0.conda#ba6dd8f5a2d2b46fd52f03ac212e8c6a -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.7-py310h247727d_1.conda#a7e42b858b9635d1c32c948610186d58 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.0-py310h247727d_0.conda#b9400ee14c9b59a3d9f4da715e67c1f8 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py310hf462985_0.conda#c31938674e4cda43617a4d70f99ffd0c https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.40.0-h8bb6dbc_0.conda#52c8d85ec289a75e7c731932f45c533d diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 8403d177..6e44967f 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -1,10 +1,10 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: fe5452e41de90dae4e169a25fead307770c576d24c6b8b5ccaf1c6db315e8ae0 +# input_hash: 2f469aa469a97c8842f7f33f90dd774c2cfd2c3d653c15f41529575af6805444 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda#19f3a56f68d2fd06c516076bff482c52 -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-5_cp311.conda#139a8d40c8a2f430df31048949e450de +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-6_cp311.conda#37ec65e056b9964529c0e1e2697b9955 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 @@ -15,12 +15,12 @@ https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda#e https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda#e2775acf57efd5af15b8e3d1d74d72d3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda#8dfae1d2e74767e9ce36d5fa0d8605db -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda#db833e03127376d461e1e13e76f09b6c -https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda#e3eb7806380bc8bcecba6d749ad5f026 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda#a2222a6ada71fb478682efe483ce0f92 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 -https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda#42d5b6a0f30d3c10cd88cb8584fda1cb +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_0.conda#0e87378639676987af32fee53ba32258 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda#a78c856b6dc6bf4ea8daeb9beaaa3fb0 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 @@ -32,7 +32,6 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.c https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb9d3cd8_0.conda#2ef1822d8168ed5d79ab1bf01088419a https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.1-h97f6797_0.conda#5bc18c66111bc94532b0d2df00731c66 -https://conda.anaconda.org/conda-forge/linux-64/gtest-1.16.0-h84d6215_0.conda#964fa3cb8fd0f35754535c78d966159e https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de @@ -50,7 +49,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.co https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h0d44e9d_0.conda#3ac6daa5c1210293a6deaec0c345b230 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h81593ed_1.conda#0619e8fc4c8025a908ea3a3422d3b775 https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda#3b3e64af585eadfb52bb90b553db5edf @@ -76,7 +75,7 @@ https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.49.1-h9eae976_2.conda#1 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a -https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.1-pyhd8ed1ab_0.conda#a987028d24022ab69e89efda50589832 +https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.2-pyhd8ed1ab_0.conda#eb9d4263271ca287d2e0cf5a86da2d3a https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hfdbb021_2.conda#d21daab070d76490cb39a8f1d1729d79 @@ -95,7 +94,7 @@ https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda#4547b39256e296bb758166893e909a7c https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.0-pyhd8ed1ab_0.conda#5ecafd654e33d1f2ecac5ec97057593b +https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.2-pyhd8ed1ab_0.conda#9c40692c3d24c7aaf335f673ac09d308 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 @@ -104,7 +103,7 @@ https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py311hd18a35c_0.conda#be34c90cce87090d24da64a7c239ca96 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda#728dbebd0f7a20337218beacffd37916 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.12.1-h332b0f4_0.conda#45e9dc4e7b25e2841deb392be085500e +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.13.0-h332b0f4_0.conda#cbdc92ac0d93fe3c796e36ad65c7905c https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda#0ea6510969e1296cc19966fad481f6de https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 @@ -122,7 +121,7 @@ https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py311h9ecbd0 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py311h2dc5d0c_2.conda#014417753f948da1f70d132b2de573be https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-3.1.0-pyhd8ed1ab_0.conda#5f0f24f8032c2c1bb33f59b75974f5fc -https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.2-pyhff2d567_0.conda#9bddfdbf4e061821a1a443f93223be61 +https://conda.anaconda.org/conda-forge/noarch/setuptools-78.1.0-pyhff2d567_0.conda#a42da9837e46c53494df0044c3eb1f53 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb @@ -137,9 +136,9 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0. https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3cc595284c5e8f0f9900a9b228a332 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311hf29c0ef_0.conda#55553ecd5328336368db611f350b7039 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.7.1-py311h2dc5d0c_0.conda#5f57c67f3880dd62b83b3867ea03d9bc +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.0-py311h2dc5d0c_0.conda#37bc439a94beeb29914baa5b4987ebd5 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.0-pyh29332c3_0.conda#b1ed099fbbf189bf23967ed938316d05 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.56.0-py311h2dc5d0c_0.conda#ca3692015a53c7fcc248a324a540c54c +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.57.0-py311h2dc5d0c_0.conda#4175f366b41d3d0c80d02661a0a03473 https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h2d575fe_109.conda#e7a7a6e6f70553a31e6e79c65768d089 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda#f4b39bf00c69f56ac01e020ebfac066c @@ -153,12 +152,12 @@ https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/noarch/pip-25.0.1-pyh8b19718_0.conda#79b5c1440aedc5010f687048d9103628 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.0-h0054346_0.conda#c2ad1b40a59bb94a629a812c656973e1 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.0-h0054346_1.conda#a3547a9c204da804d8ef9c40c7ac0b84 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.0-pyh29332c3_0.conda#46276968030688a25257b08772c418fc https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.0-h9fa5a19_1.conda#3fbcc45b908040dca030d3f78ed9a212 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.29.3-pyhd8ed1ab_0.conda#87a2061465e55be9a997dd8cf8b5a578 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.30.0-pyhd8ed1ab_0.conda#c0e0b4a09aa5a698a1bdd4ebfe28be38 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa @@ -183,7 +182,7 @@ https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py311h9ecbd09_1.co https://conda.anaconda.org/conda-forge/noarch/nox-2025.2.9-pyh29332c3_1.conda#086837aa2602e3aeb38886e4124a6328 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py311h8f841c2_0.conda#5ec0a1732a05376241e1e4c6d50e0e91 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.2.1-hd8ed1ab_0.conda#ba6dd8f5a2d2b46fd52f03ac212e8c6a -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.7-py311h3dc67b8_1.conda#6cbf7751d366a923688ae18530a93047 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.0-py311h3dc67b8_0.conda#697054700855c7699805f41ad7f204a3 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py311h9f3472d_0.conda#555b148cafbd96b658499060d5e11a65 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.40.0-h8bb6dbc_0.conda#52c8d85ec289a75e7c731932f45c533d diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index a0a45295..6c8f71f8 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -1,10 +1,10 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: e86d945e803f06926278032cd38065b8f5ad074d360d325088b9a2f395cf50c0 +# input_hash: 7f7d55e8ff7b75c71697413c5124c49e86f79ebc2be8dfacf5cb201afb20c50b @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda#19f3a56f68d2fd06c516076bff482c52 -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda#0424ae29b104430108f5218a66db7260 +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-6_cp312.conda#95bd67b1113859774c30418e8481f9d8 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 @@ -15,12 +15,12 @@ https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda#e https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda#e2775acf57efd5af15b8e3d1d74d72d3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda#8dfae1d2e74767e9ce36d5fa0d8605db -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda#db833e03127376d461e1e13e76f09b6c -https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda#e3eb7806380bc8bcecba6d749ad5f026 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda#a2222a6ada71fb478682efe483ce0f92 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 -https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda#42d5b6a0f30d3c10cd88cb8584fda1cb +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_0.conda#0e87378639676987af32fee53ba32258 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda#a78c856b6dc6bf4ea8daeb9beaaa3fb0 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 @@ -32,7 +32,6 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.c https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb9d3cd8_0.conda#2ef1822d8168ed5d79ab1bf01088419a https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.1-h97f6797_0.conda#5bc18c66111bc94532b0d2df00731c66 -https://conda.anaconda.org/conda-forge/linux-64/gtest-1.16.0-h84d6215_0.conda#964fa3cb8fd0f35754535c78d966159e https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de @@ -50,7 +49,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.co https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h0d44e9d_0.conda#3ac6daa5c1210293a6deaec0c345b230 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h81593ed_1.conda#0619e8fc4c8025a908ea3a3422d3b775 https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda#3b3e64af585eadfb52bb90b553db5edf @@ -76,7 +75,7 @@ https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.49.1-h9eae976_2.conda#1 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a -https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.1-pyhd8ed1ab_0.conda#a987028d24022ab69e89efda50589832 +https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.2-pyhd8ed1ab_0.conda#eb9d4263271ca287d2e0cf5a86da2d3a https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda#b0b867af6fc74b2a0aa206da29c0f3cf @@ -95,7 +94,7 @@ https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda#4547b39256e296bb758166893e909a7c https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.0-pyhd8ed1ab_0.conda#5ecafd654e33d1f2ecac5ec97057593b +https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.2-pyhd8ed1ab_0.conda#9c40692c3d24c7aaf335f673ac09d308 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 @@ -104,7 +103,7 @@ https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.8-py312h84d6215_0.conda#6713467dc95509683bfa3aca08524e8a https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda#728dbebd0f7a20337218beacffd37916 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.12.1-h332b0f4_0.conda#45e9dc4e7b25e2841deb392be085500e +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.13.0-h332b0f4_0.conda#cbdc92ac0d93fe3c796e36ad65c7905c https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda#0ea6510969e1296cc19966fad481f6de https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 @@ -122,7 +121,7 @@ https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h178313f_2.conda#cf2485f39740de96e2a7f2bb18ed2fee https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-3.1.0-pyhd8ed1ab_0.conda#5f0f24f8032c2c1bb33f59b75974f5fc -https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.2-pyhff2d567_0.conda#9bddfdbf4e061821a1a443f93223be61 +https://conda.anaconda.org/conda-forge/noarch/setuptools-78.1.0-pyhff2d567_0.conda#a42da9837e46c53494df0044c3eb1f53 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb @@ -137,9 +136,9 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0. https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3cc595284c5e8f0f9900a9b228a332 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda#a861504bbea4161a9170b85d4d2be840 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.7.1-py312h178313f_0.conda#c9c5941aa3ad8c8324edf65128121395 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.0-py312h178313f_0.conda#d0fca021e354cc96455021852a1fad6d https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.0-pyh29332c3_0.conda#b1ed099fbbf189bf23967ed938316d05 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.56.0-py312h178313f_0.conda#2f8a66f2f9eb931cdde040d02c6ab54c +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.57.0-py312h178313f_0.conda#97907388593b27ac01237a1023d58d3d https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h2d575fe_109.conda#e7a7a6e6f70553a31e6e79c65768d089 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda#f4b39bf00c69f56ac01e020ebfac066c @@ -153,12 +152,12 @@ https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/noarch/pip-25.0.1-pyh8b19718_0.conda#79b5c1440aedc5010f687048d9103628 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.0-h0054346_0.conda#c2ad1b40a59bb94a629a812c656973e1 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.0-h0054346_1.conda#a3547a9c204da804d8ef9c40c7ac0b84 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.0-pyh29332c3_0.conda#46276968030688a25257b08772c418fc https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.0-h9fa5a19_1.conda#3fbcc45b908040dca030d3f78ed9a212 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.29.3-pyhd8ed1ab_0.conda#87a2061465e55be9a997dd8cf8b5a578 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.30.0-pyhd8ed1ab_0.conda#c0e0b4a09aa5a698a1bdd4ebfe28be38 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa @@ -183,7 +182,7 @@ https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h66e93f0_1.co https://conda.anaconda.org/conda-forge/noarch/nox-2025.2.9-pyh29332c3_1.conda#086837aa2602e3aeb38886e4124a6328 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py312ha707e6e_0.conda#00b999c5f9d01fb633db819d79186bd4 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.2.1-hd8ed1ab_0.conda#ba6dd8f5a2d2b46fd52f03ac212e8c6a -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.7-py312h21f5128_1.conda#98d83a309c3f330793a7cc8d48c67f81 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.0-py312h21f5128_0.conda#761c745a289b3d6abf56eb1193343172 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py312hc0a28a1_0.conda#8b5b812d4c18cb37bda7a7c8d3a6acb3 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.40.0-h8bb6dbc_0.conda#52c8d85ec289a75e7c731932f45c533d From 8e0a59869fe0b6d583fc28c25272b3eb8f550f5e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 10 Apr 2025 15:50:28 +0100 Subject: [PATCH 437/583] chore: update pre-commit hooks (#625) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: update pre-commit hooks updates: - [github.com/astral-sh/ruff-pre-commit: v0.9.10 → v0.11.4](https://github.com/astral-sh/ruff-pre-commit/compare/v0.9.10...v0.11.4) - [github.com/abravalheri/validate-pyproject: v0.23 → v0.24.1](https://github.com/abravalheri/validate-pyproject/compare/v0.23...v0.24.1) * Refactor arg handling to satisfy ruff type usage checker. * Remove redundant uses of int(round(..)) picked up by updated ruff checks. * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Patrick Peglar --- .pre-commit-config.yaml | 4 ++-- noxfile.py | 10 ++++++++-- src/iris_grib/_save_rules.py | 16 ++++++---------- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index db9ffab8..22689d30 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -78,7 +78,7 @@ repos: types: [file, python] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.9.10" + rev: "v0.11.4" hooks: - id: ruff types: [file, python] @@ -101,6 +101,6 @@ repos: - repo: https://github.com/abravalheri/validate-pyproject # More exhaustive than Ruff RUF200. - rev: "v0.23" + rev: "v0.24.1" hooks: - id: validate-pyproject diff --git a/noxfile.py b/noxfile.py index f04ee7b4..7a6cab7c 100644 --- a/noxfile.py +++ b/noxfile.py @@ -24,8 +24,14 @@ PACKAGE = str("iris_grib") #: Cirrus-CI environment variable hook. -PY_VER = os.environ.get("PY_VER", ["3.10", "3.11", "3.12"]) -IRIS_SOURCE = os.environ.get("IRIS_SOURCE", ["source", "conda-forge"]) +PY_VER = os.environ.get("PY_VER") +if PY_VER is None: + # Default to testing against 3 standard Python versions. + PY_VER = ["3.10", "3.11", "3.12"] +IRIS_SOURCE = os.environ.get("IRIS_SOURCE") +if IRIS_SOURCE is None: + # Default to testing against *both* "upstream-main" and "latest-release" Iris. + IRIS_SOURCE = ["source", "conda-forge"] #: Default cartopy cache directory. CARTOPY_CACHE_DIR = os.environ.get("HOME") / Path(".local/share/cartopy") diff --git a/src/iris_grib/_save_rules.py b/src/iris_grib/_save_rules.py index 47af1e28..8695ca0c 100644 --- a/src/iris_grib/_save_rules.py +++ b/src/iris_grib/_save_rules.py @@ -307,8 +307,8 @@ def rotated_pole(cube, grib): # WORKAROUND latitude = cs.grid_north_pole_latitude / _DEFAULT_DEGREES_UNITS longitude = ((cs.grid_north_pole_longitude + 180) % 360) / _DEFAULT_DEGREES_UNITS - eccodes.codes_set(grib, "latitudeOfSouthernPole", -int(round(latitude))) - eccodes.codes_set(grib, "longitudeOfSouthernPole", int(round(longitude))) + eccodes.codes_set(grib, "latitudeOfSouthernPole", -round(latitude)) + eccodes.codes_set(grib, "longitudeOfSouthernPole", round(longitude)) eccodes.codes_set(grib, "angleOfRotation", 0) @@ -550,7 +550,7 @@ def grid_definition_template_12(cube, grib): # Convert a value in metres into the closest integer number of # centimetres. def m_to_cm(value): - return int(round(value * 100)) + return round(value * 100) # False easting and false northing are measured in units of (10^-2)m. eccodes.codes_set(grib, "XR", m_to_cm(cs.false_easting)) @@ -1126,7 +1126,7 @@ def set_fixed_surfaces(cube, grib, full3d_cube=None): output_v = v_coord.units.convert(output_v, output_unit) if output_v - abs(output_v): warnings.warn("Vertical level encoding problem: scaling required.") - output_v = int(round(output_v)) + output_v = round(output_v) eccodes.codes_set(grib, "typeOfFirstFixedSurface", grib_v_code) eccodes.codes_set(grib, "scaleFactorOfFirstFixedSurface", 0) @@ -1145,12 +1145,8 @@ def set_fixed_surfaces(cube, grib, full3d_cube=None): eccodes.codes_set(grib, "typeOfSecondFixedSurface", grib_v_code) eccodes.codes_set(grib, "scaleFactorOfFirstFixedSurface", 0) eccodes.codes_set(grib, "scaleFactorOfSecondFixedSurface", 0) - eccodes.codes_set( - grib, "scaledValueOfFirstFixedSurface", int(round(output_v[0])) - ) - eccodes.codes_set( - grib, "scaledValueOfSecondFixedSurface", int(round(output_v[1])) - ) + eccodes.codes_set(grib, "scaledValueOfFirstFixedSurface", round(output_v[0])) + eccodes.codes_set(grib, "scaledValueOfSecondFixedSurface", round(output_v[1])) if hybrid_factory is not None: # Need to record ALL the level coefficients in a 'PV' vector. From abe16639fb27496265a32a839575b6b36580d92b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Apr 2025 14:48:15 +0100 Subject: [PATCH 438/583] Bump scitools/workflows in the dependencies group (#632) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2025.03.8 to 2025.04.0 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.03.8...2025.04.0) --- updated-dependencies: - dependency-name: scitools/workflows dependency-version: 2025.04.0 dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/ci-template-check.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 3d8ff173..f87474c3 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.03.8 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.04.0 diff --git a/.github/workflows/ci-template-check.yml b/.github/workflows/ci-template-check.yml index 58877cac..5ba74f84 100644 --- a/.github/workflows/ci-template-check.yml +++ b/.github/workflows/ci-template-check.yml @@ -10,7 +10,7 @@ on: jobs: prompt-share: - uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.03.8 + uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.04.0 secrets: inherit with: pr_number: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index c4373f5a..f7e1f928 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.03.8 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.04.0 secrets: inherit From 94354a94a023fa20d0445845c0f989a8ca7dc52d Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Tue, 15 Apr 2025 18:02:38 +0100 Subject: [PATCH 439/583] Updated environment lockfiles (#633) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 16 ++++++++-------- requirements/locks/py311-linux-64.lock | 16 ++++++++-------- requirements/locks/py312-linux-64.lock | 16 ++++++++-------- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 338510ab..da75d7b5 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -12,7 +12,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda# https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda#c151d5eb730e9b7480e6d48c0fc44048 https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda#ef504d1acbd74b7cc6849ef8af47dd03 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda#e2775acf57efd5af15b8e3d1d74d72d3 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda#8dfae1d2e74767e9ce36d5fa0d8605db https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 @@ -25,7 +25,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.cond https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda#41adf927e746dc75ecf0ef841c454e48 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_0.conda#bb539841f2a3fde210f387d00ed4bb9d https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 @@ -69,7 +69,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda#0a4d0252248ef9a0f88f2ba8b8a08e12 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba -https://conda.anaconda.org/conda-forge/linux-64/python-3.10.16-habfa6aa_2_cpython.conda#35e864ff2ec654d09fdc189706dfd139 +https://conda.anaconda.org/conda-forge/linux-64/python-3.10.17-hd6af730_0_cpython.conda#7bb89638dae9ce1b8e051d0b721e83c2 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.49.1-h9eae976_2.conda#1894a9d3a8c3ffa53f8ca09fcd2fac25 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 @@ -127,7 +127,7 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_1.conda#40d0ed782a8aaa16ef248e68c06c168d -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.0-pyh29332c3_1.conda#4c446320a86cc5d48e3b80e332d6ebd7 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda#83fc6ae00127671e301c9f44254c31b8 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py310ha75aee5_0.conda#1d7a4b9202cdd10d56ecdd7f6c347190 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d @@ -155,7 +155,7 @@ https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.0-h0054346_1.conda#a354 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.0-pyh29332c3_0.conda#46276968030688a25257b08772c418fc https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.0-h9fa5a19_1.conda#3fbcc45b908040dca030d3f78ed9a212 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.2-h0e9735f_0.conda#568ed1300869dca0ba09fb750cda5dbb https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.30.0-pyhd8ed1ab_0.conda#c0e0b4a09aa5a698a1bdd4ebfe28be38 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 @@ -167,7 +167,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h00e09a9_1 https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.4-py310hefbff90_0.conda#b3a99849aa14b78d32250c0709e8792a https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py310h7e6dc6c_0.conda#14d300b9e1504748e70cc6499a7b4d25 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py310h71d0299_1.conda#e54b1eaeb50ad1767680181a8575a8db -https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda#79963c319d1be62c8fd3e34555816e01 +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.2.1-pyhd8ed1ab_0.conda#1f960a50e0fba37b5f04ec766df10657 https://conda.anaconda.org/conda-forge/noarch/tox-4.25.0-pyh29332c3_1.conda#33a5663573203748912efecd49a2179d @@ -183,9 +183,9 @@ https://conda.anaconda.org/conda-forge/noarch/nox-2025.2.9-pyh29332c3_1.conda#08 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.conda#8c29cd33b64b2eb78597fa28b5595c8d https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.2.1-hd8ed1ab_0.conda#ba6dd8f5a2d2b46fd52f03ac212e8c6a https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.0-py310h247727d_0.conda#b9400ee14c9b59a3d9f4da715e67c1f8 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.4.0-pyhd8ed1ab_0.conda#c1e349028e0052c4eea844e94f773065 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py310hf462985_0.conda#c31938674e4cda43617a4d70f99ffd0c -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.40.0-h8bb6dbc_0.conda#52c8d85ec289a75e7c731932f45c533d +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.41.0-h8bb6dbc_0.conda#1130a9254394ac1a32031fd6f03a714c https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.1-py310h68603db_0.conda#29cf3f5959afb841eda926541f26b0fb https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py310h9f0ad05_101.conda#f58947ff305aa8be0b33769ee67ddb10 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.2.0-pyha770c72_0.conda#17e487cc8b5507cd3abc09398cf27949 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 6e44967f..ca0e7ae6 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -12,7 +12,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda# https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda#c151d5eb730e9b7480e6d48c0fc44048 https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda#ef504d1acbd74b7cc6849ef8af47dd03 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda#e2775acf57efd5af15b8e3d1d74d72d3 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda#8dfae1d2e74767e9ce36d5fa0d8605db https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 @@ -25,7 +25,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.cond https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda#41adf927e746dc75ecf0ef841c454e48 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_0.conda#bb539841f2a3fde210f387d00ed4bb9d https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 @@ -69,7 +69,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda#0a4d0252248ef9a0f88f2ba8b8a08e12 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba -https://conda.anaconda.org/conda-forge/linux-64/python-3.11.11-h9e4cc4f_2_cpython.conda#81dd3e521f9b9eaa58d06213e28aaa9b +https://conda.anaconda.org/conda-forge/linux-64/python-3.11.12-h9e4cc4f_0_cpython.conda#b61d4fbf583b8393d9d00ec106ad3658 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.49.1-h9eae976_2.conda#1894a9d3a8c3ffa53f8ca09fcd2fac25 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 @@ -128,7 +128,7 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_1.conda#40d0ed782a8aaa16ef248e68c06c168d -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.0-pyh29332c3_1.conda#4c446320a86cc5d48e3b80e332d6ebd7 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda#83fc6ae00127671e301c9f44254c31b8 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py311h9ecbd09_0.conda#51a12678b609f5794985fda8372b1a49 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d @@ -156,7 +156,7 @@ https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.0-h0054346_1.conda#a354 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.0-pyh29332c3_0.conda#46276968030688a25257b08772c418fc https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.0-h9fa5a19_1.conda#3fbcc45b908040dca030d3f78ed9a212 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.2-h0e9735f_0.conda#568ed1300869dca0ba09fb750cda5dbb https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.30.0-pyhd8ed1ab_0.conda#c0e0b4a09aa5a698a1bdd4ebfe28be38 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 @@ -168,7 +168,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h00e09a9_1 https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.4-py311h5d046bc_0.conda#16ad2b996ea8064e0a7cb8b392d924fd https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py311h1322bbf_0.conda#9f4f5593335f76c1dbf7381c11fe7155 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py311h0960b38_1.conda#5e6251fd41d984a9d4fd1fe4b9bdca31 -https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda#79963c319d1be62c8fd3e34555816e01 +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.2.1-pyhd8ed1ab_0.conda#1f960a50e0fba37b5f04ec766df10657 https://conda.anaconda.org/conda-forge/noarch/tox-4.25.0-pyh29332c3_1.conda#33a5663573203748912efecd49a2179d @@ -183,9 +183,9 @@ https://conda.anaconda.org/conda-forge/noarch/nox-2025.2.9-pyh29332c3_1.conda#08 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py311h8f841c2_0.conda#5ec0a1732a05376241e1e4c6d50e0e91 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.2.1-hd8ed1ab_0.conda#ba6dd8f5a2d2b46fd52f03ac212e8c6a https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.0-py311h3dc67b8_0.conda#697054700855c7699805f41ad7f204a3 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.4.0-pyhd8ed1ab_0.conda#c1e349028e0052c4eea844e94f773065 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py311h9f3472d_0.conda#555b148cafbd96b658499060d5e11a65 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.40.0-h8bb6dbc_0.conda#52c8d85ec289a75e7c731932f45c533d +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.41.0-h8bb6dbc_0.conda#1130a9254394ac1a32031fd6f03a714c https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.1-py311h2b939e6_0.conda#eed17bae389043337f33b95a0fd8c172 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py311hae66bec_101.conda#776c96dd51168ef9da0d63d5e49785f5 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.2.0-pyha770c72_0.conda#17e487cc8b5507cd3abc09398cf27949 diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 6c8f71f8..56d21ae8 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -12,7 +12,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda# https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda#c151d5eb730e9b7480e6d48c0fc44048 https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda#ef504d1acbd74b7cc6849ef8af47dd03 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda#e2775acf57efd5af15b8e3d1d74d72d3 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda#8dfae1d2e74767e9ce36d5fa0d8605db https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 @@ -25,7 +25,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.cond https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda#41adf927e746dc75ecf0ef841c454e48 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_0.conda#bb539841f2a3fde210f387d00ed4bb9d https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 @@ -69,7 +69,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda#0a4d0252248ef9a0f88f2ba8b8a08e12 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba -https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_1_cpython.conda#d82342192dfc9145185190e651065aa9 +https://conda.anaconda.org/conda-forge/linux-64/python-3.12.10-h9e4cc4f_0_cpython.conda#a41d26cd4d47092d683915d058380dec https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.49.1-h9eae976_2.conda#1894a9d3a8c3ffa53f8ca09fcd2fac25 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 @@ -128,7 +128,7 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_1.conda#40d0ed782a8aaa16ef248e68c06c168d -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.0-pyh29332c3_1.conda#4c446320a86cc5d48e3b80e332d6ebd7 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda#83fc6ae00127671e301c9f44254c31b8 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py312h66e93f0_0.conda#617f5d608ff8c28ad546e5d9671cbb95 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d @@ -156,7 +156,7 @@ https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.0-h0054346_1.conda#a354 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.0-pyh29332c3_0.conda#46276968030688a25257b08772c418fc https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.0-h9fa5a19_1.conda#3fbcc45b908040dca030d3f78ed9a212 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.2-h0e9735f_0.conda#568ed1300869dca0ba09fb750cda5dbb https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.30.0-pyhd8ed1ab_0.conda#c0e0b4a09aa5a698a1bdd4ebfe28be38 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 @@ -168,7 +168,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h00e09a9_1 https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.4-py312h72c5963_0.conda#3f2871f111d8c0abd9c3150a8627507e https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py312h80c1187_0.conda#d3894405f05b2c0f351d5de3ae26fa9c https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py312h03c6e1f_1.conda#f754591f9ec0169e436fa84cb9db0c32 -https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.0.0-pyhd8ed1ab_1.conda#79963c319d1be62c8fd3e34555816e01 +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.2.1-pyhd8ed1ab_0.conda#1f960a50e0fba37b5f04ec766df10657 https://conda.anaconda.org/conda-forge/noarch/tox-4.25.0-pyh29332c3_1.conda#33a5663573203748912efecd49a2179d @@ -183,9 +183,9 @@ https://conda.anaconda.org/conda-forge/noarch/nox-2025.2.9-pyh29332c3_1.conda#08 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py312ha707e6e_0.conda#00b999c5f9d01fb633db819d79186bd4 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.2.1-hd8ed1ab_0.conda#ba6dd8f5a2d2b46fd52f03ac212e8c6a https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.0-py312h21f5128_0.conda#761c745a289b3d6abf56eb1193343172 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.3.0-pyhd8ed1ab_0.conda#32674f8dbfb7b26410ed580dd3c10a29 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.4.0-pyhd8ed1ab_0.conda#c1e349028e0052c4eea844e94f773065 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py312hc0a28a1_0.conda#8b5b812d4c18cb37bda7a7c8d3a6acb3 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.40.0-h8bb6dbc_0.conda#52c8d85ec289a75e7c731932f45c533d +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.41.0-h8bb6dbc_0.conda#1130a9254394ac1a32031fd6f03a714c https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.1-py312hd3ec401_0.conda#514d8a6894286f6d9894b352782c7e18 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py312h21d6d8e_101.conda#0cabc6745882859ec7be35433c7b8f24 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.2.0-pyha770c72_0.conda#17e487cc8b5507cd3abc09398cf27949 From 4c5c160c9e8175374d7956a6955c7286a16f36c3 Mon Sep 17 00:00:00 2001 From: stephenworsley <49274989+stephenworsley@users.noreply.github.com> Date: Thu, 24 Apr 2025 17:15:04 +0100 Subject: [PATCH 440/583] Address repo-review checks (#638) * address repo-review checks * fix filterwarnings --- .pre-commit-config.yaml | 25 +++++++++++++++++++++++++ docs/index.rst | 2 +- pyproject.toml | 11 ++--------- src/iris_grib/message.py | 4 ++-- 4 files changed, 30 insertions(+), 12 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 22689d30..be08b90e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -104,3 +104,28 @@ repos: rev: "v0.24.1" hooks: - id: validate-pyproject + +- repo: https://github.com/pre-commit/pygrep-hooks + rev: v1.10.0 + hooks: + - id: python-check-blanket-noqa + # Enforce that all noqa annotations always occur with specific codes. + - id: python-check-blanket-type-ignore + # Enforce that "# type: ignore" annotations always occur with specific codes. + - id: python-check-mock-methods + # Prevent common mistakes of assert mck.not_called(), assert + # mck.called_once_with(...) and mck.assert_called. + - id: python-no-eval + # A quick check for the eval() built-in function + - id: python-no-log-warn + # A quick check for the deprecated .warn() method of python loggers + - id: python-use-type-annotations + # Enforce that python3.6+ type annotations are used instead of type comments + - id: rst-backticks + # Detect common mistake of using single backticks when writing rst. + - id: rst-directive-colons + # Detect mistake of rst directive not ending with double colon. + - id: rst-inline-touching-normal + # Detect mistake of inline code touching normal text in rst. + - id: text-unicode-replacement-char + # Forbid files which have a UTF-8 Unicode replacement character. diff --git a/docs/index.rst b/docs/index.rst index b74521a9..63f722ea 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,7 +1,7 @@ .. iris-grib documentation master file, created by sphinx-quickstart on Fri May 13 11:48:28 2016. You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. + contain the root ``toctree`` directive. Iris-grib v0.20 =============== diff --git a/pyproject.toml b/pyproject.toml index bdb2a577..5c295505 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -111,7 +111,7 @@ ignore = [ # Extra checks we have chosen to enable. warn_unused_configs = true warn_unreachable = true -enable_error_code = ["ignore-without-code", "truthy-bool"] +enable_error_code = ["ignore-without-code", "redundant-expr", "truthy-bool"] # Checks we have temporarily *disabled* # NOTE: @@ -150,19 +150,12 @@ log_cli_level = "INFO" minversion = "6.0" testpaths = "src/iris_grib" xfail_strict = "True" +filterwarnings = ["default"] [tool.repo-review] ignore = [ - # https://learn.scientific-python.org/development/guides/style/#MY102 - "MY102", # MyPy show_error_codes deprecated - # https://learn.scientific-python.org/development/guides/style/#MY105 - "MY105", # MyPy redundant-expr deprecated - # https://learn.scientific-python.org/development/guides/style/#PC170 - "PC170", # Uses PyGrep hooks # https://learn.scientific-python.org/development/guides/style/#PC180 "PC180", # Uses prettier - # https://learn.scientific-python.org/development/guides/pytest/#PP309 - "PP309", # Filter warnings specified ] [tool.ruff] diff --git a/src/iris_grib/message.py b/src/iris_grib/message.py index 1c03add1..132f4db8 100644 --- a/src/iris_grib/message.py +++ b/src/iris_grib/message.py @@ -521,8 +521,8 @@ def _get_key_value(self, key): res = eccodes.codes_get_array(self._message_id, key) elif key == "bitmap": # The bitmap is stored as contiguous boolean bits, one bit for each - # data point. ecCodes returns these as strings, so it must be - # type-cast to return an array of ints (0, 1). + # data point. ecCodes returns these as strings, so it must be type-cast + # to return an array of ints (0, 1). res = eccodes.codes_get_array(self._message_id, key, int) elif key in ("typeOfFirstFixedSurface", "typeOfSecondFixedSurface"): # By default these values are returned as unhelpful strings but From d601a969e27849a48be7e5b06d2fe064dc68eb26 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Fri, 25 Apr 2025 17:19:14 +0100 Subject: [PATCH 441/583] Aligned manifest with scitools template. (#637) * Aligned manifest with scitools template. * Add iris-derived extra root files. * Explicitly exclude CONTRIBUTING.md, to satisfy ci-manifest check. * Realign with re-styled template. --- MANIFEST.in | 98 +++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 92 insertions(+), 6 deletions(-) diff --git a/MANIFEST.in b/MANIFEST.in index 562e6a72..c381edb5 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,18 +1,104 @@ -prune .github -prune .nox +# NOTE: based on a generic template in Scitools/.github/templates/MANIFEST.in + +# General principles +# - enable user to build locally, as well as in CI +# - make it ignore temporary files generated by dev processes, e.g. coverage checks +# - encode typical decisions, e.g. whether we package docs, requirements etc + +#--------- +# SECTION: main code sources +# +recursive-include src *.cml *.grib2 *.json *.nc *.py + # principles: + # - *no* "prune" command is used + # - use "include-recursive", by relevant file extensions + # hints: + # - top-level dir is typically "src", but maybe "lib" or + # - default package rules mean we generally don't actually *need* a statement + # - but it's better to be explicit + # - extension filetypes are typically sources (*.py) + # - might also need testdata files, e.g. *.nc, *.npy *.npz + # - also possibly non-python, e.g. *.pyx for Cython + + +#--------- +# SECTION: docs prune docs +# and if required ... include ONLY docs source files. +# E.G. recursive-include docs *.rst *.inc + # principles: + # - use prune to ignore everything (optionally: except the docs sources) + # hints: + # - most projects don't want to package the docs, but some currently do (cf-units). + + +#--------- +# SECTION: requirements prune requirements recursive-include requirements *.txt -recursive-include src *.cml *.grib2 *.json *.nc *.py + # principles: + # include just requirements-level info, not lock files + # hints: + # - not all projects include requirements, but they can be drawn in anyway by dynamic dependencies + # in the setuptools build process, linked via config in pyproject.toml + # - for some repos, the *.txt are actually lockfiles. This probably needs fixing. -exclude .coveragerc + +#--------- +# SECTION: root files exclude .flake8 exclude .git-blame-ignore-revs +exclude .git_archival.txt +exclude .gitattributes exclude .gitignore +exclude .lycheeignore +exclude .mailmap exclude .pre-commit-config.yaml exclude .readthedocs.yml exclude .ruff.toml +exclude CHANGES +include CITATION.cff exclude CODE_OF_CONDUCT.md +include COPYING +include COPYING.LESSER +include LICENSE +exclude Makefile exclude codecov.yml -include *.md -include *.py +include noxfile.py + # principles: + # - *ANY* file in the root should be explicitly "include"- or "exclude"-d + # - EXCEPT (possibly) those covered by setuptools default rules (see above link) + # - including : README.md/.rst; pyproject.toml; setup.py/.cfg + # - N.B. a GHA "ci-manifest" check, if used, will check all this + # - the above are typical ones : given in sorted order + # - NB many will (eventually) be templated, but that is a separate issue + # - probably, this section can be included as *boilerplate* + # - i.e. it doesn't matter if some of the files mentioned don't exist + + +#--------- +# SECTION: generic exclusions +# (1) top-level directories to omit entirely +prune .github +prune .nox +prune .tox +prune .coverage +# (2) top-level files to omit +exclude .coveragerc +# (3) file types (path patterns) to skip everywhere +global-exclude *.py[cod] +global-exclude __pycache__ + # principles: + # - common directories, files and file-types to be generally ignored + # - all outside version control, temporary non-coding output and cache data + # produced by dev processes, automation or user tools + # - by having this section LAST, it can remove files which might have been added by + # previous sections -- such as python compiler cache files + # - can include this section as **boilerplate** : + # - won't all exist in every repo, but including them all does no harm + + +#================================= +# Local Iris-grib-specific settings +# +exclude CONTRIBUTING.md From fa71414cb876c394a45d83c1750ab0458c639ba7 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 28 Apr 2025 10:23:38 +0100 Subject: [PATCH 442/583] Updated environment lockfiles (#636) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 44 ++++++++++++------------ requirements/locks/py311-linux-64.lock | 46 ++++++++++++++------------ requirements/locks/py312-linux-64.lock | 46 ++++++++++++++------------ 3 files changed, 71 insertions(+), 65 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index da75d7b5..0fbc65a3 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -3,9 +3,9 @@ # input_hash: 465e693fb2ec49a209b717d9a90a53dd6fe098568a8e7ce0928551a756675a55 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda#19f3a56f68d2fd06c516076bff482c52 -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-6_cp310.conda#01f0f2104b8466714804a72e511de599 +https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-7_cp310.conda#44e871cba2b162368476a84b8d040b6c https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.1.31-hbd8a1cb_1.conda#e74273d9fc5ab633d613cde474b55157 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda#06d02030237f4d5b3d9a7e7d348fe3c6 @@ -14,12 +14,13 @@ https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda#c1 https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda#ef504d1acbd74b7cc6849ef8af47dd03 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda#8dfae1d2e74767e9ce36d5fa0d8605db +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h86f0d12_0.conda#27fe770decaf469a53f3e3a6d593067f https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda#a2222a6ada71fb478682efe483ce0f92 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 +https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_0.conda#0e87378639676987af32fee53ba32258 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda#a78c856b6dc6bf4ea8daeb9beaaa3fb0 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a @@ -33,17 +34,17 @@ https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb9d3cd8_0.conda#2e https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.1-h97f6797_0.conda#5bc18c66111bc94532b0d2df00731c66 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 +https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda#fb54c4ea68b460c278d26eea89cfbcc3 -https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda#55199e2ae2c3651f6f9b2a447b47bdc9 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_2.conda#962d6ac93c30b1dfc54c9cccafd1003e -https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda#be2de152d8073ef1c01b7728475f2fe7 +https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda#c75da67f045c2627f59e6fcb5f4e3a9b https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b @@ -59,15 +60,15 @@ https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f0 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-h48d6fc4_0.conda#9ecfd6f2ca17077dd9c2d24770bb9ccd https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.124-hb9d3cd8_0.conda#8bc89311041d7fcb510238cf0848ccae +https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.conda#3c255be50a506c50765a93a6644f32fe https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda#0a4d0252248ef9a0f88f2ba8b8a08e12 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_4.conda#6c1028898cf3a2032d9af46689e1b81a https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/python-3.10.17-hd6af730_0_cpython.conda#7bb89638dae9ce1b8e051d0b721e83c2 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 @@ -102,14 +103,16 @@ https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.b https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py310h3788b33_0.conda#4186d9b4d004b0fe0de6aa62496fb48a +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda#728dbebd0f7a20337218beacffd37916 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.13.0-h332b0f4_0.conda#cbdc92ac0d93fe3c796e36ad65c7905c +https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda#0ea6510969e1296cc19966fad481f6de https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py310h89163eb_1.conda#8ce3f0332fd6de0d737e2911d329523f https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 -https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 +https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.7-pyh29332c3_0.conda#e57da6fe54bb3a5556cf36d199ff07d8 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef @@ -120,7 +123,7 @@ https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#4 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py310ha75aee5_2.conda#af6da4542e91edaf59b614ce7e991700 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py310h89163eb_2.conda#fd343408e64cf1e273ab7c710da374db -https://conda.anaconda.org/conda-forge/noarch/setuptools-78.1.0-pyhff2d567_0.conda#a42da9837e46c53494df0044c3eb1f53 +https://conda.anaconda.org/conda-forge/noarch/setuptools-79.0.1-pyhff2d567_0.conda#fa6669cc21abd4b7b6c5393b7bc71914 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb @@ -138,17 +141,16 @@ https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h8deb56e_0.cond https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.0-py310h89163eb_0.conda#9f7865c17117d16f804b687b498e35fa https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.0-pyh29332c3_0.conda#b1ed099fbbf189bf23967ed938316d05 https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.57.0-py310h89163eb_0.conda#34378af82141b3c1725dcdf898b28fc6 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h2d575fe_109.conda#e7a7a6e6f70553a31e6e79c65768d089 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h2d575fe_101.conda#d1f61f912e1968a8ac9834b62fde008d https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda#f4b39bf00c69f56ac01e020ebfac066c https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda#abb32c727da370c481a1c206f5159ce9 https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda#452b98eafe050ecff932f0ec832dd03f https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/noarch/pip-25.0.1-pyh8b19718_0.conda#79b5c1440aedc5010f687048d9103628 https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.0-h0054346_1.conda#a3547a9c204da804d8ef9c40c7ac0b84 @@ -163,31 +165,31 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.6.1-hd8ed1ab_0.conda#7f46575a91b1307441abc235d01cab66 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h03adeef_0.conda#b1df5affe904efe82ef890826b68881d -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h00e09a9_116.conda#417864857bdb6c2be2e923e89bffd2e8 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.4-py310hefbff90_0.conda#b3a99849aa14b78d32250c0709e8792a +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h0134ee8_117.conda#a979c07e8fc0e3f61c24a65d16cc6fbe +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.5-py310hefbff90_0.conda#5526bc875ec897f0d335e38da832b6ee https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py310h7e6dc6c_0.conda#14d300b9e1504748e70cc6499a7b4d25 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py310h71d0299_1.conda#e54b1eaeb50ad1767680181a8575a8db https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 -https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.2.1-pyhd8ed1ab_0.conda#1f960a50e0fba37b5f04ec766df10657 +https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.3.1-pyhd8ed1ab_0.conda#996376098e3648237b3efb0e0ad460c1 https://conda.anaconda.org/conda-forge/noarch/tox-4.25.0-pyh29332c3_1.conda#33a5663573203748912efecd49a2179d https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310h3788b33_5.conda#e05b0475166b68c9dc4d7937e0315654 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha75aee5_1.conda#0316e8d0e00c00631a6de89207db5b09 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310hf462985_1.conda#c2d5289e6cbcecf2c549e01772fe5274 -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.1-py310h3788b33_0.conda#f993b13665fc2bb262b30217c815d137 +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py310h3788b33_0.conda#b6420d29123c7c823de168f49ccdfe6a https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.9-pyhd8ed1ab_0.conda#542f45bf054c6b9cf8d00a3b1976f945 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.10-pyhd8ed1ab_0.conda#8d5b9b702810fb3054d52ba146023bc3 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.5-h1920b20_0.conda#ec8824a45bd7c50a46788fa16216d6c2 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py310ha75aee5_1.conda#48781b625a5c7701e04d222752cb2f62 https://conda.anaconda.org/conda-forge/noarch/nox-2025.2.9-pyh29332c3_1.conda#086837aa2602e3aeb38886e4124a6328 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.conda#8c29cd33b64b2eb78597fa28b5595c8d -https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.2.1-hd8ed1ab_0.conda#ba6dd8f5a2d2b46fd52f03ac212e8c6a +https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.3.1-hd8ed1ab_0.conda#38ca080dff1a30a6fd3aec989062b255 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.0-py310h247727d_0.conda#b9400ee14c9b59a3d9f4da715e67c1f8 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.4.0-pyhd8ed1ab_0.conda#c1e349028e0052c4eea844e94f773065 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py310hf462985_0.conda#c31938674e4cda43617a4d70f99ffd0c -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.41.0-h8bb6dbc_0.conda#1130a9254394ac1a32031fd6f03a714c +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.41.0-h5f92351_1.conda#742f52d72194d213d47bd6920b138eec https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.1-py310h68603db_0.conda#29cf3f5959afb841eda926541f26b0fb -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py310h9f0ad05_101.conda#f58947ff305aa8be0b33769ee67ddb10 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py310haba2683_102.conda#308cc08b61b28c7e8173bfc30bb158bf https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.2.0-pyha770c72_0.conda#17e487cc8b5507cd3abc09398cf27949 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py310h5eaa309_0.conda#ca4d935c1715f95b6e86846ad1675a2b diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index ca0e7ae6..8c5905de 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -3,9 +3,9 @@ # input_hash: 2f469aa469a97c8842f7f33f90dd774c2cfd2c3d653c15f41529575af6805444 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda#19f3a56f68d2fd06c516076bff482c52 -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-6_cp311.conda#37ec65e056b9964529c0e1e2697b9955 +https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-7_cp311.conda#6320dac78b3b215ceac35858b2cfdb70 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.1.31-hbd8a1cb_1.conda#e74273d9fc5ab633d613cde474b55157 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda#06d02030237f4d5b3d9a7e7d348fe3c6 @@ -14,12 +14,13 @@ https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda#c1 https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda#ef504d1acbd74b7cc6849ef8af47dd03 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda#8dfae1d2e74767e9ce36d5fa0d8605db +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h86f0d12_0.conda#27fe770decaf469a53f3e3a6d593067f https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda#a2222a6ada71fb478682efe483ce0f92 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 +https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_0.conda#0e87378639676987af32fee53ba32258 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda#a78c856b6dc6bf4ea8daeb9beaaa3fb0 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a @@ -33,17 +34,17 @@ https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb9d3cd8_0.conda#2e https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.1-h97f6797_0.conda#5bc18c66111bc94532b0d2df00731c66 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 +https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda#fb54c4ea68b460c278d26eea89cfbcc3 -https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda#55199e2ae2c3651f6f9b2a447b47bdc9 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_2.conda#962d6ac93c30b1dfc54c9cccafd1003e -https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda#be2de152d8073ef1c01b7728475f2fe7 +https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda#c75da67f045c2627f59e6fcb5f4e3a9b https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b @@ -59,15 +60,15 @@ https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f0 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-h48d6fc4_0.conda#9ecfd6f2ca17077dd9c2d24770bb9ccd https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.124-hb9d3cd8_0.conda#8bc89311041d7fcb510238cf0848ccae +https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.conda#3c255be50a506c50765a93a6644f32fe https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda#0a4d0252248ef9a0f88f2ba8b8a08e12 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_4.conda#6c1028898cf3a2032d9af46689e1b81a https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/python-3.11.12-h9e4cc4f_0_cpython.conda#b61d4fbf583b8393d9d00ec106ad3658 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 @@ -102,14 +103,16 @@ https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.b https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py311hd18a35c_0.conda#be34c90cce87090d24da64a7c239ca96 +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda#728dbebd0f7a20337218beacffd37916 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.13.0-h332b0f4_0.conda#cbdc92ac0d93fe3c796e36ad65c7905c +https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda#0ea6510969e1296cc19966fad481f6de https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py311h2dc5d0c_1.conda#6565a715337ae279e351d0abd8ffe88a https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 -https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 +https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.7-pyh29332c3_0.conda#e57da6fe54bb3a5556cf36d199ff07d8 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef @@ -121,7 +124,7 @@ https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py311h9ecbd0 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py311h2dc5d0c_2.conda#014417753f948da1f70d132b2de573be https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-3.1.0-pyhd8ed1ab_0.conda#5f0f24f8032c2c1bb33f59b75974f5fc -https://conda.anaconda.org/conda-forge/noarch/setuptools-78.1.0-pyhff2d567_0.conda#a42da9837e46c53494df0044c3eb1f53 +https://conda.anaconda.org/conda-forge/noarch/setuptools-79.0.1-pyhff2d567_0.conda#fa6669cc21abd4b7b6c5393b7bc71914 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb @@ -139,17 +142,16 @@ https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311hf29c0ef_0.cond https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.0-py311h2dc5d0c_0.conda#37bc439a94beeb29914baa5b4987ebd5 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.0-pyh29332c3_0.conda#b1ed099fbbf189bf23967ed938316d05 https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.57.0-py311h2dc5d0c_0.conda#4175f366b41d3d0c80d02661a0a03473 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h2d575fe_109.conda#e7a7a6e6f70553a31e6e79c65768d089 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h2d575fe_101.conda#d1f61f912e1968a8ac9834b62fde008d https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda#f4b39bf00c69f56ac01e020ebfac066c https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda#abb32c727da370c481a1c206f5159ce9 https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda#452b98eafe050ecff932f0ec832dd03f https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/noarch/pip-25.0.1-pyh8b19718_0.conda#79b5c1440aedc5010f687048d9103628 https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.0-h0054346_1.conda#a3547a9c204da804d8ef9c40c7ac0b84 @@ -161,33 +163,33 @@ https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.30.0-pyhd8ed1ab_0.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa -https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.3.0-pyhd8ed1ab_0.conda#36f6cc22457e3d6a6051c5370832f96c +https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.4.1-pyhd8ed1ab_0.conda#0735ecef025a6c2d6eb61aae4785fc3f https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h03adeef_0.conda#b1df5affe904efe82ef890826b68881d -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h00e09a9_116.conda#417864857bdb6c2be2e923e89bffd2e8 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.4-py311h5d046bc_0.conda#16ad2b996ea8064e0a7cb8b392d924fd +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h0134ee8_117.conda#a979c07e8fc0e3f61c24a65d16cc6fbe +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.5-py311h5d046bc_0.conda#df82417acd53257028de5425047ebc22 https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py311h1322bbf_0.conda#9f4f5593335f76c1dbf7381c11fe7155 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py311h0960b38_1.conda#5e6251fd41d984a9d4fd1fe4b9bdca31 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 -https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.2.1-pyhd8ed1ab_0.conda#1f960a50e0fba37b5f04ec766df10657 +https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.3.1-pyhd8ed1ab_0.conda#996376098e3648237b3efb0e0ad460c1 https://conda.anaconda.org/conda-forge/noarch/tox-4.25.0-pyh29332c3_1.conda#33a5663573203748912efecd49a2179d https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hd18a35c_5.conda#4e8447ca8558a203ec0577b4730073f3 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311h9ecbd09_1.conda#6d229edd907b6bb39961b74e3d52de9c https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h9f3472d_1.conda#2c3c4f115d28ed9e001a271d5d8585aa -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.1-py311hd18a35c_0.conda#351cb68d2081e249069748b6e60b3cd2 -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.9-pyhd8ed1ab_0.conda#542f45bf054c6b9cf8d00a3b1976f945 +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py311hd18a35c_0.conda#f8e440efa026c394461a45a46cea49fc +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.10-pyhd8ed1ab_0.conda#8d5b9b702810fb3054d52ba146023bc3 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.5-h1920b20_0.conda#ec8824a45bd7c50a46788fa16216d6c2 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py311h9ecbd09_1.conda#28d6b63784b350a2906dc264ad8c7f2a https://conda.anaconda.org/conda-forge/noarch/nox-2025.2.9-pyh29332c3_1.conda#086837aa2602e3aeb38886e4124a6328 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py311h8f841c2_0.conda#5ec0a1732a05376241e1e4c6d50e0e91 -https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.2.1-hd8ed1ab_0.conda#ba6dd8f5a2d2b46fd52f03ac212e8c6a +https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.3.1-hd8ed1ab_0.conda#38ca080dff1a30a6fd3aec989062b255 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.0-py311h3dc67b8_0.conda#697054700855c7699805f41ad7f204a3 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.4.0-pyhd8ed1ab_0.conda#c1e349028e0052c4eea844e94f773065 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py311h9f3472d_0.conda#555b148cafbd96b658499060d5e11a65 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.41.0-h8bb6dbc_0.conda#1130a9254394ac1a32031fd6f03a714c +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.41.0-h5f92351_1.conda#742f52d72194d213d47bd6920b138eec https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.1-py311h2b939e6_0.conda#eed17bae389043337f33b95a0fd8c172 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py311hae66bec_101.conda#776c96dd51168ef9da0d63d5e49785f5 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py311h8b974bf_102.conda#d748aad3050d26241842b76d56424cf9 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.2.0-pyha770c72_0.conda#17e487cc8b5507cd3abc09398cf27949 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py311h7db5c69_0.conda#20ba399d57a2b5de789a5b24341481a1 diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 56d21ae8..ffd831c3 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -3,9 +3,9 @@ # input_hash: 7f7d55e8ff7b75c71697413c5124c49e86f79ebc2be8dfacf5cb201afb20c50b @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda#19f3a56f68d2fd06c516076bff482c52 -https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-6_cp312.conda#95bd67b1113859774c30418e8481f9d8 +https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-7_cp312.conda#0dfcdc155cf23812a0c9deada86fb723 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.1.31-hbd8a1cb_1.conda#e74273d9fc5ab633d613cde474b55157 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda#06d02030237f4d5b3d9a7e7d348fe3c6 @@ -14,12 +14,13 @@ https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda#c1 https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda#ef504d1acbd74b7cc6849ef8af47dd03 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda#8dfae1d2e74767e9ce36d5fa0d8605db +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h86f0d12_0.conda#27fe770decaf469a53f3e3a6d593067f https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda#a2222a6ada71fb478682efe483ce0f92 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 +https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_0.conda#0e87378639676987af32fee53ba32258 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda#a78c856b6dc6bf4ea8daeb9beaaa3fb0 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a @@ -33,17 +34,17 @@ https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb9d3cd8_0.conda#2e https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.1-h97f6797_0.conda#5bc18c66111bc94532b0d2df00731c66 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 +https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda#fb54c4ea68b460c278d26eea89cfbcc3 -https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda#55199e2ae2c3651f6f9b2a447b47bdc9 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_2.conda#962d6ac93c30b1dfc54c9cccafd1003e -https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda#be2de152d8073ef1c01b7728475f2fe7 +https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda#c75da67f045c2627f59e6fcb5f4e3a9b https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b @@ -59,15 +60,15 @@ https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f0 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-h48d6fc4_0.conda#9ecfd6f2ca17077dd9c2d24770bb9ccd https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.124-hb9d3cd8_0.conda#8bc89311041d7fcb510238cf0848ccae +https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.conda#3c255be50a506c50765a93a6644f32fe https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda#0a4d0252248ef9a0f88f2ba8b8a08e12 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_4.conda#6c1028898cf3a2032d9af46689e1b81a https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/python-3.12.10-h9e4cc4f_0_cpython.conda#a41d26cd4d47092d683915d058380dec https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 @@ -102,14 +103,16 @@ https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.b https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.8-py312h84d6215_0.conda#6713467dc95509683bfa3aca08524e8a +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda#728dbebd0f7a20337218beacffd37916 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.13.0-h332b0f4_0.conda#cbdc92ac0d93fe3c796e36ad65c7905c +https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda#0ea6510969e1296cc19966fad481f6de https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda#eb227c3e0bf58f5bd69c0532b157975b https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 -https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda#3bfed7e6228ebf2f7b9eaa47f1b4e2aa +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 +https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.7-pyh29332c3_0.conda#e57da6fe54bb3a5556cf36d199ff07d8 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef @@ -121,7 +124,7 @@ https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h178313f_2.conda#cf2485f39740de96e2a7f2bb18ed2fee https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-3.1.0-pyhd8ed1ab_0.conda#5f0f24f8032c2c1bb33f59b75974f5fc -https://conda.anaconda.org/conda-forge/noarch/setuptools-78.1.0-pyhff2d567_0.conda#a42da9837e46c53494df0044c3eb1f53 +https://conda.anaconda.org/conda-forge/noarch/setuptools-79.0.1-pyhff2d567_0.conda#fa6669cc21abd4b7b6c5393b7bc71914 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb @@ -139,17 +142,16 @@ https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.cond https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.0-py312h178313f_0.conda#d0fca021e354cc96455021852a1fad6d https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.0-pyh29332c3_0.conda#b1ed099fbbf189bf23967ed938316d05 https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.57.0-py312h178313f_0.conda#97907388593b27ac01237a1023d58d3d +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h2d575fe_109.conda#e7a7a6e6f70553a31e6e79c65768d089 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h2d575fe_101.conda#d1f61f912e1968a8ac9834b62fde008d https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda#f4b39bf00c69f56ac01e020ebfac066c https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda#abb32c727da370c481a1c206f5159ce9 https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda#452b98eafe050ecff932f0ec832dd03f https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/noarch/pip-25.0.1-pyh8b19718_0.conda#79b5c1440aedc5010f687048d9103628 https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.0-h0054346_1.conda#a3547a9c204da804d8ef9c40c7ac0b84 @@ -161,33 +163,33 @@ https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.30.0-pyhd8ed1ab_0.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa -https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.3.0-pyhd8ed1ab_0.conda#36f6cc22457e3d6a6051c5370832f96c +https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.4.1-pyhd8ed1ab_0.conda#0735ecef025a6c2d6eb61aae4785fc3f https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h03adeef_0.conda#b1df5affe904efe82ef890826b68881d -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h00e09a9_116.conda#417864857bdb6c2be2e923e89bffd2e8 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.4-py312h72c5963_0.conda#3f2871f111d8c0abd9c3150a8627507e +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h0134ee8_117.conda#a979c07e8fc0e3f61c24a65d16cc6fbe +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.5-py312h72c5963_0.conda#505bcfc142b97010c162863c38d90016 https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py312h80c1187_0.conda#d3894405f05b2c0f351d5de3ae26fa9c https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py312h03c6e1f_1.conda#f754591f9ec0169e436fa84cb9db0c32 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 -https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.2.1-pyhd8ed1ab_0.conda#1f960a50e0fba37b5f04ec766df10657 +https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.3.1-pyhd8ed1ab_0.conda#996376098e3648237b3efb0e0ad460c1 https://conda.anaconda.org/conda-forge/noarch/tox-4.25.0-pyh29332c3_1.conda#33a5663573203748912efecd49a2179d https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h68727a3_5.conda#f9664ee31aed96c85b7319ab0a693341 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312h66e93f0_1.conda#d28b82fcc8d1b462b595af4b15a6cdcf https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312hc0a28a1_1.conda#990033147b0a998e756eaaed6b28f48d -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.1-py312h68727a3_0.conda#f5fbba0394ee45e9a64a73c2a994126a -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.9-pyhd8ed1ab_0.conda#542f45bf054c6b9cf8d00a3b1976f945 +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py312h68727a3_0.conda#e688276449452cdfe9f8f5d3e74c23f6 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.10-pyhd8ed1ab_0.conda#8d5b9b702810fb3054d52ba146023bc3 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.5-h1920b20_0.conda#ec8824a45bd7c50a46788fa16216d6c2 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h66e93f0_1.conda#5fef67f50126f40f5966a9451661280d https://conda.anaconda.org/conda-forge/noarch/nox-2025.2.9-pyh29332c3_1.conda#086837aa2602e3aeb38886e4124a6328 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py312ha707e6e_0.conda#00b999c5f9d01fb633db819d79186bd4 -https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.2.1-hd8ed1ab_0.conda#ba6dd8f5a2d2b46fd52f03ac212e8c6a +https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.3.1-hd8ed1ab_0.conda#38ca080dff1a30a6fd3aec989062b255 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.0-py312h21f5128_0.conda#761c745a289b3d6abf56eb1193343172 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.4.0-pyhd8ed1ab_0.conda#c1e349028e0052c4eea844e94f773065 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py312hc0a28a1_0.conda#8b5b812d4c18cb37bda7a7c8d3a6acb3 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.41.0-h8bb6dbc_0.conda#1130a9254394ac1a32031fd6f03a714c +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.41.0-h5f92351_1.conda#742f52d72194d213d47bd6920b138eec https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.1-py312hd3ec401_0.conda#514d8a6894286f6d9894b352782c7e18 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py312h21d6d8e_101.conda#0cabc6745882859ec7be35433c7b8f24 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py312h3805cb1_102.conda#c1358b48677cfc7095cd664f1f0647a1 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.2.0-pyha770c72_0.conda#17e487cc8b5507cd3abc09398cf27949 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py312hf9745cd_0.conda#ea213e31805199cb7d0da457b879ceed From f0c04508da5fa6c8f9ec269f1fe2e6a1532ab2d6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Apr 2025 10:25:37 +0100 Subject: [PATCH 443/583] Bump scitools/workflows in the dependencies group (#635) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2025.04.0 to 2025.04.1 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.04.0...2025.04.1) --- updated-dependencies: - dependency-name: scitools/workflows dependency-version: 2025.04.1 dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/ci-template-check.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index f87474c3..e7205a31 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.04.0 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.04.1 diff --git a/.github/workflows/ci-template-check.yml b/.github/workflows/ci-template-check.yml index 5ba74f84..b82ea5bb 100644 --- a/.github/workflows/ci-template-check.yml +++ b/.github/workflows/ci-template-check.yml @@ -10,7 +10,7 @@ on: jobs: prompt-share: - uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.04.0 + uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.04.1 secrets: inherit with: pr_number: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index f7e1f928..e902fc98 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.04.0 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.04.1 secrets: inherit From 77710eb87e27946089194bdb4fa6c0a99119e26d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 28 Apr 2025 10:27:21 +0100 Subject: [PATCH 444/583] chore: update pre-commit hooks (#634) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.11.4 → v0.11.6](https://github.com/astral-sh/ruff-pre-commit/compare/v0.11.4...v0.11.6) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index be08b90e..35ab9742 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -78,7 +78,7 @@ repos: types: [file, python] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.11.4" + rev: "v0.11.6" hooks: - id: ruff types: [file, python] From 6a6c294a394f7a56c2395d517ddf84e8d228395a Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 30 Apr 2025 13:55:14 +0100 Subject: [PATCH 445/583] chore: update pre-commit hooks (#639) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.11.6 → v0.11.7](https://github.com/astral-sh/ruff-pre-commit/compare/v0.11.6...v0.11.7) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 35ab9742..fb3ba659 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -78,7 +78,7 @@ repos: types: [file, python] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.11.6" + rev: "v0.11.7" hooks: - id: ruff types: [file, python] From 4d742d8bbc5f75e2c192d6d5b4a28f432b82793a Mon Sep 17 00:00:00 2001 From: Bill Little Date: Thu, 1 May 2025 09:42:56 +0100 Subject: [PATCH 446/583] pep639: setuptools license and license-files fields (#640) --- pyproject.toml | 9 +++------ requirements/py310.yml | 2 +- requirements/py311.yml | 2 +- requirements/py312.yml | 2 +- 4 files changed, 6 insertions(+), 9 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 5c295505..8f6465ae 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ [build-system] # Defined by PEP 518 requires = [ - "setuptools>=64", + "setuptools>=77.0.3", "setuptools_scm>=8.0", ] # Defined by PEP 517 @@ -17,7 +17,6 @@ authors = [ classifiers = [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Science/Research", - "License :: OSI Approved :: BSD License", "Operating System :: MacOS", "Operating System :: POSIX", "Operating System :: POSIX :: Linux", @@ -46,7 +45,8 @@ keywords = [ "earth-science", "meteorology", ] -license = {text = "BSD-3-Clause"} +license = "BSD-3-Clause" +license-files = ["LICENSE"] name = "iris-grib" requires-python = ">=3.10" @@ -56,9 +56,6 @@ Discussions = "https://github.com/SciTools/iris-grib/discussions" Documentation = "https://iris-grib.readthedocs.io/en/stable/" Issues = "https://github.com/SciTools/iris-grib/issues" -[tool.setuptools] -license-files = ["LICENSE"] - [tool.setuptools.dynamic] dependencies = {file = "requirements/pypi-core.txt"} readme = {file = "README.md", content-type = "text/markdown"} diff --git a/requirements/py310.yml b/requirements/py310.yml index ad16eaf9..0288f292 100644 --- a/requirements/py310.yml +++ b/requirements/py310.yml @@ -7,7 +7,7 @@ dependencies: - python=3.10 # Setup dependencies. - - setuptools>=64 + - setuptools>=77.0.3 - setuptools_scm>=8 # Core dependencies. diff --git a/requirements/py311.yml b/requirements/py311.yml index 9913a3d6..772f6131 100644 --- a/requirements/py311.yml +++ b/requirements/py311.yml @@ -7,7 +7,7 @@ dependencies: - python=3.11 # Setup dependencies. - - setuptools>=64 + - setuptools>=77.0.3 - setuptools_scm>=8 # Core dependencies. diff --git a/requirements/py312.yml b/requirements/py312.yml index be7e9980..20e283f4 100644 --- a/requirements/py312.yml +++ b/requirements/py312.yml @@ -7,7 +7,7 @@ dependencies: - python=3.12 # Setup dependencies. - - setuptools>=64 + - setuptools>=77.0.3 - setuptools_scm>=8 # Core dependencies. From 9d4769a89a993eeda8bfcad2e1dad6a5e0109dd4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 May 2025 09:43:14 +0100 Subject: [PATCH 447/583] Bump scitools/workflows in the dependencies group (#641) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2025.04.1 to 2025.04.4 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.04.1...2025.04.4) --- updated-dependencies: - dependency-name: scitools/workflows dependency-version: 2025.04.4 dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/ci-template-check.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index e7205a31..e203b251 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.04.1 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.04.4 diff --git a/.github/workflows/ci-template-check.yml b/.github/workflows/ci-template-check.yml index b82ea5bb..bca09131 100644 --- a/.github/workflows/ci-template-check.yml +++ b/.github/workflows/ci-template-check.yml @@ -10,7 +10,7 @@ on: jobs: prompt-share: - uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.04.1 + uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.04.4 secrets: inherit with: pr_number: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index e902fc98..2ed833d0 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.04.1 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.04.4 secrets: inherit From cbac0b4221abfc916fdacea3e31b5d59b236dc08 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 6 May 2025 18:03:45 +0100 Subject: [PATCH 448/583] chore: update pre-commit hooks (#643) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.11.7 → v0.11.8](https://github.com/astral-sh/ruff-pre-commit/compare/v0.11.7...v0.11.8) - [github.com/scientific-python/cookie: 2025.01.22 → 2025.05.02](https://github.com/scientific-python/cookie/compare/2025.01.22...2025.05.02) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index fb3ba659..a334840e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -78,7 +78,7 @@ repos: types: [file, python] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.11.7" + rev: "v0.11.8" hooks: - id: ruff types: [file, python] @@ -93,7 +93,7 @@ repos: types: [file, python] - repo: https://github.com/scientific-python/cookie - rev: 2025.01.22 + rev: 2025.05.02 hooks: - id: sp-repo-review additional_dependencies: ["repo-review[cli]"] From 90e386121795ad67782ec750d2041f6f69cac572 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 8 May 2025 10:34:11 +0100 Subject: [PATCH 449/583] Bump scitools/workflows in the dependencies group (#644) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2025.04.4 to 2025.05.1 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.04.4...2025.05.1) --- updated-dependencies: - dependency-name: scitools/workflows dependency-version: 2025.05.1 dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/ci-template-check.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index e203b251..72a1cec6 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.04.4 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.05.1 diff --git a/.github/workflows/ci-template-check.yml b/.github/workflows/ci-template-check.yml index bca09131..ed3b6f99 100644 --- a/.github/workflows/ci-template-check.yml +++ b/.github/workflows/ci-template-check.yml @@ -10,7 +10,7 @@ on: jobs: prompt-share: - uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.04.4 + uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.05.1 secrets: inherit with: pr_number: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 2ed833d0..0d2eaa94 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.04.4 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.05.1 secrets: inherit From 76181155e428aaba10f3f9dae6f0b5f8c4d1e1a5 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Thu, 8 May 2025 12:04:45 +0100 Subject: [PATCH 450/583] Updated environment lockfiles (#642) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 14 +++++++------- requirements/locks/py311-linux-64.lock | 16 ++++++++-------- requirements/locks/py312-linux-64.lock | 16 ++++++++-------- 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 0fbc65a3..fef16620 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -1,11 +1,11 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 465e693fb2ec49a209b717d9a90a53dd6fe098568a8e7ce0928551a756675a55 +# input_hash: 772ad8ba70e3a81b27d5175440056d367ed81c7a0e27f969360096baf3704a8a @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-7_cp310.conda#44e871cba2b162368476a84b8d040b6c https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a -https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.1.31-hbd8a1cb_1.conda#e74273d9fc5ab633d613cde474b55157 +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-hbd8a1cb_0.conda#95db94f75ba080a22eb623590993167b https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda#06d02030237f4d5b3d9a7e7d348fe3c6 @@ -26,7 +26,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.cond https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_0.conda#bb539841f2a3fde210f387d00ed4bb9d +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_1.conda#de356753cfdbffcde5bb1e86e3aa6cd0 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 @@ -84,7 +84,7 @@ https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.2-pyhd8ed1ab_0.cond https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda#c207fa5ac7ea99b149344385a9c0880d https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda#e83a31202d1c0a000fce3e9cf3825875 +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.2-pyhd8ed1ab_0.conda#40fe4284b8b5835a9073a645139f35af https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda#f22f4d4970e09d68a10b922cbb0408d3 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.1-pyhd8ed1ab_0.conda#364ba6c9fb03886ac979b482f39ebb92 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 @@ -123,7 +123,7 @@ https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#4 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py310ha75aee5_2.conda#af6da4542e91edaf59b614ce7e991700 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py310h89163eb_2.conda#fd343408e64cf1e273ab7c710da374db -https://conda.anaconda.org/conda-forge/noarch/setuptools-79.0.1-pyhff2d567_0.conda#fa6669cc21abd4b7b6c5393b7bc71914 +https://conda.anaconda.org/conda-forge/noarch/setuptools-80.1.0-pyhff2d567_0.conda#f6f72d0837c79eaec77661be43e8a691 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb @@ -152,7 +152,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda#452b98eafe050ecff932f0ec832dd03f https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/noarch/pip-25.0.1-pyh8b19718_0.conda#79b5c1440aedc5010f687048d9103628 +https://conda.anaconda.org/conda-forge/noarch/pip-25.1-pyh8b19718_0.conda#2247aa245832ea47e8b971bef73d7094 https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.0-h0054346_1.conda#a3547a9c204da804d8ef9c40c7ac0b84 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.0-pyh29332c3_0.conda#46276968030688a25257b08772c418fc https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be @@ -174,7 +174,7 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.co https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.3.1-pyhd8ed1ab_0.conda#996376098e3648237b3efb0e0ad460c1 https://conda.anaconda.org/conda-forge/noarch/tox-4.25.0-pyh29332c3_1.conda#33a5663573203748912efecd49a2179d https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310h3788b33_5.conda#e05b0475166b68c9dc4d7937e0315654 -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha75aee5_1.conda#0316e8d0e00c00631a6de89207db5b09 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha75aee5_2.conda#f9254b5b0193982416b91edcb4b2676f https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310hf462985_1.conda#c2d5289e6cbcecf2c549e01772fe5274 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py310h3788b33_0.conda#b6420d29123c7c823de168f49ccdfe6a https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 8c5905de..7d37e798 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -1,11 +1,11 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 2f469aa469a97c8842f7f33f90dd774c2cfd2c3d653c15f41529575af6805444 +# input_hash: 9dc993136ba83630b2cf77ebe8b6bec1414f94919619f57285af507809029885 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-7_cp311.conda#6320dac78b3b215ceac35858b2cfdb70 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a -https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.1.31-hbd8a1cb_1.conda#e74273d9fc5ab633d613cde474b55157 +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-hbd8a1cb_0.conda#95db94f75ba080a22eb623590993167b https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda#06d02030237f4d5b3d9a7e7d348fe3c6 @@ -26,7 +26,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.cond https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_0.conda#bb539841f2a3fde210f387d00ed4bb9d +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_1.conda#de356753cfdbffcde5bb1e86e3aa6cd0 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 @@ -84,7 +84,7 @@ https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.2-pyhd8ed1ab_0.cond https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda#c207fa5ac7ea99b149344385a9c0880d https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda#e83a31202d1c0a000fce3e9cf3825875 +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.2-pyhd8ed1ab_0.conda#40fe4284b8b5835a9073a645139f35af https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda#f22f4d4970e09d68a10b922cbb0408d3 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.1-pyhd8ed1ab_0.conda#364ba6c9fb03886ac979b482f39ebb92 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 @@ -124,7 +124,7 @@ https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py311h9ecbd0 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py311h2dc5d0c_2.conda#014417753f948da1f70d132b2de573be https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-3.1.0-pyhd8ed1ab_0.conda#5f0f24f8032c2c1bb33f59b75974f5fc -https://conda.anaconda.org/conda-forge/noarch/setuptools-79.0.1-pyhff2d567_0.conda#fa6669cc21abd4b7b6c5393b7bc71914 +https://conda.anaconda.org/conda-forge/noarch/setuptools-80.1.0-pyhff2d567_0.conda#f6f72d0837c79eaec77661be43e8a691 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb @@ -153,7 +153,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda#452b98eafe050ecff932f0ec832dd03f https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/noarch/pip-25.0.1-pyh8b19718_0.conda#79b5c1440aedc5010f687048d9103628 +https://conda.anaconda.org/conda-forge/noarch/pip-25.1-pyh8b19718_0.conda#2247aa245832ea47e8b971bef73d7094 https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.0-h0054346_1.conda#a3547a9c204da804d8ef9c40c7ac0b84 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.0-pyh29332c3_0.conda#46276968030688a25257b08772c418fc https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be @@ -175,7 +175,7 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.co https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.3.1-pyhd8ed1ab_0.conda#996376098e3648237b3efb0e0ad460c1 https://conda.anaconda.org/conda-forge/noarch/tox-4.25.0-pyh29332c3_1.conda#33a5663573203748912efecd49a2179d https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hd18a35c_5.conda#4e8447ca8558a203ec0577b4730073f3 -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311h9ecbd09_1.conda#6d229edd907b6bb39961b74e3d52de9c +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311h9ecbd09_2.conda#ca02de88df1cc3cfc8f24766ff50cb3c https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h9f3472d_1.conda#2c3c4f115d28ed9e001a271d5d8585aa https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py311hd18a35c_0.conda#f8e440efa026c394461a45a46cea49fc https://conda.anaconda.org/conda-forge/noarch/identify-2.6.10-pyhd8ed1ab_0.conda#8d5b9b702810fb3054d52ba146023bc3 @@ -195,7 +195,7 @@ https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py311h7db5c69_0.conda#20ba399d57a2b5de789a5b24341481a1 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py311h9f3472d_0.conda#648bccc358ec5b19dec01a5685f3aeb9 -https://conda.anaconda.org/conda-forge/noarch/iris-3.12.0-pyha770c72_0.conda#f6551d52c552616493ff211ddfa01ade +https://conda.anaconda.org/conda-forge/noarch/iris-3.12.1-pyha770c72_0.conda#e0254f1cbcb624c0558a16eed71ff44b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda#e9fb3fe8a5b758b4aff187d434f94f03 diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index ffd831c3..aeaeaff1 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -1,11 +1,11 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 7f7d55e8ff7b75c71697413c5124c49e86f79ebc2be8dfacf5cb201afb20c50b +# input_hash: 4a0a646844a1b0c20669b9387539ede48623f815c29a2e5e1d2abb77f48a4d05 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-7_cp312.conda#0dfcdc155cf23812a0c9deada86fb723 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a -https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.1.31-hbd8a1cb_1.conda#e74273d9fc5ab633d613cde474b55157 +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-hbd8a1cb_0.conda#95db94f75ba080a22eb623590993167b https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda#06d02030237f4d5b3d9a7e7d348fe3c6 @@ -26,7 +26,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.cond https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_0.conda#bb539841f2a3fde210f387d00ed4bb9d +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_1.conda#de356753cfdbffcde5bb1e86e3aa6cd0 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 @@ -84,7 +84,7 @@ https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.2-pyhd8ed1ab_0.cond https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda#c207fa5ac7ea99b149344385a9c0880d https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda#e83a31202d1c0a000fce3e9cf3825875 +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.2-pyhd8ed1ab_0.conda#40fe4284b8b5835a9073a645139f35af https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda#f22f4d4970e09d68a10b922cbb0408d3 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.1-pyhd8ed1ab_0.conda#364ba6c9fb03886ac979b482f39ebb92 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 @@ -124,7 +124,7 @@ https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h178313f_2.conda#cf2485f39740de96e2a7f2bb18ed2fee https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-3.1.0-pyhd8ed1ab_0.conda#5f0f24f8032c2c1bb33f59b75974f5fc -https://conda.anaconda.org/conda-forge/noarch/setuptools-79.0.1-pyhff2d567_0.conda#fa6669cc21abd4b7b6c5393b7bc71914 +https://conda.anaconda.org/conda-forge/noarch/setuptools-80.1.0-pyhff2d567_0.conda#f6f72d0837c79eaec77661be43e8a691 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb @@ -153,7 +153,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda#452b98eafe050ecff932f0ec832dd03f https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/noarch/pip-25.0.1-pyh8b19718_0.conda#79b5c1440aedc5010f687048d9103628 +https://conda.anaconda.org/conda-forge/noarch/pip-25.1-pyh8b19718_0.conda#2247aa245832ea47e8b971bef73d7094 https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.0-h0054346_1.conda#a3547a9c204da804d8ef9c40c7ac0b84 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.0-pyh29332c3_0.conda#46276968030688a25257b08772c418fc https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be @@ -175,7 +175,7 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.co https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.3.1-pyhd8ed1ab_0.conda#996376098e3648237b3efb0e0ad460c1 https://conda.anaconda.org/conda-forge/noarch/tox-4.25.0-pyh29332c3_1.conda#33a5663573203748912efecd49a2179d https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h68727a3_5.conda#f9664ee31aed96c85b7319ab0a693341 -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312h66e93f0_1.conda#d28b82fcc8d1b462b595af4b15a6cdcf +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312h66e93f0_2.conda#630db208bc7bbb96725ce9832c7423bb https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312hc0a28a1_1.conda#990033147b0a998e756eaaed6b28f48d https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py312h68727a3_0.conda#e688276449452cdfe9f8f5d3e74c23f6 https://conda.anaconda.org/conda-forge/noarch/identify-2.6.10-pyhd8ed1ab_0.conda#8d5b9b702810fb3054d52ba146023bc3 @@ -195,7 +195,7 @@ https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py312hf9745cd_0.conda#ea213e31805199cb7d0da457b879ceed https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py312hc0a28a1_0.conda#476b0357e207e10d2b7b13ed82156e6d -https://conda.anaconda.org/conda-forge/noarch/iris-3.12.0-pyha770c72_0.conda#f6551d52c552616493ff211ddfa01ade +https://conda.anaconda.org/conda-forge/noarch/iris-3.12.1-pyha770c72_0.conda#e0254f1cbcb624c0558a16eed71ff44b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda#e9fb3fe8a5b758b4aff187d434f94f03 From 9e8db82c8e9da0d664b52c1b8da20fd6acf4733c Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 12 May 2025 14:43:31 +0100 Subject: [PATCH 451/583] Updated environment lockfiles (#645) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 39 ++++++++++++------------ requirements/locks/py311-linux-64.lock | 41 +++++++++++++------------- requirements/locks/py312-linux-64.lock | 41 +++++++++++++------------- 3 files changed, 62 insertions(+), 59 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index fef16620..84569fb1 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -8,21 +8,21 @@ https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222 https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-hbd8a1cb_0.conda#95db94f75ba080a22eb623590993167b https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda#06d02030237f4d5b3d9a7e7d348fe3c6 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_2.conda#fbe7d535ff9d3a168c148e07358cd5b1 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda#c151d5eb730e9b7480e6d48c0fc44048 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda#ef504d1acbd74b7cc6849ef8af47dd03 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_2.conda#ea8ac52380885ed41c1baa8f1d6d2b93 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h86f0d12_0.conda#27fe770decaf469a53f3e3a6d593067f https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda#a2222a6ada71fb478682efe483ce0f92 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_2.conda#ddca86c7040dd0e73b2b69bd7833d225 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_2.conda#01de444988ed960031dbe84cf4f9b1fc https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 -https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_0.conda#0e87378639676987af32fee53ba32258 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda#a78c856b6dc6bf4ea8daeb9beaaa3fb0 +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_1.conda#a76fd702c93cd2dfd89eff30a5fd45a8 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_2.conda#1cb1c67961f6dd257eae9e9691b341aa https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 @@ -30,7 +30,7 @@ https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_1.conda#d https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 -https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb9d3cd8_0.conda#2ef1822d8168ed5d79ab1bf01088419a +https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb47aa4a_0.conda#607e13a8caac17f9a664bcab5302ce06 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.1-h97f6797_0.conda#5bc18c66111bc94532b0d2df00731c66 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 @@ -39,18 +39,17 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.co https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda#fb54c4ea68b460c278d26eea89cfbcc3 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_2.conda#f92e6e0a3c0c0c85561ef61aa59d555d https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda#55199e2ae2c3651f6f9b2a447b47bdc9 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_2.conda#962d6ac93c30b1dfc54c9cccafd1003e +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.2-hee588c1_0.conda#93048463501053a00739215ea3f36324 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda#c75da67f045c2627f59e6fcb5f4e3a9b +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_2.conda#9d2072af184b5caa29492bf2344597bb https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h81593ed_1.conda#0619e8fc4c8025a908ea3a3422d3b775 https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda#3b3e64af585eadfb52bb90b553db5edf @@ -61,6 +60,7 @@ https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 +https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.124-hb9d3cd8_0.conda#8bc89311041d7fcb510238cf0848ccae @@ -72,7 +72,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_4.conda#6 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/python-3.10.17-hd6af730_0_cpython.conda#7bb89638dae9ce1b8e051d0b721e83c2 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.49.1-h9eae976_2.conda#1894a9d3a8c3ffa53f8ca09fcd2fac25 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.49.2-h9eae976_0.conda#02161fcc0f832baf517750700ae1d6f6 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a @@ -81,7 +81,7 @@ https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a1 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_2.conda#bf502c169c71e3c6ac0d6175addfacc2 https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.2-pyhd8ed1ab_0.conda#bf9c1698e819fab31f67dbab4256f7ba -https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda#c207fa5ac7ea99b149344385a9c0880d +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.4.26-pyhd8ed1ab_0.conda#c33eeaaa33f45031be34cda513df39b6 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.2-pyhd8ed1ab_0.conda#40fe4284b8b5835a9073a645139f35af @@ -108,12 +108,13 @@ https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openbl https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.13.0-h332b0f4_0.conda#cbdc92ac0d93fe3c796e36ad65c7905c https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h4bc477f_0.conda#14dbe05b929e329dbaa6f2d0aa19466d https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py310h89163eb_1.conda#8ce3f0332fd6de0d737e2911d329523f https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.7-pyh29332c3_0.conda#e57da6fe54bb3a5556cf36d199ff07d8 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda#424844562f5d337077b445ec6b1398a7 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda#232fb4577b6687b2d503ef8e254270c9 @@ -139,7 +140,7 @@ https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h8deb56e_0.conda#1fc24a3196ad5ede2a68148be61894f4 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.0-py310h89163eb_0.conda#9f7865c17117d16f804b687b498e35fa -https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.0-pyh29332c3_0.conda#b1ed099fbbf189bf23967ed938316d05 +https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.57.0-py310h89163eb_0.conda#34378af82141b3c1725dcdf898b28fc6 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 @@ -152,13 +153,14 @@ https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda#452b98eafe050ecff932f0ec832dd03f https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/noarch/pip-25.1-pyh8b19718_0.conda#2247aa245832ea47e8b971bef73d7094 +https://conda.anaconda.org/conda-forge/linux-64/pillow-11.2.1-py310h7e6dc6c_0.conda#5645a243d90adb50909b9edc209d84fe +https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh8b19718_0.conda#32d0781ace05105cc99af55d36cbec7c https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.0-h0054346_1.conda#a3547a9c204da804d8ef9c40c7ac0b84 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.0-pyh29332c3_0.conda#46276968030688a25257b08772c418fc https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.2-h0e9735f_0.conda#568ed1300869dca0ba09fb750cda5dbb -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.30.0-pyhd8ed1ab_0.conda#c0e0b4a09aa5a698a1bdd4ebfe28be38 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.31.2-pyhd8ed1ab_0.conda#c0600c1b374efa7a1ff444befee108ca https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa @@ -167,7 +169,6 @@ https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.6.1-hd8ed1ab_ https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h03adeef_0.conda#b1df5affe904efe82ef890826b68881d https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h0134ee8_117.conda#a979c07e8fc0e3f61c24a65d16cc6fbe https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.5-py310hefbff90_0.conda#5526bc875ec897f0d335e38da832b6ee -https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py310h7e6dc6c_0.conda#14d300b9e1504748e70cc6499a7b4d25 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py310h71d0299_1.conda#e54b1eaeb50ad1767680181a8575a8db https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 @@ -188,7 +189,7 @@ https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.0-py310h247727d_0.co https://conda.anaconda.org/conda-forge/noarch/urllib3-2.4.0-pyhd8ed1ab_0.conda#c1e349028e0052c4eea844e94f773065 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py310hf462985_0.conda#c31938674e4cda43617a4d70f99ffd0c https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.41.0-h5f92351_1.conda#742f52d72194d213d47bd6920b138eec -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.1-py310h68603db_0.conda#29cf3f5959afb841eda926541f26b0fb +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.3-py310h68603db_0.conda#50084ca38bf28440e2762966bac143fc https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py310haba2683_102.conda#308cc08b61b28c7e8173bfc30bb158bf https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.2.0-pyha770c72_0.conda#17e487cc8b5507cd3abc09398cf27949 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 7d37e798..1fba13a4 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -8,21 +8,21 @@ https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222 https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-hbd8a1cb_0.conda#95db94f75ba080a22eb623590993167b https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda#06d02030237f4d5b3d9a7e7d348fe3c6 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_2.conda#fbe7d535ff9d3a168c148e07358cd5b1 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda#c151d5eb730e9b7480e6d48c0fc44048 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda#ef504d1acbd74b7cc6849ef8af47dd03 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_2.conda#ea8ac52380885ed41c1baa8f1d6d2b93 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h86f0d12_0.conda#27fe770decaf469a53f3e3a6d593067f https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda#a2222a6ada71fb478682efe483ce0f92 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_2.conda#ddca86c7040dd0e73b2b69bd7833d225 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_2.conda#01de444988ed960031dbe84cf4f9b1fc https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 -https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_0.conda#0e87378639676987af32fee53ba32258 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda#a78c856b6dc6bf4ea8daeb9beaaa3fb0 +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_1.conda#a76fd702c93cd2dfd89eff30a5fd45a8 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_2.conda#1cb1c67961f6dd257eae9e9691b341aa https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 @@ -30,7 +30,7 @@ https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_1.conda#d https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 -https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb9d3cd8_0.conda#2ef1822d8168ed5d79ab1bf01088419a +https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb47aa4a_0.conda#607e13a8caac17f9a664bcab5302ce06 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.1-h97f6797_0.conda#5bc18c66111bc94532b0d2df00731c66 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 @@ -39,18 +39,17 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.co https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda#fb54c4ea68b460c278d26eea89cfbcc3 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_2.conda#f92e6e0a3c0c0c85561ef61aa59d555d https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda#55199e2ae2c3651f6f9b2a447b47bdc9 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_2.conda#962d6ac93c30b1dfc54c9cccafd1003e +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.2-hee588c1_0.conda#93048463501053a00739215ea3f36324 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda#c75da67f045c2627f59e6fcb5f4e3a9b +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_2.conda#9d2072af184b5caa29492bf2344597bb https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h81593ed_1.conda#0619e8fc4c8025a908ea3a3422d3b775 https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda#3b3e64af585eadfb52bb90b553db5edf @@ -61,6 +60,7 @@ https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 +https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.124-hb9d3cd8_0.conda#8bc89311041d7fcb510238cf0848ccae @@ -72,7 +72,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_4.conda#6 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/python-3.11.12-h9e4cc4f_0_cpython.conda#b61d4fbf583b8393d9d00ec106ad3658 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.49.1-h9eae976_2.conda#1894a9d3a8c3ffa53f8ca09fcd2fac25 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.49.2-h9eae976_0.conda#02161fcc0f832baf517750700ae1d6f6 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a @@ -81,7 +81,7 @@ https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a1 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hfdbb021_2.conda#d21daab070d76490cb39a8f1d1729d79 https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.2-pyhd8ed1ab_0.conda#bf9c1698e819fab31f67dbab4256f7ba -https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda#c207fa5ac7ea99b149344385a9c0880d +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.4.26-pyhd8ed1ab_0.conda#c33eeaaa33f45031be34cda513df39b6 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.2-pyhd8ed1ab_0.conda#40fe4284b8b5835a9073a645139f35af @@ -108,12 +108,13 @@ https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openbl https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.13.0-h332b0f4_0.conda#cbdc92ac0d93fe3c796e36ad65c7905c https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h4bc477f_0.conda#14dbe05b929e329dbaa6f2d0aa19466d https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py311h2dc5d0c_1.conda#6565a715337ae279e351d0abd8ffe88a https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.7-pyh29332c3_0.conda#e57da6fe54bb3a5556cf36d199ff07d8 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda#424844562f5d337077b445ec6b1398a7 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda#232fb4577b6687b2d503ef8e254270c9 @@ -140,7 +141,7 @@ https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311hf29c0ef_0.conda#55553ecd5328336368db611f350b7039 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.0-py311h2dc5d0c_0.conda#37bc439a94beeb29914baa5b4987ebd5 -https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.0-pyh29332c3_0.conda#b1ed099fbbf189bf23967ed938316d05 +https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.57.0-py311h2dc5d0c_0.conda#4175f366b41d3d0c80d02661a0a03473 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 @@ -153,13 +154,14 @@ https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda#452b98eafe050ecff932f0ec832dd03f https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/noarch/pip-25.1-pyh8b19718_0.conda#2247aa245832ea47e8b971bef73d7094 +https://conda.anaconda.org/conda-forge/linux-64/pillow-11.2.1-py311h1322bbf_0.conda#4c49bdabd1d4e09386dabc676fb6bd65 +https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh8b19718_0.conda#32d0781ace05105cc99af55d36cbec7c https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.0-h0054346_1.conda#a3547a9c204da804d8ef9c40c7ac0b84 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.0-pyh29332c3_0.conda#46276968030688a25257b08772c418fc https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.2-h0e9735f_0.conda#568ed1300869dca0ba09fb750cda5dbb -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.30.0-pyhd8ed1ab_0.conda#c0e0b4a09aa5a698a1bdd4ebfe28be38 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.31.2-pyhd8ed1ab_0.conda#c0600c1b374efa7a1ff444befee108ca https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa @@ -168,7 +170,6 @@ https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda# https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h03adeef_0.conda#b1df5affe904efe82ef890826b68881d https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h0134ee8_117.conda#a979c07e8fc0e3f61c24a65d16cc6fbe https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.5-py311h5d046bc_0.conda#df82417acd53257028de5425047ebc22 -https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py311h1322bbf_0.conda#9f4f5593335f76c1dbf7381c11fe7155 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py311h0960b38_1.conda#5e6251fd41d984a9d4fd1fe4b9bdca31 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 @@ -188,14 +189,14 @@ https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.0-py311h3dc67b8_0.co https://conda.anaconda.org/conda-forge/noarch/urllib3-2.4.0-pyhd8ed1ab_0.conda#c1e349028e0052c4eea844e94f773065 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py311h9f3472d_0.conda#555b148cafbd96b658499060d5e11a65 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.41.0-h5f92351_1.conda#742f52d72194d213d47bd6920b138eec -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.1-py311h2b939e6_0.conda#eed17bae389043337f33b95a0fd8c172 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.3-py311h2b939e6_0.conda#0d1b7dfe2bbf983cb7907f6cbd6613e6 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py311h8b974bf_102.conda#d748aad3050d26241842b76d56424cf9 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.2.0-pyha770c72_0.conda#17e487cc8b5507cd3abc09398cf27949 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py311h7db5c69_0.conda#20ba399d57a2b5de789a5b24341481a1 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py311h9f3472d_0.conda#648bccc358ec5b19dec01a5685f3aeb9 -https://conda.anaconda.org/conda-forge/noarch/iris-3.12.1-pyha770c72_0.conda#e0254f1cbcb624c0558a16eed71ff44b +https://conda.anaconda.org/conda-forge/noarch/iris-3.12.2-pyha770c72_0.conda#281bb211efe112ed90f2d703bbcf5512 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda#e9fb3fe8a5b758b4aff187d434f94f03 diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index aeaeaff1..bfbc96b5 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -8,21 +8,21 @@ https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222 https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-hbd8a1cb_0.conda#95db94f75ba080a22eb623590993167b https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda#06d02030237f4d5b3d9a7e7d348fe3c6 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_2.conda#fbe7d535ff9d3a168c148e07358cd5b1 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda#c151d5eb730e9b7480e6d48c0fc44048 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda#ef504d1acbd74b7cc6849ef8af47dd03 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_2.conda#ea8ac52380885ed41c1baa8f1d6d2b93 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h86f0d12_0.conda#27fe770decaf469a53f3e3a6d593067f https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda#a2222a6ada71fb478682efe483ce0f92 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hf1ad2bd_2.conda#556a4fdfac7287d349b8f09aba899693 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_2.conda#ddca86c7040dd0e73b2b69bd7833d225 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_2.conda#01de444988ed960031dbe84cf4f9b1fc https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 -https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_0.conda#0e87378639676987af32fee53ba32258 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-h8f9b012_2.conda#a78c856b6dc6bf4ea8daeb9beaaa3fb0 +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_1.conda#a76fd702c93cd2dfd89eff30a5fd45a8 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_2.conda#1cb1c67961f6dd257eae9e9691b341aa https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 @@ -30,7 +30,7 @@ https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_1.conda#d https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 -https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb9d3cd8_0.conda#2ef1822d8168ed5d79ab1bf01088419a +https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb47aa4a_0.conda#607e13a8caac17f9a664bcab5302ce06 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.1-h97f6797_0.conda#5bc18c66111bc94532b0d2df00731c66 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 @@ -39,18 +39,17 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.co https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_2.conda#fb54c4ea68b460c278d26eea89cfbcc3 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_2.conda#f92e6e0a3c0c0c85561ef61aa59d555d https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda#55199e2ae2c3651f6f9b2a447b47bdc9 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_2.conda#962d6ac93c30b1dfc54c9cccafd1003e +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.2-hee588c1_0.conda#93048463501053a00739215ea3f36324 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_2.conda#c75da67f045c2627f59e6fcb5f4e3a9b +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_2.conda#9d2072af184b5caa29492bf2344597bb https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.7-h81593ed_1.conda#0619e8fc4c8025a908ea3a3422d3b775 https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda#3b3e64af585eadfb52bb90b553db5edf @@ -61,6 +60,7 @@ https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 +https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.124-hb9d3cd8_0.conda#8bc89311041d7fcb510238cf0848ccae @@ -72,7 +72,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_4.conda#6 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/python-3.12.10-h9e4cc4f_0_cpython.conda#a41d26cd4d47092d683915d058380dec https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.49.1-h9eae976_2.conda#1894a9d3a8c3ffa53f8ca09fcd2fac25 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.49.2-h9eae976_0.conda#02161fcc0f832baf517750700ae1d6f6 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a @@ -81,7 +81,7 @@ https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a1 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda#b0b867af6fc74b2a0aa206da29c0f3cf https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.2-pyhd8ed1ab_0.conda#bf9c1698e819fab31f67dbab4256f7ba -https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda#c207fa5ac7ea99b149344385a9c0880d +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.4.26-pyhd8ed1ab_0.conda#c33eeaaa33f45031be34cda513df39b6 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.2-pyhd8ed1ab_0.conda#40fe4284b8b5835a9073a645139f35af @@ -108,12 +108,13 @@ https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openbl https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.13.0-h332b0f4_0.conda#cbdc92ac0d93fe3c796e36ad65c7905c https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h4bc477f_0.conda#14dbe05b929e329dbaa6f2d0aa19466d https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda#eb227c3e0bf58f5bd69c0532b157975b https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.7-pyh29332c3_0.conda#e57da6fe54bb3a5556cf36d199ff07d8 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda#424844562f5d337077b445ec6b1398a7 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda#232fb4577b6687b2d503ef8e254270c9 @@ -140,7 +141,7 @@ https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda#a861504bbea4161a9170b85d4d2be840 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.0-py312h178313f_0.conda#d0fca021e354cc96455021852a1fad6d -https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.0-pyh29332c3_0.conda#b1ed099fbbf189bf23967ed938316d05 +https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.57.0-py312h178313f_0.conda#97907388593b27ac01237a1023d58d3d https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 @@ -153,13 +154,14 @@ https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda#452b98eafe050ecff932f0ec832dd03f https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/noarch/pip-25.1-pyh8b19718_0.conda#2247aa245832ea47e8b971bef73d7094 +https://conda.anaconda.org/conda-forge/linux-64/pillow-11.2.1-py312h80c1187_0.conda#ca438bf57e4f2423d261987fe423a0dd +https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh8b19718_0.conda#32d0781ace05105cc99af55d36cbec7c https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.0-h0054346_1.conda#a3547a9c204da804d8ef9c40c7ac0b84 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.0-pyh29332c3_0.conda#46276968030688a25257b08772c418fc https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.2-h0e9735f_0.conda#568ed1300869dca0ba09fb750cda5dbb -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.30.0-pyhd8ed1ab_0.conda#c0e0b4a09aa5a698a1bdd4ebfe28be38 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.31.2-pyhd8ed1ab_0.conda#c0600c1b374efa7a1ff444befee108ca https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa @@ -168,7 +170,6 @@ https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda# https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h03adeef_0.conda#b1df5affe904efe82ef890826b68881d https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h0134ee8_117.conda#a979c07e8fc0e3f61c24a65d16cc6fbe https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.5-py312h72c5963_0.conda#505bcfc142b97010c162863c38d90016 -https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py312h80c1187_0.conda#d3894405f05b2c0f351d5de3ae26fa9c https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py312h03c6e1f_1.conda#f754591f9ec0169e436fa84cb9db0c32 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 @@ -188,14 +189,14 @@ https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.0-py312h21f5128_0.co https://conda.anaconda.org/conda-forge/noarch/urllib3-2.4.0-pyhd8ed1ab_0.conda#c1e349028e0052c4eea844e94f773065 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py312hc0a28a1_0.conda#8b5b812d4c18cb37bda7a7c8d3a6acb3 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.41.0-h5f92351_1.conda#742f52d72194d213d47bd6920b138eec -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.1-py312hd3ec401_0.conda#514d8a6894286f6d9894b352782c7e18 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.3-py312hd3ec401_0.conda#2d69618b52d70970c81cc598e4b51118 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py312h3805cb1_102.conda#c1358b48677cfc7095cd664f1f0647a1 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.2.0-pyha770c72_0.conda#17e487cc8b5507cd3abc09398cf27949 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py312hf9745cd_0.conda#ea213e31805199cb7d0da457b879ceed https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py312hc0a28a1_0.conda#476b0357e207e10d2b7b13ed82156e6d -https://conda.anaconda.org/conda-forge/noarch/iris-3.12.1-pyha770c72_0.conda#e0254f1cbcb624c0558a16eed71ff44b +https://conda.anaconda.org/conda-forge/noarch/iris-3.12.2-pyha770c72_0.conda#281bb211efe112ed90f2d703bbcf5512 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda#e9fb3fe8a5b758b4aff187d434f94f03 From 15a7008d22fca49fd069cc08ab2945f067bf8449 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 13 May 2025 12:02:01 +0100 Subject: [PATCH 452/583] chore: update pre-commit hooks (#646) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.11.8 → v0.11.9](https://github.com/astral-sh/ruff-pre-commit/compare/v0.11.8...v0.11.9) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a334840e..7215b397 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -78,7 +78,7 @@ repos: types: [file, python] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.11.8" + rev: "v0.11.9" hooks: - id: ruff types: [file, python] From 77392195a26aa771b36fdd62a7709fd07f075065 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 16 May 2025 11:03:03 +0100 Subject: [PATCH 453/583] Bump scitools/workflows in the dependencies group (#648) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2025.05.1 to 2025.05.2 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.05.1...2025.05.2) --- updated-dependencies: - dependency-name: scitools/workflows dependency-version: 2025.05.2 dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/ci-template-check.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 72a1cec6..658c4c60 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.05.1 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.05.2 diff --git a/.github/workflows/ci-template-check.yml b/.github/workflows/ci-template-check.yml index ed3b6f99..6f1892fa 100644 --- a/.github/workflows/ci-template-check.yml +++ b/.github/workflows/ci-template-check.yml @@ -10,7 +10,7 @@ on: jobs: prompt-share: - uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.05.1 + uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.05.2 secrets: inherit with: pr_number: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 0d2eaa94..e5e87e61 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.05.1 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.05.2 secrets: inherit From 011561821e0c251618b7bce3d9c7030fc2baddf1 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 19 May 2025 10:21:37 +0100 Subject: [PATCH 454/583] Updated environment lockfiles (#649) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 24 ++++++++++++------------ requirements/locks/py311-linux-64.lock | 26 +++++++++++++------------- requirements/locks/py312-linux-64.lock | 26 +++++++++++++------------- 3 files changed, 38 insertions(+), 38 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 84569fb1..5d26ade1 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -14,7 +14,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda#c1 https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_2.conda#ea8ac52380885ed41c1baa8f1d6d2b93 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h86f0d12_0.conda#27fe770decaf469a53f3e3a6d593067f +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.24-h86f0d12_0.conda#64f0c503da58ec25ebd359e4d990afa8 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_2.conda#ddca86c7040dd0e73b2b69bd7833d225 @@ -68,7 +68,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.c https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda#0a4d0252248ef9a0f88f2ba8b8a08e12 -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_4.conda#6c1028898cf3a2032d9af46689e1b81a +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hf01ce69_5.conda#e79a094918988bb1807462cd42c83962 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/python-3.10.17-hd6af730_0_cpython.conda#7bb89638dae9ce1b8e051d0b721e83c2 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 @@ -85,14 +85,13 @@ https://conda.anaconda.org/conda-forge/noarch/certifi-2025.4.26-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.2-pyhd8ed1ab_0.conda#40fe4284b8b5835a9073a645139f35af -https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda#f22f4d4970e09d68a10b922cbb0408d3 +https://conda.anaconda.org/conda-forge/noarch/click-8.2.0-pyh707e725_0.conda#4d4f33c3d9e5a23a7f4795d327a5d1f0 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.1-pyhd8ed1ab_0.conda#364ba6c9fb03886ac979b482f39ebb92 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/colorlog-6.9.0-pyh707e725_1.conda#f00fc375bd02bdbbf791f9fe26ae96ec https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_1.conda#8d88f4a2242e6b96f9ecff9a6a05b2f1 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda#4547b39256e296bb758166893e909a7c https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.2-pyhd8ed1ab_0.conda#9c40692c3d24c7aaf335f673ac09d308 @@ -115,7 +114,7 @@ https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda#424844562f5d337077b445ec6b1398a7 -https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda#232fb4577b6687b2d503ef8e254270c9 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 @@ -141,7 +140,8 @@ https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h8deb56e_0.conda#1fc24a3196ad5ede2a68148be61894f4 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.0-py310h89163eb_0.conda#9f7865c17117d16f804b687b498e35fa https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.57.0-py310h89163eb_0.conda#34378af82141b3c1725dcdf898b28fc6 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.58.0-py310h89163eb_0.conda#4532df8a45ab4e37b2cc71186304dd5a https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h2d575fe_101.conda#d1f61f912e1968a8ac9834b62fde008d @@ -156,8 +156,7 @@ https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0ba https://conda.anaconda.org/conda-forge/linux-64/pillow-11.2.1-py310h7e6dc6c_0.conda#5645a243d90adb50909b9edc209d84fe https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh8b19718_0.conda#32d0781ace05105cc99af55d36cbec7c https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.0-h0054346_1.conda#a3547a9c204da804d8ef9c40c7ac0b84 -https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.0-pyh29332c3_0.conda#46276968030688a25257b08772c418fc -https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be +https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.1-pyhe01879c_0.conda#8200884fd84ab8754567d8523b52eaa8 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.2-h0e9735f_0.conda#568ed1300869dca0ba09fb750cda5dbb https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.31.2-pyhd8ed1ab_0.conda#c0600c1b374efa7a1ff444befee108ca @@ -170,10 +169,9 @@ https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h03adeef_0.conda#b1 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h0134ee8_117.conda#a979c07e8fc0e3f61c24a65d16cc6fbe https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.5-py310hefbff90_0.conda#5526bc875ec897f0d335e38da832b6ee https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py310h71d0299_1.conda#e54b1eaeb50ad1767680181a8575a8db -https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a -https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 +https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.3.1-pyhd8ed1ab_0.conda#996376098e3648237b3efb0e0ad460c1 -https://conda.anaconda.org/conda-forge/noarch/tox-4.25.0-pyh29332c3_1.conda#33a5663573203748912efecd49a2179d +https://conda.anaconda.org/conda-forge/noarch/tox-4.26.0-pyhe01879c_0.conda#b98aeac52fc12b0dd61060f2009ac953 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310h3788b33_5.conda#e05b0475166b68c9dc4d7937e0315654 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha75aee5_2.conda#f9254b5b0193982416b91edcb4b2676f https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310hf462985_1.conda#c2d5289e6cbcecf2c549e01772fe5274 @@ -182,7 +180,9 @@ https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.co https://conda.anaconda.org/conda-forge/noarch/identify-2.6.10-pyhd8ed1ab_0.conda#8d5b9b702810fb3054d52ba146023bc3 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.5-h1920b20_0.conda#ec8824a45bd7c50a46788fa16216d6c2 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py310ha75aee5_1.conda#48781b625a5c7701e04d222752cb2f62 -https://conda.anaconda.org/conda-forge/noarch/nox-2025.2.9-pyh29332c3_1.conda#086837aa2602e3aeb38886e4124a6328 +https://conda.anaconda.org/conda-forge/noarch/nox-2025.5.1-pyhe01879c_0.conda#f294cc5e7c84a0422fcc57f33313e084 +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a +https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.conda#8c29cd33b64b2eb78597fa28b5595c8d https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.3.1-hd8ed1ab_0.conda#38ca080dff1a30a6fd3aec989062b255 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.0-py310h247727d_0.conda#b9400ee14c9b59a3d9f4da715e67c1f8 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 1fba13a4..e8f57cbb 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -14,7 +14,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda#c1 https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_2.conda#ea8ac52380885ed41c1baa8f1d6d2b93 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h86f0d12_0.conda#27fe770decaf469a53f3e3a6d593067f +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.24-h86f0d12_0.conda#64f0c503da58ec25ebd359e4d990afa8 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_2.conda#ddca86c7040dd0e73b2b69bd7833d225 @@ -68,7 +68,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.c https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda#0a4d0252248ef9a0f88f2ba8b8a08e12 -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_4.conda#6c1028898cf3a2032d9af46689e1b81a +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hf01ce69_5.conda#e79a094918988bb1807462cd42c83962 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/python-3.11.12-h9e4cc4f_0_cpython.conda#b61d4fbf583b8393d9d00ec106ad3658 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 @@ -85,14 +85,13 @@ https://conda.anaconda.org/conda-forge/noarch/certifi-2025.4.26-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.2-pyhd8ed1ab_0.conda#40fe4284b8b5835a9073a645139f35af -https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda#f22f4d4970e09d68a10b922cbb0408d3 +https://conda.anaconda.org/conda-forge/noarch/click-8.2.0-pyh707e725_0.conda#4d4f33c3d9e5a23a7f4795d327a5d1f0 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.1-pyhd8ed1ab_0.conda#364ba6c9fb03886ac979b482f39ebb92 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/colorlog-6.9.0-pyh707e725_1.conda#f00fc375bd02bdbbf791f9fe26ae96ec https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_1.conda#8d88f4a2242e6b96f9ecff9a6a05b2f1 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda#4547b39256e296bb758166893e909a7c https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.2-pyhd8ed1ab_0.conda#9c40692c3d24c7aaf335f673ac09d308 @@ -115,7 +114,7 @@ https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda#424844562f5d337077b445ec6b1398a7 -https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda#232fb4577b6687b2d503ef8e254270c9 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 @@ -142,7 +141,8 @@ https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311hf29c0ef_0.conda#55553ecd5328336368db611f350b7039 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.0-py311h2dc5d0c_0.conda#37bc439a94beeb29914baa5b4987ebd5 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.57.0-py311h2dc5d0c_0.conda#4175f366b41d3d0c80d02661a0a03473 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.58.0-py311h2dc5d0c_0.conda#4a0acd70e14c46091400497ee5cc510d https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h2d575fe_101.conda#d1f61f912e1968a8ac9834b62fde008d @@ -157,24 +157,22 @@ https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0ba https://conda.anaconda.org/conda-forge/linux-64/pillow-11.2.1-py311h1322bbf_0.conda#4c49bdabd1d4e09386dabc676fb6bd65 https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh8b19718_0.conda#32d0781ace05105cc99af55d36cbec7c https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.0-h0054346_1.conda#a3547a9c204da804d8ef9c40c7ac0b84 -https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.0-pyh29332c3_0.conda#46276968030688a25257b08772c418fc -https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be +https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.1-pyhe01879c_0.conda#8200884fd84ab8754567d8523b52eaa8 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.2-h0e9735f_0.conda#568ed1300869dca0ba09fb750cda5dbb https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.31.2-pyhd8ed1ab_0.conda#c0600c1b374efa7a1ff444befee108ca https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa -https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.4.1-pyhd8ed1ab_0.conda#0735ecef025a6c2d6eb61aae4785fc3f +https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.5.0-pyhd8ed1ab_0.conda#69bab6d290b49ccb24104515508ee4d0 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h03adeef_0.conda#b1df5affe904efe82ef890826b68881d https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h0134ee8_117.conda#a979c07e8fc0e3f61c24a65d16cc6fbe https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.5-py311h5d046bc_0.conda#df82417acd53257028de5425047ebc22 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py311h0960b38_1.conda#5e6251fd41d984a9d4fd1fe4b9bdca31 -https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a -https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 +https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.3.1-pyhd8ed1ab_0.conda#996376098e3648237b3efb0e0ad460c1 -https://conda.anaconda.org/conda-forge/noarch/tox-4.25.0-pyh29332c3_1.conda#33a5663573203748912efecd49a2179d +https://conda.anaconda.org/conda-forge/noarch/tox-4.26.0-pyhe01879c_0.conda#b98aeac52fc12b0dd61060f2009ac953 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hd18a35c_5.conda#4e8447ca8558a203ec0577b4730073f3 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311h9ecbd09_2.conda#ca02de88df1cc3cfc8f24766ff50cb3c https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h9f3472d_1.conda#2c3c4f115d28ed9e001a271d5d8585aa @@ -182,7 +180,9 @@ https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py311hd18a35c_0. https://conda.anaconda.org/conda-forge/noarch/identify-2.6.10-pyhd8ed1ab_0.conda#8d5b9b702810fb3054d52ba146023bc3 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.5-h1920b20_0.conda#ec8824a45bd7c50a46788fa16216d6c2 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py311h9ecbd09_1.conda#28d6b63784b350a2906dc264ad8c7f2a -https://conda.anaconda.org/conda-forge/noarch/nox-2025.2.9-pyh29332c3_1.conda#086837aa2602e3aeb38886e4124a6328 +https://conda.anaconda.org/conda-forge/noarch/nox-2025.5.1-pyhe01879c_0.conda#f294cc5e7c84a0422fcc57f33313e084 +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a +https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py311h8f841c2_0.conda#5ec0a1732a05376241e1e4c6d50e0e91 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.3.1-hd8ed1ab_0.conda#38ca080dff1a30a6fd3aec989062b255 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.0-py311h3dc67b8_0.conda#697054700855c7699805f41ad7f204a3 diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index bfbc96b5..18434d3e 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -14,7 +14,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda#c1 https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_2.conda#ea8ac52380885ed41c1baa8f1d6d2b93 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h86f0d12_0.conda#27fe770decaf469a53f3e3a6d593067f +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.24-h86f0d12_0.conda#64f0c503da58ec25ebd359e4d990afa8 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_2.conda#ddca86c7040dd0e73b2b69bd7833d225 @@ -68,7 +68,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.c https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda#0a4d0252248ef9a0f88f2ba8b8a08e12 -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_4.conda#6c1028898cf3a2032d9af46689e1b81a +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hf01ce69_5.conda#e79a094918988bb1807462cd42c83962 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/python-3.12.10-h9e4cc4f_0_cpython.conda#a41d26cd4d47092d683915d058380dec https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 @@ -85,14 +85,13 @@ https://conda.anaconda.org/conda-forge/noarch/certifi-2025.4.26-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.2-pyhd8ed1ab_0.conda#40fe4284b8b5835a9073a645139f35af -https://conda.anaconda.org/conda-forge/noarch/click-8.1.8-pyh707e725_0.conda#f22f4d4970e09d68a10b922cbb0408d3 +https://conda.anaconda.org/conda-forge/noarch/click-8.2.0-pyh707e725_0.conda#4d4f33c3d9e5a23a7f4795d327a5d1f0 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.1-pyhd8ed1ab_0.conda#364ba6c9fb03886ac979b482f39ebb92 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/colorlog-6.9.0-pyh707e725_1.conda#f00fc375bd02bdbbf791f9fe26ae96ec https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_1.conda#8d88f4a2242e6b96f9ecff9a6a05b2f1 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda#a16662747cdeb9abbac74d0057cc976e https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda#4547b39256e296bb758166893e909a7c https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.2-pyhd8ed1ab_0.conda#9c40692c3d24c7aaf335f673ac09d308 @@ -115,7 +114,7 @@ https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda#424844562f5d337077b445ec6b1398a7 -https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda#e9dcbce5f45f9ee500e728ae58b605b6 +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda#232fb4577b6687b2d503ef8e254270c9 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 @@ -142,7 +141,8 @@ https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda#a861504bbea4161a9170b85d4d2be840 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.0-py312h178313f_0.conda#d0fca021e354cc96455021852a1fad6d https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.57.0-py312h178313f_0.conda#97907388593b27ac01237a1023d58d3d +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.58.0-py312h178313f_0.conda#20ab6e460950203a022131b49c3dbda1 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h2d575fe_101.conda#d1f61f912e1968a8ac9834b62fde008d @@ -157,24 +157,22 @@ https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0ba https://conda.anaconda.org/conda-forge/linux-64/pillow-11.2.1-py312h80c1187_0.conda#ca438bf57e4f2423d261987fe423a0dd https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh8b19718_0.conda#32d0781ace05105cc99af55d36cbec7c https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.0-h0054346_1.conda#a3547a9c204da804d8ef9c40c7ac0b84 -https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.0-pyh29332c3_0.conda#46276968030688a25257b08772c418fc -https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be +https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.1-pyhe01879c_0.conda#8200884fd84ab8754567d8523b52eaa8 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.2-h0e9735f_0.conda#568ed1300869dca0ba09fb750cda5dbb https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.31.2-pyhd8ed1ab_0.conda#c0600c1b374efa7a1ff444befee108ca https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa -https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.4.1-pyhd8ed1ab_0.conda#0735ecef025a6c2d6eb61aae4785fc3f +https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.5.0-pyhd8ed1ab_0.conda#69bab6d290b49ccb24104515508ee4d0 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h03adeef_0.conda#b1df5affe904efe82ef890826b68881d https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h0134ee8_117.conda#a979c07e8fc0e3f61c24a65d16cc6fbe https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.5-py312h72c5963_0.conda#505bcfc142b97010c162863c38d90016 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py312h03c6e1f_1.conda#f754591f9ec0169e436fa84cb9db0c32 -https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a -https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 +https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.3.1-pyhd8ed1ab_0.conda#996376098e3648237b3efb0e0ad460c1 -https://conda.anaconda.org/conda-forge/noarch/tox-4.25.0-pyh29332c3_1.conda#33a5663573203748912efecd49a2179d +https://conda.anaconda.org/conda-forge/noarch/tox-4.26.0-pyhe01879c_0.conda#b98aeac52fc12b0dd61060f2009ac953 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h68727a3_5.conda#f9664ee31aed96c85b7319ab0a693341 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312h66e93f0_2.conda#630db208bc7bbb96725ce9832c7423bb https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312hc0a28a1_1.conda#990033147b0a998e756eaaed6b28f48d @@ -182,7 +180,9 @@ https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py312h68727a3_0. https://conda.anaconda.org/conda-forge/noarch/identify-2.6.10-pyhd8ed1ab_0.conda#8d5b9b702810fb3054d52ba146023bc3 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.5-h1920b20_0.conda#ec8824a45bd7c50a46788fa16216d6c2 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h66e93f0_1.conda#5fef67f50126f40f5966a9451661280d -https://conda.anaconda.org/conda-forge/noarch/nox-2025.2.9-pyh29332c3_1.conda#086837aa2602e3aeb38886e4124a6328 +https://conda.anaconda.org/conda-forge/noarch/nox-2025.5.1-pyhe01879c_0.conda#f294cc5e7c84a0422fcc57f33313e084 +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a +https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py312ha707e6e_0.conda#00b999c5f9d01fb633db819d79186bd4 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.3.1-hd8ed1ab_0.conda#38ca080dff1a30a6fd3aec989062b255 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.0-py312h21f5128_0.conda#761c745a289b3d6abf56eb1193343172 From bdabee790a354d680070322ebeb42eeae4ae8e7d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 20 May 2025 09:26:25 +0100 Subject: [PATCH 455/583] chore: update pre-commit hooks (#650) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.11.9 → v0.11.10](https://github.com/astral-sh/ruff-pre-commit/compare/v0.11.9...v0.11.10) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 7215b397..f4b535f6 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -78,7 +78,7 @@ repos: types: [file, python] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.11.9" + rev: "v0.11.10" hooks: - id: ruff types: [file, python] From f33ce91b4d43c686a98a876e3b6a2c597de42d82 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 22 May 2025 09:57:22 +0100 Subject: [PATCH 456/583] Bump scitools/workflows in the dependencies group (#651) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2025.05.2 to 2025.05.3 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.05.2...2025.05.3) --- updated-dependencies: - dependency-name: scitools/workflows dependency-version: 2025.05.3 dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/ci-template-check.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 658c4c60..d0e45584 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.05.2 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.05.3 diff --git a/.github/workflows/ci-template-check.yml b/.github/workflows/ci-template-check.yml index 6f1892fa..47823c6d 100644 --- a/.github/workflows/ci-template-check.yml +++ b/.github/workflows/ci-template-check.yml @@ -10,7 +10,7 @@ on: jobs: prompt-share: - uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.05.2 + uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.05.3 secrets: inherit with: pr_number: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index e5e87e61..bb61410d 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.05.2 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.05.3 secrets: inherit From 56cf7386fe82bbf5895ad873c2bd5f073d17c3f0 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 27 May 2025 11:26:52 +0100 Subject: [PATCH 457/583] chore: update pre-commit hooks (#653) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.11.10 → v0.11.11](https://github.com/astral-sh/ruff-pre-commit/compare/v0.11.10...v0.11.11) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f4b535f6..aed652b4 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -78,7 +78,7 @@ repos: types: [file, python] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.11.10" + rev: "v0.11.11" hooks: - id: ruff types: [file, python] From 262511b6ca8376d69342ab32171f762b5c5dc68c Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Tue, 27 May 2025 11:29:51 +0100 Subject: [PATCH 458/583] Updated environment lockfiles (#652) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 20 ++++++++++---------- requirements/locks/py311-linux-64.lock | 20 ++++++++++---------- requirements/locks/py312-linux-64.lock | 20 ++++++++++---------- 3 files changed, 30 insertions(+), 30 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 5d26ade1..057617b8 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -85,7 +85,7 @@ https://conda.anaconda.org/conda-forge/noarch/certifi-2025.4.26-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.2-pyhd8ed1ab_0.conda#40fe4284b8b5835a9073a645139f35af -https://conda.anaconda.org/conda-forge/noarch/click-8.2.0-pyh707e725_0.conda#4d4f33c3d9e5a23a7f4795d327a5d1f0 +https://conda.anaconda.org/conda-forge/noarch/click-8.2.1-pyh707e725_0.conda#94b550b8d3a614dbd326af798c7dfb40 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.1-pyhd8ed1ab_0.conda#364ba6c9fb03886ac979b482f39ebb92 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/colorlog-6.9.0-pyh707e725_1.conda#f00fc375bd02bdbbf791f9fe26ae96ec @@ -94,7 +94,7 @@ https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_1.conda#8 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda#4547b39256e296bb758166893e909a7c https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.2-pyhd8ed1ab_0.conda#9c40692c3d24c7aaf335f673ac09d308 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.5.0-pyhd8ed1ab_0.conda#7ac28047cd73cf02a294a64f036b2b02 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 @@ -123,9 +123,9 @@ https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#4 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py310ha75aee5_2.conda#af6da4542e91edaf59b614ce7e991700 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py310h89163eb_2.conda#fd343408e64cf1e273ab7c710da374db -https://conda.anaconda.org/conda-forge/noarch/setuptools-80.1.0-pyhff2d567_0.conda#f6f72d0837c79eaec77661be43e8a691 +https://conda.anaconda.org/conda-forge/noarch/setuptools-80.8.0-pyhff2d567_0.conda#ea075e94dc0106c7212128b6a25bbc4c https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 -https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e +https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda#755cf22df8693aa0d1aec1c123fa5863 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 @@ -138,14 +138,14 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0. https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3cc595284c5e8f0f9900a9b228a332 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h8deb56e_0.conda#1fc24a3196ad5ede2a68148be61894f4 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.0-py310h89163eb_0.conda#9f7865c17117d16f804b687b498e35fa +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.1-py310h89163eb_0.conda#c4e060ef1a785398e4d4dd76b7658a17 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.58.0-py310h89163eb_0.conda#4532df8a45ab4e37b2cc71186304dd5a https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h2d575fe_101.conda#d1f61f912e1968a8ac9834b62fde008d -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda#f4b39bf00c69f56ac01e020ebfac066c +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda#abb32c727da370c481a1c206f5159ce9 @@ -164,10 +164,10 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.6.1-hd8ed1ab_0.conda#7f46575a91b1307441abc235d01cab66 +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.7.0-h40b2b14_1.conda#8a77895fb29728b736a1a6c75906ea1a https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h03adeef_0.conda#b1df5affe904efe82ef890826b68881d https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h0134ee8_117.conda#a979c07e8fc0e3f61c24a65d16cc6fbe -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.5-py310hefbff90_0.conda#5526bc875ec897f0d335e38da832b6ee +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.6-py310hefbff90_0.conda#b0cea2c364bf65cd19e023040eeab05d https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py310h71d0299_1.conda#e54b1eaeb50ad1767680181a8575a8db https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.3.1-pyhd8ed1ab_0.conda#996376098e3648237b3efb0e0ad460c1 @@ -177,7 +177,7 @@ https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha75aee5_2 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310hf462985_1.conda#c2d5289e6cbcecf2c549e01772fe5274 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py310h3788b33_0.conda#b6420d29123c7c823de168f49ccdfe6a https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.10-pyhd8ed1ab_0.conda#8d5b9b702810fb3054d52ba146023bc3 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.11-pyhd8ed1ab_0.conda#58cf839838667b020fe585e463b41651 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.5-h1920b20_0.conda#ec8824a45bd7c50a46788fa16216d6c2 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py310ha75aee5_1.conda#48781b625a5c7701e04d222752cb2f62 https://conda.anaconda.org/conda-forge/noarch/nox-2025.5.1-pyhe01879c_0.conda#f294cc5e7c84a0422fcc57f33313e084 @@ -185,7 +185,7 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.cond https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.conda#8c29cd33b64b2eb78597fa28b5595c8d https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.3.1-hd8ed1ab_0.conda#38ca080dff1a30a6fd3aec989062b255 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.0-py310h247727d_0.conda#b9400ee14c9b59a3d9f4da715e67c1f8 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py310h247727d_0.conda#78ae955878da938d98aa828413263284 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.4.0-pyhd8ed1ab_0.conda#c1e349028e0052c4eea844e94f773065 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py310hf462985_0.conda#c31938674e4cda43617a4d70f99ffd0c https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.41.0-h5f92351_1.conda#742f52d72194d213d47bd6920b138eec diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index e8f57cbb..021320fe 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -85,7 +85,7 @@ https://conda.anaconda.org/conda-forge/noarch/certifi-2025.4.26-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.2-pyhd8ed1ab_0.conda#40fe4284b8b5835a9073a645139f35af -https://conda.anaconda.org/conda-forge/noarch/click-8.2.0-pyh707e725_0.conda#4d4f33c3d9e5a23a7f4795d327a5d1f0 +https://conda.anaconda.org/conda-forge/noarch/click-8.2.1-pyh707e725_0.conda#94b550b8d3a614dbd326af798c7dfb40 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.1-pyhd8ed1ab_0.conda#364ba6c9fb03886ac979b482f39ebb92 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/colorlog-6.9.0-pyh707e725_1.conda#f00fc375bd02bdbbf791f9fe26ae96ec @@ -94,7 +94,7 @@ https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_1.conda#8 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda#4547b39256e296bb758166893e909a7c https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.2-pyhd8ed1ab_0.conda#9c40692c3d24c7aaf335f673ac09d308 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.5.0-pyhd8ed1ab_0.conda#7ac28047cd73cf02a294a64f036b2b02 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 @@ -124,9 +124,9 @@ https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py311h9ecbd0 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py311h2dc5d0c_2.conda#014417753f948da1f70d132b2de573be https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-3.1.0-pyhd8ed1ab_0.conda#5f0f24f8032c2c1bb33f59b75974f5fc -https://conda.anaconda.org/conda-forge/noarch/setuptools-80.1.0-pyhff2d567_0.conda#f6f72d0837c79eaec77661be43e8a691 +https://conda.anaconda.org/conda-forge/noarch/setuptools-80.8.0-pyhff2d567_0.conda#ea075e94dc0106c7212128b6a25bbc4c https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 -https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e +https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda#755cf22df8693aa0d1aec1c123fa5863 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 @@ -139,14 +139,14 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0. https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3cc595284c5e8f0f9900a9b228a332 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311hf29c0ef_0.conda#55553ecd5328336368db611f350b7039 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.0-py311h2dc5d0c_0.conda#37bc439a94beeb29914baa5b4987ebd5 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.1-py311h2dc5d0c_0.conda#e761745f85b5fc909aab137ff59bc9cb https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.58.0-py311h2dc5d0c_0.conda#4a0acd70e14c46091400497ee5cc510d https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h2d575fe_101.conda#d1f61f912e1968a8ac9834b62fde008d -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda#f4b39bf00c69f56ac01e020ebfac066c +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda#abb32c727da370c481a1c206f5159ce9 @@ -164,11 +164,11 @@ https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.31.2-pyhd8ed1ab_0.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa -https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.5.0-pyhd8ed1ab_0.conda#69bab6d290b49ccb24104515508ee4d0 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.5.1-pyhd8ed1ab_0.conda#8f0ef561cd615a17df3256742a3457c4 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h03adeef_0.conda#b1df5affe904efe82ef890826b68881d https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h0134ee8_117.conda#a979c07e8fc0e3f61c24a65d16cc6fbe -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.5-py311h5d046bc_0.conda#df82417acd53257028de5425047ebc22 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.6-py311h5d046bc_0.conda#babce4d9841ebfcee64249d98eb4e0d4 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py311h0960b38_1.conda#5e6251fd41d984a9d4fd1fe4b9bdca31 https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.3.1-pyhd8ed1ab_0.conda#996376098e3648237b3efb0e0ad460c1 @@ -177,7 +177,7 @@ https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hd18a35c_5.co https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311h9ecbd09_2.conda#ca02de88df1cc3cfc8f24766ff50cb3c https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h9f3472d_1.conda#2c3c4f115d28ed9e001a271d5d8585aa https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py311hd18a35c_0.conda#f8e440efa026c394461a45a46cea49fc -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.10-pyhd8ed1ab_0.conda#8d5b9b702810fb3054d52ba146023bc3 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.11-pyhd8ed1ab_0.conda#58cf839838667b020fe585e463b41651 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.5-h1920b20_0.conda#ec8824a45bd7c50a46788fa16216d6c2 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py311h9ecbd09_1.conda#28d6b63784b350a2906dc264ad8c7f2a https://conda.anaconda.org/conda-forge/noarch/nox-2025.5.1-pyhe01879c_0.conda#f294cc5e7c84a0422fcc57f33313e084 @@ -185,7 +185,7 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.cond https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py311h8f841c2_0.conda#5ec0a1732a05376241e1e4c6d50e0e91 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.3.1-hd8ed1ab_0.conda#38ca080dff1a30a6fd3aec989062b255 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.0-py311h3dc67b8_0.conda#697054700855c7699805f41ad7f204a3 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py311h3dc67b8_0.conda#ea7501cf4d40188cc662b29bcc07f13b https://conda.anaconda.org/conda-forge/noarch/urllib3-2.4.0-pyhd8ed1ab_0.conda#c1e349028e0052c4eea844e94f773065 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py311h9f3472d_0.conda#555b148cafbd96b658499060d5e11a65 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.41.0-h5f92351_1.conda#742f52d72194d213d47bd6920b138eec diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 18434d3e..44eec6ef 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -85,7 +85,7 @@ https://conda.anaconda.org/conda-forge/noarch/certifi-2025.4.26-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.2-pyhd8ed1ab_0.conda#40fe4284b8b5835a9073a645139f35af -https://conda.anaconda.org/conda-forge/noarch/click-8.2.0-pyh707e725_0.conda#4d4f33c3d9e5a23a7f4795d327a5d1f0 +https://conda.anaconda.org/conda-forge/noarch/click-8.2.1-pyh707e725_0.conda#94b550b8d3a614dbd326af798c7dfb40 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.1-pyhd8ed1ab_0.conda#364ba6c9fb03886ac979b482f39ebb92 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/colorlog-6.9.0-pyh707e725_1.conda#f00fc375bd02bdbbf791f9fe26ae96ec @@ -94,7 +94,7 @@ https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_1.conda#8 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda#4547b39256e296bb758166893e909a7c https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.3.2-pyhd8ed1ab_0.conda#9c40692c3d24c7aaf335f673ac09d308 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.5.0-pyhd8ed1ab_0.conda#7ac28047cd73cf02a294a64f036b2b02 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 @@ -124,9 +124,9 @@ https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h178313f_2.conda#cf2485f39740de96e2a7f2bb18ed2fee https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-3.1.0-pyhd8ed1ab_0.conda#5f0f24f8032c2c1bb33f59b75974f5fc -https://conda.anaconda.org/conda-forge/noarch/setuptools-80.1.0-pyhff2d567_0.conda#f6f72d0837c79eaec77661be43e8a691 +https://conda.anaconda.org/conda-forge/noarch/setuptools-80.8.0-pyhff2d567_0.conda#ea075e94dc0106c7212128b6a25bbc4c https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 -https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e +https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda#755cf22df8693aa0d1aec1c123fa5863 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 @@ -139,14 +139,14 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0. https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3cc595284c5e8f0f9900a9b228a332 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda#a861504bbea4161a9170b85d4d2be840 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.0-py312h178313f_0.conda#d0fca021e354cc96455021852a1fad6d +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.1-py312h178313f_0.conda#d0cfba188d8eba0c3676af3d88e3b832 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.58.0-py312h178313f_0.conda#20ab6e460950203a022131b49c3dbda1 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h2d575fe_101.conda#d1f61f912e1968a8ac9834b62fde008d -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda#f4b39bf00c69f56ac01e020ebfac066c +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda#abb32c727da370c481a1c206f5159ce9 @@ -164,11 +164,11 @@ https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.31.2-pyhd8ed1ab_0.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa -https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.5.0-pyhd8ed1ab_0.conda#69bab6d290b49ccb24104515508ee4d0 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.5.1-pyhd8ed1ab_0.conda#8f0ef561cd615a17df3256742a3457c4 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h03adeef_0.conda#b1df5affe904efe82ef890826b68881d https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h0134ee8_117.conda#a979c07e8fc0e3f61c24a65d16cc6fbe -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.5-py312h72c5963_0.conda#505bcfc142b97010c162863c38d90016 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.6-py312h72c5963_0.conda#17fac9db62daa5c810091c2882b28f45 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py312h03c6e1f_1.conda#f754591f9ec0169e436fa84cb9db0c32 https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.3.1-pyhd8ed1ab_0.conda#996376098e3648237b3efb0e0ad460c1 @@ -177,7 +177,7 @@ https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h68727a3_5.co https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312h66e93f0_2.conda#630db208bc7bbb96725ce9832c7423bb https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312hc0a28a1_1.conda#990033147b0a998e756eaaed6b28f48d https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py312h68727a3_0.conda#e688276449452cdfe9f8f5d3e74c23f6 -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.10-pyhd8ed1ab_0.conda#8d5b9b702810fb3054d52ba146023bc3 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.11-pyhd8ed1ab_0.conda#58cf839838667b020fe585e463b41651 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.5-h1920b20_0.conda#ec8824a45bd7c50a46788fa16216d6c2 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h66e93f0_1.conda#5fef67f50126f40f5966a9451661280d https://conda.anaconda.org/conda-forge/noarch/nox-2025.5.1-pyhe01879c_0.conda#f294cc5e7c84a0422fcc57f33313e084 @@ -185,7 +185,7 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.cond https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py312ha707e6e_0.conda#00b999c5f9d01fb633db819d79186bd4 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.3.1-hd8ed1ab_0.conda#38ca080dff1a30a6fd3aec989062b255 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.0-py312h21f5128_0.conda#761c745a289b3d6abf56eb1193343172 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py312h21f5128_0.conda#d38eb6d34385f82b02ff776a66977cc4 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.4.0-pyhd8ed1ab_0.conda#c1e349028e0052c4eea844e94f773065 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py312hc0a28a1_0.conda#8b5b812d4c18cb37bda7a7c8d3a6acb3 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.41.0-h5f92351_1.conda#742f52d72194d213d47bd6920b138eec From f1595d204758fbfedbb3bae42f86b59909f4ab81 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 29 May 2025 09:42:28 +0100 Subject: [PATCH 459/583] Bump scitools/workflows in the dependencies group (#654) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2025.05.3 to 2025.05.4 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.05.3...2025.05.4) --- updated-dependencies: - dependency-name: scitools/workflows dependency-version: 2025.05.4 dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/ci-template-check.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index d0e45584..7fad4b62 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.05.3 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.05.4 diff --git a/.github/workflows/ci-template-check.yml b/.github/workflows/ci-template-check.yml index 47823c6d..e72936de 100644 --- a/.github/workflows/ci-template-check.yml +++ b/.github/workflows/ci-template-check.yml @@ -10,7 +10,7 @@ on: jobs: prompt-share: - uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.05.3 + uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.05.4 secrets: inherit with: pr_number: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index bb61410d..4ac9ae18 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.05.3 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.05.4 secrets: inherit From ceb5c0772ef960476cf2e02dc16992d16e647930 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 2 Jun 2025 11:20:59 +0100 Subject: [PATCH 460/583] Updated environment lockfiles (#655) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 22 +++++++++++----------- requirements/locks/py311-linux-64.lock | 22 +++++++++++----------- requirements/locks/py312-linux-64.lock | 22 +++++++++++----------- 3 files changed, 33 insertions(+), 33 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 057617b8..c3be8691 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -43,7 +43,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_2.co https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda#55199e2ae2c3651f6f9b2a447b47bdc9 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.2-hee588c1_0.conda#93048463501053a00739215ea3f36324 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.0-hee588c1_0.conda#71888e92098d0f8c41b09a671ad289bc https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_2.conda#9d2072af184b5caa29492bf2344597bb https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 @@ -53,7 +53,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.cond https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda#3b3e64af585eadfb52bb90b553db5edf -https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda#a0116df4f4ed05c303811a837d5b39d8 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 @@ -72,7 +72,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hf01ce69_5.conda#e https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/python-3.10.17-hd6af730_0_cpython.conda#7bb89638dae9ce1b8e051d0b721e83c2 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.49.2-h9eae976_0.conda#02161fcc0f832baf517750700ae1d6f6 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.0-h9eae976_0.conda#641d2950ff5031073b5c447457a63be6 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a @@ -80,7 +80,7 @@ https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.2-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_2.conda#bf502c169c71e3c6ac0d6175addfacc2 -https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.2-pyhd8ed1ab_0.conda#bf9c1698e819fab31f67dbab4256f7ba +https://conda.anaconda.org/conda-forge/noarch/cachetools-6.0.0-pyhd8ed1ab_0.conda#fbaa04415c58c287b8c2f324bd207186 https://conda.anaconda.org/conda-forge/noarch/certifi-2025.4.26-pyhd8ed1ab_0.conda#c33eeaaa33f45031be34cda513df39b6 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c @@ -94,7 +94,7 @@ https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_1.conda#8 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda#4547b39256e296bb758166893e909a7c https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.5.0-pyhd8ed1ab_0.conda#7ac28047cd73cf02a294a64f036b2b02 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.5.1-pyhd8ed1ab_0.conda#2d2c9ef879a7e64e2dc657b09272c2b6 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 @@ -104,7 +104,7 @@ https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_ https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py310h3788b33_0.conda#4186d9b4d004b0fe0de6aa62496fb48a https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda#728dbebd0f7a20337218beacffd37916 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.13.0-h332b0f4_0.conda#cbdc92ac0d93fe3c796e36ad65c7905c +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.0-h332b0f4_0.conda#d1738cf06503218acee63669029fd8e8 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h4bc477f_0.conda#14dbe05b929e329dbaa6f2d0aa19466d @@ -135,13 +135,13 @@ https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py310ha75aee https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3cc595284c5e8f0f9900a9b228a332 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.22.0-pyhd8ed1ab_0.conda#234be740b00b8e41567e5b0ed95aaba9 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h8deb56e_0.conda#1fc24a3196ad5ede2a68148be61894f4 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.1-py310h89163eb_0.conda#c4e060ef1a785398e4d4dd76b7658a17 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.2-py310h89163eb_0.conda#5ca8ab35287adc83b2d1996e5c2ac14c https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.58.0-py310h89163eb_0.conda#4532df8a45ab4e37b2cc71186304dd5a +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.58.1-py310h89163eb_0.conda#f4f46207c6defa5ea17b0299298ba849 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h2d575fe_101.conda#d1f61f912e1968a8ac9834b62fde008d @@ -177,12 +177,12 @@ https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha75aee5_2 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310hf462985_1.conda#c2d5289e6cbcecf2c549e01772fe5274 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py310h3788b33_0.conda#b6420d29123c7c823de168f49ccdfe6a https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.11-pyhd8ed1ab_0.conda#58cf839838667b020fe585e463b41651 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.12-pyhd8ed1ab_0.conda#84463b10c1eb198541cd54125c7efe90 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.5-h1920b20_0.conda#ec8824a45bd7c50a46788fa16216d6c2 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py310ha75aee5_1.conda#48781b625a5c7701e04d222752cb2f62 https://conda.anaconda.org/conda-forge/noarch/nox-2025.5.1-pyhe01879c_0.conda#f294cc5e7c84a0422fcc57f33313e084 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a -https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 +https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.1-pyhd8ed1ab_0.conda#11b313328806f1dfbab0eb1d219388c4 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.conda#8c29cd33b64b2eb78597fa28b5595c8d https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.3.1-hd8ed1ab_0.conda#38ca080dff1a30a6fd3aec989062b255 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py310h247727d_0.conda#78ae955878da938d98aa828413263284 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 021320fe..46fea7b5 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -43,7 +43,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_2.co https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda#55199e2ae2c3651f6f9b2a447b47bdc9 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.2-hee588c1_0.conda#93048463501053a00739215ea3f36324 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.0-hee588c1_0.conda#71888e92098d0f8c41b09a671ad289bc https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_2.conda#9d2072af184b5caa29492bf2344597bb https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 @@ -53,7 +53,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.cond https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda#3b3e64af585eadfb52bb90b553db5edf -https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda#a0116df4f4ed05c303811a837d5b39d8 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 @@ -72,7 +72,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hf01ce69_5.conda#e https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/python-3.11.12-h9e4cc4f_0_cpython.conda#b61d4fbf583b8393d9d00ec106ad3658 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.49.2-h9eae976_0.conda#02161fcc0f832baf517750700ae1d6f6 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.0-h9eae976_0.conda#641d2950ff5031073b5c447457a63be6 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a @@ -80,7 +80,7 @@ https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.2-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hfdbb021_2.conda#d21daab070d76490cb39a8f1d1729d79 -https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.2-pyhd8ed1ab_0.conda#bf9c1698e819fab31f67dbab4256f7ba +https://conda.anaconda.org/conda-forge/noarch/cachetools-6.0.0-pyhd8ed1ab_0.conda#fbaa04415c58c287b8c2f324bd207186 https://conda.anaconda.org/conda-forge/noarch/certifi-2025.4.26-pyhd8ed1ab_0.conda#c33eeaaa33f45031be34cda513df39b6 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c @@ -94,7 +94,7 @@ https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_1.conda#8 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda#4547b39256e296bb758166893e909a7c https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.5.0-pyhd8ed1ab_0.conda#7ac28047cd73cf02a294a64f036b2b02 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.5.1-pyhd8ed1ab_0.conda#2d2c9ef879a7e64e2dc657b09272c2b6 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 @@ -104,7 +104,7 @@ https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_ https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py311hd18a35c_0.conda#be34c90cce87090d24da64a7c239ca96 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda#728dbebd0f7a20337218beacffd37916 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.13.0-h332b0f4_0.conda#cbdc92ac0d93fe3c796e36ad65c7905c +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.0-h332b0f4_0.conda#d1738cf06503218acee63669029fd8e8 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h4bc477f_0.conda#14dbe05b929e329dbaa6f2d0aa19466d @@ -136,13 +136,13 @@ https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py311h9ecbd0 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3cc595284c5e8f0f9900a9b228a332 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.22.0-pyhd8ed1ab_0.conda#234be740b00b8e41567e5b0ed95aaba9 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311hf29c0ef_0.conda#55553ecd5328336368db611f350b7039 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.1-py311h2dc5d0c_0.conda#e761745f85b5fc909aab137ff59bc9cb +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.2-py311h2dc5d0c_0.conda#21c1ef48cc2bf485e6d38c5611e91da2 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.58.0-py311h2dc5d0c_0.conda#4a0acd70e14c46091400497ee5cc510d +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.58.1-py311h2dc5d0c_0.conda#9af5d6c8703be9bbe200aeae13a5e6ef https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h2d575fe_101.conda#d1f61f912e1968a8ac9834b62fde008d @@ -177,12 +177,12 @@ https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hd18a35c_5.co https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311h9ecbd09_2.conda#ca02de88df1cc3cfc8f24766ff50cb3c https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h9f3472d_1.conda#2c3c4f115d28ed9e001a271d5d8585aa https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py311hd18a35c_0.conda#f8e440efa026c394461a45a46cea49fc -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.11-pyhd8ed1ab_0.conda#58cf839838667b020fe585e463b41651 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.12-pyhd8ed1ab_0.conda#84463b10c1eb198541cd54125c7efe90 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.5-h1920b20_0.conda#ec8824a45bd7c50a46788fa16216d6c2 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py311h9ecbd09_1.conda#28d6b63784b350a2906dc264ad8c7f2a https://conda.anaconda.org/conda-forge/noarch/nox-2025.5.1-pyhe01879c_0.conda#f294cc5e7c84a0422fcc57f33313e084 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a -https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 +https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.1-pyhd8ed1ab_0.conda#11b313328806f1dfbab0eb1d219388c4 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py311h8f841c2_0.conda#5ec0a1732a05376241e1e4c6d50e0e91 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.3.1-hd8ed1ab_0.conda#38ca080dff1a30a6fd3aec989062b255 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py311h3dc67b8_0.conda#ea7501cf4d40188cc662b29bcc07f13b diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 44eec6ef..124f4c0a 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -43,7 +43,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_2.co https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda#55199e2ae2c3651f6f9b2a447b47bdc9 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.2-hee588c1_0.conda#93048463501053a00739215ea3f36324 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.0-hee588c1_0.conda#71888e92098d0f8c41b09a671ad289bc https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_2.conda#9d2072af184b5caa29492bf2344597bb https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 @@ -53,7 +53,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.cond https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda#3b3e64af585eadfb52bb90b553db5edf -https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda#a0116df4f4ed05c303811a837d5b39d8 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 @@ -72,7 +72,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hf01ce69_5.conda#e https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/python-3.12.10-h9e4cc4f_0_cpython.conda#a41d26cd4d47092d683915d058380dec https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.49.2-h9eae976_0.conda#02161fcc0f832baf517750700ae1d6f6 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.0-h9eae976_0.conda#641d2950ff5031073b5c447457a63be6 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a @@ -80,7 +80,7 @@ https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.2-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda#b0b867af6fc74b2a0aa206da29c0f3cf -https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.2-pyhd8ed1ab_0.conda#bf9c1698e819fab31f67dbab4256f7ba +https://conda.anaconda.org/conda-forge/noarch/cachetools-6.0.0-pyhd8ed1ab_0.conda#fbaa04415c58c287b8c2f324bd207186 https://conda.anaconda.org/conda-forge/noarch/certifi-2025.4.26-pyhd8ed1ab_0.conda#c33eeaaa33f45031be34cda513df39b6 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c @@ -94,7 +94,7 @@ https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_1.conda#8 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda#4547b39256e296bb758166893e909a7c https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.5.0-pyhd8ed1ab_0.conda#7ac28047cd73cf02a294a64f036b2b02 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.5.1-pyhd8ed1ab_0.conda#2d2c9ef879a7e64e2dc657b09272c2b6 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 @@ -104,7 +104,7 @@ https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_ https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.8-py312h84d6215_0.conda#6713467dc95509683bfa3aca08524e8a https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda#728dbebd0f7a20337218beacffd37916 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.13.0-h332b0f4_0.conda#cbdc92ac0d93fe3c796e36ad65c7905c +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.0-h332b0f4_0.conda#d1738cf06503218acee63669029fd8e8 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h4bc477f_0.conda#14dbe05b929e329dbaa6f2d0aa19466d @@ -136,13 +136,13 @@ https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py312h66e93f https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda#0c3cc595284c5e8f0f9900a9b228a332 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.22.0-pyhd8ed1ab_0.conda#234be740b00b8e41567e5b0ed95aaba9 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda#a861504bbea4161a9170b85d4d2be840 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.1-py312h178313f_0.conda#d0cfba188d8eba0c3676af3d88e3b832 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.2-py312h178313f_0.conda#141e4480d38281c3988f3a9aa917b07d https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.58.0-py312h178313f_0.conda#20ab6e460950203a022131b49c3dbda1 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.58.1-py312h178313f_0.conda#59ac6c124428928a1a41691eedf2b3bd https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h2d575fe_101.conda#d1f61f912e1968a8ac9834b62fde008d @@ -177,12 +177,12 @@ https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h68727a3_5.co https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312h66e93f0_2.conda#630db208bc7bbb96725ce9832c7423bb https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312hc0a28a1_1.conda#990033147b0a998e756eaaed6b28f48d https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py312h68727a3_0.conda#e688276449452cdfe9f8f5d3e74c23f6 -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.11-pyhd8ed1ab_0.conda#58cf839838667b020fe585e463b41651 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.12-pyhd8ed1ab_0.conda#84463b10c1eb198541cd54125c7efe90 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.5-h1920b20_0.conda#ec8824a45bd7c50a46788fa16216d6c2 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h66e93f0_1.conda#5fef67f50126f40f5966a9451661280d https://conda.anaconda.org/conda-forge/noarch/nox-2025.5.1-pyhe01879c_0.conda#f294cc5e7c84a0422fcc57f33313e084 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a -https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_1.conda#1ca25f3fdf32ebd8a51ee9efa97c9a45 +https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.1-pyhd8ed1ab_0.conda#11b313328806f1dfbab0eb1d219388c4 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py312ha707e6e_0.conda#00b999c5f9d01fb633db819d79186bd4 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.3.1-hd8ed1ab_0.conda#38ca080dff1a30a6fd3aec989062b255 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py312h21f5128_0.conda#d38eb6d34385f82b02ff776a66977cc4 From 287e0f3e5ddfc463820e29ba447dd313501f9387 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 3 Jun 2025 11:43:35 +0100 Subject: [PATCH 461/583] chore: update pre-commit hooks (#656) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/pre-commit/mirrors-mypy: v1.15.0 → v1.16.0](https://github.com/pre-commit/mirrors-mypy/compare/v1.15.0...v1.16.0) - [github.com/astral-sh/ruff-pre-commit: v0.11.11 → v0.11.12](https://github.com/astral-sh/ruff-pre-commit/compare/v0.11.11...v0.11.12) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index aed652b4..8b62cca7 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -65,7 +65,7 @@ repos: additional_dependencies: [tomli] - repo: https://github.com/pre-commit/mirrors-mypy - rev: 'v1.15.0' + rev: 'v1.16.0' hooks: - id: mypy exclude: 'noxfile\.py|docs/conf\.py' @@ -78,7 +78,7 @@ repos: types: [file, python] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.11.11" + rev: "v0.11.12" hooks: - id: ruff types: [file, python] From 3238b2d0a0593ecfc1bc387d8df7889ed797c6cf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 5 Jun 2025 09:39:53 +0100 Subject: [PATCH 462/583] Bump scitools/workflows in the dependencies group (#658) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2025.05.4 to 2025.06.0 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.05.4...2025.06.0) --- updated-dependencies: - dependency-name: scitools/workflows dependency-version: 2025.06.0 dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/ci-template-check.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 7fad4b62..32e348ca 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.05.4 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.06.0 diff --git a/.github/workflows/ci-template-check.yml b/.github/workflows/ci-template-check.yml index e72936de..d459affe 100644 --- a/.github/workflows/ci-template-check.yml +++ b/.github/workflows/ci-template-check.yml @@ -10,7 +10,7 @@ on: jobs: prompt-share: - uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.05.4 + uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.06.0 secrets: inherit with: pr_number: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 4ac9ae18..1e8be4de 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.05.4 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.06.0 secrets: inherit From 88f8ad31aa599b953fe9b24bd4f3bf0b66f1e297 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 10 Jun 2025 11:41:22 +0100 Subject: [PATCH 463/583] chore: update pre-commit hooks (#660) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.11.12 → v0.11.13](https://github.com/astral-sh/ruff-pre-commit/compare/v0.11.12...v0.11.13) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 8b62cca7..3bdd95d0 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -78,7 +78,7 @@ repos: types: [file, python] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.11.12" + rev: "v0.11.13" hooks: - id: ruff types: [file, python] From 6c17a22e9d418719417824d08590dd7c894b31c9 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Tue, 10 Jun 2025 11:53:00 +0100 Subject: [PATCH 464/583] Updated environment lockfiles (#659) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 44 +++++++++++--------------- requirements/locks/py311-linux-64.lock | 44 +++++++++++--------------- requirements/locks/py312-linux-64.lock | 44 +++++++++++--------------- 3 files changed, 57 insertions(+), 75 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index c3be8691..2ac8a8fc 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -10,10 +10,10 @@ https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_2.conda#fbe7d535ff9d3a168c148e07358cd5b1 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda#c151d5eb730e9b7480e6d48c0fc44048 +https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_2.conda#ea8ac52380885ed41c1baa8f1d6d2b93 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be -https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_3.conda#cb98af5db26e3f482bebb80ce9d947d3 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.24-h86f0d12_0.conda#64f0c503da58ec25ebd359e4d990afa8 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 @@ -21,7 +21,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_2.cond https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_2.conda#01de444988ed960031dbe84cf4f9b1fc https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 -https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_1.conda#a76fd702c93cd2dfd89eff30a5fd45a8 +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_2.conda#1cb1c67961f6dd257eae9e9691b341aa https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 @@ -35,15 +35,15 @@ https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62e https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.1-h97f6797_0.conda#5bc18c66111bc94532b0d2df00731c66 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 -https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401 -https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de +https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_3.conda#1c6eecffad553bde44c5238770cfb7da +https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_3.conda#3facafe58f3858eb95527c7d3a3fc578 https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_2.conda#f92e6e0a3c0c0c85561ef61aa59d555d +https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 -https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda#55199e2ae2c3651f6f9b2a447b47bdc9 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.0-hee588c1_0.conda#71888e92098d0f8c41b09a671ad289bc +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.1-hee588c1_0.conda#96a7e36bff29f1d0ddf5b771e0da373a https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_2.conda#9d2072af184b5caa29492bf2344597bb https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 @@ -58,28 +58,27 @@ https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4c https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d -https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 +https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_3.conda#58178ef8ba927229fba6d84abf62c108 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa -https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.124-hb9d3cd8_0.conda#8bc89311041d7fcb510238cf0848ccae https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.conda#3c255be50a506c50765a93a6644f32fe https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda#0a4d0252248ef9a0f88f2ba8b8a08e12 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hf01ce69_5.conda#e79a094918988bb1807462cd42c83962 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba -https://conda.anaconda.org/conda-forge/linux-64/python-3.10.17-hd6af730_0_cpython.conda#7bb89638dae9ce1b8e051d0b721e83c2 +https://conda.anaconda.org/conda-forge/linux-64/python-3.10.18-hd6af730_0_cpython.conda#4ea0c77cdcb0b81813a0436b162d7316 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.0-h9eae976_0.conda#641d2950ff5031073b5c447457a63be6 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.1-h9eae976_0.conda#e12789602c09a875957c1c78ff47cdf6 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.2-pyhd8ed1ab_0.conda#eb9d4263271ca287d2e0cf5a86da2d3a https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f -https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_2.conda#bf502c169c71e3c6ac0d6175addfacc2 +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_3.conda#5d08a0ac29e6a5a984817584775d4131 +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_3.conda#63d24a5dd21c738d706f91569dbd1892 https://conda.anaconda.org/conda-forge/noarch/cachetools-6.0.0-pyhd8ed1ab_0.conda#fbaa04415c58c287b8c2f324bd207186 https://conda.anaconda.org/conda-forge/noarch/certifi-2025.4.26-pyhd8ed1ab_0.conda#c33eeaaa33f45031be34cda513df39b6 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e @@ -104,9 +103,8 @@ https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_ https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py310h3788b33_0.conda#4186d9b4d004b0fe0de6aa62496fb48a https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda#728dbebd0f7a20337218beacffd37916 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.0-h332b0f4_0.conda#d1738cf06503218acee63669029fd8e8 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 -https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h4bc477f_0.conda#14dbe05b929e329dbaa6f2d0aa19466d https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py310h89163eb_1.conda#8ce3f0332fd6de0d737e2911d329523f @@ -123,14 +121,14 @@ https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#4 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py310ha75aee5_2.conda#af6da4542e91edaf59b614ce7e991700 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py310h89163eb_2.conda#fd343408e64cf1e273ab7c710da374db -https://conda.anaconda.org/conda-forge/noarch/setuptools-80.8.0-pyhff2d567_0.conda#ea075e94dc0106c7212128b6a25bbc4c +https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda#755cf22df8693aa0d1aec1c123fa5863 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_1.conda#40d0ed782a8aaa16ef248e68c06c168d -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda#83fc6ae00127671e301c9f44254c31b8 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.0-pyhe01879c_0.conda#2adcd9bb86f656d3d43bf84af59a1faf https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py310ha75aee5_0.conda#1d7a4b9202cdd10d56ecdd7f6c347190 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d @@ -141,7 +139,7 @@ https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h8deb56e_0.cond https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.2-py310h89163eb_0.conda#5ca8ab35287adc83b2d1996e5c2ac14c https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.58.1-py310h89163eb_0.conda#f4f46207c6defa5ea17b0299298ba849 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.58.2-py310h89163eb_0.conda#3af603de53814258a536b268ad2ae5ff https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h2d575fe_101.conda#d1f61f912e1968a8ac9834b62fde008d @@ -149,27 +147,23 @@ https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda#abb32c727da370c481a1c206f5159ce9 -https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda#452b98eafe050ecff932f0ec832dd03f https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-11.2.1-py310h7e6dc6c_0.conda#5645a243d90adb50909b9edc209d84fe https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh8b19718_0.conda#32d0781ace05105cc99af55d36cbec7c -https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.0-h0054346_1.conda#a3547a9c204da804d8ef9c40c7ac0b84 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h0054346_0.conda#78880cde19cf47cbec3025fc81bfe4bc https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.1-pyhe01879c_0.conda#8200884fd84ab8754567d8523b52eaa8 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.2-h0e9735f_0.conda#568ed1300869dca0ba09fb750cda5dbb +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.0-h32cad80_0.conda#a1cdd40fc962e2f7944bc19e01c7e584 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.31.2-pyhd8ed1ab_0.conda#c0600c1b374efa7a1ff444befee108ca -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.7.0-h40b2b14_1.conda#8a77895fb29728b736a1a6c75906ea1a -https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h03adeef_0.conda#b1df5affe904efe82ef890826b68881d https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h0134ee8_117.conda#a979c07e8fc0e3f61c24a65d16cc6fbe https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.6-py310hefbff90_0.conda#b0cea2c364bf65cd19e023040eeab05d https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py310h71d0299_1.conda#e54b1eaeb50ad1767680181a8575a8db -https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be +https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.0-pyhd8ed1ab_0.conda#516d31f063ce7e49ced17f105b63a1f1 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.3.1-pyhd8ed1ab_0.conda#996376098e3648237b3efb0e0ad460c1 https://conda.anaconda.org/conda-forge/noarch/tox-4.26.0-pyhe01879c_0.conda#b98aeac52fc12b0dd61060f2009ac953 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310h3788b33_5.conda#e05b0475166b68c9dc4d7937e0315654 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 46fea7b5..831d9a02 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -10,10 +10,10 @@ https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_2.conda#fbe7d535ff9d3a168c148e07358cd5b1 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda#c151d5eb730e9b7480e6d48c0fc44048 +https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_2.conda#ea8ac52380885ed41c1baa8f1d6d2b93 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be -https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_3.conda#cb98af5db26e3f482bebb80ce9d947d3 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.24-h86f0d12_0.conda#64f0c503da58ec25ebd359e4d990afa8 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 @@ -21,7 +21,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_2.cond https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_2.conda#01de444988ed960031dbe84cf4f9b1fc https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 -https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_1.conda#a76fd702c93cd2dfd89eff30a5fd45a8 +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_2.conda#1cb1c67961f6dd257eae9e9691b341aa https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 @@ -35,15 +35,15 @@ https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62e https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.1-h97f6797_0.conda#5bc18c66111bc94532b0d2df00731c66 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 -https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401 -https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de +https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_3.conda#1c6eecffad553bde44c5238770cfb7da +https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_3.conda#3facafe58f3858eb95527c7d3a3fc578 https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_2.conda#f92e6e0a3c0c0c85561ef61aa59d555d +https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 -https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda#55199e2ae2c3651f6f9b2a447b47bdc9 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.0-hee588c1_0.conda#71888e92098d0f8c41b09a671ad289bc +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.1-hee588c1_0.conda#96a7e36bff29f1d0ddf5b771e0da373a https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_2.conda#9d2072af184b5caa29492bf2344597bb https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 @@ -58,28 +58,27 @@ https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4c https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d -https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 +https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_3.conda#58178ef8ba927229fba6d84abf62c108 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa -https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.124-hb9d3cd8_0.conda#8bc89311041d7fcb510238cf0848ccae https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.conda#3c255be50a506c50765a93a6644f32fe https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda#0a4d0252248ef9a0f88f2ba8b8a08e12 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hf01ce69_5.conda#e79a094918988bb1807462cd42c83962 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba -https://conda.anaconda.org/conda-forge/linux-64/python-3.11.12-h9e4cc4f_0_cpython.conda#b61d4fbf583b8393d9d00ec106ad3658 +https://conda.anaconda.org/conda-forge/linux-64/python-3.11.13-h9e4cc4f_0_cpython.conda#8c399445b6dc73eab839659e6c7b5ad1 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.0-h9eae976_0.conda#641d2950ff5031073b5c447457a63be6 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.1-h9eae976_0.conda#e12789602c09a875957c1c78ff47cdf6 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.2-pyhd8ed1ab_0.conda#eb9d4263271ca287d2e0cf5a86da2d3a https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f -https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hfdbb021_2.conda#d21daab070d76490cb39a8f1d1729d79 +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_3.conda#5d08a0ac29e6a5a984817584775d4131 +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hfdbb021_3.conda#8565f7297b28af62e5de2d968ca32e31 https://conda.anaconda.org/conda-forge/noarch/cachetools-6.0.0-pyhd8ed1ab_0.conda#fbaa04415c58c287b8c2f324bd207186 https://conda.anaconda.org/conda-forge/noarch/certifi-2025.4.26-pyhd8ed1ab_0.conda#c33eeaaa33f45031be34cda513df39b6 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e @@ -104,9 +103,8 @@ https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_ https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py311hd18a35c_0.conda#be34c90cce87090d24da64a7c239ca96 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda#728dbebd0f7a20337218beacffd37916 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.0-h332b0f4_0.conda#d1738cf06503218acee63669029fd8e8 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 -https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h4bc477f_0.conda#14dbe05b929e329dbaa6f2d0aa19466d https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py311h2dc5d0c_1.conda#6565a715337ae279e351d0abd8ffe88a @@ -124,14 +122,14 @@ https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py311h9ecbd0 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py311h2dc5d0c_2.conda#014417753f948da1f70d132b2de573be https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-3.1.0-pyhd8ed1ab_0.conda#5f0f24f8032c2c1bb33f59b75974f5fc -https://conda.anaconda.org/conda-forge/noarch/setuptools-80.8.0-pyhff2d567_0.conda#ea075e94dc0106c7212128b6a25bbc4c +https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda#755cf22df8693aa0d1aec1c123fa5863 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_1.conda#40d0ed782a8aaa16ef248e68c06c168d -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda#83fc6ae00127671e301c9f44254c31b8 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.0-pyhe01879c_0.conda#2adcd9bb86f656d3d43bf84af59a1faf https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py311h9ecbd09_0.conda#51a12678b609f5794985fda8372b1a49 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d @@ -142,7 +140,7 @@ https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311hf29c0ef_0.cond https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.2-py311h2dc5d0c_0.conda#21c1ef48cc2bf485e6d38c5611e91da2 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.58.1-py311h2dc5d0c_0.conda#9af5d6c8703be9bbe200aeae13a5e6ef +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.58.2-py311h2dc5d0c_0.conda#c58ce3ab3833471964d7ee6b83203425 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h2d575fe_101.conda#d1f61f912e1968a8ac9834b62fde008d @@ -150,27 +148,23 @@ https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda#abb32c727da370c481a1c206f5159ce9 -https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda#452b98eafe050ecff932f0ec832dd03f https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-11.2.1-py311h1322bbf_0.conda#4c49bdabd1d4e09386dabc676fb6bd65 https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh8b19718_0.conda#32d0781ace05105cc99af55d36cbec7c -https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.0-h0054346_1.conda#a3547a9c204da804d8ef9c40c7ac0b84 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h0054346_0.conda#78880cde19cf47cbec3025fc81bfe4bc https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.1-pyhe01879c_0.conda#8200884fd84ab8754567d8523b52eaa8 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.2-h0e9735f_0.conda#568ed1300869dca0ba09fb750cda5dbb +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.0-h32cad80_0.conda#a1cdd40fc962e2f7944bc19e01c7e584 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.31.2-pyhd8ed1ab_0.conda#c0600c1b374efa7a1ff444befee108ca -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.5.1-pyhd8ed1ab_0.conda#8f0ef561cd615a17df3256742a3457c4 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 -https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h03adeef_0.conda#b1df5affe904efe82ef890826b68881d https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h0134ee8_117.conda#a979c07e8fc0e3f61c24a65d16cc6fbe https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.6-py311h5d046bc_0.conda#babce4d9841ebfcee64249d98eb4e0d4 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py311h0960b38_1.conda#5e6251fd41d984a9d4fd1fe4b9bdca31 -https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be +https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.0-pyhd8ed1ab_0.conda#516d31f063ce7e49ced17f105b63a1f1 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.3.1-pyhd8ed1ab_0.conda#996376098e3648237b3efb0e0ad460c1 https://conda.anaconda.org/conda-forge/noarch/tox-4.26.0-pyhe01879c_0.conda#b98aeac52fc12b0dd61060f2009ac953 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hd18a35c_5.conda#4e8447ca8558a203ec0577b4730073f3 diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 124f4c0a..b9708d76 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -10,10 +10,10 @@ https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_2.conda#fbe7d535ff9d3a168c148e07358cd5b1 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda#c151d5eb730e9b7480e6d48c0fc44048 +https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_2.conda#ea8ac52380885ed41c1baa8f1d6d2b93 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be -https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda#41b599ed2b02abcfdd84302bff174b23 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_3.conda#cb98af5db26e3f482bebb80ce9d947d3 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.24-h86f0d12_0.conda#64f0c503da58ec25ebd359e4d990afa8 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 @@ -21,7 +21,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_2.cond https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_2.conda#01de444988ed960031dbe84cf4f9b1fc https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 -https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_1.conda#a76fd702c93cd2dfd89eff30a5fd45a8 +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_2.conda#1cb1c67961f6dd257eae9e9691b341aa https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 @@ -35,15 +35,15 @@ https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62e https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.1-h97f6797_0.conda#5bc18c66111bc94532b0d2df00731c66 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 -https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda#9566f0bd264fbd463002e759b8a82401 -https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda#06f70867945ea6a84d35836af780f1de +https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_3.conda#1c6eecffad553bde44c5238770cfb7da +https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_3.conda#3facafe58f3858eb95527c7d3a3fc578 https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_2.conda#f92e6e0a3c0c0c85561ef61aa59d555d +https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 -https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda#55199e2ae2c3651f6f9b2a447b47bdc9 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.0-hee588c1_0.conda#71888e92098d0f8c41b09a671ad289bc +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.1-hee588c1_0.conda#96a7e36bff29f1d0ddf5b771e0da373a https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_2.conda#9d2072af184b5caa29492bf2344597bb https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 @@ -58,28 +58,27 @@ https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4c https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d -https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda#c63b5e52939e795ba8d26e35d767a843 +https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_3.conda#58178ef8ba927229fba6d84abf62c108 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa -https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.124-hb9d3cd8_0.conda#8bc89311041d7fcb510238cf0848ccae https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.conda#3c255be50a506c50765a93a6644f32fe https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda#0a4d0252248ef9a0f88f2ba8b8a08e12 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hf01ce69_5.conda#e79a094918988bb1807462cd42c83962 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba -https://conda.anaconda.org/conda-forge/linux-64/python-3.12.10-h9e4cc4f_0_cpython.conda#a41d26cd4d47092d683915d058380dec +https://conda.anaconda.org/conda-forge/linux-64/python-3.12.11-h9e4cc4f_0_cpython.conda#94206474a5608243a10c92cefbe0908f https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.0-h9eae976_0.conda#641d2950ff5031073b5c447457a63be6 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.1-h9eae976_0.conda#e12789602c09a875957c1c78ff47cdf6 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.2-pyhd8ed1ab_0.conda#eb9d4263271ca287d2e0cf5a86da2d3a https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f -https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda#98514fe74548d768907ce7a13f680e8f -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_2.conda#b0b867af6fc74b2a0aa206da29c0f3cf +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_3.conda#5d08a0ac29e6a5a984817584775d4131 +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_3.conda#a32e0c069f6c3dcac635f7b0b0dac67e https://conda.anaconda.org/conda-forge/noarch/cachetools-6.0.0-pyhd8ed1ab_0.conda#fbaa04415c58c287b8c2f324bd207186 https://conda.anaconda.org/conda-forge/noarch/certifi-2025.4.26-pyhd8ed1ab_0.conda#c33eeaaa33f45031be34cda513df39b6 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e @@ -104,9 +103,8 @@ https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_ https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.8-py312h84d6215_0.conda#6713467dc95509683bfa3aca08524e8a https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda#728dbebd0f7a20337218beacffd37916 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.0-h332b0f4_0.conda#d1738cf06503218acee63669029fd8e8 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 -https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h4bc477f_0.conda#14dbe05b929e329dbaa6f2d0aa19466d https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda#eb227c3e0bf58f5bd69c0532b157975b @@ -124,14 +122,14 @@ https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h178313f_2.conda#cf2485f39740de96e2a7f2bb18ed2fee https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-3.1.0-pyhd8ed1ab_0.conda#5f0f24f8032c2c1bb33f59b75974f5fc -https://conda.anaconda.org/conda-forge/noarch/setuptools-80.8.0-pyhff2d567_0.conda#ea075e94dc0106c7212128b6a25bbc4c +https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda#755cf22df8693aa0d1aec1c123fa5863 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_1.conda#40d0ed782a8aaa16ef248e68c06c168d -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.13.2-pyh29332c3_0.conda#83fc6ae00127671e301c9f44254c31b8 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.0-pyhe01879c_0.conda#2adcd9bb86f656d3d43bf84af59a1faf https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py312h66e93f0_0.conda#617f5d608ff8c28ad546e5d9671cbb95 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d @@ -142,7 +140,7 @@ https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.cond https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.2-py312h178313f_0.conda#141e4480d38281c3988f3a9aa917b07d https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.58.1-py312h178313f_0.conda#59ac6c124428928a1a41691eedf2b3bd +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.58.2-py312h178313f_0.conda#286068e5706fa6eacce413a594cf0d4b https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h2d575fe_101.conda#d1f61f912e1968a8ac9834b62fde008d @@ -150,27 +148,23 @@ https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda#abb32c727da370c481a1c206f5159ce9 -https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda#452b98eafe050ecff932f0ec832dd03f https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-11.2.1-py312h80c1187_0.conda#ca438bf57e4f2423d261987fe423a0dd https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh8b19718_0.conda#32d0781ace05105cc99af55d36cbec7c -https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.0-h0054346_1.conda#a3547a9c204da804d8ef9c40c7ac0b84 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h0054346_0.conda#78880cde19cf47cbec3025fc81bfe4bc https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.1-pyhe01879c_0.conda#8200884fd84ab8754567d8523b52eaa8 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.13.2-h0e9735f_0.conda#568ed1300869dca0ba09fb750cda5dbb +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.0-h32cad80_0.conda#a1cdd40fc962e2f7944bc19e01c7e584 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.31.2-pyhd8ed1ab_0.conda#c0600c1b374efa7a1ff444befee108ca -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda#b5fcc7172d22516e1f965490e65e33a4 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda#5efa5fa6243a622445fdfd72aee15efa https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.5.1-pyhd8ed1ab_0.conda#8f0ef561cd615a17df3256742a3457c4 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 -https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h03adeef_0.conda#b1df5affe904efe82ef890826b68881d https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h0134ee8_117.conda#a979c07e8fc0e3f61c24a65d16cc6fbe https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.6-py312h72c5963_0.conda#17fac9db62daa5c810091c2882b28f45 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py312h03c6e1f_1.conda#f754591f9ec0169e436fa84cb9db0c32 -https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.5-pyhd8ed1ab_0.conda#c3c9316209dec74a705a36797970c6be +https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.0-pyhd8ed1ab_0.conda#516d31f063ce7e49ced17f105b63a1f1 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.3.1-pyhd8ed1ab_0.conda#996376098e3648237b3efb0e0ad460c1 https://conda.anaconda.org/conda-forge/noarch/tox-4.26.0-pyhe01879c_0.conda#b98aeac52fc12b0dd61060f2009ac953 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h68727a3_5.conda#f9664ee31aed96c85b7319ab0a693341 From 4a6b5504ab471c1192d66689dc55d706452648f3 Mon Sep 17 00:00:00 2001 From: Stephen Moseley Date: Tue, 10 Jun 2025 13:53:36 +0100 Subject: [PATCH 465/583] Adds GRIB2 support for Post Processed data found in the wholesale Weather Data Hub and CEDA archive (#647) * Adds more GRIB2 parameters * Adds support for parameter table 5 (simple probabilities) Adds support for more vertical level definitions, including ground level, freezing level and different coordinates for the lower and upper bounds. * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Adds test for pdt5 * Updates some unit tests * removes use of `section.get()` * Fixes broken unit test * Adds tests for other thresholds now supported * Response to review * Bug fix * Review change (for a hidden comment) * Review modifications * Further review modifications * Removes undocumented sleetfall parameter --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- docs/ref/release_notes.rst | 20 ++ src/iris_grib/_grib_cf_map.py | 3 + src/iris_grib/_load_convert.py | 311 +++++++++++++----- .../test_grib1_load_translations.py | 4 +- .../test_product_definition_template_5.py | 128 +++++++ .../test_product_definition_template_9.py | 25 +- .../unit/load_convert/test_vertical_coords.py | 114 ++++++- 7 files changed, 503 insertions(+), 102 deletions(-) create mode 100644 src/iris_grib/tests/unit/load_convert/test_product_definition_template_5.py diff --git a/docs/ref/release_notes.rst b/docs/ref/release_notes.rst index deed099d..9551b598 100644 --- a/docs/ref/release_notes.rst +++ b/docs/ref/release_notes.rst @@ -6,6 +6,26 @@ Release Notes ============= +What's new in iris-grib v0.22.0 +------------------------------- + +:Release: 0.22.0 +:Date: TBC + +Features +^^^^^^^^ +* `@MoseleyS `_ added support for loading GRIB2 data + found in the Met Office wholesale Weather Data Hub and CEDA archive. + `(PR#647) `_ + + +New Contributors +^^^^^^^^^^^^^^^^ +Welcome to + +* `@MoseleyS `_ + + What's new in iris-grib v0.20.0 ------------------------------- diff --git a/src/iris_grib/_grib_cf_map.py b/src/iris_grib/_grib_cf_map.py index bb2714e1..35783573 100644 --- a/src/iris_grib/_grib_cf_map.py +++ b/src/iris_grib/_grib_cf_map.py @@ -76,6 +76,7 @@ G2Param(2, 0, 1, 2): CFName("humidity_mixing_ratio", None, "kg kg-1"), G2Param(2, 0, 1, 3): CFName(None, "precipitable_water", "kg m-2"), G2Param(2, 0, 1, 7): CFName("precipitation_flux", None, "kg m-2 s-1"), + G2Param(2, 0, 1, 8): CFName("lwe_thickness_of_precipitation_amount", None, "m"), G2Param(2, 0, 1, 9): CFName( "stratiform_rainfall_amount", "Large-scale precipitation (non-convective)", @@ -157,6 +158,7 @@ "atmosphere_mass_content_of_cloud_liquid_water", None, "kg m-2" ), G2Param(2, 0, 6, 7): CFName("cloud_area_fraction_in_atmosphere_layer", None, "%"), + G2Param(2, 0, 6, 11): CFName("cloud_base_altitude", None, "m"), G2Param(2, 0, 6, 25): CFName(None, "WAFC_CB_horizontal_extent", "1"), G2Param(2, 0, 6, 26): CFName(None, "WAFC_ICAO_height_at_cloud_base", "m"), G2Param(2, 0, 6, 27): CFName(None, "WAFC_ICAO_height_at_cloud_top", "m"), @@ -166,6 +168,7 @@ G2Param(2, 0, 7, 7): CFName(None, "convective_inhibition", "J kg-1"), G2Param(2, 0, 7, 8): CFName(None, "storm_relative_helicity", "J kg-1"), G2Param(2, 0, 14, 0): CFName("atmosphere_mole_content_of_ozone", None, "Dobson"), + G2Param(2, 0, 19, 0): CFName("visibility_in_air", None, "m"), G2Param(2, 0, 19, 1): CFName(None, "grib_physical_atmosphere_albedo", "%"), G2Param(2, 0, 19, 20): CFName(None, "WAFC_icing_potential", "1"), G2Param(2, 0, 19, 21): CFName(None, "WAFC_in-cloud_turb_potential", "1"), diff --git a/src/iris_grib/_load_convert.py b/src/iris_grib/_load_convert.py index 3d908a58..79ba4e79 100644 --- a/src/iris_grib/_load_convert.py +++ b/src/iris_grib/_load_convert.py @@ -56,7 +56,9 @@ "ResolutionFlags", ["i_increments_given", "j_increments_given", "uv_resolved"] ) -FixedSurface = namedtuple("FixedSurface", ["standard_name", "long_name", "units"]) +FixedSurface = namedtuple( + "FixedSurface", ["standard_name", "long_name", "units", "point"] +) InterpolationParameters = namedtuple( "InterpolationParameters", @@ -90,10 +92,14 @@ # Regulation 92.1.4 _TIME_RANGE_MISSING = 2**32 - 1 -# Reference Code Table 4.5. +# Reference Code Table 4.5. Point values are included where these are part of the fixed +# surface definition. None indicates this comes from the GRIB metadata, +# eg. "scaledValueOfFirstFixedSurface". _FIXED_SURFACE = { - 100: FixedSurface(None, "pressure", "Pa"), # Isobaric surface - 103: FixedSurface(None, "height", "m"), # Height level above ground + 1: FixedSurface(None, "height", "m", 0.0), # Ground or water surface + 4: FixedSurface(None, "air_temperature", "Celsius", 0.0), # Level of 0C isotherm + 100: FixedSurface(None, "pressure", "Pa", None), # Isobaric surface + 103: FixedSurface(None, "height", "m", None), # Height level above ground } _TYPE_OF_FIXED_SURFACE_MISSING = 255 @@ -1724,76 +1730,141 @@ def vertical_coords(section, metadata): hybrid_factories(section, metadata) else: # Generate vertical coordinate. - typeOfFirstFixedSurface = section["typeOfFirstFixedSurface"] + # section is not a true dict and does not support the get method. + try: + typeOfFirstFixedSurface = section["typeOfFirstFixedSurface"] + except KeyError: + typeOfFirstFixedSurface = _TYPE_OF_FIXED_SURFACE_MISSING + try: + typeOfSecondFixedSurface = section["typeOfSecondFixedSurface"] + except KeyError: + typeOfSecondFixedSurface = _TYPE_OF_FIXED_SURFACE_MISSING # We treat fixed surface level type=1 as having no vertical coordinate. # See https://github.com/SciTools/iris/issues/519 - if typeOfFirstFixedSurface not in [_TYPE_OF_FIXED_SURFACE_MISSING, 1]: - key = "scaledValueOfFirstFixedSurface" - scaledValueOfFirstFixedSurface = section[key] - if scaledValueOfFirstFixedSurface == _MDI: - if options.warn_on_unsupported: - msg = ( - "Unable to translate type of first fixed " - "surface with missing scaled value." - ) - warnings.warn(msg) + if typeOfFirstFixedSurface in [ + _TYPE_OF_FIXED_SURFACE_MISSING, + 1, + ] and typeOfSecondFixedSurface in [_TYPE_OF_FIXED_SURFACE_MISSING, 1]: + return + fixed_surface_missing = FixedSurface(None, None, None, None) + fixed_surface_first = _FIXED_SURFACE.get( + typeOfFirstFixedSurface, fixed_surface_missing + ) + if fixed_surface_first.point is not None: + # We have a surface type that includes the point in its definition + lower_bound = fixed_surface_first.point + else: + lower_bound = _get_surface_value(section, "First", warn_only=True) + point = lower_bound + + if typeOfSecondFixedSurface != _TYPE_OF_FIXED_SURFACE_MISSING: + fixed_surface_second = _FIXED_SURFACE.get( + typeOfSecondFixedSurface, fixed_surface_missing + ) + if fixed_surface_second.point is not None: + # We have a surface type that includes the point in its definition + upper_bound = fixed_surface_second.point else: - fixed_surface_missing = FixedSurface(None, None, None) - fixed_surface = _FIXED_SURFACE.get( - typeOfFirstFixedSurface, fixed_surface_missing - ) - key = "scaleFactorOfFirstFixedSurface" - scaleFactorOfFirstFixedSurface = section[key] - typeOfSecondFixedSurface = section["typeOfSecondFixedSurface"] - if typeOfSecondFixedSurface != _TYPE_OF_FIXED_SURFACE_MISSING: - if typeOfFirstFixedSurface != typeOfSecondFixedSurface: - msg = ( - "Product definition section 4 has different " - "types of first and second fixed surface" - ) - raise TranslationError(msg) - key = "scaledValueOfSecondFixedSurface" - scaledValueOfSecondFixedSurface = section[key] - - if scaledValueOfSecondFixedSurface == _MDI: - msg = ( - "Product definition section 4 has missing " - "scaled value of second fixed surface" - ) - raise TranslationError(msg) - else: - key = "scaleFactorOfSecondFixedSurface" - scaleFactorOfSecondFixedSurface = section[key] - first = unscale( - scaledValueOfFirstFixedSurface, - scaleFactorOfFirstFixedSurface, - ) - second = unscale( - scaledValueOfSecondFixedSurface, - scaleFactorOfSecondFixedSurface, - ) - point = 0.5 * (first + second) - bounds = [first, second] - else: - point = unscale( - scaledValueOfFirstFixedSurface, scaleFactorOfFirstFixedSurface - ) - bounds = None - coord = DimCoord( - point, - standard_name=fixed_surface.standard_name, - long_name=fixed_surface.long_name, - units=fixed_surface.units, - bounds=bounds, - ) - if fixed_surface == fixed_surface_missing: - coord.attributes["GRIB_fixed_surface_type"] = ( - typeOfFirstFixedSurface - ) + upper_bound = _get_surface_value(section, "Second") + if upper_bound is not None: + point = 0.5 * (lower_bound + upper_bound) + bounds = [lower_bound, upper_bound] + else: + bounds = None + fixed_surface_second = None + upper_bound = None + if point is None: + return + coords = _build_vertical_coords( + bounds, + fixed_surface_first, + fixed_surface_second, + lower_bound, + point, + upper_bound, + ) + for coord in coords: + # Add the vertical coordinate(s) to metadata aux coords. + if fixed_surface_first == fixed_surface_missing: + coord.attributes["GRIB_fixed_surface_type"] = typeOfFirstFixedSurface + metadata["aux_coords_and_dims"].append((coord, None)) + + +def _build_vertical_coords( + bounds: list[float] | None, + fixed_surface_first: FixedSurface, + fixed_surface_second: FixedSurface | None, + lower_bound: float, + point: float, + upper_bound: float, +) -> list[DimCoord]: + """ + Build the vertical coordinates based on the bounds and fixed surface types. + + If the bounds are not None and the first and second fixed surfaces represent + different quantities, create two coordinates, one for each bound. + Otherwise, create a single coordinate with the point and bounds values. + + Args: + bounds: + List of two floats representing the lower and upper bounds, or None. + fixed_surface_first: + FixedSurface object for the first surface type (lower bound). + fixed_surface_second: + FixedSurface object for the second surface type (upper bound). + lower_bound: + The lower bound value. + point: + The point value to use if bounds are None. + upper_bound: + The upper bound value. - # Add the vertical coordinate to metadata aux coords. - metadata["aux_coords_and_dims"].append((coord, None)) + Returns: + List of Coord objects representing the vertical coordinates. + """ + first_coord_kwargs = fixed_surface_first._asdict() + first_coord_kwargs.pop("point", None) + second_coord_kwargs = fixed_surface_second._asdict() if fixed_surface_second else {} + second_coord_kwargs.pop("point", None) + coords = [] + if bounds and first_coord_kwargs != second_coord_kwargs: + # Create two coords, one for each bound. + first_bounds = np.ma.masked_array(bounds, [False, True]) + coord = AuxCoord(lower_bound, bounds=first_bounds, **first_coord_kwargs) + coords.append(coord) + + second_bounds = np.ma.masked_array(bounds, [True, False]) + coord = AuxCoord(upper_bound, bounds=second_bounds, **second_coord_kwargs) + coords.append(coord) + else: + coord = DimCoord(point, bounds=bounds, **first_coord_kwargs) + coords.append(coord) + return coords + + +def _get_surface_value(section, sub_item, warn_only=False): + key = f"scaledValueOf{sub_item}FixedSurface" + scaledValueOfFixedSurface = section[key] + if scaledValueOfFixedSurface == _MDI: + msg = ( + f"Unable to translate type of {sub_item} fixed " + "surface with missing scaled value." + ) + if warn_only: + if options.warn_on_unsupported: + warnings.warn(msg) + else: + raise TranslationError(msg) + first = None + else: + key = f"scaleFactorOf{sub_item}FixedSurface" + scaleFactorOfFixedSurface = section[key] + first = unscale( + scaledValueOfFixedSurface, + scaleFactorOfFixedSurface, + ) + return first def forecast_period_coord(indicatorOfUnitForForecastTime, forecastTime): @@ -2209,6 +2280,35 @@ def product_definition_template_1(section, metadata, frt_coord): metadata["aux_coords_and_dims"].append((realization, None)) +def product_definition_template_5(section, metadata, frt_coord): + """ + Translate product definition template 5. + + This template represents a probability forecast, + at a horizontal level or in a horizontal layer at a + point in time. + + Updates the metadata in-place with the translations. + + Args: + + * section: + Dictionary of coded key/value pairs from section 4 of the message. + + * metadata: + :class:`collections.OrderedDict` of metadata. + + * frt_coord: + The scalar forecast reference time :class:`iris.coords.DimCoord`. + + """ + # Perform identical message processing. + product_definition_template_0(section, metadata, frt_coord) + + probability_type = _probability_type(section) + return probability_type + + def product_definition_template_6(section, metadata, frt_coord): """ Translate product definition template 6. @@ -2324,36 +2424,61 @@ def product_definition_template_9(section, metadata, frt_coord): # NOTE: we currently don't record the nature of the underlying statistic, # as we don't have an agreed way of representing that in CF. + probability_type = _probability_type(section) + + return probability_type + + +def _probability_type(section): # Return a probability object to control the production of a probability # result. This is done once the underlying phenomenon type is determined, # in 'translate_phenomenon'. probability_typecode = section["probabilityType"] - if probability_typecode == 1: - # Type is "above upper level". - threshold_value = section["scaledValueOfUpperLimit"] - if threshold_value == _MDI: - msg = "Product definition section 4 has missing scaled value of upper limit" - raise TranslationError(msg) - threshold_scaling = section["scaleFactorOfUpperLimit"] - if threshold_scaling == _MDI: - msg = "Product definition section 4 has missing scale factor of upper limit" + # Note that GRIB provides separate "above lower threshold" and "above + # upper threshold" probability types. This naming style doesn't + # recognise that distinction. For now, assume this is not important. + match probability_typecode: + case 0: + # Type is "below lower level". + threshold = _probability_threshold(section, "lower") + probability_type = Probability("below_threshold", threshold) + case 1: + # Type is "above upper level". + threshold = _probability_threshold(section, "upper") + probability_type = Probability("above_threshold", threshold) + case 3: + # Type is "above lower level". + threshold = _probability_threshold(section, "lower") + probability_type = Probability("above_threshold", threshold) + case 4: + # Type is "below upper level". + threshold = _probability_threshold(section, "upper") + probability_type = Probability("below_threshold", threshold) + case _: + msg = ( + "Product definition section 4 contains an unsupported " + "probability type [{}]".format(probability_typecode) + ) raise TranslationError(msg) - # Encode threshold information. - threshold = unscale(threshold_value, threshold_scaling) - probability_type = Probability("above_threshold", threshold) - # Note that GRIB provides separate "above lower threshold" and "above - # upper threshold" probability types. This naming style doesn't - # recognise that distinction. For now, assume this is not important. - else: - msg = ( - "Product definition section 4 contains an unsupported " - "probability type [{}]".format(probability_typecode) - ) - raise TranslationError(msg) - return probability_type +def _probability_threshold(section, limit_type): + """Get the unscaled probability threshold value for the given limit type.""" + value_key = f"scaledValueOf{limit_type.capitalize()}Limit" + scale_key = f"scaleFactorOf{limit_type.capitalize()}Limit" + msg = f"Product definition section 4 has missing {{item}} of {limit_type} limit" + + threshold_value = section[value_key] + if threshold_value == _MDI: + raise TranslationError(msg.format(item="scaled value")) + threshold_scaling = section[scale_key] + if threshold_scaling == _MDI: + raise TranslationError(msg.format(item="scale factor")) + threshold = unscale(threshold_value, threshold_scaling) + return threshold + + def product_definition_template_10(section, metadata, frt_coord): """ Translate product definition template 10. @@ -2631,6 +2756,10 @@ def product_definition_section(section, metadata, discipline, tablesVersion, rt_ # Process individual ensemble forecast, control and perturbed, at # a horizontal level or in a horizontal layer at a point in time. product_definition_template_1(section, metadata, rt_coord) + elif template == 5: + # Process percentile forecast, at a horizontal level or in a horizontal + # layer at a point in time. + probability = product_definition_template_5(section, metadata, rt_coord) elif template == 6: # Process percentile forecast, at a horizontal level or in a horizontal # layer at a point in time. diff --git a/src/iris_grib/tests/unit/grib1_load_rules/test_grib1_load_translations.py b/src/iris_grib/tests/unit/grib1_load_rules/test_grib1_load_translations.py index 78c1bcff..d60802f4 100644 --- a/src/iris_grib/tests/unit/grib1_load_rules/test_grib1_load_translations.py +++ b/src/iris_grib/tests/unit/grib1_load_rules/test_grib1_load_translations.py @@ -287,7 +287,7 @@ def test_warn_unknown_pdts(self): grib_message = eccodes.codes_grib_new_from_samples("GRIB2") # Set the PDT to something unexpected. eccodes.codes_set_long( - grib_message, "productDefinitionTemplateNumber", 5 + grib_message, "productDefinitionTemplateNumber", 99 ) eccodes.codes_write(grib_message, temp_gribfile) @@ -296,7 +296,7 @@ def test_warn_unknown_pdts(self): with self.assertRaises(iris.exceptions.TranslationError) as t_err: _ = next(cube_generator) self.assertEqual( - "Product definition template [5] is not supported", + "Product definition template [99] is not supported", str(t_err.exception), ) diff --git a/src/iris_grib/tests/unit/load_convert/test_product_definition_template_5.py b/src/iris_grib/tests/unit/load_convert/test_product_definition_template_5.py new file mode 100644 index 00000000..1ed4faac --- /dev/null +++ b/src/iris_grib/tests/unit/load_convert/test_product_definition_template_5.py @@ -0,0 +1,128 @@ +# Copyright iris-grib contributors +# +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +""" +Tests for function +:func:`iris_grib._load_convert.product_definition_template_5`. + +""" + +# import iris_grib.tests first so that some things can be initialised +# before importing anything else. +import iris_grib.tests as tests + +from unittest import mock + +from iris.exceptions import TranslationError +from iris.coords import DimCoord + +from iris_grib._load_convert import product_definition_template_5 +from iris_grib._load_convert import Probability, _MDI +from .test_product_definition_template_0 import section_4 + + +class Test(tests.IrisGribTest): + def setUp(self): + # Create patches for called routines + module = "iris_grib._load_convert" + self.patch_pdt0_call = self.patch(module + ".product_definition_template_0") + # Construct dummy call arguments + self.section = section_4() + self.section["probabilityType"] = 1 + self.section["scaledValueOfUpperLimit"] = 53 + self.section["scaleFactorOfUpperLimit"] = 1 + self.frt_coord = DimCoord( + 24, "forecast_reference_time", units="hours since epoch" + ) + self.metadata = { + "cell_methods": [], + "aux_coords_and_dims": [], + } + + def test_basic(self): + result = product_definition_template_5( + self.section, self.metadata, self.frt_coord + ) + # Check expected functions were called. + self.assertEqual( + self.patch_pdt0_call.call_args_list, + [mock.call(self.section, self.metadata, self.frt_coord)], + ) + # Check metadata content (N.B. cell_method has been removed!). + self.assertEqual(self.metadata, {"cell_methods": [], "aux_coords_and_dims": []}) + # Check result. + self.assertEqual(result, Probability("above_threshold", 5.3)) + + def test_below_upper_threshold(self): + self.section["probabilityType"] = 4 + result = product_definition_template_5( + self.section, self.metadata, self.frt_coord + ) + # Check result. + self.assertEqual(result, Probability("below_threshold", 5.3)) + + def test_above_lower_threshold(self): + self.section["probabilityType"] = 3 + self.section["scaledValueOfUpperLimit"] = None + self.section["scaleFactorOfUpperLimit"] = None + self.section["scaledValueOfLowerLimit"] = 53 + self.section["scaleFactorOfLowerLimit"] = 1 + result = product_definition_template_5( + self.section, self.metadata, self.frt_coord + ) + # Check result. + self.assertEqual(result, Probability("above_threshold", 5.3)) + + def test_below_lower_threshold(self): + self.section["probabilityType"] = 0 + self.section["scaledValueOfUpperLimit"] = None + self.section["scaleFactorOfUpperLimit"] = None + self.section["scaledValueOfLowerLimit"] = 53 + self.section["scaleFactorOfLowerLimit"] = 1 + + result = product_definition_template_5( + self.section, self.metadata, self.frt_coord + ) + # Check result. + self.assertEqual(result, Probability("below_threshold", 5.3)) + + def test_fail_bad_probability_type(self): + self.section["probabilityType"] = 17 + with self.assertRaisesRegex(TranslationError, "unsupported probability type"): + product_definition_template_5(self.section, self.metadata, self.frt_coord) + + def test_fail_bad_threshold_value(self): + self.section["scaledValueOfUpperLimit"] = _MDI + with self.assertRaisesRegex( + TranslationError, "missing scaled value of upper limit" + ): + product_definition_template_5(self.section, self.metadata, self.frt_coord) + + def test_fail_bad_threshold_scalefactor(self): + self.section["scaleFactorOfUpperLimit"] = _MDI + with self.assertRaisesRegex( + TranslationError, "missing scale factor of upper limit" + ): + product_definition_template_5(self.section, self.metadata, self.frt_coord) + + def test_fail_bad_lower_threshold_value(self): + self.section["probabilityType"] = 0 + self.section["scaledValueOfLowerLimit"] = _MDI + with self.assertRaisesRegex( + TranslationError, "missing scaled value of lower limit" + ): + product_definition_template_5(self.section, self.metadata, self.frt_coord) + + def test_fail_bad_lower_threshold_scalefactor(self): + self.section["probabilityType"] = 0 + self.section["scaledValueOfLowerLimit"] = 1 + self.section["scaleFactorOfLowerLimit"] = _MDI + with self.assertRaisesRegex( + TranslationError, "missing scale factor of lower limit" + ): + product_definition_template_5(self.section, self.metadata, self.frt_coord) + + +if __name__ == "__main__": + tests.main() diff --git a/src/iris_grib/tests/unit/load_convert/test_product_definition_template_9.py b/src/iris_grib/tests/unit/load_convert/test_product_definition_template_9.py index 626ec6af..8bb47901 100644 --- a/src/iris_grib/tests/unit/load_convert/test_product_definition_template_9.py +++ b/src/iris_grib/tests/unit/load_convert/test_product_definition_template_9.py @@ -57,12 +57,33 @@ def test_fail_bad_probability_type(self): def test_fail_bad_threshold_value(self): self.section["scaledValueOfUpperLimit"] = _MDI - with self.assertRaisesRegex(TranslationError, "missing scaled value"): + with self.assertRaisesRegex( + TranslationError, "missing scaled value of upper limit" + ): product_definition_template_9(self.section, self.metadata, self.frt_coord) def test_fail_bad_threshold_scalefactor(self): self.section["scaleFactorOfUpperLimit"] = _MDI - with self.assertRaisesRegex(TranslationError, "missing scale factor"): + with self.assertRaisesRegex( + TranslationError, "missing scale factor of upper limit" + ): + product_definition_template_9(self.section, self.metadata, self.frt_coord) + + def test_fail_bad_lower_threshold_value(self): + self.section["probabilityType"] = 0 + self.section["scaledValueOfLowerLimit"] = _MDI + with self.assertRaisesRegex( + TranslationError, "missing scaled value of lower limit" + ): + product_definition_template_9(self.section, self.metadata, self.frt_coord) + + def test_fail_bad_lower_threshold_scalefactor(self): + self.section["probabilityType"] = 0 + self.section["scaledValueOfLowerLimit"] = 1 + self.section["scaleFactorOfLowerLimit"] = _MDI + with self.assertRaisesRegex( + TranslationError, "missing scale factor of lower limit" + ): product_definition_template_9(self.section, self.metadata, self.frt_coord) diff --git a/src/iris_grib/tests/unit/load_convert/test_vertical_coords.py b/src/iris_grib/tests/unit/load_convert/test_vertical_coords.py index d619e018..5662a324 100644 --- a/src/iris_grib/tests/unit/load_convert/test_vertical_coords.py +++ b/src/iris_grib/tests/unit/load_convert/test_vertical_coords.py @@ -10,11 +10,12 @@ # import iris_grib.tests first so that some things can be initialised # before importing anything else. import iris_grib.tests as tests +import numpy as np from copy import deepcopy from unittest import mock -from iris.coords import DimCoord +from iris.coords import AuxCoord, DimCoord from iris.exceptions import TranslationError from iris_grib._load_convert import vertical_coords @@ -75,6 +76,71 @@ def test_fixed_surface_type_1(self): # coord" without error or warning. self.assertEqual(metadata, self.metadata) + def test_fixed_surface_type_1_missing_scaled_value(self): + """The missing scaled value is correctly ignored for ground level which + produces no coord + """ + metadata = deepcopy(self.metadata) + section = { + "NV": 0, + "typeOfFirstFixedSurface": 1, + "scaledValueOfFirstFixedSurface": MISSING_LEVEL, + "scaleFactorOfFirstFixedSurface": 0, + "typeOfSecondFixedSurface": 255, + } + vertical_coords(section, metadata) + # No metadata change, as surfaceType=1 translates to "no vertical + # coord" without error or warning. + self.assertEqual(metadata, self.metadata) + + def test_fixed_lower_surface_type_4_missing_scaled_value(self): + """The missing scaled value is correctly ignored for a lower fixed surface that + produces a coord + """ + metadata = deepcopy(self.metadata) + section = { + "NV": 0, + "typeOfFirstFixedSurface": 4, + "scaledValueOfFirstFixedSurface": MISSING_LEVEL, + "scaleFactorOfFirstFixedSurface": 0, + "typeOfSecondFixedSurface": 255, + } + vertical_coords(section, metadata) + coord = DimCoord(0.0, long_name="air_temperature", units="Celsius") + expected = deepcopy(self.metadata) + expected["aux_coords_and_dims"].append((coord, None)) + self.assertEqual(metadata, expected) + + def test_fixed_upper_surface_type_4_missing_scaled_value(self): + """The missing scaled value is correctly ignored for an upper fixed surface that + produces a coord + """ + metadata = deepcopy(self.metadata) + section = { + "NV": 0, + "typeOfSecondFixedSurface": 4, + "scaledValueOfSecondFixedSurface": MISSING_LEVEL, + "scaleFactorOfSecondFixedSurface": 0, + "typeOfFirstFixedSurface": 1, # ground level + } + vertical_coords(section, metadata) + expected = deepcopy(self.metadata) + coord = AuxCoord( + 0.0, + long_name="height", + units="m", + bounds=np.ma.masked_array([0.0, 0.0], [False, True]), + ) + expected["aux_coords_and_dims"].append((coord, None)) + coord = AuxCoord( + 0.0, + long_name="air_temperature", + units="Celsius", + bounds=np.ma.masked_array([0.0, 0.0], [True, False]), + ) + expected["aux_coords_and_dims"].append((coord, None)) + self.assertEqual(metadata, expected) + def test_unknown_first_fixed_surface_with_missing_scaled_value(self): this = "iris_grib._load_convert.options" with mock.patch("warnings.warn") as warn: @@ -163,17 +229,48 @@ def test_height_with_no_second_fixed_surface(self): expected["aux_coords_and_dims"].append((coord, None)) self.assertEqual(metadata, expected) - def test_different_fixed_surfaces(self): + def test_different_fixed_surfaces_same_parameter(self): + metadata = deepcopy(self.metadata) + section = { + "NV": 0, + "typeOfFirstFixedSurface": 103, + "scaledValueOfFirstFixedSurface": 10, + "scaleFactorOfFirstFixedSurface": 1, + "typeOfSecondFixedSurface": 1, + } + vertical_coords(section, metadata) + coord = DimCoord(0.5, long_name="height", units="m", bounds=[1.0, 0.0]) + expected = deepcopy(self.metadata) + expected["aux_coords_and_dims"].append((coord, None)) + self.assertEqual(metadata, expected) + + def test_different_fixed_surfaces_different_parameter(self): + metadata = deepcopy(self.metadata) section = { "NV": 0, "typeOfFirstFixedSurface": 100, "scaledValueOfFirstFixedSurface": 10, "scaleFactorOfFirstFixedSurface": 1, - "typeOfSecondFixedSurface": 0, + "typeOfSecondFixedSurface": 1, } - emsg = "different types of first and second fixed surface" - with self.assertRaisesRegex(TranslationError, emsg): - vertical_coords(section, None) + vertical_coords(section, metadata) + coords = [ + AuxCoord( + 1.0, + long_name="pressure", + units="Pa", + bounds=np.ma.masked_array([1.0, 0.0], [False, True]), + ), + AuxCoord( + 0.0, + long_name="height", + units="m", + bounds=np.ma.masked_array([1.0, 0.0], [True, False]), + ), + ] + expected = deepcopy(self.metadata) + [expected["aux_coords_and_dims"].append((coord, None)) for coord in coords] + self.assertEqual(metadata, expected) def test_same_fixed_surfaces_missing_second_scaled_value(self): section = { @@ -184,7 +281,10 @@ def test_same_fixed_surfaces_missing_second_scaled_value(self): "typeOfSecondFixedSurface": 100, "scaledValueOfSecondFixedSurface": MISSING_LEVEL, } - emsg = "missing scaled value of second fixed surface" + emsg = ( + "Unable to translate type of Second fixed surface with missing scaled " + "value." + ) with self.assertRaisesRegex(TranslationError, emsg): vertical_coords(section, None) From 6713cd848351083b0457b4b940f76e3c180f2f1c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 12 Jun 2025 11:27:56 +0100 Subject: [PATCH 466/583] Bump scitools/workflows in the dependencies group (#661) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2025.06.0 to 2025.06.1 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.06.0...2025.06.1) --- updated-dependencies: - dependency-name: scitools/workflows dependency-version: 2025.06.1 dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/ci-template-check.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 32e348ca..4bfa4427 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.06.0 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.06.1 diff --git a/.github/workflows/ci-template-check.yml b/.github/workflows/ci-template-check.yml index d459affe..8911c1e1 100644 --- a/.github/workflows/ci-template-check.yml +++ b/.github/workflows/ci-template-check.yml @@ -10,7 +10,7 @@ on: jobs: prompt-share: - uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.06.0 + uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.06.1 secrets: inherit with: pr_number: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 1e8be4de..12945b5b 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.06.0 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.06.1 secrets: inherit From 8fd051b51076820e152b82f8d4fa9345fa091721 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 16 Jun 2025 14:24:45 +0100 Subject: [PATCH 467/583] [CI Bot] environment lockfiles auto-update (#664) * Updated environment lockfiles * Don't use np.float as a dtype, since np>=v2.3. --------- Co-authored-by: Lockfile bot Co-authored-by: Patrick Peglar --- requirements/locks/py310-linux-64.lock | 14 +++++++------- requirements/locks/py311-linux-64.lock | 16 ++++++++-------- requirements/locks/py312-linux-64.lock | 16 ++++++++-------- .../tests/unit/message/test_GribMessage.py | 2 +- 4 files changed, 24 insertions(+), 24 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 2ac8a8fc..540b3817 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -1,12 +1,12 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 772ad8ba70e3a81b27d5175440056d367ed81c7a0e27f969360096baf3704a8a +# input_hash: c9c2cc109eb8c116e9db50df49eb69ec6fe34d489a4cff5ff3dd3984e09456f4 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-7_cp310.conda#44e871cba2b162368476a84b8d040b6c https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-hbd8a1cb_0.conda#95db94f75ba080a22eb623590993167b -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h1423503_5.conda#6dc9e1305e7d3129af4ad0dabda30e56 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_2.conda#fbe7d535ff9d3a168c148e07358cd5b1 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d @@ -133,13 +133,13 @@ https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py310ha75aee https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.22.0-pyhd8ed1ab_0.conda#234be740b00b8e41567e5b0ed95aaba9 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h8deb56e_0.conda#1fc24a3196ad5ede2a68148be61894f4 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.2-py310h89163eb_0.conda#5ca8ab35287adc83b2d1996e5c2ac14c +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.9.1-py310h89163eb_0.conda#0acae6de150b85b7f3119ec88558d22a https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.58.2-py310h89163eb_0.conda#3af603de53814258a536b268ad2ae5ff +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.58.4-py310h89163eb_0.conda#723a77ff55b436601008d28acc982547 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h2d575fe_101.conda#d1f61f912e1968a8ac9834b62fde008d @@ -175,7 +175,7 @@ https://conda.anaconda.org/conda-forge/noarch/identify-2.6.12-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.5-h1920b20_0.conda#ec8824a45bd7c50a46788fa16216d6c2 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py310ha75aee5_1.conda#48781b625a5c7701e04d222752cb2f62 https://conda.anaconda.org/conda-forge/noarch/nox-2025.5.1-pyhe01879c_0.conda#f294cc5e7c84a0422fcc57f33313e084 -https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.2.1-pyhd8ed1ab_0.conda#ce978e1b9ed8b8d49164e90a5cdc94cd https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.1-pyhd8ed1ab_0.conda#11b313328806f1dfbab0eb1d219388c4 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.conda#8c29cd33b64b2eb78597fa28b5595c8d https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.3.1-hd8ed1ab_0.conda#38ca080dff1a30a6fd3aec989062b255 @@ -186,7 +186,7 @@ https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.41.0-h5f92351_1.conda# https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.3-py310h68603db_0.conda#50084ca38bf28440e2762966bac143fc https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py310haba2683_102.conda#308cc08b61b28c7e8173bfc30bb158bf https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.2.0-pyha770c72_0.conda#17e487cc8b5507cd3abc09398cf27949 -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda#f6082eae112814f1447b56a5e1f6ed05 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py310h5eaa309_0.conda#ca4d935c1715f95b6e86846ad1675a2b https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py310hf462985_0.conda#93ae40b74b2baea09ddeaa287b09e705 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 831d9a02..636e41ff 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -1,12 +1,12 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 9dc993136ba83630b2cf77ebe8b6bec1414f94919619f57285af507809029885 +# input_hash: 84b15051cf21e4aaa0500a4d04539836bcd04717d1bc6930fd28c616793acc49 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-7_cp311.conda#6320dac78b3b215ceac35858b2cfdb70 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-hbd8a1cb_0.conda#95db94f75ba080a22eb623590993167b -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h1423503_5.conda#6dc9e1305e7d3129af4ad0dabda30e56 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_2.conda#fbe7d535ff9d3a168c148e07358cd5b1 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d @@ -134,13 +134,13 @@ https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py311h9ecbd0 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.22.0-pyhd8ed1ab_0.conda#234be740b00b8e41567e5b0ed95aaba9 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311hf29c0ef_0.conda#55553ecd5328336368db611f350b7039 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.2-py311h2dc5d0c_0.conda#21c1ef48cc2bf485e6d38c5611e91da2 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.9.1-py311h2dc5d0c_0.conda#f524bd18889f169f2fa8dc70df1c53c3 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.58.2-py311h2dc5d0c_0.conda#c58ce3ab3833471964d7ee6b83203425 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.58.4-py311h2dc5d0c_0.conda#dd3ef31d2bf022668f30859d5e11c83e https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h2d575fe_101.conda#d1f61f912e1968a8ac9834b62fde008d @@ -162,7 +162,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.cond https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.5.1-pyhd8ed1ab_0.conda#8f0ef561cd615a17df3256742a3457c4 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h0134ee8_117.conda#a979c07e8fc0e3f61c24a65d16cc6fbe -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.6-py311h5d046bc_0.conda#babce4d9841ebfcee64249d98eb4e0d4 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.0-py311h519dc76_0.conda#002e600fcc82f415bfaad7d05a44c016 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py311h0960b38_1.conda#5e6251fd41d984a9d4fd1fe4b9bdca31 https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.0-pyhd8ed1ab_0.conda#516d31f063ce7e49ced17f105b63a1f1 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.3.1-pyhd8ed1ab_0.conda#996376098e3648237b3efb0e0ad460c1 @@ -175,7 +175,7 @@ https://conda.anaconda.org/conda-forge/noarch/identify-2.6.12-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.5-h1920b20_0.conda#ec8824a45bd7c50a46788fa16216d6c2 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py311h9ecbd09_1.conda#28d6b63784b350a2906dc264ad8c7f2a https://conda.anaconda.org/conda-forge/noarch/nox-2025.5.1-pyhe01879c_0.conda#f294cc5e7c84a0422fcc57f33313e084 -https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.2.1-pyhd8ed1ab_0.conda#ce978e1b9ed8b8d49164e90a5cdc94cd https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.1-pyhd8ed1ab_0.conda#11b313328806f1dfbab0eb1d219388c4 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py311h8f841c2_0.conda#5ec0a1732a05376241e1e4c6d50e0e91 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.3.1-hd8ed1ab_0.conda#38ca080dff1a30a6fd3aec989062b255 @@ -186,7 +186,7 @@ https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.41.0-h5f92351_1.conda# https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.3-py311h2b939e6_0.conda#0d1b7dfe2bbf983cb7907f6cbd6613e6 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py311h8b974bf_102.conda#d748aad3050d26241842b76d56424cf9 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.2.0-pyha770c72_0.conda#17e487cc8b5507cd3abc09398cf27949 -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda#f6082eae112814f1447b56a5e1f6ed05 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py311h7db5c69_0.conda#20ba399d57a2b5de789a5b24341481a1 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py311h9f3472d_0.conda#648bccc358ec5b19dec01a5685f3aeb9 diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index b9708d76..7d314735 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -1,12 +1,12 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 4a0a646844a1b0c20669b9387539ede48623f815c29a2e5e1d2abb77f48a4d05 +# input_hash: 91532b637582431f4f0f4b6b1cc13a5ed67d3de3d47cda643e03c5547b4a5340 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-7_cp312.conda#0dfcdc155cf23812a0c9deada86fb723 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-hbd8a1cb_0.conda#95db94f75ba080a22eb623590993167b -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda#01f8d123c96816249efd255a31ad7712 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h1423503_5.conda#6dc9e1305e7d3129af4ad0dabda30e56 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_2.conda#fbe7d535ff9d3a168c148e07358cd5b1 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d @@ -134,13 +134,13 @@ https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py312h66e93f https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.22.0-pyhd8ed1ab_0.conda#234be740b00b8e41567e5b0ed95aaba9 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda#a861504bbea4161a9170b85d4d2be840 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.8.2-py312h178313f_0.conda#141e4480d38281c3988f3a9aa917b07d +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.9.1-py312h178313f_0.conda#4c18b79fa2a3371557ed3663876e5dcc https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.58.2-py312h178313f_0.conda#286068e5706fa6eacce413a594cf0d4b +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.58.4-py312h178313f_0.conda#223a4616e3db7336569eafefac04ebbf https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h2d575fe_101.conda#d1f61f912e1968a8ac9834b62fde008d @@ -162,7 +162,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.cond https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.5.1-pyhd8ed1ab_0.conda#8f0ef561cd615a17df3256742a3457c4 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h0134ee8_117.conda#a979c07e8fc0e3f61c24a65d16cc6fbe -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.6-py312h72c5963_0.conda#17fac9db62daa5c810091c2882b28f45 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.0-py312h6cf2f7f_0.conda#8b4095ed29d1072f7e4badfbaf9e5851 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py312h03c6e1f_1.conda#f754591f9ec0169e436fa84cb9db0c32 https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.0-pyhd8ed1ab_0.conda#516d31f063ce7e49ced17f105b63a1f1 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.3.1-pyhd8ed1ab_0.conda#996376098e3648237b3efb0e0ad460c1 @@ -175,7 +175,7 @@ https://conda.anaconda.org/conda-forge/noarch/identify-2.6.12-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.5-h1920b20_0.conda#ec8824a45bd7c50a46788fa16216d6c2 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h66e93f0_1.conda#5fef67f50126f40f5966a9451661280d https://conda.anaconda.org/conda-forge/noarch/nox-2025.5.1-pyhe01879c_0.conda#f294cc5e7c84a0422fcc57f33313e084 -https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.1.1-pyhd8ed1ab_0.conda#1e35d8f975bc0e984a19819aa91c440a +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.2.1-pyhd8ed1ab_0.conda#ce978e1b9ed8b8d49164e90a5cdc94cd https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.1-pyhd8ed1ab_0.conda#11b313328806f1dfbab0eb1d219388c4 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py312ha707e6e_0.conda#00b999c5f9d01fb633db819d79186bd4 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.3.1-hd8ed1ab_0.conda#38ca080dff1a30a6fd3aec989062b255 @@ -186,7 +186,7 @@ https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.41.0-h5f92351_1.conda# https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.3-py312hd3ec401_0.conda#2d69618b52d70970c81cc598e4b51118 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py312h3805cb1_102.conda#c1358b48677cfc7095cd664f1f0647a1 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.2.0-pyha770c72_0.conda#17e487cc8b5507cd3abc09398cf27949 -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda#a9b9368f3701a417eac9edbcae7cb737 +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda#f6082eae112814f1447b56a5e1f6ed05 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py312hf9745cd_0.conda#ea213e31805199cb7d0da457b879ceed https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py312hc0a28a1_0.conda#476b0357e207e10d2b7b13ed82156e6d diff --git a/src/iris_grib/tests/unit/message/test_GribMessage.py b/src/iris_grib/tests/unit/message/test_GribMessage.py index ca2248da..82b89cce 100644 --- a/src/iris_grib/tests/unit/message/test_GribMessage.py +++ b/src/iris_grib/tests/unit/message/test_GribMessage.py @@ -199,7 +199,7 @@ def _test(self, scanning_mode): data = message.data self.assertTrue(is_lazy_data(data)) self.assertEqual(data.shape, (3, 4)) - self.assertEqual(data.dtype, np.floating) + self.assertEqual(data.dtype, np.float64) self.assertArrayEqual(as_concrete_data(data), np.arange(12).reshape(3, 4)) def test_regular_mode_0(self): From b035dff19014cd451609ee3e7960df1a343b3308 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 19 Jun 2025 11:53:44 +0100 Subject: [PATCH 468/583] Bump scitools/workflows in the dependencies group (#665) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2025.06.1 to 2025.06.2 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.06.1...2025.06.2) --- updated-dependencies: - dependency-name: scitools/workflows dependency-version: 2025.06.2 dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/ci-template-check.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 4bfa4427..b0a84000 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.06.1 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.06.2 diff --git a/.github/workflows/ci-template-check.yml b/.github/workflows/ci-template-check.yml index 8911c1e1..d0c7f0a1 100644 --- a/.github/workflows/ci-template-check.yml +++ b/.github/workflows/ci-template-check.yml @@ -10,7 +10,7 @@ on: jobs: prompt-share: - uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.06.1 + uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.06.2 secrets: inherit with: pr_number: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 12945b5b..38738d14 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.06.1 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.06.2 secrets: inherit From f196a382aa1750155c691ef4358be2d8d4c0dbcc Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 23 Jun 2025 11:08:19 +0100 Subject: [PATCH 469/583] Updated environment lockfiles (#666) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 32 +++++++++++++------------- requirements/locks/py311-linux-64.lock | 32 +++++++++++++------------- requirements/locks/py312-linux-64.lock | 32 +++++++++++++------------- 3 files changed, 48 insertions(+), 48 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 540b3817..77472cb7 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -5,7 +5,7 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-7_cp310.conda#44e871cba2b162368476a84b8d040b6c https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a -https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-hbd8a1cb_0.conda#95db94f75ba080a22eb623590993167b +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.6.15-hbd8a1cb_0.conda#72525f07d72806e3b639ad4504c30ce5 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h1423503_5.conda#6dc9e1305e7d3129af4ad0dabda30e56 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_2.conda#fbe7d535ff9d3a168c148e07358cd5b1 @@ -22,6 +22,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_2.c https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc +https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_2.conda#1cb1c67961f6dd257eae9e9691b341aa https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 @@ -35,15 +36,15 @@ https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62e https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.1-h97f6797_0.conda#5bc18c66111bc94532b0d2df00731c66 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 +https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.4-h3f801dc_0.conda#01ba04e414e47f95c03d6ddd81fd37be https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_3.conda#1c6eecffad553bde44c5238770cfb7da https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_3.conda#3facafe58f3858eb95527c7d3a3fc578 https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_2.conda#f92e6e0a3c0c0c85561ef61aa59d555d https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 -https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda#55199e2ae2c3651f6f9b2a447b47bdc9 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.1-hee588c1_0.conda#96a7e36bff29f1d0ddf5b771e0da373a +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.49-h943b412_0.conda#37511c874cf3b8d0034c8d24e73c0884 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.1-hee588c1_4.conda#c79ba4d93602695bc60c6960ee59d2b1 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_2.conda#9d2072af184b5caa29492bf2344597bb https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 @@ -62,16 +63,15 @@ https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_3.cond https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.conda#3c255be50a506c50765a93a6644f32fe https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda#0a4d0252248ef9a0f88f2ba8b8a08e12 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_0.conda#323dc8f259224d13078aaf7ce96c3efe https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hf01ce69_5.conda#e79a094918988bb1807462cd42c83962 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/python-3.10.18-hd6af730_0_cpython.conda#4ea0c77cdcb0b81813a0436b162d7316 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.1-h9eae976_0.conda#e12789602c09a875957c1c78ff47cdf6 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.1-h9eae976_4.conda#df06b658f4c6c163dcbeb6ff6befa157 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a @@ -79,8 +79,8 @@ https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.2-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_3.conda#5d08a0ac29e6a5a984817584775d4131 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_3.conda#63d24a5dd21c738d706f91569dbd1892 -https://conda.anaconda.org/conda-forge/noarch/cachetools-6.0.0-pyhd8ed1ab_0.conda#fbaa04415c58c287b8c2f324bd207186 -https://conda.anaconda.org/conda-forge/noarch/certifi-2025.4.26-pyhd8ed1ab_0.conda#c33eeaaa33f45031be34cda513df39b6 +https://conda.anaconda.org/conda-forge/noarch/cachetools-6.1.0-pyhd8ed1ab_0.conda#f84eb05fa7f862602bfaf4dd844bd61b +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.6.15-pyhd8ed1ab_0.conda#781d068df0cc2407d4db0ecfbb29225b https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.2-pyhd8ed1ab_0.conda#40fe4284b8b5835a9073a645139f35af @@ -102,13 +102,13 @@ https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py310h3788b33_0.conda#4186d9b4d004b0fe0de6aa62496fb48a https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda#728dbebd0f7a20337218beacffd37916 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-32_h59b9bed_openblas.conda#2af9f3d5c2e39f417ce040f5a35c40c6 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h4bc477f_0.conda#14dbe05b929e329dbaa6f2d0aa19466d https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py310h89163eb_1.conda#8ce3f0332fd6de0d737e2911d329523f -https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 +https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda#424844562f5d337077b445ec6b1398a7 @@ -146,8 +146,8 @@ https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h2d575fe_101.c https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda#abb32c727da370c481a1c206f5159ce9 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda#452b98eafe050ecff932f0ec832dd03f +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-32_he106b2a_openblas.conda#3d3f9355e52f269cd8bc2c440d8a5263 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-32_h7ac8fdf_openblas.conda#6c3f04ccb6c578138e9f9899da0bd714 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-11.2.1-py310h7e6dc6c_0.conda#5645a243d90adb50909b9edc209d84fe @@ -163,9 +163,9 @@ https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.7.0-h40b2b14_ https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h0134ee8_117.conda#a979c07e8fc0e3f61c24a65d16cc6fbe https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.6-py310hefbff90_0.conda#b0cea2c364bf65cd19e023040eeab05d https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py310h71d0299_1.conda#e54b1eaeb50ad1767680181a8575a8db -https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.0-pyhd8ed1ab_0.conda#516d31f063ce7e49ced17f105b63a1f1 +https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda#a49c2283f24696a7b30367b7346a0144 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.3.1-pyhd8ed1ab_0.conda#996376098e3648237b3efb0e0ad460c1 -https://conda.anaconda.org/conda-forge/noarch/tox-4.26.0-pyhe01879c_0.conda#b98aeac52fc12b0dd61060f2009ac953 +https://conda.anaconda.org/conda-forge/noarch/tox-4.27.0-pyhe01879c_0.conda#54d53e668907a36833f7a5b91c01277c https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310h3788b33_5.conda#e05b0475166b68c9dc4d7937e0315654 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha75aee5_2.conda#f9254b5b0193982416b91edcb4b2676f https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310hf462985_1.conda#c2d5289e6cbcecf2c549e01772fe5274 @@ -180,7 +180,7 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.1-pyhd8ed1ab_0.co https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.conda#8c29cd33b64b2eb78597fa28b5595c8d https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.3.1-hd8ed1ab_0.conda#38ca080dff1a30a6fd3aec989062b255 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py310h247727d_0.conda#78ae955878da938d98aa828413263284 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.4.0-pyhd8ed1ab_0.conda#c1e349028e0052c4eea844e94f773065 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py310hf462985_0.conda#c31938674e4cda43617a4d70f99ffd0c https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.41.0-h5f92351_1.conda#742f52d72194d213d47bd6920b138eec https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.3-py310h68603db_0.conda#50084ca38bf28440e2762966bac143fc diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 636e41ff..46b2b6e2 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -5,7 +5,7 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-7_cp311.conda#6320dac78b3b215ceac35858b2cfdb70 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a -https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-hbd8a1cb_0.conda#95db94f75ba080a22eb623590993167b +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.6.15-hbd8a1cb_0.conda#72525f07d72806e3b639ad4504c30ce5 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h1423503_5.conda#6dc9e1305e7d3129af4ad0dabda30e56 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_2.conda#fbe7d535ff9d3a168c148e07358cd5b1 @@ -22,6 +22,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_2.c https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc +https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_2.conda#1cb1c67961f6dd257eae9e9691b341aa https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 @@ -35,15 +36,15 @@ https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62e https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.1-h97f6797_0.conda#5bc18c66111bc94532b0d2df00731c66 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 +https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.4-h3f801dc_0.conda#01ba04e414e47f95c03d6ddd81fd37be https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_3.conda#1c6eecffad553bde44c5238770cfb7da https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_3.conda#3facafe58f3858eb95527c7d3a3fc578 https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_2.conda#f92e6e0a3c0c0c85561ef61aa59d555d https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 -https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda#55199e2ae2c3651f6f9b2a447b47bdc9 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.1-hee588c1_0.conda#96a7e36bff29f1d0ddf5b771e0da373a +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.49-h943b412_0.conda#37511c874cf3b8d0034c8d24e73c0884 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.1-hee588c1_4.conda#c79ba4d93602695bc60c6960ee59d2b1 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_2.conda#9d2072af184b5caa29492bf2344597bb https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 @@ -62,16 +63,15 @@ https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_3.cond https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.conda#3c255be50a506c50765a93a6644f32fe https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda#0a4d0252248ef9a0f88f2ba8b8a08e12 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_0.conda#323dc8f259224d13078aaf7ce96c3efe https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hf01ce69_5.conda#e79a094918988bb1807462cd42c83962 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/python-3.11.13-h9e4cc4f_0_cpython.conda#8c399445b6dc73eab839659e6c7b5ad1 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.1-h9eae976_0.conda#e12789602c09a875957c1c78ff47cdf6 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.1-h9eae976_4.conda#df06b658f4c6c163dcbeb6ff6befa157 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a @@ -79,8 +79,8 @@ https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.2-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_3.conda#5d08a0ac29e6a5a984817584775d4131 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hfdbb021_3.conda#8565f7297b28af62e5de2d968ca32e31 -https://conda.anaconda.org/conda-forge/noarch/cachetools-6.0.0-pyhd8ed1ab_0.conda#fbaa04415c58c287b8c2f324bd207186 -https://conda.anaconda.org/conda-forge/noarch/certifi-2025.4.26-pyhd8ed1ab_0.conda#c33eeaaa33f45031be34cda513df39b6 +https://conda.anaconda.org/conda-forge/noarch/cachetools-6.1.0-pyhd8ed1ab_0.conda#f84eb05fa7f862602bfaf4dd844bd61b +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.6.15-pyhd8ed1ab_0.conda#781d068df0cc2407d4db0ecfbb29225b https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.2-pyhd8ed1ab_0.conda#40fe4284b8b5835a9073a645139f35af @@ -102,13 +102,13 @@ https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py311hd18a35c_0.conda#be34c90cce87090d24da64a7c239ca96 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda#728dbebd0f7a20337218beacffd37916 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-32_h59b9bed_openblas.conda#2af9f3d5c2e39f417ce040f5a35c40c6 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h4bc477f_0.conda#14dbe05b929e329dbaa6f2d0aa19466d https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py311h2dc5d0c_1.conda#6565a715337ae279e351d0abd8ffe88a -https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 +https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda#424844562f5d337077b445ec6b1398a7 @@ -147,8 +147,8 @@ https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h2d575fe_101.c https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda#abb32c727da370c481a1c206f5159ce9 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda#452b98eafe050ecff932f0ec832dd03f +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-32_he106b2a_openblas.conda#3d3f9355e52f269cd8bc2c440d8a5263 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-32_h7ac8fdf_openblas.conda#6c3f04ccb6c578138e9f9899da0bd714 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-11.2.1-py311h1322bbf_0.conda#4c49bdabd1d4e09386dabc676fb6bd65 @@ -164,9 +164,9 @@ https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda# https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h0134ee8_117.conda#a979c07e8fc0e3f61c24a65d16cc6fbe https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.0-py311h519dc76_0.conda#002e600fcc82f415bfaad7d05a44c016 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py311h0960b38_1.conda#5e6251fd41d984a9d4fd1fe4b9bdca31 -https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.0-pyhd8ed1ab_0.conda#516d31f063ce7e49ced17f105b63a1f1 +https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda#a49c2283f24696a7b30367b7346a0144 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.3.1-pyhd8ed1ab_0.conda#996376098e3648237b3efb0e0ad460c1 -https://conda.anaconda.org/conda-forge/noarch/tox-4.26.0-pyhe01879c_0.conda#b98aeac52fc12b0dd61060f2009ac953 +https://conda.anaconda.org/conda-forge/noarch/tox-4.27.0-pyhe01879c_0.conda#54d53e668907a36833f7a5b91c01277c https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hd18a35c_5.conda#4e8447ca8558a203ec0577b4730073f3 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311h9ecbd09_2.conda#ca02de88df1cc3cfc8f24766ff50cb3c https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h9f3472d_1.conda#2c3c4f115d28ed9e001a271d5d8585aa @@ -180,7 +180,7 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.1-pyhd8ed1ab_0.co https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py311h8f841c2_0.conda#5ec0a1732a05376241e1e4c6d50e0e91 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.3.1-hd8ed1ab_0.conda#38ca080dff1a30a6fd3aec989062b255 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py311h3dc67b8_0.conda#ea7501cf4d40188cc662b29bcc07f13b -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.4.0-pyhd8ed1ab_0.conda#c1e349028e0052c4eea844e94f773065 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py311h9f3472d_0.conda#555b148cafbd96b658499060d5e11a65 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.41.0-h5f92351_1.conda#742f52d72194d213d47bd6920b138eec https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.3-py311h2b939e6_0.conda#0d1b7dfe2bbf983cb7907f6cbd6613e6 diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 7d314735..0b78fb27 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -5,7 +5,7 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-7_cp312.conda#0dfcdc155cf23812a0c9deada86fb723 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a -https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-hbd8a1cb_0.conda#95db94f75ba080a22eb623590993167b +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.6.15-hbd8a1cb_0.conda#72525f07d72806e3b639ad4504c30ce5 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h1423503_5.conda#6dc9e1305e7d3129af4ad0dabda30e56 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_2.conda#fbe7d535ff9d3a168c148e07358cd5b1 @@ -22,6 +22,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_2.c https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc +https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_2.conda#1cb1c67961f6dd257eae9e9691b341aa https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 @@ -35,15 +36,15 @@ https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62e https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.1-h97f6797_0.conda#5bc18c66111bc94532b0d2df00731c66 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 +https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.4-h3f801dc_0.conda#01ba04e414e47f95c03d6ddd81fd37be https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_3.conda#1c6eecffad553bde44c5238770cfb7da https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_3.conda#3facafe58f3858eb95527c7d3a3fc578 https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_2.conda#f92e6e0a3c0c0c85561ef61aa59d555d https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 -https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda#55199e2ae2c3651f6f9b2a447b47bdc9 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.1-hee588c1_0.conda#96a7e36bff29f1d0ddf5b771e0da373a +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.49-h943b412_0.conda#37511c874cf3b8d0034c8d24e73c0884 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.1-hee588c1_4.conda#c79ba4d93602695bc60c6960ee59d2b1 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_2.conda#9d2072af184b5caa29492bf2344597bb https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 @@ -62,16 +63,15 @@ https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_3.cond https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.conda#3c255be50a506c50765a93a6644f32fe https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.29-pthreads_h94d23a6_0.conda#0a4d0252248ef9a0f88f2ba8b8a08e12 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_0.conda#323dc8f259224d13078aaf7ce96c3efe https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hf01ce69_5.conda#e79a094918988bb1807462cd42c83962 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/python-3.12.11-h9e4cc4f_0_cpython.conda#94206474a5608243a10c92cefbe0908f https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.1-h9eae976_0.conda#e12789602c09a875957c1c78ff47cdf6 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.1-h9eae976_4.conda#df06b658f4c6c163dcbeb6ff6befa157 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a @@ -79,8 +79,8 @@ https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.2-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_3.conda#5d08a0ac29e6a5a984817584775d4131 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_3.conda#a32e0c069f6c3dcac635f7b0b0dac67e -https://conda.anaconda.org/conda-forge/noarch/cachetools-6.0.0-pyhd8ed1ab_0.conda#fbaa04415c58c287b8c2f324bd207186 -https://conda.anaconda.org/conda-forge/noarch/certifi-2025.4.26-pyhd8ed1ab_0.conda#c33eeaaa33f45031be34cda513df39b6 +https://conda.anaconda.org/conda-forge/noarch/cachetools-6.1.0-pyhd8ed1ab_0.conda#f84eb05fa7f862602bfaf4dd844bd61b +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.6.15-pyhd8ed1ab_0.conda#781d068df0cc2407d4db0ecfbb29225b https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.2-pyhd8ed1ab_0.conda#40fe4284b8b5835a9073a645139f35af @@ -102,13 +102,13 @@ https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.8-py312h84d6215_0.conda#6713467dc95509683bfa3aca08524e8a https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-31_h59b9bed_openblas.conda#728dbebd0f7a20337218beacffd37916 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-32_h59b9bed_openblas.conda#2af9f3d5c2e39f417ce040f5a35c40c6 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h4bc477f_0.conda#14dbe05b929e329dbaa6f2d0aa19466d https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda#eb227c3e0bf58f5bd69c0532b157975b -https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 +https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda#424844562f5d337077b445ec6b1398a7 @@ -147,8 +147,8 @@ https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h2d575fe_101.c https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-31_he106b2a_openblas.conda#abb32c727da370c481a1c206f5159ce9 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-31_h7ac8fdf_openblas.conda#452b98eafe050ecff932f0ec832dd03f +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-32_he106b2a_openblas.conda#3d3f9355e52f269cd8bc2c440d8a5263 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-32_h7ac8fdf_openblas.conda#6c3f04ccb6c578138e9f9899da0bd714 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-11.2.1-py312h80c1187_0.conda#ca438bf57e4f2423d261987fe423a0dd @@ -164,9 +164,9 @@ https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda# https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h0134ee8_117.conda#a979c07e8fc0e3f61c24a65d16cc6fbe https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.0-py312h6cf2f7f_0.conda#8b4095ed29d1072f7e4badfbaf9e5851 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py312h03c6e1f_1.conda#f754591f9ec0169e436fa84cb9db0c32 -https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.0-pyhd8ed1ab_0.conda#516d31f063ce7e49ced17f105b63a1f1 +https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda#a49c2283f24696a7b30367b7346a0144 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.3.1-pyhd8ed1ab_0.conda#996376098e3648237b3efb0e0ad460c1 -https://conda.anaconda.org/conda-forge/noarch/tox-4.26.0-pyhe01879c_0.conda#b98aeac52fc12b0dd61060f2009ac953 +https://conda.anaconda.org/conda-forge/noarch/tox-4.27.0-pyhe01879c_0.conda#54d53e668907a36833f7a5b91c01277c https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h68727a3_5.conda#f9664ee31aed96c85b7319ab0a693341 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312h66e93f0_2.conda#630db208bc7bbb96725ce9832c7423bb https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312hc0a28a1_1.conda#990033147b0a998e756eaaed6b28f48d @@ -180,7 +180,7 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.1-pyhd8ed1ab_0.co https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py312ha707e6e_0.conda#00b999c5f9d01fb633db819d79186bd4 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.3.1-hd8ed1ab_0.conda#38ca080dff1a30a6fd3aec989062b255 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py312h21f5128_0.conda#d38eb6d34385f82b02ff776a66977cc4 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.4.0-pyhd8ed1ab_0.conda#c1e349028e0052c4eea844e94f773065 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py312hc0a28a1_0.conda#8b5b812d4c18cb37bda7a7c8d3a6acb3 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.41.0-h5f92351_1.conda#742f52d72194d213d47bd6920b138eec https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.3-py312hd3ec401_0.conda#2d69618b52d70970c81cc598e4b51118 From 96405f172c28153a7c9f953ec067be3d13235f8c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 Jun 2025 09:43:54 +0100 Subject: [PATCH 470/583] Bump scitools/workflows in the dependencies group (#668) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2025.06.2 to 2025.06.3 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.06.2...2025.06.3) --- updated-dependencies: - dependency-name: scitools/workflows dependency-version: 2025.06.3 dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/ci-template-check.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index b0a84000..10ae22a3 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.06.2 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.06.3 diff --git a/.github/workflows/ci-template-check.yml b/.github/workflows/ci-template-check.yml index d0c7f0a1..6cf99bd3 100644 --- a/.github/workflows/ci-template-check.yml +++ b/.github/workflows/ci-template-check.yml @@ -10,7 +10,7 @@ on: jobs: prompt-share: - uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.06.2 + uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.06.3 secrets: inherit with: pr_number: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 38738d14..dafa9d37 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.06.2 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.06.3 secrets: inherit From 5534d844ca50e7bcf97fa0987e932cccd6d08dc1 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 30 Jun 2025 10:20:07 +0100 Subject: [PATCH 471/583] Updated environment lockfiles (#669) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 20 ++++++++++---------- requirements/locks/py311-linux-64.lock | 20 ++++++++++---------- requirements/locks/py312-linux-64.lock | 20 ++++++++++---------- 3 files changed, 30 insertions(+), 30 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 77472cb7..0d44088c 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -8,22 +8,22 @@ https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222 https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.6.15-hbd8a1cb_0.conda#72525f07d72806e3b639ad4504c30ce5 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h1423503_5.conda#6dc9e1305e7d3129af4ad0dabda30e56 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_2.conda#fbe7d535ff9d3a168c148e07358cd5b1 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_3.conda#3cd1a7238a0dd3d0860fdefc496cc854 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_2.conda#ea8ac52380885ed41c1baa8f1d6d2b93 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_3.conda#9e60c55e725c20d23125a5f0dd69af5d https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_3.conda#cb98af5db26e3f482bebb80ce9d947d3 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.24-h86f0d12_0.conda#64f0c503da58ec25ebd359e4d990afa8 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_2.conda#ddca86c7040dd0e73b2b69bd7833d225 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_2.conda#01de444988ed960031dbe84cf4f9b1fc +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_3.conda#e66f2b8ad787e7beb0f846e4bd7e8493 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_3.conda#530566b68c3b8ce7eec4cd047eae19fe https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_2.conda#1cb1c67961f6dd257eae9e9691b341aa +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_3.conda#6d11a5edae89fe413c0569f16d308f5a https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 @@ -41,12 +41,12 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_3.co https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_3.conda#3facafe58f3858eb95527c7d3a3fc578 https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_2.conda#f92e6e0a3c0c0c85561ef61aa59d555d +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_3.conda#bfbca721fd33188ef923dfe9ba172f29 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.49-h943b412_0.conda#37511c874cf3b8d0034c8d24e73c0884 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.1-hee588c1_4.conda#c79ba4d93602695bc60c6960ee59d2b1 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.1-h6cd9bfd_7.conda#c7c4888059a8324e52de475d1e7bdc53 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_2.conda#9d2072af184b5caa29492bf2344597bb +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_3.conda#57541755b5a51691955012b8e197c06c https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 @@ -71,7 +71,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hf01ce69_5.conda#e https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/python-3.10.18-hd6af730_0_cpython.conda#4ea0c77cdcb0b81813a0436b162d7316 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.1-h9eae976_4.conda#df06b658f4c6c163dcbeb6ff6befa157 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.1-hb7a22d2_7.conda#1964294875a699fa6ad43c7c3058e280 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a @@ -114,7 +114,7 @@ https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda# https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda#424844562f5d337077b445ec6b1398a7 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef -https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda#232fb4577b6687b2d503ef8e254270c9 +https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_1.conda#856b387c270e9eaf6e41e978057a2b62 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 46b2b6e2..c8a6f830 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -8,22 +8,22 @@ https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222 https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.6.15-hbd8a1cb_0.conda#72525f07d72806e3b639ad4504c30ce5 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h1423503_5.conda#6dc9e1305e7d3129af4ad0dabda30e56 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_2.conda#fbe7d535ff9d3a168c148e07358cd5b1 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_3.conda#3cd1a7238a0dd3d0860fdefc496cc854 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_2.conda#ea8ac52380885ed41c1baa8f1d6d2b93 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_3.conda#9e60c55e725c20d23125a5f0dd69af5d https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_3.conda#cb98af5db26e3f482bebb80ce9d947d3 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.24-h86f0d12_0.conda#64f0c503da58ec25ebd359e4d990afa8 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_2.conda#ddca86c7040dd0e73b2b69bd7833d225 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_2.conda#01de444988ed960031dbe84cf4f9b1fc +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_3.conda#e66f2b8ad787e7beb0f846e4bd7e8493 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_3.conda#530566b68c3b8ce7eec4cd047eae19fe https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_2.conda#1cb1c67961f6dd257eae9e9691b341aa +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_3.conda#6d11a5edae89fe413c0569f16d308f5a https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 @@ -41,12 +41,12 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_3.co https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_3.conda#3facafe58f3858eb95527c7d3a3fc578 https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_2.conda#f92e6e0a3c0c0c85561ef61aa59d555d +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_3.conda#bfbca721fd33188ef923dfe9ba172f29 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.49-h943b412_0.conda#37511c874cf3b8d0034c8d24e73c0884 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.1-hee588c1_4.conda#c79ba4d93602695bc60c6960ee59d2b1 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.1-h6cd9bfd_7.conda#c7c4888059a8324e52de475d1e7bdc53 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_2.conda#9d2072af184b5caa29492bf2344597bb +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_3.conda#57541755b5a51691955012b8e197c06c https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 @@ -71,7 +71,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hf01ce69_5.conda#e https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/python-3.11.13-h9e4cc4f_0_cpython.conda#8c399445b6dc73eab839659e6c7b5ad1 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.1-h9eae976_4.conda#df06b658f4c6c163dcbeb6ff6befa157 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.1-hb7a22d2_7.conda#1964294875a699fa6ad43c7c3058e280 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a @@ -114,7 +114,7 @@ https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda# https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda#424844562f5d337077b445ec6b1398a7 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef -https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda#232fb4577b6687b2d503ef8e254270c9 +https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_1.conda#856b387c270e9eaf6e41e978057a2b62 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 0b78fb27..61043402 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -8,22 +8,22 @@ https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222 https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.6.15-hbd8a1cb_0.conda#72525f07d72806e3b639ad4504c30ce5 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h1423503_5.conda#6dc9e1305e7d3129af4ad0dabda30e56 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_2.conda#fbe7d535ff9d3a168c148e07358cd5b1 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_3.conda#3cd1a7238a0dd3d0860fdefc496cc854 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_2.conda#ea8ac52380885ed41c1baa8f1d6d2b93 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_3.conda#9e60c55e725c20d23125a5f0dd69af5d https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_3.conda#cb98af5db26e3f482bebb80ce9d947d3 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.24-h86f0d12_0.conda#64f0c503da58ec25ebd359e4d990afa8 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_2.conda#ddca86c7040dd0e73b2b69bd7833d225 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_2.conda#01de444988ed960031dbe84cf4f9b1fc +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_3.conda#e66f2b8ad787e7beb0f846e4bd7e8493 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_3.conda#530566b68c3b8ce7eec4cd047eae19fe https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_2.conda#1cb1c67961f6dd257eae9e9691b341aa +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_3.conda#6d11a5edae89fe413c0569f16d308f5a https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 @@ -41,12 +41,12 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_3.co https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_3.conda#3facafe58f3858eb95527c7d3a3fc578 https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_2.conda#f92e6e0a3c0c0c85561ef61aa59d555d +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_3.conda#bfbca721fd33188ef923dfe9ba172f29 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.49-h943b412_0.conda#37511c874cf3b8d0034c8d24e73c0884 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.1-hee588c1_4.conda#c79ba4d93602695bc60c6960ee59d2b1 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.1-h6cd9bfd_7.conda#c7c4888059a8324e52de475d1e7bdc53 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_2.conda#9d2072af184b5caa29492bf2344597bb +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_3.conda#57541755b5a51691955012b8e197c06c https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 @@ -71,7 +71,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hf01ce69_5.conda#e https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/python-3.12.11-h9e4cc4f_0_cpython.conda#94206474a5608243a10c92cefbe0908f https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.1-h9eae976_4.conda#df06b658f4c6c163dcbeb6ff6befa157 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.1-hb7a22d2_7.conda#1964294875a699fa6ad43c7c3058e280 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a @@ -114,7 +114,7 @@ https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda# https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda#424844562f5d337077b445ec6b1398a7 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef -https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda#232fb4577b6687b2d503ef8e254270c9 +https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_1.conda#856b387c270e9eaf6e41e978057a2b62 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac From 971c45e35c85df7a2137c91d786a2f0a91f5f0b6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Jul 2025 09:23:29 +0100 Subject: [PATCH 472/583] Bump scitools/workflows in the dependencies group (#670) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2025.06.3 to 2025.06.4 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.06.3...2025.06.4) --- updated-dependencies: - dependency-name: scitools/workflows dependency-version: 2025.06.4 dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/ci-template-check.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 10ae22a3..fe1f3837 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.06.3 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.06.4 diff --git a/.github/workflows/ci-template-check.yml b/.github/workflows/ci-template-check.yml index 6cf99bd3..0624c30b 100644 --- a/.github/workflows/ci-template-check.yml +++ b/.github/workflows/ci-template-check.yml @@ -10,7 +10,7 @@ on: jobs: prompt-share: - uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.06.3 + uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.06.4 secrets: inherit with: pr_number: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index dafa9d37..39784e9c 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.06.3 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.06.4 secrets: inherit From 45e24db8859153b9834df3936269eb719318d7da Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 7 Jul 2025 09:24:50 +0100 Subject: [PATCH 473/583] Updated environment lockfiles (#671) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 26 +++++++++++----------- requirements/locks/py311-linux-64.lock | 30 +++++++++++++------------- requirements/locks/py312-linux-64.lock | 30 +++++++++++++------------- 3 files changed, 43 insertions(+), 43 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 0d44088c..49c33bb0 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -6,7 +6,7 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.ta https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-7_cp310.conda#44e871cba2b162368476a84b8d040b6c https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.6.15-hbd8a1cb_0.conda#72525f07d72806e3b639ad4504c30ce5 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h1423503_5.conda#6dc9e1305e7d3129af4ad0dabda30e56 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_0.conda#e31316a586cac398b1fcdb10ace786b9 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_3.conda#3cd1a7238a0dd3d0860fdefc496cc854 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d @@ -27,7 +27,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_3.cond https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_1.conda#de356753cfdbffcde5bb1e86e3aa6cd0 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.1-h7b32b05_0.conda#c87df2ab1448ba69169652ab9547082d https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 @@ -43,8 +43,8 @@ https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_3.conda#bfbca721fd33188ef923dfe9ba172f29 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.49-h943b412_0.conda#37511c874cf3b8d0034c8d24e73c0884 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.1-h6cd9bfd_7.conda#c7c4888059a8324e52de475d1e7bdc53 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.50-h943b412_0.conda#51de14db340a848869e69c632b43cca7 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.2-h6cd9bfd_0.conda#b04c7eda6d7dab1e6503135e7fad4d25 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_3.conda#57541755b5a51691955012b8e197c06c https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 @@ -71,7 +71,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hf01ce69_5.conda#e https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/python-3.10.18-hd6af730_0_cpython.conda#4ea0c77cdcb0b81813a0436b162d7316 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.1-hb7a22d2_7.conda#1964294875a699fa6ad43c7c3058e280 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.2-hb7a22d2_0.conda#efe16ab2f63053af723e070f3f9bac4c https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a @@ -100,7 +100,7 @@ https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de -https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py310h3788b33_0.conda#4186d9b4d004b0fe0de6aa62496fb48a +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.8-py310h3788b33_1.conda#b70dd76da5231e6073fd44c42a1d78c5 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-32_h59b9bed_openblas.conda#2af9f3d5c2e39f417ce040f5a35c40c6 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 @@ -128,7 +128,7 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_1.conda#40d0ed782a8aaa16ef248e68c06c168d -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.0-pyhe01879c_0.conda#2adcd9bb86f656d3d43bf84af59a1faf +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda#e523f4f1e980ed7a4240d7e27e9ec81f https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py310ha75aee5_0.conda#1d7a4b9202cdd10d56ecdd7f6c347190 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d @@ -136,10 +136,10 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0. https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h8deb56e_0.conda#1fc24a3196ad5ede2a68148be61894f4 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.9.1-py310h89163eb_0.conda#0acae6de150b85b7f3119ec88558d22a +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.9.2-py310h89163eb_0.conda#f02d32dc5b0547e137f871a33e032842 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.58.4-py310h89163eb_0.conda#723a77ff55b436601008d28acc982547 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.58.5-py310h89163eb_0.conda#f84b125a5ba0e319936be9aba48276ff https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h2d575fe_101.conda#d1f61f912e1968a8ac9834b62fde008d @@ -150,12 +150,12 @@ https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-32_he106b2a_openb https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-32_h7ac8fdf_openblas.conda#6c3f04ccb6c578138e9f9899da0bd714 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/linux-64/pillow-11.2.1-py310h7e6dc6c_0.conda#5645a243d90adb50909b9edc209d84fe +https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py310h7e6dc6c_0.conda#e609995f031bc848be8ea159865e8afc https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh8b19718_0.conda#32d0781ace05105cc99af55d36cbec7c https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h0054346_0.conda#78880cde19cf47cbec3025fc81bfe4bc https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.1-pyhe01879c_0.conda#8200884fd84ab8754567d8523b52eaa8 -https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.0-h32cad80_0.conda#a1cdd40fc962e2f7944bc19e01c7e584 +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda#75be1a943e0a7f99fcf118309092c635 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.31.2-pyhd8ed1ab_0.conda#c0600c1b374efa7a1ff444befee108ca https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 @@ -182,7 +182,7 @@ https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.3.1-hd8ed1ab_0.co https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py310h247727d_0.conda#78ae955878da938d98aa828413263284 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py310hf462985_0.conda#c31938674e4cda43617a4d70f99ffd0c -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.41.0-h5f92351_1.conda#742f52d72194d213d47bd6920b138eec +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.42.0-h5f92351_0.conda#9862a9cd17ade6d0e72b4c0a10123cf2 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.3-py310h68603db_0.conda#50084ca38bf28440e2762966bac143fc https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py310haba2683_102.conda#308cc08b61b28c7e8173bfc30bb158bf https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.2.0-pyha770c72_0.conda#17e487cc8b5507cd3abc09398cf27949 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index c8a6f830..52b760ab 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -6,7 +6,7 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.ta https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-7_cp311.conda#6320dac78b3b215ceac35858b2cfdb70 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.6.15-hbd8a1cb_0.conda#72525f07d72806e3b639ad4504c30ce5 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h1423503_5.conda#6dc9e1305e7d3129af4ad0dabda30e56 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_0.conda#e31316a586cac398b1fcdb10ace786b9 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_3.conda#3cd1a7238a0dd3d0860fdefc496cc854 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d @@ -27,7 +27,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_3.cond https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_1.conda#de356753cfdbffcde5bb1e86e3aa6cd0 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.1-h7b32b05_0.conda#c87df2ab1448ba69169652ab9547082d https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 @@ -43,8 +43,8 @@ https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_3.conda#bfbca721fd33188ef923dfe9ba172f29 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.49-h943b412_0.conda#37511c874cf3b8d0034c8d24e73c0884 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.1-h6cd9bfd_7.conda#c7c4888059a8324e52de475d1e7bdc53 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.50-h943b412_0.conda#51de14db340a848869e69c632b43cca7 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.2-h6cd9bfd_0.conda#b04c7eda6d7dab1e6503135e7fad4d25 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_3.conda#57541755b5a51691955012b8e197c06c https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 @@ -71,7 +71,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hf01ce69_5.conda#e https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/python-3.11.13-h9e4cc4f_0_cpython.conda#8c399445b6dc73eab839659e6c7b5ad1 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.1-hb7a22d2_7.conda#1964294875a699fa6ad43c7c3058e280 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.2-hb7a22d2_0.conda#efe16ab2f63053af723e070f3f9bac4c https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a @@ -100,7 +100,7 @@ https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de -https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py311hd18a35c_0.conda#be34c90cce87090d24da64a7c239ca96 +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.8-py311hd18a35c_1.conda#bb17b97b0c0d86e052134bf21af5c03d https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-32_h59b9bed_openblas.conda#2af9f3d5c2e39f417ce040f5a35c40c6 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 @@ -129,7 +129,7 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_1.conda#40d0ed782a8aaa16ef248e68c06c168d -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.0-pyhe01879c_0.conda#2adcd9bb86f656d3d43bf84af59a1faf +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda#e523f4f1e980ed7a4240d7e27e9ec81f https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py311h9ecbd09_0.conda#51a12678b609f5794985fda8372b1a49 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d @@ -137,10 +137,10 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0. https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311hf29c0ef_0.conda#55553ecd5328336368db611f350b7039 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.9.1-py311h2dc5d0c_0.conda#f524bd18889f169f2fa8dc70df1c53c3 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.9.2-py311h2dc5d0c_0.conda#4a4d2bb7e4d14efb7320206a57467029 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.58.4-py311h2dc5d0c_0.conda#dd3ef31d2bf022668f30859d5e11c83e +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.58.5-py311h2dc5d0c_0.conda#13ca35ec6ae88e9c2c71cef129ac73f2 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h2d575fe_101.conda#d1f61f912e1968a8ac9834b62fde008d @@ -151,18 +151,18 @@ https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-32_he106b2a_openb https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-32_h7ac8fdf_openblas.conda#6c3f04ccb6c578138e9f9899da0bd714 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/linux-64/pillow-11.2.1-py311h1322bbf_0.conda#4c49bdabd1d4e09386dabc676fb6bd65 +https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py311h1322bbf_0.conda#8b4568b1357f5ec5494e36b06076c3a1 https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh8b19718_0.conda#32d0781ace05105cc99af55d36cbec7c https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h0054346_0.conda#78880cde19cf47cbec3025fc81bfe4bc https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.1-pyhe01879c_0.conda#8200884fd84ab8754567d8523b52eaa8 -https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.0-h32cad80_0.conda#a1cdd40fc962e2f7944bc19e01c7e584 +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda#75be1a943e0a7f99fcf118309092c635 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.31.2-pyhd8ed1ab_0.conda#c0600c1b374efa7a1ff444befee108ca https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.5.1-pyhd8ed1ab_0.conda#8f0ef561cd615a17df3256742a3457c4 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h0134ee8_117.conda#a979c07e8fc0e3f61c24a65d16cc6fbe -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.0-py311h519dc76_0.conda#002e600fcc82f415bfaad7d05a44c016 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.1-py311h519dc76_0.conda#3c92d1c6a7938b0f92997bd0485561ef https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py311h0960b38_1.conda#5e6251fd41d984a9d4fd1fe4b9bdca31 https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda#a49c2283f24696a7b30367b7346a0144 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.3.1-pyhd8ed1ab_0.conda#996376098e3648237b3efb0e0ad460c1 @@ -177,12 +177,12 @@ https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py311h9ecbd09_1.co https://conda.anaconda.org/conda-forge/noarch/nox-2025.5.1-pyhe01879c_0.conda#f294cc5e7c84a0422fcc57f33313e084 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.2.1-pyhd8ed1ab_0.conda#ce978e1b9ed8b8d49164e90a5cdc94cd https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.1-pyhd8ed1ab_0.conda#11b313328806f1dfbab0eb1d219388c4 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py311h8f841c2_0.conda#5ec0a1732a05376241e1e4c6d50e0e91 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.0-py311h2d3ef60_0.conda#87f6abadb59e4b17fc3a7b666faa721f https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.3.1-hd8ed1ab_0.conda#38ca080dff1a30a6fd3aec989062b255 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py311h3dc67b8_0.conda#ea7501cf4d40188cc662b29bcc07f13b https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py311h9f3472d_0.conda#555b148cafbd96b658499060d5e11a65 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.41.0-h5f92351_1.conda#742f52d72194d213d47bd6920b138eec +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.42.0-h5f92351_0.conda#9862a9cd17ade6d0e72b4c0a10123cf2 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.3-py311h2b939e6_0.conda#0d1b7dfe2bbf983cb7907f6cbd6613e6 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py311h8b974bf_102.conda#d748aad3050d26241842b76d56424cf9 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.2.0-pyha770c72_0.conda#17e487cc8b5507cd3abc09398cf27949 diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 61043402..7fa264f4 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -6,7 +6,7 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.ta https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-7_cp312.conda#0dfcdc155cf23812a0c9deada86fb723 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.6.15-hbd8a1cb_0.conda#72525f07d72806e3b639ad4504c30ce5 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h1423503_5.conda#6dc9e1305e7d3129af4ad0dabda30e56 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_0.conda#e31316a586cac398b1fcdb10ace786b9 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_3.conda#3cd1a7238a0dd3d0860fdefc496cc854 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d @@ -27,7 +27,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_3.cond https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_1.conda#de356753cfdbffcde5bb1e86e3aa6cd0 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.1-h7b32b05_0.conda#c87df2ab1448ba69169652ab9547082d https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 @@ -43,8 +43,8 @@ https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_3.conda#bfbca721fd33188ef923dfe9ba172f29 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.49-h943b412_0.conda#37511c874cf3b8d0034c8d24e73c0884 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.1-h6cd9bfd_7.conda#c7c4888059a8324e52de475d1e7bdc53 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.50-h943b412_0.conda#51de14db340a848869e69c632b43cca7 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.2-h6cd9bfd_0.conda#b04c7eda6d7dab1e6503135e7fad4d25 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_3.conda#57541755b5a51691955012b8e197c06c https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 @@ -71,7 +71,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hf01ce69_5.conda#e https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/python-3.12.11-h9e4cc4f_0_cpython.conda#94206474a5608243a10c92cefbe0908f https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.1-hb7a22d2_7.conda#1964294875a699fa6ad43c7c3058e280 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.2-hb7a22d2_0.conda#efe16ab2f63053af723e070f3f9bac4c https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a @@ -100,7 +100,7 @@ https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de -https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.8-py312h84d6215_0.conda#6713467dc95509683bfa3aca08524e8a +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.8-py312h68727a3_1.conda#a8ea818e46addfa842348701a9dbe8f8 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-32_h59b9bed_openblas.conda#2af9f3d5c2e39f417ce040f5a35c40c6 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 @@ -129,7 +129,7 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_1.conda#40d0ed782a8aaa16ef248e68c06c168d -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.0-pyhe01879c_0.conda#2adcd9bb86f656d3d43bf84af59a1faf +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda#e523f4f1e980ed7a4240d7e27e9ec81f https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py312h66e93f0_0.conda#617f5d608ff8c28ad546e5d9671cbb95 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d @@ -137,10 +137,10 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0. https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda#a861504bbea4161a9170b85d4d2be840 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.9.1-py312h178313f_0.conda#4c18b79fa2a3371557ed3663876e5dcc +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.9.2-py312h178313f_0.conda#c6fbd05ceaeed83ef044de66e3f26fef https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.58.4-py312h178313f_0.conda#223a4616e3db7336569eafefac04ebbf +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.58.5-py312h178313f_0.conda#867170cb17a9497811c303a2e5e502bf https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h2d575fe_101.conda#d1f61f912e1968a8ac9834b62fde008d @@ -151,18 +151,18 @@ https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-32_he106b2a_openb https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-32_h7ac8fdf_openblas.conda#6c3f04ccb6c578138e9f9899da0bd714 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/linux-64/pillow-11.2.1-py312h80c1187_0.conda#ca438bf57e4f2423d261987fe423a0dd +https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py312h80c1187_0.conda#7911e727a6c24db662193a960b81b6b2 https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh8b19718_0.conda#32d0781ace05105cc99af55d36cbec7c https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h0054346_0.conda#78880cde19cf47cbec3025fc81bfe4bc https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.1-pyhe01879c_0.conda#8200884fd84ab8754567d8523b52eaa8 -https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda#5ba79d7c71f03c678c8ead841f347d6e -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.0-h32cad80_0.conda#a1cdd40fc962e2f7944bc19e01c7e584 +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda#75be1a943e0a7f99fcf118309092c635 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.31.2-pyhd8ed1ab_0.conda#c0600c1b374efa7a1ff444befee108ca https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.5.1-pyhd8ed1ab_0.conda#8f0ef561cd615a17df3256742a3457c4 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h0134ee8_117.conda#a979c07e8fc0e3f61c24a65d16cc6fbe -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.0-py312h6cf2f7f_0.conda#8b4095ed29d1072f7e4badfbaf9e5851 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.1-py312h6cf2f7f_0.conda#7e086a30150af2536a1059885368dcf0 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py312h03c6e1f_1.conda#f754591f9ec0169e436fa84cb9db0c32 https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda#a49c2283f24696a7b30367b7346a0144 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.3.1-pyhd8ed1ab_0.conda#996376098e3648237b3efb0e0ad460c1 @@ -177,12 +177,12 @@ https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h66e93f0_1.co https://conda.anaconda.org/conda-forge/noarch/nox-2025.5.1-pyhe01879c_0.conda#f294cc5e7c84a0422fcc57f33313e084 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.2.1-pyhd8ed1ab_0.conda#ce978e1b9ed8b8d49164e90a5cdc94cd https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.1-pyhd8ed1ab_0.conda#11b313328806f1dfbab0eb1d219388c4 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py312ha707e6e_0.conda#00b999c5f9d01fb633db819d79186bd4 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.0-py312hf734454_0.conda#7513ac56209d27a85ffa1582033f10a8 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.3.1-hd8ed1ab_0.conda#38ca080dff1a30a6fd3aec989062b255 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py312h21f5128_0.conda#d38eb6d34385f82b02ff776a66977cc4 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py312hc0a28a1_0.conda#8b5b812d4c18cb37bda7a7c8d3a6acb3 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.41.0-h5f92351_1.conda#742f52d72194d213d47bd6920b138eec +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.42.0-h5f92351_0.conda#9862a9cd17ade6d0e72b4c0a10123cf2 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.3-py312hd3ec401_0.conda#2d69618b52d70970c81cc598e4b51118 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py312h3805cb1_102.conda#c1358b48677cfc7095cd664f1f0647a1 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.2.0-pyha770c72_0.conda#17e487cc8b5507cd3abc09398cf27949 From 8758060a0ef76fd8645d65ec29d77c462be0e618 Mon Sep 17 00:00:00 2001 From: Elias <110238618+ESadek-MO@users.noreply.github.com> Date: Fri, 18 Jul 2025 15:38:32 +0100 Subject: [PATCH 474/583] Create CITATION.cff (#675) --- CITATION.cff | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 CITATION.cff diff --git a/CITATION.cff b/CITATION.cff new file mode 100644 index 00000000..460a07f2 --- /dev/null +++ b/CITATION.cff @@ -0,0 +1,11 @@ +cff-version: 1.2.0 +message: "If iris-grib played an important role in your research then please add us to your reference list by using the references below." +title: "iris-grib" +authors: + - name: "iris-grib repository contributors" +abstract: "GRIB (GRIdded Binary) interface for Iris." +license: "BSD-3-Clause" +license-url: "https://spdx.org/licenses/BSD-3-Clause.html" +url: "http://www.scitools.org.uk/" +repository-code: "https://github.com/SciTools/iris-grib" +type: "software" From 06b17ab472518dbc0b01aa85076d363f6daa97d8 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Thu, 24 Jul 2025 14:56:12 +0100 Subject: [PATCH 475/583] Import and run grib-dependent attribute handling tests from Iris. (#677) * Import and run grib-dependent attribute handling tests from Iris. * Fix qa. * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Skip iris-derived attribute handler tests when not present in iris version. * Remove obsolete ruff rules. * Update broken link. --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- pyproject.toml | 3 -- src/iris_grib/__init__.py | 2 +- .../test_nc_attribute_handlers.py | 54 +++++++++++++++++++ 3 files changed, 55 insertions(+), 4 deletions(-) create mode 100644 src/iris_grib/tests/integration/iris_integration/test_nc_attribute_handlers.py diff --git a/pyproject.toml b/pyproject.toml index 8f6465ae..3ea854c3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -199,8 +199,6 @@ ignore = [ "ANN001", "ANN002", "ANN003", - "ANN101", - "ANN102", "ANN201", "ANN202", "ANN204", @@ -387,7 +385,6 @@ ignore = [ # https://docs.astral.sh/ruff/rules/#pyupgrade-up "UP009", "UP018", - "UP027", "UP031", "UP032", ] diff --git a/src/iris_grib/__init__.py b/src/iris_grib/__init__.py index e65f5e14..c29b077c 100644 --- a/src/iris_grib/__init__.py +++ b/src/iris_grib/__init__.py @@ -4,7 +4,7 @@ # See LICENSE in the root of the repository for full licensing details. """Conversion of cubes to/from GRIB. -See: `ECMWF GRIB API `_. +See: `ECMWF ecCodes grib interface `_. """ diff --git a/src/iris_grib/tests/integration/iris_integration/test_nc_attribute_handlers.py b/src/iris_grib/tests/integration/iris_integration/test_nc_attribute_handlers.py new file mode 100644 index 00000000..fcd95a3c --- /dev/null +++ b/src/iris_grib/tests/integration/iris_integration/test_nc_attribute_handlers.py @@ -0,0 +1,54 @@ +# Copyright iris-grib contributors +# +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +""" +Integration tests for reading/writing GRIB_PARAM attributes in netcdf files. + +N.B. the relevant support code and classes (including testing) are all part of in Iris, +along with the ones for "STASH" and "ukmo__process_flags" ones. + +But all the testing there is optional, and skipped if iris-grib is not installed, so +that the Iris repo doesn't have to maintain iris-grib as a test dependency. + +So, we import + run the relevant tests here instead. + +""" + +import pytest + +# Start by attempting the key imports from Iris, and skipping all tests if any fail. +# Needed to run with older Iris (releases) prior to the tests being added. +# Unfortunately we can't actually use the returned items, as dynamic typing upsets MyPy. +pytest.importorskip("iris.tests.integration.netcdf.test_load_managed_attributes") +pytest.importorskip("iris.tests.integration.netcdf.test_save_managed_attributes") +pytest.importorskip("iris.tests.unit.fileformats.netcdf.attribute_handlers") + + +from iris.tests.integration.netcdf.test_load_managed_attributes import ( + TestGribParam as LoadGribParamTests, +) + +from iris.tests.integration.netcdf.test_save_managed_attributes import ( + TestGribParam as SaveGribParamTests, +) + +from iris.tests.unit.fileformats.netcdf.attribute_handlers import ( + test_GribParamHandler as tgp, +) + + +class TestLoadGribParam_actual(LoadGribParamTests): + pass + + +class TestSaveGribParam_actual(SaveGribParamTests): + pass + + +class TestGribParamHandler_Encode(tgp.TestEncodeObject): + pass + + +class TestGribParamHandler_Decode(tgp.TestDecodeAttribute): + pass From ca7c3c3d903c5dc36f37b7498ff55c6df7b3f347 Mon Sep 17 00:00:00 2001 From: Martin Yeo <40734014+trexfeathers@users.noreply.github.com> Date: Thu, 24 Jul 2025 16:16:28 +0100 Subject: [PATCH 476/583] Update `MANIFEST.in` to include recent improvements from other repos (#676) * Incorporate SciTools/.github#181. * Incorporate SciTools/.github#183. --------- Co-authored-by: Chris Bunney <48915820+ukmo-ccbunney@users.noreply.github.com> --- MANIFEST.in | 24 ++++++------------------ 1 file changed, 6 insertions(+), 18 deletions(-) diff --git a/MANIFEST.in b/MANIFEST.in index c381edb5..a9af457b 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -21,17 +21,6 @@ recursive-include src *.cml *.grib2 *.json *.nc *.py # - also possibly non-python, e.g. *.pyx for Cython -#--------- -# SECTION: docs -prune docs -# and if required ... include ONLY docs source files. -# E.G. recursive-include docs *.rst *.inc - # principles: - # - use prune to ignore everything (optionally: except the docs sources) - # hints: - # - most projects don't want to package the docs, but some currently do (cf-units). - - #--------- # SECTION: requirements prune requirements @@ -41,7 +30,6 @@ recursive-include requirements *.txt # hints: # - not all projects include requirements, but they can be drawn in anyway by dynamic dependencies # in the setuptools build process, linked via config in pyproject.toml - # - for some repos, the *.txt are actually lockfiles. This probably needs fixing. #--------- @@ -57,14 +45,19 @@ exclude .pre-commit-config.yaml exclude .readthedocs.yml exclude .ruff.toml exclude CHANGES +include CHANGELOG.md include CITATION.cff exclude CODE_OF_CONDUCT.md +exclude CONTRIBUTING.md include COPYING include COPYING.LESSER +include INSTALL include LICENSE exclude Makefile exclude codecov.yml include noxfile.py +include tox.ini +exclude pixi.lock # principles: # - *ANY* file in the root should be explicitly "include"- or "exclude"-d # - EXCEPT (possibly) those covered by setuptools default rules (see above link) @@ -83,6 +76,7 @@ prune .github prune .nox prune .tox prune .coverage +prune docs # (2) top-level files to omit exclude .coveragerc # (3) file types (path patterns) to skip everywhere @@ -96,9 +90,3 @@ global-exclude __pycache__ # previous sections -- such as python compiler cache files # - can include this section as **boilerplate** : # - won't all exist in every repo, but including them all does no harm - - -#================================= -# Local Iris-grib-specific settings -# -exclude CONTRIBUTING.md From 4c6c93a886b0686933aeead19cca1d9aec818f56 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Fri, 25 Jul 2025 08:58:20 +0100 Subject: [PATCH 477/583] Updated environment lockfiles (#673) Co-authored-by: Lockfile bot Co-authored-by: Patrick Peglar --- requirements/locks/py310-linux-64.lock | 90 ++++++++++++------------- requirements/locks/py311-linux-64.lock | 92 +++++++++++++------------- requirements/locks/py312-linux-64.lock | 92 +++++++++++++------------- 3 files changed, 137 insertions(+), 137 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 49c33bb0..3a0e5de2 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -3,10 +3,10 @@ # input_hash: c9c2cc109eb8c116e9db50df49eb69ec6fe34d489a4cff5ff3dd3984e09456f4 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-7_cp310.conda#44e871cba2b162368476a84b8d040b6c +https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.conda#05e00f3b21e88bb3d658ac700b2ce58c https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a -https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.6.15-hbd8a1cb_0.conda#72525f07d72806e3b639ad4504c30ce5 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_0.conda#e31316a586cac398b1fcdb10ace786b9 +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.7.14-hbd8a1cb_0.conda#d16c90324aef024877d8713c0b7fea5b +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda#0be7c6e070c19105f966d3758448d018 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_3.conda#3cd1a7238a0dd3d0860fdefc496cc854 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d @@ -15,7 +15,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_3.conda#9 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_3.conda#cb98af5db26e3f482bebb80ce9d947d3 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.24-h86f0d12_0.conda#64f0c503da58ec25ebd359e4d990afa8 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda#4211416ecba1866fab0c6470986c22d6 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_3.conda#e66f2b8ad787e7beb0f846e4bd7e8493 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_3.conda#530566b68c3b8ce7eec4cd047eae19fe @@ -24,7 +24,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.c https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_3.conda#6d11a5edae89fe413c0569f16d308f5a -https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a +https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.1-h7b32b05_0.conda#c87df2ab1448ba69169652ab9547082d @@ -44,7 +44,6 @@ https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172b https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_3.conda#bfbca721fd33188ef923dfe9ba172f29 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.50-h943b412_0.conda#51de14db340a848869e69c632b43cca7 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.2-h6cd9bfd_0.conda#b04c7eda6d7dab1e6503135e7fad4d25 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_3.conda#57541755b5a51691955012b8e197c06c https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 @@ -69,18 +68,32 @@ https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.con https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_0.conda#323dc8f259224d13078aaf7ce96c3efe https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hf01ce69_5.conda#e79a094918988bb1807462cd42c83962 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba -https://conda.anaconda.org/conda-forge/linux-64/python-3.10.18-hd6af730_0_cpython.conda#4ea0c77cdcb0b81813a0436b162d7316 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.2-hb7a22d2_0.conda#efe16ab2f63053af723e070f3f9bac4c https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_3.conda#5d08a0ac29e6a5a984817584775d4131 +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-32_h59b9bed_openblas.conda#2af9f3d5c2e39f417ce040f5a35c40c6 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 +https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.3-hee844dc_0.conda#4fe4c3b7ce84cda6508b6d78f0ce72e3 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h4bc477f_0.conda#14dbe05b929e329dbaa6f2d0aa19466d +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_102.conda#ac96ae31a8bd8c30b9c9a9a39b2a0791 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-32_he106b2a_openblas.conda#3d3f9355e52f269cd8bc2c440d8a5263 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-32_h7ac8fdf_openblas.conda#6c3f04ccb6c578138e9f9899da0bd714 +https://conda.anaconda.org/conda-forge/linux-64/python-3.10.18-hd6af730_0_cpython.conda#4ea0c77cdcb0b81813a0436b162d7316 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.3-heff268d_0.conda#c0dcfc9d2345a5970527717884d363df +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.2-pyhd8ed1ab_0.conda#eb9d4263271ca287d2e0cf5a86da2d3a https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f -https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_3.conda#5d08a0ac29e6a5a984817584775d4131 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_3.conda#63d24a5dd21c738d706f91569dbd1892 https://conda.anaconda.org/conda-forge/noarch/cachetools-6.1.0-pyhd8ed1ab_0.conda#f84eb05fa7f862602bfaf4dd844bd61b -https://conda.anaconda.org/conda-forge/noarch/certifi-2025.6.15-pyhd8ed1ab_0.conda#781d068df0cc2407d4db0ecfbb29225b +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.7.14-pyhd8ed1ab_0.conda#4c07624f3faefd0bb6659fb7396cfa76 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.2-pyhd8ed1ab_0.conda#40fe4284b8b5835a9073a645139f35af @@ -89,11 +102,12 @@ https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.1-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/colorlog-6.9.0-pyh707e725_1.conda#f00fc375bd02bdbbf791f9fe26ae96ec https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 -https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_1.conda#8d88f4a2242e6b96f9ecff9a6a05b2f1 +https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda#4547b39256e296bb758166893e909a7c https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.5.1-pyhd8ed1ab_0.conda#2d2c9ef879a7e64e2dc657b09272c2b6 +https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.7.0-pyhd8ed1ab_0.conda#a31ce802cd0ebfce298f342c02757019 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 @@ -101,18 +115,16 @@ https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.b https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.8-py310h3788b33_1.conda#b70dd76da5231e6073fd44c42a1d78c5 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-32_h59b9bed_openblas.conda#2af9f3d5c2e39f417ce040f5a35c40c6 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 -https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h4bc477f_0.conda#14dbe05b929e329dbaa6f2d0aa19466d +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h0134ee8_117.conda#a979c07e8fc0e3f61c24a65d16cc6fbe https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py310h89163eb_1.conda#8ce3f0332fd6de0d737e2911d329523f https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.6-py310hefbff90_0.conda#b0cea2c364bf65cd19e023040eeab05d https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 +https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py310h7e6dc6c_0.conda#e609995f031bc848be8ea159865e8afc https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda#424844562f5d337077b445ec6b1398a7 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h0054346_0.conda#78880cde19cf47cbec3025fc81bfe4bc https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 @@ -131,66 +143,54 @@ https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_1.conda#40d https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda#e523f4f1e980ed7a4240d7e27e9ec81f https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py310ha75aee5_0.conda#1d7a4b9202cdd10d56ecdd7f6c347190 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h8deb56e_0.conda#1fc24a3196ad5ede2a68148be61894f4 +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310hf462985_1.conda#c2d5289e6cbcecf2c549e01772fe5274 +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py310h3788b33_0.conda#b6420d29123c7c823de168f49ccdfe6a https://conda.anaconda.org/conda-forge/linux-64/coverage-7.9.2-py310h89163eb_0.conda#f02d32dc5b0547e137f871a33e032842 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.58.5-py310h89163eb_0.conda#f84b125a5ba0e319936be9aba48276ff -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.59.0-py310h3406613_0.conda#dc2e5602e20bbffb18314a70094b3c4a https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h2d575fe_101.conda#d1f61f912e1968a8ac9834b62fde008d https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.5-h1920b20_0.conda#ec8824a45bd7c50a46788fa16216d6c2 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-32_he106b2a_openblas.conda#3d3f9355e52f269cd8bc2c440d8a5263 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-32_h7ac8fdf_openblas.conda#6c3f04ccb6c578138e9f9899da0bd714 +https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py310ha75aee5_1.conda#48781b625a5c7701e04d222752cb2f62 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py310h7e6dc6c_0.conda#e609995f031bc848be8ea159865e8afc https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh8b19718_0.conda#32d0781ace05105cc99af55d36cbec7c -https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h0054346_0.conda#78880cde19cf47cbec3025fc81bfe4bc +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py310h71d0299_1.conda#e54b1eaeb50ad1767680181a8575a8db https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.1-pyhe01879c_0.conda#8200884fd84ab8754567d8523b52eaa8 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.conda#8c29cd33b64b2eb78597fa28b5595c8d +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py310h247727d_0.conda#78ae955878da938d98aa828413263284 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda#75be1a943e0a7f99fcf118309092c635 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.31.2-pyhd8ed1ab_0.conda#c0600c1b374efa7a1ff444befee108ca -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 -https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py310hf462985_0.conda#c31938674e4cda43617a4d70f99ffd0c +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.42.0-h5f92351_0.conda#9862a9cd17ade6d0e72b4c0a10123cf2 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.7.0-h40b2b14_1.conda#8a77895fb29728b736a1a6c75906ea1a -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h0134ee8_117.conda#a979c07e8fc0e3f61c24a65d16cc6fbe -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.6-py310hefbff90_0.conda#b0cea2c364bf65cd19e023040eeab05d -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py310h71d0299_1.conda#e54b1eaeb50ad1767680181a8575a8db +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.3-py310h68603db_0.conda#50084ca38bf28440e2762966bac143fc +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py310haba2683_102.conda#308cc08b61b28c7e8173bfc30bb158bf https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda#a49c2283f24696a7b30367b7346a0144 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.3.1-pyhd8ed1ab_0.conda#996376098e3648237b3efb0e0ad460c1 https://conda.anaconda.org/conda-forge/noarch/tox-4.27.0-pyhe01879c_0.conda#54d53e668907a36833f7a5b91c01277c https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310h3788b33_5.conda#e05b0475166b68c9dc4d7937e0315654 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha75aee5_2.conda#f9254b5b0193982416b91edcb4b2676f -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310hf462985_1.conda#c2d5289e6cbcecf2c549e01772fe5274 -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py310h3788b33_0.conda#b6420d29123c7c823de168f49ccdfe6a +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py310h5eaa309_0.conda#ca4d935c1715f95b6e86846ad1675a2b https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 https://conda.anaconda.org/conda-forge/noarch/identify-2.6.12-pyhd8ed1ab_0.conda#84463b10c1eb198541cd54125c7efe90 -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.5-h1920b20_0.conda#ec8824a45bd7c50a46788fa16216d6c2 -https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py310ha75aee5_1.conda#48781b625a5c7701e04d222752cb2f62 https://conda.anaconda.org/conda-forge/noarch/nox-2025.5.1-pyhe01879c_0.conda#f294cc5e7c84a0422fcc57f33313e084 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.2.1-pyhd8ed1ab_0.conda#ce978e1b9ed8b8d49164e90a5cdc94cd https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.1-pyhd8ed1ab_0.conda#11b313328806f1dfbab0eb1d219388c4 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.conda#8c29cd33b64b2eb78597fa28b5595c8d +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py310hf462985_0.conda#93ae40b74b2baea09ddeaa287b09e705 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.3.1-hd8ed1ab_0.conda#38ca080dff1a30a6fd3aec989062b255 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py310h247727d_0.conda#78ae955878da938d98aa828413263284 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py310hf462985_0.conda#c31938674e4cda43617a4d70f99ffd0c -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.42.0-h5f92351_0.conda#9862a9cd17ade6d0e72b4c0a10123cf2 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.3-py310h68603db_0.conda#50084ca38bf28440e2762966bac143fc -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py310haba2683_102.conda#308cc08b61b28c7e8173bfc30bb158bf +https://conda.anaconda.org/conda-forge/noarch/iris-3.11.1-pyha770c72_1.conda#f501583062225a070455d011d81b07bf https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.2.0-pyha770c72_0.conda#17e487cc8b5507cd3abc09398cf27949 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda#f6082eae112814f1447b56a5e1f6ed05 -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py310h5eaa309_0.conda#ca4d935c1715f95b6e86846ad1675a2b https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py310hf462985_0.conda#93ae40b74b2baea09ddeaa287b09e705 -https://conda.anaconda.org/conda-forge/noarch/iris-3.11.1-pyha770c72_1.conda#f501583062225a070455d011d81b07bf https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda#e9fb3fe8a5b758b4aff187d434f94f03 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 52b760ab..156dd65e 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -3,10 +3,10 @@ # input_hash: 84b15051cf21e4aaa0500a4d04539836bcd04717d1bc6930fd28c616793acc49 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-7_cp311.conda#6320dac78b3b215ceac35858b2cfdb70 +https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda#8fcb6b0e2161850556231336dae58358 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a -https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.6.15-hbd8a1cb_0.conda#72525f07d72806e3b639ad4504c30ce5 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_0.conda#e31316a586cac398b1fcdb10ace786b9 +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.7.14-hbd8a1cb_0.conda#d16c90324aef024877d8713c0b7fea5b +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda#0be7c6e070c19105f966d3758448d018 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_3.conda#3cd1a7238a0dd3d0860fdefc496cc854 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d @@ -15,7 +15,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_3.conda#9 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_3.conda#cb98af5db26e3f482bebb80ce9d947d3 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.24-h86f0d12_0.conda#64f0c503da58ec25ebd359e4d990afa8 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda#4211416ecba1866fab0c6470986c22d6 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_3.conda#e66f2b8ad787e7beb0f846e4bd7e8493 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_3.conda#530566b68c3b8ce7eec4cd047eae19fe @@ -24,7 +24,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.c https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_3.conda#6d11a5edae89fe413c0569f16d308f5a -https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a +https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.1-h7b32b05_0.conda#c87df2ab1448ba69169652ab9547082d @@ -44,7 +44,6 @@ https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172b https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_3.conda#bfbca721fd33188ef923dfe9ba172f29 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.50-h943b412_0.conda#51de14db340a848869e69c632b43cca7 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.2-h6cd9bfd_0.conda#b04c7eda6d7dab1e6503135e7fad4d25 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_3.conda#57541755b5a51691955012b8e197c06c https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 @@ -69,18 +68,32 @@ https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.con https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_0.conda#323dc8f259224d13078aaf7ce96c3efe https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hf01ce69_5.conda#e79a094918988bb1807462cd42c83962 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba -https://conda.anaconda.org/conda-forge/linux-64/python-3.11.13-h9e4cc4f_0_cpython.conda#8c399445b6dc73eab839659e6c7b5ad1 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.2-hb7a22d2_0.conda#efe16ab2f63053af723e070f3f9bac4c https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_3.conda#5d08a0ac29e6a5a984817584775d4131 +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-32_h59b9bed_openblas.conda#2af9f3d5c2e39f417ce040f5a35c40c6 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 +https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.3-hee844dc_0.conda#4fe4c3b7ce84cda6508b6d78f0ce72e3 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h4bc477f_0.conda#14dbe05b929e329dbaa6f2d0aa19466d +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_102.conda#ac96ae31a8bd8c30b9c9a9a39b2a0791 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-32_he106b2a_openblas.conda#3d3f9355e52f269cd8bc2c440d8a5263 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-32_h7ac8fdf_openblas.conda#6c3f04ccb6c578138e9f9899da0bd714 +https://conda.anaconda.org/conda-forge/linux-64/python-3.11.13-h9e4cc4f_0_cpython.conda#8c399445b6dc73eab839659e6c7b5ad1 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.3-heff268d_0.conda#c0dcfc9d2345a5970527717884d363df +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.2-pyhd8ed1ab_0.conda#eb9d4263271ca287d2e0cf5a86da2d3a https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f -https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_3.conda#5d08a0ac29e6a5a984817584775d4131 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hfdbb021_3.conda#8565f7297b28af62e5de2d968ca32e31 https://conda.anaconda.org/conda-forge/noarch/cachetools-6.1.0-pyhd8ed1ab_0.conda#f84eb05fa7f862602bfaf4dd844bd61b -https://conda.anaconda.org/conda-forge/noarch/certifi-2025.6.15-pyhd8ed1ab_0.conda#781d068df0cc2407d4db0ecfbb29225b +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.7.14-pyhd8ed1ab_0.conda#4c07624f3faefd0bb6659fb7396cfa76 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.2-pyhd8ed1ab_0.conda#40fe4284b8b5835a9073a645139f35af @@ -89,11 +102,12 @@ https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.1-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/colorlog-6.9.0-pyh707e725_1.conda#f00fc375bd02bdbbf791f9fe26ae96ec https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 -https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_1.conda#8d88f4a2242e6b96f9ecff9a6a05b2f1 +https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda#4547b39256e296bb758166893e909a7c https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.5.1-pyhd8ed1ab_0.conda#2d2c9ef879a7e64e2dc657b09272c2b6 +https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.7.0-pyhd8ed1ab_0.conda#a31ce802cd0ebfce298f342c02757019 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 @@ -101,18 +115,16 @@ https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.b https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.8-py311hd18a35c_1.conda#bb17b97b0c0d86e052134bf21af5c03d -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-32_h59b9bed_openblas.conda#2af9f3d5c2e39f417ce040f5a35c40c6 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 -https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h4bc477f_0.conda#14dbe05b929e329dbaa6f2d0aa19466d +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h0134ee8_117.conda#a979c07e8fc0e3f61c24a65d16cc6fbe https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py311h2dc5d0c_1.conda#6565a715337ae279e351d0abd8ffe88a https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.1-py311h2e04523_1.conda#062302d0490f0f8368be762c188979c9 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 +https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py311h1322bbf_0.conda#8b4568b1357f5ec5494e36b06076c3a1 https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda#424844562f5d337077b445ec6b1398a7 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h0054346_0.conda#78880cde19cf47cbec3025fc81bfe4bc https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 @@ -132,65 +144,53 @@ https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_1.conda#40d https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda#e523f4f1e980ed7a4240d7e27e9ec81f https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py311h9ecbd09_0.conda#51a12678b609f5794985fda8372b1a49 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311hf29c0ef_0.conda#55553ecd5328336368db611f350b7039 +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h9f3472d_1.conda#2c3c4f115d28ed9e001a271d5d8585aa +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py311hd18a35c_0.conda#f8e440efa026c394461a45a46cea49fc https://conda.anaconda.org/conda-forge/linux-64/coverage-7.9.2-py311h2dc5d0c_0.conda#4a4d2bb7e4d14efb7320206a57467029 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.58.5-py311h2dc5d0c_0.conda#13ca35ec6ae88e9c2c71cef129ac73f2 -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.59.0-py311h3778330_0.conda#2eaecc2e416852815abb85dc47d425b3 https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h2d575fe_101.conda#d1f61f912e1968a8ac9834b62fde008d https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.5-h1920b20_0.conda#ec8824a45bd7c50a46788fa16216d6c2 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-32_he106b2a_openblas.conda#3d3f9355e52f269cd8bc2c440d8a5263 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-32_h7ac8fdf_openblas.conda#6c3f04ccb6c578138e9f9899da0bd714 +https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py311h9ecbd09_1.conda#28d6b63784b350a2906dc264ad8c7f2a https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py311h1322bbf_0.conda#8b4568b1357f5ec5494e36b06076c3a1 https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh8b19718_0.conda#32d0781ace05105cc99af55d36cbec7c -https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h0054346_0.conda#78880cde19cf47cbec3025fc81bfe4bc +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py311h0960b38_1.conda#5e6251fd41d984a9d4fd1fe4b9bdca31 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.1-pyhe01879c_0.conda#8200884fd84ab8754567d8523b52eaa8 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.0-py311h2d3ef60_0.conda#87f6abadb59e4b17fc3a7b666faa721f +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py311h3dc67b8_0.conda#ea7501cf4d40188cc662b29bcc07f13b https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda#75be1a943e0a7f99fcf118309092c635 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.31.2-pyhd8ed1ab_0.conda#c0600c1b374efa7a1ff444befee108ca -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.5.1-pyhd8ed1ab_0.conda#8f0ef561cd615a17df3256742a3457c4 -https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h0134ee8_117.conda#a979c07e8fc0e3f61c24a65d16cc6fbe -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.1-py311h519dc76_0.conda#3c92d1c6a7938b0f92997bd0485561ef -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py311h0960b38_1.conda#5e6251fd41d984a9d4fd1fe4b9bdca31 +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py311h9f3472d_0.conda#555b148cafbd96b658499060d5e11a65 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.7.0-pyhe01879c_1.conda#3293644021329a96c606c3d95e180991 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.42.0-h5f92351_0.conda#9862a9cd17ade6d0e72b4c0a10123cf2 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.3-py311h2b939e6_0.conda#0d1b7dfe2bbf983cb7907f6cbd6613e6 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py311h8b974bf_102.conda#d748aad3050d26241842b76d56424cf9 https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda#a49c2283f24696a7b30367b7346a0144 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.3.1-pyhd8ed1ab_0.conda#996376098e3648237b3efb0e0ad460c1 https://conda.anaconda.org/conda-forge/noarch/tox-4.27.0-pyhe01879c_0.conda#54d53e668907a36833f7a5b91c01277c https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hd18a35c_5.conda#4e8447ca8558a203ec0577b4730073f3 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311h9ecbd09_2.conda#ca02de88df1cc3cfc8f24766ff50cb3c -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h9f3472d_1.conda#2c3c4f115d28ed9e001a271d5d8585aa -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py311hd18a35c_0.conda#f8e440efa026c394461a45a46cea49fc +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py311h7db5c69_0.conda#20ba399d57a2b5de789a5b24341481a1 https://conda.anaconda.org/conda-forge/noarch/identify-2.6.12-pyhd8ed1ab_0.conda#84463b10c1eb198541cd54125c7efe90 -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.5-h1920b20_0.conda#ec8824a45bd7c50a46788fa16216d6c2 -https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py311h9ecbd09_1.conda#28d6b63784b350a2906dc264ad8c7f2a https://conda.anaconda.org/conda-forge/noarch/nox-2025.5.1-pyhe01879c_0.conda#f294cc5e7c84a0422fcc57f33313e084 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.2.1-pyhd8ed1ab_0.conda#ce978e1b9ed8b8d49164e90a5cdc94cd https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.1-pyhd8ed1ab_0.conda#11b313328806f1dfbab0eb1d219388c4 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.0-py311h2d3ef60_0.conda#87f6abadb59e4b17fc3a7b666faa721f +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py311h9f3472d_0.conda#648bccc358ec5b19dec01a5685f3aeb9 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.3.1-hd8ed1ab_0.conda#38ca080dff1a30a6fd3aec989062b255 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py311h3dc67b8_0.conda#ea7501cf4d40188cc662b29bcc07f13b https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py311h9f3472d_0.conda#555b148cafbd96b658499060d5e11a65 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.42.0-h5f92351_0.conda#9862a9cd17ade6d0e72b4c0a10123cf2 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.3-py311h2b939e6_0.conda#0d1b7dfe2bbf983cb7907f6cbd6613e6 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py311h8b974bf_102.conda#d748aad3050d26241842b76d56424cf9 +https://conda.anaconda.org/conda-forge/noarch/iris-3.12.2-pyha770c72_0.conda#281bb211efe112ed90f2d703bbcf5512 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.2.0-pyha770c72_0.conda#17e487cc8b5507cd3abc09398cf27949 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda#f6082eae112814f1447b56a5e1f6ed05 -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py311h7db5c69_0.conda#20ba399d57a2b5de789a5b24341481a1 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py311h9f3472d_0.conda#648bccc358ec5b19dec01a5685f3aeb9 -https://conda.anaconda.org/conda-forge/noarch/iris-3.12.2-pyha770c72_0.conda#281bb211efe112ed90f2d703bbcf5512 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda#e9fb3fe8a5b758b4aff187d434f94f03 diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 7fa264f4..a533b1d0 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -3,10 +3,10 @@ # input_hash: 91532b637582431f4f0f4b6b1cc13a5ed67d3de3d47cda643e03c5547b4a5340 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-7_cp312.conda#0dfcdc155cf23812a0c9deada86fb723 +https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda#c3efd25ac4d74b1584d2f7a57195ddf1 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a -https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.6.15-hbd8a1cb_0.conda#72525f07d72806e3b639ad4504c30ce5 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_0.conda#e31316a586cac398b1fcdb10ace786b9 +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.7.14-hbd8a1cb_0.conda#d16c90324aef024877d8713c0b7fea5b +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda#0be7c6e070c19105f966d3758448d018 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_3.conda#3cd1a7238a0dd3d0860fdefc496cc854 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d @@ -15,7 +15,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_3.conda#9 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_3.conda#cb98af5db26e3f482bebb80ce9d947d3 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.24-h86f0d12_0.conda#64f0c503da58ec25ebd359e4d990afa8 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda#db0bfbe7dd197b68ad5f30333bae6ce0 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda#4211416ecba1866fab0c6470986c22d6 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_3.conda#e66f2b8ad787e7beb0f846e4bd7e8493 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_3.conda#530566b68c3b8ce7eec4cd047eae19fe @@ -24,7 +24,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.c https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_3.conda#6d11a5edae89fe413c0569f16d308f5a -https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda#63f790534398730f59e1b899c3644d4a +https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.1-h7b32b05_0.conda#c87df2ab1448ba69169652ab9547082d @@ -44,7 +44,6 @@ https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172b https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_3.conda#bfbca721fd33188ef923dfe9ba172f29 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.50-h943b412_0.conda#51de14db340a848869e69c632b43cca7 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.2-h6cd9bfd_0.conda#b04c7eda6d7dab1e6503135e7fad4d25 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_3.conda#57541755b5a51691955012b8e197c06c https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 @@ -69,18 +68,32 @@ https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.con https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_0.conda#323dc8f259224d13078aaf7ce96c3efe https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hf01ce69_5.conda#e79a094918988bb1807462cd42c83962 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba -https://conda.anaconda.org/conda-forge/linux-64/python-3.12.11-h9e4cc4f_0_cpython.conda#94206474a5608243a10c92cefbe0908f https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.2-hb7a22d2_0.conda#efe16ab2f63053af723e070f3f9bac4c https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_3.conda#5d08a0ac29e6a5a984817584775d4131 +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-32_h59b9bed_openblas.conda#2af9f3d5c2e39f417ce040f5a35c40c6 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 +https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.3-hee844dc_0.conda#4fe4c3b7ce84cda6508b6d78f0ce72e3 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h4bc477f_0.conda#14dbe05b929e329dbaa6f2d0aa19466d +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_102.conda#ac96ae31a8bd8c30b9c9a9a39b2a0791 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-32_he106b2a_openblas.conda#3d3f9355e52f269cd8bc2c440d8a5263 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-32_h7ac8fdf_openblas.conda#6c3f04ccb6c578138e9f9899da0bd714 +https://conda.anaconda.org/conda-forge/linux-64/python-3.12.11-h9e4cc4f_0_cpython.conda#94206474a5608243a10c92cefbe0908f +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.3-heff268d_0.conda#c0dcfc9d2345a5970527717884d363df +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.2-pyhd8ed1ab_0.conda#eb9d4263271ca287d2e0cf5a86da2d3a https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f -https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_3.conda#5d08a0ac29e6a5a984817584775d4131 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_3.conda#a32e0c069f6c3dcac635f7b0b0dac67e https://conda.anaconda.org/conda-forge/noarch/cachetools-6.1.0-pyhd8ed1ab_0.conda#f84eb05fa7f862602bfaf4dd844bd61b -https://conda.anaconda.org/conda-forge/noarch/certifi-2025.6.15-pyhd8ed1ab_0.conda#781d068df0cc2407d4db0ecfbb29225b +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.7.14-pyhd8ed1ab_0.conda#4c07624f3faefd0bb6659fb7396cfa76 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.2-pyhd8ed1ab_0.conda#40fe4284b8b5835a9073a645139f35af @@ -89,11 +102,12 @@ https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.1-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/colorlog-6.9.0-pyh707e725_1.conda#f00fc375bd02bdbbf791f9fe26ae96ec https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 -https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_1.conda#8d88f4a2242e6b96f9ecff9a6a05b2f1 +https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda#4547b39256e296bb758166893e909a7c https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.5.1-pyhd8ed1ab_0.conda#2d2c9ef879a7e64e2dc657b09272c2b6 +https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.7.0-pyhd8ed1ab_0.conda#a31ce802cd0ebfce298f342c02757019 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 @@ -101,18 +115,16 @@ https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.b https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.8-py312h68727a3_1.conda#a8ea818e46addfa842348701a9dbe8f8 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-32_h59b9bed_openblas.conda#2af9f3d5c2e39f417ce040f5a35c40c6 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 -https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h4bc477f_0.conda#14dbe05b929e329dbaa6f2d0aa19466d +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h0134ee8_117.conda#a979c07e8fc0e3f61c24a65d16cc6fbe https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda#eb227c3e0bf58f5bd69c0532b157975b https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.1-py312h33ff503_1.conda#c459ad05f041827f8f479e88dfc29303 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 +https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py312h80c1187_0.conda#7911e727a6c24db662193a960b81b6b2 https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda#424844562f5d337077b445ec6b1398a7 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h0054346_0.conda#78880cde19cf47cbec3025fc81bfe4bc https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 @@ -132,65 +144,53 @@ https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_1.conda#40d https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda#e523f4f1e980ed7a4240d7e27e9ec81f https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py312h66e93f0_0.conda#617f5d608ff8c28ad546e5d9671cbb95 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda#a861504bbea4161a9170b85d4d2be840 +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312hc0a28a1_1.conda#990033147b0a998e756eaaed6b28f48d +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py312h68727a3_0.conda#e688276449452cdfe9f8f5d3e74c23f6 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.9.2-py312h178313f_0.conda#c6fbd05ceaeed83ef044de66e3f26fef https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.58.5-py312h178313f_0.conda#867170cb17a9497811c303a2e5e502bf -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.59.0-py312h8a5da7c_0.conda#008d44a468c24a59d2e67c014fba8f12 https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h2d575fe_101.conda#d1f61f912e1968a8ac9834b62fde008d https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.5-h1920b20_0.conda#ec8824a45bd7c50a46788fa16216d6c2 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-32_he106b2a_openblas.conda#3d3f9355e52f269cd8bc2c440d8a5263 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-32_h7ac8fdf_openblas.conda#6c3f04ccb6c578138e9f9899da0bd714 +https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h66e93f0_1.conda#5fef67f50126f40f5966a9451661280d https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py312h80c1187_0.conda#7911e727a6c24db662193a960b81b6b2 https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh8b19718_0.conda#32d0781ace05105cc99af55d36cbec7c -https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h0054346_0.conda#78880cde19cf47cbec3025fc81bfe4bc +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py312h03c6e1f_1.conda#f754591f9ec0169e436fa84cb9db0c32 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.1-pyhe01879c_0.conda#8200884fd84ab8754567d8523b52eaa8 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.0-py312hf734454_0.conda#7513ac56209d27a85ffa1582033f10a8 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py312h21f5128_0.conda#d38eb6d34385f82b02ff776a66977cc4 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda#75be1a943e0a7f99fcf118309092c635 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.31.2-pyhd8ed1ab_0.conda#c0600c1b374efa7a1ff444befee108ca -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.5.1-pyhd8ed1ab_0.conda#8f0ef561cd615a17df3256742a3457c4 -https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h0134ee8_117.conda#a979c07e8fc0e3f61c24a65d16cc6fbe -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.1-py312h6cf2f7f_0.conda#7e086a30150af2536a1059885368dcf0 -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py312h03c6e1f_1.conda#f754591f9ec0169e436fa84cb9db0c32 +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py312hc0a28a1_0.conda#8b5b812d4c18cb37bda7a7c8d3a6acb3 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.7.0-pyhe01879c_1.conda#3293644021329a96c606c3d95e180991 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.42.0-h5f92351_0.conda#9862a9cd17ade6d0e72b4c0a10123cf2 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.3-py312hd3ec401_0.conda#2d69618b52d70970c81cc598e4b51118 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py312h3805cb1_102.conda#c1358b48677cfc7095cd664f1f0647a1 https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda#a49c2283f24696a7b30367b7346a0144 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.3.1-pyhd8ed1ab_0.conda#996376098e3648237b3efb0e0ad460c1 https://conda.anaconda.org/conda-forge/noarch/tox-4.27.0-pyhe01879c_0.conda#54d53e668907a36833f7a5b91c01277c https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h68727a3_5.conda#f9664ee31aed96c85b7319ab0a693341 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312h66e93f0_2.conda#630db208bc7bbb96725ce9832c7423bb -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312hc0a28a1_1.conda#990033147b0a998e756eaaed6b28f48d -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py312h68727a3_0.conda#e688276449452cdfe9f8f5d3e74c23f6 +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py312hf9745cd_0.conda#ea213e31805199cb7d0da457b879ceed https://conda.anaconda.org/conda-forge/noarch/identify-2.6.12-pyhd8ed1ab_0.conda#84463b10c1eb198541cd54125c7efe90 -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.5-h1920b20_0.conda#ec8824a45bd7c50a46788fa16216d6c2 -https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h66e93f0_1.conda#5fef67f50126f40f5966a9451661280d https://conda.anaconda.org/conda-forge/noarch/nox-2025.5.1-pyhe01879c_0.conda#f294cc5e7c84a0422fcc57f33313e084 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.2.1-pyhd8ed1ab_0.conda#ce978e1b9ed8b8d49164e90a5cdc94cd https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.1-pyhd8ed1ab_0.conda#11b313328806f1dfbab0eb1d219388c4 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.0-py312hf734454_0.conda#7513ac56209d27a85ffa1582033f10a8 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py312hc0a28a1_0.conda#476b0357e207e10d2b7b13ed82156e6d https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.3.1-hd8ed1ab_0.conda#38ca080dff1a30a6fd3aec989062b255 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py312h21f5128_0.conda#d38eb6d34385f82b02ff776a66977cc4 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py312hc0a28a1_0.conda#8b5b812d4c18cb37bda7a7c8d3a6acb3 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.42.0-h5f92351_0.conda#9862a9cd17ade6d0e72b4c0a10123cf2 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.3-py312hd3ec401_0.conda#2d69618b52d70970c81cc598e4b51118 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py312h3805cb1_102.conda#c1358b48677cfc7095cd664f1f0647a1 +https://conda.anaconda.org/conda-forge/noarch/iris-3.12.2-pyha770c72_0.conda#281bb211efe112ed90f2d703bbcf5512 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.2.0-pyha770c72_0.conda#17e487cc8b5507cd3abc09398cf27949 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda#f6082eae112814f1447b56a5e1f6ed05 -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py312hf9745cd_0.conda#ea213e31805199cb7d0da457b879ceed https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py312hc0a28a1_0.conda#476b0357e207e10d2b7b13ed82156e6d -https://conda.anaconda.org/conda-forge/noarch/iris-3.12.2-pyha770c72_0.conda#281bb211efe112ed90f2d703bbcf5512 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda#e9fb3fe8a5b758b4aff187d434f94f03 From 1839f55f6bbf8d322627d479560448dbf610aef4 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 28 Jul 2025 10:17:38 +0100 Subject: [PATCH 478/583] Updated environment lockfiles (#679) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 22 +++++++++++----------- requirements/locks/py311-linux-64.lock | 24 ++++++++++++------------ requirements/locks/py312-linux-64.lock | 24 ++++++++++++------------ 3 files changed, 35 insertions(+), 35 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 3a0e5de2..0d00c988 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -32,6 +32,7 @@ https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002. https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb47aa4a_0.conda#607e13a8caac17f9a664bcab5302ce06 +https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.1-h97f6797_0.conda#5bc18c66111bc94532b0d2df00731c66 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 @@ -52,9 +53,8 @@ https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#9 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 -https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda#3b3e64af585eadfb52bb90b553db5edf +https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_0.conda#3d8da0248bdae970b4ade636a104b7f5 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda#a0116df4f4ed05c303811a837d5b39d8 -https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d @@ -65,7 +65,7 @@ https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f4 https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.conda#3c255be50a506c50765a93a6644f32fe https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_0.conda#323dc8f259224d13078aaf7ce96c3efe +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_1.conda#7e2ba4ca7e6ffebb7f7fc2da2744df61 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hf01ce69_5.conda#e79a094918988bb1807462cd42c83962 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 @@ -76,17 +76,17 @@ https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-32_h59b9bed_openblas.conda#2af9f3d5c2e39f417ce040f5a35c40c6 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.3-hee844dc_0.conda#4fe4c3b7ce84cda6508b6d78f0ce72e3 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.3-hee844dc_1.conda#18d2ac95b507ada9ca159a6bd73255f7 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h4bc477f_0.conda#14dbe05b929e329dbaa6f2d0aa19466d https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_102.conda#ac96ae31a8bd8c30b9c9a9a39b2a0791 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda#c74d83614aec66227ae5199d98852aaf https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-32_he106b2a_openblas.conda#3d3f9355e52f269cd8bc2c440d8a5263 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-32_h7ac8fdf_openblas.conda#6c3f04ccb6c578138e9f9899da0bd714 https://conda.anaconda.org/conda-forge/linux-64/python-3.10.18-hd6af730_0_cpython.conda#4ea0c77cdcb0b81813a0436b162d7316 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.3-heff268d_0.conda#c0dcfc9d2345a5970527717884d363df +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.3-heff268d_1.conda#a4cfbd4bc4cf834779a5383519f9eb5a https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.2-pyhd8ed1ab_0.conda#eb9d4263271ca287d2e0cf5a86da2d3a @@ -128,13 +128,13 @@ https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h0054346_0.conda#7888 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 -https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_1.conda#856b387c270e9eaf6e41e978057a2b62 +https://conda.anaconda.org/conda-forge/noarch/pyshp-2.4.0-pyhd8ed1ab_0.conda#14183a69259a0481a14668ec140abb1a https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py310ha75aee5_2.conda#af6da4542e91edaf59b614ce7e991700 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py310h89163eb_2.conda#fd343408e64cf1e273ab7c710da374db https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e -https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 +https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda#755cf22df8693aa0d1aec1c123fa5863 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 @@ -148,7 +148,7 @@ https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h8deb56e_0.conda#1fc24a3196ad5ede2a68148be61894f4 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310hf462985_1.conda#c2d5289e6cbcecf2c549e01772fe5274 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py310h3788b33_0.conda#b6420d29123c7c823de168f49ccdfe6a -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.9.2-py310h89163eb_0.conda#f02d32dc5b0547e137f871a33e032842 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.0-py310h3406613_0.conda#53f445ee472c39ffa4903a8f31af3498 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.59.0-py310h3406613_0.conda#dc2e5602e20bbffb18314a70094b3c4a @@ -167,7 +167,7 @@ https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.conda#8c29cd33b64b2eb78597fa28b5595c8d https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py310h247727d_0.conda#78ae955878da938d98aa828413263284 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda#75be1a943e0a7f99fcf118309092c635 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.31.2-pyhd8ed1ab_0.conda#c0600c1b374efa7a1ff444befee108ca +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.32.0-pyhd8ed1ab_0.conda#3d6c6f6498c5fb6587dc03ff9541feeb https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py310hf462985_0.conda#c31938674e4cda43617a4d70f99ffd0c https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.42.0-h5f92351_0.conda#9862a9cd17ade6d0e72b4c0a10123cf2 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.7.0-h40b2b14_1.conda#8a77895fb29728b736a1a6c75906ea1a @@ -175,7 +175,7 @@ https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.3-py310h686 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py310haba2683_102.conda#308cc08b61b28c7e8173bfc30bb158bf https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda#a49c2283f24696a7b30367b7346a0144 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.3.1-pyhd8ed1ab_0.conda#996376098e3648237b3efb0e0ad460c1 -https://conda.anaconda.org/conda-forge/noarch/tox-4.27.0-pyhe01879c_0.conda#54d53e668907a36833f7a5b91c01277c +https://conda.anaconda.org/conda-forge/noarch/tox-4.28.1-pyhe01879c_0.conda#4f8bd3602709b7ea763d625c6a7f42f2 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310h3788b33_5.conda#e05b0475166b68c9dc4d7937e0315654 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha75aee5_2.conda#f9254b5b0193982416b91edcb4b2676f https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py310h5eaa309_0.conda#ca4d935c1715f95b6e86846ad1675a2b diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 156dd65e..175bc111 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -32,6 +32,7 @@ https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002. https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb47aa4a_0.conda#607e13a8caac17f9a664bcab5302ce06 +https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.1-h97f6797_0.conda#5bc18c66111bc94532b0d2df00731c66 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 @@ -52,9 +53,8 @@ https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#9 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 -https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda#3b3e64af585eadfb52bb90b553db5edf +https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_0.conda#3d8da0248bdae970b4ade636a104b7f5 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda#a0116df4f4ed05c303811a837d5b39d8 -https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d @@ -65,7 +65,7 @@ https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f4 https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.conda#3c255be50a506c50765a93a6644f32fe https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_0.conda#323dc8f259224d13078aaf7ce96c3efe +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_1.conda#7e2ba4ca7e6ffebb7f7fc2da2744df61 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hf01ce69_5.conda#e79a094918988bb1807462cd42c83962 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 @@ -76,17 +76,17 @@ https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-32_h59b9bed_openblas.conda#2af9f3d5c2e39f417ce040f5a35c40c6 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.3-hee844dc_0.conda#4fe4c3b7ce84cda6508b6d78f0ce72e3 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.3-hee844dc_1.conda#18d2ac95b507ada9ca159a6bd73255f7 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h4bc477f_0.conda#14dbe05b929e329dbaa6f2d0aa19466d https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_102.conda#ac96ae31a8bd8c30b9c9a9a39b2a0791 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda#c74d83614aec66227ae5199d98852aaf https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-32_he106b2a_openblas.conda#3d3f9355e52f269cd8bc2c440d8a5263 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-32_h7ac8fdf_openblas.conda#6c3f04ccb6c578138e9f9899da0bd714 https://conda.anaconda.org/conda-forge/linux-64/python-3.11.13-h9e4cc4f_0_cpython.conda#8c399445b6dc73eab839659e6c7b5ad1 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.3-heff268d_0.conda#c0dcfc9d2345a5970527717884d363df +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.3-heff268d_1.conda#a4cfbd4bc4cf834779a5383519f9eb5a https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.2-pyhd8ed1ab_0.conda#eb9d4263271ca287d2e0cf5a86da2d3a @@ -119,7 +119,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h0134ee8_1 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py311h2dc5d0c_1.conda#6565a715337ae279e351d0abd8ffe88a https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.1-py311h2e04523_1.conda#062302d0490f0f8368be762c188979c9 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.2-py311h2e04523_0.conda#61e1b42eb1d9f0ebaf038522ce9ca2fe https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py311h1322bbf_0.conda#8b4568b1357f5ec5494e36b06076c3a1 https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda#424844562f5d337077b445ec6b1398a7 @@ -128,14 +128,14 @@ https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h0054346_0.conda#7888 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 -https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_1.conda#856b387c270e9eaf6e41e978057a2b62 +https://conda.anaconda.org/conda-forge/noarch/pyshp-2.4.0-pyhd8ed1ab_0.conda#14183a69259a0481a14668ec140abb1a https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py311h9ecbd09_2.conda#4b49b833ad54b3e26da1e743a4e4bc13 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py311h2dc5d0c_2.conda#014417753f948da1f70d132b2de573be https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-3.1.0-pyhd8ed1ab_0.conda#5f0f24f8032c2c1bb33f59b75974f5fc https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e -https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 +https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda#755cf22df8693aa0d1aec1c123fa5863 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 @@ -149,7 +149,7 @@ https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311hf29c0ef_0.conda#55553ecd5328336368db611f350b7039 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h9f3472d_1.conda#2c3c4f115d28ed9e001a271d5d8585aa https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py311hd18a35c_0.conda#f8e440efa026c394461a45a46cea49fc -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.9.2-py311h2dc5d0c_0.conda#4a4d2bb7e4d14efb7320206a57467029 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.0-py311h3778330_0.conda#2f62d3939cc0ce55d8b371cf9f5f3c82 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.59.0-py311h3778330_0.conda#2eaecc2e416852815abb85dc47d425b3 @@ -168,7 +168,7 @@ https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.0-py311h2d3ef60_0.conda#87f6abadb59e4b17fc3a7b666faa721f https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py311h3dc67b8_0.conda#ea7501cf4d40188cc662b29bcc07f13b https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda#75be1a943e0a7f99fcf118309092c635 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.31.2-pyhd8ed1ab_0.conda#c0600c1b374efa7a1ff444befee108ca +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.32.0-pyhd8ed1ab_0.conda#3d6c6f6498c5fb6587dc03ff9541feeb https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py311h9f3472d_0.conda#555b148cafbd96b658499060d5e11a65 https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.7.0-pyhe01879c_1.conda#3293644021329a96c606c3d95e180991 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.42.0-h5f92351_0.conda#9862a9cd17ade6d0e72b4c0a10123cf2 @@ -176,7 +176,7 @@ https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.3-py311h2b9 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py311h8b974bf_102.conda#d748aad3050d26241842b76d56424cf9 https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda#a49c2283f24696a7b30367b7346a0144 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.3.1-pyhd8ed1ab_0.conda#996376098e3648237b3efb0e0ad460c1 -https://conda.anaconda.org/conda-forge/noarch/tox-4.27.0-pyhe01879c_0.conda#54d53e668907a36833f7a5b91c01277c +https://conda.anaconda.org/conda-forge/noarch/tox-4.28.1-pyhe01879c_0.conda#4f8bd3602709b7ea763d625c6a7f42f2 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hd18a35c_5.conda#4e8447ca8558a203ec0577b4730073f3 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311h9ecbd09_2.conda#ca02de88df1cc3cfc8f24766ff50cb3c https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py311h7db5c69_0.conda#20ba399d57a2b5de789a5b24341481a1 diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index a533b1d0..51b7a3df 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -32,6 +32,7 @@ https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002. https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb47aa4a_0.conda#607e13a8caac17f9a664bcab5302ce06 +https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.1-h97f6797_0.conda#5bc18c66111bc94532b0d2df00731c66 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 @@ -52,9 +53,8 @@ https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#9 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 -https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-h8bd8927_1.conda#3b3e64af585eadfb52bb90b553db5edf +https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_0.conda#3d8da0248bdae970b4ade636a104b7f5 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda#a0116df4f4ed05c303811a837d5b39d8 -https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d @@ -65,7 +65,7 @@ https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f4 https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.conda#3c255be50a506c50765a93a6644f32fe https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_0.conda#323dc8f259224d13078aaf7ce96c3efe +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_1.conda#7e2ba4ca7e6ffebb7f7fc2da2744df61 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hf01ce69_5.conda#e79a094918988bb1807462cd42c83962 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 @@ -76,17 +76,17 @@ https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-32_h59b9bed_openblas.conda#2af9f3d5c2e39f417ce040f5a35c40c6 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.3-hee844dc_0.conda#4fe4c3b7ce84cda6508b6d78f0ce72e3 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.3-hee844dc_1.conda#18d2ac95b507ada9ca159a6bd73255f7 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h4bc477f_0.conda#14dbe05b929e329dbaa6f2d0aa19466d https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_102.conda#ac96ae31a8bd8c30b9c9a9a39b2a0791 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda#c74d83614aec66227ae5199d98852aaf https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-32_he106b2a_openblas.conda#3d3f9355e52f269cd8bc2c440d8a5263 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-32_h7ac8fdf_openblas.conda#6c3f04ccb6c578138e9f9899da0bd714 https://conda.anaconda.org/conda-forge/linux-64/python-3.12.11-h9e4cc4f_0_cpython.conda#94206474a5608243a10c92cefbe0908f -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.3-heff268d_0.conda#c0dcfc9d2345a5970527717884d363df +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.3-heff268d_1.conda#a4cfbd4bc4cf834779a5383519f9eb5a https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.2-pyhd8ed1ab_0.conda#eb9d4263271ca287d2e0cf5a86da2d3a @@ -119,7 +119,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h0134ee8_1 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda#eb227c3e0bf58f5bd69c0532b157975b https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.1-py312h33ff503_1.conda#c459ad05f041827f8f479e88dfc29303 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.2-py312h33ff503_0.conda#3f6efbc40eb13f019c856c410fa921d2 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py312h80c1187_0.conda#7911e727a6c24db662193a960b81b6b2 https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda#424844562f5d337077b445ec6b1398a7 @@ -128,14 +128,14 @@ https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h0054346_0.conda#7888 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 -https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_1.conda#856b387c270e9eaf6e41e978057a2b62 +https://conda.anaconda.org/conda-forge/noarch/pyshp-2.4.0-pyhd8ed1ab_0.conda#14183a69259a0481a14668ec140abb1a https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f0_2.conda#cc3f6c452697c1cf7e4e6e5f21861f96 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h178313f_2.conda#cf2485f39740de96e2a7f2bb18ed2fee https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-3.1.0-pyhd8ed1ab_0.conda#5f0f24f8032c2c1bb33f59b75974f5fc https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e -https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda#a451d576819089b0d672f18768be0f65 +https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda#755cf22df8693aa0d1aec1c123fa5863 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 @@ -149,7 +149,7 @@ https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda#a861504bbea4161a9170b85d4d2be840 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312hc0a28a1_1.conda#990033147b0a998e756eaaed6b28f48d https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py312h68727a3_0.conda#e688276449452cdfe9f8f5d3e74c23f6 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.9.2-py312h178313f_0.conda#c6fbd05ceaeed83ef044de66e3f26fef +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.0-py312h8a5da7c_0.conda#10c5a17b4546b4e236031ef8177cf9d1 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.59.0-py312h8a5da7c_0.conda#008d44a468c24a59d2e67c014fba8f12 @@ -168,7 +168,7 @@ https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.0-py312hf734454_0.conda#7513ac56209d27a85ffa1582033f10a8 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py312h21f5128_0.conda#d38eb6d34385f82b02ff776a66977cc4 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda#75be1a943e0a7f99fcf118309092c635 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.31.2-pyhd8ed1ab_0.conda#c0600c1b374efa7a1ff444befee108ca +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.32.0-pyhd8ed1ab_0.conda#3d6c6f6498c5fb6587dc03ff9541feeb https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py312hc0a28a1_0.conda#8b5b812d4c18cb37bda7a7c8d3a6acb3 https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.7.0-pyhe01879c_1.conda#3293644021329a96c606c3d95e180991 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.42.0-h5f92351_0.conda#9862a9cd17ade6d0e72b4c0a10123cf2 @@ -176,7 +176,7 @@ https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.3-py312hd3e https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py312h3805cb1_102.conda#c1358b48677cfc7095cd664f1f0647a1 https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda#a49c2283f24696a7b30367b7346a0144 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.3.1-pyhd8ed1ab_0.conda#996376098e3648237b3efb0e0ad460c1 -https://conda.anaconda.org/conda-forge/noarch/tox-4.27.0-pyhe01879c_0.conda#54d53e668907a36833f7a5b91c01277c +https://conda.anaconda.org/conda-forge/noarch/tox-4.28.1-pyhe01879c_0.conda#4f8bd3602709b7ea763d625c6a7f42f2 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h68727a3_5.conda#f9664ee31aed96c85b7319ab0a693341 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312h66e93f0_2.conda#630db208bc7bbb96725ce9832c7423bb https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py312hf9745cd_0.conda#ea213e31805199cb7d0da457b879ceed From 0fabbed225dafc6a9a4dffdb49d9dfbe545df46d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 31 Jul 2025 09:57:33 +0100 Subject: [PATCH 479/583] Bump scitools/workflows in the dependencies group (#672) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2025.06.4 to 2025.07.0 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.06.4...2025.07.0) --- updated-dependencies: - dependency-name: scitools/workflows dependency-version: 2025.07.0 dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/ci-template-check.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index fe1f3837..aa0fe51b 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.06.4 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.07.3 diff --git a/.github/workflows/ci-template-check.yml b/.github/workflows/ci-template-check.yml index 0624c30b..d2d25258 100644 --- a/.github/workflows/ci-template-check.yml +++ b/.github/workflows/ci-template-check.yml @@ -10,7 +10,7 @@ on: jobs: prompt-share: - uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.06.4 + uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.07.3 secrets: inherit with: pr_number: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 39784e9c..f119bc9a 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.06.4 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.07.3 secrets: inherit From 0bcde1dfaa073d1605d1987b95aad3cc1893d06c Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 4 Aug 2025 12:06:42 +0100 Subject: [PATCH 480/583] Updated environment lockfiles (#680) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 102 ++++++++++++------------- requirements/locks/py311-linux-64.lock | 102 ++++++++++++------------- requirements/locks/py312-linux-64.lock | 102 ++++++++++++------------- 3 files changed, 153 insertions(+), 153 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 0d00c988..2dc81743 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -8,22 +8,22 @@ https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222 https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.7.14-hbd8a1cb_0.conda#d16c90324aef024877d8713c0b7fea5b https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda#0be7c6e070c19105f966d3758448d018 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_3.conda#3cd1a7238a0dd3d0860fdefc496cc854 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda#3baf8976c96134738bba224e9ef6b1e5 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_3.conda#9e60c55e725c20d23125a5f0dd69af5d +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda#f406dcbb2e7bef90d793e50e79a2882b https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_3.conda#cb98af5db26e3f482bebb80ce9d947d3 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.24-h86f0d12_0.conda#64f0c503da58ec25ebd359e4d990afa8 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda#4211416ecba1866fab0c6470986c22d6 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_3.conda#e66f2b8ad787e7beb0f846e4bd7e8493 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_3.conda#530566b68c3b8ce7eec4cd047eae19fe +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda#28771437ffcd9f3417c66012dc49a3be +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_4.conda#8a4ab7ff06e4db0be22485332666da0f https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_3.conda#6d11a5edae89fe413c0569f16d308f5a +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.conda#3c376af8888c386b9d3d1c2701e2f3ab https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 @@ -42,11 +42,12 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_3.co https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_3.conda#3facafe58f3858eb95527c7d3a3fc578 https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_3.conda#bfbca721fd33188ef923dfe9ba172f29 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_4.conda#53e876bc2d2648319e94c33c57b9ec74 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.50-h943b412_0.conda#51de14db340a848869e69c632b43cca7 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.50-h421ea60_1.conda#7af8e91b0deb5f8e25d1a595dea79614 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda#0b367fad34931cb79e0d6b7e5c06bb1c https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_3.conda#57541755b5a51691955012b8e197c06c +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_4.conda#2d34729cbc1da0ec988e57b13b712067 https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 @@ -68,29 +69,15 @@ https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.con https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_1.conda#7e2ba4ca7e6ffebb7f7fc2da2744df61 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hf01ce69_5.conda#e79a094918988bb1807462cd42c83962 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba +https://conda.anaconda.org/conda-forge/linux-64/python-3.10.18-hd6af730_0_cpython.conda#4ea0c77cdcb0b81813a0436b162d7316 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.4-hbc0de68_0.conda#8376bd3854542be0c8c7cd07525d31c6 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 -https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_3.conda#5d08a0ac29e6a5a984817584775d4131 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-32_h59b9bed_openblas.conda#2af9f3d5c2e39f417ce040f5a35c40c6 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 -https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.3-hee844dc_1.conda#18d2ac95b507ada9ca159a6bd73255f7 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h4bc477f_0.conda#14dbe05b929e329dbaa6f2d0aa19466d -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda#c74d83614aec66227ae5199d98852aaf -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-32_he106b2a_openblas.conda#3d3f9355e52f269cd8bc2c440d8a5263 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-32_h7ac8fdf_openblas.conda#6c3f04ccb6c578138e9f9899da0bd714 -https://conda.anaconda.org/conda-forge/linux-64/python-3.10.18-hd6af730_0_cpython.conda#4ea0c77cdcb0b81813a0436b162d7316 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.3-heff268d_1.conda#a4cfbd4bc4cf834779a5383519f9eb5a -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.2-pyhd8ed1ab_0.conda#eb9d4263271ca287d2e0cf5a86da2d3a https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_3.conda#5d08a0ac29e6a5a984817584775d4131 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_3.conda#63d24a5dd21c738d706f91569dbd1892 https://conda.anaconda.org/conda-forge/noarch/cachetools-6.1.0-pyhd8ed1ab_0.conda#f84eb05fa7f862602bfaf4dd844bd61b https://conda.anaconda.org/conda-forge/noarch/certifi-2025.7.14-pyhd8ed1ab_0.conda#4c07624f3faefd0bb6659fb7396cfa76 @@ -105,8 +92,7 @@ https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#4 https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda#4547b39256e296bb758166893e909a7c -https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 +https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.7.0-pyhd8ed1ab_0.conda#a31ce802cd0ebfce298f342c02757019 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac @@ -115,20 +101,22 @@ https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.b https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.8-py310h3788b33_1.conda#b70dd76da5231e6073fd44c42a1d78c5 -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h0134ee8_117.conda#a979c07e8fc0e3f61c24a65d16cc6fbe +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-32_h59b9bed_openblas.conda#2af9f3d5c2e39f417ce040f5a35c40c6 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 +https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h4bc477f_0.conda#14dbe05b929e329dbaa6f2d0aa19466d https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py310h89163eb_1.conda#8ce3f0332fd6de0d737e2911d329523f https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.6-py310hefbff90_0.conda#b0cea2c364bf65cd19e023040eeab05d +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 -https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py310h7e6dc6c_0.conda#e609995f031bc848be8ea159865e8afc https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda#424844562f5d337077b445ec6b1398a7 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h0054346_0.conda#78880cde19cf47cbec3025fc81bfe4bc https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 -https://conda.anaconda.org/conda-forge/noarch/pyshp-2.4.0-pyhd8ed1ab_0.conda#14183a69259a0481a14668ec140abb1a +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhe01879c_2.conda#aa0028616c0750c773698fdc254b2b8d +https://conda.anaconda.org/conda-forge/noarch/pyshp-2.4.1-pyhd8ed1ab_0.conda#fd63e22cf63e045390fab5ce5b86093d https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py310ha75aee5_2.conda#af6da4542e91edaf59b614ce7e991700 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 @@ -138,59 +126,71 @@ https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda#755cf22df8693aa0d1aec1c123fa5863 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 -https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 +https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda#30a0a26c8abccf4b7991d590fe17c699 https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_1.conda#40d0ed782a8aaa16ef248e68c06c168d https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda#e523f4f1e980ed7a4240d7e27e9ec81f https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py310ha75aee5_0.conda#1d7a4b9202cdd10d56ecdd7f6c347190 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h8deb56e_0.conda#1fc24a3196ad5ede2a68148be61894f4 -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310hf462985_1.conda#c2d5289e6cbcecf2c549e01772fe5274 -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py310h3788b33_0.conda#b6420d29123c7c823de168f49ccdfe6a -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.0-py310h3406613_0.conda#53f445ee472c39ffa4903a8f31af3498 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.1-py310h3406613_0.conda#ac2715e7efc966c105f45d0cc8dfc4cb https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.59.0-py310h3406613_0.conda#dc2e5602e20bbffb18314a70094b3c4a +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda#c74d83614aec66227ae5199d98852aaf https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.5-h1920b20_0.conda#ec8824a45bd7c50a46788fa16216d6c2 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 -https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py310ha75aee5_1.conda#48781b625a5c7701e04d222752cb2f62 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-32_he106b2a_openblas.conda#3d3f9355e52f269cd8bc2c440d8a5263 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-32_h7ac8fdf_openblas.conda#6c3f04ccb6c578138e9f9899da0bd714 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh8b19718_0.conda#32d0781ace05105cc99af55d36cbec7c -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py310h71d0299_1.conda#e54b1eaeb50ad1767680181a8575a8db +https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py310h7e6dc6c_0.conda#e609995f031bc848be8ea159865e8afc +https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh8b19718_0.conda#dfce4b2af4bfe90cdcaf56ca0b28ddf5 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h18fbb6c_1.conda#e025fd9cad1b925649589ac3af385e37 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.1-pyhe01879c_0.conda#8200884fd84ab8754567d8523b52eaa8 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.conda#8c29cd33b64b2eb78597fa28b5595c8d -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py310h247727d_0.conda#78ae955878da938d98aa828413263284 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda#75be1a943e0a7f99fcf118309092c635 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.32.0-pyhd8ed1ab_0.conda#3d6c6f6498c5fb6587dc03ff9541feeb -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py310hf462985_0.conda#c31938674e4cda43617a4d70f99ffd0c -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.42.0-h5f92351_0.conda#9862a9cd17ade6d0e72b4c0a10123cf2 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 +https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.7.0-h40b2b14_1.conda#8a77895fb29728b736a1a6c75906ea1a -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.3-py310h68603db_0.conda#50084ca38bf28440e2762966bac143fc -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py310haba2683_102.conda#308cc08b61b28c7e8173bfc30bb158bf +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h21f7587_118.conda#5f05af73150f62adab1492ab2d18d573 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.6-py310hefbff90_0.conda#b0cea2c364bf65cd19e023040eeab05d +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py310h71d0299_1.conda#e54b1eaeb50ad1767680181a8575a8db https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda#a49c2283f24696a7b30367b7346a0144 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.3.1-pyhd8ed1ab_0.conda#996376098e3648237b3efb0e0ad460c1 -https://conda.anaconda.org/conda-forge/noarch/tox-4.28.1-pyhe01879c_0.conda#4f8bd3602709b7ea763d625c6a7f42f2 +https://conda.anaconda.org/conda-forge/noarch/tox-4.28.4-pyhe01879c_0.conda#7a2f30d7eebf91ad7320ff2fc9934261 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310h3788b33_5.conda#e05b0475166b68c9dc4d7937e0315654 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha75aee5_2.conda#f9254b5b0193982416b91edcb4b2676f -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py310h5eaa309_0.conda#ca4d935c1715f95b6e86846ad1675a2b +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310hf462985_1.conda#c2d5289e6cbcecf2c549e01772fe5274 +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py310h3788b33_0.conda#b6420d29123c7c823de168f49ccdfe6a https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 https://conda.anaconda.org/conda-forge/noarch/identify-2.6.12-pyhd8ed1ab_0.conda#84463b10c1eb198541cd54125c7efe90 +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.5-h1920b20_0.conda#ec8824a45bd7c50a46788fa16216d6c2 +https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py310ha75aee5_1.conda#48781b625a5c7701e04d222752cb2f62 https://conda.anaconda.org/conda-forge/noarch/nox-2025.5.1-pyhe01879c_0.conda#f294cc5e7c84a0422fcc57f33313e084 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.2.1-pyhd8ed1ab_0.conda#ce978e1b9ed8b8d49164e90a5cdc94cd https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.1-pyhd8ed1ab_0.conda#11b313328806f1dfbab0eb1d219388c4 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py310hf462985_0.conda#93ae40b74b2baea09ddeaa287b09e705 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.conda#8c29cd33b64b2eb78597fa28b5595c8d https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.3.1-hd8ed1ab_0.conda#38ca080dff1a30a6fd3aec989062b255 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py310h247727d_0.conda#78ae955878da938d98aa828413263284 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a -https://conda.anaconda.org/conda-forge/noarch/iris-3.11.1-pyha770c72_1.conda#f501583062225a070455d011d81b07bf +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py310hf462985_0.conda#c31938674e4cda43617a4d70f99ffd0c +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.42.0-h5f92351_0.conda#9862a9cd17ade6d0e72b4c0a10123cf2 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.5-py310hfde16b3_0.conda#4478c9e8038113b9f68904200ec80385 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py310haba2683_102.conda#308cc08b61b28c7e8173bfc30bb158bf https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.2.0-pyha770c72_0.conda#17e487cc8b5507cd3abc09398cf27949 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda#f6082eae112814f1447b56a5e1f6ed05 +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py310h0158d43_0.conda#79cc86f2907e5f83e11c2aa9f521efc7 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py310hf462985_0.conda#93ae40b74b2baea09ddeaa287b09e705 +https://conda.anaconda.org/conda-forge/noarch/iris-3.11.1-pyha770c72_1.conda#f501583062225a070455d011d81b07bf https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda#e9fb3fe8a5b758b4aff187d434f94f03 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 175bc111..6cfcf3c0 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -8,22 +8,22 @@ https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222 https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.7.14-hbd8a1cb_0.conda#d16c90324aef024877d8713c0b7fea5b https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda#0be7c6e070c19105f966d3758448d018 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_3.conda#3cd1a7238a0dd3d0860fdefc496cc854 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda#3baf8976c96134738bba224e9ef6b1e5 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_3.conda#9e60c55e725c20d23125a5f0dd69af5d +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda#f406dcbb2e7bef90d793e50e79a2882b https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_3.conda#cb98af5db26e3f482bebb80ce9d947d3 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.24-h86f0d12_0.conda#64f0c503da58ec25ebd359e4d990afa8 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda#4211416ecba1866fab0c6470986c22d6 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_3.conda#e66f2b8ad787e7beb0f846e4bd7e8493 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_3.conda#530566b68c3b8ce7eec4cd047eae19fe +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda#28771437ffcd9f3417c66012dc49a3be +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_4.conda#8a4ab7ff06e4db0be22485332666da0f https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_3.conda#6d11a5edae89fe413c0569f16d308f5a +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.conda#3c376af8888c386b9d3d1c2701e2f3ab https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 @@ -42,11 +42,12 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_3.co https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_3.conda#3facafe58f3858eb95527c7d3a3fc578 https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_3.conda#bfbca721fd33188ef923dfe9ba172f29 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_4.conda#53e876bc2d2648319e94c33c57b9ec74 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.50-h943b412_0.conda#51de14db340a848869e69c632b43cca7 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.50-h421ea60_1.conda#7af8e91b0deb5f8e25d1a595dea79614 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda#0b367fad34931cb79e0d6b7e5c06bb1c https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_3.conda#57541755b5a51691955012b8e197c06c +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_4.conda#2d34729cbc1da0ec988e57b13b712067 https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 @@ -68,29 +69,15 @@ https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.con https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_1.conda#7e2ba4ca7e6ffebb7f7fc2da2744df61 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hf01ce69_5.conda#e79a094918988bb1807462cd42c83962 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba +https://conda.anaconda.org/conda-forge/linux-64/python-3.11.13-h9e4cc4f_0_cpython.conda#8c399445b6dc73eab839659e6c7b5ad1 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.4-hbc0de68_0.conda#8376bd3854542be0c8c7cd07525d31c6 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 -https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_3.conda#5d08a0ac29e6a5a984817584775d4131 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-32_h59b9bed_openblas.conda#2af9f3d5c2e39f417ce040f5a35c40c6 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 -https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.3-hee844dc_1.conda#18d2ac95b507ada9ca159a6bd73255f7 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h4bc477f_0.conda#14dbe05b929e329dbaa6f2d0aa19466d -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda#c74d83614aec66227ae5199d98852aaf -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-32_he106b2a_openblas.conda#3d3f9355e52f269cd8bc2c440d8a5263 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-32_h7ac8fdf_openblas.conda#6c3f04ccb6c578138e9f9899da0bd714 -https://conda.anaconda.org/conda-forge/linux-64/python-3.11.13-h9e4cc4f_0_cpython.conda#8c399445b6dc73eab839659e6c7b5ad1 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.3-heff268d_1.conda#a4cfbd4bc4cf834779a5383519f9eb5a -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.2-pyhd8ed1ab_0.conda#eb9d4263271ca287d2e0cf5a86da2d3a https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_3.conda#5d08a0ac29e6a5a984817584775d4131 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hfdbb021_3.conda#8565f7297b28af62e5de2d968ca32e31 https://conda.anaconda.org/conda-forge/noarch/cachetools-6.1.0-pyhd8ed1ab_0.conda#f84eb05fa7f862602bfaf4dd844bd61b https://conda.anaconda.org/conda-forge/noarch/certifi-2025.7.14-pyhd8ed1ab_0.conda#4c07624f3faefd0bb6659fb7396cfa76 @@ -105,8 +92,7 @@ https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#4 https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda#4547b39256e296bb758166893e909a7c -https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 +https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.7.0-pyhd8ed1ab_0.conda#a31ce802cd0ebfce298f342c02757019 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac @@ -115,20 +101,22 @@ https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.b https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.8-py311hd18a35c_1.conda#bb17b97b0c0d86e052134bf21af5c03d -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h0134ee8_117.conda#a979c07e8fc0e3f61c24a65d16cc6fbe +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-32_h59b9bed_openblas.conda#2af9f3d5c2e39f417ce040f5a35c40c6 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 +https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h4bc477f_0.conda#14dbe05b929e329dbaa6f2d0aa19466d https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py311h2dc5d0c_1.conda#6565a715337ae279e351d0abd8ffe88a https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.2-py311h2e04523_0.conda#61e1b42eb1d9f0ebaf038522ce9ca2fe +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 -https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py311h1322bbf_0.conda#8b4568b1357f5ec5494e36b06076c3a1 https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda#424844562f5d337077b445ec6b1398a7 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h0054346_0.conda#78880cde19cf47cbec3025fc81bfe4bc https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 -https://conda.anaconda.org/conda-forge/noarch/pyshp-2.4.0-pyhd8ed1ab_0.conda#14183a69259a0481a14668ec140abb1a +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhe01879c_2.conda#aa0028616c0750c773698fdc254b2b8d +https://conda.anaconda.org/conda-forge/noarch/pyshp-2.4.1-pyhd8ed1ab_0.conda#fd63e22cf63e045390fab5ce5b86093d https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py311h9ecbd09_2.conda#4b49b833ad54b3e26da1e743a4e4bc13 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 @@ -139,58 +127,70 @@ https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda#755cf22df8693aa0d1aec1c123fa5863 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 -https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 +https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda#30a0a26c8abccf4b7991d590fe17c699 https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_1.conda#40d0ed782a8aaa16ef248e68c06c168d https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda#e523f4f1e980ed7a4240d7e27e9ec81f https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py311h9ecbd09_0.conda#51a12678b609f5794985fda8372b1a49 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311hf29c0ef_0.conda#55553ecd5328336368db611f350b7039 -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h9f3472d_1.conda#2c3c4f115d28ed9e001a271d5d8585aa -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py311hd18a35c_0.conda#f8e440efa026c394461a45a46cea49fc -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.0-py311h3778330_0.conda#2f62d3939cc0ce55d8b371cf9f5f3c82 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.1-py311h3778330_0.conda#ad5c4453544b1bbbb9cc29e4ab9a97cd https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.59.0-py311h3778330_0.conda#2eaecc2e416852815abb85dc47d425b3 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda#c74d83614aec66227ae5199d98852aaf https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.5-h1920b20_0.conda#ec8824a45bd7c50a46788fa16216d6c2 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 -https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py311h9ecbd09_1.conda#28d6b63784b350a2906dc264ad8c7f2a +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-32_he106b2a_openblas.conda#3d3f9355e52f269cd8bc2c440d8a5263 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-32_h7ac8fdf_openblas.conda#6c3f04ccb6c578138e9f9899da0bd714 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh8b19718_0.conda#32d0781ace05105cc99af55d36cbec7c -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py311h0960b38_1.conda#5e6251fd41d984a9d4fd1fe4b9bdca31 +https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py311h1322bbf_0.conda#8b4568b1357f5ec5494e36b06076c3a1 +https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh8b19718_0.conda#dfce4b2af4bfe90cdcaf56ca0b28ddf5 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h18fbb6c_1.conda#e025fd9cad1b925649589ac3af385e37 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.1-pyhe01879c_0.conda#8200884fd84ab8754567d8523b52eaa8 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.0-py311h2d3ef60_0.conda#87f6abadb59e4b17fc3a7b666faa721f -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py311h3dc67b8_0.conda#ea7501cf4d40188cc662b29bcc07f13b https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda#75be1a943e0a7f99fcf118309092c635 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.32.0-pyhd8ed1ab_0.conda#3d6c6f6498c5fb6587dc03ff9541feeb -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py311h9f3472d_0.conda#555b148cafbd96b658499060d5e11a65 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.7.0-pyhe01879c_1.conda#3293644021329a96c606c3d95e180991 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.42.0-h5f92351_0.conda#9862a9cd17ade6d0e72b4c0a10123cf2 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.3-py311h2b939e6_0.conda#0d1b7dfe2bbf983cb7907f6cbd6613e6 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py311h8b974bf_102.conda#d748aad3050d26241842b76d56424cf9 +https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h21f7587_118.conda#5f05af73150f62adab1492ab2d18d573 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.2-py311h2e04523_0.conda#61e1b42eb1d9f0ebaf038522ce9ca2fe +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py311h0960b38_1.conda#5e6251fd41d984a9d4fd1fe4b9bdca31 https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda#a49c2283f24696a7b30367b7346a0144 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.3.1-pyhd8ed1ab_0.conda#996376098e3648237b3efb0e0ad460c1 -https://conda.anaconda.org/conda-forge/noarch/tox-4.28.1-pyhe01879c_0.conda#4f8bd3602709b7ea763d625c6a7f42f2 +https://conda.anaconda.org/conda-forge/noarch/tox-4.28.4-pyhe01879c_0.conda#7a2f30d7eebf91ad7320ff2fc9934261 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hd18a35c_5.conda#4e8447ca8558a203ec0577b4730073f3 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311h9ecbd09_2.conda#ca02de88df1cc3cfc8f24766ff50cb3c -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py311h7db5c69_0.conda#20ba399d57a2b5de789a5b24341481a1 +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h9f3472d_1.conda#2c3c4f115d28ed9e001a271d5d8585aa +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py311hdf67eae_1.conda#390f9e645ff2f4b9cf48d53b3cf6c942 https://conda.anaconda.org/conda-forge/noarch/identify-2.6.12-pyhd8ed1ab_0.conda#84463b10c1eb198541cd54125c7efe90 +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.5-h1920b20_0.conda#ec8824a45bd7c50a46788fa16216d6c2 +https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py311h9ecbd09_1.conda#28d6b63784b350a2906dc264ad8c7f2a https://conda.anaconda.org/conda-forge/noarch/nox-2025.5.1-pyhe01879c_0.conda#f294cc5e7c84a0422fcc57f33313e084 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.2.1-pyhd8ed1ab_0.conda#ce978e1b9ed8b8d49164e90a5cdc94cd https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.1-pyhd8ed1ab_0.conda#11b313328806f1dfbab0eb1d219388c4 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py311h9f3472d_0.conda#648bccc358ec5b19dec01a5685f3aeb9 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.0-py311h2d3ef60_0.conda#87f6abadb59e4b17fc3a7b666faa721f https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.3.1-hd8ed1ab_0.conda#38ca080dff1a30a6fd3aec989062b255 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py311h3dc67b8_0.conda#ea7501cf4d40188cc662b29bcc07f13b https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a -https://conda.anaconda.org/conda-forge/noarch/iris-3.12.2-pyha770c72_0.conda#281bb211efe112ed90f2d703bbcf5512 +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py311h9f3472d_0.conda#555b148cafbd96b658499060d5e11a65 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.42.0-h5f92351_0.conda#9862a9cd17ade6d0e72b4c0a10123cf2 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.5-py311h0f3be63_0.conda#d4718e47a353473a8238fe1133ddb2ca +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py311h8b974bf_102.conda#d748aad3050d26241842b76d56424cf9 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.2.0-pyha770c72_0.conda#17e487cc8b5507cd3abc09398cf27949 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda#f6082eae112814f1447b56a5e1f6ed05 +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py311hed34c8f_0.conda#da5233c4060f1c830179659f02ac1b68 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py311h9f3472d_0.conda#648bccc358ec5b19dec01a5685f3aeb9 +https://conda.anaconda.org/conda-forge/noarch/iris-3.12.2-pyha770c72_0.conda#281bb211efe112ed90f2d703bbcf5512 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda#e9fb3fe8a5b758b4aff187d434f94f03 diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 51b7a3df..f641112d 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -8,22 +8,22 @@ https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222 https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.7.14-hbd8a1cb_0.conda#d16c90324aef024877d8713c0b7fea5b https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda#0be7c6e070c19105f966d3758448d018 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_3.conda#3cd1a7238a0dd3d0860fdefc496cc854 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda#3baf8976c96134738bba224e9ef6b1e5 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_3.conda#9e60c55e725c20d23125a5f0dd69af5d +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda#f406dcbb2e7bef90d793e50e79a2882b https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_3.conda#cb98af5db26e3f482bebb80ce9d947d3 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.24-h86f0d12_0.conda#64f0c503da58ec25ebd359e4d990afa8 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda#4211416ecba1866fab0c6470986c22d6 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_3.conda#e66f2b8ad787e7beb0f846e4bd7e8493 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_3.conda#530566b68c3b8ce7eec4cd047eae19fe +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda#28771437ffcd9f3417c66012dc49a3be +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_4.conda#8a4ab7ff06e4db0be22485332666da0f https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_3.conda#6d11a5edae89fe413c0569f16d308f5a +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.conda#3c376af8888c386b9d3d1c2701e2f3ab https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 @@ -42,11 +42,12 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_3.co https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_3.conda#3facafe58f3858eb95527c7d3a3fc578 https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_3.conda#bfbca721fd33188ef923dfe9ba172f29 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_4.conda#53e876bc2d2648319e94c33c57b9ec74 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.50-h943b412_0.conda#51de14db340a848869e69c632b43cca7 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.50-h421ea60_1.conda#7af8e91b0deb5f8e25d1a595dea79614 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda#0b367fad34931cb79e0d6b7e5c06bb1c https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_3.conda#57541755b5a51691955012b8e197c06c +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_4.conda#2d34729cbc1da0ec988e57b13b712067 https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 @@ -68,29 +69,15 @@ https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.con https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_1.conda#7e2ba4ca7e6ffebb7f7fc2da2744df61 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hf01ce69_5.conda#e79a094918988bb1807462cd42c83962 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba +https://conda.anaconda.org/conda-forge/linux-64/python-3.12.11-h9e4cc4f_0_cpython.conda#94206474a5608243a10c92cefbe0908f https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.4-hbc0de68_0.conda#8376bd3854542be0c8c7cd07525d31c6 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 -https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_3.conda#5d08a0ac29e6a5a984817584775d4131 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-32_h59b9bed_openblas.conda#2af9f3d5c2e39f417ce040f5a35c40c6 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 -https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.3-hee844dc_1.conda#18d2ac95b507ada9ca159a6bd73255f7 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h4bc477f_0.conda#14dbe05b929e329dbaa6f2d0aa19466d -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda#c74d83614aec66227ae5199d98852aaf -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-32_he106b2a_openblas.conda#3d3f9355e52f269cd8bc2c440d8a5263 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-32_h7ac8fdf_openblas.conda#6c3f04ccb6c578138e9f9899da0bd714 -https://conda.anaconda.org/conda-forge/linux-64/python-3.12.11-h9e4cc4f_0_cpython.conda#94206474a5608243a10c92cefbe0908f -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.3-heff268d_1.conda#a4cfbd4bc4cf834779a5383519f9eb5a -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.2-pyhd8ed1ab_0.conda#eb9d4263271ca287d2e0cf5a86da2d3a https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_3.conda#5d08a0ac29e6a5a984817584775d4131 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_3.conda#a32e0c069f6c3dcac635f7b0b0dac67e https://conda.anaconda.org/conda-forge/noarch/cachetools-6.1.0-pyhd8ed1ab_0.conda#f84eb05fa7f862602bfaf4dd844bd61b https://conda.anaconda.org/conda-forge/noarch/certifi-2025.7.14-pyhd8ed1ab_0.conda#4c07624f3faefd0bb6659fb7396cfa76 @@ -105,8 +92,7 @@ https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#4 https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda#4547b39256e296bb758166893e909a7c -https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db -https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 +https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.7.0-pyhd8ed1ab_0.conda#a31ce802cd0ebfce298f342c02757019 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac @@ -115,20 +101,22 @@ https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.b https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.8-py312h68727a3_1.conda#a8ea818e46addfa842348701a9dbe8f8 -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h0134ee8_117.conda#a979c07e8fc0e3f61c24a65d16cc6fbe +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-32_h59b9bed_openblas.conda#2af9f3d5c2e39f417ce040f5a35c40c6 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 +https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h4bc477f_0.conda#14dbe05b929e329dbaa6f2d0aa19466d https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda#eb227c3e0bf58f5bd69c0532b157975b https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.2-py312h33ff503_0.conda#3f6efbc40eb13f019c856c410fa921d2 +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 -https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py312h80c1187_0.conda#7911e727a6c24db662193a960b81b6b2 https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda#424844562f5d337077b445ec6b1398a7 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h0054346_0.conda#78880cde19cf47cbec3025fc81bfe4bc https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhd8ed1ab_1.conda#513d3c262ee49b54a8fec85c5bc99764 -https://conda.anaconda.org/conda-forge/noarch/pyshp-2.4.0-pyhd8ed1ab_0.conda#14183a69259a0481a14668ec140abb1a +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhe01879c_2.conda#aa0028616c0750c773698fdc254b2b8d +https://conda.anaconda.org/conda-forge/noarch/pyshp-2.4.1-pyhd8ed1ab_0.conda#fd63e22cf63e045390fab5ce5b86093d https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f0_2.conda#cc3f6c452697c1cf7e4e6e5f21861f96 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 @@ -139,58 +127,70 @@ https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda#755cf22df8693aa0d1aec1c123fa5863 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 -https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda#ac944244f1fed2eb49bae07193ae8215 +https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda#30a0a26c8abccf4b7991d590fe17c699 https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_1.conda#40d0ed782a8aaa16ef248e68c06c168d https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda#e523f4f1e980ed7a4240d7e27e9ec81f https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py312h66e93f0_0.conda#617f5d608ff8c28ad546e5d9671cbb95 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda#a861504bbea4161a9170b85d4d2be840 -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312hc0a28a1_1.conda#990033147b0a998e756eaaed6b28f48d -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py312h68727a3_0.conda#e688276449452cdfe9f8f5d3e74c23f6 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.0-py312h8a5da7c_0.conda#10c5a17b4546b4e236031ef8177cf9d1 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.1-py312h8a5da7c_0.conda#712f11dddb6b50bce51ed11a73b6d9c2 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.59.0-py312h8a5da7c_0.conda#008d44a468c24a59d2e67c014fba8f12 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda#c74d83614aec66227ae5199d98852aaf https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.5-h1920b20_0.conda#ec8824a45bd7c50a46788fa16216d6c2 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 -https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h66e93f0_1.conda#5fef67f50126f40f5966a9451661280d +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-32_he106b2a_openblas.conda#3d3f9355e52f269cd8bc2c440d8a5263 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-32_h7ac8fdf_openblas.conda#6c3f04ccb6c578138e9f9899da0bd714 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh8b19718_0.conda#32d0781ace05105cc99af55d36cbec7c -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py312h03c6e1f_1.conda#f754591f9ec0169e436fa84cb9db0c32 +https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py312h80c1187_0.conda#7911e727a6c24db662193a960b81b6b2 +https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh8b19718_0.conda#dfce4b2af4bfe90cdcaf56ca0b28ddf5 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h18fbb6c_1.conda#e025fd9cad1b925649589ac3af385e37 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.1-pyhe01879c_0.conda#8200884fd84ab8754567d8523b52eaa8 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.0-py312hf734454_0.conda#7513ac56209d27a85ffa1582033f10a8 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py312h21f5128_0.conda#d38eb6d34385f82b02ff776a66977cc4 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda#75be1a943e0a7f99fcf118309092c635 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.32.0-pyhd8ed1ab_0.conda#3d6c6f6498c5fb6587dc03ff9541feeb -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py312hc0a28a1_0.conda#8b5b812d4c18cb37bda7a7c8d3a6acb3 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.7.0-pyhe01879c_1.conda#3293644021329a96c606c3d95e180991 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.42.0-h5f92351_0.conda#9862a9cd17ade6d0e72b4c0a10123cf2 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.3-py312hd3ec401_0.conda#2d69618b52d70970c81cc598e4b51118 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py312h3805cb1_102.conda#c1358b48677cfc7095cd664f1f0647a1 +https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h21f7587_118.conda#5f05af73150f62adab1492ab2d18d573 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.2-py312h33ff503_0.conda#3f6efbc40eb13f019c856c410fa921d2 +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py312h03c6e1f_1.conda#f754591f9ec0169e436fa84cb9db0c32 https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda#a49c2283f24696a7b30367b7346a0144 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.3.1-pyhd8ed1ab_0.conda#996376098e3648237b3efb0e0ad460c1 -https://conda.anaconda.org/conda-forge/noarch/tox-4.28.1-pyhe01879c_0.conda#4f8bd3602709b7ea763d625c6a7f42f2 +https://conda.anaconda.org/conda-forge/noarch/tox-4.28.4-pyhe01879c_0.conda#7a2f30d7eebf91ad7320ff2fc9934261 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h68727a3_5.conda#f9664ee31aed96c85b7319ab0a693341 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312h66e93f0_2.conda#630db208bc7bbb96725ce9832c7423bb -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.24.0-py312hf9745cd_0.conda#ea213e31805199cb7d0da457b879ceed +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312hc0a28a1_1.conda#990033147b0a998e756eaaed6b28f48d +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312hd9148b4_1.conda#e25ed6c2e3b1effedfe9cd10a15ca8d8 https://conda.anaconda.org/conda-forge/noarch/identify-2.6.12-pyhd8ed1ab_0.conda#84463b10c1eb198541cd54125c7efe90 +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.5-h1920b20_0.conda#ec8824a45bd7c50a46788fa16216d6c2 +https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h66e93f0_1.conda#5fef67f50126f40f5966a9451661280d https://conda.anaconda.org/conda-forge/noarch/nox-2025.5.1-pyhe01879c_0.conda#f294cc5e7c84a0422fcc57f33313e084 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.2.1-pyhd8ed1ab_0.conda#ce978e1b9ed8b8d49164e90a5cdc94cd https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.1-pyhd8ed1ab_0.conda#11b313328806f1dfbab0eb1d219388c4 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py312hc0a28a1_0.conda#476b0357e207e10d2b7b13ed82156e6d +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.0-py312hf734454_0.conda#7513ac56209d27a85ffa1582033f10a8 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.3.1-hd8ed1ab_0.conda#38ca080dff1a30a6fd3aec989062b255 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py312h21f5128_0.conda#d38eb6d34385f82b02ff776a66977cc4 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a -https://conda.anaconda.org/conda-forge/noarch/iris-3.12.2-pyha770c72_0.conda#281bb211efe112ed90f2d703bbcf5512 +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py312hc0a28a1_0.conda#8b5b812d4c18cb37bda7a7c8d3a6acb3 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.42.0-h5f92351_0.conda#9862a9cd17ade6d0e72b4c0a10123cf2 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.5-py312he3d6523_0.conda#9246288e5ef2a944f7c9c648f9f331c7 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py312h3805cb1_102.conda#c1358b48677cfc7095cd664f1f0647a1 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.2.0-pyha770c72_0.conda#17e487cc8b5507cd3abc09398cf27949 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda#f6082eae112814f1447b56a5e1f6ed05 +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py312hf79963d_0.conda#7242926a8932e552f3ce5b77884b52db https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py312hc0a28a1_0.conda#476b0357e207e10d2b7b13ed82156e6d +https://conda.anaconda.org/conda-forge/noarch/iris-3.12.2-pyha770c72_0.conda#281bb211efe112ed90f2d703bbcf5512 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda#e9fb3fe8a5b758b4aff187d434f94f03 From 8ea5af3c750b5b36a9a7ea121b643183c09429c7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Aug 2025 11:57:53 +0100 Subject: [PATCH 481/583] Bump scitools/workflows in the dependencies group (#681) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2025.07.3 to 2025.08.0 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.07.3...2025.08.0) --- updated-dependencies: - dependency-name: scitools/workflows dependency-version: 2025.08.0 dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/ci-template-check.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index aa0fe51b..db3d1283 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.07.3 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.08.0 diff --git a/.github/workflows/ci-template-check.yml b/.github/workflows/ci-template-check.yml index d2d25258..895399ca 100644 --- a/.github/workflows/ci-template-check.yml +++ b/.github/workflows/ci-template-check.yml @@ -10,7 +10,7 @@ on: jobs: prompt-share: - uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.07.3 + uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.08.0 secrets: inherit with: pr_number: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index f119bc9a..90493b4c 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.07.3 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.08.0 secrets: inherit From 248677cecb924613e20284d5e51a0fe9aefac7df Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Tue, 12 Aug 2025 11:59:02 +0100 Subject: [PATCH 482/583] Updated environment lockfiles (#682) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 29 ++++++++++++------------ requirements/locks/py311-linux-64.lock | 31 +++++++++++++------------- requirements/locks/py312-linux-64.lock | 31 +++++++++++++------------- 3 files changed, 44 insertions(+), 47 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 2dc81743..76ce2d07 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -5,7 +5,7 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.conda#05e00f3b21e88bb3d658ac700b2ce58c https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a -https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.7.14-hbd8a1cb_0.conda#d16c90324aef024877d8713c0b7fea5b +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda#74784ee3d225fc3dca89edb635b4e5cc https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda#0be7c6e070c19105f966d3758448d018 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda#3baf8976c96134738bba224e9ef6b1e5 @@ -27,7 +27,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.cond https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.1-h7b32b05_0.conda#c87df2ab1448ba69169652ab9547082d +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.2-h26f9b46_0.conda#ffffb341206dd0dab0c36053c048d621 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 @@ -52,6 +52,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.co https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h2cb61b6_1.conda#42a8e4b54e322b4cd1dbfb30a8a7ce9e https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_0.conda#3d8da0248bdae970b4ade636a104b7f5 @@ -61,7 +62,6 @@ https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_3.conda#58178ef8ba927229fba6d84abf62c108 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 -https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.conda#3c255be50a506c50765a93a6644f32fe https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d @@ -80,7 +80,7 @@ https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a1 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_3.conda#5d08a0ac29e6a5a984817584775d4131 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_3.conda#63d24a5dd21c738d706f91569dbd1892 https://conda.anaconda.org/conda-forge/noarch/cachetools-6.1.0-pyhd8ed1ab_0.conda#f84eb05fa7f862602bfaf4dd844bd61b -https://conda.anaconda.org/conda-forge/noarch/certifi-2025.7.14-pyhd8ed1ab_0.conda#4c07624f3faefd0bb6659fb7396cfa76 +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda#11f59985f49df4620890f3e746ed7102 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.2-pyhd8ed1ab_0.conda#40fe4284b8b5835a9073a645139f35af @@ -102,21 +102,20 @@ https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.8-py310h3788b33_1.conda#b70dd76da5231e6073fd44c42a1d78c5 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-32_h59b9bed_openblas.conda#2af9f3d5c2e39f417ce040f5a35c40c6 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-34_h59b9bed_openblas.conda#064c22bac20fecf2a99838f9b979374c https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h4bc477f_0.conda#14dbe05b929e329dbaa6f2d0aa19466d https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py310h89163eb_1.conda#8ce3f0332fd6de0d737e2911d329523f https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h55fea9a_1.conda#01243c4aaf71bde0297966125aea4706 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda#424844562f5d337077b445ec6b1398a7 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhe01879c_2.conda#aa0028616c0750c773698fdc254b2b8d -https://conda.anaconda.org/conda-forge/noarch/pyshp-2.4.1-pyhd8ed1ab_0.conda#fd63e22cf63e045390fab5ce5b86093d +https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.0-pyhd8ed1ab_0.conda#0e2556d607ec4bd6a765fe5a0e64ad74 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py310ha75aee5_2.conda#af6da4542e91edaf59b614ce7e991700 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 @@ -136,7 +135,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0. https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h8deb56e_0.conda#1fc24a3196ad5ede2a68148be61894f4 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.1-py310h3406613_0.conda#ac2715e7efc966c105f45d0cc8dfc4cb +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.2-py310h3406613_0.conda#c03cc1310dc3059463e52ba1062e1689 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.59.0-py310h3406613_0.conda#dc2e5602e20bbffb18314a70094b3c4a @@ -146,8 +145,8 @@ https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.c https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-32_he106b2a_openblas.conda#3d3f9355e52f269cd8bc2c440d8a5263 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-32_h7ac8fdf_openblas.conda#6c3f04ccb6c578138e9f9899da0bd714 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-34_he106b2a_openblas.conda#148b531b5457ad666ed76ceb4c766505 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-34_h7ac8fdf_openblas.conda#f05a31377b4d9a8d8740f47d1e70b70e https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py310h7e6dc6c_0.conda#e609995f031bc848be8ea159865e8afc @@ -156,7 +155,7 @@ https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h18fbb6c_1.conda#e025 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.1-pyhe01879c_0.conda#8200884fd84ab8754567d8523b52eaa8 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda#75be1a943e0a7f99fcf118309092c635 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.32.0-pyhd8ed1ab_0.conda#3d6c6f6498c5fb6587dc03ff9541feeb +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.33.1-pyhd8ed1ab_0.conda#3f6ee060b1462c29b3442df71939a358 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.7.0-h40b2b14_1.conda#8a77895fb29728b736a1a6c75906ea1a @@ -164,7 +163,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h21f7587_1 https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.6-py310hefbff90_0.conda#b0cea2c364bf65cd19e023040eeab05d https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py310h71d0299_1.conda#e54b1eaeb50ad1767680181a8575a8db https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda#a49c2283f24696a7b30367b7346a0144 -https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.3.1-pyhd8ed1ab_0.conda#996376098e3648237b3efb0e0ad460c1 +https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.0.1-pyhd8ed1ab_0.conda#6c87f9ad6267cf3bfdec22f4b5a183bc https://conda.anaconda.org/conda-forge/noarch/tox-4.28.4-pyhe01879c_0.conda#7a2f30d7eebf91ad7320ff2fc9934261 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310h3788b33_5.conda#e05b0475166b68c9dc4d7937e0315654 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha75aee5_2.conda#f9254b5b0193982416b91edcb4b2676f @@ -172,13 +171,13 @@ https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310hf462985_1.con https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py310h3788b33_0.conda#b6420d29123c7c823de168f49ccdfe6a https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 https://conda.anaconda.org/conda-forge/noarch/identify-2.6.12-pyhd8ed1ab_0.conda#84463b10c1eb198541cd54125c7efe90 -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.5-h1920b20_0.conda#ec8824a45bd7c50a46788fa16216d6c2 +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a04073db11c2c86c555fb088acc8f8c1 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py310ha75aee5_1.conda#48781b625a5c7701e04d222752cb2f62 https://conda.anaconda.org/conda-forge/noarch/nox-2025.5.1-pyhe01879c_0.conda#f294cc5e7c84a0422fcc57f33313e084 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.2.1-pyhd8ed1ab_0.conda#ce978e1b9ed8b8d49164e90a5cdc94cd https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.1-pyhd8ed1ab_0.conda#11b313328806f1dfbab0eb1d219388c4 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.conda#8c29cd33b64b2eb78597fa28b5595c8d -https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.3.1-hd8ed1ab_0.conda#38ca080dff1a30a6fd3aec989062b255 +https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.0.1-hd8ed1ab_0.conda#c4f46752295606e97abd5dc96ae75fbe https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py310h247727d_0.conda#78ae955878da938d98aa828413263284 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py310hf462985_0.conda#c31938674e4cda43617a4d70f99ffd0c diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 6cfcf3c0..e0547245 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -5,7 +5,7 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda#8fcb6b0e2161850556231336dae58358 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a -https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.7.14-hbd8a1cb_0.conda#d16c90324aef024877d8713c0b7fea5b +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda#74784ee3d225fc3dca89edb635b4e5cc https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda#0be7c6e070c19105f966d3758448d018 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda#3baf8976c96134738bba224e9ef6b1e5 @@ -27,7 +27,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.cond https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.1-h7b32b05_0.conda#c87df2ab1448ba69169652ab9547082d +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.2-h26f9b46_0.conda#ffffb341206dd0dab0c36053c048d621 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 @@ -52,6 +52,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.co https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h2cb61b6_1.conda#42a8e4b54e322b4cd1dbfb30a8a7ce9e https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_0.conda#3d8da0248bdae970b4ade636a104b7f5 @@ -61,7 +62,6 @@ https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_3.conda#58178ef8ba927229fba6d84abf62c108 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 -https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.conda#3c255be50a506c50765a93a6644f32fe https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d @@ -80,7 +80,7 @@ https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a1 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_3.conda#5d08a0ac29e6a5a984817584775d4131 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hfdbb021_3.conda#8565f7297b28af62e5de2d968ca32e31 https://conda.anaconda.org/conda-forge/noarch/cachetools-6.1.0-pyhd8ed1ab_0.conda#f84eb05fa7f862602bfaf4dd844bd61b -https://conda.anaconda.org/conda-forge/noarch/certifi-2025.7.14-pyhd8ed1ab_0.conda#4c07624f3faefd0bb6659fb7396cfa76 +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda#11f59985f49df4620890f3e746ed7102 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.2-pyhd8ed1ab_0.conda#40fe4284b8b5835a9073a645139f35af @@ -102,21 +102,20 @@ https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.8-py311hd18a35c_1.conda#bb17b97b0c0d86e052134bf21af5c03d https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-32_h59b9bed_openblas.conda#2af9f3d5c2e39f417ce040f5a35c40c6 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-34_h59b9bed_openblas.conda#064c22bac20fecf2a99838f9b979374c https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h4bc477f_0.conda#14dbe05b929e329dbaa6f2d0aa19466d https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py311h2dc5d0c_1.conda#6565a715337ae279e351d0abd8ffe88a https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h55fea9a_1.conda#01243c4aaf71bde0297966125aea4706 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda#424844562f5d337077b445ec6b1398a7 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhe01879c_2.conda#aa0028616c0750c773698fdc254b2b8d -https://conda.anaconda.org/conda-forge/noarch/pyshp-2.4.1-pyhd8ed1ab_0.conda#fd63e22cf63e045390fab5ce5b86093d +https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.0-pyhd8ed1ab_0.conda#0e2556d607ec4bd6a765fe5a0e64ad74 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py311h9ecbd09_2.conda#4b49b833ad54b3e26da1e743a4e4bc13 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 @@ -137,7 +136,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0. https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311hf29c0ef_0.conda#55553ecd5328336368db611f350b7039 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.1-py311h3778330_0.conda#ad5c4453544b1bbbb9cc29e4ab9a97cd +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.2-py311h3778330_0.conda#db7bfab113866fc693c0e0dc0a17ce9e https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.59.0-py311h3778330_0.conda#2eaecc2e416852815abb85dc47d425b3 @@ -147,8 +146,8 @@ https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.c https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-32_he106b2a_openblas.conda#3d3f9355e52f269cd8bc2c440d8a5263 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-32_h7ac8fdf_openblas.conda#6c3f04ccb6c578138e9f9899da0bd714 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-34_he106b2a_openblas.conda#148b531b5457ad666ed76ceb4c766505 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-34_h7ac8fdf_openblas.conda#f05a31377b4d9a8d8740f47d1e70b70e https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py311h1322bbf_0.conda#8b4568b1357f5ec5494e36b06076c3a1 @@ -157,7 +156,7 @@ https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h18fbb6c_1.conda#e025 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.1-pyhe01879c_0.conda#8200884fd84ab8754567d8523b52eaa8 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda#75be1a943e0a7f99fcf118309092c635 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.32.0-pyhd8ed1ab_0.conda#3d6c6f6498c5fb6587dc03ff9541feeb +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.33.1-pyhd8ed1ab_0.conda#3f6ee060b1462c29b3442df71939a358 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.7.0-pyhe01879c_1.conda#3293644021329a96c606c3d95e180991 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 @@ -165,20 +164,20 @@ https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h21f7587_1 https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.2-py311h2e04523_0.conda#61e1b42eb1d9f0ebaf038522ce9ca2fe https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py311h0960b38_1.conda#5e6251fd41d984a9d4fd1fe4b9bdca31 https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda#a49c2283f24696a7b30367b7346a0144 -https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.3.1-pyhd8ed1ab_0.conda#996376098e3648237b3efb0e0ad460c1 +https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.0.1-pyhd8ed1ab_0.conda#6c87f9ad6267cf3bfdec22f4b5a183bc https://conda.anaconda.org/conda-forge/noarch/tox-4.28.4-pyhe01879c_0.conda#7a2f30d7eebf91ad7320ff2fc9934261 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hd18a35c_5.conda#4e8447ca8558a203ec0577b4730073f3 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311h9ecbd09_2.conda#ca02de88df1cc3cfc8f24766ff50cb3c https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h9f3472d_1.conda#2c3c4f115d28ed9e001a271d5d8585aa https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py311hdf67eae_1.conda#390f9e645ff2f4b9cf48d53b3cf6c942 https://conda.anaconda.org/conda-forge/noarch/identify-2.6.12-pyhd8ed1ab_0.conda#84463b10c1eb198541cd54125c7efe90 -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.5-h1920b20_0.conda#ec8824a45bd7c50a46788fa16216d6c2 +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a04073db11c2c86c555fb088acc8f8c1 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py311h9ecbd09_1.conda#28d6b63784b350a2906dc264ad8c7f2a https://conda.anaconda.org/conda-forge/noarch/nox-2025.5.1-pyhe01879c_0.conda#f294cc5e7c84a0422fcc57f33313e084 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.2.1-pyhd8ed1ab_0.conda#ce978e1b9ed8b8d49164e90a5cdc94cd https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.1-pyhd8ed1ab_0.conda#11b313328806f1dfbab0eb1d219388c4 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.0-py311h2d3ef60_0.conda#87f6abadb59e4b17fc3a7b666faa721f -https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.3.1-hd8ed1ab_0.conda#38ca080dff1a30a6fd3aec989062b255 +https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.0.1-hd8ed1ab_0.conda#c4f46752295606e97abd5dc96ae75fbe https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py311h3dc67b8_0.conda#ea7501cf4d40188cc662b29bcc07f13b https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py311h9f3472d_0.conda#555b148cafbd96b658499060d5e11a65 @@ -190,7 +189,7 @@ https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py311hed34c8f_0.conda#da5233c4060f1c830179659f02ac1b68 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py311h9f3472d_0.conda#648bccc358ec5b19dec01a5685f3aeb9 -https://conda.anaconda.org/conda-forge/noarch/iris-3.12.2-pyha770c72_0.conda#281bb211efe112ed90f2d703bbcf5512 +https://conda.anaconda.org/conda-forge/noarch/iris-3.13.0-pyha770c72_0.conda#1f2b6ad3768df0c343d8af7fdb10c861 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda#e9fb3fe8a5b758b4aff187d434f94f03 diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index f641112d..a881402f 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -5,7 +5,7 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda#c3efd25ac4d74b1584d2f7a57195ddf1 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a -https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.7.14-hbd8a1cb_0.conda#d16c90324aef024877d8713c0b7fea5b +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda#74784ee3d225fc3dca89edb635b4e5cc https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda#0be7c6e070c19105f966d3758448d018 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda#3baf8976c96134738bba224e9ef6b1e5 @@ -27,7 +27,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.cond https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.1-h7b32b05_0.conda#c87df2ab1448ba69169652ab9547082d +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.2-h26f9b46_0.conda#ffffb341206dd0dab0c36053c048d621 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 @@ -52,6 +52,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.co https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h2cb61b6_1.conda#42a8e4b54e322b4cd1dbfb30a8a7ce9e https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_0.conda#3d8da0248bdae970b4ade636a104b7f5 @@ -61,7 +62,6 @@ https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_3.conda#58178ef8ba927229fba6d84abf62c108 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 -https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.conda#3c255be50a506c50765a93a6644f32fe https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d @@ -80,7 +80,7 @@ https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a1 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_3.conda#5d08a0ac29e6a5a984817584775d4131 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_3.conda#a32e0c069f6c3dcac635f7b0b0dac67e https://conda.anaconda.org/conda-forge/noarch/cachetools-6.1.0-pyhd8ed1ab_0.conda#f84eb05fa7f862602bfaf4dd844bd61b -https://conda.anaconda.org/conda-forge/noarch/certifi-2025.7.14-pyhd8ed1ab_0.conda#4c07624f3faefd0bb6659fb7396cfa76 +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda#11f59985f49df4620890f3e746ed7102 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.2-pyhd8ed1ab_0.conda#40fe4284b8b5835a9073a645139f35af @@ -102,21 +102,20 @@ https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.8-py312h68727a3_1.conda#a8ea818e46addfa842348701a9dbe8f8 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-32_h59b9bed_openblas.conda#2af9f3d5c2e39f417ce040f5a35c40c6 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-34_h59b9bed_openblas.conda#064c22bac20fecf2a99838f9b979374c https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h4bc477f_0.conda#14dbe05b929e329dbaa6f2d0aa19466d https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda#eb227c3e0bf58f5bd69c0532b157975b https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda#9e5816bc95d285c115a3ebc2f8563564 +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h55fea9a_1.conda#01243c4aaf71bde0297966125aea4706 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda#424844562f5d337077b445ec6b1398a7 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhe01879c_2.conda#aa0028616c0750c773698fdc254b2b8d -https://conda.anaconda.org/conda-forge/noarch/pyshp-2.4.1-pyhd8ed1ab_0.conda#fd63e22cf63e045390fab5ce5b86093d +https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.0-pyhd8ed1ab_0.conda#0e2556d607ec4bd6a765fe5a0e64ad74 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f0_2.conda#cc3f6c452697c1cf7e4e6e5f21861f96 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 @@ -137,7 +136,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0. https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda#a861504bbea4161a9170b85d4d2be840 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.1-py312h8a5da7c_0.conda#712f11dddb6b50bce51ed11a73b6d9c2 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.2-py312h8a5da7c_0.conda#f8830a2249f4b8a5f9c33cb44ad5c31a https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.59.0-py312h8a5da7c_0.conda#008d44a468c24a59d2e67c014fba8f12 @@ -147,8 +146,8 @@ https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.c https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-32_he106b2a_openblas.conda#3d3f9355e52f269cd8bc2c440d8a5263 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-32_h7ac8fdf_openblas.conda#6c3f04ccb6c578138e9f9899da0bd714 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-34_he106b2a_openblas.conda#148b531b5457ad666ed76ceb4c766505 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-34_h7ac8fdf_openblas.conda#f05a31377b4d9a8d8740f47d1e70b70e https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py312h80c1187_0.conda#7911e727a6c24db662193a960b81b6b2 @@ -157,7 +156,7 @@ https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h18fbb6c_1.conda#e025 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.1-pyhe01879c_0.conda#8200884fd84ab8754567d8523b52eaa8 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda#75be1a943e0a7f99fcf118309092c635 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.32.0-pyhd8ed1ab_0.conda#3d6c6f6498c5fb6587dc03ff9541feeb +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.33.1-pyhd8ed1ab_0.conda#3f6ee060b1462c29b3442df71939a358 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.7.0-pyhe01879c_1.conda#3293644021329a96c606c3d95e180991 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 @@ -165,20 +164,20 @@ https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h21f7587_1 https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.2-py312h33ff503_0.conda#3f6efbc40eb13f019c856c410fa921d2 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py312h03c6e1f_1.conda#f754591f9ec0169e436fa84cb9db0c32 https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda#a49c2283f24696a7b30367b7346a0144 -https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.3.1-pyhd8ed1ab_0.conda#996376098e3648237b3efb0e0ad460c1 +https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.0.1-pyhd8ed1ab_0.conda#6c87f9ad6267cf3bfdec22f4b5a183bc https://conda.anaconda.org/conda-forge/noarch/tox-4.28.4-pyhe01879c_0.conda#7a2f30d7eebf91ad7320ff2fc9934261 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h68727a3_5.conda#f9664ee31aed96c85b7319ab0a693341 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312h66e93f0_2.conda#630db208bc7bbb96725ce9832c7423bb https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312hc0a28a1_1.conda#990033147b0a998e756eaaed6b28f48d https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312hd9148b4_1.conda#e25ed6c2e3b1effedfe9cd10a15ca8d8 https://conda.anaconda.org/conda-forge/noarch/identify-2.6.12-pyhd8ed1ab_0.conda#84463b10c1eb198541cd54125c7efe90 -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.5-h1920b20_0.conda#ec8824a45bd7c50a46788fa16216d6c2 +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a04073db11c2c86c555fb088acc8f8c1 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h66e93f0_1.conda#5fef67f50126f40f5966a9451661280d https://conda.anaconda.org/conda-forge/noarch/nox-2025.5.1-pyhe01879c_0.conda#f294cc5e7c84a0422fcc57f33313e084 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.2.1-pyhd8ed1ab_0.conda#ce978e1b9ed8b8d49164e90a5cdc94cd https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.1-pyhd8ed1ab_0.conda#11b313328806f1dfbab0eb1d219388c4 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.0-py312hf734454_0.conda#7513ac56209d27a85ffa1582033f10a8 -https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-8.3.1-hd8ed1ab_0.conda#38ca080dff1a30a6fd3aec989062b255 +https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.0.1-hd8ed1ab_0.conda#c4f46752295606e97abd5dc96ae75fbe https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py312h21f5128_0.conda#d38eb6d34385f82b02ff776a66977cc4 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py312hc0a28a1_0.conda#8b5b812d4c18cb37bda7a7c8d3a6acb3 @@ -190,7 +189,7 @@ https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py312hf79963d_0.conda#7242926a8932e552f3ce5b77884b52db https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py312hc0a28a1_0.conda#476b0357e207e10d2b7b13ed82156e6d -https://conda.anaconda.org/conda-forge/noarch/iris-3.12.2-pyha770c72_0.conda#281bb211efe112ed90f2d703bbcf5512 +https://conda.anaconda.org/conda-forge/noarch/iris-3.13.0-pyha770c72_0.conda#1f2b6ad3768df0c343d8af7fdb10c861 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda#e9fb3fe8a5b758b4aff187d434f94f03 From 6ca206a2939b9d1ba5e6b4ba1760279af5e8b8c6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Aug 2025 08:39:29 +0100 Subject: [PATCH 483/583] Bump the dependencies group with 2 updates (#683) Bumps the dependencies group with 2 updates: [scitools/workflows](https://github.com/scitools/workflows) and [actions/checkout](https://github.com/actions/checkout). Updates `scitools/workflows` from 2025.08.0 to 2025.08.2 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.08.0...2025.08.2) Updates `actions/checkout` from 4 to 5 - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v4...v5) --- updated-dependencies: - dependency-name: scitools/workflows dependency-version: 2025.08.2 dependency-type: direct:production dependency-group: dependencies - dependency-name: actions/checkout dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/ci-template-check.yml | 2 +- .github/workflows/ci-tests.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index db3d1283..39be3933 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.08.0 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.08.2 diff --git a/.github/workflows/ci-template-check.yml b/.github/workflows/ci-template-check.yml index 895399ca..e443ea41 100644 --- a/.github/workflows/ci-template-check.yml +++ b/.github/workflows/ci-template-check.yml @@ -10,7 +10,7 @@ on: jobs: prompt-share: - uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.08.0 + uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.08.2 secrets: inherit with: pr_number: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/ci-tests.yml b/.github/workflows/ci-tests.yml index 83a8d183..6f5322b1 100644 --- a/.github/workflows/ci-tests.yml +++ b/.github/workflows/ci-tests.yml @@ -63,7 +63,7 @@ jobs: steps: - name: "checkout" - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: "environment configure" env: diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 90493b4c..f20db198 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.08.0 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.08.2 secrets: inherit From 9ed655dc7498b04b7228cf96e25ca24587fb330d Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Fri, 29 Aug 2025 15:01:15 +0100 Subject: [PATCH 484/583] Updated environment lockfiles (#684) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 36 +++++++++++----------- requirements/locks/py311-linux-64.lock | 42 +++++++++++++------------- requirements/locks/py312-linux-64.lock | 42 +++++++++++++------------- 3 files changed, 60 insertions(+), 60 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 76ce2d07..80d5b72b 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -13,13 +13,14 @@ https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2# https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda#f406dcbb2e7bef90d793e50e79a2882b https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be +https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_3.conda#cb98af5db26e3f482bebb80ce9d947d3 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.24-h86f0d12_0.conda#64f0c503da58ec25ebd359e4d990afa8 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda#4211416ecba1866fab0c6470986c22d6 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda#28771437ffcd9f3417c66012dc49a3be https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_4.conda#8a4ab7ff06e4db0be22485332666da0f -https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 +https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 @@ -35,7 +36,6 @@ https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb47aa4a_0.conda#60 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.1-h97f6797_0.conda#5bc18c66111bc94532b0d2df00731c66 -https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.4-h3f801dc_0.conda#01ba04e414e47f95c03d6ddd81fd37be https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_3.conda#1c6eecffad553bde44c5238770cfb7da @@ -66,8 +66,8 @@ https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f4 https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.conda#3c255be50a506c50765a93a6644f32fe https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_1.conda#7e2ba4ca7e6ffebb7f7fc2da2744df61 -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hf01ce69_5.conda#e79a094918988bb1807462cd42c83962 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_2.conda#dfc5aae7b043d9f56ba99514d5e60625 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-h8261f1e_6.conda#b6093922931b535a7ba566b6f384fbe6 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/python-3.10.18-hd6af730_0_cpython.conda#4ea0c77cdcb0b81813a0436b162d7316 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 @@ -83,7 +83,7 @@ https://conda.anaconda.org/conda-forge/noarch/cachetools-6.1.0-pyhd8ed1ab_0.cond https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda#11f59985f49df4620890f3e746ed7102 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.2-pyhd8ed1ab_0.conda#40fe4284b8b5835a9073a645139f35af +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda#7e7d5ef1b9ed630e4a1c358d6bc62284 https://conda.anaconda.org/conda-forge/noarch/click-8.2.1-pyh707e725_0.conda#94b550b8d3a614dbd326af798c7dfb40 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.1-pyhd8ed1ab_0.conda#364ba6c9fb03886ac979b482f39ebb92 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 @@ -91,7 +91,7 @@ https://conda.anaconda.org/conda-forge/noarch/colorlog-6.9.0-pyh707e725_1.conda# https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc -https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda#4547b39256e296bb758166893e909a7c +https://conda.anaconda.org/conda-forge/noarch/filelock-3.19.1-pyhd8ed1ab_0.conda#9c418d067409452b2e87e0016257da68 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.7.0-pyhd8ed1ab_0.conda#a31ce802cd0ebfce298f342c02757019 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e @@ -100,7 +100,7 @@ https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de -https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.8-py310h3788b33_1.conda#b70dd76da5231e6073fd44c42a1d78c5 +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py310haaf941d_0.conda#b5e7e5df6544fc81102bdea6157a0689 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-34_h59b9bed_openblas.conda#064c22bac20fecf2a99838f9b979374c https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 @@ -115,9 +115,9 @@ https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7d https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhe01879c_2.conda#aa0028616c0750c773698fdc254b2b8d -https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.0-pyhd8ed1ab_0.conda#0e2556d607ec4bd6a765fe5a0e64ad74 +https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.1-pyhd8ed1ab_0.conda#205ac0b2873addb372a4384361990043 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac -https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py310ha75aee5_2.conda#af6da4542e91edaf59b614ce7e991700 +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py310hf3bd8b6_3.conda#b06ac72da31842cedc108eb69e9376d2 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py310h89163eb_2.conda#fd343408e64cf1e273ab7c710da374db https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e @@ -135,10 +135,10 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0. https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h8deb56e_0.conda#1fc24a3196ad5ede2a68148be61894f4 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.2-py310h3406613_0.conda#c03cc1310dc3059463e52ba1062e1689 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.4-py310h3406613_0.conda#ac9c681b16e9b9d24eca83a367b52fcd https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.59.0-py310h3406613_0.conda#dc2e5602e20bbffb18314a70094b3c4a +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.59.1-py310h3406613_0.conda#14e450afac608165ced4b0b93cfc1df1 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda#c74d83614aec66227ae5199d98852aaf @@ -151,11 +151,11 @@ https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py310h7e6dc6c_0.conda#e609995f031bc848be8ea159865e8afc https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh8b19718_0.conda#dfce4b2af4bfe90cdcaf56ca0b28ddf5 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h18fbb6c_1.conda#e025fd9cad1b925649589ac3af385e37 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h18fbb6c_2.conda#1aeede769ec2fa0f474f8b73a7ac057f https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.1-pyhe01879c_0.conda#8200884fd84ab8754567d8523b52eaa8 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda#75be1a943e0a7f99fcf118309092c635 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.33.1-pyhd8ed1ab_0.conda#3f6ee060b1462c29b3442df71939a358 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.34.0-pyhd8ed1ab_0.conda#2bd6c0c96cfc4dbe9bde604a122e3e55 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.7.0-h40b2b14_1.conda#8a77895fb29728b736a1a6c75906ea1a @@ -163,29 +163,29 @@ https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h21f7587_1 https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.6-py310hefbff90_0.conda#b0cea2c364bf65cd19e023040eeab05d https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py310h71d0299_1.conda#e54b1eaeb50ad1767680181a8575a8db https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda#a49c2283f24696a7b30367b7346a0144 -https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.0.1-pyhd8ed1ab_0.conda#6c87f9ad6267cf3bfdec22f4b5a183bc +https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.0-pyhd8ed1ab_0.conda#ad8f901272d56cfb6bf22bb89e9be59b https://conda.anaconda.org/conda-forge/noarch/tox-4.28.4-pyhe01879c_0.conda#7a2f30d7eebf91ad7320ff2fc9934261 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310h3788b33_5.conda#e05b0475166b68c9dc4d7937e0315654 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha75aee5_2.conda#f9254b5b0193982416b91edcb4b2676f https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310hf462985_1.conda#c2d5289e6cbcecf2c549e01772fe5274 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py310h3788b33_0.conda#b6420d29123c7c823de168f49ccdfe6a https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.12-pyhd8ed1ab_0.conda#84463b10c1eb198541cd54125c7efe90 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.13-pyhd8ed1ab_0.conda#52083ce9103ec11c8130ce18517d3e83 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a04073db11c2c86c555fb088acc8f8c1 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py310ha75aee5_1.conda#48781b625a5c7701e04d222752cb2f62 https://conda.anaconda.org/conda-forge/noarch/nox-2025.5.1-pyhe01879c_0.conda#f294cc5e7c84a0422fcc57f33313e084 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.2.1-pyhd8ed1ab_0.conda#ce978e1b9ed8b8d49164e90a5cdc94cd https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.1-pyhd8ed1ab_0.conda#11b313328806f1dfbab0eb1d219388c4 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.conda#8c29cd33b64b2eb78597fa28b5595c8d -https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.0.1-hd8ed1ab_0.conda#c4f46752295606e97abd5dc96ae75fbe +https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.0-hd8ed1ab_0.conda#03323fba6896975dc9ffae39b547c31b https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py310h247727d_0.conda#78ae955878da938d98aa828413263284 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py310hf462985_0.conda#c31938674e4cda43617a4d70f99ffd0c https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.42.0-h5f92351_0.conda#9862a9cd17ade6d0e72b4c0a10123cf2 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.5-py310hfde16b3_0.conda#4478c9e8038113b9f68904200ec80385 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py310haba2683_102.conda#308cc08b61b28c7e8173bfc30bb158bf -https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.2.0-pyha770c72_0.conda#17e487cc8b5507cd3abc09398cf27949 -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda#f6082eae112814f1447b56a5e1f6ed05 +https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.3.0-pyha770c72_0.conda#bc6c44af2a9e6067dd7e949ef10cdfba +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py310h0158d43_0.conda#79cc86f2907e5f83e11c2aa9f521efc7 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py310hf462985_0.conda#93ae40b74b2baea09ddeaa287b09e705 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index e0547245..3fae027a 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -13,13 +13,14 @@ https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2# https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda#f406dcbb2e7bef90d793e50e79a2882b https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be +https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_3.conda#cb98af5db26e3f482bebb80ce9d947d3 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.24-h86f0d12_0.conda#64f0c503da58ec25ebd359e4d990afa8 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda#4211416ecba1866fab0c6470986c22d6 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda#28771437ffcd9f3417c66012dc49a3be https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_4.conda#8a4ab7ff06e4db0be22485332666da0f -https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 +https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 @@ -35,7 +36,6 @@ https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb47aa4a_0.conda#60 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.1-h97f6797_0.conda#5bc18c66111bc94532b0d2df00731c66 -https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.4-h3f801dc_0.conda#01ba04e414e47f95c03d6ddd81fd37be https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_3.conda#1c6eecffad553bde44c5238770cfb7da @@ -66,8 +66,8 @@ https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f4 https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.conda#3c255be50a506c50765a93a6644f32fe https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_1.conda#7e2ba4ca7e6ffebb7f7fc2da2744df61 -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hf01ce69_5.conda#e79a094918988bb1807462cd42c83962 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_2.conda#dfc5aae7b043d9f56ba99514d5e60625 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-h8261f1e_6.conda#b6093922931b535a7ba566b6f384fbe6 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/python-3.11.13-h9e4cc4f_0_cpython.conda#8c399445b6dc73eab839659e6c7b5ad1 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 @@ -83,7 +83,7 @@ https://conda.anaconda.org/conda-forge/noarch/cachetools-6.1.0-pyhd8ed1ab_0.cond https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda#11f59985f49df4620890f3e746ed7102 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.2-pyhd8ed1ab_0.conda#40fe4284b8b5835a9073a645139f35af +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda#7e7d5ef1b9ed630e4a1c358d6bc62284 https://conda.anaconda.org/conda-forge/noarch/click-8.2.1-pyh707e725_0.conda#94b550b8d3a614dbd326af798c7dfb40 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.1-pyhd8ed1ab_0.conda#364ba6c9fb03886ac979b482f39ebb92 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 @@ -91,7 +91,7 @@ https://conda.anaconda.org/conda-forge/noarch/colorlog-6.9.0-pyh707e725_1.conda# https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc -https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda#4547b39256e296bb758166893e909a7c +https://conda.anaconda.org/conda-forge/noarch/filelock-3.19.1-pyhd8ed1ab_0.conda#9c418d067409452b2e87e0016257da68 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.7.0-pyhd8ed1ab_0.conda#a31ce802cd0ebfce298f342c02757019 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e @@ -100,7 +100,7 @@ https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de -https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.8-py311hd18a35c_1.conda#bb17b97b0c0d86e052134bf21af5c03d +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py311h724c32c_0.conda#9c869454a8fdb86fabd93df6cf6075a3 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-34_h59b9bed_openblas.conda#064c22bac20fecf2a99838f9b979374c https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 @@ -115,9 +115,9 @@ https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7d https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhe01879c_2.conda#aa0028616c0750c773698fdc254b2b8d -https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.0-pyhd8ed1ab_0.conda#0e2556d607ec4bd6a765fe5a0e64ad74 +https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.1-pyhd8ed1ab_0.conda#205ac0b2873addb372a4384361990043 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac -https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py311h9ecbd09_2.conda#4b49b833ad54b3e26da1e743a4e4bc13 +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py311h041eb40_3.conda#0f83e5cc946a8a989c17bb0edfaca856 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py311h2dc5d0c_2.conda#014417753f948da1f70d132b2de573be https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-3.1.0-pyhd8ed1ab_0.conda#5f0f24f8032c2c1bb33f59b75974f5fc @@ -136,10 +136,10 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0. https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311hf29c0ef_0.conda#55553ecd5328336368db611f350b7039 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.2-py311h3778330_0.conda#db7bfab113866fc693c0e0dc0a17ce9e +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.4-py311h3778330_0.conda#9b03916fb3692cfed283361d809b8d56 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.59.0-py311h3778330_0.conda#2eaecc2e416852815abb85dc47d425b3 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.59.1-py311h3778330_0.conda#a879d36924dd853bf855ed423b02d92b https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda#c74d83614aec66227ae5199d98852aaf @@ -152,40 +152,40 @@ https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py311h1322bbf_0.conda#8b4568b1357f5ec5494e36b06076c3a1 https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh8b19718_0.conda#dfce4b2af4bfe90cdcaf56ca0b28ddf5 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h18fbb6c_1.conda#e025fd9cad1b925649589ac3af385e37 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h18fbb6c_2.conda#1aeede769ec2fa0f474f8b73a7ac057f https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.1-pyhe01879c_0.conda#8200884fd84ab8754567d8523b52eaa8 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda#75be1a943e0a7f99fcf118309092c635 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.33.1-pyhd8ed1ab_0.conda#3f6ee060b1462c29b3442df71939a358 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.34.0-pyhd8ed1ab_0.conda#2bd6c0c96cfc4dbe9bde604a122e3e55 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.7.0-pyhe01879c_1.conda#3293644021329a96c606c3d95e180991 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h21f7587_118.conda#5f05af73150f62adab1492ab2d18d573 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.2-py311h2e04523_0.conda#61e1b42eb1d9f0ebaf038522ce9ca2fe -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py311h0960b38_1.conda#5e6251fd41d984a9d4fd1fe4b9bdca31 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.2-py311h9517ec2_1.conda#768227d126f180ca9212d2ce8d69497d +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py311h9fec8c3_0.conda#c8d5978c251d711384b9241358c793f6 https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda#a49c2283f24696a7b30367b7346a0144 -https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.0.1-pyhd8ed1ab_0.conda#6c87f9ad6267cf3bfdec22f4b5a183bc +https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.0-pyhd8ed1ab_0.conda#ad8f901272d56cfb6bf22bb89e9be59b https://conda.anaconda.org/conda-forge/noarch/tox-4.28.4-pyhe01879c_0.conda#7a2f30d7eebf91ad7320ff2fc9934261 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hd18a35c_5.conda#4e8447ca8558a203ec0577b4730073f3 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311h9ecbd09_2.conda#ca02de88df1cc3cfc8f24766ff50cb3c https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h9f3472d_1.conda#2c3c4f115d28ed9e001a271d5d8585aa https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py311hdf67eae_1.conda#390f9e645ff2f4b9cf48d53b3cf6c942 -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.12-pyhd8ed1ab_0.conda#84463b10c1eb198541cd54125c7efe90 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.13-pyhd8ed1ab_0.conda#52083ce9103ec11c8130ce18517d3e83 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a04073db11c2c86c555fb088acc8f8c1 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py311h9ecbd09_1.conda#28d6b63784b350a2906dc264ad8c7f2a https://conda.anaconda.org/conda-forge/noarch/nox-2025.5.1-pyhe01879c_0.conda#f294cc5e7c84a0422fcc57f33313e084 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.2.1-pyhd8ed1ab_0.conda#ce978e1b9ed8b8d49164e90a5cdc94cd https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.1-pyhd8ed1ab_0.conda#11b313328806f1dfbab0eb1d219388c4 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.0-py311h2d3ef60_0.conda#87f6abadb59e4b17fc3a7b666faa721f -https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.0.1-hd8ed1ab_0.conda#c4f46752295606e97abd5dc96ae75fbe +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.1-py311h33d6a90_0.conda#03f860a54dadae93531ca573c3ed901a +https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.0-hd8ed1ab_0.conda#03323fba6896975dc9ffae39b547c31b https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py311h3dc67b8_0.conda#ea7501cf4d40188cc662b29bcc07f13b https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py311h9f3472d_0.conda#555b148cafbd96b658499060d5e11a65 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.42.0-h5f92351_0.conda#9862a9cd17ade6d0e72b4c0a10123cf2 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.5-py311h0f3be63_0.conda#d4718e47a353473a8238fe1133ddb2ca https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py311h8b974bf_102.conda#d748aad3050d26241842b76d56424cf9 -https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.2.0-pyha770c72_0.conda#17e487cc8b5507cd3abc09398cf27949 -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda#f6082eae112814f1447b56a5e1f6ed05 +https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.3.0-pyha770c72_0.conda#bc6c44af2a9e6067dd7e949ef10cdfba +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py311hed34c8f_0.conda#da5233c4060f1c830179659f02ac1b68 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py311h9f3472d_0.conda#648bccc358ec5b19dec01a5685f3aeb9 diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index a881402f..29a7eeba 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -13,13 +13,14 @@ https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2# https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda#f406dcbb2e7bef90d793e50e79a2882b https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be +https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_3.conda#cb98af5db26e3f482bebb80ce9d947d3 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.24-h86f0d12_0.conda#64f0c503da58ec25ebd359e4d990afa8 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda#4211416ecba1866fab0c6470986c22d6 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda#28771437ffcd9f3417c66012dc49a3be https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_4.conda#8a4ab7ff06e4db0be22485332666da0f -https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_1.conda#e796ff8ddc598affdf7c173d6145f087 +https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 @@ -35,7 +36,6 @@ https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb47aa4a_0.conda#60 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.1-h97f6797_0.conda#5bc18c66111bc94532b0d2df00731c66 -https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.4-h3f801dc_0.conda#01ba04e414e47f95c03d6ddd81fd37be https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_3.conda#1c6eecffad553bde44c5238770cfb7da @@ -66,8 +66,8 @@ https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f4 https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.conda#3c255be50a506c50765a93a6644f32fe https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_1.conda#7e2ba4ca7e6ffebb7f7fc2da2744df61 -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hf01ce69_5.conda#e79a094918988bb1807462cd42c83962 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_2.conda#dfc5aae7b043d9f56ba99514d5e60625 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-h8261f1e_6.conda#b6093922931b535a7ba566b6f384fbe6 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/python-3.12.11-h9e4cc4f_0_cpython.conda#94206474a5608243a10c92cefbe0908f https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 @@ -83,7 +83,7 @@ https://conda.anaconda.org/conda-forge/noarch/cachetools-6.1.0-pyhd8ed1ab_0.cond https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda#11f59985f49df4620890f3e746ed7102 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.2-pyhd8ed1ab_0.conda#40fe4284b8b5835a9073a645139f35af +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda#7e7d5ef1b9ed630e4a1c358d6bc62284 https://conda.anaconda.org/conda-forge/noarch/click-8.2.1-pyh707e725_0.conda#94b550b8d3a614dbd326af798c7dfb40 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.1-pyhd8ed1ab_0.conda#364ba6c9fb03886ac979b482f39ebb92 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 @@ -91,7 +91,7 @@ https://conda.anaconda.org/conda-forge/noarch/colorlog-6.9.0-pyh707e725_1.conda# https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc -https://conda.anaconda.org/conda-forge/noarch/filelock-3.18.0-pyhd8ed1ab_0.conda#4547b39256e296bb758166893e909a7c +https://conda.anaconda.org/conda-forge/noarch/filelock-3.19.1-pyhd8ed1ab_0.conda#9c418d067409452b2e87e0016257da68 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.7.0-pyhd8ed1ab_0.conda#a31ce802cd0ebfce298f342c02757019 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e @@ -100,7 +100,7 @@ https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de -https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.8-py312h68727a3_1.conda#a8ea818e46addfa842348701a9dbe8f8 +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py312h0a2e395_0.conda#f1f7cfc42b0fa6adb4c304d609077a78 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-34_h59b9bed_openblas.conda#064c22bac20fecf2a99838f9b979374c https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 @@ -115,9 +115,9 @@ https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7d https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhe01879c_2.conda#aa0028616c0750c773698fdc254b2b8d -https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.0-pyhd8ed1ab_0.conda#0e2556d607ec4bd6a765fe5a0e64ad74 +https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.1-pyhd8ed1ab_0.conda#205ac0b2873addb372a4384361990043 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac -https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h66e93f0_2.conda#cc3f6c452697c1cf7e4e6e5f21861f96 +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h0d868a3_3.conda#a5e5b1051bd92e2382dc687e6f7579dc https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h178313f_2.conda#cf2485f39740de96e2a7f2bb18ed2fee https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-3.1.0-pyhd8ed1ab_0.conda#5f0f24f8032c2c1bb33f59b75974f5fc @@ -136,10 +136,10 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0. https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda#a861504bbea4161a9170b85d4d2be840 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.2-py312h8a5da7c_0.conda#f8830a2249f4b8a5f9c33cb44ad5c31a +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.4-py312h8a5da7c_0.conda#bad9b9d3b7b39204823c3ec42bf58473 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.59.0-py312h8a5da7c_0.conda#008d44a468c24a59d2e67c014fba8f12 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.59.1-py312h8a5da7c_0.conda#313520338e97b747315b5be6a563c315 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda#c74d83614aec66227ae5199d98852aaf @@ -152,40 +152,40 @@ https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py312h80c1187_0.conda#7911e727a6c24db662193a960b81b6b2 https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh8b19718_0.conda#dfce4b2af4bfe90cdcaf56ca0b28ddf5 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h18fbb6c_1.conda#e025fd9cad1b925649589ac3af385e37 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h18fbb6c_2.conda#1aeede769ec2fa0f474f8b73a7ac057f https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.1-pyhe01879c_0.conda#8200884fd84ab8754567d8523b52eaa8 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda#75be1a943e0a7f99fcf118309092c635 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.33.1-pyhd8ed1ab_0.conda#3f6ee060b1462c29b3442df71939a358 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.34.0-pyhd8ed1ab_0.conda#2bd6c0c96cfc4dbe9bde604a122e3e55 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.7.0-pyhe01879c_1.conda#3293644021329a96c606c3d95e180991 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h21f7587_118.conda#5f05af73150f62adab1492ab2d18d573 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.2-py312h33ff503_0.conda#3f6efbc40eb13f019c856c410fa921d2 -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py312h03c6e1f_1.conda#f754591f9ec0169e436fa84cb9db0c32 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.2-py312hf476fde_1.conda#c935705f0365a066b2ef76eb1c431fe9 +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py312h1c88c49_0.conda#b37103f94ef7f359fed67849c96dad10 https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda#a49c2283f24696a7b30367b7346a0144 -https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.0.1-pyhd8ed1ab_0.conda#6c87f9ad6267cf3bfdec22f4b5a183bc +https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.0-pyhd8ed1ab_0.conda#ad8f901272d56cfb6bf22bb89e9be59b https://conda.anaconda.org/conda-forge/noarch/tox-4.28.4-pyhe01879c_0.conda#7a2f30d7eebf91ad7320ff2fc9934261 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h68727a3_5.conda#f9664ee31aed96c85b7319ab0a693341 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312h66e93f0_2.conda#630db208bc7bbb96725ce9832c7423bb https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312hc0a28a1_1.conda#990033147b0a998e756eaaed6b28f48d https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312hd9148b4_1.conda#e25ed6c2e3b1effedfe9cd10a15ca8d8 -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.12-pyhd8ed1ab_0.conda#84463b10c1eb198541cd54125c7efe90 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.13-pyhd8ed1ab_0.conda#52083ce9103ec11c8130ce18517d3e83 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a04073db11c2c86c555fb088acc8f8c1 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h66e93f0_1.conda#5fef67f50126f40f5966a9451661280d https://conda.anaconda.org/conda-forge/noarch/nox-2025.5.1-pyhe01879c_0.conda#f294cc5e7c84a0422fcc57f33313e084 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.2.1-pyhd8ed1ab_0.conda#ce978e1b9ed8b8d49164e90a5cdc94cd https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.1-pyhd8ed1ab_0.conda#11b313328806f1dfbab0eb1d219388c4 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.0-py312hf734454_0.conda#7513ac56209d27a85ffa1582033f10a8 -https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.0.1-hd8ed1ab_0.conda#c4f46752295606e97abd5dc96ae75fbe +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.1-py312h4ebe9ca_0.conda#b01bd2fd775d142ead214687b793d20d +https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.0-hd8ed1ab_0.conda#03323fba6896975dc9ffae39b547c31b https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py312h21f5128_0.conda#d38eb6d34385f82b02ff776a66977cc4 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py312hc0a28a1_0.conda#8b5b812d4c18cb37bda7a7c8d3a6acb3 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.42.0-h5f92351_0.conda#9862a9cd17ade6d0e72b4c0a10123cf2 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.5-py312he3d6523_0.conda#9246288e5ef2a944f7c9c648f9f331c7 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py312h3805cb1_102.conda#c1358b48677cfc7095cd664f1f0647a1 -https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.2.0-pyha770c72_0.conda#17e487cc8b5507cd3abc09398cf27949 -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.4-pyhd8ed1ab_0.conda#f6082eae112814f1447b56a5e1f6ed05 +https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.3.0-pyha770c72_0.conda#bc6c44af2a9e6067dd7e949ef10cdfba +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py312hf79963d_0.conda#7242926a8932e552f3ce5b77884b52db https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py312hc0a28a1_0.conda#476b0357e207e10d2b7b13ed82156e6d From 41673c6f7e147dc649ae043f7862347d7278e16d Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 1 Sep 2025 13:37:20 +0100 Subject: [PATCH 485/583] Updated environment lockfiles (#687) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 20 ++++++++++---------- requirements/locks/py311-linux-64.lock | 26 +++++++++++++------------- requirements/locks/py312-linux-64.lock | 26 +++++++++++++------------- 3 files changed, 36 insertions(+), 36 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 80d5b72b..f0e3bc51 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -79,7 +79,7 @@ https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.2-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_3.conda#5d08a0ac29e6a5a984817584775d4131 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_3.conda#63d24a5dd21c738d706f91569dbd1892 -https://conda.anaconda.org/conda-forge/noarch/cachetools-6.1.0-pyhd8ed1ab_0.conda#f84eb05fa7f862602bfaf4dd844bd61b +https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.0-pyhd8ed1ab_0.conda#33a59a2cf83ab89ee546c72254521a4a https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda#11f59985f49df4620890f3e746ed7102 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c @@ -100,7 +100,7 @@ https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de -https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py310haaf941d_0.conda#b5e7e5df6544fc81102bdea6157a0689 +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py310haaf941d_1.conda#dccb22849c78cbb9decc0af573c00a45 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-34_h59b9bed_openblas.conda#064c22bac20fecf2a99838f9b979374c https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 @@ -110,7 +110,7 @@ https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py310h89163eb_1 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h55fea9a_1.conda#01243c4aaf71bde0297966125aea4706 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda#424844562f5d337077b445ec6b1398a7 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.4.0-pyhcf101f3_0.conda#cc9d9a3929503785403dbfad9f707145 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 @@ -127,20 +127,20 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda#30a0a26c8abccf4b7991d590fe17c699 https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_1.conda#40d0ed782a8aaa16ef248e68c06c168d -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda#e523f4f1e980ed7a4240d7e27e9ec81f -https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py310ha75aee5_0.conda#1d7a4b9202cdd10d56ecdd7f6c347190 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d +https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py310h7c4b9e2_1.conda#1d54e461bda325196725cdd07ae046cb https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h8deb56e_0.conda#1fc24a3196ad5ede2a68148be61894f4 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.4-py310h3406613_0.conda#ac9c681b16e9b9d24eca83a367b52fcd +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.6-py310h3406613_0.conda#0556c27c1bd399aa6e54e1d1ae15da4f https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.59.1-py310h3406613_0.conda#14e450afac608165ced4b0b93cfc1df1 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.59.2-py310h3406613_0.conda#32dab042830c3c31f89cdb6273585165 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 -https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 +https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda#c74d83614aec66227ae5199d98852aaf https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 @@ -154,7 +154,7 @@ https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh8b19718_0.conda#dfce4b https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h18fbb6c_2.conda#1aeede769ec2fa0f474f8b73a7ac057f https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.1-pyhe01879c_0.conda#8200884fd84ab8754567d8523b52eaa8 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda#75be1a943e0a7f99fcf118309092c635 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.34.0-pyhd8ed1ab_0.conda#2bd6c0c96cfc4dbe9bde604a122e3e55 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 @@ -166,7 +166,7 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda#a4 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.0-pyhd8ed1ab_0.conda#ad8f901272d56cfb6bf22bb89e9be59b https://conda.anaconda.org/conda-forge/noarch/tox-4.28.4-pyhe01879c_0.conda#7a2f30d7eebf91ad7320ff2fc9934261 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310h3788b33_5.conda#e05b0475166b68c9dc4d7937e0315654 -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310ha75aee5_2.conda#f9254b5b0193982416b91edcb4b2676f +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310h7c4b9e2_3.conda#64c494618303717a9a08e3238bcb8d68 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310hf462985_1.conda#c2d5289e6cbcecf2c549e01772fe5274 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py310h3788b33_0.conda#b6420d29123c7c823de168f49ccdfe6a https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 3fae027a..df2993f5 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -79,7 +79,7 @@ https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.2-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_3.conda#5d08a0ac29e6a5a984817584775d4131 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hfdbb021_3.conda#8565f7297b28af62e5de2d968ca32e31 -https://conda.anaconda.org/conda-forge/noarch/cachetools-6.1.0-pyhd8ed1ab_0.conda#f84eb05fa7f862602bfaf4dd844bd61b +https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.0-pyhd8ed1ab_0.conda#33a59a2cf83ab89ee546c72254521a4a https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda#11f59985f49df4620890f3e746ed7102 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c @@ -100,7 +100,7 @@ https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de -https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py311h724c32c_0.conda#9c869454a8fdb86fabd93df6cf6075a3 +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py311h724c32c_1.conda#92720706b174926bc7238cc24f3b5956 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-34_h59b9bed_openblas.conda#064c22bac20fecf2a99838f9b979374c https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 @@ -110,7 +110,7 @@ https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py311h2dc5d0c_1 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h55fea9a_1.conda#01243c4aaf71bde0297966125aea4706 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda#424844562f5d337077b445ec6b1398a7 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.4.0-pyhcf101f3_0.conda#cc9d9a3929503785403dbfad9f707145 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 @@ -128,20 +128,20 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda#30a0a26c8abccf4b7991d590fe17c699 https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_1.conda#40d0ed782a8aaa16ef248e68c06c168d -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda#e523f4f1e980ed7a4240d7e27e9ec81f -https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py311h9ecbd09_0.conda#51a12678b609f5794985fda8372b1a49 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d +https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py311h49ec1c0_1.conda#3457bd5c93b085bec51cdab58fbd1882 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311hf29c0ef_0.conda#55553ecd5328336368db611f350b7039 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.4-py311h3778330_0.conda#9b03916fb3692cfed283361d809b8d56 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.6-py311h3778330_0.conda#e9cbe50bfe64007c7943ec3e349327e9 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.59.1-py311h3778330_0.conda#a879d36924dd853bf855ed423b02d92b +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.59.2-py311h3778330_0.conda#5be2463c4d16a021dd571d7bf56ac799 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 -https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 +https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda#c74d83614aec66227ae5199d98852aaf https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 @@ -155,19 +155,19 @@ https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh8b19718_0.conda#dfce4b https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h18fbb6c_2.conda#1aeede769ec2fa0f474f8b73a7ac057f https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.1-pyhe01879c_0.conda#8200884fd84ab8754567d8523b52eaa8 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda#75be1a943e0a7f99fcf118309092c635 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.34.0-pyhd8ed1ab_0.conda#2bd6c0c96cfc4dbe9bde604a122e3e55 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.7.0-pyhe01879c_1.conda#3293644021329a96c606c3d95e180991 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h21f7587_118.conda#5f05af73150f62adab1492ab2d18d573 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.2-py311h9517ec2_1.conda#768227d126f180ca9212d2ce8d69497d +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.2-py311h2e04523_2.conda#7fb6248106c55e3ccd29ac675be01fac https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py311h9fec8c3_0.conda#c8d5978c251d711384b9241358c793f6 https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda#a49c2283f24696a7b30367b7346a0144 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.0-pyhd8ed1ab_0.conda#ad8f901272d56cfb6bf22bb89e9be59b https://conda.anaconda.org/conda-forge/noarch/tox-4.28.4-pyhe01879c_0.conda#7a2f30d7eebf91ad7320ff2fc9934261 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hd18a35c_5.conda#4e8447ca8558a203ec0577b4730073f3 -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311h9ecbd09_2.conda#ca02de88df1cc3cfc8f24766ff50cb3c +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311h49ec1c0_3.conda#493d5b49a7b416746b2fe41c82e27dce https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h9f3472d_1.conda#2c3c4f115d28ed9e001a271d5d8585aa https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py311hdf67eae_1.conda#390f9e645ff2f4b9cf48d53b3cf6c942 https://conda.anaconda.org/conda-forge/noarch/identify-2.6.13-pyhd8ed1ab_0.conda#52083ce9103ec11c8130ce18517d3e83 @@ -189,12 +189,12 @@ https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py311hed34c8f_0.conda#da5233c4060f1c830179659f02ac1b68 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py311h9f3472d_0.conda#648bccc358ec5b19dec01a5685f3aeb9 -https://conda.anaconda.org/conda-forge/noarch/iris-3.13.0-pyha770c72_0.conda#1f2b6ad3768df0c343d8af7fdb10c861 +https://conda.anaconda.org/conda-forge/noarch/iris-3.13.1-pyha770c72_0.conda#33d150f58eb36070d2b8ad6dd1bd50d7 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda#e9fb3fe8a5b758b4aff187d434f94f03 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jquery-4.1-pyhd8ed1ab_1.conda#403185829255321ea427333f7773dd1f https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-3.0.1-pyha770c72_0.conda#740536f8a54250b1964e494c0bf5c9c3 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda#00534ebcc0375929b45c3039b5ba7636 -https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda#f7af826063ed569bb13f7207d6f949b0 +https://conda.anaconda.org/conda-forge/noarch/sphinx-8.3.0-pyhd8ed1ab_0.conda#6ce9ddee4c0f68bda548303196f4cf4c https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda#3bc61f7161d28137797e038263c04c54 diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 29a7eeba..670b3ef8 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -79,7 +79,7 @@ https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.2-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_3.conda#5d08a0ac29e6a5a984817584775d4131 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_3.conda#a32e0c069f6c3dcac635f7b0b0dac67e -https://conda.anaconda.org/conda-forge/noarch/cachetools-6.1.0-pyhd8ed1ab_0.conda#f84eb05fa7f862602bfaf4dd844bd61b +https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.0-pyhd8ed1ab_0.conda#33a59a2cf83ab89ee546c72254521a4a https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda#11f59985f49df4620890f3e746ed7102 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c @@ -100,7 +100,7 @@ https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de -https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py312h0a2e395_0.conda#f1f7cfc42b0fa6adb4c304d609077a78 +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py312h0a2e395_1.conda#cec5c1ea565944a94f82cdd6fba7cc76 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-34_h59b9bed_openblas.conda#064c22bac20fecf2a99838f9b979374c https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 @@ -110,7 +110,7 @@ https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h55fea9a_1.conda#01243c4aaf71bde0297966125aea4706 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.8-pyhe01879c_0.conda#424844562f5d337077b445ec6b1398a7 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.4.0-pyhcf101f3_0.conda#cc9d9a3929503785403dbfad9f707145 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 @@ -128,20 +128,20 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda#30a0a26c8abccf4b7991d590fe17c699 https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_1.conda#40d0ed782a8aaa16ef248e68c06c168d -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.14.1-pyhe01879c_0.conda#e523f4f1e980ed7a4240d7e27e9ec81f -https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py312h66e93f0_0.conda#617f5d608ff8c28ad546e5d9671cbb95 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d +https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py312h4c3975b_1.conda#4da303c1e91703d178817252615ca0a7 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda#a861504bbea4161a9170b85d4d2be840 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.4-py312h8a5da7c_0.conda#bad9b9d3b7b39204823c3ec42bf58473 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.6-py312h8a5da7c_0.conda#388d3fcdd451c6f9f31c00067826ce2e https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.59.1-py312h8a5da7c_0.conda#313520338e97b747315b5be6a563c315 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.59.2-py312h8a5da7c_0.conda#4c3f3c752ec0cd37b0a0990af20fd952 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 -https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda#b4754fb1bdcb70c8fd54f918301582c6 +https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda#c74d83614aec66227ae5199d98852aaf https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 @@ -155,19 +155,19 @@ https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh8b19718_0.conda#dfce4b https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h18fbb6c_2.conda#1aeede769ec2fa0f474f8b73a7ac057f https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.1-pyhe01879c_0.conda#8200884fd84ab8754567d8523b52eaa8 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.14.1-h4440ef1_0.conda#75be1a943e0a7f99fcf118309092c635 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.34.0-pyhd8ed1ab_0.conda#2bd6c0c96cfc4dbe9bde604a122e3e55 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.7.0-pyhe01879c_1.conda#3293644021329a96c606c3d95e180991 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h21f7587_118.conda#5f05af73150f62adab1492ab2d18d573 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.2-py312hf476fde_1.conda#c935705f0365a066b2ef76eb1c431fe9 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.2-py312h33ff503_2.conda#b6daf7dbe075ac2ae2ad59cdc45aa8c4 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py312h1c88c49_0.conda#b37103f94ef7f359fed67849c96dad10 https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda#a49c2283f24696a7b30367b7346a0144 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.0-pyhd8ed1ab_0.conda#ad8f901272d56cfb6bf22bb89e9be59b https://conda.anaconda.org/conda-forge/noarch/tox-4.28.4-pyhe01879c_0.conda#7a2f30d7eebf91ad7320ff2fc9934261 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h68727a3_5.conda#f9664ee31aed96c85b7319ab0a693341 -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312h66e93f0_2.conda#630db208bc7bbb96725ce9832c7423bb +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312h4c3975b_3.conda#7a2c6e25a4fabf9fab62ee1977beabe5 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312hc0a28a1_1.conda#990033147b0a998e756eaaed6b28f48d https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312hd9148b4_1.conda#e25ed6c2e3b1effedfe9cd10a15ca8d8 https://conda.anaconda.org/conda-forge/noarch/identify-2.6.13-pyhd8ed1ab_0.conda#52083ce9103ec11c8130ce18517d3e83 @@ -189,12 +189,12 @@ https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py312hf79963d_0.conda#7242926a8932e552f3ce5b77884b52db https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py312hc0a28a1_0.conda#476b0357e207e10d2b7b13ed82156e6d -https://conda.anaconda.org/conda-forge/noarch/iris-3.13.0-pyha770c72_0.conda#1f2b6ad3768df0c343d8af7fdb10c861 +https://conda.anaconda.org/conda-forge/noarch/iris-3.13.1-pyha770c72_0.conda#33d150f58eb36070d2b8ad6dd1bd50d7 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda#e9fb3fe8a5b758b4aff187d434f94f03 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jquery-4.1-pyhd8ed1ab_1.conda#403185829255321ea427333f7773dd1f https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-3.0.1-pyha770c72_0.conda#740536f8a54250b1964e494c0bf5c9c3 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda#00534ebcc0375929b45c3039b5ba7636 -https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda#f7af826063ed569bb13f7207d6f949b0 +https://conda.anaconda.org/conda-forge/noarch/sphinx-8.3.0-pyhd8ed1ab_0.conda#6ce9ddee4c0f68bda548303196f4cf4c https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda#3bc61f7161d28137797e038263c04c54 From 6f6f60eed5b7339e812f64a505ed8ba864f70813 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 1 Sep 2025 17:23:58 +0100 Subject: [PATCH 486/583] chore: update pre-commit hooks (#667) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: update pre-commit hooks updates: - [github.com/pre-commit/pre-commit-hooks: v5.0.0 → v6.0.0](https://github.com/pre-commit/pre-commit-hooks/compare/v5.0.0...v6.0.0) - [github.com/pre-commit/mirrors-mypy: v1.16.0 → v1.17.1](https://github.com/pre-commit/mirrors-mypy/compare/v1.16.0...v1.17.1) - [github.com/numpy/numpydoc: v1.8.0 → v1.9.0](https://github.com/numpy/numpydoc/compare/v1.8.0...v1.9.0) - [github.com/astral-sh/ruff-pre-commit: v0.11.13 → v0.12.10](https://github.com/astral-sh/ruff-pre-commit/compare/v0.11.13...v0.12.10) * Fixes following pre-commit updates. --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Patrick Peglar --- .pre-commit-config.yaml | 8 ++++---- src/iris_grib/__init__.py | 8 ++++---- src/iris_grib/message.py | 2 +- .../unit/load_convert/test_grid_definition_template_5.py | 9 +++++++-- .../load_convert/test_product_definition_template_32.py | 2 +- src/iris_grib/tests/unit/message/test_GribMessage.py | 2 +- 6 files changed, 18 insertions(+), 13 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3bdd95d0..b913f715 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -24,7 +24,7 @@ minimum_pre_commit_version: 1.21.0 repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v5.0.0 + rev: v6.0.0 hooks: # Prevent giant files from being committed. - id: check-added-large-files @@ -65,20 +65,20 @@ repos: additional_dependencies: [tomli] - repo: https://github.com/pre-commit/mirrors-mypy - rev: 'v1.16.0' + rev: 'v1.17.1' hooks: - id: mypy exclude: 'noxfile\.py|docs/conf\.py' - repo: https://github.com/numpy/numpydoc - rev: v1.8.0 + rev: v1.9.0 hooks: - id: numpydoc-validation exclude: "src/iris_grib/tests/|noxfile.py" types: [file, python] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.11.13" + rev: "v0.12.10" hooks: - id: ruff types: [file, python] diff --git a/src/iris_grib/__init__.py b/src/iris_grib/__init__.py index c29b077c..aba2a679 100644 --- a/src/iris_grib/__init__.py +++ b/src/iris_grib/__init__.py @@ -160,8 +160,8 @@ def _aslazydata_has_meta(): since https://github.com/SciTools/iris/pull/5801, it now *requires* one, if the wrapped object is anything other than a numpy or dask array. """ - from inspect import signature - from iris._lazy_data import as_lazy_data + from inspect import signature # noqa: PLC0415 + from iris._lazy_data import as_lazy_data # noqa: PLC0415 sig = signature(as_lazy_data) return "meta" in sig.parameters @@ -773,7 +773,7 @@ def load_cubes(filenames, callback=None): An iterator returning Iris cubes loaded from the GRIB files. """ - import iris.fileformats.rules as iris_rules + import iris.fileformats.rules as iris_rules # noqa: PLC0415 grib_loader = iris_rules.Loader(_load_generate, {}, load_convert) return iris_rules.load_cubes(filenames, callback, grib_loader) @@ -837,7 +837,7 @@ def load_pairs_from_fields(grib_messages): :class:`iris_grib.message.GribMessage`). """ - import iris.fileformats.rules as iris_rules + import iris.fileformats.rules as iris_rules # noqa: PLC0415 return iris_rules.load_pairs_from_fields(grib_messages, load_convert) diff --git a/src/iris_grib/message.py b/src/iris_grib/message.py index 132f4db8..10319345 100644 --- a/src/iris_grib/message.py +++ b/src/iris_grib/message.py @@ -184,7 +184,7 @@ def data(self): proxy = _DataProxy(shape, dtype, self._recreate_raw) as_lazy_kwargs = {} - from . import _ASLAZYDATA_NEEDS_META, _make_dask_meta + from . import _ASLAZYDATA_NEEDS_META, _make_dask_meta # noqa: PLC0415 if _ASLAZYDATA_NEEDS_META: has_bitmap = 6 in sections diff --git a/src/iris_grib/tests/unit/load_convert/test_grid_definition_template_5.py b/src/iris_grib/tests/unit/load_convert/test_grid_definition_template_5.py index 4662db5e..9e31f0f4 100644 --- a/src/iris_grib/tests/unit/load_convert/test_grid_definition_template_5.py +++ b/src/iris_grib/tests/unit/load_convert/test_grid_definition_template_5.py @@ -69,19 +69,24 @@ def test(self): "angleOfRotation": angleOfRotation, "shapeOfTheEarth": shapeOfTheEarth, } + # The called being tested. grid_definition_template_5(section, metadata) - from iris_grib._load_convert import ( + + # Note: import certain functions *dynamically*, so that we pickup the patched + # versions established by the setUp fixture. + from iris_grib._load_convert import ( # noqa: PLC0415 ellipsoid_geometry, ellipsoid, grid_definition_template_4_and_5 as gdt_4_5, ) + from iris.coord_systems import RotatedGeogCS # noqa: PLC0415 + self.assertEqual(ellipsoid_geometry.call_count, 1) ellipsoid.assert_called_once_with( shapeOfTheEarth, self.major, self.minor, self.radius ) - from iris.coord_systems import RotatedGeogCS RotatedGeogCS.assert_called_once_with( -45.0, 270.0, angleOfRotation, self.ellipsoid diff --git a/src/iris_grib/tests/unit/load_convert/test_product_definition_template_32.py b/src/iris_grib/tests/unit/load_convert/test_product_definition_template_32.py index 563e6d3e..5ba86b8f 100644 --- a/src/iris_grib/tests/unit/load_convert/test_product_definition_template_32.py +++ b/src/iris_grib/tests/unit/load_convert/test_product_definition_template_32.py @@ -29,7 +29,7 @@ def setUp(self): self.time_coords_patch = self.patch("iris_grib._load_convert.time_coords") self.data_cutoff_patch = self.patch("iris_grib._load_convert.data_cutoff") - def test(self, value=10, factor=1): + def test(self): # Prepare the arguments. series = mock.sentinel.satelliteSeries number = mock.sentinel.satelliteNumber diff --git a/src/iris_grib/tests/unit/message/test_GribMessage.py b/src/iris_grib/tests/unit/message/test_GribMessage.py index 82b89cce..fbc8d286 100644 --- a/src/iris_grib/tests/unit/message/test_GribMessage.py +++ b/src/iris_grib/tests/unit/message/test_GribMessage.py @@ -38,7 +38,7 @@ def test_release_file(self): filename = tests.get_data_path(("GRIB", "3_layer_viz", "3_layer.grib2")) my_file = open(filename) - import builtins # noqa: F401 + import builtins # noqa: F401, PLC0415 self.patch("builtins.open", mock.Mock(return_value=my_file)) From d92f0834745ff4786a514f9c92d6885cb5464f61 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Sep 2025 17:24:44 +0100 Subject: [PATCH 487/583] Bump scitools/workflows in the dependencies group (#685) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2025.08.2 to 2025.08.4 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.08.2...2025.08.4) --- updated-dependencies: - dependency-name: scitools/workflows dependency-version: 2025.08.4 dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/ci-template-check.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 39be3933..19fbd6cf 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.08.2 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.08.4 diff --git a/.github/workflows/ci-template-check.yml b/.github/workflows/ci-template-check.yml index e443ea41..2df3925c 100644 --- a/.github/workflows/ci-template-check.yml +++ b/.github/workflows/ci-template-check.yml @@ -10,7 +10,7 @@ on: jobs: prompt-share: - uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.08.2 + uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.08.4 secrets: inherit with: pr_number: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index f20db198..1b15c140 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.08.2 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.08.4 secrets: inherit From 40d3e07cfffa8695e24ed6946d6c2f0874a4cf95 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Mon, 8 Sep 2025 13:17:10 +0100 Subject: [PATCH 488/583] Link fix. (#693) --- docs/ref/release_notes.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/ref/release_notes.rst b/docs/ref/release_notes.rst index 9551b598..9817786c 100644 --- a/docs/ref/release_notes.rst +++ b/docs/ref/release_notes.rst @@ -473,7 +473,7 @@ Bugs Fixed assigned the "new-style" Iris `VerticalPerspective `_ coordinate system, equivalent to the Cartopy - `NearsidePerspective `_ + `NearsidePerspective `_ and Proj `"nsper" `_ . The plotting behaviour of this is now **the same again as before Iris 2.3** : From a256742d172eca02fe168700dd47c555cdd08d96 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 8 Sep 2025 14:46:24 +0100 Subject: [PATCH 489/583] chore: update pre-commit hooks (#689) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.12.10 → v0.12.11](https://github.com/astral-sh/ruff-pre-commit/compare/v0.12.10...v0.12.11) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Patrick Peglar --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b913f715..48427b4d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -78,7 +78,7 @@ repos: types: [file, python] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.12.10" + rev: "v0.12.11" hooks: - id: ruff types: [file, python] From caa2e91803be5b9a83ba39943079ee805f228800 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 8 Sep 2025 14:47:23 +0100 Subject: [PATCH 490/583] Updated environment lockfiles (#692) Co-authored-by: Lockfile bot Co-authored-by: Patrick Peglar --- requirements/locks/py310-linux-64.lock | 66 +++++++++++------------ requirements/locks/py311-linux-64.lock | 72 +++++++++++++------------- requirements/locks/py312-linux-64.lock | 72 +++++++++++++------------- 3 files changed, 105 insertions(+), 105 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index f0e3bc51..31d1616e 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -8,23 +8,23 @@ https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222 https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda#74784ee3d225fc3dca89edb635b4e5cc https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda#0be7c6e070c19105f966d3758448d018 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda#3baf8976c96134738bba224e9ef6b1e5 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_5.conda#dcd5ff1940cd38f6df777cac86819d60 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda#f406dcbb2e7bef90d793e50e79a2882b +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_5.conda#264fbfba7fb20acf3b29cde153e345ce https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 -https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_3.conda#cb98af5db26e3f482bebb80ce9d947d3 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb03c661_4.conda#1d29d2e33fe59954af82ef54a8af3fe1 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.24-h86f0d12_0.conda#64f0c503da58ec25ebd359e4d990afa8 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda#4211416ecba1866fab0c6470986c22d6 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda#28771437ffcd9f3417c66012dc49a3be -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_4.conda#8a4ab7ff06e4db0be22485332666da0f +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_5.conda#069afdf8ea72504e48d23ae1171d951c +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_5.conda#fbd4008644add05032b6764807ee2cba https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.conda#3c376af8888c386b9d3d1c2701e2f3ab +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_5.conda#4e02a49aaa9d5190cb630fa43528fbe6 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 @@ -38,16 +38,16 @@ https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62e https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.1-h97f6797_0.conda#5bc18c66111bc94532b0d2df00731c66 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.4-h3f801dc_0.conda#01ba04e414e47f95c03d6ddd81fd37be -https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_3.conda#1c6eecffad553bde44c5238770cfb7da -https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_3.conda#3facafe58f3858eb95527c7d3a3fc578 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb03c661_4.conda#5cb5a1c9a94a78f5b23684bcb845338d +https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb03c661_4.conda#2e55011fa483edb8bfe3fd92e860cd79 https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_4.conda#53e876bc2d2648319e94c33c57b9ec74 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_5.conda#0c91408b3dec0b97e8a3c694845bd63b https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.50-h421ea60_1.conda#7af8e91b0deb5f8e25d1a595dea79614 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda#0b367fad34931cb79e0d6b7e5c06bb1c https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_4.conda#2d34729cbc1da0ec988e57b13b712067 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_5.conda#8bba50c7f4679f08c861b597ad2bda6b https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 @@ -60,12 +60,12 @@ https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.con https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d -https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_3.conda#58178ef8ba927229fba6d84abf62c108 +https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb03c661_4.conda#ca4ed8015764937c81b830f7f5b68543 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.conda#3c255be50a506c50765a93a6644f32fe https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d -https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b +https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda#b499ce4b026493a13774bcf0f4c33849 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_2.conda#dfc5aae7b043d9f56ba99514d5e60625 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-h8261f1e_6.conda#b6093922931b535a7ba566b6f384fbe6 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba @@ -77,8 +77,8 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.co https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.2-pyhd8ed1ab_0.conda#eb9d4263271ca287d2e0cf5a86da2d3a https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f -https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_3.conda#5d08a0ac29e6a5a984817584775d4131 -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hf71b8c6_3.conda#63d24a5dd21c738d706f91569dbd1892 +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb03c661_4.conda#eaf3fbd2aa97c212336de38a51fe404e +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hea6c23e_4.conda#6ef43db290647218e1e04c2601675bff https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.0-pyhd8ed1ab_0.conda#33a59a2cf83ab89ee546c72254521a4a https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda#11f59985f49df4620890f3e746ed7102 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e @@ -93,7 +93,7 @@ https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#0 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc https://conda.anaconda.org/conda-forge/noarch/filelock-3.19.1-pyhd8ed1ab_0.conda#9c418d067409452b2e87e0016257da68 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 -https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.7.0-pyhd8ed1ab_0.conda#a31ce802cd0ebfce298f342c02757019 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.9.0-pyhd8ed1ab_0.conda#76f492bd8ba8a0fb80ffe16fc1a75b3b https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 @@ -102,7 +102,7 @@ https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py310haaf941d_1.conda#dccb22849c78cbb9decc0af573c00a45 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-34_h59b9bed_openblas.conda#064c22bac20fecf2a99838f9b979374c +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-35_h59b9bed_openblas.conda#eaf80af526daf5745295d9964c2bd3cf https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 @@ -134,8 +134,8 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 -https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h8deb56e_0.conda#1fc24a3196ad5ede2a68148be61894f4 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.6-py310h3406613_0.conda#0556c27c1bd399aa6e54e1d1ae15da4f +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h34a4b09_1.conda#6d582e073a58a7a011716b135819b94a +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.6-py310h3406613_1.conda#a42ce2be914eabff4bb1674c57304967 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.59.2-py310h3406613_0.conda#32dab042830c3c31f89cdb6273585165 @@ -145,11 +145,11 @@ https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.c https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-34_he106b2a_openblas.conda#148b531b5457ad666ed76ceb4c766505 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-34_h7ac8fdf_openblas.conda#f05a31377b4d9a8d8740f47d1e70b70e +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-35_he106b2a_openblas.conda#e62d58d32431dabed236c860dfa566ca +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-35_h7ac8fdf_openblas.conda#88fa5489509c1da59ab2ee6b234511a5 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py310h7e6dc6c_0.conda#e609995f031bc848be8ea159865e8afc +https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py310hb7da693_1.conda#c22d65a244a440186aec641a61c87f7e https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh8b19718_0.conda#dfce4b2af4bfe90cdcaf56ca0b28ddf5 https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h18fbb6c_2.conda#1aeede769ec2fa0f474f8b73a7ac057f https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.1-pyhe01879c_0.conda#8200884fd84ab8754567d8523b52eaa8 @@ -162,33 +162,33 @@ https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.7.0-h40b2b14_ https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h21f7587_118.conda#5f05af73150f62adab1492ab2d18d573 https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.6-py310hefbff90_0.conda#b0cea2c364bf65cd19e023040eeab05d https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py310h71d0299_1.conda#e54b1eaeb50ad1767680181a8575a8db -https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda#a49c2283f24696a7b30367b7346a0144 +https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhd8ed1ab_0.conda#1f987505580cb972cf28dc5f74a0f81b https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.0-pyhd8ed1ab_0.conda#ad8f901272d56cfb6bf22bb89e9be59b -https://conda.anaconda.org/conda-forge/noarch/tox-4.28.4-pyhe01879c_0.conda#7a2f30d7eebf91ad7320ff2fc9934261 +https://conda.anaconda.org/conda-forge/noarch/tox-4.30.2-pyhcf101f3_0.conda#7c913233c8530cb13a90da495f91f360 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310h3788b33_5.conda#e05b0475166b68c9dc4d7937e0315654 -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310h7c4b9e2_3.conda#64c494618303717a9a08e3238bcb8d68 -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310hf462985_1.conda#c2d5289e6cbcecf2c549e01772fe5274 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.24.0-py310h1d967bf_1.conda#9b9acc1b796705b9efcc1dc6406e1726 +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310hf779ad0_2.conda#30167b9702fd4a46cd4a98e74c9840d8 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py310h3788b33_0.conda#b6420d29123c7c823de168f49ccdfe6a https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 https://conda.anaconda.org/conda-forge/noarch/identify-2.6.13-pyhd8ed1ab_0.conda#52083ce9103ec11c8130ce18517d3e83 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a04073db11c2c86c555fb088acc8f8c1 -https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py310ha75aee5_1.conda#48781b625a5c7701e04d222752cb2f62 +https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py310hf779ad0_2.conda#4906d8c3680f6c1273ad5a5775807867 https://conda.anaconda.org/conda-forge/noarch/nox-2025.5.1-pyhe01879c_0.conda#f294cc5e7c84a0422fcc57f33313e084 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.2.1-pyhd8ed1ab_0.conda#ce978e1b9ed8b8d49164e90a5cdc94cd -https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.1-pyhd8ed1ab_0.conda#11b313328806f1dfbab0eb1d219388c4 +https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.0-pyhd8ed1ab_0.conda#e0298baaeb970b93da8f01e7c275092a https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.conda#8c29cd33b64b2eb78597fa28b5595c8d https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.0-hd8ed1ab_0.conda#03323fba6896975dc9ffae39b547c31b -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py310h247727d_0.conda#78ae955878da938d98aa828413263284 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py310hf4e7fdd_1.conda#d656bc59cf459d0ef1f725d57f646ae0 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py310hf462985_0.conda#c31938674e4cda43617a4d70f99ffd0c +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py310hf779ad0_1.conda#5e4aea6b728177b53e8a216922ebd6a2 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.42.0-h5f92351_0.conda#9862a9cd17ade6d0e72b4c0a10123cf2 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.5-py310hfde16b3_0.conda#4478c9e8038113b9f68904200ec80385 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py310haba2683_102.conda#308cc08b61b28c7e8173bfc30bb158bf +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.6-py310hfde16b3_1.conda#65d3af47b03c91d9d2bb69dd8307a661 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py310hbf8a091_103.conda#564c1aa7de5be5b006c0f17a123bc932 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.3.0-pyha770c72_0.conda#bc6c44af2a9e6067dd7e949ef10cdfba https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py310h0158d43_0.conda#79cc86f2907e5f83e11c2aa9f521efc7 +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py310h0158d43_1.conda#871b5f746960f99ac23dbc73d14e2ad0 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py310hf462985_0.conda#93ae40b74b2baea09ddeaa287b09e705 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py310hf779ad0_1.conda#79e35aaf248af3825722406ef19d896c https://conda.anaconda.org/conda-forge/noarch/iris-3.11.1-pyha770c72_1.conda#f501583062225a070455d011d81b07bf https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index df2993f5..dcfb3683 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -8,23 +8,23 @@ https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222 https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda#74784ee3d225fc3dca89edb635b4e5cc https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda#0be7c6e070c19105f966d3758448d018 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda#3baf8976c96134738bba224e9ef6b1e5 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_5.conda#dcd5ff1940cd38f6df777cac86819d60 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda#f406dcbb2e7bef90d793e50e79a2882b +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_5.conda#264fbfba7fb20acf3b29cde153e345ce https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 -https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_3.conda#cb98af5db26e3f482bebb80ce9d947d3 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb03c661_4.conda#1d29d2e33fe59954af82ef54a8af3fe1 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.24-h86f0d12_0.conda#64f0c503da58ec25ebd359e4d990afa8 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda#4211416ecba1866fab0c6470986c22d6 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda#28771437ffcd9f3417c66012dc49a3be -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_4.conda#8a4ab7ff06e4db0be22485332666da0f +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_5.conda#069afdf8ea72504e48d23ae1171d951c +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_5.conda#fbd4008644add05032b6764807ee2cba https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.conda#3c376af8888c386b9d3d1c2701e2f3ab +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_5.conda#4e02a49aaa9d5190cb630fa43528fbe6 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 @@ -38,16 +38,16 @@ https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62e https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.1-h97f6797_0.conda#5bc18c66111bc94532b0d2df00731c66 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.4-h3f801dc_0.conda#01ba04e414e47f95c03d6ddd81fd37be -https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_3.conda#1c6eecffad553bde44c5238770cfb7da -https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_3.conda#3facafe58f3858eb95527c7d3a3fc578 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb03c661_4.conda#5cb5a1c9a94a78f5b23684bcb845338d +https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb03c661_4.conda#2e55011fa483edb8bfe3fd92e860cd79 https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_4.conda#53e876bc2d2648319e94c33c57b9ec74 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_5.conda#0c91408b3dec0b97e8a3c694845bd63b https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.50-h421ea60_1.conda#7af8e91b0deb5f8e25d1a595dea79614 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda#0b367fad34931cb79e0d6b7e5c06bb1c https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_4.conda#2d34729cbc1da0ec988e57b13b712067 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_5.conda#8bba50c7f4679f08c861b597ad2bda6b https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 @@ -60,12 +60,12 @@ https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.con https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d -https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_3.conda#58178ef8ba927229fba6d84abf62c108 +https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb03c661_4.conda#ca4ed8015764937c81b830f7f5b68543 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.conda#3c255be50a506c50765a93a6644f32fe https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d -https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b +https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda#b499ce4b026493a13774bcf0f4c33849 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_2.conda#dfc5aae7b043d9f56ba99514d5e60625 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-h8261f1e_6.conda#b6093922931b535a7ba566b6f384fbe6 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba @@ -77,8 +77,8 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.co https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.2-pyhd8ed1ab_0.conda#eb9d4263271ca287d2e0cf5a86da2d3a https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f -https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_3.conda#5d08a0ac29e6a5a984817584775d4131 -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hfdbb021_3.conda#8565f7297b28af62e5de2d968ca32e31 +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb03c661_4.conda#eaf3fbd2aa97c212336de38a51fe404e +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311h1ddb823_4.conda#7138a06a7b0d11a23cfae323e6010a08 https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.0-pyhd8ed1ab_0.conda#33a59a2cf83ab89ee546c72254521a4a https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda#11f59985f49df4620890f3e746ed7102 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e @@ -93,7 +93,7 @@ https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#0 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc https://conda.anaconda.org/conda-forge/noarch/filelock-3.19.1-pyhd8ed1ab_0.conda#9c418d067409452b2e87e0016257da68 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 -https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.7.0-pyhd8ed1ab_0.conda#a31ce802cd0ebfce298f342c02757019 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.9.0-pyhd8ed1ab_0.conda#76f492bd8ba8a0fb80ffe16fc1a75b3b https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 @@ -102,7 +102,7 @@ https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py311h724c32c_1.conda#92720706b174926bc7238cc24f3b5956 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-34_h59b9bed_openblas.conda#064c22bac20fecf2a99838f9b979374c +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-35_h59b9bed_openblas.conda#eaf80af526daf5745295d9964c2bd3cf https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 @@ -135,8 +135,8 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 -https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311hf29c0ef_0.conda#55553ecd5328336368db611f350b7039 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.6-py311h3778330_0.conda#e9cbe50bfe64007c7943ec3e349327e9 +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311h5b438cf_1.conda#82e0123a459d095ac99c76d150ccdacf +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.6-py311h3778330_1.conda#d4d341946049625afebfb720f011753a https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.59.2-py311h3778330_0.conda#5be2463c4d16a021dd571d7bf56ac799 @@ -146,11 +146,11 @@ https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.c https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-34_he106b2a_openblas.conda#148b531b5457ad666ed76ceb4c766505 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-34_h7ac8fdf_openblas.conda#f05a31377b4d9a8d8740f47d1e70b70e +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-35_he106b2a_openblas.conda#e62d58d32431dabed236c860dfa566ca +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-35_h7ac8fdf_openblas.conda#88fa5489509c1da59ab2ee6b234511a5 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py311h1322bbf_0.conda#8b4568b1357f5ec5494e36b06076c3a1 +https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py311h3df08e7_1.conda#a36332b6f98697911d5760060f69ec87 https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh8b19718_0.conda#dfce4b2af4bfe90cdcaf56ca0b28ddf5 https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h18fbb6c_2.conda#1aeede769ec2fa0f474f8b73a7ac057f https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.1-pyhe01879c_0.conda#8200884fd84ab8754567d8523b52eaa8 @@ -162,33 +162,33 @@ https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.7.0-pyhe01879c_1.co https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h21f7587_118.conda#5f05af73150f62adab1492ab2d18d573 https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.2-py311h2e04523_2.conda#7fb6248106c55e3ccd29ac675be01fac -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py311h9fec8c3_0.conda#c8d5978c251d711384b9241358c793f6 -https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda#a49c2283f24696a7b30367b7346a0144 +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py311h9fec8c3_1.conda#035e254b83861edd98b6c83554c39214 +https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhd8ed1ab_0.conda#1f987505580cb972cf28dc5f74a0f81b https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.0-pyhd8ed1ab_0.conda#ad8f901272d56cfb6bf22bb89e9be59b -https://conda.anaconda.org/conda-forge/noarch/tox-4.28.4-pyhe01879c_0.conda#7a2f30d7eebf91ad7320ff2fc9934261 +https://conda.anaconda.org/conda-forge/noarch/tox-4.30.2-pyhcf101f3_0.conda#7c913233c8530cb13a90da495f91f360 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hd18a35c_5.conda#4e8447ca8558a203ec0577b4730073f3 -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311h49ec1c0_3.conda#493d5b49a7b416746b2fe41c82e27dce -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h9f3472d_1.conda#2c3c4f115d28ed9e001a271d5d8585aa -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py311hdf67eae_1.conda#390f9e645ff2f4b9cf48d53b3cf6c942 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.24.0-py311h4854a17_1.conda#d0d623c1cd5a9515de1b2260d21a92aa +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h0372a8f_2.conda#c85f7b94f099fddb08358e0997dded95 +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py311hdf67eae_2.conda#bb6a0f88cf345f7e7a143d349dae6d9f https://conda.anaconda.org/conda-forge/noarch/identify-2.6.13-pyhd8ed1ab_0.conda#52083ce9103ec11c8130ce18517d3e83 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a04073db11c2c86c555fb088acc8f8c1 -https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py311h9ecbd09_1.conda#28d6b63784b350a2906dc264ad8c7f2a +https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py311h0372a8f_2.conda#487756753716efba090d06c71fb73eb6 https://conda.anaconda.org/conda-forge/noarch/nox-2025.5.1-pyhe01879c_0.conda#f294cc5e7c84a0422fcc57f33313e084 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.2.1-pyhd8ed1ab_0.conda#ce978e1b9ed8b8d49164e90a5cdc94cd -https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.1-pyhd8ed1ab_0.conda#11b313328806f1dfbab0eb1d219388c4 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.1-py311h33d6a90_0.conda#03f860a54dadae93531ca573c3ed901a +https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.0-pyhd8ed1ab_0.conda#e0298baaeb970b93da8f01e7c275092a +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.1-py311h1e13796_1.conda#84a0938801df456e4f3fa651d37d404f https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.0-hd8ed1ab_0.conda#03323fba6896975dc9ffae39b547c31b -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py311h3dc67b8_0.conda#ea7501cf4d40188cc662b29bcc07f13b +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py311hc9d10f7_1.conda#904c04d8c9b1a9202ecdd4c5620a487d https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py311h9f3472d_0.conda#555b148cafbd96b658499060d5e11a65 +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py311h0372a8f_1.conda#ef8650a6059a907122d59a740207f50e https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.42.0-h5f92351_0.conda#9862a9cd17ade6d0e72b4c0a10123cf2 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.5-py311h0f3be63_0.conda#d4718e47a353473a8238fe1133ddb2ca -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py311h8b974bf_102.conda#d748aad3050d26241842b76d56424cf9 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.6-py311h0f3be63_1.conda#65ddf155ea43aa3bb366cb03ddf3436a +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py311h0b29842_103.conda#a617b87dbda983a999bac489f4ea23e5 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.3.0-pyha770c72_0.conda#bc6c44af2a9e6067dd7e949ef10cdfba https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py311hed34c8f_0.conda#da5233c4060f1c830179659f02ac1b68 +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py311hed34c8f_1.conda#17c710c32010688086b28c088a8be579 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py311h9f3472d_0.conda#648bccc358ec5b19dec01a5685f3aeb9 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py311h0372a8f_1.conda#199d10eea438605a89e48fff4574353e https://conda.anaconda.org/conda-forge/noarch/iris-3.13.1-pyha770c72_0.conda#33d150f58eb36070d2b8ad6dd1bd50d7 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 670b3ef8..0f826b28 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -8,23 +8,23 @@ https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222 https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda#74784ee3d225fc3dca89edb635b4e5cc https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda#0be7c6e070c19105f966d3758448d018 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_4.conda#3baf8976c96134738bba224e9ef6b1e5 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_5.conda#dcd5ff1940cd38f6df777cac86819d60 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_4.conda#f406dcbb2e7bef90d793e50e79a2882b +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_5.conda#264fbfba7fb20acf3b29cde153e345ce https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 -https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_3.conda#cb98af5db26e3f482bebb80ce9d947d3 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb03c661_4.conda#1d29d2e33fe59954af82ef54a8af3fe1 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.24-h86f0d12_0.conda#64f0c503da58ec25ebd359e4d990afa8 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda#4211416ecba1866fab0c6470986c22d6 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_4.conda#28771437ffcd9f3417c66012dc49a3be -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_4.conda#8a4ab7ff06e4db0be22485332666da0f +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_5.conda#069afdf8ea72504e48d23ae1171d951c +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_5.conda#fbd4008644add05032b6764807ee2cba https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_4.conda#3c376af8888c386b9d3d1c2701e2f3ab +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_5.conda#4e02a49aaa9d5190cb630fa43528fbe6 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 @@ -38,16 +38,16 @@ https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62e https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.1-h97f6797_0.conda#5bc18c66111bc94532b0d2df00731c66 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.4-h3f801dc_0.conda#01ba04e414e47f95c03d6ddd81fd37be -https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_3.conda#1c6eecffad553bde44c5238770cfb7da -https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_3.conda#3facafe58f3858eb95527c7d3a3fc578 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb03c661_4.conda#5cb5a1c9a94a78f5b23684bcb845338d +https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb03c661_4.conda#2e55011fa483edb8bfe3fd92e860cd79 https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_4.conda#53e876bc2d2648319e94c33c57b9ec74 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_5.conda#0c91408b3dec0b97e8a3c694845bd63b https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.50-h421ea60_1.conda#7af8e91b0deb5f8e25d1a595dea79614 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda#0b367fad34931cb79e0d6b7e5c06bb1c https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_4.conda#2d34729cbc1da0ec988e57b13b712067 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_5.conda#8bba50c7f4679f08c861b597ad2bda6b https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 @@ -60,12 +60,12 @@ https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.con https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d -https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_3.conda#58178ef8ba927229fba6d84abf62c108 +https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb03c661_4.conda#ca4ed8015764937c81b830f7f5b68543 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.conda#3c255be50a506c50765a93a6644f32fe https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d -https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda#19e57602824042dfd0446292ef90488b +https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda#b499ce4b026493a13774bcf0f4c33849 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_2.conda#dfc5aae7b043d9f56ba99514d5e60625 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-h8261f1e_6.conda#b6093922931b535a7ba566b6f384fbe6 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba @@ -77,8 +77,8 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.co https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.2-pyhd8ed1ab_0.conda#eb9d4263271ca287d2e0cf5a86da2d3a https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f -https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_3.conda#5d08a0ac29e6a5a984817584775d4131 -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h2ec8cdc_3.conda#a32e0c069f6c3dcac635f7b0b0dac67e +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb03c661_4.conda#eaf3fbd2aa97c212336de38a51fe404e +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h1289d80_4.conda#fd0e7746ed0676f008daacb706ce69e4 https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.0-pyhd8ed1ab_0.conda#33a59a2cf83ab89ee546c72254521a4a https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda#11f59985f49df4620890f3e746ed7102 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e @@ -93,7 +93,7 @@ https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#0 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc https://conda.anaconda.org/conda-forge/noarch/filelock-3.19.1-pyhd8ed1ab_0.conda#9c418d067409452b2e87e0016257da68 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 -https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.7.0-pyhd8ed1ab_0.conda#a31ce802cd0ebfce298f342c02757019 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.9.0-pyhd8ed1ab_0.conda#76f492bd8ba8a0fb80ffe16fc1a75b3b https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 @@ -102,7 +102,7 @@ https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py312h0a2e395_1.conda#cec5c1ea565944a94f82cdd6fba7cc76 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-34_h59b9bed_openblas.conda#064c22bac20fecf2a99838f9b979374c +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-35_h59b9bed_openblas.conda#eaf80af526daf5745295d9964c2bd3cf https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 @@ -135,8 +135,8 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 -https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda#a861504bbea4161a9170b85d4d2be840 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.6-py312h8a5da7c_0.conda#388d3fcdd451c6f9f31c00067826ce2e +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h35888ee_1.conda#918e2510c64000a916355dcf09d26da2 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.6-py312h8a5da7c_1.conda#0bffddcd9276d65304761c70ba5c2882 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.59.2-py312h8a5da7c_0.conda#4c3f3c752ec0cd37b0a0990af20fd952 @@ -146,11 +146,11 @@ https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.c https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-34_he106b2a_openblas.conda#148b531b5457ad666ed76ceb4c766505 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-34_h7ac8fdf_openblas.conda#f05a31377b4d9a8d8740f47d1e70b70e +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-35_he106b2a_openblas.conda#e62d58d32431dabed236c860dfa566ca +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-35_h7ac8fdf_openblas.conda#88fa5489509c1da59ab2ee6b234511a5 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py312h80c1187_0.conda#7911e727a6c24db662193a960b81b6b2 +https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py312h0e488c8_1.conda#6b8bc565d829a9e46178da86e05e19d0 https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh8b19718_0.conda#dfce4b2af4bfe90cdcaf56ca0b28ddf5 https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h18fbb6c_2.conda#1aeede769ec2fa0f474f8b73a7ac057f https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.1-pyhe01879c_0.conda#8200884fd84ab8754567d8523b52eaa8 @@ -162,33 +162,33 @@ https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.7.0-pyhe01879c_1.co https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h21f7587_118.conda#5f05af73150f62adab1492ab2d18d573 https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.2-py312h33ff503_2.conda#b6daf7dbe075ac2ae2ad59cdc45aa8c4 -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py312h1c88c49_0.conda#b37103f94ef7f359fed67849c96dad10 -https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.1-pyhd8ed1ab_0.conda#a49c2283f24696a7b30367b7346a0144 +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py312h1c88c49_1.conda#df6837caa76c161b682c27042a851cfb +https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhd8ed1ab_0.conda#1f987505580cb972cf28dc5f74a0f81b https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.0-pyhd8ed1ab_0.conda#ad8f901272d56cfb6bf22bb89e9be59b -https://conda.anaconda.org/conda-forge/noarch/tox-4.28.4-pyhe01879c_0.conda#7a2f30d7eebf91ad7320ff2fc9934261 +https://conda.anaconda.org/conda-forge/noarch/tox-4.30.2-pyhcf101f3_0.conda#7c913233c8530cb13a90da495f91f360 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h68727a3_5.conda#f9664ee31aed96c85b7319ab0a693341 -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312h4c3975b_3.conda#7a2c6e25a4fabf9fab62ee1977beabe5 -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312hc0a28a1_1.conda#990033147b0a998e756eaaed6b28f48d -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312hd9148b4_1.conda#e25ed6c2e3b1effedfe9cd10a15ca8d8 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.24.0-py312h3fa7853_1.conda#e14ae4525748c648ba9cc6b6116349b6 +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312h4f23490_2.conda#ff4b5976814bc00861f962276c8fb87f +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312hd9148b4_2.conda#bce621e43978c245261c76b45edeaa3d https://conda.anaconda.org/conda-forge/noarch/identify-2.6.13-pyhd8ed1ab_0.conda#52083ce9103ec11c8130ce18517d3e83 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a04073db11c2c86c555fb088acc8f8c1 -https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h66e93f0_1.conda#5fef67f50126f40f5966a9451661280d +https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h4f23490_2.conda#cec5bc5f7d374f8f8095f8e28e31f6cb https://conda.anaconda.org/conda-forge/noarch/nox-2025.5.1-pyhe01879c_0.conda#f294cc5e7c84a0422fcc57f33313e084 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.2.1-pyhd8ed1ab_0.conda#ce978e1b9ed8b8d49164e90a5cdc94cd -https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.1-pyhd8ed1ab_0.conda#11b313328806f1dfbab0eb1d219388c4 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.1-py312h4ebe9ca_0.conda#b01bd2fd775d142ead214687b793d20d +https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.0-pyhd8ed1ab_0.conda#e0298baaeb970b93da8f01e7c275092a +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.1-py312h7a1785b_1.conda#b965f164d14d4cffe1ddcf39195b63d6 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.0-hd8ed1ab_0.conda#03323fba6896975dc9ffae39b547c31b -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py312h21f5128_0.conda#d38eb6d34385f82b02ff776a66977cc4 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py312h56997f7_1.conda#e1987bc0d992a5636b170d16701c88c9 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py312hc0a28a1_0.conda#8b5b812d4c18cb37bda7a7c8d3a6acb3 +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py312h4f23490_1.conda#ac0a1a874ce9e3f8940a3a908ff74da9 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.42.0-h5f92351_0.conda#9862a9cd17ade6d0e72b4c0a10123cf2 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.5-py312he3d6523_0.conda#9246288e5ef2a944f7c9c648f9f331c7 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py312h3805cb1_102.conda#c1358b48677cfc7095cd664f1f0647a1 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.6-py312he3d6523_1.conda#94926ee1d68e678fb4cfdb0727a0927e +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py312hdd76c12_103.conda#499a091c66c39f0264aa9219490f0474 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.3.0-pyha770c72_0.conda#bc6c44af2a9e6067dd7e949ef10cdfba https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py312hf79963d_0.conda#7242926a8932e552f3ce5b77884b52db +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py312hf79963d_1.conda#6c913a686cb4060cbd7639a36fa144f0 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py312hc0a28a1_0.conda#476b0357e207e10d2b7b13ed82156e6d +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py312h4f23490_1.conda#a0431a9e34e0b99f590ac5f34c2adad0 https://conda.anaconda.org/conda-forge/noarch/iris-3.13.1-pyha770c72_0.conda#33d150f58eb36070d2b8ad6dd1bd50d7 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff From f093e8464807b3d51084c63401c1fc01e241aa47 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Sep 2025 14:47:47 +0100 Subject: [PATCH 491/583] Bump scitools/workflows in the dependencies group (#691) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2025.08.4 to 2025.09.0 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.08.4...2025.09.0) --- updated-dependencies: - dependency-name: scitools/workflows dependency-version: 2025.09.0 dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Patrick Peglar --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/ci-template-check.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 19fbd6cf..77a9c42b 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.08.4 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.09.0 diff --git a/.github/workflows/ci-template-check.yml b/.github/workflows/ci-template-check.yml index 2df3925c..dafc5d4c 100644 --- a/.github/workflows/ci-template-check.yml +++ b/.github/workflows/ci-template-check.yml @@ -10,7 +10,7 @@ on: jobs: prompt-share: - uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.08.4 + uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.09.0 secrets: inherit with: pr_number: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 1b15c140..cc8ee9fd 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.08.4 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.09.0 secrets: inherit From 0acf929ab7b0af336b9346a1b1c6c6068f6bdd5d Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Wed, 17 Sep 2025 11:50:36 +0100 Subject: [PATCH 492/583] Updated environment lockfiles (#696) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 23 ++++++++++---------- requirements/locks/py311-linux-64.lock | 29 +++++++++++++------------- requirements/locks/py312-linux-64.lock | 29 +++++++++++++------------- 3 files changed, 39 insertions(+), 42 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 31d1616e..11a73926 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -12,6 +12,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_5.conda# https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_5.conda#264fbfba7fb20acf3b29cde153e345ce +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda#51a19bba1b8ebfb60df25cde030b7ebc https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb03c661_4.conda#1d29d2e33fe59954af82ef54a8af3fe1 @@ -25,6 +26,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.c https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_5.conda#4e02a49aaa9d5190cb630fa43528fbe6 +https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.1-he9a06e4_0.conda#af930c65e9a79a3423d6d36e265cef65 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 @@ -34,7 +36,6 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb47aa4a_0.conda#607e13a8caac17f9a664bcab5302ce06 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a -https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.1-h97f6797_0.conda#5bc18c66111bc94532b0d2df00731c66 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.4-h3f801dc_0.conda#01ba04e414e47f95c03d6ddd81fd37be @@ -49,10 +50,10 @@ https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.cond https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_5.conda#8bba50c7f4679f08c861b597ad2bda6b https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 -https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h2cb61b6_1.conda#42a8e4b54e322b4cd1dbfb30a8a7ce9e +https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_0.conda#3d8da0248bdae970b4ade636a104b7f5 @@ -63,12 +64,11 @@ https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb03c661_4.conda#ca4ed8015764937c81b830f7f5b68543 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.conda#3c255be50a506c50765a93a6644f32fe +https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.0-h73754d4_1.conda#df6bf113081fdea5b363eb5a7a5ceb69 https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda#b499ce4b026493a13774bcf0f4c33849 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_2.conda#dfc5aae7b043d9f56ba99514d5e60625 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-h8261f1e_6.conda#b6093922931b535a7ba566b6f384fbe6 -https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/python-3.10.18-hd6af730_0_cpython.conda#4ea0c77cdcb0b81813a0436b162d7316 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.4-hbc0de68_0.conda#8376bd3854542be0c8c7cd07525d31c6 @@ -102,9 +102,9 @@ https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py310haaf941d_1.conda#dccb22849c78cbb9decc0af573c00a45 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-35_h59b9bed_openblas.conda#eaf80af526daf5745295d9964c2bd3cf +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-35_h4a7cf45_openblas.conda#6da7e852c812a84096b68158574398d0 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 -https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 +https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.0-ha770c72_1.conda#9a8133acc0913a6f5d83cb8a1bad4f2d https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py310h89163eb_1.conda#8ce3f0332fd6de0d737e2911d329523f https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 @@ -124,7 +124,6 @@ https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.con https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda#755cf22df8693aa0d1aec1c123fa5863 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb -https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda#30a0a26c8abccf4b7991d590fe17c699 https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_1.conda#40d0ed782a8aaa16ef248e68c06c168d https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d @@ -139,14 +138,14 @@ https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.6-py310h3406613_1. https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.59.2-py310h3406613_0.conda#32dab042830c3c31f89cdb6273585165 -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.0-ha770c72_1.conda#01d8409cffb4cb37b5007f5c46ffa55b https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda#c74d83614aec66227ae5199d98852aaf https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-35_he106b2a_openblas.conda#e62d58d32431dabed236c860dfa566ca -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-35_h7ac8fdf_openblas.conda#88fa5489509c1da59ab2ee6b234511a5 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-35_h0358290_openblas.conda#8aa3389d36791ecd31602a247b1f3641 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-35_h47877c9_openblas.conda#aa0b36b71d44f74686f13b9bfabec891 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py310hb7da693_1.conda#c22d65a244a440186aec641a61c87f7e @@ -170,11 +169,11 @@ https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.24.0-py310h1d967bf_1 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310hf779ad0_2.conda#30167b9702fd4a46cd4a98e74c9840d8 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py310h3788b33_0.conda#b6420d29123c7c823de168f49ccdfe6a https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.13-pyhd8ed1ab_0.conda#52083ce9103ec11c8130ce18517d3e83 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.14-pyhd8ed1ab_0.conda#34a8172d191193030438d7b30bcdeaf5 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a04073db11c2c86c555fb088acc8f8c1 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py310hf779ad0_2.conda#4906d8c3680f6c1273ad5a5775807867 https://conda.anaconda.org/conda-forge/noarch/nox-2025.5.1-pyhe01879c_0.conda#f294cc5e7c84a0422fcc57f33313e084 -https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.2.1-pyhd8ed1ab_0.conda#ce978e1b9ed8b8d49164e90a5cdc94cd +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda#6891acad5e136cb62a8c2ed2679d6528 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.0-pyhd8ed1ab_0.conda#e0298baaeb970b93da8f01e7c275092a https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.conda#8c29cd33b64b2eb78597fa28b5595c8d https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.0-hd8ed1ab_0.conda#03323fba6896975dc9ffae39b547c31b diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index dcfb3683..b3b4f079 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -12,6 +12,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_5.conda# https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_5.conda#264fbfba7fb20acf3b29cde153e345ce +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda#51a19bba1b8ebfb60df25cde030b7ebc https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb03c661_4.conda#1d29d2e33fe59954af82ef54a8af3fe1 @@ -25,6 +26,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.c https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_5.conda#4e02a49aaa9d5190cb630fa43528fbe6 +https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.1-he9a06e4_0.conda#af930c65e9a79a3423d6d36e265cef65 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 @@ -34,7 +36,6 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb47aa4a_0.conda#607e13a8caac17f9a664bcab5302ce06 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a -https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.1-h97f6797_0.conda#5bc18c66111bc94532b0d2df00731c66 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.4-h3f801dc_0.conda#01ba04e414e47f95c03d6ddd81fd37be @@ -49,10 +50,10 @@ https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.cond https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_5.conda#8bba50c7f4679f08c861b597ad2bda6b https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 -https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h2cb61b6_1.conda#42a8e4b54e322b4cd1dbfb30a8a7ce9e +https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_0.conda#3d8da0248bdae970b4ade636a104b7f5 @@ -63,12 +64,11 @@ https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb03c661_4.conda#ca4ed8015764937c81b830f7f5b68543 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.conda#3c255be50a506c50765a93a6644f32fe +https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.0-h73754d4_1.conda#df6bf113081fdea5b363eb5a7a5ceb69 https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda#b499ce4b026493a13774bcf0f4c33849 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_2.conda#dfc5aae7b043d9f56ba99514d5e60625 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-h8261f1e_6.conda#b6093922931b535a7ba566b6f384fbe6 -https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/python-3.11.13-h9e4cc4f_0_cpython.conda#8c399445b6dc73eab839659e6c7b5ad1 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.4-hbc0de68_0.conda#8376bd3854542be0c8c7cd07525d31c6 @@ -102,9 +102,9 @@ https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py311h724c32c_1.conda#92720706b174926bc7238cc24f3b5956 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-35_h59b9bed_openblas.conda#eaf80af526daf5745295d9964c2bd3cf +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-35_h4a7cf45_openblas.conda#6da7e852c812a84096b68158574398d0 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 -https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 +https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.0-ha770c72_1.conda#9a8133acc0913a6f5d83cb8a1bad4f2d https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py311h2dc5d0c_1.conda#6565a715337ae279e351d0abd8ffe88a https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 @@ -125,7 +125,6 @@ https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.con https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda#755cf22df8693aa0d1aec1c123fa5863 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb -https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda#30a0a26c8abccf4b7991d590fe17c699 https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_1.conda#40d0ed782a8aaa16ef248e68c06c168d https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d @@ -140,14 +139,14 @@ https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.6-py311h3778330_1. https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.59.2-py311h3778330_0.conda#5be2463c4d16a021dd571d7bf56ac799 -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.0-ha770c72_1.conda#01d8409cffb4cb37b5007f5c46ffa55b https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda#c74d83614aec66227ae5199d98852aaf https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-35_he106b2a_openblas.conda#e62d58d32431dabed236c860dfa566ca -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-35_h7ac8fdf_openblas.conda#88fa5489509c1da59ab2ee6b234511a5 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-35_h0358290_openblas.conda#8aa3389d36791ecd31602a247b1f3641 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-35_h47877c9_openblas.conda#aa0b36b71d44f74686f13b9bfabec891 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py311h3df08e7_1.conda#a36332b6f98697911d5760060f69ec87 @@ -158,10 +157,10 @@ https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.34.0-pyhd8ed1ab_0.conda#2bd6c0c96cfc4dbe9bde604a122e3e55 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.7.0-pyhe01879c_1.conda#3293644021329a96c606c3d95e180991 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.9.0-pyhcf101f3_0.conda#bbd501f34e15f8ac3c22965ba5b8e4e0 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h21f7587_118.conda#5f05af73150f62adab1492ab2d18d573 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.2-py311h2e04523_2.conda#7fb6248106c55e3ccd29ac675be01fac +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.3-py311h2e04523_0.conda#3b0d0a2241770397d3146fdcab3b49f8 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py311h9fec8c3_1.conda#035e254b83861edd98b6c83554c39214 https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhd8ed1ab_0.conda#1f987505580cb972cf28dc5f74a0f81b https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.0-pyhd8ed1ab_0.conda#ad8f901272d56cfb6bf22bb89e9be59b @@ -170,13 +169,13 @@ https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hd18a35c_5.co https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.24.0-py311h4854a17_1.conda#d0d623c1cd5a9515de1b2260d21a92aa https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h0372a8f_2.conda#c85f7b94f099fddb08358e0997dded95 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py311hdf67eae_2.conda#bb6a0f88cf345f7e7a143d349dae6d9f -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.13-pyhd8ed1ab_0.conda#52083ce9103ec11c8130ce18517d3e83 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.14-pyhd8ed1ab_0.conda#34a8172d191193030438d7b30bcdeaf5 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a04073db11c2c86c555fb088acc8f8c1 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py311h0372a8f_2.conda#487756753716efba090d06c71fb73eb6 https://conda.anaconda.org/conda-forge/noarch/nox-2025.5.1-pyhe01879c_0.conda#f294cc5e7c84a0422fcc57f33313e084 -https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.2.1-pyhd8ed1ab_0.conda#ce978e1b9ed8b8d49164e90a5cdc94cd +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda#6891acad5e136cb62a8c2ed2679d6528 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.0-pyhd8ed1ab_0.conda#e0298baaeb970b93da8f01e7c275092a -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.1-py311h1e13796_1.conda#84a0938801df456e4f3fa651d37d404f +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.2-py311h1e13796_0.conda#124834cd571d0174ad1c22701ab63199 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.0-hd8ed1ab_0.conda#03323fba6896975dc9ffae39b547c31b https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py311hc9d10f7_1.conda#904c04d8c9b1a9202ecdd4c5620a487d https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 0f826b28..fa9ed605 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -12,6 +12,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_5.conda# https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_5.conda#264fbfba7fb20acf3b29cde153e345ce +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda#51a19bba1b8ebfb60df25cde030b7ebc https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb03c661_4.conda#1d29d2e33fe59954af82ef54a8af3fe1 @@ -25,6 +26,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.c https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_5.conda#4e02a49aaa9d5190cb630fa43528fbe6 +https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.1-he9a06e4_0.conda#af930c65e9a79a3423d6d36e265cef65 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 @@ -34,7 +36,6 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb47aa4a_0.conda#607e13a8caac17f9a664bcab5302ce06 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a -https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.1-h97f6797_0.conda#5bc18c66111bc94532b0d2df00731c66 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.4-h3f801dc_0.conda#01ba04e414e47f95c03d6ddd81fd37be @@ -49,10 +50,10 @@ https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.cond https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_5.conda#8bba50c7f4679f08c861b597ad2bda6b https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 -https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h2cb61b6_1.conda#42a8e4b54e322b4cd1dbfb30a8a7ce9e +https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_0.conda#3d8da0248bdae970b4ade636a104b7f5 @@ -63,12 +64,11 @@ https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb03c661_4.conda#ca4ed8015764937c81b830f7f5b68543 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.13.3-h48d6fc4_1.conda#3c255be50a506c50765a93a6644f32fe +https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.0-h73754d4_1.conda#df6bf113081fdea5b363eb5a7a5ceb69 https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda#b499ce4b026493a13774bcf0f4c33849 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_2.conda#dfc5aae7b043d9f56ba99514d5e60625 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-h8261f1e_6.conda#b6093922931b535a7ba566b6f384fbe6 -https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/python-3.12.11-h9e4cc4f_0_cpython.conda#94206474a5608243a10c92cefbe0908f https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.4-hbc0de68_0.conda#8376bd3854542be0c8c7cd07525d31c6 @@ -102,9 +102,9 @@ https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py312h0a2e395_1.conda#cec5c1ea565944a94f82cdd6fba7cc76 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-35_h59b9bed_openblas.conda#eaf80af526daf5745295d9964c2bd3cf +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-35_h4a7cf45_openblas.conda#6da7e852c812a84096b68158574398d0 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 -https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.13.3-ha770c72_1.conda#51f5be229d83ecd401fb369ab96ae669 +https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.0-ha770c72_1.conda#9a8133acc0913a6f5d83cb8a1bad4f2d https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda#eb227c3e0bf58f5bd69c0532b157975b https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 @@ -125,7 +125,6 @@ https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.con https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda#755cf22df8693aa0d1aec1c123fa5863 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb -https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda#30a0a26c8abccf4b7991d590fe17c699 https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_1.conda#40d0ed782a8aaa16ef248e68c06c168d https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d @@ -140,14 +139,14 @@ https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.6-py312h8a5da7c_1. https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.59.2-py312h8a5da7c_0.conda#4c3f3c752ec0cd37b0a0990af20fd952 -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.13.3-ha770c72_1.conda#9ccd736d31e0c6e41f54e704e5312811 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.0-ha770c72_1.conda#01d8409cffb4cb37b5007f5c46ffa55b https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda#c74d83614aec66227ae5199d98852aaf https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-35_he106b2a_openblas.conda#e62d58d32431dabed236c860dfa566ca -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-35_h7ac8fdf_openblas.conda#88fa5489509c1da59ab2ee6b234511a5 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-35_h0358290_openblas.conda#8aa3389d36791ecd31602a247b1f3641 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-35_h47877c9_openblas.conda#aa0b36b71d44f74686f13b9bfabec891 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py312h0e488c8_1.conda#6b8bc565d829a9e46178da86e05e19d0 @@ -158,10 +157,10 @@ https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.34.0-pyhd8ed1ab_0.conda#2bd6c0c96cfc4dbe9bde604a122e3e55 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.7.0-pyhe01879c_1.conda#3293644021329a96c606c3d95e180991 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.9.0-pyhcf101f3_0.conda#bbd501f34e15f8ac3c22965ba5b8e4e0 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h21f7587_118.conda#5f05af73150f62adab1492ab2d18d573 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.2-py312h33ff503_2.conda#b6daf7dbe075ac2ae2ad59cdc45aa8c4 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.3-py312h33ff503_0.conda#261a82ff799db441c7122f6a83ade061 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py312h1c88c49_1.conda#df6837caa76c161b682c27042a851cfb https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhd8ed1ab_0.conda#1f987505580cb972cf28dc5f74a0f81b https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.0-pyhd8ed1ab_0.conda#ad8f901272d56cfb6bf22bb89e9be59b @@ -170,13 +169,13 @@ https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h68727a3_5.co https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.24.0-py312h3fa7853_1.conda#e14ae4525748c648ba9cc6b6116349b6 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312h4f23490_2.conda#ff4b5976814bc00861f962276c8fb87f https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312hd9148b4_2.conda#bce621e43978c245261c76b45edeaa3d -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.13-pyhd8ed1ab_0.conda#52083ce9103ec11c8130ce18517d3e83 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.14-pyhd8ed1ab_0.conda#34a8172d191193030438d7b30bcdeaf5 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a04073db11c2c86c555fb088acc8f8c1 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h4f23490_2.conda#cec5bc5f7d374f8f8095f8e28e31f6cb https://conda.anaconda.org/conda-forge/noarch/nox-2025.5.1-pyhe01879c_0.conda#f294cc5e7c84a0422fcc57f33313e084 -https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.2.1-pyhd8ed1ab_0.conda#ce978e1b9ed8b8d49164e90a5cdc94cd +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda#6891acad5e136cb62a8c2ed2679d6528 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.0-pyhd8ed1ab_0.conda#e0298baaeb970b93da8f01e7c275092a -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.1-py312h7a1785b_1.conda#b965f164d14d4cffe1ddcf39195b63d6 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.2-py312h7a1785b_0.conda#86a0cf3ba594247a8c44bd2111d7549c https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.0-hd8ed1ab_0.conda#03323fba6896975dc9ffae39b547c31b https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py312h56997f7_1.conda#e1987bc0d992a5636b170d16701c88c9 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a From 54ea20499b19420598db523c41750a99ab656734 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Sep 2025 11:54:09 +0100 Subject: [PATCH 493/583] Bump scitools/workflows in the dependencies group (#695) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2025.09.0 to 2025.09.3 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.09.0...2025.09.3) --- updated-dependencies: - dependency-name: scitools/workflows dependency-version: 2025.09.3 dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/ci-template-check.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 77a9c42b..3fce8daf 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.09.0 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.09.3 diff --git a/.github/workflows/ci-template-check.yml b/.github/workflows/ci-template-check.yml index dafc5d4c..807a23a0 100644 --- a/.github/workflows/ci-template-check.yml +++ b/.github/workflows/ci-template-check.yml @@ -10,7 +10,7 @@ on: jobs: prompt-share: - uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.09.0 + uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.09.3 secrets: inherit with: pr_number: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index cc8ee9fd..22763706 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.09.0 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.09.3 secrets: inherit From 9b49eed237b87fe986b63e3115e72e18c1b5ed14 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 18 Sep 2025 11:10:21 +0100 Subject: [PATCH 494/583] Bump scitools/workflows in the dependencies group (#697) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2025.09.3 to 2025.09.4 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.09.3...2025.09.4) --- updated-dependencies: - dependency-name: scitools/workflows dependency-version: 2025.09.4 dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/ci-template-check.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 3fce8daf..f810672b 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.09.3 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.09.4 diff --git a/.github/workflows/ci-template-check.yml b/.github/workflows/ci-template-check.yml index 807a23a0..81f2cf04 100644 --- a/.github/workflows/ci-template-check.yml +++ b/.github/workflows/ci-template-check.yml @@ -10,7 +10,7 @@ on: jobs: prompt-share: - uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.09.3 + uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.09.4 secrets: inherit with: pr_number: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 22763706..76753c33 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.09.3 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.09.4 secrets: inherit From 436ec7c2b9d0d56eb30fba9062d989c4a489a0f3 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 18 Sep 2025 12:40:08 +0100 Subject: [PATCH 495/583] chore: update pre-commit hooks (#694) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: update pre-commit hooks updates: - [github.com/adamchainz/blacken-docs: 1.19.1 → 1.20.0](https://github.com/adamchainz/blacken-docs/compare/1.19.1...1.20.0) - [github.com/pre-commit/mirrors-mypy: v1.17.1 → v1.18.1](https://github.com/pre-commit/mirrors-mypy/compare/v1.17.1...v1.18.1) - [github.com/astral-sh/ruff-pre-commit: v0.12.11 → v0.13.0](https://github.com/astral-sh/ruff-pre-commit/compare/v0.12.11...v0.13.0) * Fixes for RUF059. --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Patrick Peglar --- .pre-commit-config.yaml | 6 +++--- src/iris_grib/_load_convert.py | 2 +- src/iris_grib/tests/unit/__init__.py | 14 +++++++------- .../tests/unit/load_convert/test_data_cutoff.py | 2 +- .../test_grid_definition_template_4_and_5.py | 2 +- .../test__non_missing_forecast_period.py | 6 +++--- .../tests/unit/save_rules/test_data_section.py | 2 +- 7 files changed, 17 insertions(+), 17 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 48427b4d..8e04a04e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -52,7 +52,7 @@ repos: - id: trailing-whitespace - repo: https://github.com/adamchainz/blacken-docs - rev: 1.19.1 + rev: 1.20.0 hooks: - id: blacken-docs types: [file, rst] @@ -65,7 +65,7 @@ repos: additional_dependencies: [tomli] - repo: https://github.com/pre-commit/mirrors-mypy - rev: 'v1.17.1' + rev: 'v1.18.1' hooks: - id: mypy exclude: 'noxfile\.py|docs/conf\.py' @@ -78,7 +78,7 @@ repos: types: [file, python] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.12.11" + rev: "v0.13.0" hooks: - id: ruff types: [file, python] diff --git a/src/iris_grib/_load_convert.py b/src/iris_grib/_load_convert.py index 79ba4e79..83f9902b 100644 --- a/src/iris_grib/_load_convert.py +++ b/src/iris_grib/_load_convert.py @@ -2419,7 +2419,7 @@ def product_definition_template_9(section, metadata, frt_coord): # Remove the cell_method encoding the underlying statistic, as CF does not # currently support this type of representation. - (cell_method,) = metadata["cell_methods"] + (_cell_method,) = metadata["cell_methods"] # ERROR here if there is more than one. metadata["cell_methods"] = [] # NOTE: we currently don't record the nature of the underlying statistic, # as we don't have an agreed way of representing that in CF. diff --git a/src/iris_grib/tests/unit/__init__.py b/src/iris_grib/tests/unit/__init__.py index 7cbbc4d6..561b5f17 100644 --- a/src/iris_grib/tests/unit/__init__.py +++ b/src/iris_grib/tests/unit/__init__.py @@ -154,13 +154,13 @@ def _test_for_coord( self, field, convert, coord_predicate, expected_points, expected_bounds ): ( - factories, - references, - standard_name, - long_name, - units, - attributes, - cell_methods, + _factories, + _references, + _standard_name, + _long_name, + _units, + _attributes, + _cell_methods, dim_coords_and_dims, aux_coords_and_dims, ) = convert(field) diff --git a/src/iris_grib/tests/unit/load_convert/test_data_cutoff.py b/src/iris_grib/tests/unit/load_convert/test_data_cutoff.py index 35eed1a7..d94a1ace 100644 --- a/src/iris_grib/tests/unit/load_convert/test_data_cutoff.py +++ b/src/iris_grib/tests/unit/load_convert/test_data_cutoff.py @@ -29,7 +29,7 @@ def _check(self, hours, minutes, request_warning, expect_warning=False): # Check the result. if expect_warning: self.assertEqual(len(warn.mock_calls), 1) - args, kwargs = warn.call_args + args, _kwargs = warn.call_args self.assertIn("data cutoff", args[0]) else: self.assertEqual(len(warn.mock_calls), 0) diff --git a/src/iris_grib/tests/unit/load_convert/test_grid_definition_template_4_and_5.py b/src/iris_grib/tests/unit/load_convert/test_grid_definition_template_4_and_5.py index 6cfafda6..5a6b0ace 100644 --- a/src/iris_grib/tests/unit/load_convert/test_grid_definition_template_4_and_5.py +++ b/src/iris_grib/tests/unit/load_convert/test_grid_definition_template_4_and_5.py @@ -69,7 +69,7 @@ def _check(self, section, request_warning, expect_warning=False, y_dim=0, x_dim= self.assertEqual(metadata, expected) if expect_warning: self.assertEqual(len(warnings.warn.mock_calls), 1) - args, kwargs = warnings.warn.call_args + args, _kwargs = warnings.warn.call_args self.assertIn("resolution and component flags", args[0]) else: self.assertEqual(len(warnings.warn.mock_calls), 0) diff --git a/src/iris_grib/tests/unit/save_rules/test__non_missing_forecast_period.py b/src/iris_grib/tests/unit/save_rules/test__non_missing_forecast_period.py index 40f6184e..33a1c0f3 100644 --- a/src/iris_grib/tests/unit/save_rules/test__non_missing_forecast_period.py +++ b/src/iris_grib/tests/unit/save_rules/test__non_missing_forecast_period.py @@ -31,18 +31,18 @@ def _cube(self, t_bounds=False): def test_time_point(self): cube = self._cube() - rt, rt_meaning, fp, fp_meaning = _non_missing_forecast_period(cube) + _rt, rt_meaning, fp, fp_meaning = _non_missing_forecast_period(cube) self.assertEqual((rt_meaning, fp, fp_meaning), (1, 10, 1)) def test_time_bounds(self): cube = self._cube(t_bounds=True) - rt, rt_meaning, fp, fp_meaning = _non_missing_forecast_period(cube) + _rt, rt_meaning, fp, fp_meaning = _non_missing_forecast_period(cube) self.assertEqual((rt_meaning, fp, fp_meaning), (1, 3, 1)) def test_time_bounds_in_minutes(self): cube = self._cube(t_bounds=True) cube.coord("forecast_period").convert_units("minutes") - rt, rt_meaning, fp, fp_meaning = _non_missing_forecast_period(cube) + _rt, rt_meaning, fp, fp_meaning = _non_missing_forecast_period(cube) self.assertEqual((rt_meaning, fp, fp_meaning), (1, 180, 0)) diff --git a/src/iris_grib/tests/unit/save_rules/test_data_section.py b/src/iris_grib/tests/unit/save_rules/test_data_section.py index 5493ca4e..5860ce58 100644 --- a/src/iris_grib/tests/unit/save_rules/test_data_section.py +++ b/src/iris_grib/tests/unit/save_rules/test_data_section.py @@ -46,7 +46,7 @@ def assertBitmapRange(self, grib_api, min_data, max_data): # and that a suitable fill value has been chosen. grib_api.codes_set.assert_called_once_with(GRIB_MESSAGE, "bitmapPresent", 1) (args,) = grib_api.codes_set_double.call_args_list - (message, key, fill_value), kwargs = args + (message, key, fill_value), _kwargs = args self.assertIs(message, GRIB_MESSAGE) self.assertEqual(key, "missingValue") self.assertTrue( From 0c5fa62874a3e61e4b9a96368ffc2f21aca36529 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 22 Sep 2025 14:33:12 +0100 Subject: [PATCH 496/583] Updated environment lockfiles (#698) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 39 +++++++++++---------- requirements/locks/py311-linux-64.lock | 47 ++++++++++++++------------ requirements/locks/py312-linux-64.lock | 47 ++++++++++++++------------ 3 files changed, 71 insertions(+), 62 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 11a73926..91d02943 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -12,6 +12,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_5.conda# https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_5.conda#264fbfba7fb20acf3b29cde153e345ce +https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda#791365c5f65975051e4e017b5da3abf5 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda#51a19bba1b8ebfb60df25cde030b7ebc https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 @@ -30,13 +31,13 @@ https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.1-he9a06e4_0.conda# https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.2-h26f9b46_0.conda#ffffb341206dd0dab0c36053c048d621 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.3-h26f9b46_0.conda#72b3dd72e4f0b88cdacf3421313480f0 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb47aa4a_0.conda#607e13a8caac17f9a664bcab5302ce06 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a -https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.1-h97f6797_0.conda#5bc18c66111bc94532b0d2df00731c66 +https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.0-h480dda7_0.conda#5dc479effdabf54a0ff240d565287495 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.4-h3f801dc_0.conda#01ba04e414e47f95c03d6ddd81fd37be https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb03c661_4.conda#5cb5a1c9a94a78f5b23684bcb845338d @@ -52,7 +53,6 @@ https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_5.c https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h2cb61b6_1.conda#42a8e4b54e322b4cd1dbfb30a8a7ce9e https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 @@ -63,12 +63,13 @@ https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb03c661_4.conda#ca4ed8015764937c81b830f7f5b68543 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 +https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.0-h73754d4_1.conda#df6bf113081fdea5b363eb5a7a5ceb69 +https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda#8e7251989bca326a28f4a5ffbd74557a https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda#b499ce4b026493a13774bcf0f4c33849 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_2.conda#dfc5aae7b043d9f56ba99514d5e60625 -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-h8261f1e_6.conda#b6093922931b535a7ba566b6f384fbe6 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h8261f1e_0.conda#72b531694ebe4e8aa6f5745d1015c1b4 https://conda.anaconda.org/conda-forge/linux-64/python-3.10.18-hd6af730_0_cpython.conda#4ea0c77cdcb0b81813a0436b162d7316 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.4-hbc0de68_0.conda#8376bd3854542be0c8c7cd07525d31c6 @@ -84,7 +85,7 @@ https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.cond https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda#7e7d5ef1b9ed630e4a1c358d6bc62284 -https://conda.anaconda.org/conda-forge/noarch/click-8.2.1-pyh707e725_0.conda#94b550b8d3a614dbd326af798c7dfb40 +https://conda.anaconda.org/conda-forge/noarch/click-8.3.0-pyh707e725_0.conda#e76c4ba9e1837847679421b8d549b784 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.1-pyhd8ed1ab_0.conda#364ba6c9fb03886ac979b482f39ebb92 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/colorlog-6.9.0-pyh707e725_1.conda#f00fc375bd02bdbbf791f9fe26ae96ec @@ -104,7 +105,8 @@ https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py310haaf941d_1 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-35_h4a7cf45_openblas.conda#6da7e852c812a84096b68158574398d0 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 -https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.0-ha770c72_1.conda#9a8133acc0913a6f5d83cb8a1bad4f2d +https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda#f4084e4e6577797150f9b04a4560ceb0 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.0-ha9997c6_0.conda#84bed2bfefc14e4878bd16979782e522 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py310h89163eb_1.conda#8ce3f0332fd6de0d737e2911d329523f https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 @@ -114,7 +116,7 @@ https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.4.0-pyhcf101f3_0.co https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhe01879c_2.conda#aa0028616c0750c773698fdc254b2b8d +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.4-pyhcf101f3_0.conda#bf1f1292fc78307956289707e85cb1bf https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.1-pyhd8ed1ab_0.conda#205ac0b2873addb372a4384361990043 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py310hf3bd8b6_3.conda#b06ac72da31842cedc108eb69e9376d2 @@ -137,8 +139,8 @@ https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h34a4b09_1.cond https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.6-py310h3406613_1.conda#a42ce2be914eabff4bb1674c57304967 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.59.2-py310h3406613_0.conda#32dab042830c3c31f89cdb6273585165 -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.0-ha770c72_1.conda#01d8409cffb4cb37b5007f5c46ffa55b +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.60.0-py310h3406613_0.conda#3f0e123bda4a6794b7b96dfa98b5db23 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda#4afc585cd97ba8a23809406cd8a9eda8 https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda#c74d83614aec66227ae5199d98852aaf https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 @@ -146,9 +148,10 @@ https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-35_h0358290_openblas.conda#8aa3389d36791ecd31602a247b1f3641 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-35_h47877c9_openblas.conda#aa0b36b71d44f74686f13b9bfabec891 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.0-h26afc86_0.conda#c52b54db4660b44ca75b6a61c533b9f5 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py310hb7da693_1.conda#c22d65a244a440186aec641a61c87f7e +https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py310h6557065_3.conda#e169733dc0c743687a852f1c6e989140 https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh8b19718_0.conda#dfce4b2af4bfe90cdcaf56ca0b28ddf5 https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h18fbb6c_2.conda#1aeede769ec2fa0f474f8b73a7ac057f https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.1-pyhe01879c_0.conda#8200884fd84ab8754567d8523b52eaa8 @@ -158,14 +161,14 @@ https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.34.0-pyhd8ed1ab_0.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.7.0-h40b2b14_1.conda#8a77895fb29728b736a1a6c75906ea1a -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h21f7587_118.conda#5f05af73150f62adab1492ab2d18d573 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.3-nompi_h11f7409_103.conda#3ccff1066c05a1e6c221356eecc40581 https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.6-py310hefbff90_0.conda#b0cea2c364bf65cd19e023040eeab05d https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py310h71d0299_1.conda#e54b1eaeb50ad1767680181a8575a8db https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhd8ed1ab_0.conda#1f987505580cb972cf28dc5f74a0f81b https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.0-pyhd8ed1ab_0.conda#ad8f901272d56cfb6bf22bb89e9be59b https://conda.anaconda.org/conda-forge/noarch/tox-4.30.2-pyhcf101f3_0.conda#7c913233c8530cb13a90da495f91f360 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310h3788b33_5.conda#e05b0475166b68c9dc4d7937e0315654 -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.24.0-py310h1d967bf_1.conda#9b9acc1b796705b9efcc1dc6406e1726 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py310h139afa4_0.conda#6b243b9f9477ad0b0a90552ebddb27e7 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310hf779ad0_2.conda#30167b9702fd4a46cd4a98e74c9840d8 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py310h3788b33_0.conda#b6420d29123c7c823de168f49ccdfe6a https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 @@ -174,15 +177,15 @@ https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a0 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py310hf779ad0_2.conda#4906d8c3680f6c1273ad5a5775807867 https://conda.anaconda.org/conda-forge/noarch/nox-2025.5.1-pyhe01879c_0.conda#f294cc5e7c84a0422fcc57f33313e084 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda#6891acad5e136cb62a8c2ed2679d6528 -https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.0-pyhd8ed1ab_0.conda#e0298baaeb970b93da8f01e7c275092a +https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.conda#8c29cd33b64b2eb78597fa28b5595c8d https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.0-hd8ed1ab_0.conda#03323fba6896975dc9ffae39b547c31b -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py310hf4e7fdd_1.conda#d656bc59cf459d0ef1f725d57f646ae0 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py310h777b3ac_2.conda#57300c0fae7dd56979c5b1877292b411 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py310hf779ad0_1.conda#5e4aea6b728177b53e8a216922ebd6a2 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.42.0-h5f92351_0.conda#9862a9cd17ade6d0e72b4c0a10123cf2 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.42.0-h83bc92c_1.conda#928cc8b0a73355d11d32f4ffabaffa0c https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.6-py310hfde16b3_1.conda#65d3af47b03c91d9d2bb69dd8307a661 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py310hbf8a091_103.conda#564c1aa7de5be5b006c0f17a123bc932 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py310he90c06d_104.conda#4559f793117b2b02068fb13d5254cfa8 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.3.0-pyha770c72_0.conda#bc6c44af2a9e6067dd7e949ef10cdfba https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py310h0158d43_1.conda#871b5f746960f99ac23dbc73d14e2ad0 @@ -193,7 +196,7 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda#e9fb3fe8a5b758b4aff187d434f94f03 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jquery-4.1-pyhd8ed1ab_1.conda#403185829255321ea427333f7773dd1f -https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-3.0.1-pyha770c72_0.conda#740536f8a54250b1964e494c0bf5c9c3 +https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-3.0.2-pyha770c72_0.conda#cec0cc87b40171bc323a9d80b619c9c5 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda#00534ebcc0375929b45c3039b5ba7636 https://conda.anaconda.org/conda-forge/noarch/sphinx-8.1.3-pyhd8ed1ab_1.conda#1a3281a0dc355c02b5506d87db2d78ac https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda#3bc61f7161d28137797e038263c04c54 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index b3b4f079..6f649e46 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -12,6 +12,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_5.conda# https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_5.conda#264fbfba7fb20acf3b29cde153e345ce +https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda#791365c5f65975051e4e017b5da3abf5 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda#51a19bba1b8ebfb60df25cde030b7ebc https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 @@ -30,13 +31,13 @@ https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.1-he9a06e4_0.conda# https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.2-h26f9b46_0.conda#ffffb341206dd0dab0c36053c048d621 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.3-h26f9b46_0.conda#72b3dd72e4f0b88cdacf3421313480f0 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb47aa4a_0.conda#607e13a8caac17f9a664bcab5302ce06 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a -https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.1-h97f6797_0.conda#5bc18c66111bc94532b0d2df00731c66 +https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.0-h480dda7_0.conda#5dc479effdabf54a0ff240d565287495 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.4-h3f801dc_0.conda#01ba04e414e47f95c03d6ddd81fd37be https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb03c661_4.conda#5cb5a1c9a94a78f5b23684bcb845338d @@ -52,7 +53,6 @@ https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_5.c https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h2cb61b6_1.conda#42a8e4b54e322b4cd1dbfb30a8a7ce9e https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 @@ -63,12 +63,13 @@ https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb03c661_4.conda#ca4ed8015764937c81b830f7f5b68543 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 +https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.0-h73754d4_1.conda#df6bf113081fdea5b363eb5a7a5ceb69 +https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda#8e7251989bca326a28f4a5ffbd74557a https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda#b499ce4b026493a13774bcf0f4c33849 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_2.conda#dfc5aae7b043d9f56ba99514d5e60625 -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-h8261f1e_6.conda#b6093922931b535a7ba566b6f384fbe6 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h8261f1e_0.conda#72b531694ebe4e8aa6f5745d1015c1b4 https://conda.anaconda.org/conda-forge/linux-64/python-3.11.13-h9e4cc4f_0_cpython.conda#8c399445b6dc73eab839659e6c7b5ad1 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.4-hbc0de68_0.conda#8376bd3854542be0c8c7cd07525d31c6 @@ -84,7 +85,7 @@ https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.cond https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda#7e7d5ef1b9ed630e4a1c358d6bc62284 -https://conda.anaconda.org/conda-forge/noarch/click-8.2.1-pyh707e725_0.conda#94b550b8d3a614dbd326af798c7dfb40 +https://conda.anaconda.org/conda-forge/noarch/click-8.3.0-pyh707e725_0.conda#e76c4ba9e1837847679421b8d549b784 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.1-pyhd8ed1ab_0.conda#364ba6c9fb03886ac979b482f39ebb92 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/colorlog-6.9.0-pyh707e725_1.conda#f00fc375bd02bdbbf791f9fe26ae96ec @@ -104,7 +105,8 @@ https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py311h724c32c_1 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-35_h4a7cf45_openblas.conda#6da7e852c812a84096b68158574398d0 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 -https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.0-ha770c72_1.conda#9a8133acc0913a6f5d83cb8a1bad4f2d +https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda#f4084e4e6577797150f9b04a4560ceb0 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.0-ha9997c6_0.conda#84bed2bfefc14e4878bd16979782e522 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py311h2dc5d0c_1.conda#6565a715337ae279e351d0abd8ffe88a https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 @@ -114,7 +116,7 @@ https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.4.0-pyhcf101f3_0.co https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhe01879c_2.conda#aa0028616c0750c773698fdc254b2b8d +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.4-pyhcf101f3_0.conda#bf1f1292fc78307956289707e85cb1bf https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.1-pyhd8ed1ab_0.conda#205ac0b2873addb372a4384361990043 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py311h041eb40_3.conda#0f83e5cc946a8a989c17bb0edfaca856 @@ -138,8 +140,8 @@ https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311h5b438cf_1.cond https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.6-py311h3778330_1.conda#d4d341946049625afebfb720f011753a https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.59.2-py311h3778330_0.conda#5be2463c4d16a021dd571d7bf56ac799 -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.0-ha770c72_1.conda#01d8409cffb4cb37b5007f5c46ffa55b +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.60.0-py311h3778330_0.conda#92d090806dcf5e5c5f2f3cfacf1d6aa3 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda#4afc585cd97ba8a23809406cd8a9eda8 https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda#c74d83614aec66227ae5199d98852aaf https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 @@ -147,26 +149,27 @@ https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-35_h0358290_openblas.conda#8aa3389d36791ecd31602a247b1f3641 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-35_h47877c9_openblas.conda#aa0b36b71d44f74686f13b9bfabec891 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.0-h26afc86_0.conda#c52b54db4660b44ca75b6a61c533b9f5 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py311h3df08e7_1.conda#a36332b6f98697911d5760060f69ec87 +https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py311h98278a2_3.conda#76839149314cc1d07f270174801576b0 https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh8b19718_0.conda#dfce4b2af4bfe90cdcaf56ca0b28ddf5 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h18fbb6c_2.conda#1aeede769ec2fa0f474f8b73a7ac057f +https://conda.anaconda.org/conda-forge/linux-64/proj-9.7.0-hb72c0af_0.conda#438e75abf4d8c9c1d9e483b6c3f36282 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.1-pyhe01879c_0.conda#8200884fd84ab8754567d8523b52eaa8 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.34.0-pyhd8ed1ab_0.conda#2bd6c0c96cfc4dbe9bde604a122e3e55 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.9.0-pyhcf101f3_0.conda#bbd501f34e15f8ac3c22965ba5b8e4e0 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.9.1-pyhcf101f3_0.conda#c49de33395d775a92ea90e0cb34c3577 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h21f7587_118.conda#5f05af73150f62adab1492ab2d18d573 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.3-nompi_h11f7409_103.conda#3ccff1066c05a1e6c221356eecc40581 https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.3-py311h2e04523_0.conda#3b0d0a2241770397d3146fdcab3b49f8 -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py311h9fec8c3_1.conda#035e254b83861edd98b6c83554c39214 +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py311h4e6619b_2.conda#8092837339ae2e3697980df6686f996e https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhd8ed1ab_0.conda#1f987505580cb972cf28dc5f74a0f81b https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.0-pyhd8ed1ab_0.conda#ad8f901272d56cfb6bf22bb89e9be59b https://conda.anaconda.org/conda-forge/noarch/tox-4.30.2-pyhcf101f3_0.conda#7c913233c8530cb13a90da495f91f360 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hd18a35c_5.conda#4e8447ca8558a203ec0577b4730073f3 -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.24.0-py311h4854a17_1.conda#d0d623c1cd5a9515de1b2260d21a92aa +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py311haee01d2_0.conda#0fd242142b0691eb9311dc32c1d4ab76 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h0372a8f_2.conda#c85f7b94f099fddb08358e0997dded95 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py311hdf67eae_2.conda#bb6a0f88cf345f7e7a143d349dae6d9f https://conda.anaconda.org/conda-forge/noarch/identify-2.6.14-pyhd8ed1ab_0.conda#34a8172d191193030438d7b30bcdeaf5 @@ -174,15 +177,15 @@ https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a0 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py311h0372a8f_2.conda#487756753716efba090d06c71fb73eb6 https://conda.anaconda.org/conda-forge/noarch/nox-2025.5.1-pyhe01879c_0.conda#f294cc5e7c84a0422fcc57f33313e084 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda#6891acad5e136cb62a8c2ed2679d6528 -https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.0-pyhd8ed1ab_0.conda#e0298baaeb970b93da8f01e7c275092a +https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.2-py311h1e13796_0.conda#124834cd571d0174ad1c22701ab63199 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.0-hd8ed1ab_0.conda#03323fba6896975dc9ffae39b547c31b -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py311hc9d10f7_1.conda#904c04d8c9b1a9202ecdd4c5620a487d +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py311hdb2cc66_2.conda#cb33f21816c6a02ea3e40b8a9767b65b https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py311h0372a8f_1.conda#ef8650a6059a907122d59a740207f50e -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.42.0-h5f92351_0.conda#9862a9cd17ade6d0e72b4c0a10123cf2 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.42.0-h83bc92c_1.conda#928cc8b0a73355d11d32f4ffabaffa0c https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.6-py311h0f3be63_1.conda#65ddf155ea43aa3bb366cb03ddf3436a -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py311h0b29842_103.conda#a617b87dbda983a999bac489f4ea23e5 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py311h6623971_104.conda#fc6c31f2b2bd3fce50d5496ce30d04ff https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.3.0-pyha770c72_0.conda#bc6c44af2a9e6067dd7e949ef10cdfba https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py311hed34c8f_1.conda#17c710c32010688086b28c088a8be579 @@ -193,7 +196,7 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda#e9fb3fe8a5b758b4aff187d434f94f03 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jquery-4.1-pyhd8ed1ab_1.conda#403185829255321ea427333f7773dd1f -https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-3.0.1-pyha770c72_0.conda#740536f8a54250b1964e494c0bf5c9c3 +https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-3.0.2-pyha770c72_0.conda#cec0cc87b40171bc323a9d80b619c9c5 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda#00534ebcc0375929b45c3039b5ba7636 -https://conda.anaconda.org/conda-forge/noarch/sphinx-8.3.0-pyhd8ed1ab_0.conda#6ce9ddee4c0f68bda548303196f4cf4c +https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda#f7af826063ed569bb13f7207d6f949b0 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda#3bc61f7161d28137797e038263c04c54 diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index fa9ed605..8f52af72 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -12,6 +12,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_5.conda# https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_5.conda#264fbfba7fb20acf3b29cde153e345ce +https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda#791365c5f65975051e4e017b5da3abf5 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda#51a19bba1b8ebfb60df25cde030b7ebc https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 @@ -30,13 +31,13 @@ https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.1-he9a06e4_0.conda# https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.2-h26f9b46_0.conda#ffffb341206dd0dab0c36053c048d621 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.3-h26f9b46_0.conda#72b3dd72e4f0b88cdacf3421313480f0 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb47aa4a_0.conda#607e13a8caac17f9a664bcab5302ce06 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a -https://conda.anaconda.org/conda-forge/linux-64/geos-3.13.1-h97f6797_0.conda#5bc18c66111bc94532b0d2df00731c66 +https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.0-h480dda7_0.conda#5dc479effdabf54a0ff240d565287495 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.4-h3f801dc_0.conda#01ba04e414e47f95c03d6ddd81fd37be https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb03c661_4.conda#5cb5a1c9a94a78f5b23684bcb845338d @@ -52,7 +53,6 @@ https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_5.c https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.8-h2cb61b6_1.conda#42a8e4b54e322b4cd1dbfb30a8a7ce9e https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 @@ -63,12 +63,13 @@ https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb03c661_4.conda#ca4ed8015764937c81b830f7f5b68543 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 +https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.0-h73754d4_1.conda#df6bf113081fdea5b363eb5a7a5ceb69 +https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda#8e7251989bca326a28f4a5ffbd74557a https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda#b499ce4b026493a13774bcf0f4c33849 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_2.conda#dfc5aae7b043d9f56ba99514d5e60625 -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-h8261f1e_6.conda#b6093922931b535a7ba566b6f384fbe6 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h8261f1e_0.conda#72b531694ebe4e8aa6f5745d1015c1b4 https://conda.anaconda.org/conda-forge/linux-64/python-3.12.11-h9e4cc4f_0_cpython.conda#94206474a5608243a10c92cefbe0908f https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.4-hbc0de68_0.conda#8376bd3854542be0c8c7cd07525d31c6 @@ -84,7 +85,7 @@ https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.cond https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda#7e7d5ef1b9ed630e4a1c358d6bc62284 -https://conda.anaconda.org/conda-forge/noarch/click-8.2.1-pyh707e725_0.conda#94b550b8d3a614dbd326af798c7dfb40 +https://conda.anaconda.org/conda-forge/noarch/click-8.3.0-pyh707e725_0.conda#e76c4ba9e1837847679421b8d549b784 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.1-pyhd8ed1ab_0.conda#364ba6c9fb03886ac979b482f39ebb92 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/colorlog-6.9.0-pyh707e725_1.conda#f00fc375bd02bdbbf791f9fe26ae96ec @@ -104,7 +105,8 @@ https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py312h0a2e395_1 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-35_h4a7cf45_openblas.conda#6da7e852c812a84096b68158574398d0 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 -https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.0-ha770c72_1.conda#9a8133acc0913a6f5d83cb8a1bad4f2d +https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda#f4084e4e6577797150f9b04a4560ceb0 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.0-ha9997c6_0.conda#84bed2bfefc14e4878bd16979782e522 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda#eb227c3e0bf58f5bd69c0532b157975b https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 @@ -114,7 +116,7 @@ https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.4.0-pyhcf101f3_0.co https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.3-pyhe01879c_2.conda#aa0028616c0750c773698fdc254b2b8d +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.4-pyhcf101f3_0.conda#bf1f1292fc78307956289707e85cb1bf https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.1-pyhd8ed1ab_0.conda#205ac0b2873addb372a4384361990043 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h0d868a3_3.conda#a5e5b1051bd92e2382dc687e6f7579dc @@ -138,8 +140,8 @@ https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h35888ee_1.cond https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.6-py312h8a5da7c_1.conda#0bffddcd9276d65304761c70ba5c2882 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.59.2-py312h8a5da7c_0.conda#4c3f3c752ec0cd37b0a0990af20fd952 -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.0-ha770c72_1.conda#01d8409cffb4cb37b5007f5c46ffa55b +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.60.0-py312h8a5da7c_0.conda#db25d5216c11abf6545782baa2875c80 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda#4afc585cd97ba8a23809406cd8a9eda8 https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda#c74d83614aec66227ae5199d98852aaf https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 @@ -147,26 +149,27 @@ https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-35_h0358290_openblas.conda#8aa3389d36791ecd31602a247b1f3641 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-35_h47877c9_openblas.conda#aa0b36b71d44f74686f13b9bfabec891 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.0-h26afc86_0.conda#c52b54db4660b44ca75b6a61c533b9f5 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py312h0e488c8_1.conda#6b8bc565d829a9e46178da86e05e19d0 +https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py312h7b42cdd_3.conda#1d7f05c3f8bb4e98d02fca45f0920b23 https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh8b19718_0.conda#dfce4b2af4bfe90cdcaf56ca0b28ddf5 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h18fbb6c_2.conda#1aeede769ec2fa0f474f8b73a7ac057f +https://conda.anaconda.org/conda-forge/linux-64/proj-9.7.0-hb72c0af_0.conda#438e75abf4d8c9c1d9e483b6c3f36282 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.1-pyhe01879c_0.conda#8200884fd84ab8754567d8523b52eaa8 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.34.0-pyhd8ed1ab_0.conda#2bd6c0c96cfc4dbe9bde604a122e3e55 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.9.0-pyhcf101f3_0.conda#bbd501f34e15f8ac3c22965ba5b8e4e0 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.9.1-pyhcf101f3_0.conda#c49de33395d775a92ea90e0cb34c3577 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h21f7587_118.conda#5f05af73150f62adab1492ab2d18d573 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.3-nompi_h11f7409_103.conda#3ccff1066c05a1e6c221356eecc40581 https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.3-py312h33ff503_0.conda#261a82ff799db441c7122f6a83ade061 -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py312h1c88c49_1.conda#df6837caa76c161b682c27042a851cfb +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py312h9b6a7d9_2.conda#573b9a879a3a42990f9c51d7376dce6b https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhd8ed1ab_0.conda#1f987505580cb972cf28dc5f74a0f81b https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.0-pyhd8ed1ab_0.conda#ad8f901272d56cfb6bf22bb89e9be59b https://conda.anaconda.org/conda-forge/noarch/tox-4.30.2-pyhcf101f3_0.conda#7c913233c8530cb13a90da495f91f360 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h68727a3_5.conda#f9664ee31aed96c85b7319ab0a693341 -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.24.0-py312h3fa7853_1.conda#e14ae4525748c648ba9cc6b6116349b6 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py312h5253ce2_0.conda#05d73100768745631ab3de9dc1e08da2 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312h4f23490_2.conda#ff4b5976814bc00861f962276c8fb87f https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312hd9148b4_2.conda#bce621e43978c245261c76b45edeaa3d https://conda.anaconda.org/conda-forge/noarch/identify-2.6.14-pyhd8ed1ab_0.conda#34a8172d191193030438d7b30bcdeaf5 @@ -174,15 +177,15 @@ https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a0 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h4f23490_2.conda#cec5bc5f7d374f8f8095f8e28e31f6cb https://conda.anaconda.org/conda-forge/noarch/nox-2025.5.1-pyhe01879c_0.conda#f294cc5e7c84a0422fcc57f33313e084 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda#6891acad5e136cb62a8c2ed2679d6528 -https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.0-pyhd8ed1ab_0.conda#e0298baaeb970b93da8f01e7c275092a +https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.2-py312h7a1785b_0.conda#86a0cf3ba594247a8c44bd2111d7549c https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.0-hd8ed1ab_0.conda#03323fba6896975dc9ffae39b547c31b -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py312h56997f7_1.conda#e1987bc0d992a5636b170d16701c88c9 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py312h950be2a_2.conda#6333340e60402c7456811a14e4e12b26 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py312h4f23490_1.conda#ac0a1a874ce9e3f8940a3a908ff74da9 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.42.0-h5f92351_0.conda#9862a9cd17ade6d0e72b4c0a10123cf2 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.42.0-h83bc92c_1.conda#928cc8b0a73355d11d32f4ffabaffa0c https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.6-py312he3d6523_1.conda#94926ee1d68e678fb4cfdb0727a0927e -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py312hdd76c12_103.conda#499a091c66c39f0264aa9219490f0474 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py312hf6400b3_104.conda#e3f2d3ba3f36a10a32219dff624f4ea0 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.3.0-pyha770c72_0.conda#bc6c44af2a9e6067dd7e949ef10cdfba https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py312hf79963d_1.conda#6c913a686cb4060cbd7639a36fa144f0 @@ -193,7 +196,7 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda#e9fb3fe8a5b758b4aff187d434f94f03 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jquery-4.1-pyhd8ed1ab_1.conda#403185829255321ea427333f7773dd1f -https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-3.0.1-pyha770c72_0.conda#740536f8a54250b1964e494c0bf5c9c3 +https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-3.0.2-pyha770c72_0.conda#cec0cc87b40171bc323a9d80b619c9c5 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda#00534ebcc0375929b45c3039b5ba7636 -https://conda.anaconda.org/conda-forge/noarch/sphinx-8.3.0-pyhd8ed1ab_0.conda#6ce9ddee4c0f68bda548303196f4cf4c +https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda#f7af826063ed569bb13f7207d6f949b0 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda#3bc61f7161d28137797e038263c04c54 From 4e578b52557923dd07da0daf91224de68279ca1f Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 23 Sep 2025 14:18:19 +0100 Subject: [PATCH 497/583] chore: update pre-commit hooks (#699) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/pre-commit/mirrors-mypy: v1.18.1 → v1.18.2](https://github.com/pre-commit/mirrors-mypy/compare/v1.18.1...v1.18.2) - [github.com/astral-sh/ruff-pre-commit: v0.13.0 → v0.13.1](https://github.com/astral-sh/ruff-pre-commit/compare/v0.13.0...v0.13.1) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 8e04a04e..782f9b15 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -65,7 +65,7 @@ repos: additional_dependencies: [tomli] - repo: https://github.com/pre-commit/mirrors-mypy - rev: 'v1.18.1' + rev: 'v1.18.2' hooks: - id: mypy exclude: 'noxfile\.py|docs/conf\.py' @@ -78,7 +78,7 @@ repos: types: [file, python] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.13.0" + rev: "v0.13.1" hooks: - id: ruff types: [file, python] From b6076a29069ccb87fdc93b4625b3358143b66160 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Sep 2025 11:32:30 +0100 Subject: [PATCH 498/583] Bump scitools/workflows in the dependencies group (#700) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2025.09.4 to 2025.09.5 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.09.4...2025.09.5) --- updated-dependencies: - dependency-name: scitools/workflows dependency-version: 2025.09.5 dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/ci-template-check.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index f810672b..841fbc67 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.09.4 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.09.5 diff --git a/.github/workflows/ci-template-check.yml b/.github/workflows/ci-template-check.yml index 81f2cf04..1c7309f3 100644 --- a/.github/workflows/ci-template-check.yml +++ b/.github/workflows/ci-template-check.yml @@ -10,7 +10,7 @@ on: jobs: prompt-share: - uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.09.4 + uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.09.5 secrets: inherit with: pr_number: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 76753c33..2d96cd55 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.09.4 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.09.5 secrets: inherit From a528f57879b13e985ec7bf1a109e6429cbeac152 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 29 Sep 2025 10:02:51 +0100 Subject: [PATCH 499/583] Updated environment lockfiles (#701) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 30 +++++++++++++------------- requirements/locks/py311-linux-64.lock | 30 +++++++++++++------------- requirements/locks/py312-linux-64.lock | 30 +++++++++++++------------- 3 files changed, 45 insertions(+), 45 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 91d02943..45f4f4cc 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -6,7 +6,7 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.ta https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.conda#05e00f3b21e88bb3d658ac700b2ce58c https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda#74784ee3d225fc3dca89edb635b4e5cc -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda#0be7c6e070c19105f966d3758448d018 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-ha97dd6f_2.conda#14bae321b8127b63cba276bd53fac237 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_5.conda#dcd5ff1940cd38f6df777cac86819d60 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d @@ -27,11 +27,11 @@ https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.c https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_5.conda#4e02a49aaa9d5190cb630fa43528fbe6 -https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.1-he9a06e4_0.conda#af930c65e9a79a3423d6d36e265cef65 +https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda#80c07c68d2f6870250959dcc95b209d1 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.3-h26f9b46_0.conda#72b3dd72e4f0b88cdacf3421313480f0 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.3-h26f9b46_1.conda#4fc6c4c88da64c0219c0c6c0408cedd4 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 @@ -103,25 +103,25 @@ https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py310haaf941d_1.conda#dccb22849c78cbb9decc0af573c00a45 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-35_h4a7cf45_openblas.conda#6da7e852c812a84096b68158574398d0 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-36_h4a7cf45_openblas.conda#2a6122504dc8ea139337046d34a110cb https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda#f4084e4e6577797150f9b04a4560ceb0 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.0-ha9997c6_0.conda#84bed2bfefc14e4878bd16979782e522 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.0-ha9997c6_1.conda#b24dd2bd61cd8e4f8a13ee2a945a723c https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py310h89163eb_1.conda#8ce3f0332fd6de0d737e2911d329523f https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h55fea9a_1.conda#01243c4aaf71bde0297966125aea4706 +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.4.0-pyhcf101f3_0.conda#cc9d9a3929503785403dbfad9f707145 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.4-pyhcf101f3_0.conda#bf1f1292fc78307956289707e85cb1bf +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.5-pyhcf101f3_0.conda#6c8979be6d7a17692793114fa26916e8 https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.1-pyhd8ed1ab_0.conda#205ac0b2873addb372a4384361990043 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py310hf3bd8b6_3.conda#b06ac72da31842cedc108eb69e9376d2 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py310h89163eb_2.conda#fd343408e64cf1e273ab7c710da374db +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py310h3406613_0.conda#bc058b3b89fcb525bb4977832aa52014 https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda#755cf22df8693aa0d1aec1c123fa5863 @@ -135,8 +135,8 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 -https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py310h34a4b09_1.conda#6d582e073a58a7a011716b135819b94a -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.6-py310h3406613_1.conda#a42ce2be914eabff4bb1674c57304967 +https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py310h34a4b09_0.conda#5a554da3ddfd6dae35ed0f76f70970ff +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.7-py310h3406613_0.conda#bc73c61ff9544f3ff7df03696e0548c2 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.60.0-py310h3406613_0.conda#3f0e123bda4a6794b7b96dfa98b5db23 @@ -146,9 +146,9 @@ https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.c https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-35_h0358290_openblas.conda#8aa3389d36791ecd31602a247b1f3641 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-35_h47877c9_openblas.conda#aa0b36b71d44f74686f13b9bfabec891 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.0-h26afc86_0.conda#c52b54db4660b44ca75b6a61c533b9f5 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-36_h0358290_openblas.conda#13a3fe5f9812ac8c5710ef8c03105121 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-36_h47877c9_openblas.conda#55daaac7ecf8ebd169cdbe34dc79549e +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.0-h26afc86_1.conda#8337b675e0cad517fbcb3daf7588087a https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py310h6557065_3.conda#e169733dc0c743687a852f1c6e989140 @@ -180,7 +180,7 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.cond https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.conda#8c29cd33b64b2eb78597fa28b5595c8d https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.0-hd8ed1ab_0.conda#03323fba6896975dc9ffae39b547c31b -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py310h777b3ac_2.conda#57300c0fae7dd56979c5b1877292b411 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py310h777b3ac_0.conda#486ffd32d6cc932f43df4066efd3c973 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py310hf779ad0_1.conda#5e4aea6b728177b53e8a216922ebd6a2 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.42.0-h83bc92c_1.conda#928cc8b0a73355d11d32f4ffabaffa0c @@ -190,7 +190,7 @@ https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.3.0-pyha770c72_0.cond https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py310h0158d43_1.conda#871b5f746960f99ac23dbc73d14e2ad0 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py310hf779ad0_1.conda#79e35aaf248af3825722406ef19d896c +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.42.0-py310hf779ad0_0.conda#094c17b3651f0607fde08a3209a4783f https://conda.anaconda.org/conda-forge/noarch/iris-3.11.1-pyha770c72_1.conda#f501583062225a070455d011d81b07bf https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 6f649e46..8781f739 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -6,7 +6,7 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.ta https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda#8fcb6b0e2161850556231336dae58358 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda#74784ee3d225fc3dca89edb635b4e5cc -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda#0be7c6e070c19105f966d3758448d018 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-ha97dd6f_2.conda#14bae321b8127b63cba276bd53fac237 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_5.conda#dcd5ff1940cd38f6df777cac86819d60 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d @@ -27,11 +27,11 @@ https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.c https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_5.conda#4e02a49aaa9d5190cb630fa43528fbe6 -https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.1-he9a06e4_0.conda#af930c65e9a79a3423d6d36e265cef65 +https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda#80c07c68d2f6870250959dcc95b209d1 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.3-h26f9b46_0.conda#72b3dd72e4f0b88cdacf3421313480f0 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.3-h26f9b46_1.conda#4fc6c4c88da64c0219c0c6c0408cedd4 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 @@ -103,25 +103,25 @@ https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py311h724c32c_1.conda#92720706b174926bc7238cc24f3b5956 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-35_h4a7cf45_openblas.conda#6da7e852c812a84096b68158574398d0 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-36_h4a7cf45_openblas.conda#2a6122504dc8ea139337046d34a110cb https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda#f4084e4e6577797150f9b04a4560ceb0 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.0-ha9997c6_0.conda#84bed2bfefc14e4878bd16979782e522 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.0-ha9997c6_1.conda#b24dd2bd61cd8e4f8a13ee2a945a723c https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py311h2dc5d0c_1.conda#6565a715337ae279e351d0abd8ffe88a https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h55fea9a_1.conda#01243c4aaf71bde0297966125aea4706 +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.4.0-pyhcf101f3_0.conda#cc9d9a3929503785403dbfad9f707145 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.4-pyhcf101f3_0.conda#bf1f1292fc78307956289707e85cb1bf +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.5-pyhcf101f3_0.conda#6c8979be6d7a17692793114fa26916e8 https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.1-pyhd8ed1ab_0.conda#205ac0b2873addb372a4384361990043 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py311h041eb40_3.conda#0f83e5cc946a8a989c17bb0edfaca856 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py311h2dc5d0c_2.conda#014417753f948da1f70d132b2de573be +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py311h3778330_0.conda#707c3d23f2476d3bfde8345b4e7d7853 https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-3.1.0-pyhd8ed1ab_0.conda#5f0f24f8032c2c1bb33f59b75974f5fc https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 @@ -136,8 +136,8 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 -https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py311h5b438cf_1.conda#82e0123a459d095ac99c76d150ccdacf -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.6-py311h3778330_1.conda#d4d341946049625afebfb720f011753a +https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py311h5b438cf_0.conda#6cb6c4d57d12dfa0ecdd19dbe758ffc9 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.7-py311h3778330_0.conda#53fdad3b032eee40cf74ac0de87e4518 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.60.0-py311h3778330_0.conda#92d090806dcf5e5c5f2f3cfacf1d6aa3 @@ -147,9 +147,9 @@ https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.c https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-35_h0358290_openblas.conda#8aa3389d36791ecd31602a247b1f3641 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-35_h47877c9_openblas.conda#aa0b36b71d44f74686f13b9bfabec891 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.0-h26afc86_0.conda#c52b54db4660b44ca75b6a61c533b9f5 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-36_h0358290_openblas.conda#13a3fe5f9812ac8c5710ef8c03105121 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-36_h47877c9_openblas.conda#55daaac7ecf8ebd169cdbe34dc79549e +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.0-h26afc86_1.conda#8337b675e0cad517fbcb3daf7588087a https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py311h98278a2_3.conda#76839149314cc1d07f270174801576b0 @@ -180,7 +180,7 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.cond https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.2-py311h1e13796_0.conda#124834cd571d0174ad1c22701ab63199 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.0-hd8ed1ab_0.conda#03323fba6896975dc9ffae39b547c31b -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py311hdb2cc66_2.conda#cb33f21816c6a02ea3e40b8a9767b65b +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py311hdb2cc66_0.conda#7c0a99c77c423ff83b327e4eff3f82f5 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py311h0372a8f_1.conda#ef8650a6059a907122d59a740207f50e https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.42.0-h83bc92c_1.conda#928cc8b0a73355d11d32f4ffabaffa0c @@ -190,7 +190,7 @@ https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.3.0-pyha770c72_0.cond https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py311hed34c8f_1.conda#17c710c32010688086b28c088a8be579 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py311h0372a8f_1.conda#199d10eea438605a89e48fff4574353e +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.42.0-py311h0372a8f_0.conda#3fcc860678286aee5e74813dee4b0ae9 https://conda.anaconda.org/conda-forge/noarch/iris-3.13.1-pyha770c72_0.conda#33d150f58eb36070d2b8ad6dd1bd50d7 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 8f52af72..aa345285 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -6,7 +6,7 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.ta https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda#c3efd25ac4d74b1584d2f7a57195ddf1 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda#74784ee3d225fc3dca89edb635b4e5cc -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1423503_1.conda#0be7c6e070c19105f966d3758448d018 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-ha97dd6f_2.conda#14bae321b8127b63cba276bd53fac237 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_5.conda#dcd5ff1940cd38f6df777cac86819d60 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d @@ -27,11 +27,11 @@ https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.c https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_5.conda#4e02a49aaa9d5190cb630fa43528fbe6 -https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.1-he9a06e4_0.conda#af930c65e9a79a3423d6d36e265cef65 +https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda#80c07c68d2f6870250959dcc95b209d1 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.3-h26f9b46_0.conda#72b3dd72e4f0b88cdacf3421313480f0 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.3-h26f9b46_1.conda#4fc6c4c88da64c0219c0c6c0408cedd4 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 @@ -103,25 +103,25 @@ https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py312h0a2e395_1.conda#cec5c1ea565944a94f82cdd6fba7cc76 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-35_h4a7cf45_openblas.conda#6da7e852c812a84096b68158574398d0 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-36_h4a7cf45_openblas.conda#2a6122504dc8ea139337046d34a110cb https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda#f4084e4e6577797150f9b04a4560ceb0 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.0-ha9997c6_0.conda#84bed2bfefc14e4878bd16979782e522 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.0-ha9997c6_1.conda#b24dd2bd61cd8e4f8a13ee2a945a723c https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda#eb227c3e0bf58f5bd69c0532b157975b https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h55fea9a_1.conda#01243c4aaf71bde0297966125aea4706 +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.4.0-pyhcf101f3_0.conda#cc9d9a3929503785403dbfad9f707145 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.4-pyhcf101f3_0.conda#bf1f1292fc78307956289707e85cb1bf +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.5-pyhcf101f3_0.conda#6c8979be6d7a17692793114fa26916e8 https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.1-pyhd8ed1ab_0.conda#205ac0b2873addb372a4384361990043 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h0d868a3_3.conda#a5e5b1051bd92e2382dc687e6f7579dc https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h178313f_2.conda#cf2485f39740de96e2a7f2bb18ed2fee +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_0.conda#fba10c2007c8b06f77c5a23ce3a635ad https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-3.1.0-pyhd8ed1ab_0.conda#5f0f24f8032c2c1bb33f59b75974f5fc https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 @@ -136,8 +136,8 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 -https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h35888ee_1.conda#918e2510c64000a916355dcf09d26da2 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.6-py312h8a5da7c_1.conda#0bffddcd9276d65304761c70ba5c2882 +https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py312h35888ee_0.conda#60b9cd087d22272885a6b8366b1d3d43 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.7-py312h8a5da7c_0.conda#03d83efc728a6721a0f1616a04a7fc84 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.60.0-py312h8a5da7c_0.conda#db25d5216c11abf6545782baa2875c80 @@ -147,9 +147,9 @@ https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.c https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-35_h0358290_openblas.conda#8aa3389d36791ecd31602a247b1f3641 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-35_h47877c9_openblas.conda#aa0b36b71d44f74686f13b9bfabec891 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.0-h26afc86_0.conda#c52b54db4660b44ca75b6a61c533b9f5 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-36_h0358290_openblas.conda#13a3fe5f9812ac8c5710ef8c03105121 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-36_h47877c9_openblas.conda#55daaac7ecf8ebd169cdbe34dc79549e +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.0-h26afc86_1.conda#8337b675e0cad517fbcb3daf7588087a https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py312h7b42cdd_3.conda#1d7f05c3f8bb4e98d02fca45f0920b23 @@ -180,7 +180,7 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.cond https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.2-py312h7a1785b_0.conda#86a0cf3ba594247a8c44bd2111d7549c https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.0-hd8ed1ab_0.conda#03323fba6896975dc9ffae39b547c31b -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.1-py312h950be2a_2.conda#6333340e60402c7456811a14e4e12b26 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py312h950be2a_0.conda#16f95b810ff3253eabdcbb0b258c56dd https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py312h4f23490_1.conda#ac0a1a874ce9e3f8940a3a908ff74da9 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.42.0-h83bc92c_1.conda#928cc8b0a73355d11d32f4ffabaffa0c @@ -190,7 +190,7 @@ https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.3.0-pyha770c72_0.cond https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py312hf79963d_1.conda#6c913a686cb4060cbd7639a36fa144f0 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.37.0-py312h4f23490_1.conda#a0431a9e34e0b99f590ac5f34c2adad0 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.42.0-py312h4f23490_0.conda#74efa23b5e5237a76293e27995b1b074 https://conda.anaconda.org/conda-forge/noarch/iris-3.13.1-pyha770c72_0.conda#33d150f58eb36070d2b8ad6dd1bd50d7 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff From 83ce22c046681d2740e165081c8d9caa08844203 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 6 Oct 2025 11:58:17 +0100 Subject: [PATCH 500/583] Updated environment lockfiles (#704) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 14 +++++++------- requirements/locks/py311-linux-64.lock | 14 +++++++------- requirements/locks/py312-linux-64.lock | 14 +++++++------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 45f4f4cc..62eb7372 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -31,7 +31,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda# https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.3-h26f9b46_1.conda#4fc6c4c88da64c0219c0c6c0408cedd4 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.4-h26f9b46_0.conda#14edad12b59ccbfa3910d42c72adc2a0 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 @@ -108,7 +108,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda# https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda#f4084e4e6577797150f9b04a4560ceb0 https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.0-ha9997c6_1.conda#b24dd2bd61cd8e4f8a13ee2a945a723c https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py310h89163eb_1.conda#8ce3f0332fd6de0d737e2911d329523f +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py310h3406613_0.conda#8854df4fb4e37cc3ea0a024e48c9c180 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 @@ -119,7 +119,7 @@ https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.5-pyhcf101f3_0.conda#6c8979be6d7a17692793114fa26916e8 https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.1-pyhd8ed1ab_0.conda#205ac0b2873addb372a4384361990043 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac -https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py310hf3bd8b6_3.conda#b06ac72da31842cedc108eb69e9376d2 +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.6.0-py310hf3bd8b6_0.conda#13043e7aaa2e7b7b9b04d364d2a48df5 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py310h3406613_0.conda#bc058b3b89fcb525bb4977832aa52014 https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e @@ -132,14 +132,14 @@ https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py310h7c4b9e2_1.conda#1d54e461bda325196725cdd07ae046cb https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py310h34a4b09_0.conda#5a554da3ddfd6dae35ed0f76f70970ff https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.7-py310h3406613_0.conda#bc73c61ff9544f3ff7df03696e0548c2 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.60.0-py310h3406613_0.conda#3f0e123bda4a6794b7b96dfa98b5db23 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.60.1-py310h3406613_0.conda#ac183a1fd0cbebd32a20a2aeaf8dc01d https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda#4afc585cd97ba8a23809406cd8a9eda8 https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda#c74d83614aec66227ae5199d98852aaf @@ -166,13 +166,13 @@ https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.6-py310hefbff90_0.cond https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py310h71d0299_1.conda#e54b1eaeb50ad1767680181a8575a8db https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhd8ed1ab_0.conda#1f987505580cb972cf28dc5f74a0f81b https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.0-pyhd8ed1ab_0.conda#ad8f901272d56cfb6bf22bb89e9be59b -https://conda.anaconda.org/conda-forge/noarch/tox-4.30.2-pyhcf101f3_0.conda#7c913233c8530cb13a90da495f91f360 +https://conda.anaconda.org/conda-forge/noarch/tox-4.30.3-pyhcf101f3_0.conda#48cfc6f4693667d563c598bb7829503c https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310h3788b33_5.conda#e05b0475166b68c9dc4d7937e0315654 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py310h139afa4_0.conda#6b243b9f9477ad0b0a90552ebddb27e7 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310hf779ad0_2.conda#30167b9702fd4a46cd4a98e74c9840d8 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py310h3788b33_0.conda#b6420d29123c7c823de168f49ccdfe6a https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.14-pyhd8ed1ab_0.conda#34a8172d191193030438d7b30bcdeaf5 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.15-pyhd8ed1ab_0.conda#25f954b7dae6dd7b0dc004dab74f1ce9 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a04073db11c2c86c555fb088acc8f8c1 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py310hf779ad0_2.conda#4906d8c3680f6c1273ad5a5775807867 https://conda.anaconda.org/conda-forge/noarch/nox-2025.5.1-pyhe01879c_0.conda#f294cc5e7c84a0422fcc57f33313e084 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 8781f739..00415527 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -31,7 +31,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda# https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.3-h26f9b46_1.conda#4fc6c4c88da64c0219c0c6c0408cedd4 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.4-h26f9b46_0.conda#14edad12b59ccbfa3910d42c72adc2a0 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 @@ -108,7 +108,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda# https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda#f4084e4e6577797150f9b04a4560ceb0 https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.0-ha9997c6_1.conda#b24dd2bd61cd8e4f8a13ee2a945a723c https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py311h2dc5d0c_1.conda#6565a715337ae279e351d0abd8ffe88a +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py311h3778330_0.conda#0954f1a6a26df4a510b54f73b2a0345c https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 @@ -119,7 +119,7 @@ https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.5-pyhcf101f3_0.conda#6c8979be6d7a17692793114fa26916e8 https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.1-pyhd8ed1ab_0.conda#205ac0b2873addb372a4384361990043 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac -https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py311h041eb40_3.conda#0f83e5cc946a8a989c17bb0edfaca856 +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.6.0-py311h041eb40_0.conda#5ce500ae2f9e08ef90567f0eb3696253 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py311h3778330_0.conda#707c3d23f2476d3bfde8345b4e7d7853 https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-3.1.0-pyhd8ed1ab_0.conda#5f0f24f8032c2c1bb33f59b75974f5fc @@ -133,14 +133,14 @@ https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py311h49ec1c0_1.conda#3457bd5c93b085bec51cdab58fbd1882 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py311h5b438cf_0.conda#6cb6c4d57d12dfa0ecdd19dbe758ffc9 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.7-py311h3778330_0.conda#53fdad3b032eee40cf74ac0de87e4518 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.60.0-py311h3778330_0.conda#92d090806dcf5e5c5f2f3cfacf1d6aa3 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.60.1-py311h3778330_0.conda#91f834f85ac92978cfc3c1c178573e85 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda#4afc585cd97ba8a23809406cd8a9eda8 https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda#c74d83614aec66227ae5199d98852aaf @@ -167,12 +167,12 @@ https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.3-py311h2e04523_0.cond https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py311h4e6619b_2.conda#8092837339ae2e3697980df6686f996e https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhd8ed1ab_0.conda#1f987505580cb972cf28dc5f74a0f81b https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.0-pyhd8ed1ab_0.conda#ad8f901272d56cfb6bf22bb89e9be59b -https://conda.anaconda.org/conda-forge/noarch/tox-4.30.2-pyhcf101f3_0.conda#7c913233c8530cb13a90da495f91f360 +https://conda.anaconda.org/conda-forge/noarch/tox-4.30.3-pyhcf101f3_0.conda#48cfc6f4693667d563c598bb7829503c https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hd18a35c_5.conda#4e8447ca8558a203ec0577b4730073f3 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py311haee01d2_0.conda#0fd242142b0691eb9311dc32c1d4ab76 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h0372a8f_2.conda#c85f7b94f099fddb08358e0997dded95 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py311hdf67eae_2.conda#bb6a0f88cf345f7e7a143d349dae6d9f -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.14-pyhd8ed1ab_0.conda#34a8172d191193030438d7b30bcdeaf5 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.15-pyhd8ed1ab_0.conda#25f954b7dae6dd7b0dc004dab74f1ce9 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a04073db11c2c86c555fb088acc8f8c1 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py311h0372a8f_2.conda#487756753716efba090d06c71fb73eb6 https://conda.anaconda.org/conda-forge/noarch/nox-2025.5.1-pyhe01879c_0.conda#f294cc5e7c84a0422fcc57f33313e084 diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index aa345285..1a3d543c 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -31,7 +31,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda# https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.3-h26f9b46_1.conda#4fc6c4c88da64c0219c0c6c0408cedd4 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.4-h26f9b46_0.conda#14edad12b59ccbfa3910d42c72adc2a0 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 @@ -108,7 +108,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda# https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda#f4084e4e6577797150f9b04a4560ceb0 https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.0-ha9997c6_1.conda#b24dd2bd61cd8e4f8a13ee2a945a723c https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.2-py312h178313f_1.conda#eb227c3e0bf58f5bd69c0532b157975b +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_0.conda#f775a43412f7f3d7ed218113ad233869 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 @@ -119,7 +119,7 @@ https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.5-pyhcf101f3_0.conda#6c8979be6d7a17692793114fa26916e8 https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.1-pyhd8ed1ab_0.conda#205ac0b2873addb372a4384361990043 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac -https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.5.0-py312h0d868a3_3.conda#a5e5b1051bd92e2382dc687e6f7579dc +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.6.0-py312h0d868a3_0.conda#f028575d582ac3d51f17425a4897191c https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_0.conda#fba10c2007c8b06f77c5a23ce3a635ad https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-3.1.0-pyhd8ed1ab_0.conda#5f0f24f8032c2c1bb33f59b75974f5fc @@ -133,14 +133,14 @@ https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py312h4c3975b_1.conda#4da303c1e91703d178817252615ca0a7 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda#4bdb303603e9821baf5fe5fdff1dc8f8 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py312h35888ee_0.conda#60b9cd087d22272885a6b8366b1d3d43 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.7-py312h8a5da7c_0.conda#03d83efc728a6721a0f1616a04a7fc84 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.60.0-py312h8a5da7c_0.conda#db25d5216c11abf6545782baa2875c80 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.60.1-py312h8a5da7c_0.conda#b12bb9cc477156ce84038e0be6d0f763 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda#4afc585cd97ba8a23809406cd8a9eda8 https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda#c74d83614aec66227ae5199d98852aaf @@ -167,12 +167,12 @@ https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.3-py312h33ff503_0.cond https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py312h9b6a7d9_2.conda#573b9a879a3a42990f9c51d7376dce6b https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhd8ed1ab_0.conda#1f987505580cb972cf28dc5f74a0f81b https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.0-pyhd8ed1ab_0.conda#ad8f901272d56cfb6bf22bb89e9be59b -https://conda.anaconda.org/conda-forge/noarch/tox-4.30.2-pyhcf101f3_0.conda#7c913233c8530cb13a90da495f91f360 +https://conda.anaconda.org/conda-forge/noarch/tox-4.30.3-pyhcf101f3_0.conda#48cfc6f4693667d563c598bb7829503c https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h68727a3_5.conda#f9664ee31aed96c85b7319ab0a693341 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py312h5253ce2_0.conda#05d73100768745631ab3de9dc1e08da2 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312h4f23490_2.conda#ff4b5976814bc00861f962276c8fb87f https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312hd9148b4_2.conda#bce621e43978c245261c76b45edeaa3d -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.14-pyhd8ed1ab_0.conda#34a8172d191193030438d7b30bcdeaf5 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.15-pyhd8ed1ab_0.conda#25f954b7dae6dd7b0dc004dab74f1ce9 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a04073db11c2c86c555fb088acc8f8c1 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h4f23490_2.conda#cec5bc5f7d374f8f8095f8e28e31f6cb https://conda.anaconda.org/conda-forge/noarch/nox-2025.5.1-pyhe01879c_0.conda#f294cc5e7c84a0422fcc57f33313e084 From e6b4193cb452d147bf343c4acde5e86dc6e95722 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Oct 2025 12:14:59 +0100 Subject: [PATCH 501/583] Bump scitools/workflows in the dependencies group (#703) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2025.09.5 to 2025.09.6 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.09.5...2025.09.6) --- updated-dependencies: - dependency-name: scitools/workflows dependency-version: 2025.09.6 dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/ci-template-check.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 841fbc67..ee45fd35 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.09.5 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.09.6 diff --git a/.github/workflows/ci-template-check.yml b/.github/workflows/ci-template-check.yml index 1c7309f3..f8f09eda 100644 --- a/.github/workflows/ci-template-check.yml +++ b/.github/workflows/ci-template-check.yml @@ -10,7 +10,7 @@ on: jobs: prompt-share: - uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.09.5 + uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.09.6 secrets: inherit with: pr_number: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 2d96cd55..d2d1ddde 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.09.5 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.09.6 secrets: inherit From 1dfb279c25093e300ef8f4823f75bd87751174d2 Mon Sep 17 00:00:00 2001 From: Martin Yeo <40734014+trexfeathers@users.noreply.github.com> Date: Tue, 7 Oct 2025 10:24:25 +0100 Subject: [PATCH 502/583] Use ruff-check instead of ruff. (#705) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 782f9b15..9f4b445d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -80,7 +80,7 @@ repos: - repo: https://github.com/astral-sh/ruff-pre-commit rev: "v0.13.1" hooks: - - id: ruff + - id: ruff-check types: [file, python] args: [--fix, --show-fixes] - id: ruff-format From cf1b5e4e710bd663c8650aaaf5cabebc76ce2ba1 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 8 Oct 2025 15:03:06 +0100 Subject: [PATCH 503/583] chore: update pre-commit hooks (#702) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.13.1 → v0.13.3](https://github.com/astral-sh/ruff-pre-commit/compare/v0.13.1...v0.13.3) - [github.com/scientific-python/cookie: 2025.05.02 → 2025.10.01](https://github.com/scientific-python/cookie/compare/2025.05.02...2025.10.01) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Martin Yeo <40734014+trexfeathers@users.noreply.github.com> --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 9f4b445d..01fa9b38 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -78,7 +78,7 @@ repos: types: [file, python] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.13.1" + rev: "v0.13.3" hooks: - id: ruff-check types: [file, python] @@ -93,7 +93,7 @@ repos: types: [file, python] - repo: https://github.com/scientific-python/cookie - rev: 2025.05.02 + rev: 2025.10.01 hooks: - id: sp-repo-review additional_dependencies: ["repo-review[cli]"] From 8d457e0737e273796717d60bc524c868ad48a408 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Oct 2025 14:26:33 +0100 Subject: [PATCH 504/583] Bump scitools/workflows in the dependencies group (#706) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2025.09.6 to 2025.10.1 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.09.6...2025.10.1) --- updated-dependencies: - dependency-name: scitools/workflows dependency-version: 2025.10.1 dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/ci-template-check.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index ee45fd35..f88fe276 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.09.6 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.10.1 diff --git a/.github/workflows/ci-template-check.yml b/.github/workflows/ci-template-check.yml index f8f09eda..91ddde11 100644 --- a/.github/workflows/ci-template-check.yml +++ b/.github/workflows/ci-template-check.yml @@ -10,7 +10,7 @@ on: jobs: prompt-share: - uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.09.6 + uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.10.1 secrets: inherit with: pr_number: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index d2d1ddde..4035c635 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.09.6 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.10.1 secrets: inherit From 015442b162f45181ab1923becd5c0d0af670be10 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 14 Oct 2025 11:44:23 +0100 Subject: [PATCH 505/583] chore: update pre-commit hooks (#709) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.13.3 → v0.14.0](https://github.com/astral-sh/ruff-pre-commit/compare/v0.13.3...v0.14.0) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 01fa9b38..1478939e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -78,7 +78,7 @@ repos: types: [file, python] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.13.3" + rev: "v0.14.0" hooks: - id: ruff-check types: [file, python] From 78d1c67d12091e4e0d2fb7cc026f5abb22cc2188 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Oct 2025 10:26:28 +0100 Subject: [PATCH 506/583] Bump scitools/workflows in the dependencies group (#711) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2025.10.1 to 2025.10.3 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.10.1...2025.10.3) --- updated-dependencies: - dependency-name: scitools/workflows dependency-version: 2025.10.3 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/ci-template-check.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index f88fe276..9db6b6ed 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.10.1 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.10.3 diff --git a/.github/workflows/ci-template-check.yml b/.github/workflows/ci-template-check.yml index 91ddde11..e6bb576e 100644 --- a/.github/workflows/ci-template-check.yml +++ b/.github/workflows/ci-template-check.yml @@ -10,7 +10,7 @@ on: jobs: prompt-share: - uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.10.1 + uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.10.3 secrets: inherit with: pr_number: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 4035c635..7f6e35e9 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.10.1 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.10.3 secrets: inherit From 28832643d3232362d7d70a715d6548e0afbbb4b2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Oct 2025 16:14:36 +0000 Subject: [PATCH 507/583] Bump scitools/workflows in the dependencies group (#713) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2025.10.3 to 2025.10.4 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.10.3...2025.10.4) --- updated-dependencies: - dependency-name: scitools/workflows dependency-version: 2025.10.4 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/ci-template-check.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 9db6b6ed..2a0d5385 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.10.3 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.10.4 diff --git a/.github/workflows/ci-template-check.yml b/.github/workflows/ci-template-check.yml index e6bb576e..9607c602 100644 --- a/.github/workflows/ci-template-check.yml +++ b/.github/workflows/ci-template-check.yml @@ -10,7 +10,7 @@ on: jobs: prompt-share: - uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.10.3 + uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.10.4 secrets: inherit with: pr_number: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 7f6e35e9..240481c4 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.10.3 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.10.4 secrets: inherit From 7fa34e519737efd3d3ed7b52f9a25751c4e91d49 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 30 Oct 2025 09:38:35 +0000 Subject: [PATCH 508/583] Bump scitools/workflows in the dependencies group (#714) Bumps the dependencies group with 1 update: [scitools/workflows](https://github.com/scitools/workflows). Updates `scitools/workflows` from 2025.10.4 to 2025.10.7 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.10.4...2025.10.7) --- updated-dependencies: - dependency-name: scitools/workflows dependency-version: 2025.10.7 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/ci-template-check.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 2a0d5385..cace1aa8 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.10.4 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.10.7 diff --git a/.github/workflows/ci-template-check.yml b/.github/workflows/ci-template-check.yml index 9607c602..8211ac7f 100644 --- a/.github/workflows/ci-template-check.yml +++ b/.github/workflows/ci-template-check.yml @@ -10,7 +10,7 @@ on: jobs: prompt-share: - uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.10.4 + uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.10.7 secrets: inherit with: pr_number: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 240481c4..989ce3f2 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.10.4 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.10.7 secrets: inherit From 538c9e26915eb1283a443acef8a7f54a7793c338 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Nov 2025 12:22:45 +0000 Subject: [PATCH 509/583] Bump the dependencies group with 3 updates (#715) Bumps the dependencies group with 3 updates: [scitools/workflows/.github/workflows/ci-manifest.yml](https://github.com/scitools/workflows), [scitools/workflows/.github/workflows/ci-template-check.yml](https://github.com/scitools/workflows) and [scitools/workflows/.github/workflows/refresh-lockfiles.yml](https://github.com/scitools/workflows). Updates `scitools/workflows/.github/workflows/ci-manifest.yml` from 2025.10.7 to 2025.11.0 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.10.7...2025.11.0) Updates `scitools/workflows/.github/workflows/ci-template-check.yml` from 2025.10.7 to 2025.11.0 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.10.7...2025.11.0) Updates `scitools/workflows/.github/workflows/refresh-lockfiles.yml` from 2025.10.7 to 2025.11.0 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.10.7...2025.11.0) --- updated-dependencies: - dependency-name: scitools/workflows/.github/workflows/ci-manifest.yml dependency-version: 2025.11.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: scitools/workflows/.github/workflows/ci-template-check.yml dependency-version: 2025.11.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: scitools/workflows/.github/workflows/refresh-lockfiles.yml dependency-version: 2025.11.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/ci-template-check.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index cace1aa8..0d9dd000 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.10.7 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.11.0 diff --git a/.github/workflows/ci-template-check.yml b/.github/workflows/ci-template-check.yml index 8211ac7f..9cdc4158 100644 --- a/.github/workflows/ci-template-check.yml +++ b/.github/workflows/ci-template-check.yml @@ -10,7 +10,7 @@ on: jobs: prompt-share: - uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.10.7 + uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.11.0 secrets: inherit with: pr_number: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 989ce3f2..6f5a7c8a 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.10.7 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.11.0 secrets: inherit From 930132cb49b9ffd3dca93c627ffb8ba268378f18 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 10 Nov 2025 16:20:01 +0000 Subject: [PATCH 510/583] chore: update pre-commit hooks (#712) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: update pre-commit hooks updates: - [github.com/astral-sh/ruff-pre-commit: v0.14.0 → v0.14.3](https://github.com/astral-sh/ruff-pre-commit/compare/v0.14.0...v0.14.3) - [github.com/scientific-python/cookie: 2025.10.01 → 2025.10.20](https://github.com/scientific-python/cookie/compare/2025.10.01...2025.10.20) * noxfile.py adopt sp-repo-review recommendations. --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Martin Yeo --- .pre-commit-config.yaml | 4 ++-- noxfile.py | 13 +++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) mode change 100644 => 100755 noxfile.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 1478939e..ae5ec617 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -78,7 +78,7 @@ repos: types: [file, python] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.14.0" + rev: "v0.14.3" hooks: - id: ruff-check types: [file, python] @@ -93,7 +93,7 @@ repos: types: [file, python] - repo: https://github.com/scientific-python/cookie - rev: 2025.10.01 + rev: 2025.10.20 hooks: - id: sp-repo-review additional_dependencies: ["repo-review[cli]"] diff --git a/noxfile.py b/noxfile.py old mode 100644 new mode 100755 index 7a6cab7c..59e1dc01 --- a/noxfile.py +++ b/noxfile.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python3 # Copyright iris-grib contributors # # This file is part of iris-grib and is released under the BSD license. @@ -17,6 +18,14 @@ import nox from nox.logger import logger + +# Adopt sp-repo-review recommendations. +nox.needs_version = ">=2022.1.7" +nox.options.default_venv_backend = "conda" +# /// script +# dependencies = ["nox"] +# /// + #: Default to reusing any pre-existing nox environments. nox.options.reuse_existing_virtualenvs = True @@ -335,3 +344,7 @@ def linkcheck(session: nox.sessions.Session): "linkcheck", external=True, ) + + +if __name__ == "__main__": + nox.main() From 46585c012c9283f75a35036c231c91c0d5433726 Mon Sep 17 00:00:00 2001 From: Martin Yeo <40734014+trexfeathers@users.noreply.github.com> Date: Tue, 11 Nov 2025 14:15:42 +0000 Subject: [PATCH 511/583] Align repo-review ignores with SciTools template. (#719) --- pyproject.toml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 3ea854c3..b43f6275 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -151,8 +151,10 @@ filterwarnings = ["default"] [tool.repo-review] ignore = [ - # https://learn.scientific-python.org/development/guides/style/#PC180 - "PC180", # Uses prettier + # Not possible to run on the hardware used by the majority of our developers. Might change in future! + "PC180", # Uses prettier. + # https://learn.scientific-python.org/development/guides/packaging-simple#PP006 + "PP006", # Uses dev dependency group ] [tool.ruff] From 073f9837e1af9cbee08b7272f0e314c98c80edb9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Nov 2025 10:18:32 +0000 Subject: [PATCH 512/583] Bump the dependencies group with 3 updates (#720) Bumps the dependencies group with 3 updates: [scitools/workflows/.github/workflows/ci-manifest.yml](https://github.com/scitools/workflows), [scitools/workflows/.github/workflows/ci-template-check.yml](https://github.com/scitools/workflows) and [scitools/workflows/.github/workflows/refresh-lockfiles.yml](https://github.com/scitools/workflows). Updates `scitools/workflows/.github/workflows/ci-manifest.yml` from 2025.11.0 to 2025.11.2 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.11.0...2025.11.2) Updates `scitools/workflows/.github/workflows/ci-template-check.yml` from 2025.11.0 to 2025.11.2 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.11.0...2025.11.2) Updates `scitools/workflows/.github/workflows/refresh-lockfiles.yml` from 2025.11.0 to 2025.11.2 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.11.0...2025.11.2) --- updated-dependencies: - dependency-name: scitools/workflows/.github/workflows/ci-manifest.yml dependency-version: 2025.11.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: scitools/workflows/.github/workflows/ci-template-check.yml dependency-version: 2025.11.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: scitools/workflows/.github/workflows/refresh-lockfiles.yml dependency-version: 2025.11.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/ci-template-check.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 0d9dd000..a8043856 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.11.0 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.11.2 diff --git a/.github/workflows/ci-template-check.yml b/.github/workflows/ci-template-check.yml index 9cdc4158..ebd319a5 100644 --- a/.github/workflows/ci-template-check.yml +++ b/.github/workflows/ci-template-check.yml @@ -10,7 +10,7 @@ on: jobs: prompt-share: - uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.11.0 + uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.11.2 secrets: inherit with: pr_number: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 6f5a7c8a..eac38fb6 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.11.0 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.11.2 secrets: inherit From f26e50b1e23a7f9fccd86ebd9f794cfb380b2512 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 18 Nov 2025 09:25:34 +0000 Subject: [PATCH 513/583] chore: update pre-commit hooks (#717) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.14.3 → v0.14.5](https://github.com/astral-sh/ruff-pre-commit/compare/v0.14.3...v0.14.5) - [github.com/scientific-python/cookie: 2025.10.20 → 2025.11.10](https://github.com/scientific-python/cookie/compare/2025.10.20...2025.11.10) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index ae5ec617..5ba14e92 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -78,7 +78,7 @@ repos: types: [file, python] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.14.3" + rev: "v0.14.5" hooks: - id: ruff-check types: [file, python] @@ -93,7 +93,7 @@ repos: types: [file, python] - repo: https://github.com/scientific-python/cookie - rev: 2025.10.20 + rev: 2025.11.10 hooks: - id: sp-repo-review additional_dependencies: ["repo-review[cli]"] From 9cff8b5970ebb168090f44ab6a38d1bee3839691 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Nov 2025 11:03:40 +0000 Subject: [PATCH 514/583] Bump the dependencies group with 3 updates (#725) Bumps the dependencies group with 3 updates: [scitools/workflows/.github/workflows/ci-manifest.yml](https://github.com/scitools/workflows), [scitools/workflows/.github/workflows/ci-template-check.yml](https://github.com/scitools/workflows) and [scitools/workflows/.github/workflows/refresh-lockfiles.yml](https://github.com/scitools/workflows). Updates `scitools/workflows/.github/workflows/ci-manifest.yml` from 2025.11.2 to 2025.11.4 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.11.2...2025.11.4) Updates `scitools/workflows/.github/workflows/ci-template-check.yml` from 2025.11.2 to 2025.11.4 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.11.2...2025.11.4) Updates `scitools/workflows/.github/workflows/refresh-lockfiles.yml` from 2025.11.2 to 2025.11.4 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.11.2...2025.11.4) --- updated-dependencies: - dependency-name: scitools/workflows/.github/workflows/ci-manifest.yml dependency-version: 2025.11.4 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: scitools/workflows/.github/workflows/ci-template-check.yml dependency-version: 2025.11.4 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: scitools/workflows/.github/workflows/refresh-lockfiles.yml dependency-version: 2025.11.4 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/ci-template-check.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index a8043856..b23beba8 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.11.2 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.11.4 diff --git a/.github/workflows/ci-template-check.yml b/.github/workflows/ci-template-check.yml index ebd319a5..2968d871 100644 --- a/.github/workflows/ci-template-check.yml +++ b/.github/workflows/ci-template-check.yml @@ -10,7 +10,7 @@ on: jobs: prompt-share: - uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.11.2 + uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.11.4 secrets: inherit with: pr_number: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index eac38fb6..f7bfec58 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.11.2 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.11.4 secrets: inherit From aa75db1f9092e2a019c1b1b62fbc3e3b7e879349 Mon Sep 17 00:00:00 2001 From: Martin Yeo <40734014+trexfeathers@users.noreply.github.com> Date: Fri, 21 Nov 2025 13:46:20 +0000 Subject: [PATCH 515/583] Lockfile updates and adapt test for ecCodes ECC-2110 (#716) * Updated environment lockfiles * Update test_reduced_gg_grib1 for ecmwf/eccodes@f5bf4405b7db63729c2771e7dc690e519aa07df3. --------- Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 180 ++++++++--------- requirements/locks/py311-linux-64.lock | 182 +++++++++--------- requirements/locks/py312-linux-64.lock | 182 +++++++++--------- .../sample_file_loads/reduced_gg_grib1.cml | 2 +- 4 files changed, 285 insertions(+), 261 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 62eb7372..5b53ee66 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -5,28 +5,27 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.conda#05e00f3b21e88bb3d658ac700b2ce58c https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a -https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda#74784ee3d225fc3dca89edb635b4e5cc -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-ha97dd6f_2.conda#14bae321b8127b63cba276bd53fac237 +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda#f9e5fbc24009179e8b0409624691758a https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_5.conda#dcd5ff1940cd38f6df777cac86819d60 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda#f7b4d76975aac7e5d9e6ad13845f92fe https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_5.conda#264fbfba7fb20acf3b29cde153e345ce +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda#c0374badb3a5d4b1372db28d19462c53 https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda#791365c5f65975051e4e017b5da3abf5 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda#51a19bba1b8ebfb60df25cde030b7ebc https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 -https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb03c661_4.conda#1d29d2e33fe59954af82ef54a8af3fe1 -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.24-h86f0d12_0.conda#64f0c503da58ec25ebd359e4d990afa8 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-h09219d5_0.conda#9b3117ec960b823815b02190b41c0484 +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda#6c77a605a7a689d17d4819c0f8ac9a00 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda#4211416ecba1866fab0c6470986c22d6 -https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_5.conda#069afdf8ea72504e48d23ae1171d951c -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_5.conda#fbd4008644add05032b6764807ee2cba +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda#35f29eec58405aaf55e01cb470d8c26a +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda#280ea6eee9e2ddefde25ff799c4f0363 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-hcd61629_7.conda#f116940d825ffc9104400f0d7f1a4551 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 -https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 +https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda#8397539e3a0bbd1695584fb4f927485a https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_5.conda#4e02a49aaa9d5190cb630fa43528fbe6 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda#5b767048b1b3ee9a954b06f4084f93dc https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda#80c07c68d2f6870250959dcc95b209d1 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 @@ -37,19 +36,18 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb47aa4a_0.conda#607e13a8caac17f9a664bcab5302ce06 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a -https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.0-h480dda7_0.conda#5dc479effdabf54a0ff240d565287495 +https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.1-h480dda7_0.conda#4d4efd0645cd556fab54617c4ad477ef https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.4-h3f801dc_0.conda#01ba04e414e47f95c03d6ddd81fd37be -https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb03c661_4.conda#5cb5a1c9a94a78f5b23684bcb845338d -https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb03c661_4.conda#2e55011fa483edb8bfe3fd92e860cd79 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hd53d788_0.conda#c183787d2b228775dece45842abbbe53 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-h02bd7ab_0.conda#b7a924e3e9ebc7938ffc7d94fe603ed3 https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_5.conda#0c91408b3dec0b97e8a3c694845bd63b +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_7.conda#8621a450add4e231f676646880703f49 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.50-h421ea60_1.conda#7af8e91b0deb5f8e25d1a595dea79614 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda#0b367fad34931cb79e0d6b7e5c06bb1c https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_5.conda#8bba50c7f4679f08c861b597ad2bda6b +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda#f627678cf829bd70bccf141a19c3ad3e https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc @@ -59,139 +57,149 @@ https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#28 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_0.conda#3d8da0248bdae970b4ade636a104b7f5 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda#a0116df4f4ed05c303811a837d5b39d8 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 +https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.2.5-hde8ca8f_0.conda#1920c3502e7f6688d650ab81cd3775fd https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d -https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb03c661_4.conda#ca4ed8015764937c81b830f7f5b68543 +https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hf2c8021_0.conda#5304333319a6124a2737d9f128cbc4ed https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1aa0949_4.conda#c94ab6ff54ba5172cf1c58267005670f https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda#8e7251989bca326a28f4a5ffbd74557a https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda#b499ce4b026493a13774bcf0f4c33849 -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_2.conda#dfc5aae7b043d9f56ba99514d5e60625 -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h8261f1e_0.conda#72b531694ebe4e8aa6f5745d1015c1b4 -https://conda.anaconda.org/conda-forge/linux-64/python-3.10.18-hd6af730_0_cpython.conda#4ea0c77cdcb0b81813a0436b162d7316 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_3.conda#ac2e4832427d6b159576e8a68305c722 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#cd5a90476766d53e901500df9215e927 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.4-hbc0de68_0.conda#8376bd3854542be0c8c7cd07525d31c6 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-h41a2e66_0.conda#4ddfd44e473c676cb8e80548ba4aa704 +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-38_h4a7cf45_openblas.conda#3509b5e2aaa5f119013c8969fdd9a905 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda#01e149d4a53185622dc2e788281961f2 +https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda#f4084e4e6577797150f9b04a4560ceb0 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.0-hee844dc_0.conda#729a572a3ebb8c43933b30edcc628ceb +https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-ha9997c6_0.conda#e7733bc6785ec009e47a224a71917e84 +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda#4afc585cd97ba8a23809406cd8a9eda8 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda#c74d83614aec66227ae5199d98852aaf +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-38_h0358290_openblas.conda#bcd928a9376a215cd9164a4312dd5e98 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-38_h47877c9_openblas.conda#88f10bff57b423a3fd2d990c6055771e +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-h26afc86_0.conda#e512be7dc1f84966d50959e900ca121f +https://conda.anaconda.org/conda-forge/linux-64/python-3.10.19-h3c07f61_2_cpython.conda#27ac896a8b4970f8977503a9e70dc745 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.51.0-heff268d_0.conda#5422f0e1b59d2aa29329d5b3e36d57e5 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a -https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.2-pyhd8ed1ab_0.conda#eb9d4263271ca287d2e0cf5a86da2d3a -https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f -https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb03c661_4.conda#eaf3fbd2aa97c212336de38a51fe404e -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hea6c23e_4.conda#6ef43db290647218e1e04c2601675bff -https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.0-pyhd8ed1ab_0.conda#33a59a2cf83ab89ee546c72254521a4a -https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda#11f59985f49df4620890f3e746ed7102 +https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda#8f37c8fb7116a18da04e52fa9e2c8df9 +https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda#c7944d55af26b6d2d7629e27e9a972c1 +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py310h8cfb67f_0.conda#12f24867bc0ec4e15c89cdff988c500e +https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.1-pyhd8ed1ab_0.conda#94e54066d0b9c3864771cfd7458f3e2c +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.10.5-pyhd8ed1ab_0.conda#257ae203f1d204107ba389607d375ded https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda#7e7d5ef1b9ed630e4a1c358d6bc62284 +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda#a22d1fd9bf98827e280a02875d9a007a https://conda.anaconda.org/conda-forge/noarch/click-8.3.0-pyh707e725_0.conda#e76c4ba9e1837847679421b8d549b784 -https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.1-pyhd8ed1ab_0.conda#364ba6c9fb03886ac979b482f39ebb92 +https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhd8ed1ab_0.conda#fcac5929097ba1f2a0e5b6ecaa13b253 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 -https://conda.anaconda.org/conda-forge/noarch/colorlog-6.9.0-pyh707e725_1.conda#f00fc375bd02bdbbf791f9fe26ae96ec +https://conda.anaconda.org/conda-forge/noarch/colorlog-6.10.1-pyh707e725_0.conda#33e96df3785bf61676ffee387e5a19e5 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc -https://conda.anaconda.org/conda-forge/noarch/filelock-3.19.1-pyhd8ed1ab_0.conda#9c418d067409452b2e87e0016257da68 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda#66b8b26023b8efdf8fcb23bac4b6325d https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 -https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.9.0-pyhd8ed1ab_0.conda#76f492bd8ba8a0fb80ffe16fc1a75b3b +https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.10.0-pyhd8ed1ab_0.conda#d18004c37182f83b9818b714825a7627 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e +https://conda.anaconda.org/conda-forge/noarch/humanize-4.14.0-pyhd8ed1ab_0.conda#8b8884a6375830fe0cfb806ccbbd755c https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac -https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 +https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda#53abe63df7e10a6ba605dc5f9f961d36 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 -https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 +https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda#9614359868482abba1bd15ce465e3c42 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de -https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py310haaf941d_1.conda#dccb22849c78cbb9decc0af573c00a45 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-36_h4a7cf45_openblas.conda#2a6122504dc8ea139337046d34a110cb -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 -https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda#f4084e4e6577797150f9b04a4560ceb0 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.0-ha9997c6_1.conda#b24dd2bd61cd8e4f8a13ee2a945a723c +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py310haaf941d_2.conda#7426d76535fc6347f1b74f85fb17d6eb +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.3-nompi_h11f7409_103.conda#3ccff1066c05a1e6c221356eecc40581 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py310h3406613_0.conda#8854df4fb4e37cc3ea0a024e48c9c180 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.6-py310hefbff90_0.conda#b0cea2c364bf65cd19e023040eeab05d https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.4.0-pyhcf101f3_0.conda#cc9d9a3929503785403dbfad9f707145 +https://conda.anaconda.org/conda-forge/linux-64/pillow-12.0.0-py310h80abafc_0.conda#e2d1355dfb9abda97d19e9c2170f5443 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda#5c7a868f8241e64e1cf5fdf4962f23e2 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h18fbb6c_2.conda#1aeede769ec2fa0f474f8b73a7ac057f https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.5-pyhcf101f3_0.conda#6c8979be6d7a17692793114fa26916e8 -https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.1-pyhd8ed1ab_0.conda#205ac0b2873addb372a4384361990043 +https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.2-pyhd8ed1ab_0.conda#3751072ac0bd677416696063872078f1 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac -https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.6.0-py310hf3bd8b6_0.conda#13043e7aaa2e7b7b9b04d364d2a48df5 +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.6.0-py310hf3bd8b6_1.conda#a49d7089a9d44aa209f970fc0e5abd1c https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py310h3406613_0.conda#bc058b3b89fcb525bb4977832aa52014 https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 +https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda#bf7a226e58dfb8346c70df36065d86c9 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda#755cf22df8693aa0d1aec1c123fa5863 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb -https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda#30a0a26c8abccf4b7991d590fe17c699 -https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_1.conda#40d0ed782a8aaa16ef248e68c06c168d +https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda#d2732eb636c264dc9aa4cbee404b1a53 +https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda#c07a6153f8306e45794774cf9b13bd32 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d -https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py310h7c4b9e2_1.conda#1d54e461bda325196725cdd07ae046cb +https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.0-py310h7c4b9e2_0.conda#2321fe047faf8cdd92c0928e0c2b03e5 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 -https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py310h34a4b09_0.conda#5a554da3ddfd6dae35ed0f76f70970ff -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.7-py310h3406613_0.conda#bc73c61ff9544f3ff7df03696e0548c2 +https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py310he7384ee_1.conda#803e2d778b8dcccdc014127ec5001681 +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310hf779ad0_2.conda#30167b9702fd4a46cd4a98e74c9840d8 +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py310h3788b33_0.conda#b6420d29123c7c823de168f49ccdfe6a +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.11.1-py310h3406613_0.conda#895a647366ecbbcdeb3e131c2406647f https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.60.1-py310h3406613_0.conda#ac183a1fd0cbebd32a20a2aeaf8dc01d -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda#4afc585cd97ba8a23809406cd8a9eda8 +https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda#4b69232755285701bc86a5afe4d9933a https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda#c74d83614aec66227ae5199d98852aaf https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a04073db11c2c86c555fb088acc8f8c1 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-36_h0358290_openblas.conda#13a3fe5f9812ac8c5710ef8c03105121 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-36_h47877c9_openblas.conda#55daaac7ecf8ebd169cdbe34dc79549e -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.0-h26afc86_1.conda#8337b675e0cad517fbcb3daf7588087a +https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py310hf779ad0_2.conda#4906d8c3680f6c1273ad5a5775807867 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py310h6557065_3.conda#e169733dc0c743687a852f1c6e989140 https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh8b19718_0.conda#dfce4b2af4bfe90cdcaf56ca0b28ddf5 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h18fbb6c_2.conda#1aeede769ec2fa0f474f8b73a7ac057f -https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.1-pyhe01879c_0.conda#8200884fd84ab8754567d8523b52eaa8 +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py310h71d0299_1.conda#e54b1eaeb50ad1767680181a8575a8db +https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.conda#8c29cd33b64b2eb78597fa28b5595c8d +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py310hc8bbb35_2.conda#0937b0e88a24c82e02d5b714acc9957c https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.34.0-pyhd8ed1ab_0.conda#2bd6c0c96cfc4dbe9bde604a122e3e55 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 -https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.35.4-pyhd8ed1ab_0.conda#cfccfd4e8d9de82ed75c8e2c91cab375 +https://conda.anaconda.org/conda-forge/noarch/anyio-4.11.0-pyhcf101f3_0.conda#814472b61da9792fae28156cb9ee54f5 +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py310hf779ad0_1.conda#5e4aea6b728177b53e8a216922ebd6a2 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.44.0-h83bc92c_0.conda#2d37fd4ccfd98453a02a278e4112da39 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.7.0-h40b2b14_1.conda#8a77895fb29728b736a1a6c75906ea1a -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.3-nompi_h11f7409_103.conda#3ccff1066c05a1e6c221356eecc40581 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.6-py310hefbff90_0.conda#b0cea2c364bf65cd19e023040eeab05d -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py310h71d0299_1.conda#e54b1eaeb50ad1767680181a8575a8db -https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhd8ed1ab_0.conda#1f987505580cb972cf28dc5f74a0f81b -https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.0-pyhd8ed1ab_0.conda#ad8f901272d56cfb6bf22bb89e9be59b -https://conda.anaconda.org/conda-forge/noarch/tox-4.30.3-pyhcf101f3_0.conda#48cfc6f4693667d563c598bb7829503c -https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310h3788b33_5.conda#e05b0475166b68c9dc4d7937e0315654 -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py310h139afa4_0.conda#6b243b9f9477ad0b0a90552ebddb27e7 -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310hf779ad0_2.conda#30167b9702fd4a46cd4a98e74c9840d8 -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py310h3788b33_0.conda#b6420d29123c7c823de168f49ccdfe6a +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.7-py310hfde16b3_0.conda#185a6d44916e4e28bb50d0192eb6b880 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.3-nompi_py310he90c06d_100.conda#e1a3c6a1e8ceec1fe91a3660b97a43b6 +https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhcf101f3_1.conda#da0c42269086f5170e2b296878ec13a6 +https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0.conda#e2e4d7094d0580ccd62e2a41947444f3 +https://conda.anaconda.org/conda-forge/noarch/tox-4.32.0-pyhcf101f3_0.conda#1b49a3b817df5c88742219c4d6e5ee57 +https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310h03d9f68_6.conda#34778c3f9a6ea19610e7e340dc2caaab +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py310h139afa4_1.conda#3741aefc198dfed2e3c9adc79d706bb7 +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py310h0158d43_1.conda#871b5f746960f99ac23dbc73d14e2ad0 https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 +https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb https://conda.anaconda.org/conda-forge/noarch/identify-2.6.15-pyhd8ed1ab_0.conda#25f954b7dae6dd7b0dc004dab74f1ce9 -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a04073db11c2c86c555fb088acc8f8c1 -https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py310hf779ad0_2.conda#4906d8c3680f6c1273ad5a5775807867 -https://conda.anaconda.org/conda-forge/noarch/nox-2025.5.1-pyhe01879c_0.conda#f294cc5e7c84a0422fcc57f33313e084 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda#6891acad5e136cb62a8c2ed2679d6528 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.conda#8c29cd33b64b2eb78597fa28b5595c8d -https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.0-hd8ed1ab_0.conda#03323fba6896975dc9ffae39b547c31b -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py310h777b3ac_0.conda#486ffd32d6cc932f43df4066efd3c973 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.44.0-py310hf779ad0_1.conda#fd8c4f1cebd49ffbea2d817dc56eb4cd +https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py310hf779ad0_1.conda#5e4aea6b728177b53e8a216922ebd6a2 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.42.0-h83bc92c_1.conda#928cc8b0a73355d11d32f4ffabaffa0c -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.6-py310hfde16b3_1.conda#65d3af47b03c91d9d2bb69dd8307a661 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py310he90c06d_104.conda#4559f793117b2b02068fb13d5254cfa8 +https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 +https://conda.anaconda.org/conda-forge/noarch/iris-3.11.1-pyha770c72_1.conda#f501583062225a070455d011d81b07bf https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.3.0-pyha770c72_0.conda#bc6c44af2a9e6067dd7e949ef10cdfba https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py310h0158d43_1.conda#871b5f746960f99ac23dbc73d14e2ad0 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.42.0-py310hf779ad0_0.conda#094c17b3651f0607fde08a3209a4783f -https://conda.anaconda.org/conda-forge/noarch/iris-3.11.1-pyha770c72_1.conda#f501583062225a070455d011d81b07bf +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2025.10.31-pyhd8ed1ab_0.conda#92966163fd0dbae2ca24191fde3fde15 +https://conda.anaconda.org/conda-forge/noarch/nox-2025.10.16-pyhcf101f3_0.conda#2c39d36a165ae1b74c77ebfa7a096aa1 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda#e9fb3fe8a5b758b4aff187d434f94f03 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 00415527..d66766b5 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -5,28 +5,27 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda#8fcb6b0e2161850556231336dae58358 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a -https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda#74784ee3d225fc3dca89edb635b4e5cc -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-ha97dd6f_2.conda#14bae321b8127b63cba276bd53fac237 +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda#f9e5fbc24009179e8b0409624691758a https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_5.conda#dcd5ff1940cd38f6df777cac86819d60 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda#f7b4d76975aac7e5d9e6ad13845f92fe https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_5.conda#264fbfba7fb20acf3b29cde153e345ce +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda#c0374badb3a5d4b1372db28d19462c53 https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda#791365c5f65975051e4e017b5da3abf5 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda#51a19bba1b8ebfb60df25cde030b7ebc https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 -https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb03c661_4.conda#1d29d2e33fe59954af82ef54a8af3fe1 -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.24-h86f0d12_0.conda#64f0c503da58ec25ebd359e4d990afa8 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-h09219d5_0.conda#9b3117ec960b823815b02190b41c0484 +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda#6c77a605a7a689d17d4819c0f8ac9a00 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda#4211416ecba1866fab0c6470986c22d6 -https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_5.conda#069afdf8ea72504e48d23ae1171d951c -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_5.conda#fbd4008644add05032b6764807ee2cba +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda#35f29eec58405aaf55e01cb470d8c26a +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda#280ea6eee9e2ddefde25ff799c4f0363 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-hcd61629_7.conda#f116940d825ffc9104400f0d7f1a4551 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 -https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 +https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda#8397539e3a0bbd1695584fb4f927485a https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_5.conda#4e02a49aaa9d5190cb630fa43528fbe6 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda#5b767048b1b3ee9a954b06f4084f93dc https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda#80c07c68d2f6870250959dcc95b209d1 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 @@ -37,19 +36,18 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb47aa4a_0.conda#607e13a8caac17f9a664bcab5302ce06 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a -https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.0-h480dda7_0.conda#5dc479effdabf54a0ff240d565287495 +https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.1-h480dda7_0.conda#4d4efd0645cd556fab54617c4ad477ef https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.4-h3f801dc_0.conda#01ba04e414e47f95c03d6ddd81fd37be -https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb03c661_4.conda#5cb5a1c9a94a78f5b23684bcb845338d -https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb03c661_4.conda#2e55011fa483edb8bfe3fd92e860cd79 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hd53d788_0.conda#c183787d2b228775dece45842abbbe53 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-h02bd7ab_0.conda#b7a924e3e9ebc7938ffc7d94fe603ed3 https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_5.conda#0c91408b3dec0b97e8a3c694845bd63b +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_7.conda#8621a450add4e231f676646880703f49 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.50-h421ea60_1.conda#7af8e91b0deb5f8e25d1a595dea79614 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda#0b367fad34931cb79e0d6b7e5c06bb1c https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_5.conda#8bba50c7f4679f08c861b597ad2bda6b +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda#f627678cf829bd70bccf141a19c3ad3e https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc @@ -59,139 +57,149 @@ https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#28 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_0.conda#3d8da0248bdae970b4ade636a104b7f5 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda#a0116df4f4ed05c303811a837d5b39d8 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 +https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.2.5-hde8ca8f_0.conda#1920c3502e7f6688d650ab81cd3775fd https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d -https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb03c661_4.conda#ca4ed8015764937c81b830f7f5b68543 +https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hf2c8021_0.conda#5304333319a6124a2737d9f128cbc4ed https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1aa0949_4.conda#c94ab6ff54ba5172cf1c58267005670f https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda#8e7251989bca326a28f4a5ffbd74557a https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda#b499ce4b026493a13774bcf0f4c33849 -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_2.conda#dfc5aae7b043d9f56ba99514d5e60625 -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h8261f1e_0.conda#72b531694ebe4e8aa6f5745d1015c1b4 -https://conda.anaconda.org/conda-forge/linux-64/python-3.11.13-h9e4cc4f_0_cpython.conda#8c399445b6dc73eab839659e6c7b5ad1 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_3.conda#ac2e4832427d6b159576e8a68305c722 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#cd5a90476766d53e901500df9215e927 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.4-hbc0de68_0.conda#8376bd3854542be0c8c7cd07525d31c6 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-h41a2e66_0.conda#4ddfd44e473c676cb8e80548ba4aa704 +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-38_h4a7cf45_openblas.conda#3509b5e2aaa5f119013c8969fdd9a905 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda#01e149d4a53185622dc2e788281961f2 +https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda#f4084e4e6577797150f9b04a4560ceb0 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.0-hee844dc_0.conda#729a572a3ebb8c43933b30edcc628ceb +https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-ha9997c6_0.conda#e7733bc6785ec009e47a224a71917e84 +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda#4afc585cd97ba8a23809406cd8a9eda8 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda#c74d83614aec66227ae5199d98852aaf +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-38_h0358290_openblas.conda#bcd928a9376a215cd9164a4312dd5e98 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-38_h47877c9_openblas.conda#88f10bff57b423a3fd2d990c6055771e +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-h26afc86_0.conda#e512be7dc1f84966d50959e900ca121f +https://conda.anaconda.org/conda-forge/linux-64/python-3.11.14-hd63d673_2_cpython.conda#c4202a55b4486314fbb8c11bc43a29a0 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.51.0-heff268d_0.conda#5422f0e1b59d2aa29329d5b3e36d57e5 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a -https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.2-pyhd8ed1ab_0.conda#eb9d4263271ca287d2e0cf5a86da2d3a -https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f -https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb03c661_4.conda#eaf3fbd2aa97c212336de38a51fe404e -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311h1ddb823_4.conda#7138a06a7b0d11a23cfae323e6010a08 -https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.0-pyhd8ed1ab_0.conda#33a59a2cf83ab89ee546c72254521a4a -https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda#11f59985f49df4620890f3e746ed7102 +https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda#8f37c8fb7116a18da04e52fa9e2c8df9 +https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda#c7944d55af26b6d2d7629e27e9a972c1 +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py311h7c6b74e_0.conda#645bc783bc723d67a294a51bc860762d +https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.1-pyhd8ed1ab_0.conda#94e54066d0b9c3864771cfd7458f3e2c +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.10.5-pyhd8ed1ab_0.conda#257ae203f1d204107ba389607d375ded https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda#7e7d5ef1b9ed630e4a1c358d6bc62284 +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda#a22d1fd9bf98827e280a02875d9a007a https://conda.anaconda.org/conda-forge/noarch/click-8.3.0-pyh707e725_0.conda#e76c4ba9e1837847679421b8d549b784 -https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.1-pyhd8ed1ab_0.conda#364ba6c9fb03886ac979b482f39ebb92 +https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhd8ed1ab_0.conda#fcac5929097ba1f2a0e5b6ecaa13b253 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 -https://conda.anaconda.org/conda-forge/noarch/colorlog-6.9.0-pyh707e725_1.conda#f00fc375bd02bdbbf791f9fe26ae96ec +https://conda.anaconda.org/conda-forge/noarch/colorlog-6.10.1-pyh707e725_0.conda#33e96df3785bf61676ffee387e5a19e5 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc -https://conda.anaconda.org/conda-forge/noarch/filelock-3.19.1-pyhd8ed1ab_0.conda#9c418d067409452b2e87e0016257da68 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda#66b8b26023b8efdf8fcb23bac4b6325d https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 -https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.9.0-pyhd8ed1ab_0.conda#76f492bd8ba8a0fb80ffe16fc1a75b3b +https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.10.0-pyhd8ed1ab_0.conda#d18004c37182f83b9818b714825a7627 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e +https://conda.anaconda.org/conda-forge/noarch/humanize-4.14.0-pyhd8ed1ab_0.conda#8b8884a6375830fe0cfb806ccbbd755c https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac -https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 +https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda#53abe63df7e10a6ba605dc5f9f961d36 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 -https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 +https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda#9614359868482abba1bd15ce465e3c42 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de -https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py311h724c32c_1.conda#92720706b174926bc7238cc24f3b5956 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-36_h4a7cf45_openblas.conda#2a6122504dc8ea139337046d34a110cb -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 -https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda#f4084e4e6577797150f9b04a4560ceb0 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.0-ha9997c6_1.conda#b24dd2bd61cd8e4f8a13ee2a945a723c +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py311h724c32c_2.conda#4089f739463c798e10d8644bc34e24de +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.3-nompi_h11f7409_103.conda#3ccff1066c05a1e6c221356eecc40581 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py311h3778330_0.conda#0954f1a6a26df4a510b54f73b2a0345c https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.4-py311h2e04523_0.conda#d84afde5a6f028204f24180ff87cf429 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.4.0-pyhcf101f3_0.conda#cc9d9a3929503785403dbfad9f707145 +https://conda.anaconda.org/conda-forge/linux-64/pillow-12.0.0-py311h07c5bb8_0.conda#51f505a537b2d216a1b36b823df80995 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda#5c7a868f8241e64e1cf5fdf4962f23e2 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.7.0-hb72c0af_0.conda#438e75abf4d8c9c1d9e483b6c3f36282 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.5-pyhcf101f3_0.conda#6c8979be6d7a17692793114fa26916e8 -https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.1-pyhd8ed1ab_0.conda#205ac0b2873addb372a4384361990043 +https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.2-pyhd8ed1ab_0.conda#3751072ac0bd677416696063872078f1 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac -https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.6.0-py311h041eb40_0.conda#5ce500ae2f9e08ef90567f0eb3696253 +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.6.0-py311h041eb40_1.conda#9dcb9824894fb920414608447ccdf3ce https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py311h3778330_0.conda#707c3d23f2476d3bfde8345b4e7d7853 https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-3.1.0-pyhd8ed1ab_0.conda#5f0f24f8032c2c1bb33f59b75974f5fc https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 +https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda#bf7a226e58dfb8346c70df36065d86c9 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda#755cf22df8693aa0d1aec1c123fa5863 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb -https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda#30a0a26c8abccf4b7991d590fe17c699 -https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_1.conda#40d0ed782a8aaa16ef248e68c06c168d +https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda#d2732eb636c264dc9aa4cbee404b1a53 +https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda#c07a6153f8306e45794774cf9b13bd32 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d -https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py311h49ec1c0_1.conda#3457bd5c93b085bec51cdab58fbd1882 +https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.0-py311h49ec1c0_0.conda#dd15da2c344aecf8c36bf7944f1ea8d2 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 -https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py311h5b438cf_0.conda#6cb6c4d57d12dfa0ecdd19dbe758ffc9 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.7-py311h3778330_0.conda#53fdad3b032eee40cf74ac0de87e4518 +https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py311h03d9500_1.conda#3912e4373de46adafd8f1e97e4bd166b +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h0372a8f_2.conda#c85f7b94f099fddb08358e0997dded95 +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py311hdf67eae_3.conda#c4e2f4d5193e55a70bb67a2aa07006ae +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.11.1-py311h3778330_0.conda#8cedf8fb892cf8468f87d7e5a51e1466 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.60.1-py311h3778330_0.conda#91f834f85ac92978cfc3c1c178573e85 -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda#4afc585cd97ba8a23809406cd8a9eda8 +https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda#4b69232755285701bc86a5afe4d9933a https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda#c74d83614aec66227ae5199d98852aaf https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a04073db11c2c86c555fb088acc8f8c1 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-36_h0358290_openblas.conda#13a3fe5f9812ac8c5710ef8c03105121 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-36_h47877c9_openblas.conda#55daaac7ecf8ebd169cdbe34dc79549e -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.0-h26afc86_1.conda#8337b675e0cad517fbcb3daf7588087a +https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py311h0372a8f_2.conda#487756753716efba090d06c71fb73eb6 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py311h98278a2_3.conda#76839149314cc1d07f270174801576b0 https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh8b19718_0.conda#dfce4b2af4bfe90cdcaf56ca0b28ddf5 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.7.0-hb72c0af_0.conda#438e75abf4d8c9c1d9e483b6c3f36282 -https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.1-pyhe01879c_0.conda#8200884fd84ab8754567d8523b52eaa8 +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py311h4e6619b_2.conda#8092837339ae2e3697980df6686f996e +https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.3-py311h1e13796_0.conda#64a45020cd5a51f02fea17ad4dc76535 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py311h8a92878_2.conda#b37c338ff0f69883188c9b3b127be059 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.34.0-pyhd8ed1ab_0.conda#2bd6c0c96cfc4dbe9bde604a122e3e55 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.9.1-pyhcf101f3_0.conda#c49de33395d775a92ea90e0cb34c3577 -https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.3-nompi_h11f7409_103.conda#3ccff1066c05a1e6c221356eecc40581 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.3-py311h2e04523_0.conda#3b0d0a2241770397d3146fdcab3b49f8 -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py311h4e6619b_2.conda#8092837339ae2e3697980df6686f996e -https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhd8ed1ab_0.conda#1f987505580cb972cf28dc5f74a0f81b -https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.0-pyhd8ed1ab_0.conda#ad8f901272d56cfb6bf22bb89e9be59b -https://conda.anaconda.org/conda-forge/noarch/tox-4.30.3-pyhcf101f3_0.conda#48cfc6f4693667d563c598bb7829503c -https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hd18a35c_5.conda#4e8447ca8558a203ec0577b4730073f3 -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py311haee01d2_0.conda#0fd242142b0691eb9311dc32c1d4ab76 -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h0372a8f_2.conda#c85f7b94f099fddb08358e0997dded95 -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py311hdf67eae_2.conda#bb6a0f88cf345f7e7a143d349dae6d9f +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.35.4-pyhd8ed1ab_0.conda#cfccfd4e8d9de82ed75c8e2c91cab375 +https://conda.anaconda.org/conda-forge/noarch/anyio-4.11.0-pyhcf101f3_0.conda#814472b61da9792fae28156cb9ee54f5 +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py311h0372a8f_1.conda#ef8650a6059a907122d59a740207f50e +https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.11.0-pyhcf101f3_0.conda#91549f296c15ef7b49ee6600e7c934c1 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.44.0-h83bc92c_0.conda#2d37fd4ccfd98453a02a278e4112da39 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.7-py311h0f3be63_0.conda#b4ec935aa9298e5498613ea66b3c3a98 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.3-nompi_py311h6623971_100.conda#d625880a4f700264c5aad388856479ee +https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhcf101f3_1.conda#da0c42269086f5170e2b296878ec13a6 +https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0.conda#e2e4d7094d0580ccd62e2a41947444f3 +https://conda.anaconda.org/conda-forge/noarch/tox-4.32.0-pyhcf101f3_0.conda#1b49a3b817df5c88742219c4d6e5ee57 +https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hdf67eae_6.conda#57e703b0057f992687fb9ad154dc48e4 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py311haee01d2_1.conda#ca45bfd4871af957aaa5035593d5efd2 +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py311hed34c8f_1.conda#17c710c32010688086b28c088a8be579 +https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb https://conda.anaconda.org/conda-forge/noarch/identify-2.6.15-pyhd8ed1ab_0.conda#25f954b7dae6dd7b0dc004dab74f1ce9 -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a04073db11c2c86c555fb088acc8f8c1 -https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py311h0372a8f_2.conda#487756753716efba090d06c71fb73eb6 -https://conda.anaconda.org/conda-forge/noarch/nox-2025.5.1-pyhe01879c_0.conda#f294cc5e7c84a0422fcc57f33313e084 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda#6891acad5e136cb62a8c2ed2679d6528 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.2-py311h1e13796_0.conda#124834cd571d0174ad1c22701ab63199 -https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.0-hd8ed1ab_0.conda#03323fba6896975dc9ffae39b547c31b -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py311hdb2cc66_0.conda#7c0a99c77c423ff83b327e4eff3f82f5 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.44.0-py311h0372a8f_1.conda#c5a5fef7f068abe2858a89ddf19e5a79 +https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py311h0372a8f_1.conda#ef8650a6059a907122d59a740207f50e -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.42.0-h83bc92c_1.conda#928cc8b0a73355d11d32f4ffabaffa0c -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.6-py311h0f3be63_1.conda#65ddf155ea43aa3bb366cb03ddf3436a -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py311h6623971_104.conda#fc6c31f2b2bd3fce50d5496ce30d04ff +https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 +https://conda.anaconda.org/conda-forge/noarch/iris-3.13.1-pyha770c72_0.conda#33d150f58eb36070d2b8ad6dd1bd50d7 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.3.0-pyha770c72_0.conda#bc6c44af2a9e6067dd7e949ef10cdfba https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py311hed34c8f_1.conda#17c710c32010688086b28c088a8be579 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.42.0-py311h0372a8f_0.conda#3fcc860678286aee5e74813dee4b0ae9 -https://conda.anaconda.org/conda-forge/noarch/iris-3.13.1-pyha770c72_0.conda#33d150f58eb36070d2b8ad6dd1bd50d7 +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2025.10.31-pyhd8ed1ab_0.conda#92966163fd0dbae2ca24191fde3fde15 +https://conda.anaconda.org/conda-forge/noarch/nox-2025.10.16-pyhcf101f3_0.conda#2c39d36a165ae1b74c77ebfa7a096aa1 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda#e9fb3fe8a5b758b4aff187d434f94f03 diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 1a3d543c..42b63493 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -5,28 +5,27 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda#c3efd25ac4d74b1584d2f7a57195ddf1 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a -https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda#74784ee3d225fc3dca89edb635b4e5cc -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-ha97dd6f_2.conda#14bae321b8127b63cba276bd53fac237 +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda#f9e5fbc24009179e8b0409624691758a https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.1.0-h767d61c_5.conda#dcd5ff1940cd38f6df777cac86819d60 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda#f7b4d76975aac7e5d9e6ad13845f92fe https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.1.0-h767d61c_5.conda#264fbfba7fb20acf3b29cde153e345ce +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda#c0374badb3a5d4b1372db28d19462c53 https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda#791365c5f65975051e4e017b5da3abf5 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda#51a19bba1b8ebfb60df25cde030b7ebc https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 -https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb03c661_4.conda#1d29d2e33fe59954af82ef54a8af3fe1 -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.24-h86f0d12_0.conda#64f0c503da58ec25ebd359e4d990afa8 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-h09219d5_0.conda#9b3117ec960b823815b02190b41c0484 +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda#6c77a605a7a689d17d4819c0f8ac9a00 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda#4211416ecba1866fab0c6470986c22d6 -https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_5.conda#069afdf8ea72504e48d23ae1171d951c -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.1.0-hcea5267_5.conda#fbd4008644add05032b6764807ee2cba +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda#35f29eec58405aaf55e01cb470d8c26a +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda#280ea6eee9e2ddefde25ff799c4f0363 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-hcd61629_7.conda#f116940d825ffc9104400f0d7f1a4551 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 -https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.0-hb9d3cd8_0.conda#9fa334557db9f63da6c9285fd2a48638 +https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda#8397539e3a0bbd1695584fb4f927485a https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_5.conda#4e02a49aaa9d5190cb630fa43528fbe6 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda#5b767048b1b3ee9a954b06f4084f93dc https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda#80c07c68d2f6870250959dcc95b209d1 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 @@ -37,19 +36,18 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb47aa4a_0.conda#607e13a8caac17f9a664bcab5302ce06 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a -https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.0-h480dda7_0.conda#5dc479effdabf54a0ff240d565287495 +https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.1-h480dda7_0.conda#4d4efd0645cd556fab54617c4ad477ef https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.4-h3f801dc_0.conda#01ba04e414e47f95c03d6ddd81fd37be -https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb03c661_4.conda#5cb5a1c9a94a78f5b23684bcb845338d -https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb03c661_4.conda#2e55011fa483edb8bfe3fd92e860cd79 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hd53d788_0.conda#c183787d2b228775dece45842abbbe53 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-h02bd7ab_0.conda#b7a924e3e9ebc7938ffc7d94fe603ed3 https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.1.0-h69a702a_5.conda#0c91408b3dec0b97e8a3c694845bd63b +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_7.conda#8621a450add4e231f676646880703f49 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.50-h421ea60_1.conda#7af8e91b0deb5f8e25d1a595dea79614 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda#0b367fad34931cb79e0d6b7e5c06bb1c https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_5.conda#8bba50c7f4679f08c861b597ad2bda6b +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda#f627678cf829bd70bccf141a19c3ad3e https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc @@ -59,139 +57,149 @@ https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#28 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_0.conda#3d8da0248bdae970b4ade636a104b7f5 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda#a0116df4f4ed05c303811a837d5b39d8 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 +https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.2.5-hde8ca8f_0.conda#1920c3502e7f6688d650ab81cd3775fd https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d -https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb03c661_4.conda#ca4ed8015764937c81b830f7f5b68543 +https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hf2c8021_0.conda#5304333319a6124a2737d9f128cbc4ed https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1aa0949_4.conda#c94ab6ff54ba5172cf1c58267005670f https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda#8e7251989bca326a28f4a5ffbd74557a https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda#b499ce4b026493a13774bcf0f4c33849 -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_2.conda#dfc5aae7b043d9f56ba99514d5e60625 -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h8261f1e_0.conda#72b531694ebe4e8aa6f5745d1015c1b4 -https://conda.anaconda.org/conda-forge/linux-64/python-3.12.11-h9e4cc4f_0_cpython.conda#94206474a5608243a10c92cefbe0908f +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_3.conda#ac2e4832427d6b159576e8a68305c722 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#cd5a90476766d53e901500df9215e927 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.50.4-hbc0de68_0.conda#8376bd3854542be0c8c7cd07525d31c6 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-h41a2e66_0.conda#4ddfd44e473c676cb8e80548ba4aa704 +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-38_h4a7cf45_openblas.conda#3509b5e2aaa5f119013c8969fdd9a905 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda#01e149d4a53185622dc2e788281961f2 +https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda#f4084e4e6577797150f9b04a4560ceb0 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.0-hee844dc_0.conda#729a572a3ebb8c43933b30edcc628ceb +https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-ha9997c6_0.conda#e7733bc6785ec009e47a224a71917e84 +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda#4afc585cd97ba8a23809406cd8a9eda8 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda#c74d83614aec66227ae5199d98852aaf +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-38_h0358290_openblas.conda#bcd928a9376a215cd9164a4312dd5e98 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-38_h47877c9_openblas.conda#88f10bff57b423a3fd2d990c6055771e +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-h26afc86_0.conda#e512be7dc1f84966d50959e900ca121f +https://conda.anaconda.org/conda-forge/linux-64/python-3.12.12-hd63d673_1_cpython.conda#5c00c8cea14ee8d02941cab9121dce41 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.51.0-heff268d_0.conda#5422f0e1b59d2aa29329d5b3e36d57e5 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a -https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.2-pyhd8ed1ab_0.conda#eb9d4263271ca287d2e0cf5a86da2d3a -https://conda.anaconda.org/conda-forge/noarch/attrs-25.3.0-pyh71513ae_0.conda#a10d11958cadc13fdb43df75f8b1903f -https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb03c661_4.conda#eaf3fbd2aa97c212336de38a51fe404e -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h1289d80_4.conda#fd0e7746ed0676f008daacb706ce69e4 -https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.0-pyhd8ed1ab_0.conda#33a59a2cf83ab89ee546c72254521a4a -https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda#11f59985f49df4620890f3e746ed7102 +https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda#8f37c8fb7116a18da04e52fa9e2c8df9 +https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda#c7944d55af26b6d2d7629e27e9a972c1 +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py312h67db365_0.conda#7c9245551ebbe6b6068aeda04060afaa +https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.1-pyhd8ed1ab_0.conda#94e54066d0b9c3864771cfd7458f3e2c +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.10.5-pyhd8ed1ab_0.conda#257ae203f1d204107ba389607d375ded https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda#7e7d5ef1b9ed630e4a1c358d6bc62284 +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda#a22d1fd9bf98827e280a02875d9a007a https://conda.anaconda.org/conda-forge/noarch/click-8.3.0-pyh707e725_0.conda#e76c4ba9e1837847679421b8d549b784 -https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.1-pyhd8ed1ab_0.conda#364ba6c9fb03886ac979b482f39ebb92 +https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhd8ed1ab_0.conda#fcac5929097ba1f2a0e5b6ecaa13b253 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 -https://conda.anaconda.org/conda-forge/noarch/colorlog-6.9.0-pyh707e725_1.conda#f00fc375bd02bdbbf791f9fe26ae96ec +https://conda.anaconda.org/conda-forge/noarch/colorlog-6.10.1-pyh707e725_0.conda#33e96df3785bf61676ffee387e5a19e5 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc -https://conda.anaconda.org/conda-forge/noarch/filelock-3.19.1-pyhd8ed1ab_0.conda#9c418d067409452b2e87e0016257da68 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda#66b8b26023b8efdf8fcb23bac4b6325d https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 -https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.9.0-pyhd8ed1ab_0.conda#76f492bd8ba8a0fb80ffe16fc1a75b3b +https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.10.0-pyhd8ed1ab_0.conda#d18004c37182f83b9818b714825a7627 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e +https://conda.anaconda.org/conda-forge/noarch/humanize-4.14.0-pyhd8ed1ab_0.conda#8b8884a6375830fe0cfb806ccbbd755c https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac -https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 +https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda#53abe63df7e10a6ba605dc5f9f961d36 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 -https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 +https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda#9614359868482abba1bd15ce465e3c42 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de -https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py312h0a2e395_1.conda#cec5c1ea565944a94f82cdd6fba7cc76 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-36_h4a7cf45_openblas.conda#2a6122504dc8ea139337046d34a110cb -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 -https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda#f4084e4e6577797150f9b04a4560ceb0 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.0-ha9997c6_1.conda#b24dd2bd61cd8e4f8a13ee2a945a723c +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py312h0a2e395_2.conda#3a3004fddd39e3bb1a631b08d7045156 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.3-nompi_h11f7409_103.conda#3ccff1066c05a1e6c221356eecc40581 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_0.conda#f775a43412f7f3d7ed218113ad233869 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.4-py312h33ff503_0.conda#23494fd5bbca946e6e70ecc648352b2f https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.4.0-pyhcf101f3_0.conda#cc9d9a3929503785403dbfad9f707145 +https://conda.anaconda.org/conda-forge/linux-64/pillow-12.0.0-py312h0889fd4_0.conda#45824eb723a6b4a128d120ad1d07df5e +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda#5c7a868f8241e64e1cf5fdf4962f23e2 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.7.0-hb72c0af_0.conda#438e75abf4d8c9c1d9e483b6c3f36282 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.5-pyhcf101f3_0.conda#6c8979be6d7a17692793114fa26916e8 -https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.1-pyhd8ed1ab_0.conda#205ac0b2873addb372a4384361990043 +https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.2-pyhd8ed1ab_0.conda#3751072ac0bd677416696063872078f1 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac -https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.6.0-py312h0d868a3_0.conda#f028575d582ac3d51f17425a4897191c +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.6.0-py312h0d868a3_1.conda#1cfb9b04c827219597def32c22fb9ca2 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_0.conda#fba10c2007c8b06f77c5a23ce3a635ad https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-3.1.0-pyhd8ed1ab_0.conda#5f0f24f8032c2c1bb33f59b75974f5fc https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 +https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda#bf7a226e58dfb8346c70df36065d86c9 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda#755cf22df8693aa0d1aec1c123fa5863 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb -https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhe01879c_2.conda#30a0a26c8abccf4b7991d590fe17c699 -https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_1.conda#40d0ed782a8aaa16ef248e68c06c168d +https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda#d2732eb636c264dc9aa4cbee404b1a53 +https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda#c07a6153f8306e45794774cf9b13bd32 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d -https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py312h4c3975b_1.conda#4da303c1e91703d178817252615ca0a7 +https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.0-py312h4c3975b_0.conda#6974ef6fcc2c0d8a753454f08a7e12d5 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 -https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py312h35888ee_0.conda#60b9cd087d22272885a6b8366b1d3d43 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.7-py312h8a5da7c_0.conda#03d83efc728a6721a0f1616a04a7fc84 +https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py312h460c074_1.conda#648ee28dcd4e07a1940a17da62eccd40 +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312h4f23490_2.conda#ff4b5976814bc00861f962276c8fb87f +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312hd9148b4_3.conda#86cf7a7d861b79d38e3f0e5097e4965b +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.11.1-py312h8a5da7c_0.conda#529275b1fb758b86bbecd166da6a3e4f https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.60.1-py312h8a5da7c_0.conda#b12bb9cc477156ce84038e0be6d0f763 -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda#4afc585cd97ba8a23809406cd8a9eda8 +https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda#4b69232755285701bc86a5afe4d9933a https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda#c74d83614aec66227ae5199d98852aaf https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a04073db11c2c86c555fb088acc8f8c1 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-36_h0358290_openblas.conda#13a3fe5f9812ac8c5710ef8c03105121 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-36_h47877c9_openblas.conda#55daaac7ecf8ebd169cdbe34dc79549e -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.0-h26afc86_1.conda#8337b675e0cad517fbcb3daf7588087a +https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h4f23490_2.conda#cec5bc5f7d374f8f8095f8e28e31f6cb https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py312h7b42cdd_3.conda#1d7f05c3f8bb4e98d02fca45f0920b23 https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh8b19718_0.conda#dfce4b2af4bfe90cdcaf56ca0b28ddf5 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.7.0-hb72c0af_0.conda#438e75abf4d8c9c1d9e483b6c3f36282 -https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.1-pyhe01879c_0.conda#8200884fd84ab8754567d8523b52eaa8 +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py312h9b6a7d9_2.conda#573b9a879a3a42990f9c51d7376dce6b +https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.3-py312h7a1785b_0.conda#cc51e7492f3147ba5925b896dda54a3b +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py312h383787d_2.conda#69e400d3deca12ee7afd4b73a5596905 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.34.0-pyhd8ed1ab_0.conda#2bd6c0c96cfc4dbe9bde604a122e3e55 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.9.1-pyhcf101f3_0.conda#c49de33395d775a92ea90e0cb34c3577 -https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.3-nompi_h11f7409_103.conda#3ccff1066c05a1e6c221356eecc40581 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.3-py312h33ff503_0.conda#261a82ff799db441c7122f6a83ade061 -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py312h9b6a7d9_2.conda#573b9a879a3a42990f9c51d7376dce6b -https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhd8ed1ab_0.conda#1f987505580cb972cf28dc5f74a0f81b -https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.0-pyhd8ed1ab_0.conda#ad8f901272d56cfb6bf22bb89e9be59b -https://conda.anaconda.org/conda-forge/noarch/tox-4.30.3-pyhcf101f3_0.conda#48cfc6f4693667d563c598bb7829503c -https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h68727a3_5.conda#f9664ee31aed96c85b7319ab0a693341 -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py312h5253ce2_0.conda#05d73100768745631ab3de9dc1e08da2 -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312h4f23490_2.conda#ff4b5976814bc00861f962276c8fb87f -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312hd9148b4_2.conda#bce621e43978c245261c76b45edeaa3d +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.35.4-pyhd8ed1ab_0.conda#cfccfd4e8d9de82ed75c8e2c91cab375 +https://conda.anaconda.org/conda-forge/noarch/anyio-4.11.0-pyhcf101f3_0.conda#814472b61da9792fae28156cb9ee54f5 +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py312h4f23490_1.conda#ac0a1a874ce9e3f8940a3a908ff74da9 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.11.0-pyhcf101f3_0.conda#91549f296c15ef7b49ee6600e7c934c1 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.44.0-h83bc92c_0.conda#2d37fd4ccfd98453a02a278e4112da39 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.7-py312he3d6523_0.conda#066291f807305cff71a8ec1683fc9958 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.3-nompi_py312hf6400b3_100.conda#ed7ab4073fe4c48d0f9d3a80b6a17f74 +https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhcf101f3_1.conda#da0c42269086f5170e2b296878ec13a6 +https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0.conda#e2e4d7094d0580ccd62e2a41947444f3 +https://conda.anaconda.org/conda-forge/noarch/tox-4.32.0-pyhcf101f3_0.conda#1b49a3b817df5c88742219c4d6e5ee57 +https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312hd9148b4_6.conda#f30ece80e76f9cc96e30cc5c71d2818e +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py312h5253ce2_1.conda#02738ff9855946075cbd1b5274399a41 +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py312hf79963d_1.conda#6c913a686cb4060cbd7639a36fa144f0 +https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb https://conda.anaconda.org/conda-forge/noarch/identify-2.6.15-pyhd8ed1ab_0.conda#25f954b7dae6dd7b0dc004dab74f1ce9 -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a04073db11c2c86c555fb088acc8f8c1 -https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h4f23490_2.conda#cec5bc5f7d374f8f8095f8e28e31f6cb -https://conda.anaconda.org/conda-forge/noarch/nox-2025.5.1-pyhe01879c_0.conda#f294cc5e7c84a0422fcc57f33313e084 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda#6891acad5e136cb62a8c2ed2679d6528 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.2-py312h7a1785b_0.conda#86a0cf3ba594247a8c44bd2111d7549c -https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.0-hd8ed1ab_0.conda#03323fba6896975dc9ffae39b547c31b -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py312h950be2a_0.conda#16f95b810ff3253eabdcbb0b258c56dd +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.44.0-py312h4f23490_1.conda#eea306a68c483e1305381130b35a09ff +https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py312h4f23490_1.conda#ac0a1a874ce9e3f8940a3a908ff74da9 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.42.0-h83bc92c_1.conda#928cc8b0a73355d11d32f4ffabaffa0c -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.6-py312he3d6523_1.conda#94926ee1d68e678fb4cfdb0727a0927e -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py312hf6400b3_104.conda#e3f2d3ba3f36a10a32219dff624f4ea0 +https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 +https://conda.anaconda.org/conda-forge/noarch/iris-3.13.1-pyha770c72_0.conda#33d150f58eb36070d2b8ad6dd1bd50d7 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.3.0-pyha770c72_0.conda#bc6c44af2a9e6067dd7e949ef10cdfba https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py312hf79963d_1.conda#6c913a686cb4060cbd7639a36fa144f0 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.42.0-py312h4f23490_0.conda#74efa23b5e5237a76293e27995b1b074 -https://conda.anaconda.org/conda-forge/noarch/iris-3.13.1-pyha770c72_0.conda#33d150f58eb36070d2b8ad6dd1bd50d7 +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2025.10.31-pyhd8ed1ab_0.conda#92966163fd0dbae2ca24191fde3fde15 +https://conda.anaconda.org/conda-forge/noarch/nox-2025.10.16-pyhcf101f3_0.conda#2c39d36a165ae1b74c77ebfa7a096aa1 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda#e9fb3fe8a5b758b4aff187d434f94f03 diff --git a/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_gg_grib1.cml b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_gg_grib1.cml index 88169ca7..572e56d9 100644 --- a/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_gg_grib1.cml +++ b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_gg_grib1.cml @@ -40,6 +40,6 @@ - + From 9f94104dc767694ed07863a6d9154e2bf90dcd2a Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 24 Nov 2025 09:26:18 +0000 Subject: [PATCH 516/583] Updated environment lockfiles (#729) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 52 ++++++++++----------- requirements/locks/py311-linux-64.lock | 62 +++++++++++++------------- requirements/locks/py312-linux-64.lock | 62 +++++++++++++------------- 3 files changed, 88 insertions(+), 88 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 5b53ee66..1265f308 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -5,7 +5,8 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.conda#05e00f3b21e88bb3d658ac700b2ce58c https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a -https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda#f9e5fbc24009179e8b0409624691758a +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda#f0991f0f84902f6b6009b4d2350a83aa +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-bootstrap_ha15bf96_3.conda#3036ca5b895b7f5146c5a25486234a68 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda#f7b4d76975aac7e5d9e6ad13845f92fe https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d @@ -17,7 +18,7 @@ https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-h09219d5_0.conda#9b3117ec960b823815b02190b41c0484 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda#6c77a605a7a689d17d4819c0f8ac9a00 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda#4211416ecba1866fab0c6470986c22d6 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda#8b09ae86839581147ef2e5c5e229d164 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda#35f29eec58405aaf55e01cb470d8c26a https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda#280ea6eee9e2ddefde25ff799c4f0363 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-hcd61629_7.conda#f116940d825ffc9104400f0d7f1a4551 @@ -30,10 +31,10 @@ https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda# https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.4-h26f9b46_0.conda#14edad12b59ccbfa3910d42c72adc2a0 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda#9ee58d5c534af06558933af3c845a780 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda#b2895afaf55bf96a8c8282a2e47a5de0 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda#1dafce8548e38671bea82e3f5c6ce22f https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb47aa4a_0.conda#607e13a8caac17f9a664bcab5302ce06 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.1-h480dda7_0.conda#4d4efd0645cd556fab54617c4ad477ef @@ -45,7 +46,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_7.conda#8621a450add4e231f676646880703f49 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.50-h421ea60_1.conda#7af8e91b0deb5f8e25d1a595dea79614 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.51-h421ea60_0.conda#d8b81203d08435eb999baa249427884e https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda#f627678cf829bd70bccf141a19c3ad3e https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 @@ -54,8 +55,8 @@ https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.cond https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 -https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_0.conda#3d8da0248bdae970b4ade636a104b7f5 -https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda#a0116df4f4ed05c303811a837d5b39d8 +https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda#98b6c9dc80eb87b2519b97bcf7e578dd +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda#86bc20552bf46075e3d92b67f089172d https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.2.5-hde8ca8f_0.conda#1920c3502e7f6688d650ab81cd3775fd https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 @@ -64,18 +65,17 @@ https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hf2c8021_0.cond https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1aa0949_4.conda#c94ab6ff54ba5172cf1c58267005670f https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda#8e7251989bca326a28f4a5ffbd74557a https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda#b499ce4b026493a13774bcf0f4c33849 -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_3.conda#ac2e4832427d6b159576e8a68305c722 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda#be43915efc66345cccb3c310b6ed0374 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#cd5a90476766d53e901500df9215e927 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-h41a2e66_0.conda#4ddfd44e473c676cb8e80548ba4aa704 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-38_h4a7cf45_openblas.conda#3509b5e2aaa5f119013c8969fdd9a905 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-1_h4a7cf45_openblas.conda#8b39e1ae950f1b54a3959c58ca2c32b8 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda#01e149d4a53185622dc2e788281961f2 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda#f4084e4e6577797150f9b04a4560ceb0 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.0-hee844dc_0.conda#729a572a3ebb8c43933b30edcc628ceb @@ -85,8 +85,8 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda#4afc585cd97ba8a23809406cd8a9eda8 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda#c74d83614aec66227ae5199d98852aaf -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-38_h0358290_openblas.conda#bcd928a9376a215cd9164a4312dd5e98 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-38_h47877c9_openblas.conda#88f10bff57b423a3fd2d990c6055771e +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-1_h0358290_openblas.conda#a670bff9eb7963ea41b4e09a4e4ab608 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-1_h47877c9_openblas.conda#dee12a83aa4aca5077ea23c0605de044 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-h26afc86_0.conda#e512be7dc1f84966d50959e900ca121f https://conda.anaconda.org/conda-forge/linux-64/python-3.10.19-h3c07f61_2_cpython.conda#27ac896a8b4970f8977503a9e70dc745 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.51.0-heff268d_0.conda#5422f0e1b59d2aa29329d5b3e36d57e5 @@ -95,12 +95,12 @@ https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda#8f37c8fb7116a18da04e52fa9e2c8df9 https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda#c7944d55af26b6d2d7629e27e9a972c1 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py310h8cfb67f_0.conda#12f24867bc0ec4e15c89cdff988c500e -https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.1-pyhd8ed1ab_0.conda#94e54066d0b9c3864771cfd7458f3e2c -https://conda.anaconda.org/conda-forge/noarch/certifi-2025.10.5-pyhd8ed1ab_0.conda#257ae203f1d204107ba389607d375ded -https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e +https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.2-pyhd8ed1ab_0.conda#9c265afcec13eb6e844ae51b4a4b52ad +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda#96a02a5c1a65470a7e4eedb644c872fd +https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda#a22d1fd9bf98827e280a02875d9a007a -https://conda.anaconda.org/conda-forge/noarch/click-8.3.0-pyh707e725_0.conda#e76c4ba9e1837847679421b8d549b784 +https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh707e725_0.conda#9ba00b39e03a0afb2b1cc0767d4c6175 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhd8ed1ab_0.conda#fcac5929097ba1f2a0e5b6ecaa13b253 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/colorlog-6.10.1-pyh707e725_0.conda#33e96df3785bf61676ffee387e5a19e5 @@ -139,20 +139,20 @@ https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py310h3406613_0.conda#bc058b3b89fcb525bb4977832aa52014 https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 -https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda#bf7a226e58dfb8346c70df36065d86c9 +https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda#03fe290994c5e4ec17293cfb6bdce520 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda#755cf22df8693aa0d1aec1c123fa5863 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda#d2732eb636c264dc9aa4cbee404b1a53 https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda#c07a6153f8306e45794774cf9b13bd32 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d -https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.0-py310h7c4b9e2_0.conda#2321fe047faf8cdd92c0928e0c2b03e5 +https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.0-py310h7c4b9e2_1.conda#b1ccdb989be682ab0dd430c1c15d5012 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py310he7384ee_1.conda#803e2d778b8dcccdc014127ec5001681 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310hf779ad0_2.conda#30167b9702fd4a46cd4a98e74c9840d8 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py310h3788b33_0.conda#b6420d29123c7c823de168f49ccdfe6a -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.11.1-py310h3406613_0.conda#895a647366ecbbcdeb3e131c2406647f +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.12.0-py310h3406613_0.conda#b42800b0d20b57c92087052b21ab2013 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.60.1-py310h3406613_0.conda#ac183a1fd0cbebd32a20a2aeaf8dc01d @@ -165,7 +165,7 @@ https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#44 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py310hf779ad0_2.conda#4906d8c3680f6c1273ad5a5775807867 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh8b19718_0.conda#dfce4b2af4bfe90cdcaf56ca0b28ddf5 +https://conda.anaconda.org/conda-forge/noarch/pip-25.3-pyh8b19718_0.conda#c55515ca43c6444d2572e0f0d93cb6b9 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py310h71d0299_1.conda#e54b1eaeb50ad1767680181a8575a8db https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 @@ -177,9 +177,9 @@ https://conda.anaconda.org/conda-forge/noarch/anyio-4.11.0-pyhcf101f3_0.conda#81 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py310hf779ad0_1.conda#5e4aea6b728177b53e8a216922ebd6a2 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.44.0-h83bc92c_0.conda#2d37fd4ccfd98453a02a278e4112da39 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.7.0-h40b2b14_1.conda#8a77895fb29728b736a1a6c75906ea1a -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.7-py310hfde16b3_0.conda#185a6d44916e4e28bb50d0192eb6b880 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py310hfde16b3_0.conda#093b60a14d2c0d8c10f17e14a73a60d3 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.3-nompi_py310he90c06d_100.conda#e1a3c6a1e8ceec1fe91a3660b97a43b6 -https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhcf101f3_1.conda#da0c42269086f5170e2b296878ec13a6 +https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.1-pyhcf101f3_0.conda#fa7f71faa234947d9c520f89b4bda1a2 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0.conda#e2e4d7094d0580ccd62e2a41947444f3 https://conda.anaconda.org/conda-forge/noarch/tox-4.32.0-pyhcf101f3_0.conda#1b49a3b817df5c88742219c4d6e5ee57 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310h03d9f68_6.conda#34778c3f9a6ea19610e7e340dc2caaab @@ -195,11 +195,11 @@ https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.co https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 https://conda.anaconda.org/conda-forge/noarch/iris-3.11.1-pyha770c72_1.conda#f501583062225a070455d011d81b07bf -https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.3.0-pyha770c72_0.conda#bc6c44af2a9e6067dd7e949ef10cdfba +https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.4.0-pyha770c72_0.conda#c130573bb7a166e93d5bd01c94ae38e1 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2025.10.31-pyhd8ed1ab_0.conda#92966163fd0dbae2ca24191fde3fde15 -https://conda.anaconda.org/conda-forge/noarch/nox-2025.10.16-pyhcf101f3_0.conda#2c39d36a165ae1b74c77ebfa7a096aa1 +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2025.11.20-pyhd8ed1ab_0.conda#1285738dad946d2c508ccfb83b866970 +https://conda.anaconda.org/conda-forge/noarch/nox-2025.11.12-pyhcf101f3_0.conda#ae74047e4fe04ff7760d9529c49b7475 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda#e9fb3fe8a5b758b4aff187d434f94f03 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index d66766b5..35f45386 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -5,7 +5,8 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda#8fcb6b0e2161850556231336dae58358 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a -https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda#f9e5fbc24009179e8b0409624691758a +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda#f0991f0f84902f6b6009b4d2350a83aa +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-bootstrap_ha15bf96_3.conda#3036ca5b895b7f5146c5a25486234a68 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda#f7b4d76975aac7e5d9e6ad13845f92fe https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d @@ -17,7 +18,7 @@ https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-h09219d5_0.conda#9b3117ec960b823815b02190b41c0484 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda#6c77a605a7a689d17d4819c0f8ac9a00 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda#4211416ecba1866fab0c6470986c22d6 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda#8b09ae86839581147ef2e5c5e229d164 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda#35f29eec58405aaf55e01cb470d8c26a https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda#280ea6eee9e2ddefde25ff799c4f0363 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-hcd61629_7.conda#f116940d825ffc9104400f0d7f1a4551 @@ -30,10 +31,10 @@ https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda# https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.4-h26f9b46_0.conda#14edad12b59ccbfa3910d42c72adc2a0 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda#9ee58d5c534af06558933af3c845a780 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda#b2895afaf55bf96a8c8282a2e47a5de0 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda#1dafce8548e38671bea82e3f5c6ce22f https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb47aa4a_0.conda#607e13a8caac17f9a664bcab5302ce06 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.1-h480dda7_0.conda#4d4efd0645cd556fab54617c4ad477ef @@ -45,7 +46,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_7.conda#8621a450add4e231f676646880703f49 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.50-h421ea60_1.conda#7af8e91b0deb5f8e25d1a595dea79614 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.51-h421ea60_0.conda#d8b81203d08435eb999baa249427884e https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda#f627678cf829bd70bccf141a19c3ad3e https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 @@ -54,8 +55,8 @@ https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.cond https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 -https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_0.conda#3d8da0248bdae970b4ade636a104b7f5 -https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda#a0116df4f4ed05c303811a837d5b39d8 +https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda#98b6c9dc80eb87b2519b97bcf7e578dd +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda#86bc20552bf46075e3d92b67f089172d https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.2.5-hde8ca8f_0.conda#1920c3502e7f6688d650ab81cd3775fd https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 @@ -64,18 +65,17 @@ https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hf2c8021_0.cond https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1aa0949_4.conda#c94ab6ff54ba5172cf1c58267005670f https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda#8e7251989bca326a28f4a5ffbd74557a https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda#b499ce4b026493a13774bcf0f4c33849 -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_3.conda#ac2e4832427d6b159576e8a68305c722 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda#be43915efc66345cccb3c310b6ed0374 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#cd5a90476766d53e901500df9215e927 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-h41a2e66_0.conda#4ddfd44e473c676cb8e80548ba4aa704 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-38_h4a7cf45_openblas.conda#3509b5e2aaa5f119013c8969fdd9a905 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-1_h4a7cf45_openblas.conda#8b39e1ae950f1b54a3959c58ca2c32b8 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda#01e149d4a53185622dc2e788281961f2 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda#f4084e4e6577797150f9b04a4560ceb0 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.0-hee844dc_0.conda#729a572a3ebb8c43933b30edcc628ceb @@ -85,8 +85,8 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda#4afc585cd97ba8a23809406cd8a9eda8 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda#c74d83614aec66227ae5199d98852aaf -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-38_h0358290_openblas.conda#bcd928a9376a215cd9164a4312dd5e98 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-38_h47877c9_openblas.conda#88f10bff57b423a3fd2d990c6055771e +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-1_h0358290_openblas.conda#a670bff9eb7963ea41b4e09a4e4ab608 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-1_h47877c9_openblas.conda#dee12a83aa4aca5077ea23c0605de044 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-h26afc86_0.conda#e512be7dc1f84966d50959e900ca121f https://conda.anaconda.org/conda-forge/linux-64/python-3.11.14-hd63d673_2_cpython.conda#c4202a55b4486314fbb8c11bc43a29a0 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.51.0-heff268d_0.conda#5422f0e1b59d2aa29329d5b3e36d57e5 @@ -95,12 +95,12 @@ https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda#8f37c8fb7116a18da04e52fa9e2c8df9 https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda#c7944d55af26b6d2d7629e27e9a972c1 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py311h7c6b74e_0.conda#645bc783bc723d67a294a51bc860762d -https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.1-pyhd8ed1ab_0.conda#94e54066d0b9c3864771cfd7458f3e2c -https://conda.anaconda.org/conda-forge/noarch/certifi-2025.10.5-pyhd8ed1ab_0.conda#257ae203f1d204107ba389607d375ded -https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e +https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.2-pyhd8ed1ab_0.conda#9c265afcec13eb6e844ae51b4a4b52ad +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda#96a02a5c1a65470a7e4eedb644c872fd +https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda#a22d1fd9bf98827e280a02875d9a007a -https://conda.anaconda.org/conda-forge/noarch/click-8.3.0-pyh707e725_0.conda#e76c4ba9e1837847679421b8d549b784 +https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh707e725_0.conda#9ba00b39e03a0afb2b1cc0767d4c6175 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhd8ed1ab_0.conda#fcac5929097ba1f2a0e5b6ecaa13b253 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/colorlog-6.10.1-pyh707e725_0.conda#33e96df3785bf61676ffee387e5a19e5 @@ -123,7 +123,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.3-nompi_h11f7409_1 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py311h3778330_0.conda#0954f1a6a26df4a510b54f73b2a0345c https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.4-py311h2e04523_0.conda#d84afde5a6f028204f24180ff87cf429 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.5-py311h2e04523_0.conda#01da92ddaf561cabebd06019ae521510 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/linux-64/pillow-12.0.0-py311h07c5bb8_0.conda#51f505a537b2d216a1b36b823df80995 https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda#5c7a868f8241e64e1cf5fdf4962f23e2 @@ -140,20 +140,20 @@ https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py311h3778330_0.con https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-3.1.0-pyhd8ed1ab_0.conda#5f0f24f8032c2c1bb33f59b75974f5fc https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 -https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda#bf7a226e58dfb8346c70df36065d86c9 +https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda#03fe290994c5e4ec17293cfb6bdce520 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda#755cf22df8693aa0d1aec1c123fa5863 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda#d2732eb636c264dc9aa4cbee404b1a53 https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda#c07a6153f8306e45794774cf9b13bd32 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d -https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.0-py311h49ec1c0_0.conda#dd15da2c344aecf8c36bf7944f1ea8d2 +https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.0-py311h49ec1c0_1.conda#5e6d4026784e83c0a51c86ec428e8cc8 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py311h03d9500_1.conda#3912e4373de46adafd8f1e97e4bd166b https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h0372a8f_2.conda#c85f7b94f099fddb08358e0997dded95 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py311hdf67eae_3.conda#c4e2f4d5193e55a70bb67a2aa07006ae -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.11.1-py311h3778330_0.conda#8cedf8fb892cf8468f87d7e5a51e1466 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.12.0-py311h3778330_0.conda#4ef5919a315f5c2834fc8da49044156d https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.60.1-py311h3778330_0.conda#91f834f85ac92978cfc3c1c178573e85 @@ -166,21 +166,21 @@ https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#44 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py311h0372a8f_2.conda#487756753716efba090d06c71fb73eb6 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh8b19718_0.conda#dfce4b2af4bfe90cdcaf56ca0b28ddf5 +https://conda.anaconda.org/conda-forge/noarch/pip-25.3-pyh8b19718_0.conda#c55515ca43c6444d2572e0f0d93cb6b9 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py311h4e6619b_2.conda#8092837339ae2e3697980df6686f996e https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.3-py311h1e13796_0.conda#64a45020cd5a51f02fea17ad4dc76535 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.3-py311h1e13796_1.conda#e1947291b713cb0afa949e1bcda1f935 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py311h8a92878_2.conda#b37c338ff0f69883188c9b3b127be059 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.35.4-pyhd8ed1ab_0.conda#cfccfd4e8d9de82ed75c8e2c91cab375 https://conda.anaconda.org/conda-forge/noarch/anyio-4.11.0-pyhcf101f3_0.conda#814472b61da9792fae28156cb9ee54f5 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py311h0372a8f_1.conda#ef8650a6059a907122d59a740207f50e -https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.11.0-pyhcf101f3_0.conda#91549f296c15ef7b49ee6600e7c934c1 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.9.1-pyhcf101f3_0.conda#c49de33395d775a92ea90e0cb34c3577 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.44.0-h83bc92c_0.conda#2d37fd4ccfd98453a02a278e4112da39 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.7-py311h0f3be63_0.conda#b4ec935aa9298e5498613ea66b3c3a98 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.3-nompi_py311h6623971_100.conda#d625880a4f700264c5aad388856479ee -https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhcf101f3_1.conda#da0c42269086f5170e2b296878ec13a6 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py311h0f3be63_0.conda#21a0139015232dc0edbf6c2179b5ec24 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py311h6623971_104.conda#fc6c31f2b2bd3fce50d5496ce30d04ff +https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.1-pyhcf101f3_0.conda#fa7f71faa234947d9c520f89b4bda1a2 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0.conda#e2e4d7094d0580ccd62e2a41947444f3 https://conda.anaconda.org/conda-forge/noarch/tox-4.32.0-pyhcf101f3_0.conda#1b49a3b817df5c88742219c4d6e5ee57 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hdf67eae_6.conda#57e703b0057f992687fb9ad154dc48e4 @@ -194,12 +194,12 @@ https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.44.0-py311h0372 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 -https://conda.anaconda.org/conda-forge/noarch/iris-3.13.1-pyha770c72_0.conda#33d150f58eb36070d2b8ad6dd1bd50d7 -https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.3.0-pyha770c72_0.conda#bc6c44af2a9e6067dd7e949ef10cdfba +https://conda.anaconda.org/conda-forge/noarch/iris-3.14.0-pyha770c72_1.conda#d5bd40a6e2b471e0de7e4c5b4050b5a4 +https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.4.0-pyha770c72_0.conda#c130573bb7a166e93d5bd01c94ae38e1 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2025.10.31-pyhd8ed1ab_0.conda#92966163fd0dbae2ca24191fde3fde15 -https://conda.anaconda.org/conda-forge/noarch/nox-2025.10.16-pyhcf101f3_0.conda#2c39d36a165ae1b74c77ebfa7a096aa1 +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2025.11.20-pyhd8ed1ab_0.conda#1285738dad946d2c508ccfb83b866970 +https://conda.anaconda.org/conda-forge/noarch/nox-2025.11.12-pyhcf101f3_0.conda#ae74047e4fe04ff7760d9529c49b7475 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda#e9fb3fe8a5b758b4aff187d434f94f03 diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 42b63493..6c11bdee 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -5,7 +5,8 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda#c3efd25ac4d74b1584d2f7a57195ddf1 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a -https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda#f9e5fbc24009179e8b0409624691758a +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda#f0991f0f84902f6b6009b4d2350a83aa +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-bootstrap_ha15bf96_3.conda#3036ca5b895b7f5146c5a25486234a68 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda#f7b4d76975aac7e5d9e6ad13845f92fe https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d @@ -17,7 +18,7 @@ https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-h09219d5_0.conda#9b3117ec960b823815b02190b41c0484 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda#6c77a605a7a689d17d4819c0f8ac9a00 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda#4211416ecba1866fab0c6470986c22d6 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda#8b09ae86839581147ef2e5c5e229d164 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda#35f29eec58405aaf55e01cb470d8c26a https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda#280ea6eee9e2ddefde25ff799c4f0363 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-hcd61629_7.conda#f116940d825ffc9104400f0d7f1a4551 @@ -30,10 +31,10 @@ https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda# https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.4-h26f9b46_0.conda#14edad12b59ccbfa3910d42c72adc2a0 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda#9ee58d5c534af06558933af3c845a780 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda#f6ebe2cb3f82ba6c057dde5d9debe4f7 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda#8035c64cb77ed555e3f150b7b3972480 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda#b2895afaf55bf96a8c8282a2e47a5de0 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda#1dafce8548e38671bea82e3f5c6ce22f https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb47aa4a_0.conda#607e13a8caac17f9a664bcab5302ce06 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.1-h480dda7_0.conda#4d4efd0645cd556fab54617c4ad477ef @@ -45,7 +46,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_7.conda#8621a450add4e231f676646880703f49 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.50-h421ea60_1.conda#7af8e91b0deb5f8e25d1a595dea79614 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.51-h421ea60_0.conda#d8b81203d08435eb999baa249427884e https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda#f627678cf829bd70bccf141a19c3ad3e https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 @@ -54,8 +55,8 @@ https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.cond https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 -https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_0.conda#3d8da0248bdae970b4ade636a104b7f5 -https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda#a0116df4f4ed05c303811a837d5b39d8 +https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda#98b6c9dc80eb87b2519b97bcf7e578dd +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda#86bc20552bf46075e3d92b67f089172d https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.2.5-hde8ca8f_0.conda#1920c3502e7f6688d650ab81cd3775fd https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 @@ -64,18 +65,17 @@ https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hf2c8021_0.cond https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1aa0949_4.conda#c94ab6ff54ba5172cf1c58267005670f https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda#8e7251989bca326a28f4a5ffbd74557a https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda#b499ce4b026493a13774bcf0f4c33849 -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_3.conda#ac2e4832427d6b159576e8a68305c722 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda#be43915efc66345cccb3c310b6ed0374 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#cd5a90476766d53e901500df9215e927 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-h41a2e66_0.conda#4ddfd44e473c676cb8e80548ba4aa704 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-38_h4a7cf45_openblas.conda#3509b5e2aaa5f119013c8969fdd9a905 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-1_h4a7cf45_openblas.conda#8b39e1ae950f1b54a3959c58ca2c32b8 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda#01e149d4a53185622dc2e788281961f2 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda#f4084e4e6577797150f9b04a4560ceb0 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.0-hee844dc_0.conda#729a572a3ebb8c43933b30edcc628ceb @@ -85,8 +85,8 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda#4afc585cd97ba8a23809406cd8a9eda8 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda#c74d83614aec66227ae5199d98852aaf -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-38_h0358290_openblas.conda#bcd928a9376a215cd9164a4312dd5e98 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-38_h47877c9_openblas.conda#88f10bff57b423a3fd2d990c6055771e +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-1_h0358290_openblas.conda#a670bff9eb7963ea41b4e09a4e4ab608 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-1_h47877c9_openblas.conda#dee12a83aa4aca5077ea23c0605de044 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-h26afc86_0.conda#e512be7dc1f84966d50959e900ca121f https://conda.anaconda.org/conda-forge/linux-64/python-3.12.12-hd63d673_1_cpython.conda#5c00c8cea14ee8d02941cab9121dce41 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.51.0-heff268d_0.conda#5422f0e1b59d2aa29329d5b3e36d57e5 @@ -95,12 +95,12 @@ https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda#8f37c8fb7116a18da04e52fa9e2c8df9 https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda#c7944d55af26b6d2d7629e27e9a972c1 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py312h67db365_0.conda#7c9245551ebbe6b6068aeda04060afaa -https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.1-pyhd8ed1ab_0.conda#94e54066d0b9c3864771cfd7458f3e2c -https://conda.anaconda.org/conda-forge/noarch/certifi-2025.10.5-pyhd8ed1ab_0.conda#257ae203f1d204107ba389607d375ded -https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e +https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.2-pyhd8ed1ab_0.conda#9c265afcec13eb6e844ae51b4a4b52ad +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda#96a02a5c1a65470a7e4eedb644c872fd +https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda#a22d1fd9bf98827e280a02875d9a007a -https://conda.anaconda.org/conda-forge/noarch/click-8.3.0-pyh707e725_0.conda#e76c4ba9e1837847679421b8d549b784 +https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh707e725_0.conda#9ba00b39e03a0afb2b1cc0767d4c6175 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhd8ed1ab_0.conda#fcac5929097ba1f2a0e5b6ecaa13b253 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/colorlog-6.10.1-pyh707e725_0.conda#33e96df3785bf61676ffee387e5a19e5 @@ -123,7 +123,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.3-nompi_h11f7409_1 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_0.conda#f775a43412f7f3d7ed218113ad233869 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.4-py312h33ff503_0.conda#23494fd5bbca946e6e70ecc648352b2f +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.5-py312h33ff503_0.conda#1570db96376f9f01cf495afe203672e5 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/linux-64/pillow-12.0.0-py312h0889fd4_0.conda#45824eb723a6b4a128d120ad1d07df5e https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda#5c7a868f8241e64e1cf5fdf4962f23e2 @@ -140,20 +140,20 @@ https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_0.con https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-3.1.0-pyhd8ed1ab_0.conda#5f0f24f8032c2c1bb33f59b75974f5fc https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 -https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_1.conda#bf7a226e58dfb8346c70df36065d86c9 +https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda#03fe290994c5e4ec17293cfb6bdce520 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda#755cf22df8693aa0d1aec1c123fa5863 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda#d2732eb636c264dc9aa4cbee404b1a53 https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda#c07a6153f8306e45794774cf9b13bd32 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d -https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.0-py312h4c3975b_0.conda#6974ef6fcc2c0d8a753454f08a7e12d5 +https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.0-py312h4c3975b_1.conda#a0b8efbe73c90f810a171a6c746be087 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py312h460c074_1.conda#648ee28dcd4e07a1940a17da62eccd40 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312h4f23490_2.conda#ff4b5976814bc00861f962276c8fb87f https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312hd9148b4_3.conda#86cf7a7d861b79d38e3f0e5097e4965b -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.11.1-py312h8a5da7c_0.conda#529275b1fb758b86bbecd166da6a3e4f +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.12.0-py312h8a5da7c_0.conda#4ecb5e03c7d50c4d0fe61045f6770130 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.60.1-py312h8a5da7c_0.conda#b12bb9cc477156ce84038e0be6d0f763 @@ -166,21 +166,21 @@ https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#44 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h4f23490_2.conda#cec5bc5f7d374f8f8095f8e28e31f6cb https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh8b19718_0.conda#dfce4b2af4bfe90cdcaf56ca0b28ddf5 +https://conda.anaconda.org/conda-forge/noarch/pip-25.3-pyh8b19718_0.conda#c55515ca43c6444d2572e0f0d93cb6b9 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py312h9b6a7d9_2.conda#573b9a879a3a42990f9c51d7376dce6b https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.3-py312h7a1785b_0.conda#cc51e7492f3147ba5925b896dda54a3b +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.3-py312h7a1785b_1.conda#c6e0e1f1d9ac014a980574cfe8caa25f https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py312h383787d_2.conda#69e400d3deca12ee7afd4b73a5596905 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.35.4-pyhd8ed1ab_0.conda#cfccfd4e8d9de82ed75c8e2c91cab375 https://conda.anaconda.org/conda-forge/noarch/anyio-4.11.0-pyhcf101f3_0.conda#814472b61da9792fae28156cb9ee54f5 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py312h4f23490_1.conda#ac0a1a874ce9e3f8940a3a908ff74da9 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.11.0-pyhcf101f3_0.conda#91549f296c15ef7b49ee6600e7c934c1 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.9.1-pyhcf101f3_0.conda#c49de33395d775a92ea90e0cb34c3577 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.44.0-h83bc92c_0.conda#2d37fd4ccfd98453a02a278e4112da39 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.7-py312he3d6523_0.conda#066291f807305cff71a8ec1683fc9958 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.3-nompi_py312hf6400b3_100.conda#ed7ab4073fe4c48d0f9d3a80b6a17f74 -https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhcf101f3_1.conda#da0c42269086f5170e2b296878ec13a6 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py312he3d6523_0.conda#b8dc157bbbb69c1407478feede8b7b42 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py312hf6400b3_104.conda#e3f2d3ba3f36a10a32219dff624f4ea0 +https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.1-pyhcf101f3_0.conda#fa7f71faa234947d9c520f89b4bda1a2 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0.conda#e2e4d7094d0580ccd62e2a41947444f3 https://conda.anaconda.org/conda-forge/noarch/tox-4.32.0-pyhcf101f3_0.conda#1b49a3b817df5c88742219c4d6e5ee57 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312hd9148b4_6.conda#f30ece80e76f9cc96e30cc5c71d2818e @@ -194,12 +194,12 @@ https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.44.0-py312h4f23 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 -https://conda.anaconda.org/conda-forge/noarch/iris-3.13.1-pyha770c72_0.conda#33d150f58eb36070d2b8ad6dd1bd50d7 -https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.3.0-pyha770c72_0.conda#bc6c44af2a9e6067dd7e949ef10cdfba +https://conda.anaconda.org/conda-forge/noarch/iris-3.14.0-pyha770c72_1.conda#d5bd40a6e2b471e0de7e4c5b4050b5a4 +https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.4.0-pyha770c72_0.conda#c130573bb7a166e93d5bd01c94ae38e1 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2025.10.31-pyhd8ed1ab_0.conda#92966163fd0dbae2ca24191fde3fde15 -https://conda.anaconda.org/conda-forge/noarch/nox-2025.10.16-pyhcf101f3_0.conda#2c39d36a165ae1b74c77ebfa7a096aa1 +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2025.11.20-pyhd8ed1ab_0.conda#1285738dad946d2c508ccfb83b866970 +https://conda.anaconda.org/conda-forge/noarch/nox-2025.11.12-pyhcf101f3_0.conda#ae74047e4fe04ff7760d9529c49b7475 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda#e9fb3fe8a5b758b4aff187d434f94f03 From cd24138a4fcbf90d747a0db7bc074b196bb7b9e8 Mon Sep 17 00:00:00 2001 From: Martin Yeo <40734014+trexfeathers@users.noreply.github.com> Date: Tue, 25 Nov 2025 15:24:58 +0000 Subject: [PATCH 517/583] Pre-commit update plus repo-review improvements (#731) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: update pre-commit hooks updates: - [github.com/astral-sh/ruff-pre-commit: v0.14.5 → v0.14.6](https://github.com/astral-sh/ruff-pre-commit/compare/v0.14.5...v0.14.6) - [github.com/scientific-python/cookie: 2025.11.10 → 2025.11.21](https://github.com/scientific-python/cookie/compare/2025.11.10...2025.11.21) * Pre-commit update and repo-review fixes. --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 6 ++++-- pyproject.toml | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 5ba14e92..8f1b8f7b 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -5,7 +5,9 @@ ci: autofix_prs: true + autofix_commit_msg: "style: pre-commit fixes" autoupdate_commit_msg: "chore: update pre-commit hooks" + autoupdate_schedule: "monthly" # Alphabetised, for lack of a better order. @@ -78,7 +80,7 @@ repos: types: [file, python] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.14.5" + rev: "v0.14.6" hooks: - id: ruff-check types: [file, python] @@ -93,7 +95,7 @@ repos: types: [file, python] - repo: https://github.com/scientific-python/cookie - rev: 2025.11.10 + rev: 2025.11.21 hooks: - id: sp-repo-review additional_dependencies: ["repo-review[cli]"] diff --git a/pyproject.toml b/pyproject.toml index b43f6275..8966d6a3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -148,6 +148,7 @@ minversion = "6.0" testpaths = "src/iris_grib" xfail_strict = "True" filterwarnings = ["default"] +log_level = "INFO" [tool.repo-review] ignore = [ From 3b0346976a916eca7d3051479ea70c94f59f43f6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 27 Nov 2025 09:21:36 +0000 Subject: [PATCH 518/583] Bump the dependencies group with 4 updates (#732) Bumps the dependencies group with 4 updates: [scitools/workflows/.github/workflows/ci-manifest.yml](https://github.com/scitools/workflows), [scitools/workflows/.github/workflows/ci-template-check.yml](https://github.com/scitools/workflows), [actions/checkout](https://github.com/actions/checkout) and [scitools/workflows/.github/workflows/refresh-lockfiles.yml](https://github.com/scitools/workflows). Updates `scitools/workflows/.github/workflows/ci-manifest.yml` from 2025.11.4 to 2025.11.8 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.11.4...2025.11.8) Updates `scitools/workflows/.github/workflows/ci-template-check.yml` from 2025.11.4 to 2025.11.8 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.11.4...2025.11.8) Updates `actions/checkout` from 5 to 6 - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v5...v6) Updates `scitools/workflows/.github/workflows/refresh-lockfiles.yml` from 2025.11.4 to 2025.11.8 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.11.4...2025.11.8) --- updated-dependencies: - dependency-name: scitools/workflows/.github/workflows/ci-manifest.yml dependency-version: 2025.11.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: scitools/workflows/.github/workflows/ci-template-check.yml dependency-version: 2025.11.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: actions/checkout dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major dependency-group: dependencies - dependency-name: scitools/workflows/.github/workflows/refresh-lockfiles.yml dependency-version: 2025.11.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/ci-template-check.yml | 2 +- .github/workflows/ci-tests.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index b23beba8..45be03e6 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.11.4 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.11.8 diff --git a/.github/workflows/ci-template-check.yml b/.github/workflows/ci-template-check.yml index 2968d871..b7bc5645 100644 --- a/.github/workflows/ci-template-check.yml +++ b/.github/workflows/ci-template-check.yml @@ -10,7 +10,7 @@ on: jobs: prompt-share: - uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.11.4 + uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.11.8 secrets: inherit with: pr_number: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/ci-tests.yml b/.github/workflows/ci-tests.yml index 6f5322b1..95824a94 100644 --- a/.github/workflows/ci-tests.yml +++ b/.github/workflows/ci-tests.yml @@ -63,7 +63,7 @@ jobs: steps: - name: "checkout" - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: "environment configure" env: diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index f7bfec58..99fc4e54 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.11.4 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.11.8 secrets: inherit From 534d1fc35b45abfc03831eb92eee6aa3b016fa9d Mon Sep 17 00:00:00 2001 From: Martin Yeo <40734014+trexfeathers@users.noreply.github.com> Date: Thu, 27 Nov 2025 15:34:35 +0000 Subject: [PATCH 519/583] Saving support for Earth shape 6 - Fixed Radius 6,371,229m (#721) * GRIB2 table3.2 earth radius 6,371,229m * Correct shape_of_the_earth conditionals. * Correct earth-shape 6 radius octet. * Abstract out earth shape octet setting. * Refactor shape_of_the_earth conditionals. * Correct existing KGO test. * Ruff corrections. * Add tests for earth shape 6. * What's New entry. * Fix roundtrip test. --------- Co-authored-by: andrewgryan --- docs/ref/release_notes.rst | 5 ++ src/iris_grib/_save_rules.py | 82 +++++++++++++------ .../test_grid_definition_section.py | 9 +- .../test_grid_definition_template_0.py | 10 +++ .../test_grid_definition_template_1.py | 15 ++++ .../test_grid_definition_template_10.py | 11 +++ .../test_grid_definition_template_12.py | 11 +++ .../test_grid_definition_template_140.py | 11 +++ .../test_grid_definition_template_20.py | 11 +++ .../test_grid_definition_template_30.py | 11 +++ .../test_grid_definition_template_4.py | 10 +++ .../test_grid_definition_template_5.py | 15 ++++ 12 files changed, 170 insertions(+), 31 deletions(-) diff --git a/docs/ref/release_notes.rst b/docs/ref/release_notes.rst index 9817786c..f3ae02c9 100644 --- a/docs/ref/release_notes.rst +++ b/docs/ref/release_notes.rst @@ -17,6 +17,10 @@ Features * `@MoseleyS `_ added support for loading GRIB2 data found in the Met Office wholesale Weather Data Hub and CEDA archive. `(PR#647) `_ +* `@andrewgryan `_ and + `@trexfeathers `_ added saving support for + Earth shape 6 - fixed radius 6,371,229 m. + `(PR#712) `_ New Contributors @@ -24,6 +28,7 @@ New Contributors Welcome to * `@MoseleyS `_ +* `@andrewgryan `_ What's new in iris-grib v0.20.0 diff --git a/src/iris_grib/_save_rules.py b/src/iris_grib/_save_rules.py index 8695ca0c..a533b03b 100644 --- a/src/iris_grib/_save_rules.py +++ b/src/iris_grib/_save_rules.py @@ -131,15 +131,38 @@ def shape_of_the_earth(cube, grib): # assume latlon cs = cube.coord(dimensions=[0]).coord_system + def _set_octets( + earth_shape: int | None = None, + radius_scale_factor: int | None = None, + radius_scaled_value: int | None = None, + major_scale_factor: int | None = None, + major_scaled_value: int | None = None, + minor_scale_factor: int | None = None, + minor_scaled_value: int | None = None, + ): + key_map = { + "shapeOfTheEarth": earth_shape, + "scaleFactorOfRadiusOfSphericalEarth": radius_scale_factor, + "scaledValueOfRadiusOfSphericalEarth": radius_scaled_value, + "scaleFactorOfEarthMajorAxis": major_scale_factor, + "scaledValueOfEarthMajorAxis": major_scaled_value, + "scaleFactorOfEarthMinorAxis": minor_scale_factor, + "scaledValueOfEarthMinorAxis": minor_scaled_value, + } + for key, value in key_map.items(): + if value is not None: + eccodes.codes_set_long(grib, key, value) + # Initially set shape_of_earth keys to missing (255 for byte). - eccodes.codes_set_long(grib, "scaleFactorOfRadiusOfSphericalEarth", 255) - eccodes.codes_set_long( - grib, "scaledValueOfRadiusOfSphericalEarth", GRIB_MISSING_LONG + _set_octets( + earth_shape=None, + radius_scale_factor=255, + radius_scaled_value=GRIB_MISSING_LONG, + major_scale_factor=255, + major_scaled_value=GRIB_MISSING_LONG, + minor_scale_factor=255, + minor_scaled_value=GRIB_MISSING_LONG, ) - eccodes.codes_set_long(grib, "scaleFactorOfEarthMajorAxis", 255) - eccodes.codes_set_long(grib, "scaledValueOfEarthMajorAxis", GRIB_MISSING_LONG) - eccodes.codes_set_long(grib, "scaleFactorOfEarthMinorAxis", 255) - eccodes.codes_set_long(grib, "scaledValueOfEarthMinorAxis", GRIB_MISSING_LONG) if isinstance(cs, GeogCS): ellipsoid = cs @@ -154,25 +177,36 @@ def shape_of_the_earth(cube, grib): # Spherical earth. if ellipsoid.inverse_flattening == 0.0: - eccodes.codes_set_long(grib, "shapeOfTheEarth", 1) - eccodes.codes_set_long(grib, "scaleFactorOfRadiusOfSphericalEarth", 0) - eccodes.codes_set_long( - grib, "scaledValueOfRadiusOfSphericalEarth", ellipsoid.semi_major_axis - ) - eccodes.codes_set_long(grib, "scaleFactorOfEarthMajorAxis", 0) - eccodes.codes_set_long(grib, "scaledValueOfEarthMajorAxis", 0) - eccodes.codes_set_long(grib, "scaleFactorOfEarthMinorAxis", 0) - eccodes.codes_set_long(grib, "scaledValueOfEarthMinorAxis", 0) + if ellipsoid.semi_major_axis == 6371229.0: + # Fixed defined radius. + _set_octets( + earth_shape=6, + radius_scale_factor=0, + radius_scaled_value=0, + major_scale_factor=0, + major_scaled_value=0, + minor_scale_factor=0, + minor_scaled_value=0, + ) + else: + # Specified radius. + _set_octets( + earth_shape=1, + radius_scale_factor=0, + radius_scaled_value=ellipsoid.semi_major_axis, + major_scale_factor=0, + major_scaled_value=0, + minor_scale_factor=0, + minor_scaled_value=0, + ) # Oblate spheroid earth. else: - eccodes.codes_set_long(grib, "shapeOfTheEarth", 7) - eccodes.codes_set_long(grib, "scaleFactorOfEarthMajorAxis", 0) - eccodes.codes_set_long( - grib, "scaledValueOfEarthMajorAxis", ellipsoid.semi_major_axis - ) - eccodes.codes_set_long(grib, "scaleFactorOfEarthMinorAxis", 0) - eccodes.codes_set_long( - grib, "scaledValueOfEarthMinorAxis", ellipsoid.semi_minor_axis + _set_octets( + earth_shape=7, + major_scale_factor=0, + major_scaled_value=ellipsoid.semi_major_axis, + minor_scale_factor=0, + minor_scaled_value=ellipsoid.semi_minor_axis, ) diff --git a/src/iris_grib/tests/integration/round_trip/test_grid_definition_section.py b/src/iris_grib/tests/integration/round_trip/test_grid_definition_section.py index 0b885bff..124accd4 100644 --- a/src/iris_grib/tests/integration/round_trip/test_grid_definition_section.py +++ b/src/iris_grib/tests/integration/round_trip/test_grid_definition_section.py @@ -19,7 +19,6 @@ from iris.coord_systems import GeogCS, PolarStereographic, RotatedGeogCS, Stereographic from iris.coords import DimCoord from iris.cube import Cube -from iris.fileformats.pp import EARTH_RADIUS as UM_DEFAULT_EARTH_RADIUS from iris.util import is_regular from iris_grib.grib_phenom_translation import GRIBCode @@ -52,12 +51,8 @@ def test_save_load(self): (3, "gridDefinitionTemplateNumber", 5), (3, "Ni", cube.shape[-1]), (3, "Nj", cube.shape[-2]), - (3, "shapeOfTheEarth", 1), - ( - 3, - "scaledValueOfRadiusOfSphericalEarth", - int(UM_DEFAULT_EARTH_RADIUS), - ), + (3, "shapeOfTheEarth", 6), + (3, "scaledValueOfRadiusOfSphericalEarth", 0), (3, "resolutionAndComponentFlags", 0), (3, "latitudeOfSouthernPole", -37500000), (3, "longitudeOfSouthernPole", 357500000), diff --git a/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_0.py b/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_0.py index 24921e52..af9be1d1 100644 --- a/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_0.py +++ b/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_0.py @@ -45,6 +45,16 @@ def test__shape_of_earth_flattened(self): self._check_key("scaleFactorOfEarthMinorAxis", 0) self._check_key("scaledValueOfEarthMinorAxis", 1.123) + def test__shape_of_earth_fixed_6(self): + cs = GeogCS(semi_major_axis=6371229) + test_cube = self._make_test_cube(cs=cs) + grid_definition_template_0(test_cube, self.mock_grib) + self._check_key("shapeOfTheEarth", 6) + self._check_key("scaleFactorOfEarthMajorAxis", 0) + self._check_key("scaledValueOfEarthMajorAxis", 0) + self._check_key("scaleFactorOfEarthMinorAxis", 0) + self._check_key("scaledValueOfEarthMinorAxis", 0) + def test__grid_shape(self): test_cube = self._make_test_cube(x_points=np.arange(13), y_points=np.arange(6)) grid_definition_template_0(test_cube, self.mock_grib) diff --git a/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_1.py b/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_1.py index 7d87cd85..e24c9c9f 100644 --- a/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_1.py +++ b/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_1.py @@ -67,6 +67,21 @@ def test__shape_of_earth_flattened(self): self._check_key("scaleFactorOfEarthMinorAxis", 0) self._check_key("scaledValueOfEarthMinorAxis", 1.123) + def test__shape_of_earth_fixed_6(self): + ellipsoid = GeogCS(semi_major_axis=6371229) + cs = RotatedGeogCS( + grid_north_pole_latitude=90.0, + grid_north_pole_longitude=0.0, + ellipsoid=ellipsoid, + ) + test_cube = self._make_test_cube(cs=cs) + grid_definition_template_1(test_cube, self.mock_grib) + self._check_key("shapeOfTheEarth", 6) + self._check_key("scaleFactorOfEarthMajorAxis", 0) + self._check_key("scaledValueOfEarthMajorAxis", 0) + self._check_key("scaleFactorOfEarthMinorAxis", 0) + self._check_key("scaledValueOfEarthMinorAxis", 0) + def test__grid_shape(self): test_cube = self._make_test_cube(x_points=np.arange(13), y_points=np.arange(6)) grid_definition_template_1(test_cube, self.mock_grib) diff --git a/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py b/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py index 20488a1f..cb2be94e 100644 --- a/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py +++ b/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py @@ -42,6 +42,17 @@ def test__shape_of_earth(self): self._check_key("scaleFactorOfEarthMinorAxis", 0) self._check_key("scaledValueOfEarthMinorAxis", 0) + def test__shape_of_earth_fixed_6(self): + cs = self._default_coord_system() + cs.ellipsoid = GeogCS(semi_major_axis=6371229) + test_cube = self._make_test_cube(cs=cs, coord_units="m") + grid_definition_template_10(test_cube, self.mock_grib) + self._check_key("shapeOfTheEarth", 6) + self._check_key("scaleFactorOfEarthMajorAxis", 0) + self._check_key("scaledValueOfEarthMajorAxis", 0) + self._check_key("scaleFactorOfEarthMinorAxis", 0) + self._check_key("scaledValueOfEarthMinorAxis", 0) + def test__grid_shape(self): n_x_points = 13 n_y_points = 6 diff --git a/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_12.py b/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_12.py index 3b438b1b..ce5f78a4 100644 --- a/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_12.py +++ b/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_12.py @@ -77,6 +77,17 @@ def test__shape_of_earth(self): self._check_key("scaleFactorOfEarthMinorAxis", 0) self._check_key("scaledValueOfEarthMinorAxis", 6356256.909) + def test__shape_of_earth_fixed_6(self): + cs = self._default_coord_system() + cs.ellipsoid = GeogCS(semi_major_axis=6371229) + test_cube = self._make_test_cube(cs=cs) + grid_definition_template_12(test_cube, self.mock_grib) + self._check_key("shapeOfTheEarth", 6) + self._check_key("scaleFactorOfEarthMajorAxis", 0) + self._check_key("scaledValueOfEarthMajorAxis", 0) + self._check_key("scaleFactorOfEarthMinorAxis", 0) + self._check_key("scaledValueOfEarthMinorAxis", 0) + def test__grid_shape(self): test_cube = self._make_test_cube(x_points=np.arange(13), y_points=np.arange(6)) grid_definition_template_12(test_cube, self.mock_grib) diff --git a/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_140.py b/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_140.py index 878d2f16..8ffaa57c 100644 --- a/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_140.py +++ b/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_140.py @@ -77,6 +77,17 @@ def test__shape_of_earth(self): self._check_key("scaleFactorOfEarthMinorAxis", 0) self._check_key("scaledValueOfEarthMinorAxis", 6356256.909) + def test__shape_of_earth_fixed_6(self): + cs = self._default_coord_system() + cs.ellipsoid = GeogCS(semi_major_axis=6371229) + test_cube = self._make_test_cube(cs=cs) + grid_definition_template(test_cube, self.mock_grib) + self._check_key("shapeOfTheEarth", 6) + self._check_key("scaleFactorOfEarthMajorAxis", 0) + self._check_key("scaledValueOfEarthMajorAxis", 0) + self._check_key("scaleFactorOfEarthMinorAxis", 0) + self._check_key("scaledValueOfEarthMinorAxis", 0) + def test__grid_shape(self): test_cube = self._make_test_cube(x_points=np.arange(13), y_points=np.arange(6)) grid_definition_template(test_cube, self.mock_grib) diff --git a/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_20.py b/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_20.py index 7907f8c7..535338b8 100644 --- a/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_20.py +++ b/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_20.py @@ -49,6 +49,17 @@ def test__shape_of_earth(self): self._check_key("scaleFactorOfEarthMinorAxis", 0) self._check_key("scaledValueOfEarthMinorAxis", 0) + def test__shape_of_earth_fixed_6(self): + cs = self._default_coord_system() + cs.ellipsoid = GeogCS(semi_major_axis=6371229) + test_cube = self._make_test_cube(cs=cs, coord_units="m") + grid_definition_template_20(test_cube, self.mock_grib) + self._check_key("shapeOfTheEarth", 6) + self._check_key("scaleFactorOfEarthMajorAxis", 0) + self._check_key("scaledValueOfEarthMajorAxis", 0) + self._check_key("scaleFactorOfEarthMinorAxis", 0) + self._check_key("scaledValueOfEarthMinorAxis", 0) + def test__grid_shape(self): stereo_test_cube = self._make_test_cube( x_points=np.arange(13), y_points=np.arange(6), coord_units="m" diff --git a/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_30.py b/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_30.py index fb182904..993db0f0 100644 --- a/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_30.py +++ b/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_30.py @@ -76,6 +76,17 @@ def test__shape_of_earth(self): self._check_key("scaleFactorOfEarthMinorAxis", 0) self._check_key("scaledValueOfEarthMinorAxis", 6356256.909) + def test__shape_of_earth_fixed_6(self): + cs = self._default_coord_system() + cs.ellipsoid = GeogCS(semi_major_axis=6371229) + test_cube = self._make_test_cube(cs=cs) + grid_definition_template_30(test_cube, self.mock_grib) + self._check_key("shapeOfTheEarth", 6) + self._check_key("scaleFactorOfEarthMajorAxis", 0) + self._check_key("scaledValueOfEarthMajorAxis", 0) + self._check_key("scaleFactorOfEarthMinorAxis", 0) + self._check_key("scaledValueOfEarthMinorAxis", 0) + def test__grid_shape(self): test_cube = self._make_test_cube(x_points=np.arange(13), y_points=np.arange(6)) grid_definition_template_30(test_cube, self.mock_grib) diff --git a/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_4.py b/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_4.py index d24604e9..14ded96a 100644 --- a/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_4.py +++ b/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_4.py @@ -45,6 +45,16 @@ def test__shape_of_earth_flattened(self): self._check_key("scaleFactorOfEarthMinorAxis", 0) self._check_key("scaledValueOfEarthMinorAxis", 1.123) + def test__shape_of_earth_fixed_6(self): + cs = GeogCS(semi_major_axis=6371229) + test_cube = self._make_test_cube(cs=cs) + grid_definition_template_4(test_cube, self.mock_grib) + self._check_key("shapeOfTheEarth", 6) + self._check_key("scaleFactorOfEarthMajorAxis", 0) + self._check_key("scaledValueOfEarthMajorAxis", 0) + self._check_key("scaleFactorOfEarthMinorAxis", 0) + self._check_key("scaledValueOfEarthMinorAxis", 0) + def test__grid_shape(self): test_cube = self._make_test_cube(x_points=np.arange(13), y_points=np.arange(6)) grid_definition_template_4(test_cube, self.mock_grib) diff --git a/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_5.py b/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_5.py index aa19a7fc..62831030 100644 --- a/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_5.py +++ b/src/iris_grib/tests/unit/save_rules/test_grid_definition_template_5.py @@ -70,6 +70,21 @@ def test__shape_of_earth_flattened(self): self._check_key("scaleFactorOfEarthMinorAxis", 0) self._check_key("scaledValueOfEarthMinorAxis", 1123.0) + def test__shape_of_earth_fixed_6(self): + ellipsoid = GeogCS(semi_major_axis=6371229) + cs = RotatedGeogCS( + grid_north_pole_latitude=90.0, + grid_north_pole_longitude=0.0, + ellipsoid=ellipsoid, + ) + test_cube = self._make_test_cube(cs=cs) + grid_definition_template_5(test_cube, self.mock_grib) + self._check_key("shapeOfTheEarth", 6) + self._check_key("scaleFactorOfEarthMajorAxis", 0) + self._check_key("scaledValueOfEarthMajorAxis", 0) + self._check_key("scaleFactorOfEarthMinorAxis", 0) + self._check_key("scaledValueOfEarthMinorAxis", 0) + def test__grid_shape(self): test_cube = self._make_test_cube(x_points=np.arange(13), y_points=np.arange(6)) grid_definition_template_5(test_cube, self.mock_grib) From f05478ae96bdc0f3066b99daaa77d53f4d47a539 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 1 Dec 2025 13:17:14 +0000 Subject: [PATCH 520/583] Updated environment lockfiles (#733) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 95 +++++++++++++------------- requirements/locks/py311-linux-64.lock | 95 +++++++++++++------------- requirements/locks/py312-linux-64.lock | 95 +++++++++++++------------- 3 files changed, 141 insertions(+), 144 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 1265f308..5a474557 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -6,27 +6,26 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.ta https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.conda#05e00f3b21e88bb3d658ac700b2ce58c https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda#f0991f0f84902f6b6009b4d2350a83aa -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-bootstrap_ha15bf96_3.conda#3036ca5b895b7f5146c5a25486234a68 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda#f7b4d76975aac7e5d9e6ad13845f92fe +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_14.conda#91349c276f84f590487e4c7f6e90e077 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda#c0374badb3a5d4b1372db28d19462c53 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_14.conda#550dceb769d23bcf0e2f97fd4062d720 https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda#791365c5f65975051e4e017b5da3abf5 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda#51a19bba1b8ebfb60df25cde030b7ebc https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 -https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-h09219d5_0.conda#9b3117ec960b823815b02190b41c0484 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda#72c8fd1af66bd67bf580645b426513ed https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda#6c77a605a7a689d17d4819c0f8ac9a00 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda#8b09ae86839581147ef2e5c5e229d164 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda#35f29eec58405aaf55e01cb470d8c26a -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda#280ea6eee9e2ddefde25ff799c4f0363 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-hcd61629_7.conda#f116940d825ffc9104400f0d7f1a4551 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_14.conda#6c13aaae36d7514f28bd5544da1a7bb8 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_14.conda#3078a2a9a58566a54e579b41b9e88c84 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda#8397539e3a0bbd1695584fb4f927485a https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda#5b767048b1b3ee9a954b06f4084f93dc +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_14.conda#8e96fe9b17d5871b5cf9d312cab832f6 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda#80c07c68d2f6870250959dcc95b209d1 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 @@ -40,61 +39,56 @@ https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.1-h480dda7_0.conda#4d4efd0645cd556fab54617c4ad477ef https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.4-h3f801dc_0.conda#01ba04e414e47f95c03d6ddd81fd37be -https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hd53d788_0.conda#c183787d2b228775dece45842abbbe53 -https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-h02bd7ab_0.conda#b7a924e3e9ebc7938ffc7d94fe603ed3 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda#366b40a69f0ad6072561c1d09301c886 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda#4ffbb341c8b616aa2494b6afb26a0c5f https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_7.conda#8621a450add4e231f676646880703f49 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_14.conda#fa9d91abc5a9db36fa8dcd1b9a602e61 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.51-h421ea60_0.conda#d8b81203d08435eb999baa249427884e +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.1-h0c1763c_0.conda#2e1b84d273b01835256e53fd938de355 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda#f627678cf829bd70bccf141a19c3ad3e +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_14.conda#9531f671a13eec0597941fa19e489b96 https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc +https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-hf2a90c1_0.conda#23720d17346b21efb08d68c2255c8431 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda#98b6c9dc80eb87b2519b97bcf7e578dd https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda#86bc20552bf46075e3d92b67f089172d https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 -https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.2.5-hde8ca8f_0.conda#1920c3502e7f6688d650ab81cd3775fd +https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.1-hde8ca8f_0.conda#49c832bff803d95a56190e7992b4b230 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d -https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hf2c8021_0.conda#5304333319a6124a2737d9f128cbc4ed +https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda#af39b9a8711d4a8d437b52c1d78eb6a1 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 -https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda#a6abd2796fc332536735f68ba23f7901 https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda#8e7251989bca326a28f4a5ffbd74557a https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda#b499ce4b026493a13774bcf0f4c33849 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda#be43915efc66345cccb3c310b6ed0374 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#cd5a90476766d53e901500df9215e927 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-h031cc0b_0.conda#a67cd8f7b0369bbf2c40411f05a62f3b https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.51.1-hbc0de68_0.conda#968f50847d17c74a428fc47a2c70fd6f https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 -https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-h41a2e66_0.conda#4ddfd44e473c676cb8e80548ba4aa704 +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda#8ccf913aaba749a5496c17629d859ed1 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-1_h4a7cf45_openblas.conda#8b39e1ae950f1b54a3959c58ca2c32b8 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-2_h4a7cf45_openblas.conda#6146bf1b7f58113d54614c6ec683c14a https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda#01e149d4a53185622dc2e788281961f2 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda#f4084e4e6577797150f9b04a4560ceb0 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.0-hee844dc_0.conda#729a572a3ebb8c43933b30edcc628ceb -https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-ha9997c6_0.conda#e7733bc6785ec009e47a224a71917e84 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd +https://conda.anaconda.org/conda-forge/linux-64/python-3.10.19-h3c07f61_2_cpython.conda#27ac896a8b4970f8977503a9e70dc745 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda#4afc585cd97ba8a23809406cd8a9eda8 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda#c74d83614aec66227ae5199d98852aaf -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-1_h0358290_openblas.conda#a670bff9eb7963ea41b4e09a4e4ab608 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-1_h47877c9_openblas.conda#dee12a83aa4aca5077ea23c0605de044 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-h26afc86_0.conda#e512be7dc1f84966d50959e900ca121f -https://conda.anaconda.org/conda-forge/linux-64/python-3.10.19-h3c07f61_2_cpython.conda#27ac896a8b4970f8977503a9e70dc745 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.51.0-heff268d_0.conda#5422f0e1b59d2aa29329d5b3e36d57e5 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda#8f37c8fb7116a18da04e52fa9e2c8df9 https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda#c7944d55af26b6d2d7629e27e9a972c1 -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py310h8cfb67f_0.conda#12f24867bc0ec4e15c89cdff988c500e +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py310hba01987_1.conda#393fca4557fbd2c4d995dcb89f569048 https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.2-pyhd8ed1ab_0.conda#9c265afcec13eb6e844ae51b4a4b52ad https://conda.anaconda.org/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda#96a02a5c1a65470a7e4eedb644c872fd https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 @@ -109,8 +103,9 @@ https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#0 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda#66b8b26023b8efdf8fcb23bac4b6325d https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 -https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda#4afc585cd97ba8a23809406cd8a9eda8 https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.10.0-pyhd8ed1ab_0.conda#d18004c37182f83b9818b714825a7627 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda#c74d83614aec66227ae5199d98852aaf https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/humanize-4.14.0-pyhd8ed1ab_0.conda#8b8884a6375830fe0cfb806ccbbd755c https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac @@ -119,20 +114,20 @@ https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.b https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda#9614359868482abba1bd15ce465e3c42 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py310haaf941d_2.conda#7426d76535fc6347f1b74f85fb17d6eb -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.3-nompi_h11f7409_103.conda#3ccff1066c05a1e6c221356eecc40581 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-2_h0358290_openblas.conda#a84b2b7ed34206d14739fb8d29cd2799 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-2_h47877c9_openblas.conda#9fb20e74a7436dc94dd39d9a9decddc3 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py310h3406613_0.conda#8854df4fb4e37cc3ea0a024e48c9c180 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.6-py310hefbff90_0.conda#b0cea2c364bf65cd19e023040eeab05d https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 -https://conda.anaconda.org/conda-forge/linux-64/pillow-12.0.0-py310h80abafc_0.conda#e2d1355dfb9abda97d19e9c2170f5443 +https://conda.anaconda.org/conda-forge/linux-64/pillow-12.0.0-py310h5a73078_2.conda#b258053ab882158e39c6f8aff00b4c37 https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda#5c7a868f8241e64e1cf5fdf4962f23e2 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h18fbb6c_2.conda#1aeede769ec2fa0f474f8b73a7ac057f https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.5-pyhcf101f3_0.conda#6c8979be6d7a17692793114fa26916e8 -https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.2-pyhd8ed1ab_0.conda#3751072ac0bd677416696063872078f1 +https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.3-pyhd8ed1ab_0.conda#c138c7aaa6a10b5762dcd92247864aff https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.6.0-py310hf3bd8b6_1.conda#a49d7089a9d44aa209f970fc0e5abd1c https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 @@ -147,57 +142,61 @@ https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda#c07 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.0-py310h7c4b9e2_1.conda#b1ccdb989be682ab0dd430c1c15d5012 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py310he7384ee_1.conda#803e2d778b8dcccdc014127ec5001681 -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310hf779ad0_2.conda#30167b9702fd4a46cd4a98e74c9840d8 -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py310h3788b33_0.conda#b6420d29123c7c823de168f49ccdfe6a https://conda.anaconda.org/conda-forge/linux-64/coverage-7.12.0-py310h3406613_0.conda#b42800b0d20b57c92087052b21ab2013 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.60.1-py310h3406613_0.conda#ac183a1fd0cbebd32a20a2aeaf8dc01d +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda#8e662bd460bda79b1ea39194e3c4c9ab +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.61.0-py310h3406613_0.conda#4b2ad208fec1e850ba82a0a17534d3d5 +https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda#4b69232755285701bc86a5afe4d9933a https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a04073db11c2c86c555fb088acc8f8c1 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 -https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py310hf779ad0_2.conda#4906d8c3680f6c1273ad5a5775807867 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.3-nompi_h11f7409_103.conda#3ccff1066c05a1e6c221356eecc40581 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.6-py310hefbff90_0.conda#b0cea2c364bf65cd19e023040eeab05d https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/noarch/pip-25.3-pyh8b19718_0.conda#c55515ca43c6444d2572e0f0d93cb6b9 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py310h71d0299_1.conda#e54b1eaeb50ad1767680181a8575a8db https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.conda#8c29cd33b64b2eb78597fa28b5595c8d -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py310hc8bbb35_2.conda#0937b0e88a24c82e02d5b714acc9957c https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.35.4-pyhd8ed1ab_0.conda#cfccfd4e8d9de82ed75c8e2c91cab375 https://conda.anaconda.org/conda-forge/noarch/anyio-4.11.0-pyhcf101f3_0.conda#814472b61da9792fae28156cb9ee54f5 -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py310hf779ad0_1.conda#5e4aea6b728177b53e8a216922ebd6a2 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.44.0-h83bc92c_0.conda#2d37fd4ccfd98453a02a278e4112da39 +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310hf779ad0_2.conda#30167b9702fd4a46cd4a98e74c9840d8 +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py310h3788b33_0.conda#b6420d29123c7c823de168f49ccdfe6a https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.7.0-h40b2b14_1.conda#8a77895fb29728b736a1a6c75906ea1a -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py310hfde16b3_0.conda#093b60a14d2c0d8c10f17e14a73a60d3 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.3-nompi_py310he90c06d_100.conda#e1a3c6a1e8ceec1fe91a3660b97a43b6 +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a04073db11c2c86c555fb088acc8f8c1 +https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py310hf779ad0_2.conda#4906d8c3680f6c1273ad5a5775807867 https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.1-pyhcf101f3_0.conda#fa7f71faa234947d9c520f89b4bda1a2 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.conda#8c29cd33b64b2eb78597fa28b5595c8d https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0.conda#e2e4d7094d0580ccd62e2a41947444f3 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py310hc8bbb35_2.conda#0937b0e88a24c82e02d5b714acc9957c https://conda.anaconda.org/conda-forge/noarch/tox-4.32.0-pyhcf101f3_0.conda#1b49a3b817df5c88742219c4d6e5ee57 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310h03d9f68_6.conda#34778c3f9a6ea19610e7e340dc2caaab https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py310h139afa4_1.conda#3741aefc198dfed2e3c9adc79d706bb7 -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py310h0158d43_1.conda#871b5f746960f99ac23dbc73d14e2ad0 +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py310hf779ad0_1.conda#5e4aea6b728177b53e8a216922ebd6a2 https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.44.0-h83bc92c_0.conda#2d37fd4ccfd98453a02a278e4112da39 https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb https://conda.anaconda.org/conda-forge/noarch/identify-2.6.15-pyhd8ed1ab_0.conda#25f954b7dae6dd7b0dc004dab74f1ce9 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py310hfde16b3_0.conda#093b60a14d2c0d8c10f17e14a73a60d3 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.3-nompi_py310he90c06d_100.conda#e1a3c6a1e8ceec1fe91a3660b97a43b6 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda#6891acad5e136cb62a8c2ed2679d6528 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.44.0-py310hf779ad0_1.conda#fd8c4f1cebd49ffbea2d817dc56eb4cd https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py310h0158d43_1.conda#871b5f746960f99ac23dbc73d14e2ad0 https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 -https://conda.anaconda.org/conda-forge/noarch/iris-3.11.1-pyha770c72_1.conda#f501583062225a070455d011d81b07bf -https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.4.0-pyha770c72_0.conda#c130573bb7a166e93d5bd01c94ae38e1 +https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.0-pyha770c72_0.conda#af8d4882203bccefec6f1aeed70030c6 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.44.0-py310hf779ad0_1.conda#fd8c4f1cebd49ffbea2d817dc56eb4cd https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 +https://conda.anaconda.org/conda-forge/noarch/iris-3.11.1-pyha770c72_1.conda#f501583062225a070455d011d81b07bf https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2025.11.20-pyhd8ed1ab_0.conda#1285738dad946d2c508ccfb83b866970 https://conda.anaconda.org/conda-forge/noarch/nox-2025.11.12-pyhcf101f3_0.conda#ae74047e4fe04ff7760d9529c49b7475 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 35f45386..48539d9b 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -6,27 +6,26 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.ta https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda#8fcb6b0e2161850556231336dae58358 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda#f0991f0f84902f6b6009b4d2350a83aa -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-bootstrap_ha15bf96_3.conda#3036ca5b895b7f5146c5a25486234a68 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda#f7b4d76975aac7e5d9e6ad13845f92fe +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_14.conda#91349c276f84f590487e4c7f6e90e077 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda#c0374badb3a5d4b1372db28d19462c53 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_14.conda#550dceb769d23bcf0e2f97fd4062d720 https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda#791365c5f65975051e4e017b5da3abf5 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda#51a19bba1b8ebfb60df25cde030b7ebc https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 -https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-h09219d5_0.conda#9b3117ec960b823815b02190b41c0484 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda#72c8fd1af66bd67bf580645b426513ed https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda#6c77a605a7a689d17d4819c0f8ac9a00 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda#8b09ae86839581147ef2e5c5e229d164 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda#35f29eec58405aaf55e01cb470d8c26a -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda#280ea6eee9e2ddefde25ff799c4f0363 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-hcd61629_7.conda#f116940d825ffc9104400f0d7f1a4551 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_14.conda#6c13aaae36d7514f28bd5544da1a7bb8 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_14.conda#3078a2a9a58566a54e579b41b9e88c84 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda#8397539e3a0bbd1695584fb4f927485a https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda#5b767048b1b3ee9a954b06f4084f93dc +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_14.conda#8e96fe9b17d5871b5cf9d312cab832f6 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda#80c07c68d2f6870250959dcc95b209d1 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 @@ -40,61 +39,56 @@ https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.1-h480dda7_0.conda#4d4efd0645cd556fab54617c4ad477ef https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.4-h3f801dc_0.conda#01ba04e414e47f95c03d6ddd81fd37be -https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hd53d788_0.conda#c183787d2b228775dece45842abbbe53 -https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-h02bd7ab_0.conda#b7a924e3e9ebc7938ffc7d94fe603ed3 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda#366b40a69f0ad6072561c1d09301c886 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda#4ffbb341c8b616aa2494b6afb26a0c5f https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_7.conda#8621a450add4e231f676646880703f49 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_14.conda#fa9d91abc5a9db36fa8dcd1b9a602e61 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.51-h421ea60_0.conda#d8b81203d08435eb999baa249427884e +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.1-h0c1763c_0.conda#2e1b84d273b01835256e53fd938de355 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda#f627678cf829bd70bccf141a19c3ad3e +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_14.conda#9531f671a13eec0597941fa19e489b96 https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc +https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-hf2a90c1_0.conda#23720d17346b21efb08d68c2255c8431 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda#98b6c9dc80eb87b2519b97bcf7e578dd https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda#86bc20552bf46075e3d92b67f089172d https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 -https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.2.5-hde8ca8f_0.conda#1920c3502e7f6688d650ab81cd3775fd +https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.1-hde8ca8f_0.conda#49c832bff803d95a56190e7992b4b230 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d -https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hf2c8021_0.conda#5304333319a6124a2737d9f128cbc4ed +https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda#af39b9a8711d4a8d437b52c1d78eb6a1 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 -https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda#a6abd2796fc332536735f68ba23f7901 https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda#8e7251989bca326a28f4a5ffbd74557a https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda#b499ce4b026493a13774bcf0f4c33849 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda#be43915efc66345cccb3c310b6ed0374 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#cd5a90476766d53e901500df9215e927 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-h031cc0b_0.conda#a67cd8f7b0369bbf2c40411f05a62f3b https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.51.1-hbc0de68_0.conda#968f50847d17c74a428fc47a2c70fd6f https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 -https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-h41a2e66_0.conda#4ddfd44e473c676cb8e80548ba4aa704 +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda#8ccf913aaba749a5496c17629d859ed1 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-1_h4a7cf45_openblas.conda#8b39e1ae950f1b54a3959c58ca2c32b8 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-2_h4a7cf45_openblas.conda#6146bf1b7f58113d54614c6ec683c14a https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda#01e149d4a53185622dc2e788281961f2 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda#f4084e4e6577797150f9b04a4560ceb0 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.0-hee844dc_0.conda#729a572a3ebb8c43933b30edcc628ceb -https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-ha9997c6_0.conda#e7733bc6785ec009e47a224a71917e84 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd +https://conda.anaconda.org/conda-forge/linux-64/python-3.11.14-hd63d673_2_cpython.conda#c4202a55b4486314fbb8c11bc43a29a0 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda#4afc585cd97ba8a23809406cd8a9eda8 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda#c74d83614aec66227ae5199d98852aaf -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-1_h0358290_openblas.conda#a670bff9eb7963ea41b4e09a4e4ab608 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-1_h47877c9_openblas.conda#dee12a83aa4aca5077ea23c0605de044 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-h26afc86_0.conda#e512be7dc1f84966d50959e900ca121f -https://conda.anaconda.org/conda-forge/linux-64/python-3.11.14-hd63d673_2_cpython.conda#c4202a55b4486314fbb8c11bc43a29a0 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.51.0-heff268d_0.conda#5422f0e1b59d2aa29329d5b3e36d57e5 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda#8f37c8fb7116a18da04e52fa9e2c8df9 https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda#c7944d55af26b6d2d7629e27e9a972c1 -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py311h7c6b74e_0.conda#645bc783bc723d67a294a51bc860762d +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py311h66f275b_1.conda#86daecb8e4ed1042d5dc6efbe0152590 https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.2-pyhd8ed1ab_0.conda#9c265afcec13eb6e844ae51b4a4b52ad https://conda.anaconda.org/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda#96a02a5c1a65470a7e4eedb644c872fd https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 @@ -109,8 +103,9 @@ https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#0 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda#66b8b26023b8efdf8fcb23bac4b6325d https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 -https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda#4afc585cd97ba8a23809406cd8a9eda8 https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.10.0-pyhd8ed1ab_0.conda#d18004c37182f83b9818b714825a7627 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda#c74d83614aec66227ae5199d98852aaf https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/humanize-4.14.0-pyhd8ed1ab_0.conda#8b8884a6375830fe0cfb806ccbbd755c https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac @@ -119,20 +114,20 @@ https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.b https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda#9614359868482abba1bd15ce465e3c42 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py311h724c32c_2.conda#4089f739463c798e10d8644bc34e24de -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.3-nompi_h11f7409_103.conda#3ccff1066c05a1e6c221356eecc40581 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-2_h0358290_openblas.conda#a84b2b7ed34206d14739fb8d29cd2799 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-2_h47877c9_openblas.conda#9fb20e74a7436dc94dd39d9a9decddc3 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py311h3778330_0.conda#0954f1a6a26df4a510b54f73b2a0345c https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.5-py311h2e04523_0.conda#01da92ddaf561cabebd06019ae521510 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 -https://conda.anaconda.org/conda-forge/linux-64/pillow-12.0.0-py311h07c5bb8_0.conda#51f505a537b2d216a1b36b823df80995 +https://conda.anaconda.org/conda-forge/linux-64/pillow-12.0.0-py311hf88fc01_2.conda#79edb22fb652ee142099df18042ca8c0 https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda#5c7a868f8241e64e1cf5fdf4962f23e2 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 https://conda.anaconda.org/conda-forge/linux-64/proj-9.7.0-hb72c0af_0.conda#438e75abf4d8c9c1d9e483b6c3f36282 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.5-pyhcf101f3_0.conda#6c8979be6d7a17692793114fa26916e8 -https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.2-pyhd8ed1ab_0.conda#3751072ac0bd677416696063872078f1 +https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.3-pyhd8ed1ab_0.conda#c138c7aaa6a10b5762dcd92247864aff https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.6.0-py311h041eb40_1.conda#9dcb9824894fb920414608447ccdf3ce https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 @@ -148,56 +143,60 @@ https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda#c07 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.0-py311h49ec1c0_1.conda#5e6d4026784e83c0a51c86ec428e8cc8 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py311h03d9500_1.conda#3912e4373de46adafd8f1e97e4bd166b -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h0372a8f_2.conda#c85f7b94f099fddb08358e0997dded95 -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py311hdf67eae_3.conda#c4e2f4d5193e55a70bb67a2aa07006ae https://conda.anaconda.org/conda-forge/linux-64/coverage-7.12.0-py311h3778330_0.conda#4ef5919a315f5c2834fc8da49044156d https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.60.1-py311h3778330_0.conda#91f834f85ac92978cfc3c1c178573e85 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda#8e662bd460bda79b1ea39194e3c4c9ab +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.61.0-py311h3778330_0.conda#f5ee391df23b7f50676ebe79fc53ee03 +https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda#4b69232755285701bc86a5afe4d9933a https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a04073db11c2c86c555fb088acc8f8c1 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 -https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py311h0372a8f_2.conda#487756753716efba090d06c71fb73eb6 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.3-nompi_h11f7409_103.conda#3ccff1066c05a1e6c221356eecc40581 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.5-py311h2e04523_0.conda#01da92ddaf561cabebd06019ae521510 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/noarch/pip-25.3-pyh8b19718_0.conda#c55515ca43c6444d2572e0f0d93cb6b9 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py311h4e6619b_2.conda#8092837339ae2e3697980df6686f996e https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.3-py311h1e13796_1.conda#e1947291b713cb0afa949e1bcda1f935 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py311h8a92878_2.conda#b37c338ff0f69883188c9b3b127be059 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.35.4-pyhd8ed1ab_0.conda#cfccfd4e8d9de82ed75c8e2c91cab375 https://conda.anaconda.org/conda-forge/noarch/anyio-4.11.0-pyhcf101f3_0.conda#814472b61da9792fae28156cb9ee54f5 -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py311h0372a8f_1.conda#ef8650a6059a907122d59a740207f50e +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h0372a8f_2.conda#c85f7b94f099fddb08358e0997dded95 +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py311hdf67eae_3.conda#c4e2f4d5193e55a70bb67a2aa07006ae https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.9.1-pyhcf101f3_0.conda#c49de33395d775a92ea90e0cb34c3577 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.44.0-h83bc92c_0.conda#2d37fd4ccfd98453a02a278e4112da39 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py311h0f3be63_0.conda#21a0139015232dc0edbf6c2179b5ec24 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py311h6623971_104.conda#fc6c31f2b2bd3fce50d5496ce30d04ff +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a04073db11c2c86c555fb088acc8f8c1 +https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py311h0372a8f_2.conda#487756753716efba090d06c71fb73eb6 https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.1-pyhcf101f3_0.conda#fa7f71faa234947d9c520f89b4bda1a2 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.3-py311h1e13796_1.conda#e1947291b713cb0afa949e1bcda1f935 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0.conda#e2e4d7094d0580ccd62e2a41947444f3 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py311h8a92878_2.conda#b37c338ff0f69883188c9b3b127be059 https://conda.anaconda.org/conda-forge/noarch/tox-4.32.0-pyhcf101f3_0.conda#1b49a3b817df5c88742219c4d6e5ee57 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hdf67eae_6.conda#57e703b0057f992687fb9ad154dc48e4 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py311haee01d2_1.conda#ca45bfd4871af957aaa5035593d5efd2 -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py311hed34c8f_1.conda#17c710c32010688086b28c088a8be579 +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py311h0372a8f_1.conda#ef8650a6059a907122d59a740207f50e +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.44.0-h83bc92c_0.conda#2d37fd4ccfd98453a02a278e4112da39 https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb https://conda.anaconda.org/conda-forge/noarch/identify-2.6.15-pyhd8ed1ab_0.conda#25f954b7dae6dd7b0dc004dab74f1ce9 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py311h0f3be63_0.conda#21a0139015232dc0edbf6c2179b5ec24 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py311h6623971_104.conda#fc6c31f2b2bd3fce50d5496ce30d04ff https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda#6891acad5e136cb62a8c2ed2679d6528 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.44.0-py311h0372a8f_1.conda#c5a5fef7f068abe2858a89ddf19e5a79 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py311hed34c8f_1.conda#17c710c32010688086b28c088a8be579 https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 -https://conda.anaconda.org/conda-forge/noarch/iris-3.14.0-pyha770c72_1.conda#d5bd40a6e2b471e0de7e4c5b4050b5a4 -https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.4.0-pyha770c72_0.conda#c130573bb7a166e93d5bd01c94ae38e1 +https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.0-pyha770c72_0.conda#af8d4882203bccefec6f1aeed70030c6 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.44.0-py311h0372a8f_1.conda#c5a5fef7f068abe2858a89ddf19e5a79 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 +https://conda.anaconda.org/conda-forge/noarch/iris-3.14.0-pyha770c72_1.conda#d5bd40a6e2b471e0de7e4c5b4050b5a4 https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2025.11.20-pyhd8ed1ab_0.conda#1285738dad946d2c508ccfb83b866970 https://conda.anaconda.org/conda-forge/noarch/nox-2025.11.12-pyhcf101f3_0.conda#ae74047e4fe04ff7760d9529c49b7475 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 6c11bdee..c5c14fe1 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -6,27 +6,26 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.ta https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda#c3efd25ac4d74b1584d2f7a57195ddf1 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda#f0991f0f84902f6b6009b4d2350a83aa -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-bootstrap_ha15bf96_3.conda#3036ca5b895b7f5146c5a25486234a68 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda#f7b4d76975aac7e5d9e6ad13845f92fe +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_14.conda#91349c276f84f590487e4c7f6e90e077 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda#c0374badb3a5d4b1372db28d19462c53 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_14.conda#550dceb769d23bcf0e2f97fd4062d720 https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda#791365c5f65975051e4e017b5da3abf5 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda#51a19bba1b8ebfb60df25cde030b7ebc https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 -https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-h09219d5_0.conda#9b3117ec960b823815b02190b41c0484 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda#72c8fd1af66bd67bf580645b426513ed https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda#6c77a605a7a689d17d4819c0f8ac9a00 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda#8b09ae86839581147ef2e5c5e229d164 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda#35f29eec58405aaf55e01cb470d8c26a -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda#280ea6eee9e2ddefde25ff799c4f0363 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-hcd61629_7.conda#f116940d825ffc9104400f0d7f1a4551 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_14.conda#6c13aaae36d7514f28bd5544da1a7bb8 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_14.conda#3078a2a9a58566a54e579b41b9e88c84 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda#8397539e3a0bbd1695584fb4f927485a https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda#5b767048b1b3ee9a954b06f4084f93dc +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_14.conda#8e96fe9b17d5871b5cf9d312cab832f6 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda#80c07c68d2f6870250959dcc95b209d1 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 @@ -40,61 +39,56 @@ https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.1-h480dda7_0.conda#4d4efd0645cd556fab54617c4ad477ef https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.4-h3f801dc_0.conda#01ba04e414e47f95c03d6ddd81fd37be -https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hd53d788_0.conda#c183787d2b228775dece45842abbbe53 -https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-h02bd7ab_0.conda#b7a924e3e9ebc7938ffc7d94fe603ed3 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda#366b40a69f0ad6072561c1d09301c886 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda#4ffbb341c8b616aa2494b6afb26a0c5f https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_7.conda#8621a450add4e231f676646880703f49 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_14.conda#fa9d91abc5a9db36fa8dcd1b9a602e61 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.51-h421ea60_0.conda#d8b81203d08435eb999baa249427884e +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.1-h0c1763c_0.conda#2e1b84d273b01835256e53fd938de355 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda#f627678cf829bd70bccf141a19c3ad3e +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_14.conda#9531f671a13eec0597941fa19e489b96 https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc +https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-hf2a90c1_0.conda#23720d17346b21efb08d68c2255c8431 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda#98b6c9dc80eb87b2519b97bcf7e578dd https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda#86bc20552bf46075e3d92b67f089172d https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 -https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.2.5-hde8ca8f_0.conda#1920c3502e7f6688d650ab81cd3775fd +https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.1-hde8ca8f_0.conda#49c832bff803d95a56190e7992b4b230 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d -https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hf2c8021_0.conda#5304333319a6124a2737d9f128cbc4ed +https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda#af39b9a8711d4a8d437b52c1d78eb6a1 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 -https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda#a6abd2796fc332536735f68ba23f7901 https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda#8e7251989bca326a28f4a5ffbd74557a https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda#b499ce4b026493a13774bcf0f4c33849 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda#be43915efc66345cccb3c310b6ed0374 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#cd5a90476766d53e901500df9215e927 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-h031cc0b_0.conda#a67cd8f7b0369bbf2c40411f05a62f3b https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.51.1-hbc0de68_0.conda#968f50847d17c74a428fc47a2c70fd6f https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 -https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-h41a2e66_0.conda#4ddfd44e473c676cb8e80548ba4aa704 +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda#8ccf913aaba749a5496c17629d859ed1 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-1_h4a7cf45_openblas.conda#8b39e1ae950f1b54a3959c58ca2c32b8 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-2_h4a7cf45_openblas.conda#6146bf1b7f58113d54614c6ec683c14a https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda#01e149d4a53185622dc2e788281961f2 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda#f4084e4e6577797150f9b04a4560ceb0 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.0-hee844dc_0.conda#729a572a3ebb8c43933b30edcc628ceb -https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-ha9997c6_0.conda#e7733bc6785ec009e47a224a71917e84 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd +https://conda.anaconda.org/conda-forge/linux-64/python-3.12.12-hd63d673_1_cpython.conda#5c00c8cea14ee8d02941cab9121dce41 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda#4afc585cd97ba8a23809406cd8a9eda8 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda#c74d83614aec66227ae5199d98852aaf -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-1_h0358290_openblas.conda#a670bff9eb7963ea41b4e09a4e4ab608 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-1_h47877c9_openblas.conda#dee12a83aa4aca5077ea23c0605de044 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-h26afc86_0.conda#e512be7dc1f84966d50959e900ca121f -https://conda.anaconda.org/conda-forge/linux-64/python-3.12.12-hd63d673_1_cpython.conda#5c00c8cea14ee8d02941cab9121dce41 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.51.0-heff268d_0.conda#5422f0e1b59d2aa29329d5b3e36d57e5 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda#8f37c8fb7116a18da04e52fa9e2c8df9 https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda#c7944d55af26b6d2d7629e27e9a972c1 -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py312h67db365_0.conda#7c9245551ebbe6b6068aeda04060afaa +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py312hdb49522_1.conda#64088dffd7413a2dd557ce837b4cbbdb https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.2-pyhd8ed1ab_0.conda#9c265afcec13eb6e844ae51b4a4b52ad https://conda.anaconda.org/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda#96a02a5c1a65470a7e4eedb644c872fd https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 @@ -109,8 +103,9 @@ https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#0 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda#66b8b26023b8efdf8fcb23bac4b6325d https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 -https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda#4afc585cd97ba8a23809406cd8a9eda8 https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.10.0-pyhd8ed1ab_0.conda#d18004c37182f83b9818b714825a7627 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda#c74d83614aec66227ae5199d98852aaf https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/humanize-4.14.0-pyhd8ed1ab_0.conda#8b8884a6375830fe0cfb806ccbbd755c https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac @@ -119,20 +114,20 @@ https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.b https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda#9614359868482abba1bd15ce465e3c42 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py312h0a2e395_2.conda#3a3004fddd39e3bb1a631b08d7045156 -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.3-nompi_h11f7409_103.conda#3ccff1066c05a1e6c221356eecc40581 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-2_h0358290_openblas.conda#a84b2b7ed34206d14739fb8d29cd2799 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-2_h47877c9_openblas.conda#9fb20e74a7436dc94dd39d9a9decddc3 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_0.conda#f775a43412f7f3d7ed218113ad233869 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.5-py312h33ff503_0.conda#1570db96376f9f01cf495afe203672e5 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 -https://conda.anaconda.org/conda-forge/linux-64/pillow-12.0.0-py312h0889fd4_0.conda#45824eb723a6b4a128d120ad1d07df5e +https://conda.anaconda.org/conda-forge/linux-64/pillow-12.0.0-py312h50c33e8_2.conda#f2aef8ecea68f4d35330f0c48949bff2 https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda#5c7a868f8241e64e1cf5fdf4962f23e2 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 https://conda.anaconda.org/conda-forge/linux-64/proj-9.7.0-hb72c0af_0.conda#438e75abf4d8c9c1d9e483b6c3f36282 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.5-pyhcf101f3_0.conda#6c8979be6d7a17692793114fa26916e8 -https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.2-pyhd8ed1ab_0.conda#3751072ac0bd677416696063872078f1 +https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.3-pyhd8ed1ab_0.conda#c138c7aaa6a10b5762dcd92247864aff https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.6.0-py312h0d868a3_1.conda#1cfb9b04c827219597def32c22fb9ca2 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 @@ -148,56 +143,60 @@ https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda#c07 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.0-py312h4c3975b_1.conda#a0b8efbe73c90f810a171a6c746be087 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py312h460c074_1.conda#648ee28dcd4e07a1940a17da62eccd40 -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312h4f23490_2.conda#ff4b5976814bc00861f962276c8fb87f -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312hd9148b4_3.conda#86cf7a7d861b79d38e3f0e5097e4965b https://conda.anaconda.org/conda-forge/linux-64/coverage-7.12.0-py312h8a5da7c_0.conda#4ecb5e03c7d50c4d0fe61045f6770130 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.60.1-py312h8a5da7c_0.conda#b12bb9cc477156ce84038e0be6d0f763 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda#8e662bd460bda79b1ea39194e3c4c9ab +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.61.0-py312h8a5da7c_0.conda#a214816edb28136aabcfad864b3a445b +https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda#4b69232755285701bc86a5afe4d9933a https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a04073db11c2c86c555fb088acc8f8c1 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 -https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h4f23490_2.conda#cec5bc5f7d374f8f8095f8e28e31f6cb +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.3-nompi_h11f7409_103.conda#3ccff1066c05a1e6c221356eecc40581 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.5-py312h33ff503_0.conda#1570db96376f9f01cf495afe203672e5 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/noarch/pip-25.3-pyh8b19718_0.conda#c55515ca43c6444d2572e0f0d93cb6b9 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py312h9b6a7d9_2.conda#573b9a879a3a42990f9c51d7376dce6b https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.3-py312h7a1785b_1.conda#c6e0e1f1d9ac014a980574cfe8caa25f -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py312h383787d_2.conda#69e400d3deca12ee7afd4b73a5596905 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.35.4-pyhd8ed1ab_0.conda#cfccfd4e8d9de82ed75c8e2c91cab375 https://conda.anaconda.org/conda-forge/noarch/anyio-4.11.0-pyhcf101f3_0.conda#814472b61da9792fae28156cb9ee54f5 -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py312h4f23490_1.conda#ac0a1a874ce9e3f8940a3a908ff74da9 +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312h4f23490_2.conda#ff4b5976814bc00861f962276c8fb87f +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312hd9148b4_3.conda#86cf7a7d861b79d38e3f0e5097e4965b https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.9.1-pyhcf101f3_0.conda#c49de33395d775a92ea90e0cb34c3577 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.44.0-h83bc92c_0.conda#2d37fd4ccfd98453a02a278e4112da39 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py312he3d6523_0.conda#b8dc157bbbb69c1407478feede8b7b42 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py312hf6400b3_104.conda#e3f2d3ba3f36a10a32219dff624f4ea0 +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a04073db11c2c86c555fb088acc8f8c1 +https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h4f23490_2.conda#cec5bc5f7d374f8f8095f8e28e31f6cb https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.1-pyhcf101f3_0.conda#fa7f71faa234947d9c520f89b4bda1a2 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.3-py312h7a1785b_1.conda#c6e0e1f1d9ac014a980574cfe8caa25f https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0.conda#e2e4d7094d0580ccd62e2a41947444f3 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py312h383787d_2.conda#69e400d3deca12ee7afd4b73a5596905 https://conda.anaconda.org/conda-forge/noarch/tox-4.32.0-pyhcf101f3_0.conda#1b49a3b817df5c88742219c4d6e5ee57 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312hd9148b4_6.conda#f30ece80e76f9cc96e30cc5c71d2818e https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py312h5253ce2_1.conda#02738ff9855946075cbd1b5274399a41 -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py312hf79963d_1.conda#6c913a686cb4060cbd7639a36fa144f0 +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py312h4f23490_1.conda#ac0a1a874ce9e3f8940a3a908ff74da9 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.44.0-h83bc92c_0.conda#2d37fd4ccfd98453a02a278e4112da39 https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb https://conda.anaconda.org/conda-forge/noarch/identify-2.6.15-pyhd8ed1ab_0.conda#25f954b7dae6dd7b0dc004dab74f1ce9 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py312he3d6523_0.conda#b8dc157bbbb69c1407478feede8b7b42 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py312hf6400b3_104.conda#e3f2d3ba3f36a10a32219dff624f4ea0 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda#6891acad5e136cb62a8c2ed2679d6528 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.44.0-py312h4f23490_1.conda#eea306a68c483e1305381130b35a09ff https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py312hf79963d_1.conda#6c913a686cb4060cbd7639a36fa144f0 https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 -https://conda.anaconda.org/conda-forge/noarch/iris-3.14.0-pyha770c72_1.conda#d5bd40a6e2b471e0de7e4c5b4050b5a4 -https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.4.0-pyha770c72_0.conda#c130573bb7a166e93d5bd01c94ae38e1 +https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.0-pyha770c72_0.conda#af8d4882203bccefec6f1aeed70030c6 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.44.0-py312h4f23490_1.conda#eea306a68c483e1305381130b35a09ff https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 +https://conda.anaconda.org/conda-forge/noarch/iris-3.14.0-pyha770c72_1.conda#d5bd40a6e2b471e0de7e4c5b4050b5a4 https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2025.11.20-pyhd8ed1ab_0.conda#1285738dad946d2c508ccfb83b866970 https://conda.anaconda.org/conda-forge/noarch/nox-2025.11.12-pyhcf101f3_0.conda#ae74047e4fe04ff7760d9529c49b7475 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b From c01323bce30d7e3d0dcbc97a2413c66dca09bba1 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 2 Dec 2025 09:42:40 +0000 Subject: [PATCH 521/583] chore: update pre-commit hooks (#734) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/pre-commit/mirrors-mypy: v1.18.2 → v1.19.0](https://github.com/pre-commit/mirrors-mypy/compare/v1.18.2...v1.19.0) - [github.com/astral-sh/ruff-pre-commit: v0.14.6 → v0.14.7](https://github.com/astral-sh/ruff-pre-commit/compare/v0.14.6...v0.14.7) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 8f1b8f7b..03dc1064 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -67,7 +67,7 @@ repos: additional_dependencies: [tomli] - repo: https://github.com/pre-commit/mirrors-mypy - rev: 'v1.18.2' + rev: 'v1.19.0' hooks: - id: mypy exclude: 'noxfile\.py|docs/conf\.py' @@ -80,7 +80,7 @@ repos: types: [file, python] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.14.6" + rev: "v0.14.7" hooks: - id: ruff-check types: [file, python] From 2765aaa0414b14c6ded4dc53f35cc1292b633cc4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Dec 2025 09:20:34 +0000 Subject: [PATCH 522/583] Bump the dependencies group with 3 updates (#735) Bumps the dependencies group with 3 updates: [scitools/workflows/.github/workflows/ci-manifest.yml](https://github.com/scitools/workflows), [scitools/workflows/.github/workflows/ci-template-check.yml](https://github.com/scitools/workflows) and [scitools/workflows/.github/workflows/refresh-lockfiles.yml](https://github.com/scitools/workflows). Updates `scitools/workflows/.github/workflows/ci-manifest.yml` from 2025.11.8 to 2025.12.0 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.11.8...2025.12.0) Updates `scitools/workflows/.github/workflows/ci-template-check.yml` from 2025.11.8 to 2025.12.0 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.11.8...2025.12.0) Updates `scitools/workflows/.github/workflows/refresh-lockfiles.yml` from 2025.11.8 to 2025.12.0 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.11.8...2025.12.0) --- updated-dependencies: - dependency-name: scitools/workflows/.github/workflows/ci-manifest.yml dependency-version: 2025.12.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: scitools/workflows/.github/workflows/ci-template-check.yml dependency-version: 2025.12.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: scitools/workflows/.github/workflows/refresh-lockfiles.yml dependency-version: 2025.12.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/ci-template-check.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 45be03e6..42dd8a85 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.11.8 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.12.0 diff --git a/.github/workflows/ci-template-check.yml b/.github/workflows/ci-template-check.yml index b7bc5645..df1d9fe5 100644 --- a/.github/workflows/ci-template-check.yml +++ b/.github/workflows/ci-template-check.yml @@ -10,7 +10,7 @@ on: jobs: prompt-share: - uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.11.8 + uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.12.0 secrets: inherit with: pr_number: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 99fc4e54..19606e5e 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.11.8 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.12.0 secrets: inherit From 0d7a32d8cc224267b4718128197d443d3363264d Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 8 Dec 2025 11:00:09 +0000 Subject: [PATCH 523/583] Updated environment lockfiles (#736) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 55 +++++++++++----------- requirements/locks/py311-linux-64.lock | 63 +++++++++++++------------- requirements/locks/py312-linux-64.lock | 63 +++++++++++++------------- 3 files changed, 92 insertions(+), 89 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 5a474557..5560f75b 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -7,10 +7,10 @@ https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.conda#05e0 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda#f0991f0f84902f6b6009b4d2350a83aa https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_14.conda#91349c276f84f590487e4c7f6e90e077 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_15.conda#a90d6983da0757f4c09bb8fcfaf34e71 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_14.conda#550dceb769d23bcf0e2f97fd4062d720 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_15.conda#a5d86b0496174a412d531eac03af9174 https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda#791365c5f65975051e4e017b5da3abf5 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda#51a19bba1b8ebfb60df25cde030b7ebc https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be @@ -19,14 +19,14 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda#6c77a605a7a689d17d4819c0f8ac9a00 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda#8b09ae86839581147ef2e5c5e229d164 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda#35f29eec58405aaf55e01cb470d8c26a -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_14.conda#6c13aaae36d7514f28bd5544da1a7bb8 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_14.conda#3078a2a9a58566a54e579b41b9e88c84 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_15.conda#7b742943660c5173bb6a5c823021c9a0 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_15.conda#356b7358fcd6df32ad50d07cdfadd27d https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda#8397539e3a0bbd1695584fb4f927485a https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_14.conda#8e96fe9b17d5871b5cf9d312cab832f6 -https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda#80c07c68d2f6870250959dcc95b209d1 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_15.conda#fccfb26375ec5e4a2192dee6604b6d02 +https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-h5347b49_1.conda#41f5c09a211985c3ce642d60721e7c3e https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 @@ -43,12 +43,12 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.co https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda#4ffbb341c8b616aa2494b6afb26a0c5f https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_14.conda#fa9d91abc5a9db36fa8dcd1b9a602e61 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_15.conda#7deffdc77cda3d2bbc9c558efa33d3ed https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.51-h421ea60_0.conda#d8b81203d08435eb999baa249427884e https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.1-h0c1763c_0.conda#2e1b84d273b01835256e53fd938de355 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_14.conda#9531f671a13eec0597941fa19e489b96 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_15.conda#20a8584ff8677ac9d724345b9d4eb757 https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc @@ -59,8 +59,8 @@ https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#28 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda#98b6c9dc80eb87b2519b97bcf7e578dd https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda#86bc20552bf46075e3d92b67f089172d https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 -https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.1-hde8ca8f_0.conda#49c832bff803d95a56190e7992b4b230 -https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 +https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.2-h54a6638_0.conda#0faadd01896315ceea58bcc3479b1d21 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda#4a13eeac0b5c8e5b8ab496e6c4ddd829 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda#af39b9a8711d4a8d437b52c1d78eb6a1 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 @@ -78,7 +78,7 @@ https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda#8ccf913aaba749a5496c17629d859ed1 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-2_h4a7cf45_openblas.conda#6146bf1b7f58113d54614c6ec683c14a +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-4_h4a7cf45_openblas.conda#14ff9fdfbd8bd590fca383b995470711 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda#01e149d4a53185622dc2e788281961f2 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda#f4084e4e6577797150f9b04a4560ceb0 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd @@ -87,25 +87,26 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda#8f37c8fb7116a18da04e52fa9e2c8df9 -https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda#c7944d55af26b6d2d7629e27e9a972c1 +https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda#537296d57ea995666c68c821b00e360b +https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.1.0-py310h69bd2ac_1.conda#37a3d420e0410e441c18778fb08ac8ab https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py310hba01987_1.conda#393fca4557fbd2c4d995dcb89f569048 https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.2-pyhd8ed1ab_0.conda#9c265afcec13eb6e844ae51b4a4b52ad https://conda.anaconda.org/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda#96a02a5c1a65470a7e4eedb644c872fd https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda#a22d1fd9bf98827e280a02875d9a007a -https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh707e725_0.conda#9ba00b39e03a0afb2b1cc0767d4c6175 +https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda#ea8a6c3256897cc31263de9f455e25d9 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhd8ed1ab_0.conda#fcac5929097ba1f2a0e5b6ecaa13b253 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/colorlog-6.10.1-pyh707e725_0.conda#33e96df3785bf61676ffee387e5a19e5 -https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 +https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda#4c2a8fef270f6c69591889b93f9f55c1 https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda#66b8b26023b8efdf8fcb23bac4b6325d https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda#4afc585cd97ba8a23809406cd8a9eda8 -https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.10.0-pyhd8ed1ab_0.conda#d18004c37182f83b9818b714825a7627 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda#c74d83614aec66227ae5199d98852aaf +https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.12.0-pyhd8ed1ab_0.conda#a3b9510e2491c20c7fc0f5e730227fbb +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h1b119a7_104.conda#0857f4d157820dcd5625f61fdfefb780 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/humanize-4.14.0-pyhd8ed1ab_0.conda#8b8884a6375830fe0cfb806ccbbd755c https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac @@ -114,15 +115,15 @@ https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.b https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda#9614359868482abba1bd15ce465e3c42 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py310haaf941d_2.conda#7426d76535fc6347f1b74f85fb17d6eb -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-2_h0358290_openblas.conda#a84b2b7ed34206d14739fb8d29cd2799 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-2_h47877c9_openblas.conda#9fb20e74a7436dc94dd39d9a9decddc3 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-4_h0358290_openblas.conda#25f5e5af61cee1ffedd9b4c9947d3af8 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-4_h47877c9_openblas.conda#8ba8431802764597f400ee3e99026367 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py310h3406613_0.conda#8854df4fb4e37cc3ea0a024e48c9c180 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/linux-64/pillow-12.0.0-py310h5a73078_2.conda#b258053ab882158e39c6f8aff00b4c37 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda#5c7a868f8241e64e1cf5fdf4962f23e2 -https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda#1bd2e65c8c7ef24f4639ae6e850dacc2 +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda#d7585b6550ad04c8c5e21097ada2888e https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h18fbb6c_2.conda#1aeede769ec2fa0f474f8b73a7ac057f https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 @@ -143,7 +144,7 @@ https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.0-py310h7c4b9e2_1.conda#b1ccdb989be682ab0dd430c1c15d5012 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f +https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda#30cd29cb87d819caead4d55184c1d115 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py310he7384ee_1.conda#803e2d778b8dcccdc014127ec5001681 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.12.0-py310h3406613_0.conda#b42800b0d20b57c92087052b21ab2013 @@ -155,7 +156,7 @@ https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda#4b69 https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda#04558c96691bed63104678757beb4f8d https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.3-nompi_h11f7409_103.conda#3ccff1066c05a1e6c221356eecc40581 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.6-py310hefbff90_0.conda#b0cea2c364bf65cd19e023040eeab05d @@ -166,7 +167,7 @@ https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0. https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.35.4-pyhd8ed1ab_0.conda#cfccfd4e8d9de82ed75c8e2c91cab375 -https://conda.anaconda.org/conda-forge/noarch/anyio-4.11.0-pyhcf101f3_0.conda#814472b61da9792fae28156cb9ee54f5 +https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.0-pyhcf101f3_0.conda#9958d4a1ee7e9c768fe8f4fb51bd07ea https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310hf779ad0_2.conda#30167b9702fd4a46cd4a98e74c9840d8 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py310h3788b33_0.conda#b6420d29123c7c823de168f49ccdfe6a https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.7.0-h40b2b14_1.conda#8a77895fb29728b736a1a6c75906ea1a @@ -178,6 +179,7 @@ https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0. https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py310hc8bbb35_2.conda#0937b0e88a24c82e02d5b714acc9957c https://conda.anaconda.org/conda-forge/noarch/tox-4.32.0-pyhcf101f3_0.conda#1b49a3b817df5c88742219c4d6e5ee57 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310h03d9f68_6.conda#34778c3f9a6ea19610e7e340dc2caaab +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.0-pyhd8ed1ab_0.conda#de7372f43e63ff0876b4023b79b55e95 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py310h139afa4_1.conda#3741aefc198dfed2e3c9adc79d706bb7 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py310hf779ad0_1.conda#5e4aea6b728177b53e8a216922ebd6a2 https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 @@ -188,16 +190,15 @@ https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py310hfde https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.3-nompi_py310he90c06d_100.conda#e1a3c6a1e8ceec1fe91a3660b97a43b6 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda#6891acad5e136cb62a8c2ed2679d6528 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py310h0158d43_1.conda#871b5f746960f99ac23dbc73d14e2ad0 +https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.0-pyha770c72_0.conda#af8d4882203bccefec6f1aeed70030c6 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.44.0-py310hf779ad0_1.conda#fd8c4f1cebd49ffbea2d817dc56eb4cd -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 -https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/noarch/iris-3.11.1-pyha770c72_1.conda#f501583062225a070455d011d81b07bf -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2025.11.20-pyhd8ed1ab_0.conda#1285738dad946d2c508ccfb83b866970 +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2025.12.2-pyhd8ed1ab_0.conda#4a4f766ea1e62fae6f7513999d76a460 https://conda.anaconda.org/conda-forge/noarch/nox-2025.11.12-pyhcf101f3_0.conda#ae74047e4fe04ff7760d9529c49b7475 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 48539d9b..c8c637fe 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -7,10 +7,10 @@ https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda#8fcb https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda#f0991f0f84902f6b6009b4d2350a83aa https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_14.conda#91349c276f84f590487e4c7f6e90e077 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_15.conda#a90d6983da0757f4c09bb8fcfaf34e71 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_14.conda#550dceb769d23bcf0e2f97fd4062d720 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_15.conda#a5d86b0496174a412d531eac03af9174 https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda#791365c5f65975051e4e017b5da3abf5 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda#51a19bba1b8ebfb60df25cde030b7ebc https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be @@ -19,14 +19,14 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda#6c77a605a7a689d17d4819c0f8ac9a00 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda#8b09ae86839581147ef2e5c5e229d164 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda#35f29eec58405aaf55e01cb470d8c26a -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_14.conda#6c13aaae36d7514f28bd5544da1a7bb8 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_14.conda#3078a2a9a58566a54e579b41b9e88c84 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_15.conda#7b742943660c5173bb6a5c823021c9a0 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_15.conda#356b7358fcd6df32ad50d07cdfadd27d https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda#8397539e3a0bbd1695584fb4f927485a https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_14.conda#8e96fe9b17d5871b5cf9d312cab832f6 -https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda#80c07c68d2f6870250959dcc95b209d1 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_15.conda#fccfb26375ec5e4a2192dee6604b6d02 +https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-h5347b49_1.conda#41f5c09a211985c3ce642d60721e7c3e https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 @@ -43,12 +43,12 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.co https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda#4ffbb341c8b616aa2494b6afb26a0c5f https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_14.conda#fa9d91abc5a9db36fa8dcd1b9a602e61 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_15.conda#7deffdc77cda3d2bbc9c558efa33d3ed https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.51-h421ea60_0.conda#d8b81203d08435eb999baa249427884e https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.1-h0c1763c_0.conda#2e1b84d273b01835256e53fd938de355 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_14.conda#9531f671a13eec0597941fa19e489b96 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_15.conda#20a8584ff8677ac9d724345b9d4eb757 https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc @@ -59,8 +59,8 @@ https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#28 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda#98b6c9dc80eb87b2519b97bcf7e578dd https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda#86bc20552bf46075e3d92b67f089172d https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 -https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.1-hde8ca8f_0.conda#49c832bff803d95a56190e7992b4b230 -https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 +https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.2-h54a6638_0.conda#0faadd01896315ceea58bcc3479b1d21 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda#4a13eeac0b5c8e5b8ab496e6c4ddd829 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda#af39b9a8711d4a8d437b52c1d78eb6a1 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 @@ -78,7 +78,7 @@ https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda#8ccf913aaba749a5496c17629d859ed1 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-2_h4a7cf45_openblas.conda#6146bf1b7f58113d54614c6ec683c14a +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-4_h4a7cf45_openblas.conda#14ff9fdfbd8bd590fca383b995470711 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda#01e149d4a53185622dc2e788281961f2 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda#f4084e4e6577797150f9b04a4560ceb0 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd @@ -87,25 +87,26 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda#8f37c8fb7116a18da04e52fa9e2c8df9 -https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda#c7944d55af26b6d2d7629e27e9a972c1 +https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda#537296d57ea995666c68c821b00e360b +https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.1.0-py311h6b1f9c4_1.conda#5f72f984fc74d8e5286095760211c29e https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py311h66f275b_1.conda#86daecb8e4ed1042d5dc6efbe0152590 https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.2-pyhd8ed1ab_0.conda#9c265afcec13eb6e844ae51b4a4b52ad https://conda.anaconda.org/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda#96a02a5c1a65470a7e4eedb644c872fd https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda#a22d1fd9bf98827e280a02875d9a007a -https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh707e725_0.conda#9ba00b39e03a0afb2b1cc0767d4c6175 +https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda#ea8a6c3256897cc31263de9f455e25d9 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhd8ed1ab_0.conda#fcac5929097ba1f2a0e5b6ecaa13b253 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/colorlog-6.10.1-pyh707e725_0.conda#33e96df3785bf61676ffee387e5a19e5 -https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 +https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda#4c2a8fef270f6c69591889b93f9f55c1 https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda#66b8b26023b8efdf8fcb23bac4b6325d https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda#4afc585cd97ba8a23809406cd8a9eda8 -https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.10.0-pyhd8ed1ab_0.conda#d18004c37182f83b9818b714825a7627 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda#c74d83614aec66227ae5199d98852aaf +https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.12.0-pyhd8ed1ab_0.conda#a3b9510e2491c20c7fc0f5e730227fbb +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h1b119a7_104.conda#0857f4d157820dcd5625f61fdfefb780 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/humanize-4.14.0-pyhd8ed1ab_0.conda#8b8884a6375830fe0cfb806ccbbd755c https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac @@ -114,16 +115,16 @@ https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.b https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda#9614359868482abba1bd15ce465e3c42 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py311h724c32c_2.conda#4089f739463c798e10d8644bc34e24de -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-2_h0358290_openblas.conda#a84b2b7ed34206d14739fb8d29cd2799 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-2_h47877c9_openblas.conda#9fb20e74a7436dc94dd39d9a9decddc3 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-4_h0358290_openblas.conda#25f5e5af61cee1ffedd9b4c9947d3af8 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-4_h47877c9_openblas.conda#8ba8431802764597f400ee3e99026367 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py311h3778330_0.conda#0954f1a6a26df4a510b54f73b2a0345c https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/linux-64/pillow-12.0.0-py311hf88fc01_2.conda#79edb22fb652ee142099df18042ca8c0 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda#5c7a868f8241e64e1cf5fdf4962f23e2 -https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.7.0-hb72c0af_0.conda#438e75abf4d8c9c1d9e483b6c3f36282 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda#1bd2e65c8c7ef24f4639ae6e850dacc2 +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda#d7585b6550ad04c8c5e21097ada2888e +https://conda.anaconda.org/conda-forge/linux-64/proj-9.7.1-h99ae125_0.conda#8bbc19a6e87fbe8b97796e9a42a47a30 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.5-pyhcf101f3_0.conda#6c8979be6d7a17692793114fa26916e8 @@ -144,7 +145,7 @@ https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.0-py311h49ec1c0_1.conda#5e6d4026784e83c0a51c86ec428e8cc8 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f +https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda#30cd29cb87d819caead4d55184c1d115 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py311h03d9500_1.conda#3912e4373de46adafd8f1e97e4bd166b https://conda.anaconda.org/conda-forge/linux-64/coverage-7.12.0-py311h3778330_0.conda#4ef5919a315f5c2834fc8da49044156d @@ -156,7 +157,7 @@ https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda#4b69 https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda#04558c96691bed63104678757beb4f8d https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.3-nompi_h11f7409_103.conda#3ccff1066c05a1e6c221356eecc40581 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.5-py311h2e04523_0.conda#01da92ddaf561cabebd06019ae521510 @@ -167,10 +168,10 @@ https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0. https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.35.4-pyhd8ed1ab_0.conda#cfccfd4e8d9de82ed75c8e2c91cab375 -https://conda.anaconda.org/conda-forge/noarch/anyio-4.11.0-pyhcf101f3_0.conda#814472b61da9792fae28156cb9ee54f5 +https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.0-pyhcf101f3_0.conda#9958d4a1ee7e9c768fe8f4fb51bd07ea https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h0372a8f_2.conda#c85f7b94f099fddb08358e0997dded95 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py311hdf67eae_3.conda#c4e2f4d5193e55a70bb67a2aa07006ae -https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.9.1-pyhcf101f3_0.conda#c49de33395d775a92ea90e0cb34c3577 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.11.0-pyhcf101f3_0.conda#91549f296c15ef7b49ee6600e7c934c1 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a04073db11c2c86c555fb088acc8f8c1 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py311h0372a8f_2.conda#487756753716efba090d06c71fb73eb6 https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.1-pyhcf101f3_0.conda#fa7f71faa234947d9c520f89b4bda1a2 @@ -179,25 +180,25 @@ https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0. https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py311h8a92878_2.conda#b37c338ff0f69883188c9b3b127be059 https://conda.anaconda.org/conda-forge/noarch/tox-4.32.0-pyhcf101f3_0.conda#1b49a3b817df5c88742219c4d6e5ee57 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hdf67eae_6.conda#57e703b0057f992687fb9ad154dc48e4 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.0-pyhd8ed1ab_0.conda#de7372f43e63ff0876b4023b79b55e95 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py311haee01d2_1.conda#ca45bfd4871af957aaa5035593d5efd2 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py311h0372a8f_1.conda#ef8650a6059a907122d59a740207f50e https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.44.0-h83bc92c_0.conda#2d37fd4ccfd98453a02a278e4112da39 https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb https://conda.anaconda.org/conda-forge/noarch/identify-2.6.15-pyhd8ed1ab_0.conda#25f954b7dae6dd7b0dc004dab74f1ce9 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py311h0f3be63_0.conda#21a0139015232dc0edbf6c2179b5ec24 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py311h6623971_104.conda#fc6c31f2b2bd3fce50d5496ce30d04ff +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.3-nompi_py311h6623971_100.conda#d625880a4f700264c5aad388856479ee https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda#6891acad5e136cb62a8c2ed2679d6528 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py311hed34c8f_1.conda#17c710c32010688086b28c088a8be579 +https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.0-pyha770c72_0.conda#af8d4882203bccefec6f1aeed70030c6 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.44.0-py311h0372a8f_1.conda#c5a5fef7f068abe2858a89ddf19e5a79 -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 -https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 -https://conda.anaconda.org/conda-forge/noarch/iris-3.14.0-pyha770c72_1.conda#d5bd40a6e2b471e0de7e4c5b4050b5a4 -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2025.11.20-pyhd8ed1ab_0.conda#1285738dad946d2c508ccfb83b866970 +https://conda.anaconda.org/conda-forge/noarch/iris-3.14.1-pyha770c72_0.conda#0b6f532e907ce57be6905bd6d44fbe71 +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2025.12.2-pyhd8ed1ab_0.conda#4a4f766ea1e62fae6f7513999d76a460 https://conda.anaconda.org/conda-forge/noarch/nox-2025.11.12-pyhcf101f3_0.conda#ae74047e4fe04ff7760d9529c49b7475 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index c5c14fe1..b395558d 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -7,10 +7,10 @@ https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda#c3ef https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda#f0991f0f84902f6b6009b4d2350a83aa https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_14.conda#91349c276f84f590487e4c7f6e90e077 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_15.conda#a90d6983da0757f4c09bb8fcfaf34e71 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_14.conda#550dceb769d23bcf0e2f97fd4062d720 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_15.conda#a5d86b0496174a412d531eac03af9174 https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda#791365c5f65975051e4e017b5da3abf5 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda#51a19bba1b8ebfb60df25cde030b7ebc https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be @@ -19,14 +19,14 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda#6c77a605a7a689d17d4819c0f8ac9a00 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda#8b09ae86839581147ef2e5c5e229d164 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda#35f29eec58405aaf55e01cb470d8c26a -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_14.conda#6c13aaae36d7514f28bd5544da1a7bb8 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_14.conda#3078a2a9a58566a54e579b41b9e88c84 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_15.conda#7b742943660c5173bb6a5c823021c9a0 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_15.conda#356b7358fcd6df32ad50d07cdfadd27d https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda#8397539e3a0bbd1695584fb4f927485a https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_14.conda#8e96fe9b17d5871b5cf9d312cab832f6 -https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda#80c07c68d2f6870250959dcc95b209d1 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_15.conda#fccfb26375ec5e4a2192dee6604b6d02 +https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-h5347b49_1.conda#41f5c09a211985c3ce642d60721e7c3e https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 @@ -43,12 +43,12 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.co https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda#4ffbb341c8b616aa2494b6afb26a0c5f https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_14.conda#fa9d91abc5a9db36fa8dcd1b9a602e61 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_15.conda#7deffdc77cda3d2bbc9c558efa33d3ed https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.51-h421ea60_0.conda#d8b81203d08435eb999baa249427884e https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.1-h0c1763c_0.conda#2e1b84d273b01835256e53fd938de355 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_14.conda#9531f671a13eec0597941fa19e489b96 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_15.conda#20a8584ff8677ac9d724345b9d4eb757 https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc @@ -59,8 +59,8 @@ https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#28 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda#98b6c9dc80eb87b2519b97bcf7e578dd https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda#86bc20552bf46075e3d92b67f089172d https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 -https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.1-hde8ca8f_0.conda#49c832bff803d95a56190e7992b4b230 -https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 +https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.2-h54a6638_0.conda#0faadd01896315ceea58bcc3479b1d21 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda#4a13eeac0b5c8e5b8ab496e6c4ddd829 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda#af39b9a8711d4a8d437b52c1d78eb6a1 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 @@ -78,7 +78,7 @@ https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda#8ccf913aaba749a5496c17629d859ed1 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-2_h4a7cf45_openblas.conda#6146bf1b7f58113d54614c6ec683c14a +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-4_h4a7cf45_openblas.conda#14ff9fdfbd8bd590fca383b995470711 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda#01e149d4a53185622dc2e788281961f2 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda#f4084e4e6577797150f9b04a4560ceb0 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd @@ -87,25 +87,26 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda#8f37c8fb7116a18da04e52fa9e2c8df9 -https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyh71513ae_0.conda#c7944d55af26b6d2d7629e27e9a972c1 +https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda#537296d57ea995666c68c821b00e360b +https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.1.0-py312h90b7ffd_1.conda#31f7139cac9bd11e04d71d65be3158ef https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py312hdb49522_1.conda#64088dffd7413a2dd557ce837b4cbbdb https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.2-pyhd8ed1ab_0.conda#9c265afcec13eb6e844ae51b4a4b52ad https://conda.anaconda.org/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda#96a02a5c1a65470a7e4eedb644c872fd https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda#a22d1fd9bf98827e280a02875d9a007a -https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh707e725_0.conda#9ba00b39e03a0afb2b1cc0767d4c6175 +https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda#ea8a6c3256897cc31263de9f455e25d9 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhd8ed1ab_0.conda#fcac5929097ba1f2a0e5b6ecaa13b253 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/colorlog-6.10.1-pyh707e725_0.conda#33e96df3785bf61676ffee387e5a19e5 -https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda#44600c4667a319d67dbe0681fc0bc833 +https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda#4c2a8fef270f6c69591889b93f9f55c1 https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda#66b8b26023b8efdf8fcb23bac4b6325d https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda#4afc585cd97ba8a23809406cd8a9eda8 -https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.10.0-pyhd8ed1ab_0.conda#d18004c37182f83b9818b714825a7627 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h6e4c0c1_103.conda#c74d83614aec66227ae5199d98852aaf +https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.12.0-pyhd8ed1ab_0.conda#a3b9510e2491c20c7fc0f5e730227fbb +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h1b119a7_104.conda#0857f4d157820dcd5625f61fdfefb780 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/humanize-4.14.0-pyhd8ed1ab_0.conda#8b8884a6375830fe0cfb806ccbbd755c https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac @@ -114,16 +115,16 @@ https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.b https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda#9614359868482abba1bd15ce465e3c42 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py312h0a2e395_2.conda#3a3004fddd39e3bb1a631b08d7045156 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-2_h0358290_openblas.conda#a84b2b7ed34206d14739fb8d29cd2799 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-2_h47877c9_openblas.conda#9fb20e74a7436dc94dd39d9a9decddc3 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-4_h0358290_openblas.conda#25f5e5af61cee1ffedd9b4c9947d3af8 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-4_h47877c9_openblas.conda#8ba8431802764597f400ee3e99026367 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_0.conda#f775a43412f7f3d7ed218113ad233869 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 https://conda.anaconda.org/conda-forge/linux-64/pillow-12.0.0-py312h50c33e8_2.conda#f2aef8ecea68f4d35330f0c48949bff2 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda#5c7a868f8241e64e1cf5fdf4962f23e2 -https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.7.0-hb72c0af_0.conda#438e75abf4d8c9c1d9e483b6c3f36282 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda#1bd2e65c8c7ef24f4639ae6e850dacc2 +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda#d7585b6550ad04c8c5e21097ada2888e +https://conda.anaconda.org/conda-forge/linux-64/proj-9.7.1-h99ae125_0.conda#8bbc19a6e87fbe8b97796e9a42a47a30 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.5-pyhcf101f3_0.conda#6c8979be6d7a17692793114fa26916e8 @@ -144,7 +145,7 @@ https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.0-py312h4c3975b_1.conda#a0b8efbe73c90f810a171a6c746be087 https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f +https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda#30cd29cb87d819caead4d55184c1d115 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py312h460c074_1.conda#648ee28dcd4e07a1940a17da62eccd40 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.12.0-py312h8a5da7c_0.conda#4ecb5e03c7d50c4d0fe61045f6770130 @@ -156,7 +157,7 @@ https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda#4b69 https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda#04558c96691bed63104678757beb4f8d https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.3-nompi_h11f7409_103.conda#3ccff1066c05a1e6c221356eecc40581 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.5-py312h33ff503_0.conda#1570db96376f9f01cf495afe203672e5 @@ -167,10 +168,10 @@ https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0. https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.35.4-pyhd8ed1ab_0.conda#cfccfd4e8d9de82ed75c8e2c91cab375 -https://conda.anaconda.org/conda-forge/noarch/anyio-4.11.0-pyhcf101f3_0.conda#814472b61da9792fae28156cb9ee54f5 +https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.0-pyhcf101f3_0.conda#9958d4a1ee7e9c768fe8f4fb51bd07ea https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312h4f23490_2.conda#ff4b5976814bc00861f962276c8fb87f https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312hd9148b4_3.conda#86cf7a7d861b79d38e3f0e5097e4965b -https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.9.1-pyhcf101f3_0.conda#c49de33395d775a92ea90e0cb34c3577 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.11.0-pyhcf101f3_0.conda#91549f296c15ef7b49ee6600e7c934c1 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a04073db11c2c86c555fb088acc8f8c1 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h4f23490_2.conda#cec5bc5f7d374f8f8095f8e28e31f6cb https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.1-pyhcf101f3_0.conda#fa7f71faa234947d9c520f89b4bda1a2 @@ -179,25 +180,25 @@ https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0. https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py312h383787d_2.conda#69e400d3deca12ee7afd4b73a5596905 https://conda.anaconda.org/conda-forge/noarch/tox-4.32.0-pyhcf101f3_0.conda#1b49a3b817df5c88742219c4d6e5ee57 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312hd9148b4_6.conda#f30ece80e76f9cc96e30cc5c71d2818e +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.0-pyhd8ed1ab_0.conda#de7372f43e63ff0876b4023b79b55e95 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py312h5253ce2_1.conda#02738ff9855946075cbd1b5274399a41 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py312h4f23490_1.conda#ac0a1a874ce9e3f8940a3a908ff74da9 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.44.0-h83bc92c_0.conda#2d37fd4ccfd98453a02a278e4112da39 https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb https://conda.anaconda.org/conda-forge/noarch/identify-2.6.15-pyhd8ed1ab_0.conda#25f954b7dae6dd7b0dc004dab74f1ce9 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py312he3d6523_0.conda#b8dc157bbbb69c1407478feede8b7b42 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.2-nompi_py312hf6400b3_104.conda#e3f2d3ba3f36a10a32219dff624f4ea0 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.3-nompi_py312hf6400b3_100.conda#ed7ab4073fe4c48d0f9d3a80b6a17f74 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda#6891acad5e136cb62a8c2ed2679d6528 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py312hf79963d_1.conda#6c913a686cb4060cbd7639a36fa144f0 +https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.0-pyha770c72_0.conda#af8d4882203bccefec6f1aeed70030c6 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.44.0-py312h4f23490_1.conda#eea306a68c483e1305381130b35a09ff -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 -https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 -https://conda.anaconda.org/conda-forge/noarch/iris-3.14.0-pyha770c72_1.conda#d5bd40a6e2b471e0de7e4c5b4050b5a4 -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2025.11.20-pyhd8ed1ab_0.conda#1285738dad946d2c508ccfb83b866970 +https://conda.anaconda.org/conda-forge/noarch/iris-3.14.1-pyha770c72_0.conda#0b6f532e907ce57be6905bd6d44fbe71 +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2025.12.2-pyhd8ed1ab_0.conda#4a4f766ea1e62fae6f7513999d76a460 https://conda.anaconda.org/conda-forge/noarch/nox-2025.11.12-pyhcf101f3_0.conda#ae74047e4fe04ff7760d9529c49b7475 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff From 5f08936a245da4a2f6b6a4fbbedd999e07914728 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 11 Dec 2025 09:41:17 +0000 Subject: [PATCH 524/583] Bump the dependencies group with 3 updates (#737) Bumps the dependencies group with 3 updates: [scitools/workflows/.github/workflows/ci-manifest.yml](https://github.com/scitools/workflows), [scitools/workflows/.github/workflows/ci-template-check.yml](https://github.com/scitools/workflows) and [scitools/workflows/.github/workflows/refresh-lockfiles.yml](https://github.com/scitools/workflows). Updates `scitools/workflows/.github/workflows/ci-manifest.yml` from 2025.12.0 to 2025.12.1 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.12.0...2025.12.1) Updates `scitools/workflows/.github/workflows/ci-template-check.yml` from 2025.12.0 to 2025.12.1 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.12.0...2025.12.1) Updates `scitools/workflows/.github/workflows/refresh-lockfiles.yml` from 2025.12.0 to 2025.12.1 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.12.0...2025.12.1) --- updated-dependencies: - dependency-name: scitools/workflows/.github/workflows/ci-manifest.yml dependency-version: 2025.12.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: scitools/workflows/.github/workflows/ci-template-check.yml dependency-version: 2025.12.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: scitools/workflows/.github/workflows/refresh-lockfiles.yml dependency-version: 2025.12.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/ci-template-check.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 42dd8a85..dc3640a4 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.12.0 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.12.1 diff --git a/.github/workflows/ci-template-check.yml b/.github/workflows/ci-template-check.yml index df1d9fe5..8d3cdf2e 100644 --- a/.github/workflows/ci-template-check.yml +++ b/.github/workflows/ci-template-check.yml @@ -10,7 +10,7 @@ on: jobs: prompt-share: - uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.12.0 + uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.12.1 secrets: inherit with: pr_number: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 19606e5e..11470e4e 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.12.0 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.12.1 secrets: inherit From 2dcec7825009253d23da20ac57f94d9243a6995b Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 10:28:36 +0000 Subject: [PATCH 525/583] Updated environment lockfiles (#739) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 34 ++++++++++++------------ requirements/locks/py311-linux-64.lock | 36 +++++++++++++------------- requirements/locks/py312-linux-64.lock | 36 +++++++++++++------------- 3 files changed, 53 insertions(+), 53 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 5560f75b..d9419319 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -4,28 +4,28 @@ @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.conda#05e00f3b21e88bb3d658ac700b2ce58c -https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h8577fbf_1.conda#e4e8496b68cf5f25e76fbe67f3856550 https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda#f0991f0f84902f6b6009b4d2350a83aa https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_15.conda#a90d6983da0757f4c09bb8fcfaf34e71 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda#26c46f90d0e727e95c6c9498a33a09f3 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_15.conda#a5d86b0496174a412d531eac03af9174 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_16.conda#6d0363467e6ed84f11435eb309f2ff06 https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda#791365c5f65975051e4e017b5da3abf5 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda#51a19bba1b8ebfb60df25cde030b7ebc -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda#920bb03579f15389b9e512095ad995b7 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda#72c8fd1af66bd67bf580645b426513ed https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda#6c77a605a7a689d17d4819c0f8ac9a00 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda#8b09ae86839581147ef2e5c5e229d164 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda#35f29eec58405aaf55e01cb470d8c26a -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_15.conda#7b742943660c5173bb6a5c823021c9a0 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_15.conda#356b7358fcd6df32ad50d07cdfadd27d +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_16.conda#5a68259fac2da8f2ee6f7bfe49c9eb8b +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_16.conda#39183d4e0c05609fd65f130633194e37 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda#8397539e3a0bbd1695584fb4f927485a https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_15.conda#fccfb26375ec5e4a2192dee6604b6d02 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda#68f68355000ec3f1d6f26ea13e8f525f https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-h5347b49_1.conda#41f5c09a211985c3ce642d60721e7c3e https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 @@ -43,12 +43,12 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.co https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda#4ffbb341c8b616aa2494b6afb26a0c5f https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_15.conda#7deffdc77cda3d2bbc9c558efa33d3ed +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_16.conda#40d9b534410403c821ff64f00d0adc22 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.51-h421ea60_0.conda#d8b81203d08435eb999baa249427884e +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.53-h421ea60_0.conda#00d4e66b1f746cb14944cad23fffb405 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.1-h0c1763c_0.conda#2e1b84d273b01835256e53fd938de355 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_15.conda#20a8584ff8677ac9d724345b9d4eb757 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_16.conda#1b3152694d236cf233b76b8c56bf0eae https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc @@ -79,7 +79,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.co https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda#8ccf913aaba749a5496c17629d859ed1 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-4_h4a7cf45_openblas.conda#14ff9fdfbd8bd590fca383b995470711 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda#01e149d4a53185622dc2e788281961f2 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_1.conda#117499f93e892ea1e57fdca16c2e8351 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda#f4084e4e6577797150f9b04a4560ceb0 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd https://conda.anaconda.org/conda-forge/linux-64/python-3.10.19-h3c07f61_2_cpython.conda#27ac896a8b4970f8977503a9e70dc745 @@ -88,7 +88,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0. https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda#8f37c8fb7116a18da04e52fa9e2c8df9 https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda#537296d57ea995666c68c821b00e360b -https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.1.0-py310h69bd2ac_1.conda#37a3d420e0410e441c18778fb08ac8ab +https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.2.0-py310h69bd2ac_0.conda#22be0d7b12ae6ff92aa1fd73272c65d7 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py310hba01987_1.conda#393fca4557fbd2c4d995dcb89f569048 https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.2-pyhd8ed1ab_0.conda#9c265afcec13eb6e844ae51b4a4b52ad https://conda.anaconda.org/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda#96a02a5c1a65470a7e4eedb644c872fd @@ -96,7 +96,7 @@ https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381b https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda#a22d1fd9bf98827e280a02875d9a007a https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda#ea8a6c3256897cc31263de9f455e25d9 -https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhd8ed1ab_0.conda#fcac5929097ba1f2a0e5b6ecaa13b253 +https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda#61b8078a0905b12529abc622406cb62c https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/colorlog-6.10.1-pyh707e725_0.conda#33e96df3785bf61676ffee387e5a19e5 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda#4c2a8fef270f6c69591889b93f9f55c1 @@ -147,7 +147,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.cond https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda#30cd29cb87d819caead4d55184c1d115 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py310he7384ee_1.conda#803e2d778b8dcccdc014127ec5001681 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.12.0-py310h3406613_0.conda#b42800b0d20b57c92087052b21ab2013 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.0-py310h3406613_0.conda#87a9020d32817a12115e5ddfce4693ac https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda#8e662bd460bda79b1ea39194e3c4c9ab https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.61.0-py310h3406613_0.conda#4b2ad208fec1e850ba82a0a17534d3d5 @@ -173,13 +173,13 @@ https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py310h3788b33_0. https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.7.0-h40b2b14_1.conda#8a77895fb29728b736a1a6c75906ea1a https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a04073db11c2c86c555fb088acc8f8c1 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py310hf779ad0_2.conda#4906d8c3680f6c1273ad5a5775807867 -https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.1-pyhcf101f3_0.conda#fa7f71faa234947d9c520f89b4bda1a2 +https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda#2b694bad8a50dc2f712f5368de866480 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.conda#8c29cd33b64b2eb78597fa28b5595c8d https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0.conda#e2e4d7094d0580ccd62e2a41947444f3 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py310hc8bbb35_2.conda#0937b0e88a24c82e02d5b714acc9957c https://conda.anaconda.org/conda-forge/noarch/tox-4.32.0-pyhcf101f3_0.conda#1b49a3b817df5c88742219c4d6e5ee57 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310h03d9f68_6.conda#34778c3f9a6ea19610e7e340dc2caaab -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.0-pyhd8ed1ab_0.conda#de7372f43e63ff0876b4023b79b55e95 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.1-pyhd8ed1ab_0.conda#fb84f0f6ee8a0ad67213cd1bea98bf5b https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py310h139afa4_1.conda#3741aefc198dfed2e3c9adc79d706bb7 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py310hf779ad0_1.conda#5e4aea6b728177b53e8a216922ebd6a2 https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 @@ -198,7 +198,7 @@ https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.0-pyha770c72_0.conda#af8d4882203bccefec6f1aeed70030c6 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.44.0-py310hf779ad0_1.conda#fd8c4f1cebd49ffbea2d817dc56eb4cd https://conda.anaconda.org/conda-forge/noarch/iris-3.11.1-pyha770c72_1.conda#f501583062225a070455d011d81b07bf -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2025.12.2-pyhd8ed1ab_0.conda#4a4f766ea1e62fae6f7513999d76a460 +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2025.12.5-pyhd8ed1ab_0.conda#281eb382cddac0cce7da25f98b747ae0 https://conda.anaconda.org/conda-forge/noarch/nox-2025.11.12-pyhcf101f3_0.conda#ae74047e4fe04ff7760d9529c49b7475 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index c8c637fe..b75a15fa 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -4,28 +4,28 @@ @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda#8fcb6b0e2161850556231336dae58358 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h8577fbf_1.conda#e4e8496b68cf5f25e76fbe67f3856550 https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda#f0991f0f84902f6b6009b4d2350a83aa https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_15.conda#a90d6983da0757f4c09bb8fcfaf34e71 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda#26c46f90d0e727e95c6c9498a33a09f3 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_15.conda#a5d86b0496174a412d531eac03af9174 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_16.conda#6d0363467e6ed84f11435eb309f2ff06 https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda#791365c5f65975051e4e017b5da3abf5 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda#51a19bba1b8ebfb60df25cde030b7ebc -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda#920bb03579f15389b9e512095ad995b7 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda#72c8fd1af66bd67bf580645b426513ed https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda#6c77a605a7a689d17d4819c0f8ac9a00 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda#8b09ae86839581147ef2e5c5e229d164 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda#35f29eec58405aaf55e01cb470d8c26a -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_15.conda#7b742943660c5173bb6a5c823021c9a0 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_15.conda#356b7358fcd6df32ad50d07cdfadd27d +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_16.conda#5a68259fac2da8f2ee6f7bfe49c9eb8b +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_16.conda#39183d4e0c05609fd65f130633194e37 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda#8397539e3a0bbd1695584fb4f927485a https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_15.conda#fccfb26375ec5e4a2192dee6604b6d02 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda#68f68355000ec3f1d6f26ea13e8f525f https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-h5347b49_1.conda#41f5c09a211985c3ce642d60721e7c3e https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 @@ -43,12 +43,12 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.co https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda#4ffbb341c8b616aa2494b6afb26a0c5f https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_15.conda#7deffdc77cda3d2bbc9c558efa33d3ed +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_16.conda#40d9b534410403c821ff64f00d0adc22 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.51-h421ea60_0.conda#d8b81203d08435eb999baa249427884e +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.53-h421ea60_0.conda#00d4e66b1f746cb14944cad23fffb405 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.1-h0c1763c_0.conda#2e1b84d273b01835256e53fd938de355 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_15.conda#20a8584ff8677ac9d724345b9d4eb757 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_16.conda#1b3152694d236cf233b76b8c56bf0eae https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc @@ -79,7 +79,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.co https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda#8ccf913aaba749a5496c17629d859ed1 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-4_h4a7cf45_openblas.conda#14ff9fdfbd8bd590fca383b995470711 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda#01e149d4a53185622dc2e788281961f2 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_1.conda#117499f93e892ea1e57fdca16c2e8351 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda#f4084e4e6577797150f9b04a4560ceb0 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd https://conda.anaconda.org/conda-forge/linux-64/python-3.11.14-hd63d673_2_cpython.conda#c4202a55b4486314fbb8c11bc43a29a0 @@ -88,7 +88,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0. https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda#8f37c8fb7116a18da04e52fa9e2c8df9 https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda#537296d57ea995666c68c821b00e360b -https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.1.0-py311h6b1f9c4_1.conda#5f72f984fc74d8e5286095760211c29e +https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.2.0-py311h6b1f9c4_0.conda#596b9cc36b7af0640825b399e6b11ccc https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py311h66f275b_1.conda#86daecb8e4ed1042d5dc6efbe0152590 https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.2-pyhd8ed1ab_0.conda#9c265afcec13eb6e844ae51b4a4b52ad https://conda.anaconda.org/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda#96a02a5c1a65470a7e4eedb644c872fd @@ -96,7 +96,7 @@ https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381b https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda#a22d1fd9bf98827e280a02875d9a007a https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda#ea8a6c3256897cc31263de9f455e25d9 -https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhd8ed1ab_0.conda#fcac5929097ba1f2a0e5b6ecaa13b253 +https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda#61b8078a0905b12529abc622406cb62c https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/colorlog-6.10.1-pyh707e725_0.conda#33e96df3785bf61676ffee387e5a19e5 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda#4c2a8fef270f6c69591889b93f9f55c1 @@ -148,7 +148,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.cond https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda#30cd29cb87d819caead4d55184c1d115 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py311h03d9500_1.conda#3912e4373de46adafd8f1e97e4bd166b -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.12.0-py311h3778330_0.conda#4ef5919a315f5c2834fc8da49044156d +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.0-py311h3778330_0.conda#95294f5480dae437d7c15d40238c9b1c https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda#8e662bd460bda79b1ea39194e3c4c9ab https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.61.0-py311h3778330_0.conda#f5ee391df23b7f50676ebe79fc53ee03 @@ -171,16 +171,16 @@ https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.35.4-pyhd8ed1ab_0.co https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.0-pyhcf101f3_0.conda#9958d4a1ee7e9c768fe8f4fb51bd07ea https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h0372a8f_2.conda#c85f7b94f099fddb08358e0997dded95 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py311hdf67eae_3.conda#c4e2f4d5193e55a70bb67a2aa07006ae -https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.11.0-pyhcf101f3_0.conda#91549f296c15ef7b49ee6600e7c934c1 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.12.0-pyhcf101f3_1.conda#cc7b371edd70319942c802c7d828a428 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a04073db11c2c86c555fb088acc8f8c1 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py311h0372a8f_2.conda#487756753716efba090d06c71fb73eb6 -https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.1-pyhcf101f3_0.conda#fa7f71faa234947d9c520f89b4bda1a2 +https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda#2b694bad8a50dc2f712f5368de866480 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.3-py311h1e13796_1.conda#e1947291b713cb0afa949e1bcda1f935 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0.conda#e2e4d7094d0580ccd62e2a41947444f3 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py311h8a92878_2.conda#b37c338ff0f69883188c9b3b127be059 https://conda.anaconda.org/conda-forge/noarch/tox-4.32.0-pyhcf101f3_0.conda#1b49a3b817df5c88742219c4d6e5ee57 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hdf67eae_6.conda#57e703b0057f992687fb9ad154dc48e4 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.0-pyhd8ed1ab_0.conda#de7372f43e63ff0876b4023b79b55e95 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.1-pyhd8ed1ab_0.conda#fb84f0f6ee8a0ad67213cd1bea98bf5b https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py311haee01d2_1.conda#ca45bfd4871af957aaa5035593d5efd2 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py311h0372a8f_1.conda#ef8650a6059a907122d59a740207f50e https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.44.0-h83bc92c_0.conda#2d37fd4ccfd98453a02a278e4112da39 @@ -198,7 +198,7 @@ https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.0-pyha770c72_0.conda#af8d4882203bccefec6f1aeed70030c6 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.44.0-py311h0372a8f_1.conda#c5a5fef7f068abe2858a89ddf19e5a79 https://conda.anaconda.org/conda-forge/noarch/iris-3.14.1-pyha770c72_0.conda#0b6f532e907ce57be6905bd6d44fbe71 -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2025.12.2-pyhd8ed1ab_0.conda#4a4f766ea1e62fae6f7513999d76a460 +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2025.12.5-pyhd8ed1ab_0.conda#281eb382cddac0cce7da25f98b747ae0 https://conda.anaconda.org/conda-forge/noarch/nox-2025.11.12-pyhcf101f3_0.conda#ae74047e4fe04ff7760d9529c49b7475 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index b395558d..3be1b413 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -4,28 +4,28 @@ @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda#c3efd25ac4d74b1584d2f7a57195ddf1 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h8577fbf_1.conda#e4e8496b68cf5f25e76fbe67f3856550 https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda#f0991f0f84902f6b6009b4d2350a83aa https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_15.conda#a90d6983da0757f4c09bb8fcfaf34e71 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda#26c46f90d0e727e95c6c9498a33a09f3 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_15.conda#a5d86b0496174a412d531eac03af9174 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_16.conda#6d0363467e6ed84f11435eb309f2ff06 https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda#791365c5f65975051e4e017b5da3abf5 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda#51a19bba1b8ebfb60df25cde030b7ebc -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda#920bb03579f15389b9e512095ad995b7 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda#72c8fd1af66bd67bf580645b426513ed https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda#6c77a605a7a689d17d4819c0f8ac9a00 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda#8b09ae86839581147ef2e5c5e229d164 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda#35f29eec58405aaf55e01cb470d8c26a -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_15.conda#7b742943660c5173bb6a5c823021c9a0 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_15.conda#356b7358fcd6df32ad50d07cdfadd27d +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_16.conda#5a68259fac2da8f2ee6f7bfe49c9eb8b +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_16.conda#39183d4e0c05609fd65f130633194e37 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda#8397539e3a0bbd1695584fb4f927485a https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_15.conda#fccfb26375ec5e4a2192dee6604b6d02 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda#68f68355000ec3f1d6f26ea13e8f525f https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-h5347b49_1.conda#41f5c09a211985c3ce642d60721e7c3e https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 @@ -43,12 +43,12 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.co https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda#4ffbb341c8b616aa2494b6afb26a0c5f https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_15.conda#7deffdc77cda3d2bbc9c558efa33d3ed +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_16.conda#40d9b534410403c821ff64f00d0adc22 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.51-h421ea60_0.conda#d8b81203d08435eb999baa249427884e +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.53-h421ea60_0.conda#00d4e66b1f746cb14944cad23fffb405 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.1-h0c1763c_0.conda#2e1b84d273b01835256e53fd938de355 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_15.conda#20a8584ff8677ac9d724345b9d4eb757 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_16.conda#1b3152694d236cf233b76b8c56bf0eae https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc @@ -79,7 +79,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.co https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda#8ccf913aaba749a5496c17629d859ed1 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-4_h4a7cf45_openblas.conda#14ff9fdfbd8bd590fca383b995470711 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda#01e149d4a53185622dc2e788281961f2 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_1.conda#117499f93e892ea1e57fdca16c2e8351 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda#f4084e4e6577797150f9b04a4560ceb0 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd https://conda.anaconda.org/conda-forge/linux-64/python-3.12.12-hd63d673_1_cpython.conda#5c00c8cea14ee8d02941cab9121dce41 @@ -88,7 +88,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0. https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda#8f37c8fb7116a18da04e52fa9e2c8df9 https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda#537296d57ea995666c68c821b00e360b -https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.1.0-py312h90b7ffd_1.conda#31f7139cac9bd11e04d71d65be3158ef +https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.2.0-py312h90b7ffd_0.conda#9fc7e65938c0e4b2658631b8bfd380e8 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py312hdb49522_1.conda#64088dffd7413a2dd557ce837b4cbbdb https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.2-pyhd8ed1ab_0.conda#9c265afcec13eb6e844ae51b4a4b52ad https://conda.anaconda.org/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda#96a02a5c1a65470a7e4eedb644c872fd @@ -96,7 +96,7 @@ https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381b https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda#a22d1fd9bf98827e280a02875d9a007a https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda#ea8a6c3256897cc31263de9f455e25d9 -https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhd8ed1ab_0.conda#fcac5929097ba1f2a0e5b6ecaa13b253 +https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda#61b8078a0905b12529abc622406cb62c https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/colorlog-6.10.1-pyh707e725_0.conda#33e96df3785bf61676ffee387e5a19e5 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda#4c2a8fef270f6c69591889b93f9f55c1 @@ -148,7 +148,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.cond https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda#30cd29cb87d819caead4d55184c1d115 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py312h460c074_1.conda#648ee28dcd4e07a1940a17da62eccd40 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.12.0-py312h8a5da7c_0.conda#4ecb5e03c7d50c4d0fe61045f6770130 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.0-py312h8a5da7c_0.conda#da396284d1f498e20b4377478dbb830c https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda#8e662bd460bda79b1ea39194e3c4c9ab https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.61.0-py312h8a5da7c_0.conda#a214816edb28136aabcfad864b3a445b @@ -171,16 +171,16 @@ https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.35.4-pyhd8ed1ab_0.co https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.0-pyhcf101f3_0.conda#9958d4a1ee7e9c768fe8f4fb51bd07ea https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312h4f23490_2.conda#ff4b5976814bc00861f962276c8fb87f https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312hd9148b4_3.conda#86cf7a7d861b79d38e3f0e5097e4965b -https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.11.0-pyhcf101f3_0.conda#91549f296c15ef7b49ee6600e7c934c1 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.12.0-pyhcf101f3_1.conda#cc7b371edd70319942c802c7d828a428 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a04073db11c2c86c555fb088acc8f8c1 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h4f23490_2.conda#cec5bc5f7d374f8f8095f8e28e31f6cb -https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.1-pyhcf101f3_0.conda#fa7f71faa234947d9c520f89b4bda1a2 +https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda#2b694bad8a50dc2f712f5368de866480 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.3-py312h7a1785b_1.conda#c6e0e1f1d9ac014a980574cfe8caa25f https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0.conda#e2e4d7094d0580ccd62e2a41947444f3 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py312h383787d_2.conda#69e400d3deca12ee7afd4b73a5596905 https://conda.anaconda.org/conda-forge/noarch/tox-4.32.0-pyhcf101f3_0.conda#1b49a3b817df5c88742219c4d6e5ee57 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312hd9148b4_6.conda#f30ece80e76f9cc96e30cc5c71d2818e -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.0-pyhd8ed1ab_0.conda#de7372f43e63ff0876b4023b79b55e95 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.1-pyhd8ed1ab_0.conda#fb84f0f6ee8a0ad67213cd1bea98bf5b https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py312h5253ce2_1.conda#02738ff9855946075cbd1b5274399a41 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py312h4f23490_1.conda#ac0a1a874ce9e3f8940a3a908ff74da9 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.44.0-h83bc92c_0.conda#2d37fd4ccfd98453a02a278e4112da39 @@ -198,7 +198,7 @@ https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.0-pyha770c72_0.conda#af8d4882203bccefec6f1aeed70030c6 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.44.0-py312h4f23490_1.conda#eea306a68c483e1305381130b35a09ff https://conda.anaconda.org/conda-forge/noarch/iris-3.14.1-pyha770c72_0.conda#0b6f532e907ce57be6905bd6d44fbe71 -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2025.12.2-pyhd8ed1ab_0.conda#4a4f766ea1e62fae6f7513999d76a460 +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2025.12.5-pyhd8ed1ab_0.conda#281eb382cddac0cce7da25f98b747ae0 https://conda.anaconda.org/conda-forge/noarch/nox-2025.11.12-pyhcf101f3_0.conda#ae74047e4fe04ff7760d9529c49b7475 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff From c3f90404b41aedcfade2992c26c8461e22e4f572 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Wed, 17 Dec 2025 16:28:05 +0000 Subject: [PATCH 526/583] Refactor: move grib1 legacy code into its own submodule. (#738) * Refactor: move grib1 legacy code into its own submodule. * Fix doctests. * Replace dev-maintained api rst files with sphinx-autoapi; further docs fixes. * Attempt to satisfy sphinx-doctest. * Use sphinx.ext.apidoc: replaces sphinxcontrib.apidoc, api within main build -> works in RTD, requires no install. * Align testsetup/cleanup secs with other usages (though won't work with ncdata-style doctest runner). * Turn off pytest auto doctests. * Added unit tests for loading control. * Fix test to accept different error message for older Python. * Further refactor/rename (sigh). * Remove unneeded test skip: works when run with eccodes 2.44.0. --- .gitignore | 1 + docs/Makefile | 1 + docs/conf.py | 26 +- docs/index.rst | 11 +- .../grib_phenom_translation.rst | 23 - docs/ref/iris_grib.rst | 24 - docs/ref/message/message.rst | 17 - docs/{ref => }/release_notes.rst | 0 noxfile.py | 3 +- src/iris_grib/__init__.py | 803 +---- src/iris_grib/_grib1_legacy/__init__.py | 8 + .../grib1_load_rules.py} | 19 +- src/iris_grib/_grib1_legacy/grib_wrapper.py | 695 ++++ src/iris_grib/_grib2_convert.py | 2915 ++++++++++++++++ src/iris_grib/_load_convert.py | 2925 +---------------- src/iris_grib/_save_rules.py | 2 +- .../integration/save_rules/test_grib_save.py | 2 +- .../grib1_load_rules/test_grib1_convert.py | 4 +- .../test_grib1_load_translations.py | 14 +- .../__init__.py | 2 +- .../test__hindcast_fix.py | 8 +- .../test_bitmap_section.py | 4 +- .../test_calculate_increment.py | 4 +- .../test_convert.py | 6 +- .../test_data_cutoff.py | 8 +- .../test_data_representation_section.py | 4 +- .../test_ellipsoid.py | 4 +- .../test_ellipsoid_geometry.py | 4 +- .../test_ensemble_identifier.py | 6 +- .../test_forecast_period_coord.py | 4 +- .../test_generating_process.py | 6 +- .../test_grib2_convert.py | 8 +- .../test_grid_definition_template_0_and_1.py | 6 +- .../test_grid_definition_template_10.py | 6 +- .../test_grid_definition_template_12.py | 8 +- .../test_grid_definition_template_140.py | 8 +- .../test_grid_definition_template_20.py | 8 +- .../test_grid_definition_template_30.py | 8 +- .../test_grid_definition_template_40.py | 8 +- .../test_grid_definition_template_4_and_5.py | 8 +- .../test_grid_definition_template_5.py | 8 +- .../test_grid_definition_template_90.py | 8 +- .../test_other_time_coord.py | 4 +- .../test_product_definition_section.py | 12 +- .../test_product_definition_template_0.py | 12 +- .../test_product_definition_template_1.py | 8 +- .../test_product_definition_template_10.py | 8 +- .../test_product_definition_template_11.py | 8 +- .../test_product_definition_template_15.py | 10 +- .../test_product_definition_template_31.py | 10 +- .../test_product_definition_template_32.py | 14 +- .../test_product_definition_template_40.py | 6 +- .../test_product_definition_template_5.py | 8 +- .../test_product_definition_template_6.py | 8 +- .../test_product_definition_template_8.py | 6 +- .../test_product_definition_template_9.py | 8 +- .../test_projection_centre.py | 4 +- .../test_reference_time_coord.py | 4 +- .../test_resolution_flags.py | 4 +- .../test_satellite_common.py | 6 +- .../test_scanning_mode.py | 4 +- .../test_statistical_cell_method.py | 4 +- .../test_statistical_forecast_period_coord.py | 6 +- .../test_time_range_unit.py | 4 +- .../test_translate_phenomenon.py | 6 +- .../test_unscale.py | 4 +- .../test_validity_time_coord.py | 4 +- .../test_vertical_coords.py | 10 +- .../tests/unit/test_Grib1LoadingMode.py | 90 + src/iris_grib/tests/unit/test_GribWrapper.py | 19 +- .../tests/unit/test__load_generate.py | 4 +- 71 files changed, 4083 insertions(+), 3849 deletions(-) delete mode 100644 docs/ref/grib_phenom_translation/grib_phenom_translation.rst delete mode 100644 docs/ref/iris_grib.rst delete mode 100644 docs/ref/message/message.rst rename docs/{ref => }/release_notes.rst (100%) create mode 100644 src/iris_grib/_grib1_legacy/__init__.py rename src/iris_grib/{_grib1_load_rules.py => _grib1_legacy/grib1_load_rules.py} (95%) create mode 100644 src/iris_grib/_grib1_legacy/grib_wrapper.py create mode 100644 src/iris_grib/_grib2_convert.py rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/__init__.py (94%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test__hindcast_fix.py (85%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_bitmap_section.py (89%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_calculate_increment.py (86%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_convert.py (91%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_data_cutoff.py (88%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_data_representation_section.py (89%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_ellipsoid.py (96%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_ellipsoid_geometry.py (87%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_ensemble_identifier.py (90%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_forecast_period_coord.py (90%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_generating_process.py (91%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_grib2_convert.py (92%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_grid_definition_template_0_and_1.py (96%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_grid_definition_template_10.py (93%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_grid_definition_template_12.py (96%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_grid_definition_template_140.py (92%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_grid_definition_template_20.py (92%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_grid_definition_template_30.py (92%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_grid_definition_template_40.py (96%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_grid_definition_template_4_and_5.py (94%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_grid_definition_template_5.py (93%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_grid_definition_template_90.py (97%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_other_time_coord.py (97%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_product_definition_section.py (91%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_product_definition_template_0.py (90%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_product_definition_template_1.py (92%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_product_definition_template_10.py (89%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_product_definition_template_11.py (93%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_product_definition_template_15.py (91%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_product_definition_template_31.py (84%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_product_definition_template_32.py (79%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_product_definition_template_40.py (86%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_product_definition_template_5.py (95%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_product_definition_template_6.py (89%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_product_definition_template_8.py (93%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_product_definition_template_9.py (93%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_projection_centre.py (87%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_reference_time_coord.py (94%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_resolution_flags.py (88%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_satellite_common.py (92%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_scanning_mode.py (91%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_statistical_cell_method.py (97%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_statistical_forecast_period_coord.py (92%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_time_range_unit.py (90%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_translate_phenomenon.py (92%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_unscale.py (93%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_validity_time_coord.py (94%) rename src/iris_grib/tests/unit/{load_convert => grib2_convert}/test_vertical_coords.py (97%) create mode 100644 src/iris_grib/tests/unit/test_Grib1LoadingMode.py diff --git a/.gitignore b/.gitignore index 8b7d2cc5..f12351f4 100644 --- a/.gitignore +++ b/.gitignore @@ -81,6 +81,7 @@ instance/ # Sphinx documentation docs/_build/ +docs/api/ # PyBuilder .pybuilder/ diff --git a/docs/Makefile b/docs/Makefile index d9ed9c70..3dfa5d6c 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -55,6 +55,7 @@ help: .PHONY: clean clean: rm -rf $(BUILDDIR)/* + rm -rf ./api .PHONY: html html: diff --git a/docs/conf.py b/docs/conf.py index 395a8ff9..861e0ff6 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -13,13 +13,8 @@ # serve to show the default. from importlib.metadata import version as get_version -import sys -import os +from pathlib import Path -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -sys.path.append(os.path.abspath("..")) # -- General configuration ------------------------------------------------ @@ -30,6 +25,7 @@ # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ + "sphinx.ext.apidoc", # included AS WELL AS autodoc : adds api in main build "sphinx.ext.autodoc", "sphinx.ext.doctest", "sphinx.ext.intersphinx", @@ -41,7 +37,7 @@ # The suffix(es) of source filenames. # You can specify multiple suffix as a list of string: # source_suffix = ['.rst', '.md'] -source_suffix = ".rst" +source_suffix = {".rst": "restructuredtext"} # The encoding of source files. # source_encoding = 'utf-8-sig' @@ -306,3 +302,19 @@ "python": ("https://docs.python.org/3/", None), "iris": ("https://scitools-iris.readthedocs.io/en/stable/", None), } + +# -- apidoc extension --------------------------------------------------------- +# See https://www.sphinx-doc.org/en/master/usage/extensions/apidoc.html +docs_path = Path(__file__).parent.absolute() +main_module_rootpath = (docs_path.parent / "src" / "iris_grib").absolute() +moduledir_str = str(main_module_rootpath) +destpath_str = str(docs_path / "api") +moduletestdir_str = str(main_module_rootpath / "tests") +apidoc_modules = [ + { + "path": moduledir_str, + "destination": "./api", + "exclude_patterns": [moduletestdir_str], + "module_first": True, + }, +] diff --git a/docs/index.rst b/docs/index.rst index 63f722ea..d015c639 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -239,20 +239,17 @@ Releases For recent changes, see :ref:`release_notes` . -Indices and tables +API Documentation ================== -Contents: - .. toctree:: - :maxdepth: 3 + :maxdepth: 4 - ref/iris_grib - ref/message/message - ref/grib_phenom_translation/grib_phenom_translation + api/modules See also: +--------- * :ref:`genindex` * :ref:`modindex` diff --git a/docs/ref/grib_phenom_translation/grib_phenom_translation.rst b/docs/ref/grib_phenom_translation/grib_phenom_translation.rst deleted file mode 100644 index d1f34c5a..00000000 --- a/docs/ref/grib_phenom_translation/grib_phenom_translation.rst +++ /dev/null @@ -1,23 +0,0 @@ -iris_grib.grib_phenom_translation -================================= - -In this module: - - * :py:obj:`grib1_phenom_to_cf_info` - * :py:obj:`grib2_phenom_to_cf_info` - * :py:obj:`cf_phenom_to_grib2_info` - * :py:obj:`GRIBCode` - - -.. currentmodule:: iris_grib.grib_phenom_translation - -.. automodule:: iris_grib.grib_phenom_translation - -.. autofunction:: iris_grib.grib_phenom_translation.grib1_phenom_to_cf_info - -.. autofunction:: iris_grib.grib_phenom_translation.grib2_phenom_to_cf_info - -.. autofunction:: iris_grib.grib_phenom_translation.cf_phenom_to_grib2_info - -.. autoclass:: iris_grib.grib_phenom_translation.GRIBCode - :members: diff --git a/docs/ref/iris_grib.rst b/docs/ref/iris_grib.rst deleted file mode 100644 index e78c322e..00000000 --- a/docs/ref/iris_grib.rst +++ /dev/null @@ -1,24 +0,0 @@ -iris_grib -========= - -In this module: - - * :py:obj:`load_cubes` - * :py:obj:`save_grib2` - * :py:obj:`load_pairs_from_fields` - * :py:obj:`save_pairs_from_cube` - * :py:obj:`save_messages` - -.. currentmodule:: iris_grib - -.. automodule:: iris_grib - -.. autofunction:: iris_grib.load_cubes - -.. autofunction:: iris_grib.save_grib2 - -.. autofunction:: iris_grib.load_pairs_from_fields - -.. autofunction:: iris_grib.save_pairs_from_cube - -.. autofunction:: iris_grib.save_messages diff --git a/docs/ref/message/message.rst b/docs/ref/message/message.rst deleted file mode 100644 index 7af17341..00000000 --- a/docs/ref/message/message.rst +++ /dev/null @@ -1,17 +0,0 @@ -iris_grib.message -================= - -In this module: - - * :py:obj:`GribMessage` - * :py:obj:`Section` - -.. currentmodule:: iris_grib.message - -.. automodule:: iris_grib.message - -.. autoclass:: iris_grib.message.GribMessage - :members: - -.. autoclass:: iris_grib.message.Section - :members: diff --git a/docs/ref/release_notes.rst b/docs/release_notes.rst similarity index 100% rename from docs/ref/release_notes.rst rename to docs/release_notes.rst diff --git a/noxfile.py b/noxfile.py index 59e1dc01..29fc262c 100755 --- a/noxfile.py +++ b/noxfile.py @@ -285,8 +285,7 @@ def tests(session: nox.sessions.Session, iris_source: str): run_args = [ "pytest", - "--pyargs", - "iris_grib", + "src/iris_grib/tests", # NB *don't* trigger doctests: they are done separately ] if "-c" in session.posargs or "--coverage" in session.posargs: diff --git a/src/iris_grib/__init__.py b/src/iris_grib/__init__.py index aba2a679..41d1bd48 100644 --- a/src/iris_grib/__init__.py +++ b/src/iris_grib/__init__.py @@ -8,22 +8,16 @@ """ -import datetime -import math # for fmod +import contextlib -import cartopy.crs as ccrs -import cf_units import eccodes import numpy as np -import numpy.ma as ma +import threading # NOTE: careful here, to avoid circular imports (as iris imports grib) import iris # noqa: F401 -from iris._lazy_data import as_lazy_data -import iris.coord_systems as coord_systems -from iris.exceptions import TranslationError, NotYetImplementedError +from iris.exceptions import TranslationError -from . import grib_phenom_translation as gptx from . import _save_rules from ._load_convert import convert as load_convert from .message import GribMessage @@ -35,6 +29,8 @@ __version__ = "unknown" __all__ = [ + "GRIB1_LOADING_MODE", + "Grib1LoadingMode", "load_cubes", "load_pairs_from_fields", "save_grib2", @@ -43,113 +39,135 @@ ] -CENTRE_TITLES = { - "egrr": "U.K. Met Office - Exeter", - "ecmf": "European Centre for Medium Range Weather Forecasts", - "rjtd": "Tokyo, Japan Meteorological Agency", - "55": "San Francisco", - "kwbc": ( - "US National Weather Service, National Centres for Environmental Prediction" - ), -} - -TIME_RANGE_INDICATORS = { - 0: "none", - 1: "none", - 3: "time mean", - 4: "time sum", - 5: "time _difference", - 10: "none", - # TODO #567 Further exploration of following mappings - 51: "time mean", - 113: "time mean", - 114: "time sum", - 115: "time mean", - 116: "time sum", - 117: "time mean", - 118: "time _covariance", - 123: "time mean", - 124: "time sum", - 125: "time standard_deviation", -} - -PROCESSING_TYPES = { - 0: "time mean", - 1: "time sum", - 2: "time maximum", - 3: "time minimum", - 4: "time _difference", - 5: "time _root mean square", - 6: "time standard_deviation", - 7: "time _convariance", - 8: "time _difference", - 9: "time _ratio", -} - -TIME_CODES_EDITION1 = { - 0: ("minutes", 60), - 1: ("hours", 60 * 60), - 2: ("days", 24 * 60 * 60), - # NOTE: do *not* support calendar-dependent units at all. - # So the following possible keys remain unsupported: - # 3: 'months', - # 4: 'years', - # 5: 'decades', - # 6: '30 years', - # 7: 'century', - 10: ("3 hours", 3 * 60 * 60), - 11: ("6 hours", 6 * 60 * 60), - 12: ("12 hours", 12 * 60 * 60), - 13: ("15 minutes", 15 * 60), - 14: ("30 minutes", 30 * 60), - 254: ("seconds", 1), -} - -unknown_string = "???" - - -class GribDataProxy: - """A reference to the data payload of a single Grib message.""" - - __slots__ = ("dtype", "offset", "path", "shape") - - def __init__(self, shape, dtype, path, offset): - self.shape = shape - self.dtype = dtype - self.path = path - self.offset = offset +class Grib1LoadingMode(threading.local): + """ + A control object selecting between "legacy" and "future" GRIB1 loading methods. + + This is designed to provide the singleton :data:`iris_grib.GRIB1_LOADING_MODE` + object. It provides :meth:`set` and :meth:`context` methods to control a binary + switch to enable either the new, recommended "future" mode, or the legacy code. + + The "legacy" GRIB1 loading mode is based on the + :class:`iris_grib._grib1_legacy.GribWrapper`, and makes extensive use of ecCodes + 'computed keys' facilities for a 'best efforts' approach to loading which does not + rigorously test all metadata to interpret fields. + The newer "strict" loading, by contrast, is based on the + :class:`iris_grib.message.GribMessage` class and will raise errors when encountering + any unsupported or unrecognised metadata elements : this aligns it with the code + which has long since been used to load GRIB2 data. + + .. warning:: + + The legacy implementation is now deprecated and will be removed in due course. + However, for full backwards compatibility, the 'legacy' mode is + **still the default**. + """ + + def __init__(self, *, legacy=True): + self.set(legacy=legacy) @property - def ndim(self): - return len(self.shape) + def use_legacy_grib1_loading(self): + """Tell whether "legacy" GRIB1 loading is in use. + + N.B. read-only property. Use :meth:`set` to change. + """ + return self._use_legacy_grib1_loading + + def set(self, *, legacy): + """ + Permanently set the GRIB1 loading mode. + + Args: + + * legacy : bool + Control whether "legacy" or "future" GRIB1 loading mode is used, for the + duration of the context block. + This keyword is required (must be present, and not positional). + + Example: + + .. testsetup:: + + import iris_grib + try: + from iris.tests._shared_utils import get_data_path + except ImportError: + from iris.tests import get_data_path + # this is a bit of a cheat, as it doesn't include any GRIB1 data + path = get_data_path(("GRIB", "global_t", "global.grib2")) + old_legacy = iris_grib.GRIB1_LOADING_MODE.use_legacy_grib1_loading + + .. doctest:: + + >>> iris_grib.GRIB1_LOADING_MODE.set(legacy=False) + >>> cubes = iris_grib.load_cubes(path) + + .. testcleanup:: + + iris_grib.GRIB1_LOADING_MODE.set(legacy=old_legacy) + + .. note:: + + The legacy implementation is now deprecated and will be removed in due + course. However, for full backwwards compatibility, 'legacy' mode is still + the default. + + You are advised to use ``iris_grib.GRIB1_LOADING_MODE.set(legacy=False)`` + at the top of the main script. + + .. warning:: + + Do not set/unset this dynamically to control loading mode for the duration + of some lines of code : this can cause incorrect operation in threaded + loading operations. For dynamic control, use :meth:`context` instead. + + """ + self._use_legacy_grib1_loading = bool(legacy) + + @contextlib.contextmanager + def context(self, *, legacy): + """ + Set the GRIB1 loading mode which applies during a context block. + + Args: + + * legacy : bool + Control whether "legacy" or "future" GRIB1 loading mode is used, for the + duration of the context block. + This keyword is required (must be present, and not positional). + + Example: + + .. testsetup:: + + import iris_grib + try: + from iris.tests._shared_utils import get_data_path + except ImportError: + from iris.tests import get_data_path + path = get_data_path(("GRIB", "global_t", "global.grib2")) + - def __getitem__(self, keys): - with open(self.path, "rb") as grib_fh: - grib_fh.seek(self.offset) - grib_message = eccodes.codes_new_from_file( - grib_fh, eccodes.CODES_PRODUCT_GRIB - ) - data = _message_values(grib_message, self.shape) - eccodes.codes_release(grib_message) + .. doctest:: - result = data.__getitem__(keys) + >>> with iris_grib.GRIB1_LOADING_MODE.context(legacy=False): + ... cubes = iris_grib.load_cubes(path) - return result + """ + old_mode = self._use_legacy_grib1_loading + try: + self._use_legacy_grib1_loading = legacy + yield + finally: + self._use_legacy_grib1_loading = old_mode def __repr__(self): - msg = ( - "<{self.__class__.__name__} shape={self.shape} " - "dtype={self.dtype!r} " - "path={self.path!r} offset={self.offset}>" - ) - return msg.format(self=self) + return f"GRIB1_LOADING_MODE(legacy={self.use_legacy_grib1_loading})" - def __getstate__(self): - return {attr: getattr(self, attr) for attr in self.__slots__} - def __setstate__(self, state): - for key, value in state.items(): - setattr(self, key, value) +#: a global singleton object controlling the way in which GRIB1 data is loaded. +GRIB1_LOADING_MODE = Grib1LoadingMode() # Utility routines for the use of dask 'meta' in wrapping proxies @@ -183,573 +201,20 @@ def _make_dask_meta(shape, dtype, is_masked=True): return meta -class GribWrapper: - """Contains a pygrib object plus some extra keys of our own. - - The class :class:`iris_grib.message.GribMessage` - provides alternative means of working with GRIB message instances. - - """ - - def __init__(self, grib_message, grib_fh=None, has_bitmap=True): - """Store the grib message and compute our extra keys.""" - self.grib_message = grib_message - - if self.edition != 1: - emsg = "GRIB edition {} is not supported by {!r}." - raise TranslationError(emsg.format(self.edition, type(self).__name__)) - - deferred = grib_fh is not None - - # Store the file pointer and message length from the current - # grib message before it's changed by calls to the grib-api. - if deferred: - offset = eccodes.codes_get_message_offset(grib_message) - - # Initialise the key-extension dictionary. - # NOTE: this attribute *must* exist, or the the __getattr__ overload - # can hit an infinite loop. - self.extra_keys = {} - self._confirm_in_scope() - self._compute_extra_keys() - - # Calculate the data payload shape. - shape = (eccodes.codes_get_long(grib_message, "numberOfValues"),) - - if not self.gridType.startswith("reduced"): - ni, nj = self.Ni, self.Nj - j_fast = eccodes.codes_get_long(grib_message, "jPointsAreConsecutive") - shape = (nj, ni) if j_fast == 0 else (ni, nj) - - if deferred: - # Wrap the reference to the data payload within the data proxy - # in order to support deferred data loading. - dtype = np.dtype(float) # Use default dtype for python float - proxy = GribDataProxy(shape, dtype, grib_fh.name, offset) - as_lazy_kwargs = {} - if _ASLAZYDATA_NEEDS_META: - meta = _make_dask_meta(shape, dtype, is_masked=has_bitmap) - as_lazy_kwargs["meta"] = meta - self._data = as_lazy_data(proxy, **as_lazy_kwargs) - else: - self.data = _message_values(grib_message, shape) - - def _confirm_in_scope(self): - """Ensure we have a grib flavour that we choose to support.""" - - # forbid alternate row scanning - # (uncommon entry from GRIB2 flag table 3.4, also in GRIB1) - if self.alternativeRowScanning == 1: - raise ValueError("alternativeRowScanning == 1 not handled.") - - def __getattr__(self, key): - """Return a grib key, or one of our extra keys.""" - - # is it in the grib message? - try: - # we just get as the type of the "values" - # array...special case here... - if key in ["values", "pv", "latitudes", "longitudes"]: - res = eccodes.codes_get_double_array(self.grib_message, key) - elif key in ("typeOfFirstFixedSurface", "typeOfSecondFixedSurface"): - res = np.int32(eccodes.codes_get_long(self.grib_message, key)) - else: - key_type = eccodes.codes_get_native_type(self.grib_message, key) - if key_type is int: - res = np.int32(eccodes.codes_get_long(self.grib_message, key)) - elif key_type is float: - # Because some computer keys are floats, like - # longitudeOfFirstGridPointInDegrees, a float32 - # is not always enough... - res = np.float64(eccodes.codes_get_double(self.grib_message, key)) - elif key_type is str: - res = eccodes.codes_get_string(self.grib_message, key) - else: - emsg = "Unknown type for {} : {}" - raise ValueError(emsg.format(key, str(key_type))) - except eccodes.CodesInternalError: - res = None - - # ...or is it in our list of extras? - if res is None: - if key in self.extra_keys: - res = self.extra_keys[key] - else: - # must raise an exception for the hasattr() mechanism to work - raise AttributeError("Cannot find GRIB key %s" % key) - - return res - - def _timeunit_detail(self): - """Return the (string, seconds) describing the message time unit.""" - unit_code = self.indicatorOfUnitOfTimeRange - if unit_code not in TIME_CODES_EDITION1: - message = ( - "Unhandled time unit for forecast " - "indicatorOfUnitOfTimeRange : " + str(unit_code) - ) - raise NotYetImplementedError(message) - return TIME_CODES_EDITION1[unit_code] - - def _timeunit_string(self): - """Get the udunits string for the message time unit.""" - return self._timeunit_detail()[0] - - def _timeunit_seconds(self): - """Get the number of seconds in the message time unit.""" - return self._timeunit_detail()[1] - - def _compute_extra_keys(self): - """Compute our extra keys.""" - global unknown_string - - self.extra_keys = {} - forecastTime = self.startStep - - # regular or rotated grid? - try: - longitudeOfSouthernPoleInDegrees = self.longitudeOfSouthernPoleInDegrees - latitudeOfSouthernPoleInDegrees = self.latitudeOfSouthernPoleInDegrees - except AttributeError: - longitudeOfSouthernPoleInDegrees = 0.0 - latitudeOfSouthernPoleInDegrees = 90.0 - - centre = eccodes.codes_get_string(self.grib_message, "centre") - - # default values - self.extra_keys = { - "_referenceDateTime": -1.0, - "_phenomenonDateTime": -1.0, - "_periodStartDateTime": -1.0, - "_periodEndDateTime": -1.0, - "_levelTypeName": unknown_string, - "_levelTypeUnits": unknown_string, - "_firstLevelTypeName": unknown_string, - "_firstLevelTypeUnits": unknown_string, - "_firstLevel": -1.0, - "_secondLevelTypeName": unknown_string, - "_secondLevel": -1.0, - "_originatingCentre": unknown_string, - "_forecastTime": None, - "_forecastTimeUnit": unknown_string, - "_coord_system": None, - "_x_circular": False, - "_x_coord_name": unknown_string, - "_y_coord_name": unknown_string, - # These are here to avoid repetition in the rules - # files, and reduce the very long line lengths. - "_x_points": None, - "_y_points": None, - "_cf_data": None, - "_grib_code": None, - } - - # cf phenomenon translation - # Get centre code (N.B. self.centre has default type = string) - centre_number = eccodes.codes_get_long(self.grib_message, "centre") - # Look for a known grib1-to-cf translation (or None). - cf_data = gptx.grib1_phenom_to_cf_info( - table2_version=self.table2Version, - centre_number=centre_number, - param_number=self.indicatorOfParameter, - ) - self.extra_keys["_cf_data"] = cf_data - - # Record the original parameter encoding - self.extra_keys["_grib_code"] = gptx.GRIBCode( - edition=1, - table_version=self.table2Version, - centre_number=centre_number, - number=self.indicatorOfParameter, - ) - - # reference date - self.extra_keys["_referenceDateTime"] = datetime.datetime( - int(self.year), - int(self.month), - int(self.day), - int(self.hour), - int(self.minute), - ) - - # forecast time with workarounds - self.extra_keys["_forecastTime"] = forecastTime - - # verification date - processingDone = self._get_processing_done() - # time processed? - if processingDone.startswith("time"): - validityDate = str(self.validityDate) - validityTime = "{:04}".format(int(self.validityTime)) - endYear = int(validityDate[:4]) - endMonth = int(validityDate[4:6]) - endDay = int(validityDate[6:8]) - endHour = int(validityTime[:2]) - endMinute = int(validityTime[2:4]) - - # fixed forecastTime in hours - self.extra_keys["_periodStartDateTime"] = self.extra_keys[ - "_referenceDateTime" - ] + datetime.timedelta(hours=int(forecastTime)) - self.extra_keys["_periodEndDateTime"] = datetime.datetime( - endYear, endMonth, endDay, endHour, endMinute - ) - else: - self.extra_keys["_phenomenonDateTime"] = self._get_verification_date() - - # originating centre - # TODO #574 Expand to include sub-centre - self.extra_keys["_originatingCentre"] = CENTRE_TITLES.get( - centre, "unknown centre %s" % centre - ) - - # forecast time unit as a cm string - # TODO #575 Do we want PP or GRIB style forecast delta? - self.extra_keys["_forecastTimeUnit"] = self._timeunit_string() - - # shape of the Earth - oblate_Earth = self.resolutionAndComponentFlags & 0b0100000 - if oblate_Earth: - # Earth assumed oblate spheroidal with size as determined by IAU in - # 1965 (6378.160 km, 6356.775 km, f = 1/297.0) - raise ValueError("Oblate Spheroidal Earth is not supported.") - else: - # Earth assumed spherical with radius 6367.47 km - geoid = coord_systems.GeogCS(semi_major_axis=6367470) - - gridType = eccodes.codes_get_string(self.grib_message, "gridType") - - if gridType in ["regular_ll", "regular_gg", "reduced_ll", "reduced_gg"]: - self.extra_keys["_x_coord_name"] = "longitude" - self.extra_keys["_y_coord_name"] = "latitude" - self.extra_keys["_coord_system"] = geoid - elif gridType == "rotated_ll": - # TODO: Confirm the translation from angleOfRotation to - # north_pole_lon (usually 0 for both) - self.extra_keys["_x_coord_name"] = "grid_longitude" - self.extra_keys["_y_coord_name"] = "grid_latitude" - southPoleLon = longitudeOfSouthernPoleInDegrees - southPoleLat = latitudeOfSouthernPoleInDegrees - self.extra_keys["_coord_system"] = coord_systems.RotatedGeogCS( - -southPoleLat, - math.fmod(southPoleLon + 180.0, 360.0), - self.angleOfRotation, - geoid, - ) - elif gridType == "polar_stereographic": - self.extra_keys["_x_coord_name"] = "projection_x_coordinate" - self.extra_keys["_y_coord_name"] = "projection_y_coordinate" - - if self.projectionCentreFlag == 0: - pole_lat = 90 - elif self.projectionCentreFlag == 1: - pole_lat = -90 - else: - raise TranslationError("Unhandled projectionCentreFlag") - - # Always load PolarStereographic - never Stereographic. - # Stereographic is a CF/Iris concept and not something described - # in GRIB. - # Note: I think the grib api defaults LaDInDegrees to 60 for grib1. - self.extra_keys["_coord_system"] = coord_systems.PolarStereographic( - pole_lat, - self.orientationOfTheGridInDegrees, - 0, - 0, - self.LaDInDegrees, - ellipsoid=geoid, - ) - - elif gridType == "lambert": - self.extra_keys["_x_coord_name"] = "projection_x_coordinate" - self.extra_keys["_y_coord_name"] = "projection_y_coordinate" - - flag_name = "projectionCenterFlag" - - if getattr(self, flag_name) == 0: - pole_lat = 90 - elif getattr(self, flag_name) == 1: - pole_lat = -90 - else: - raise TranslationError("Unhandled projectionCentreFlag") - - LambertConformal = coord_systems.LambertConformal - self.extra_keys["_coord_system"] = LambertConformal( - self.LaDInDegrees, - self.LoVInDegrees, - 0, - 0, - secant_latitudes=(self.Latin1InDegrees, self.Latin2InDegrees), - ellipsoid=geoid, - ) - else: - raise TranslationError("unhandled grid type: {}".format(gridType)) - - if gridType in ["regular_ll", "rotated_ll"]: - self._regular_longitude_common() - j_step = self.jDirectionIncrementInDegrees - if not self.jScansPositively: - j_step = -j_step - self._y_points = ( - np.arange(self.Nj, dtype=np.float64) * j_step - + self.latitudeOfFirstGridPointInDegrees - ) - - elif gridType in ["regular_gg"]: - # longitude coordinate is straight-forward - self._regular_longitude_common() - # get the distinct latitudes, and make sure they are sorted - # (south-to-north) and then put them in the right direction - # depending on the scan direction - latitude_points = eccodes.codes_get_double_array( - self.grib_message, "distinctLatitudes" - ).astype(np.float64) - latitude_points.sort() - if not self.jScansPositively: - # we require latitudes north-to-south - self._y_points = latitude_points[::-1] - else: - self._y_points = latitude_points - - elif gridType in ["polar_stereographic", "lambert"]: - # convert the starting latlon into meters - cartopy_crs = self.extra_keys["_coord_system"].as_cartopy_crs() - x1, y1 = cartopy_crs.transform_point( - self.longitudeOfFirstGridPointInDegrees, - self.latitudeOfFirstGridPointInDegrees, - ccrs.Geodetic(), - ) - - if not np.all(np.isfinite([x1, y1])): - raise TranslationError( - "Could not determine the first latitude" - " and/or longitude grid point." - ) - - self._x_points = x1 + self.DxInMetres * np.arange(self.Nx, dtype=np.float64) - self._y_points = y1 + self.DyInMetres * np.arange(self.Ny, dtype=np.float64) - - elif gridType in ["reduced_ll", "reduced_gg"]: - self._x_points = self.longitudes - self._y_points = self.latitudes - - else: - raise TranslationError("unhandled grid type") - - def _regular_longitude_common(self): - """Define a regular longitude dimension.""" - i_step = self.iDirectionIncrementInDegrees - if self.iScansNegatively: - i_step = -i_step - self._x_points = ( - np.arange(self.Ni, dtype=np.float64) * i_step - + self.longitudeOfFirstGridPointInDegrees - ) - if "longitude" in self.extra_keys["_x_coord_name"] and self.Ni > 1: - if _longitude_is_cyclic(self._x_points): - self.extra_keys["_x_circular"] = True - - def _get_processing_done(self): - """Determine the type of processing that was done on the data.""" - - processingDone = "unknown" - timeRangeIndicator = self.timeRangeIndicator - default = "time _grib1_process_unknown_%i" % timeRangeIndicator - processingDone = TIME_RANGE_INDICATORS.get(timeRangeIndicator, default) - - return processingDone - - def _get_verification_date(self): - reference_date_time = self._referenceDateTime - - # calculate start time - time_range_indicator = self.timeRangeIndicator - P1 = self.P1 - P2 = self.P2 - if time_range_indicator == 0: - # Forecast product valid at reference time + P1 P1>0), - # or Uninitialized analysis product for reference time (P1=0). - # Or Image product for reference time (P1=0) - time_diff = P1 - elif time_range_indicator == 1: - # Initialized analysis product for reference time (P1=0). - time_diff = P1 - elif time_range_indicator == 2: - # Product with a valid time ranging between reference time + P1 - # and reference time + P2 - time_diff = (P1 + P2) * 0.5 - elif time_range_indicator == 3: - # Average(reference time + P1 to reference time + P2) - time_diff = (P1 + P2) * 0.5 - elif time_range_indicator == 4: - # Accumulation (reference time + P1 to reference time + P2) - # product considered valid at reference time + P2 - time_diff = P2 - elif time_range_indicator == 5: - # Difference(reference time + P2 minus reference time + P1) - # product considered valid at reference time + P2 - time_diff = P2 - elif time_range_indicator == 10: - # P1 occupies octets 19 and 20; product valid at - # reference time + P1 - time_diff = P1 * 256 + P2 - elif time_range_indicator == 51: - # Climatological Mean Value: multiple year averages of - # quantities which are themselves means over some period of - # time (P2) less than a year. The reference time (R) indicates - # the date and time of the start of a period of time, given by - # R to R + P2, over which a mean is formed; N indicates the number - # of such period-means that are averaged together to form the - # climatological value, assuming that the N period-mean fields - # are separated by one year. The reference time indicates the - # start of the N-year climatology. N is given in octets 22-23 - # of the PDS. If P1 = 0 then the data averaged in the basic - # interval P2 are assumed to be continuous, i.e., all available - # data are simply averaged together. If P1 = 1 (the units of - # time - octet 18, code table 4 - are not relevant here) then - # the data averaged together in the basic interval P2 are valid - # only at the time (hour, minute) given in the reference time, - # for all the days included in the P2 period. The units of P2 - # are given by the contents of octet 18 and Table 4. - raise TranslationError( - "unhandled grib1 timeRangeIndicator = 51 (avg of avgs)" - ) - elif time_range_indicator == 113: - # Average of N forecasts (or initialized analyses); each - # product has forecast period of P1 (P1=0 for initialized - # analyses); products have reference times at intervals of P2, - # beginning at the given reference time. - time_diff = P1 - elif time_range_indicator == 114: - # Accumulation of N forecasts (or initialized analyses); each - # product has forecast period of P1 (P1=0 for initialized - # analyses); products have reference times at intervals of P2, - # beginning at the given reference time. - time_diff = P1 - elif time_range_indicator == 115: - # Average of N forecasts, all with the same reference time; - # the first has a forecast period of P1, the remaining - # forecasts follow at intervals of P2. - time_diff = P1 - elif time_range_indicator == 116: - # Accumulation of N forecasts, all with the same reference - # time; the first has a forecast period of P1, the remaining - # follow at intervals of P2. - time_diff = P1 - elif time_range_indicator == 117: - # Average of N forecasts, the first has a period of P1, the - # subsequent ones have forecast periods reduced from the - # previous one by an interval of P2; the reference time for - # the first is given in octets 13-17, the subsequent ones - # have reference times increased from the previous one by - # an interval of P2. Thus all the forecasts have the same - # valid time, given by the initial reference time + P1. - time_diff = P1 - elif time_range_indicator == 118: - # Temporal variance, or covariance, of N initialized analyses; - # each product has forecast period P1=0; products have - # reference times at intervals of P2, beginning at the given - # reference time. - time_diff = P1 - elif time_range_indicator == 123: - # Average of N uninitialized analyses, starting at the - # reference time, at intervals of P2. - time_diff = P1 - elif time_range_indicator == 124: - # Accumulation of N uninitialized analyses, starting at - # the reference time, at intervals of P2. - time_diff = P1 - else: - raise TranslationError( - "unhandled grib1 timeRangeIndicator = %i" % time_range_indicator - ) - - # Get the timeunit interval. - interval_secs = self._timeunit_seconds() - # Multiply by start-offset and convert to a timedelta. - # NOTE: a 'float' conversion is required here, as time_diff may be - # a numpy scalar, which timedelta will not accept. - interval_delta = datetime.timedelta(seconds=float(time_diff * interval_secs)) - # Return validity_time = (reference_time + start_offset*time_unit). - return reference_date_time + interval_delta - - @property - def bmdi(self): - # Not sure of any cases where GRIB provides a fill value. - # Default for fill value is None. - return None - - def core_data(self): - try: - data = self._data - except AttributeError: - data = self.data - return data - - def phenomenon_points(self, time_unit): - """Return the phenomenon time points. - - As offsets from the epoch time reference, measured in appropriate time units. - - """ - time_reference = "%s since epoch" % time_unit - return float( - cf_units.date2num( - self._phenomenonDateTime, time_reference, cf_units.CALENDAR_GREGORIAN - ) - ) - - def phenomenon_bounds(self, time_unit): - """Return the phenomenon time bounds. - - As offsets from the epoch time reference, measured in appropriate time units. - - """ - # TODO #576 Investigate when it's valid to get phenomenon_bounds - time_reference = "%s since epoch" % time_unit - unit = cf_units.Unit(time_reference, cf_units.CALENDAR_GREGORIAN) - return [ - float(unit.date2num(self._periodStartDateTime)), - float(unit.date2num(self._periodEndDateTime)), - ] - - -def _longitude_is_cyclic(points): - """Work out if a set of longitude points is cyclic.""" - # Is the gap from end to start smaller, or about equal to the max step? - gap = 360.0 - abs(points[-1] - points[0]) - max_step = abs(np.diff(points)).max() - cyclic = False - if gap <= max_step: - cyclic = True - else: - delta = 0.001 - if abs(1.0 - gap / max_step) < delta: - cyclic = True - return cyclic - - -def _message_values(grib_message, shape): - eccodes.codes_set_double(grib_message, "missingValue", np.nan) - data = eccodes.codes_get_double_array(grib_message, "values") - data = data.reshape(shape) - - # Handle missing values in a sensible way. - mask = np.isnan(data) - if mask.any(): - data = ma.array(data, mask=mask, fill_value=np.nan) - return data - - def _load_generate(filename): messages = GribMessage.messages_from_filename(filename) for message in messages: editionNumber = message.sections[0]["editionNumber"] if editionNumber == 1: - has_bitmap = 3 in message.sections - message_id = message._raw_message._message_id - grib_fh = message._file_ref.open_file - message = GribWrapper(message_id, grib_fh=grib_fh, has_bitmap=has_bitmap) + if GRIB1_LOADING_MODE.use_legacy_grib1_loading: + from ._grib1_legacy.grib_wrapper import GribWrapper # noqa: PLC0415 + + has_bitmap = 3 in message.sections + message_id = message._raw_message._message_id + grib_fh = message._file_ref.open_file + message = GribWrapper( + message_id, grib_fh=grib_fh, has_bitmap=has_bitmap + ) elif editionNumber != 2: emsg = "GRIB edition {} is not supported by {!r}." raise TranslationError(emsg.format(editionNumber, type(message).__name__)) diff --git a/src/iris_grib/_grib1_legacy/__init__.py b/src/iris_grib/_grib1_legacy/__init__.py new file mode 100644 index 00000000..a69db511 --- /dev/null +++ b/src/iris_grib/_grib1_legacy/__init__.py @@ -0,0 +1,8 @@ +# Copyright iris-grib contributors +# +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +"""Code for the legacy GRIB1 loader. + +See :data:`iris_grib.GRIB1_LOADING_MODE`. +""" diff --git a/src/iris_grib/_grib1_load_rules.py b/src/iris_grib/_grib1_legacy/grib1_load_rules.py similarity index 95% rename from src/iris_grib/_grib1_load_rules.py rename to src/iris_grib/_grib1_legacy/grib1_load_rules.py index 6ef233ee..67353a92 100644 --- a/src/iris_grib/_grib1_load_rules.py +++ b/src/iris_grib/_grib1_legacy/grib1_load_rules.py @@ -2,10 +2,11 @@ # # This file is part of iris-grib and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. +""" +Rules for grib1 loading. -# Historically this was auto-generated from -# SciTools/iris-code-generators:tools/gen_rules.py - +Used exclusively by the 'legacy' GRIB loader in `_grib1_legacy.grib_wrapper`. +""" from cf_units import CALENDAR_GREGORIAN, Unit @@ -42,6 +43,9 @@ def grib1_convert(grib): dim_coords_and_dims = [] aux_coords_and_dims = [] + ################################################## + # decode GRID -> dim_coords / aux_coords + if grib.gridType == "reduced_gg": aux_coords_and_dims.append( ( @@ -119,6 +123,9 @@ def grib1_convert(grib): ) ) + ################################################## + # decode PHENOMENON -> std_name / long_name / units + if ( (grib.table2Version < 128) and (grib.indicatorOfParameter == 11) @@ -161,6 +168,9 @@ def grib1_convert(grib): ) units = "???" + ################################################## + ##### decode TIME -> aux_coords (=always scalar) + if grib._phenomenonDateTime != -1.0: aux_coords_and_dims.append( ( @@ -264,6 +274,9 @@ def add_bounded_time_coords(aux_coords_and_dims, grib): add_bounded_time_coords(aux_coords_and_dims, grib) cell_methods.append(CellMethod("standard_deviation", coords="time")) + ################################################## + # decode VERTICAL -> aux_coords / factories + if grib.levelType == "pl": aux_coords_and_dims.append( (DimCoord(points=grib.level, long_name="pressure", units="hPa"), None) diff --git a/src/iris_grib/_grib1_legacy/grib_wrapper.py b/src/iris_grib/_grib1_legacy/grib_wrapper.py new file mode 100644 index 00000000..5f0f165a --- /dev/null +++ b/src/iris_grib/_grib1_legacy/grib_wrapper.py @@ -0,0 +1,695 @@ +# Copyright iris-grib contributors +# +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +""" +Legacy GRIB1 loading, based on :class:`GribWrapper` and :class:`GribDataProxy`. + +This loader is now deprecated, the replacement uses the :class:`iris_grib.GribMessage`. +While this mechanism is still in place, the user can switch between the two with the +:data:`iris_grib.GRIB1_LOADING_MODE` switch. +""" + +import datetime +import math # for fmod + +import cartopy.crs as ccrs +import cf_units +import eccodes +import numpy as np +import numpy.ma as ma + +# NOTE: careful here, to avoid circular imports (as iris imports grib) +from iris._lazy_data import as_lazy_data +import iris.coord_systems as coord_systems +from iris.exceptions import TranslationError, NotYetImplementedError + +from iris_grib import _ASLAZYDATA_NEEDS_META, _make_dask_meta +from iris_grib import grib_phenom_translation as gptx + + +CENTRE_TITLES = { + "egrr": "U.K. Met Office - Exeter", + "ecmf": "European Centre for Medium Range Weather Forecasts", + "rjtd": "Tokyo, Japan Meteorological Agency", + "55": "San Francisco", + "kwbc": ( + "US National Weather Service, National Centres for Environmental Prediction" + ), +} + +TIME_RANGE_INDICATORS = { + 0: "none", + 1: "none", + 3: "time mean", + 4: "time sum", + 5: "time _difference", + 10: "none", + # TODO #567 Further exploration of following mappings + 51: "time mean", + 113: "time mean", + 114: "time sum", + 115: "time mean", + 116: "time sum", + 117: "time mean", + 118: "time _covariance", + 123: "time mean", + 124: "time sum", + 125: "time standard_deviation", +} + +PROCESSING_TYPES = { + 0: "time mean", + 1: "time sum", + 2: "time maximum", + 3: "time minimum", + 4: "time _difference", + 5: "time _root mean square", + 6: "time standard_deviation", + 7: "time _convariance", + 8: "time _difference", + 9: "time _ratio", +} + +TIME_CODES_EDITION1 = { + 0: ("minutes", 60), + 1: ("hours", 60 * 60), + 2: ("days", 24 * 60 * 60), + # NOTE: do *not* support calendar-dependent units at all. + # So the following possible keys remain unsupported: + # 3: 'months', + # 4: 'years', + # 5: 'decades', + # 6: '30 years', + # 7: 'century', + 10: ("3 hours", 3 * 60 * 60), + 11: ("6 hours", 6 * 60 * 60), + 12: ("12 hours", 12 * 60 * 60), + 13: ("15 minutes", 15 * 60), + 14: ("30 minutes", 30 * 60), + 254: ("seconds", 1), +} + +unknown_string = "???" + + +class GribDataProxy: + """A reference to the data payload of a single Grib message.""" + + __slots__ = ("dtype", "offset", "path", "shape") + + def __init__(self, shape, dtype, path, offset): + self.shape = shape + self.dtype = dtype + self.path = path + self.offset = offset + + @property + def ndim(self): + return len(self.shape) + + def __getitem__(self, keys): + with open(self.path, "rb") as grib_fh: + grib_fh.seek(self.offset) + grib_message = eccodes.codes_new_from_file( + grib_fh, eccodes.CODES_PRODUCT_GRIB + ) + data = _message_values(grib_message, self.shape) + eccodes.codes_release(grib_message) + + result = data.__getitem__(keys) + + return result + + def __repr__(self): + msg = ( + "<{self.__class__.__name__} shape={self.shape} " + "dtype={self.dtype!r} " + "path={self.path!r} offset={self.offset}>" + ) + return msg.format(self=self) + + def __getstate__(self): + return {attr: getattr(self, attr) for attr in self.__slots__} + + def __setstate__(self, state): + for key, value in state.items(): + setattr(self, key, value) + + +class GribWrapper: + """Contains a pygrib object plus some extra keys of our own. + + The class :class:`iris_grib.message.GribMessage` + provides alternative means of working with GRIB message instances. + + """ + + def __init__(self, grib_message, grib_fh=None, has_bitmap=True): + """Store the grib message and compute our extra keys.""" + self.grib_message = grib_message + + if self.edition != 1: + emsg = "GRIB edition {} is not supported by {!r}." + raise TranslationError(emsg.format(self.edition, type(self).__name__)) + + deferred = grib_fh is not None + + # Store the file pointer and message length from the current + # grib message before it's changed by calls to the grib-api. + if deferred: + offset = eccodes.codes_get_message_offset(grib_message) + + # Initialise the key-extension dictionary. + # NOTE: this attribute *must* exist, or the the __getattr__ overload + # can hit an infinite loop. + self.extra_keys = {} + self._confirm_in_scope() + self._compute_extra_keys() + + # Calculate the data payload shape. + shape = (eccodes.codes_get_long(grib_message, "numberOfValues"),) + + if not self.gridType.startswith("reduced"): + ni, nj = self.Ni, self.Nj + j_fast = eccodes.codes_get_long(grib_message, "jPointsAreConsecutive") + shape = (nj, ni) if j_fast == 0 else (ni, nj) + + if deferred: + # Wrap the reference to the data payload within the data proxy + # in order to support deferred data loading. + dtype = np.dtype(float) # Use default dtype for python float + proxy = GribDataProxy(shape, dtype, grib_fh.name, offset) + as_lazy_kwargs = {} + if _ASLAZYDATA_NEEDS_META: + meta = _make_dask_meta(shape, dtype, is_masked=has_bitmap) + as_lazy_kwargs["meta"] = meta + self._data = as_lazy_data(proxy, **as_lazy_kwargs) + else: + self.data = _message_values(grib_message, shape) + + def _confirm_in_scope(self): + """Ensure we have a grib flavour that we choose to support.""" + + # forbid alternate row scanning + # (uncommon entry from GRIB2 flag table 3.4, also in GRIB1) + if self.alternativeRowScanning == 1: + raise ValueError("alternativeRowScanning == 1 not handled.") + + def __getattr__(self, key): + """Return a grib key, or one of our extra keys.""" + + # is it in the grib message? + try: + # we just get as the type of the "values" + # array...special case here... + if key in ["values", "pv", "latitudes", "longitudes"]: + res = eccodes.codes_get_double_array(self.grib_message, key) + elif key in ("typeOfFirstFixedSurface", "typeOfSecondFixedSurface"): + res = np.int32(eccodes.codes_get_long(self.grib_message, key)) + else: + key_type = eccodes.codes_get_native_type(self.grib_message, key) + if key_type is int: + res = np.int32(eccodes.codes_get_long(self.grib_message, key)) + elif key_type is float: + # Because some computer keys are floats, like + # longitudeOfFirstGridPointInDegrees, a float32 + # is not always enough... + res = np.float64(eccodes.codes_get_double(self.grib_message, key)) + elif key_type is str: + res = eccodes.codes_get_string(self.grib_message, key) + else: + emsg = "Unknown type for {} : {}" + raise ValueError(emsg.format(key, str(key_type))) + except eccodes.CodesInternalError: + res = None + + # ...or is it in our list of extras? + if res is None: + if key in self.extra_keys: + res = self.extra_keys[key] + else: + # must raise an exception for the hasattr() mechanism to work + raise AttributeError("Cannot find GRIB key %s" % key) + + return res + + def _timeunit_detail(self): + """Return the (string, seconds) describing the message time unit.""" + unit_code = self.indicatorOfUnitOfTimeRange + if unit_code not in TIME_CODES_EDITION1: + message = ( + "Unhandled time unit for forecast " + "indicatorOfUnitOfTimeRange : " + str(unit_code) + ) + raise NotYetImplementedError(message) + return TIME_CODES_EDITION1[unit_code] + + def _timeunit_string(self): + """Get the udunits string for the message time unit.""" + return self._timeunit_detail()[0] + + def _timeunit_seconds(self): + """Get the number of seconds in the message time unit.""" + return self._timeunit_detail()[1] + + def _compute_extra_keys(self): + """Compute our extra keys.""" + global unknown_string + + self.extra_keys = {} + forecastTime = self.startStep + + # regular or rotated grid? + try: + longitudeOfSouthernPoleInDegrees = self.longitudeOfSouthernPoleInDegrees + latitudeOfSouthernPoleInDegrees = self.latitudeOfSouthernPoleInDegrees + except AttributeError: + longitudeOfSouthernPoleInDegrees = 0.0 + latitudeOfSouthernPoleInDegrees = 90.0 + + centre = eccodes.codes_get_string(self.grib_message, "centre") + + # default values + self.extra_keys = { + "_referenceDateTime": -1.0, + "_phenomenonDateTime": -1.0, + "_periodStartDateTime": -1.0, + "_periodEndDateTime": -1.0, + "_levelTypeName": unknown_string, + "_levelTypeUnits": unknown_string, + "_firstLevelTypeName": unknown_string, + "_firstLevelTypeUnits": unknown_string, + "_firstLevel": -1.0, + "_secondLevelTypeName": unknown_string, + "_secondLevel": -1.0, + "_originatingCentre": unknown_string, + "_forecastTime": None, + "_forecastTimeUnit": unknown_string, + "_coord_system": None, + "_x_circular": False, + "_x_coord_name": unknown_string, + "_y_coord_name": unknown_string, + # These are here to avoid repetition in the rules + # files, and reduce the very long line lengths. + "_x_points": None, + "_y_points": None, + "_cf_data": None, + "_grib_code": None, + } + + # cf phenomenon translation + # Get centre code (N.B. self.centre has default type = string) + centre_number = eccodes.codes_get_long(self.grib_message, "centre") + # Look for a known grib1-to-cf translation (or None). + cf_data = gptx.grib1_phenom_to_cf_info( + table2_version=self.table2Version, + centre_number=centre_number, + param_number=self.indicatorOfParameter, + ) + self.extra_keys["_cf_data"] = cf_data + + # Record the original parameter encoding + self.extra_keys["_grib_code"] = gptx.GRIBCode( + edition=1, + table_version=self.table2Version, + centre_number=centre_number, + number=self.indicatorOfParameter, + ) + + # reference date + self.extra_keys["_referenceDateTime"] = datetime.datetime( + int(self.year), + int(self.month), + int(self.day), + int(self.hour), + int(self.minute), + ) + + # forecast time with workarounds + self.extra_keys["_forecastTime"] = forecastTime + + # verification date + processingDone = self._get_processing_done() + # time processed? + if processingDone.startswith("time"): + validityDate = str(self.validityDate) + validityTime = "{:04}".format(int(self.validityTime)) + endYear = int(validityDate[:4]) + endMonth = int(validityDate[4:6]) + endDay = int(validityDate[6:8]) + endHour = int(validityTime[:2]) + endMinute = int(validityTime[2:4]) + + # fixed forecastTime in hours + self.extra_keys["_periodStartDateTime"] = self.extra_keys[ + "_referenceDateTime" + ] + datetime.timedelta(hours=int(forecastTime)) + self.extra_keys["_periodEndDateTime"] = datetime.datetime( + endYear, endMonth, endDay, endHour, endMinute + ) + else: + self.extra_keys["_phenomenonDateTime"] = self._get_verification_date() + + # originating centre + # TODO #574 Expand to include sub-centre + self.extra_keys["_originatingCentre"] = CENTRE_TITLES.get( + centre, "unknown centre %s" % centre + ) + + # forecast time unit as a cm string + # TODO #575 Do we want PP or GRIB style forecast delta? + self.extra_keys["_forecastTimeUnit"] = self._timeunit_string() + + # shape of the Earth + oblate_Earth = self.resolutionAndComponentFlags & 0b0100000 + if oblate_Earth: + # Earth assumed oblate spheroidal with size as determined by IAU in + # 1965 (6378.160 km, 6356.775 km, f = 1/297.0) + raise ValueError("Oblate Spheroidal Earth is not supported.") + else: + # Earth assumed spherical with radius 6367.47 km + geoid = coord_systems.GeogCS(semi_major_axis=6367470) + + gridType = eccodes.codes_get_string(self.grib_message, "gridType") + + if gridType in ["regular_ll", "regular_gg", "reduced_ll", "reduced_gg"]: + self.extra_keys["_x_coord_name"] = "longitude" + self.extra_keys["_y_coord_name"] = "latitude" + self.extra_keys["_coord_system"] = geoid + elif gridType == "rotated_ll": + # TODO: Confirm the translation from angleOfRotation to + # north_pole_lon (usually 0 for both) + self.extra_keys["_x_coord_name"] = "grid_longitude" + self.extra_keys["_y_coord_name"] = "grid_latitude" + southPoleLon = longitudeOfSouthernPoleInDegrees + southPoleLat = latitudeOfSouthernPoleInDegrees + self.extra_keys["_coord_system"] = coord_systems.RotatedGeogCS( + -southPoleLat, + math.fmod(southPoleLon + 180.0, 360.0), + self.angleOfRotation, + geoid, + ) + elif gridType == "polar_stereographic": + self.extra_keys["_x_coord_name"] = "projection_x_coordinate" + self.extra_keys["_y_coord_name"] = "projection_y_coordinate" + + if self.projectionCentreFlag == 0: + pole_lat = 90 + elif self.projectionCentreFlag == 1: + pole_lat = -90 + else: + raise TranslationError("Unhandled projectionCentreFlag") + + # Always load PolarStereographic - never Stereographic. + # Stereographic is a CF/Iris concept and not something described + # in GRIB. + # Note: I think the grib api defaults LaDInDegrees to 60 for grib1. + self.extra_keys["_coord_system"] = coord_systems.PolarStereographic( + pole_lat, + self.orientationOfTheGridInDegrees, + 0, + 0, + self.LaDInDegrees, + ellipsoid=geoid, + ) + + elif gridType == "lambert": + self.extra_keys["_x_coord_name"] = "projection_x_coordinate" + self.extra_keys["_y_coord_name"] = "projection_y_coordinate" + + flag_name = "projectionCenterFlag" + + if getattr(self, flag_name) == 0: + pole_lat = 90 + elif getattr(self, flag_name) == 1: + pole_lat = -90 + else: + raise TranslationError("Unhandled projectionCentreFlag") + + LambertConformal = coord_systems.LambertConformal + self.extra_keys["_coord_system"] = LambertConformal( + self.LaDInDegrees, + self.LoVInDegrees, + 0, + 0, + secant_latitudes=(self.Latin1InDegrees, self.Latin2InDegrees), + ellipsoid=geoid, + ) + else: + raise TranslationError("unhandled grid type: {}".format(gridType)) + + if gridType in ["regular_ll", "rotated_ll"]: + self._regular_longitude_common() + j_step = self.jDirectionIncrementInDegrees + if not self.jScansPositively: + j_step = -j_step + self._y_points = ( + np.arange(self.Nj, dtype=np.float64) * j_step + + self.latitudeOfFirstGridPointInDegrees + ) + + elif gridType in ["regular_gg"]: + # longitude coordinate is straight-forward + self._regular_longitude_common() + # get the distinct latitudes, and make sure they are sorted + # (south-to-north) and then put them in the right direction + # depending on the scan direction + latitude_points = eccodes.codes_get_double_array( + self.grib_message, "distinctLatitudes" + ).astype(np.float64) + latitude_points.sort() + if not self.jScansPositively: + # we require latitudes north-to-south + self._y_points = latitude_points[::-1] + else: + self._y_points = latitude_points + + elif gridType in ["polar_stereographic", "lambert"]: + # convert the starting latlon into meters + cartopy_crs = self.extra_keys["_coord_system"].as_cartopy_crs() + x1, y1 = cartopy_crs.transform_point( + self.longitudeOfFirstGridPointInDegrees, + self.latitudeOfFirstGridPointInDegrees, + ccrs.Geodetic(), + ) + + if not np.all(np.isfinite([x1, y1])): + raise TranslationError( + "Could not determine the first latitude" + " and/or longitude grid point." + ) + + self._x_points = x1 + self.DxInMetres * np.arange(self.Nx, dtype=np.float64) + self._y_points = y1 + self.DyInMetres * np.arange(self.Ny, dtype=np.float64) + + elif gridType in ["reduced_ll", "reduced_gg"]: + self._x_points = self.longitudes + self._y_points = self.latitudes + + else: + raise TranslationError("unhandled grid type") + + def _regular_longitude_common(self): + """Define a regular longitude dimension.""" + i_step = self.iDirectionIncrementInDegrees + if self.iScansNegatively: + i_step = -i_step + self._x_points = ( + np.arange(self.Ni, dtype=np.float64) * i_step + + self.longitudeOfFirstGridPointInDegrees + ) + if "longitude" in self.extra_keys["_x_coord_name"] and self.Ni > 1: + if _longitude_is_cyclic(self._x_points): + self.extra_keys["_x_circular"] = True + + def _get_processing_done(self): + """Determine the type of processing that was done on the data.""" + + processingDone = "unknown" + timeRangeIndicator = self.timeRangeIndicator + default = "time _grib1_process_unknown_%i" % timeRangeIndicator + processingDone = TIME_RANGE_INDICATORS.get(timeRangeIndicator, default) + + return processingDone + + def _get_verification_date(self): + reference_date_time = self._referenceDateTime + + # calculate start time + time_range_indicator = self.timeRangeIndicator + P1 = self.P1 + P2 = self.P2 + if time_range_indicator == 0: + # Forecast product valid at reference time + P1 P1>0), + # or Uninitialized analysis product for reference time (P1=0). + # Or Image product for reference time (P1=0) + time_diff = P1 + elif time_range_indicator == 1: + # Initialized analysis product for reference time (P1=0). + time_diff = P1 + elif time_range_indicator == 2: + # Product with a valid time ranging between reference time + P1 + # and reference time + P2 + time_diff = (P1 + P2) * 0.5 + elif time_range_indicator == 3: + # Average(reference time + P1 to reference time + P2) + time_diff = (P1 + P2) * 0.5 + elif time_range_indicator == 4: + # Accumulation (reference time + P1 to reference time + P2) + # product considered valid at reference time + P2 + time_diff = P2 + elif time_range_indicator == 5: + # Difference(reference time + P2 minus reference time + P1) + # product considered valid at reference time + P2 + time_diff = P2 + elif time_range_indicator == 10: + # P1 occupies octets 19 and 20; product valid at + # reference time + P1 + time_diff = P1 * 256 + P2 + elif time_range_indicator == 51: + # Climatological Mean Value: multiple year averages of + # quantities which are themselves means over some period of + # time (P2) less than a year. The reference time (R) indicates + # the date and time of the start of a period of time, given by + # R to R + P2, over which a mean is formed; N indicates the number + # of such period-means that are averaged together to form the + # climatological value, assuming that the N period-mean fields + # are separated by one year. The reference time indicates the + # start of the N-year climatology. N is given in octets 22-23 + # of the PDS. If P1 = 0 then the data averaged in the basic + # interval P2 are assumed to be continuous, i.e., all available + # data are simply averaged together. If P1 = 1 (the units of + # time - octet 18, code table 4 - are not relevant here) then + # the data averaged together in the basic interval P2 are valid + # only at the time (hour, minute) given in the reference time, + # for all the days included in the P2 period. The units of P2 + # are given by the contents of octet 18 and Table 4. + raise TranslationError( + "unhandled grib1 timeRangeIndicator = 51 (avg of avgs)" + ) + elif time_range_indicator == 113: + # Average of N forecasts (or initialized analyses); each + # product has forecast period of P1 (P1=0 for initialized + # analyses); products have reference times at intervals of P2, + # beginning at the given reference time. + time_diff = P1 + elif time_range_indicator == 114: + # Accumulation of N forecasts (or initialized analyses); each + # product has forecast period of P1 (P1=0 for initialized + # analyses); products have reference times at intervals of P2, + # beginning at the given reference time. + time_diff = P1 + elif time_range_indicator == 115: + # Average of N forecasts, all with the same reference time; + # the first has a forecast period of P1, the remaining + # forecasts follow at intervals of P2. + time_diff = P1 + elif time_range_indicator == 116: + # Accumulation of N forecasts, all with the same reference + # time; the first has a forecast period of P1, the remaining + # follow at intervals of P2. + time_diff = P1 + elif time_range_indicator == 117: + # Average of N forecasts, the first has a period of P1, the + # subsequent ones have forecast periods reduced from the + # previous one by an interval of P2; the reference time for + # the first is given in octets 13-17, the subsequent ones + # have reference times increased from the previous one by + # an interval of P2. Thus all the forecasts have the same + # valid time, given by the initial reference time + P1. + time_diff = P1 + elif time_range_indicator == 118: + # Temporal variance, or covariance, of N initialized analyses; + # each product has forecast period P1=0; products have + # reference times at intervals of P2, beginning at the given + # reference time. + time_diff = P1 + elif time_range_indicator == 123: + # Average of N uninitialized analyses, starting at the + # reference time, at intervals of P2. + time_diff = P1 + elif time_range_indicator == 124: + # Accumulation of N uninitialized analyses, starting at + # the reference time, at intervals of P2. + time_diff = P1 + else: + raise TranslationError( + "unhandled grib1 timeRangeIndicator = %i" % time_range_indicator + ) + + # Get the timeunit interval. + interval_secs = self._timeunit_seconds() + # Multiply by start-offset and convert to a timedelta. + # NOTE: a 'float' conversion is required here, as time_diff may be + # a numpy scalar, which timedelta will not accept. + interval_delta = datetime.timedelta(seconds=float(time_diff * interval_secs)) + # Return validity_time = (reference_time + start_offset*time_unit). + return reference_date_time + interval_delta + + @property + def bmdi(self): + # Not sure of any cases where GRIB provides a fill value. + # Default for fill value is None. + return None + + def core_data(self): + try: + data = self._data + except AttributeError: + data = self.data + return data + + def phenomenon_points(self, time_unit): + """Return the phenomenon time points. + + As offsets from the epoch time reference, measured in appropriate time units. + + """ + time_reference = "%s since epoch" % time_unit + return float( + cf_units.date2num( + self._phenomenonDateTime, time_reference, cf_units.CALENDAR_GREGORIAN + ) + ) + + def phenomenon_bounds(self, time_unit): + """Return the phenomenon time bounds. + + As offsets from the epoch time reference, measured in appropriate time units. + + """ + # TODO #576 Investigate when it's valid to get phenomenon_bounds + time_reference = "%s since epoch" % time_unit + unit = cf_units.Unit(time_reference, cf_units.CALENDAR_GREGORIAN) + return [ + float(unit.date2num(self._periodStartDateTime)), + float(unit.date2num(self._periodEndDateTime)), + ] + + +def _longitude_is_cyclic(points): + """Work out if a set of longitude points is cyclic.""" + # Is the gap from end to start smaller, or about equal to the max step? + gap = 360.0 - abs(points[-1] - points[0]) + max_step = abs(np.diff(points)).max() + cyclic = False + if gap <= max_step: + cyclic = True + else: + delta = 0.001 + if abs(1.0 - gap / max_step) < delta: + cyclic = True + return cyclic + + +def _message_values(grib_message, shape): + eccodes.codes_set_double(grib_message, "missingValue", np.nan) + data = eccodes.codes_get_double_array(grib_message, "values") + data = data.reshape(shape) + + # Handle missing values in a sensible way. + mask = np.isnan(data) + if mask.any(): + data = ma.array(data, mask=mask, fill_value=np.nan) + return data diff --git a/src/iris_grib/_grib2_convert.py b/src/iris_grib/_grib2_convert.py new file mode 100644 index 00000000..79c0b717 --- /dev/null +++ b/src/iris_grib/_grib2_convert.py @@ -0,0 +1,2915 @@ +# Copyright iris-grib contributors +# +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +""" +Module to support loading of GRIB2 data. + +Code to convert a GRIB2 message into cube metadata. + +""" + +from collections import namedtuple +from collections.abc import Iterable +from datetime import datetime, timedelta +import math +import warnings + +import cartopy.crs as ccrs +from cf_units import CALENDAR_GREGORIAN, Unit +import numpy as np +import numpy.ma as ma + +from iris.aux_factory import HybridPressureFactory, HybridHeightFactory +import iris.coord_systems as icoord_systems +from iris.coords import AuxCoord, DimCoord, CellMethod +from iris.exceptions import TranslationError +from . import grib_phenom_translation as itranslation +from .grib_phenom_translation import GRIBCode +from iris.fileformats.rules import ( + Factory, + Reference, + ReferenceTarget, +) +from iris.util import _is_circular + +from iris_grib._load_convert import options + +ScanningMode = namedtuple( + "ScanningMode", ["i_negative", "j_positive", "j_consecutive", "i_alternative"] +) + +ProjectionCentre = namedtuple( + "ProjectionCentre", ["south_pole_on_projection_plane", "bipolar_and_symmetric"] +) + +ResolutionFlags = namedtuple( + "ResolutionFlags", ["i_increments_given", "j_increments_given", "uv_resolved"] +) + +FixedSurface = namedtuple( + "FixedSurface", ["standard_name", "long_name", "units", "point"] +) + +InterpolationParameters = namedtuple( + "InterpolationParameters", + ["interpolation_type", "statistical_process", "number_of_points_used"], +) +# Regulations 92.1.6. +_GRID_ACCURACY_IN_DEGREES = 1e-6 # 1/1,000,000 of a degree + +# Reference Common Code Table C-1. +_CENTRES = {"ecmf": "European Centre for Medium Range Weather Forecasts"} + +# Reference Code Table 1.0 +_CODE_TABLES_MISSING = 255 + +# UDUNITS-2 units time string. Reference GRIB2 Code Table 4.4. +_TIME_RANGE_UNITS = { + 0: "minutes", + 1: "hours", + 2: "days", + # 3: 'months', Unsupported + # 4: 'years', Unsupported + # 5: '10 years', Unsupported + # 6: '30 years', Unsupported + # 7: '100 years', Unsupported + # 8-9 Reserved + 10: "3 hours", + 11: "6 hours", + 12: "12 hours", + 13: "seconds", +} +# Regulation 92.1.4 +_TIME_RANGE_MISSING = 2**32 - 1 + +# Reference Code Table 4.5. Point values are included where these are part of the fixed +# surface definition. None indicates this comes from the GRIB metadata, +# eg. "scaledValueOfFirstFixedSurface". +_FIXED_SURFACE = { + 1: FixedSurface(None, "height", "m", 0.0), # Ground or water surface + 4: FixedSurface(None, "air_temperature", "Celsius", 0.0), # Level of 0C isotherm + 100: FixedSurface(None, "pressure", "Pa", None), # Isobaric surface + 103: FixedSurface(None, "height", "m", None), # Height level above ground +} +_TYPE_OF_FIXED_SURFACE_MISSING = 255 + +# Reference Code Table 6.0 +_BITMAP_CODE_PRESENT = 0 +_BITMAP_CODE_NONE = 255 + +# Reference Code Table 4.10. +_STATISTIC_TYPE_NAMES = { + 0: "mean", + 1: "sum", + 2: "maximum", + 3: "minimum", + 6: "standard_deviation", +} + +# Reference Code Table 4.11. +_STATISTIC_TYPE_OF_TIME_INTERVAL = { + 2: "same start time of forecast, forecast time is incremented" +} +# NOTE: Our test data contains the value 2, which is all we currently support. +# The exact interpretation of this is still unclear. + +# See Code Table 4.15 for full spatial processing type descriptors: +# http://apps.ecmwf.int/codes/grib/format/grib2/ctables/4/15 + +# InterpolationParameters(spatial process descriptor, statistical process +# (octet 35), number of points used in interpolation (octet 37)) +_SPATIAL_PROCESSING_TYPES = { + 0: InterpolationParameters("No interpolation", "cell_method", 0), + 1: InterpolationParameters("Bilinear interpolation", None, 4), + 2: InterpolationParameters("Bicubic interpolation", None, 4), + 3: InterpolationParameters("Nearest neighbour interpolation", None, 1), + 4: InterpolationParameters("Budget interpolation", None, 4), + 5: InterpolationParameters("Spectral interpolation", None, 4), + 6: InterpolationParameters("Neighbour-budget interpolation", None, 4), +} + +# Class containing details of a probability analysis. +Probability = namedtuple("Probability", ("probability_type_name", "threshold")) + +# List of grid definition template numbers which use either (i,j) or (x,y) +# for (lat,lon) +_IJGRIDLENGTH_GDT_NUMBERS = (10,) +_XYGRIDLENGTH_GDT_NUMBERS = (20, 30, 31, 110, 140) + + +# Regulation 92.1.12 +def unscale(value, factor): + """ + Implement Regulation 92.1.12. + + Args: + + * value: + Scaled value or sequence of scaled values. + + * factor: + Scale factor or sequence of scale factors. + + Returns: + For scalar value and factor, the unscaled floating point + result is returned. If either value and/or factor are + MDI, then :data:`numpy.ma.masked` is returned. + + For sequence value and factor, the unscaled floating point + :class:`numpy.ndarray` is returned. If either value and/or + factor contain MDI, then :class:`numpy.ma.core.MaskedArray` + is returned. + + """ + + def _unscale(v, f): + return v / 10.0**f + + if isinstance(value, Iterable) or isinstance(factor, Iterable): + + def _masker(item): + # This is a small work around for an edge case, which is not + # evident in any of our sample GRIB2 messages, where an array + # of header elements contains missing values. + # iris.fileformats.grib.message returns these as None, but they + # are wanted as a numerical masked array, so a temporary mdi + # value is used, selected from a legacy implementation of iris, + # to construct the masked array. The valure is transient, only in + # scope for this function. + numerical_mdi = 2**32 - 1 + item = [numerical_mdi if i is None else i for i in item] + result = ma.masked_equal(item, numerical_mdi) + if ma.count_masked(result): + # Circumvent downstream NumPy "RuntimeWarning" + # of "overflow encountered in power" in _unscale + # for data containing _MDI. Remove transient _MDI value. + result.data[result.mask] = 0 + return result + + value = _masker(value) + factor = _masker(factor) + result = _unscale(value, factor) + if ma.count_masked(result) == 0: + result = result.data + else: + result = ma.masked + if value != _MDI and factor != _MDI: + result = _unscale(value, factor) + return result + + +# Use ECCodes to recognise missing value +_MDI = None + + +class HindcastOverflowWarning(Warning): + pass + + +# Non-standardised usage for negative forecast times. +def _hindcast_fix(forecast_time): + """Return a forecast time interpreted as a possibly negative value.""" + uft = np.array(forecast_time).astype(np.int64) + HIGHBIT = 2**30 + + # Workaround grib api's assumption that forecast time is positive. + # Handles correctly encoded -ve forecast times up to one -1 billion. + if 2 * HIGHBIT < uft < 3 * HIGHBIT: + original_forecast_time = forecast_time + forecast_time = -(uft - 2 * HIGHBIT) + if options.warn_on_unsupported: + msg = "Re-interpreting large grib forecastTime from {} to {}.".format( + original_forecast_time, forecast_time + ) + warnings.warn(msg, HindcastOverflowWarning) + + return forecast_time + + +############################################################################### +# +# Identification Section 1 +# +############################################################################### + + +def reference_time_coord(section): + """ + Translate section 1 reference time according to its significance. + + Reference section 1, year octets 13-14, month octet 15, day octet 16, + hour octet 17, minute octet 18, second octet 19. + + Returns: + The scalar reference time :class:`iris.coords.DimCoord`. + + """ + # Look-up standard name by significanceOfReferenceTime. + _lookup = { + 0: "forecast_reference_time", + 1: "forecast_reference_time", + 2: "time", + 3: "time", + } + + # Calculate the reference time and units. + dt = datetime( + section["year"], + section["month"], + section["day"], + section["hour"], + section["minute"], + section["second"], + ) + # XXX Defaulting to a Gregorian calendar. + # Current GRIBAPI does not cover GRIB Section 1 - Octets 22-nn (optional) + # which are part of GRIB spec v12. + unit = Unit("hours since epoch", calendar=CALENDAR_GREGORIAN) + point = float(unit.date2num(dt)) + + # Reference Code Table 1.2. + significanceOfReferenceTime = section["significanceOfReferenceTime"] + standard_name = _lookup.get(significanceOfReferenceTime) + + if standard_name is None: + msg = ( + "Identificaton section 1 contains an unsupported significance " + "of reference time [{}]".format(significanceOfReferenceTime) + ) + raise TranslationError(msg) + + # Create the associated reference time of data coordinate. + coord = DimCoord(point, standard_name=standard_name, units=unit) + + return coord + + +############################################################################### +# +# Grid Definition Section 3 +# +############################################################################### + + +def projection_centre(projectionCentreFlag): + """ + Translate the projection centre flag bitmask. + + Reference GRIB2 Flag Table 3.5. + + Args: + + * projectionCentreFlag + Message section 3, coded key value. + + Returns: + A :class:`collections.namedtuple` representation. + + """ + south_pole_on_projection_plane = bool(projectionCentreFlag & 0x80) + bipolar_and_symmetric = bool(projectionCentreFlag & 0x40) + return ProjectionCentre(south_pole_on_projection_plane, bipolar_and_symmetric) + + +def scanning_mode(scanningMode): + """ + Translate the scanning mode bitmask. + + Reference GRIB2 Flag Table 3.4. + + Args: + + * scanningMode: + Message section 3, coded key value. + + Returns: + A :class:`collections.namedtuple` representation. + + """ + i_negative = bool(scanningMode & 0x80) + j_positive = bool(scanningMode & 0x40) + j_consecutive = bool(scanningMode & 0x20) + i_alternative = bool(scanningMode & 0x10) + + if i_alternative: + msg = ( + "Grid definition section 3 contains unsupported " + "alternative row scanning mode" + ) + raise TranslationError(msg) + + return ScanningMode(i_negative, j_positive, j_consecutive, i_alternative) + + +def resolution_flags(resolutionAndComponentFlags): + """ + Translate the resolution and component bitmask. + + Reference GRIB2 Flag Table 3.3. + + Args: + + * resolutionAndComponentFlags: + Message section 3, coded key value. + + Returns: + A :class:`collections.namedtuple` representation. + + """ + i_inc_given = bool(resolutionAndComponentFlags & 0x20) + j_inc_given = bool(resolutionAndComponentFlags & 0x10) + uv_resolved = bool(resolutionAndComponentFlags & 0x08) + + return ResolutionFlags(i_inc_given, j_inc_given, uv_resolved) + + +def ellipsoid(shapeOfTheEarth, major, minor, radius): + """ + Translate the shape of the earth code. + + Convert the code to an appropriate Iris coordinate system. + + For MDI set either major and minor or radius to :data:`numpy.ma.masked` + + Reference GRIB2 Code Table 3.2. + + Args: + + * shapeOfTheEarth: + Message section 3, octet 15. + + * major: + Semi-major axis of the oblate spheroid in units determined by + the shapeOfTheEarth. + + * minor: + Semi-minor axis of the oblate spheroid in units determined by + the shapeOfTheEarth. + + * radius: + Radius of sphere (in m). + + Returns: + :class:`iris.coord_systems.CoordSystem` + + """ + # Supported shapeOfTheEarth values. + if shapeOfTheEarth not in (0, 1, 2, 3, 4, 5, 6, 7): + msg = ( + "Grid definition section 3 contains an unsupported " + "shape of the earth [{}]".format(shapeOfTheEarth) + ) + raise TranslationError(msg) + + if shapeOfTheEarth == 0: + # Earth assumed spherical with radius of 6 367 470.0m + result = icoord_systems.GeogCS(6367470) + elif shapeOfTheEarth == 1: + # Earth assumed spherical with radius specified (in m) by + # data producer. + if ma.is_masked(radius): + msg = ( + "Ellipsoid for shape of the earth {} requires a" + "radius to be specified.".format(shapeOfTheEarth) + ) + raise ValueError(msg) + result = icoord_systems.GeogCS(radius) + elif shapeOfTheEarth == 2: + # Earth assumed oblate spheroid with size as determined by IAU in 1965. + result = icoord_systems.GeogCS(6378160, inverse_flattening=297.0) + elif shapeOfTheEarth in [3, 7]: + # Earth assumed oblate spheroid with major and minor axes + # specified (in km)/(in m) by data producer. + emsg_oblate = ( + "Ellipsoid for shape of the earth [{}] requires a" + "semi-{} axis to be specified." + ) + if ma.is_masked(major): + raise ValueError(emsg_oblate.format(shapeOfTheEarth, "major")) + if ma.is_masked(minor): + raise ValueError(emsg_oblate.format(shapeOfTheEarth, "minor")) + # Check whether to convert from km to m. + if shapeOfTheEarth == 3: + major *= 1000 + minor *= 1000 + result = icoord_systems.GeogCS(major, minor) + elif shapeOfTheEarth == 4: + # Earth assumed oblate spheroid as defined in IAG-GRS80 model. + result = icoord_systems.GeogCS(6378137, inverse_flattening=298.257222101) + elif shapeOfTheEarth == 5: + # Earth assumed represented by WGS84 (as used by ICAO since 1998). + result = icoord_systems.GeogCS(6378137, inverse_flattening=298.257223563) + elif shapeOfTheEarth == 6: + # Earth assumed spherical with radius of 6 371 229.0m + result = icoord_systems.GeogCS(6371229) + + return result + + +def ellipsoid_geometry(section): + """ + Calculated the unscaled ellipsoid major-axis, minor-axis and radius. + + Args: + + * section: + Dictionary of coded key/value pairs from section 3 of the message. + + Returns: + Tuple containing the major-axis, minor-axis and radius. + + """ + major = unscale( + section["scaledValueOfEarthMajorAxis"], section["scaleFactorOfEarthMajorAxis"] + ) + minor = unscale( + section["scaledValueOfEarthMinorAxis"], section["scaleFactorOfEarthMinorAxis"] + ) + radius = unscale( + section["scaledValueOfRadiusOfSphericalEarth"], + section["scaleFactorOfRadiusOfSphericalEarth"], + ) + return major, minor, radius + + +def _calculate_increment(first_point, last_point, n_increments, mod=math.inf): + """ + Calculate a directional increment. + + Calculate the directional increment from the difference between the grid + point values divided by the total number of increments. Required by + template 0 & 40 when no increment values are provided. + """ + return (last_point - first_point) % mod / n_increments + + +def grid_definition_template_0_and_1(section, metadata, y_name, x_name, cs): + """ + Translate grid definition templates 0 and 1. + + Translate elements common to templates 0 and 1. + These templates represent regularly spaced latitude/longitude + on either a standard or rotated grid. + + Updates the metadata in-place with the translations. + + Args: + + * section: + Dictionary of coded key/value pairs from section 3 of the message + + * metadata: + :class:`collections.OrderedDict` of metadata. + + * y_name: + Name of the Y coordinate, e.g. latitude or grid_latitude. + + * x_name: + Name of the X coordinate, e.g. longitude or grid_longitude. + + * cs: + The :class:`iris.coord_systems.CoordSystem` to use when creating + the X and Y coordinates. + + """ + # Abort if this is a reduced grid, that case isn't handled yet. + if ( + section["numberOfOctectsForNumberOfPoints"] != 0 + or section["interpretationOfNumberOfPoints"] != 0 + ): + msg = "Grid definition section 3 contains unsupported quasi-regular grid" + raise TranslationError(msg) + + scan = scanning_mode(section["scanningMode"]) + + # Set resolution flags + res_flags = resolution_flags(section["resolutionAndComponentFlags"]) + + # Calculate longitude points. + x_inc = ( + section["iDirectionIncrement"] + if res_flags.i_increments_given + else _calculate_increment( + section["longitudeOfFirstGridPoint"], + section["longitudeOfLastGridPoint"], + section["Ni"] - 1, + 360.0 / _GRID_ACCURACY_IN_DEGREES, + ) + ) + x_inc *= _GRID_ACCURACY_IN_DEGREES + x_offset = section["longitudeOfFirstGridPoint"] * _GRID_ACCURACY_IN_DEGREES + x_direction = -1 if scan.i_negative else 1 + Ni = section["Ni"] + x_points = np.arange(Ni, dtype=np.float64) * x_inc * x_direction + x_offset + + # Determine whether the x-points (in degrees) are circular. + circular = _is_circular(x_points, 360.0) + + # Calculate latitude points. + y_inc = ( + section["jDirectionIncrement"] + if res_flags.j_increments_given + else _calculate_increment( + section["latitudeOfFirstGridPoint"], + section["latitudeOfLastGridPoint"], + section["Nj"] - 1, + ) + ) + y_inc *= _GRID_ACCURACY_IN_DEGREES + y_offset = section["latitudeOfFirstGridPoint"] * _GRID_ACCURACY_IN_DEGREES + y_direction = 1 if scan.j_positive else -1 + Nj = section["Nj"] + y_points = np.arange(Nj, dtype=np.float64) * y_inc * y_direction + y_offset + + # Create the lat/lon coordinates. + y_coord = DimCoord(y_points, standard_name=y_name, units="degrees", coord_system=cs) + x_coord = DimCoord( + x_points, + standard_name=x_name, + units="degrees", + coord_system=cs, + circular=circular, + ) + + # Determine the lat/lon dimensions. + y_dim, x_dim = 0, 1 + if scan.j_consecutive: + y_dim, x_dim = 1, 0 + + # Add the lat/lon coordinates to the metadata dim coords. + metadata["dim_coords_and_dims"].append((y_coord, y_dim)) + metadata["dim_coords_and_dims"].append((x_coord, x_dim)) + + +def grid_definition_template_0(section, metadata): + """ + Translate grid definition template 0. + + Template representing regular latitude/longitude grid (regular_ll). + + Updates the metadata in-place with the translations. + + Args: + + * section: + Dictionary of coded key/value pairs from section 3 of the message + + * metadata: + :class:`collections.OrderedDict` of metadata. + + """ + # Determine the coordinate system. + major, minor, radius = ellipsoid_geometry(section) + cs = ellipsoid(section["shapeOfTheEarth"], major, minor, radius) + grid_definition_template_0_and_1(section, metadata, "latitude", "longitude", cs) + + +def grid_definition_template_1(section, metadata): + """ + Translate grid definition template 1. + + Template representing rotated latitude/longitude grid. + + Updates the metadata in-place with the translations. + + Args: + + * section: + Dictionary of coded key/value pairs from section 3 of the message + + * metadata: + :class:`collections.OrderedDict` of metadata. + + """ + # Determine the coordinate system. + major, minor, radius = ellipsoid_geometry(section) + south_pole_lat = section["latitudeOfSouthernPole"] * _GRID_ACCURACY_IN_DEGREES + south_pole_lon = section["longitudeOfSouthernPole"] * _GRID_ACCURACY_IN_DEGREES + cs = icoord_systems.RotatedGeogCS( + -south_pole_lat, + math.fmod(south_pole_lon + 180, 360), + section["angleOfRotation"], + ellipsoid(section["shapeOfTheEarth"], major, minor, radius), + ) + grid_definition_template_0_and_1( + section, metadata, "grid_latitude", "grid_longitude", cs + ) + + +def grid_definition_template_4_and_5(section, metadata, y_name, x_name, cs): + """ + Translate grid definition templates 4 and 5. + + Translate elements common to templates 4 and 5. + These templates represent variable-resolution latitude/longitude + and common forms of variable-resolution rotated latitude/longitude. + + Updates the metadata in-place with the translations. + + Args: + + * section: + Dictionary of coded key/value pairs from section 3 of the message. + + * metadata: + :class:`collections.OrderedDict` of metadata. + + * y_name: + Name of the Y coordinate, e.g. 'latitude' or 'grid_latitude'. + + * x_name: + Name of the X coordinate, e.g. 'longitude' or 'grid_longitude'. + + * cs: + The :class:`iris.coord_systems.CoordSystem` to use when creating + the X and Y coordinates. + + """ + # Determine the (variable) units of resolution. + key = "basicAngleOfTheInitialProductionDomain" + basicAngleOfTheInitialProductDomain = section[key] + subdivisionsOfBasicAngle = section["subdivisionsOfBasicAngle"] + + if basicAngleOfTheInitialProductDomain in [0, _MDI]: + basicAngleOfTheInitialProductDomain = 1.0 + + if subdivisionsOfBasicAngle in [0, _MDI]: + subdivisionsOfBasicAngle = 1.0 / _GRID_ACCURACY_IN_DEGREES + + resolution = np.float64(basicAngleOfTheInitialProductDomain) + resolution /= subdivisionsOfBasicAngle + flags = resolution_flags(section["resolutionAndComponentFlags"]) + + # Grid Definition Template 3.4. Notes (2). + # Flag bits 3-4 are not applicable for this template. + if flags.uv_resolved and options.warn_on_unsupported: + msg = "Unable to translate resolution and component flags." + warnings.warn(msg) + + # Calculate the latitude and longitude points. + x_points = np.array(section["longitudes"], dtype=np.float64) * resolution + y_points = np.array(section["latitudes"], dtype=np.float64) * resolution + + # Determine whether the x-points (in degrees) are circular. + circular = _is_circular(x_points, 360.0) + + # Create the lat/lon coordinates. + y_coord = DimCoord(y_points, standard_name=y_name, units="degrees", coord_system=cs) + x_coord = DimCoord( + x_points, + standard_name=x_name, + units="degrees", + coord_system=cs, + circular=circular, + ) + + scan = scanning_mode(section["scanningMode"]) + + # Determine the lat/lon dimensions. + y_dim, x_dim = 0, 1 + if scan.j_consecutive: + y_dim, x_dim = 1, 0 + + # Add the lat/lon coordinates to the metadata dim coords. + metadata["dim_coords_and_dims"].append((y_coord, y_dim)) + metadata["dim_coords_and_dims"].append((x_coord, x_dim)) + + +def grid_definition_template_4(section, metadata): + """ + Translate grid definition template 4. + + This template represents variable resolution latitude/longitude. + + Updates the metadata in-place with the translations. + + Args: + + * section: + Dictionary of coded key/value pairs from section 3 of the message. + + * metadata: + :class:`collections.OrderedDict` of metadata. + + """ + # Determine the coordinate system. + major, minor, radius = ellipsoid_geometry(section) + cs = ellipsoid(section["shapeOfTheEarth"], major, minor, radius) + grid_definition_template_4_and_5(section, metadata, "latitude", "longitude", cs) + + +def grid_definition_template_5(section, metadata): + """ + Translate grid definition template 5. + + This template represents variable resolution rotated + latitude/longitude. + + Updates the metadata in-place with the translations. + + Args: + + * section: + Dictionary of coded key/value pairs from section 3 of the message. + + * metadata: + :class:`collections.OrderedDict` of metadata. + + """ + # Determine the coordinate system. + major, minor, radius = ellipsoid_geometry(section) + south_pole_lat = section["latitudeOfSouthernPole"] * _GRID_ACCURACY_IN_DEGREES + south_pole_lon = section["longitudeOfSouthernPole"] * _GRID_ACCURACY_IN_DEGREES + cs = icoord_systems.RotatedGeogCS( + -south_pole_lat, + math.fmod(south_pole_lon + 180, 360), + section["angleOfRotation"], + ellipsoid(section["shapeOfTheEarth"], major, minor, radius), + ) + grid_definition_template_4_and_5( + section, metadata, "grid_latitude", "grid_longitude", cs + ) + + +def grid_definition_template_10(section, metadata): + """ + Translate grid definition template 10. + + This template represents a Mercator grid. + + Updates the metadata in-place with the translations. + + Args: + + * section: + Dictionary of coded key/value pairs from section 3 of the message. + + * metadata: + :class:`collections.OrderedDict` of metadata. + + """ + major, minor, radius = ellipsoid_geometry(section) + geog_cs = ellipsoid(section["shapeOfTheEarth"], major, minor, radius) + + # standard_parallel is the latitude at which the Mercator projection + # intersects the Earth + standard_parallel = section["LaD"] * _GRID_ACCURACY_IN_DEGREES + + cs = icoord_systems.Mercator(standard_parallel=standard_parallel, ellipsoid=geog_cs) + + # Create the X and Y coordinates. + x_coord, y_coord, scan = _calculate_proj_coords_from_grid_lengths(section, cs) + + # Determine the lat/lon dimensions. + y_dim, x_dim = 0, 1 + if scan.j_consecutive: + y_dim, x_dim = 1, 0 + + # Add the X and Y coordinates to the metadata dim coords. + metadata["dim_coords_and_dims"].append((y_coord, y_dim)) + metadata["dim_coords_and_dims"].append((x_coord, x_dim)) + + +def grid_definition_template_12(section, metadata): + """ + Translate grid definition template 12. + + This template represents transverse Mercator. + + Updates the metadata in-place with the translations. + + Args: + + * section: + Dictionary of coded key/value pairs from section 3 of the message. + + * metadata: + :class:`collections.OrderedDict` of metadata. + + """ + major, minor, radius = ellipsoid_geometry(section) + geog_cs = ellipsoid(section["shapeOfTheEarth"], major, minor, radius) + + lat = section["latitudeOfReferencePoint"] * _GRID_ACCURACY_IN_DEGREES + lon = section["longitudeOfReferencePoint"] * _GRID_ACCURACY_IN_DEGREES + scale = section["scaleFactorAtReferencePoint"] + CM_TO_M = 0.01 + easting = section["XR"] * CM_TO_M + northing = section["YR"] * CM_TO_M + cs = icoord_systems.TransverseMercator(lat, lon, easting, northing, scale, geog_cs) + + # Fetch grid extents + x1 = section["X1"] + y1 = section["Y1"] + x2 = section["X2"] + y2 = section["Y2"] + + # Rather unhelpfully this grid definition template seems to be + # overspecified, and thus open to inconsistency. But for determining + # the extents the X1, Y1, X2, and Y2 points have the highest + # precision, as opposed to using Di and Dj. + # Check whether Di and Dj are as consistent as possible with that + # interpretation - i.e. they are within 1cm. + def check_range(v1, v2, n, d, axis_name): + small = min(v1, v2) + large = max(v1, v2) + min_last = small + (n - 1) * (d - 1) + max_last = small + (n - 1) * (d + 1) + if not (min_last < large < max_last): + message = ( + f"File grid {axis_name} definition inconsistent: " + f"{v1} to {v2} in {n} steps is incompatible with step-size " + f"{d} ." + ) + raise TranslationError(message) + + check_range(x1, x2, section["Ni"], section["Di"], "X") + check_range(y1, y2, section["Nj"], section["Dj"], "Y") + + # Further over-specification - the sequence of X1 & X2 is enough to + # generate the sequence in the correct direction (also Y1 & Y2). All + # scanningMode can do is add confusion; warn if there is inconsistency. + def validate_scanning(axis: str, stated: bool, encoded: bool): + def scan_str(scanning_bool): + return "positive" if scanning_bool else "negative" + + if stated != encoded: + message = ( + f"File grid {axis} definition inconsistent: " + f"scanningMode = {scan_str(stated)}, actual grid point " + f"direction is {scan_str(encoded)}." + ) + warnings.warn(message) + + scan = scanning_mode(section["scanningMode"]) + validate_scanning("X", not scan.i_negative, x1 < x2) + validate_scanning("Y", scan.j_positive, y1 < y2) + + x_points = np.linspace(x1 * CM_TO_M, x2 * CM_TO_M, section["Ni"]) + y_points = np.linspace(y1 * CM_TO_M, y2 * CM_TO_M, section["Nj"]) + + # Create the X and Y coordinates. + y_coord = DimCoord(y_points, "projection_y_coordinate", units="m", coord_system=cs) + x_coord = DimCoord(x_points, "projection_x_coordinate", units="m", coord_system=cs) + + # Determine the lat/lon dimensions. + y_dim, x_dim = 0, 1 + if scan.j_consecutive: + y_dim, x_dim = 1, 0 + + # Add the X and Y coordinates to the metadata dim coords. + metadata["dim_coords_and_dims"].append((y_coord, y_dim)) + metadata["dim_coords_and_dims"].append((x_coord, x_dim)) + + +def grid_definition_template_20(section, metadata): + """ + Translate grid definition template 20. + + This template represents a Polar Stereographic grid. + + Updates the metadata in-place with the translations. + + Args: + + * section: + Dictionary of coded key/value pairs from section 3 of the message. + + * metadata: + :class:`collections.OrderedDict` of metadata. + + """ + major, minor, radius = ellipsoid_geometry(section) + geog_cs = ellipsoid(section["shapeOfTheEarth"], major, minor, radius) + + proj_centre = projection_centre(section["projectionCentreFlag"]) + if proj_centre.bipolar_and_symmetric: + raise TranslationError( + "Bipolar and symmetric polar stereo projections" + " are not supported by the " + "grid_definition_template_20 translation." + ) + if proj_centre.south_pole_on_projection_plane: + central_lat = -90.0 + else: + central_lat = 90.0 + central_lon = section["orientationOfTheGrid"] * _GRID_ACCURACY_IN_DEGREES + true_scale_lat = section["LaD"] * _GRID_ACCURACY_IN_DEGREES + # Always load PolarStereographic - never Stereographic. + # Stereographic is a CF/Iris concept and not something described + # in GRIB. + cs = icoord_systems.PolarStereographic( + central_lat=central_lat, + central_lon=central_lon, + true_scale_lat=true_scale_lat, + ellipsoid=geog_cs, + ) + x_coord, y_coord, scan = _calculate_proj_coords_from_grid_lengths(section, cs) + + # Determine the order of the dimensions. + y_dim, x_dim = 0, 1 + if scan.j_consecutive: + y_dim, x_dim = 1, 0 + + # Add the projection coordinates to the metadata dim coords. + metadata["dim_coords_and_dims"].append((y_coord, y_dim)) + metadata["dim_coords_and_dims"].append((x_coord, x_dim)) + + +def _calculate_proj_coords_from_grid_lengths(section, cs): + # Construct the coordinate points, the start point is given in millidegrees + # but the distance measurement is in 10-3 m, so a conversion is necessary + # to find the origin in m. + + # Conversion factor millimetres to metres + mm_to_m = 1e-3 + + if section["gridDefinitionTemplateNumber"] in _XYGRIDLENGTH_GDT_NUMBERS: + if section["gridDefinitionTemplateNumber"] == 140: + dx = section["xDirectionGridLengthInMillimetres"] + dy = section["yDirectionGridLengthInMillimetres"] + nx = section["numberOfPointsAlongXAxis"] + ny = section["numberOfPointsAlongYAxis"] + else: + dx = section["Dx"] + dy = section["Dy"] + nx = section["Nx"] + ny = section["Ny"] + elif section["gridDefinitionTemplateNumber"] in _IJGRIDLENGTH_GDT_NUMBERS: + dx = section["Di"] + dy = section["Dj"] + nx = section["Ni"] + ny = section["Nj"] + else: + raise TranslationError("Unsupported lat-lon point parameters") + + scan = scanning_mode(section["scanningMode"]) + lon_0 = section["longitudeOfFirstGridPoint"] * _GRID_ACCURACY_IN_DEGREES + lat_0 = section["latitudeOfFirstGridPoint"] * _GRID_ACCURACY_IN_DEGREES + x0_m, y0_m = cs.as_cartopy_crs().transform_point(lon_0, lat_0, ccrs.Geodetic()) + dx_m = dx * mm_to_m + dy_m = dy * mm_to_m + x_dir = -1 if scan.i_negative else 1 + y_dir = 1 if scan.j_positive else -1 + x_points = x0_m + dx_m * x_dir * np.arange(nx, dtype=np.float64) + y_points = y0_m + dy_m * y_dir * np.arange(ny, dtype=np.float64) + + # Create the dimension coordinates. + x_coord = DimCoord( + x_points, standard_name="projection_x_coordinate", units="m", coord_system=cs + ) + y_coord = DimCoord( + y_points, standard_name="projection_y_coordinate", units="m", coord_system=cs + ) + return x_coord, y_coord, scan + + +def grid_definition_template_30(section, metadata): + """ + Translate grid definition template 30. + + This template represents a Lambert Conformal grid. + + Updates the metadata in-place with the translations. + + Args: + + * section: + Dictionary of coded key/value pairs from section 3 of the message. + + * metadata: + :class:`collections.OrderedDict` of metadata. + + """ + major, minor, radius = ellipsoid_geometry(section) + geog_cs = ellipsoid(section["shapeOfTheEarth"], major, minor, radius) + + central_latitude = section["LaD"] * _GRID_ACCURACY_IN_DEGREES + central_longitude = section["LoV"] * _GRID_ACCURACY_IN_DEGREES + false_easting = 0 + false_northing = 0 + secant_latitudes = ( + section["Latin1"] * _GRID_ACCURACY_IN_DEGREES, + section["Latin2"] * _GRID_ACCURACY_IN_DEGREES, + ) + + cs = icoord_systems.LambertConformal( + central_latitude, + central_longitude, + false_easting, + false_northing, + secant_latitudes=secant_latitudes, + ellipsoid=geog_cs, + ) + + # A projection centre flag is defined for GDT30. However, we don't need to + # know which pole is in the projection plane as Cartopy handles that. The + # Other component of the projection centre flag determines if there are + # multiple projection centres. There is no support for this in Proj4 or + # Cartopy so a translation error is raised if this flag is set. + proj_centre = projection_centre(section["projectionCentreFlag"]) + if proj_centre.bipolar_and_symmetric: + msg = "Unsupported projection centre: Bipolar and symmetric." + raise TranslationError(msg) + + res_flags = resolution_flags(section["resolutionAndComponentFlags"]) + if not res_flags.uv_resolved and options.warn_on_unsupported: + # Vector components are given as relative to east an north, rather than + # relative to the projection coordinates, issue a warning in this case. + # (ideally we need a way to add this information to a cube) + msg = "Unable to translate resolution and component flags." + warnings.warn(msg) + + x_coord, y_coord, scan = _calculate_proj_coords_from_grid_lengths(section, cs) + + # Determine the order of the dimensions. + y_dim, x_dim = 0, 1 + if scan.j_consecutive: + y_dim, x_dim = 1, 0 + + # Add the projection coordinates to the metadata dim coords. + metadata["dim_coords_and_dims"].append((y_coord, y_dim)) + metadata["dim_coords_and_dims"].append((x_coord, x_dim)) + + +def grid_definition_template_40(section, metadata): + """ + Translate an "irregular form" grid definition template 40. + + This template represents a Gaussian grid. + + Updates the metadata in-place with the translations. + + Args: + + * section: + Dictionary of coded key/value pairs from section 3 of the message. + + * metadata: + :class:`collections.OrderedDict` of metadata. + + """ + major, minor, radius = ellipsoid_geometry(section) + cs = ellipsoid(section["shapeOfTheEarth"], major, minor, radius) + + if ( + section["numberOfOctectsForNumberOfPoints"] != 0 + or section["interpretationOfNumberOfPoints"] != 0 + ): + grid_definition_template_40_reduced(section, metadata, cs) + else: + grid_definition_template_40_regular(section, metadata, cs) + + +def grid_definition_template_40_regular(section, metadata, cs): + """ + Translate a "regular form" grid definition template 40. + + This template represents a regular Gaussian grid. + + """ + scan = scanning_mode(section["scanningMode"]) + + # Set resolution flags + res_flags = resolution_flags(section["resolutionAndComponentFlags"]) + + # Calculate longitude points. + x_inc = ( + section["iDirectionIncrement"] + if res_flags.i_increments_given + else _calculate_increment( + section["longitudeOfFirstGridPoint"], + section["longitudeOfLastGridPoint"], + section["Ni"] - 1, + 360.0 / _GRID_ACCURACY_IN_DEGREES, + ) + ) + x_inc *= _GRID_ACCURACY_IN_DEGREES + x_offset = section["longitudeOfFirstGridPoint"] * _GRID_ACCURACY_IN_DEGREES + x_direction = -1 if scan.i_negative else 1 + Ni = section["Ni"] + x_points = np.arange(Ni, dtype=np.float64) * x_inc * x_direction + x_offset + + # Determine whether the x-points (in degrees) are circular. + circular = _is_circular(x_points, 360.0) + + # Get the latitude points. + # + # Gaussian latitudes are defined by Gauss-Legendre quadrature and the Gauss + # quadrature rule (http://en.wikipedia.org/wiki/Gaussian_quadrature). The + # latitudes of a particular Gaussian grid are uniquely defined by the + # number of latitudes between the equator and the pole, N. The latitudes + # are calculated from the roots of a Legendre series which must be + # calculated numerically. This process involves forming a (possibly large) + # companion matrix, computing its eigenvalues, and usually at least one + # application of Newton's method to achieve best results + # (http://en.wikipedia.org/wiki/Newton%27s_method). The latitudes are given + # by the arcsine of the roots converted to degrees. This computation can be + # time-consuming, especially for large grid sizes. + # + # A direct computation would require: + # 1. Reading the coded key 'N' representing the number of latitudes + # between the equator and pole. + # 2. Computing the set of global Gaussian latitudes associated with the + # value of N. + # 3. Determining the direction of the latitude points from the scanning + # mode. + # 4. Producing a subset of the latitudes based on the given first and + # last latitude points, given by the coded keys La1 and La2. + # + # Given the complexity and potential for poor performance of calculating + # the Gaussian latitudes directly, the GRIB-API computed key + # 'distinctLatitudes' is utilised to obtain the latitude points from the + # GRIB2 message. This computed key provides a rapid calculation of the + # monotonic latitude points that form the Gaussian grid, accounting for + # the coverage of the grid. + y_points = section.get_computed_key("distinctLatitudes") + y_points.sort() + if not scan.j_positive: + y_points = y_points[::-1] + + # Create lat/lon coordinates. + x_coord = DimCoord( + x_points, + standard_name="longitude", + units="degrees", + coord_system=cs, + circular=circular, + ) + y_coord = DimCoord( + y_points, standard_name="latitude", units="degrees", coord_system=cs + ) + + # Determine the lat/lon dimensions. + y_dim, x_dim = 0, 1 + if scan.j_consecutive: + y_dim, x_dim = 1, 0 + + # Add the lat/lon coordinates to the metadata dim coords. + metadata["dim_coords_and_dims"].append((y_coord, y_dim)) + metadata["dim_coords_and_dims"].append((x_coord, x_dim)) + + +def grid_definition_template_40_reduced(section, metadata, cs): + """ + Translate a "reduced form" grid definition template 40. + + This template represents a reduced Gaussian grid. + + """ + # Get the latitude and longitude points. + # + # The same comments made in grid_definition_template_40_regular regarding + # computation of Gaussian lattiudes applies here too. Further to this the + # reduced Gaussian grid is not rectangular, the number of points along + # each latitude circle vary with latitude. Whilst it is possible to + # compute the latitudes and longitudes individually for each grid point + # from coded keys, it would be complex and time-consuming compared to + # loading the latitude and longitude arrays directly using the computed + # keys 'latitudes' and 'longitudes'. + x_points = section.get_computed_key("longitudes") + y_points = section.get_computed_key("latitudes") + + # Create lat/lon coordinates. + x_coord = AuxCoord( + x_points, standard_name="longitude", units="degrees", coord_system=cs + ) + y_coord = AuxCoord( + y_points, standard_name="latitude", units="degrees", coord_system=cs + ) + + # Add the lat/lon coordinates to the metadata dim coords. + metadata["aux_coords_and_dims"].append((y_coord, 0)) + metadata["aux_coords_and_dims"].append((x_coord, 0)) + + +def grid_definition_template_90(section, metadata): + """ + Translate grid definition template 90. + + This template represents a space view. + + Updates the metadata in-place with the translations. + + Args: + + * section: + Dictionary of coded key/value pairs from section 3 of the message. + + * metadata: + :class:`collections.OrderedDict` of metadata. + + """ + if section["Nr"] == _MDI: + raise TranslationError("Unsupported orthographic grid.") + elif section["Nr"] == 0: + raise TranslationError("Unsupported zero height for space-view.") + if section["orientationOfTheGrid"] != 0: + raise TranslationError("Unsupported space-view orientation.") + + # Determine the coordinate system. + sub_satellite_lat = ( + section["latitudeOfSubSatellitePoint"] * _GRID_ACCURACY_IN_DEGREES + ) + # The subsequent calculations to determine the apparent Earth + # diameters rely on the satellite being over the equator. + if sub_satellite_lat != 0: + raise TranslationError( + "Unsupported non-zero latitude for space-view perspective." + ) + sub_satellite_lon = ( + section["longitudeOfSubSatellitePoint"] * _GRID_ACCURACY_IN_DEGREES + ) + major, minor, radius = ellipsoid_geometry(section) + geog_cs = ellipsoid(section["shapeOfTheEarth"], major, minor, radius) + height_above_centre = geog_cs.semi_major_axis * section["Nr"] / 1e6 + height_above_ellipsoid = height_above_centre - geog_cs.semi_major_axis + + # Figure out how large the Earth would appear in projection coordinates. + # For both the apparent equatorial and polar diameters this is a + # two-step process: + # 1) Determine the angle subtended by the visible surface. + # 2) Convert that angle into projection coordinates. + # NB. The solutions given below assume the satellite is over the + # equator. + # The apparent equatorial angle uses simple, circular geometry. + # But to derive the apparent polar angle we use the auxiliary circle + # parametric form of the ellipse. In this form, the equation for the + # tangent line is given by: + # x cos(psi) y sin(psi) + # ---------- + ---------- = 1 + # a b + # By considering the cases when x=0 and y=0, the apparent polar + # angle (theta) is given by: + # tan(theta) = b / sin(psi) + # ------------ + # a / cos(psi) + # This can be simplified using: cos(psi) = a / height_above_centre + half_apparent_equatorial_angle = math.asin( + geog_cs.semi_major_axis / height_above_centre + ) + parametric_angle = math.acos(geog_cs.semi_major_axis / height_above_centre) + half_apparent_polar_angle = math.atan( + geog_cs.semi_minor_axis / (height_above_centre * math.sin(parametric_angle)) + ) + y_apparent_angular_diameter = 2 * half_apparent_polar_angle + x_apparent_angular_diameter = 2 * half_apparent_equatorial_angle + y_step = y_apparent_angular_diameter / section["dy"] + x_step = x_apparent_angular_diameter / section["dx"] + y_start = y_step * (section["Yo"] - section["Yp"] / 1000) + x_start = x_step * (section["Xo"] - section["Xp"] / 1000) + y_points = y_start + np.arange(section["Ny"]) * y_step + x_points = x_start + np.arange(section["Nx"]) * x_step + + # This has only been tested with -x/+y scanning, so raise an error + # for other permutations. + scan = scanning_mode(section["scanningMode"]) + if scan.i_negative: + x_points = -x_points + else: + raise TranslationError("Unsupported +x scanning") + if not scan.j_positive: + raise TranslationError("Unsupported -y scanning") + + # Make a coordinate system for the X and Y coordinates. + # Note: false_easting/northing are always just zero, as the calculation of + # x_points/y_points takes both Xp/Yp and Xo/Yo into account. + cs = icoord_systems.Geostationary( + latitude_of_projection_origin=sub_satellite_lat, + longitude_of_projection_origin=sub_satellite_lon, + perspective_point_height=height_above_ellipsoid, + sweep_angle_axis="y", + ellipsoid=geog_cs, + ) + + # Create the X and Y coordinates. + y_coord = DimCoord( + y_points, "projection_y_coordinate", units="radians", coord_system=cs + ) + x_coord = DimCoord( + x_points, "projection_x_coordinate", units="radians", coord_system=cs + ) + + # Determine the lat/lon dimensions. + y_dim, x_dim = 0, 1 + if scan.j_consecutive: + y_dim, x_dim = 1, 0 + + # Add the X and Y coordinates to the metadata dim coords. + metadata["dim_coords_and_dims"].append((y_coord, y_dim)) + metadata["dim_coords_and_dims"].append((x_coord, x_dim)) + + +def grid_definition_template_140(section, metadata): + """ + Translate grid definition template 140. + + This template represents Lambert Azimuthal Equal Area. + + Updates the metadata in-place with the translations. + + Args: + + * section: + Dictionary of coded key/value pairs from section 3 of the message. + + * metadata: + :class:`collections.OrderedDict` of metadata. + """ + # Define the coordinate system + major, minor, radius = ellipsoid_geometry(section) + cs = icoord_systems.LambertAzimuthalEqualArea( + section["standardParallelInMicrodegrees"] * _GRID_ACCURACY_IN_DEGREES, + section["centralLongitudeInMicrodegrees"] * _GRID_ACCURACY_IN_DEGREES, + 0, + 0, + ellipsoid(section["shapeOfTheEarth"], major, minor, radius), + ) + + x_coord, y_coord, scan = _calculate_proj_coords_from_grid_lengths(section, cs) + + # Determine the order of the dimensions. + y_dim, x_dim = 0, 1 + if scan.j_consecutive: + y_dim, x_dim = 1, 0 + + # Add the projection coordinates to the metadata dim coords. + metadata["dim_coords_and_dims"].append((y_coord, y_dim)) + metadata["dim_coords_and_dims"].append((x_coord, x_dim)) + + +def grid_definition_section(section, metadata): + """ + Translate section 3 from the GRIB2 message. + + Update the metadata in-place with the translations. + + Args: + + * section: + Dictionary of coded key/value pairs from section 3 of the message. + + * metadata: + :class:`collections.OrderedDict` of metadata. + + """ + # Reference GRIB2 Code Table 3.0. + value = section["sourceOfGridDefinition"] + if value != 0: + msg = ( + "Grid definition section 3 contains unsupported " + "source of grid definition [{}]".format(value) + ) + raise TranslationError(msg) + + # Reference GRIB2 Code Table 3.1. + template = section["gridDefinitionTemplateNumber"] + + if template == 0: + # Process regular latitude/longitude grid (regular_ll) + grid_definition_template_0(section, metadata) + elif template == 1: + # Process rotated latitude/longitude grid. + grid_definition_template_1(section, metadata) + elif template == 4: + # Process variable resolution latitude/longitude. + grid_definition_template_4(section, metadata) + elif template == 5: + # Process variable resolution rotated latitude/longitude. + grid_definition_template_5(section, metadata) + elif template == 10: + # Process Mercator. + grid_definition_template_10(section, metadata) + elif template == 12: + # Process transverse Mercator. + grid_definition_template_12(section, metadata) + elif template == 20: + # Polar stereographic. + grid_definition_template_20(section, metadata) + elif template == 30: + # Process Lambert conformal: + grid_definition_template_30(section, metadata) + elif template == 40: + grid_definition_template_40(section, metadata) + elif template == 90: + # Process space view. + grid_definition_template_90(section, metadata) + elif template == 140: + # Process Lambert Azimuthal Equal Area. + grid_definition_template_140(section, metadata) + else: + msg = "Grid definition template [{}] is not supported".format(template) + raise TranslationError(msg) + + +############################################################################### +# +# Product Definition Section 4 +# +############################################################################### + + +def translate_phenomenon( + metadata, + discipline, + parameterCategory, + parameterNumber, + typeOfFirstFixedSurface, + scaledValueOfFirstFixedSurface, + typeOfSecondFixedSurface, + probability=None, +): + """ + Translate GRIB2 phenomenon to CF phenomenon. + + Updates the metadata in-place with the translations. + + Args: + + * metadata: + :class:`collections.OrderedDict` of metadata. + + * discipline: + Message section 0, octet 7. + + * parameterCategory: + Message section 4, octet 10. + + * parameterNumber: + Message section 4, octet 11. + + Kwargs: + + * probability (:class:`Probability`): + If present, the data encodes a forecast probability analysis with the + given properties. + + """ + cf = itranslation.grib2_phenom_to_cf_info( + param_discipline=discipline, + param_category=parameterCategory, + param_number=parameterNumber, + ) + if cf is not None: + if probability is None: + metadata["standard_name"] = cf.standard_name + metadata["long_name"] = cf.long_name + metadata["units"] = cf.units + else: + # The basic name+unit info goes into a 'threshold coordinate' which + # encodes probability threshold values. + threshold_coord = DimCoord( + probability.threshold, + standard_name=cf.standard_name, + long_name=cf.long_name, + units=cf.units, + ) + metadata["aux_coords_and_dims"].append((threshold_coord, None)) + # The main cube has an adjusted name, and units of '1'. + base_name = cf.standard_name or cf.long_name + long_name = "probability_of_{}_{}".format( + base_name, probability.probability_type_name + ) + metadata["standard_name"] = None + metadata["long_name"] = long_name + metadata["units"] = Unit(1) + + # Add a standard attribute recording the grib phenomenon identity. + metadata["attributes"]["GRIB_PARAM"] = GRIBCode( + edition=2, + discipline=discipline, + category=parameterCategory, + number=parameterNumber, + ) + + # Identify hybrid height and pressure reference fields. + # Look for fields at surface level first. + if ( + typeOfFirstFixedSurface == 1 + and scaledValueOfFirstFixedSurface == 0 + and typeOfSecondFixedSurface == _TYPE_OF_FIXED_SURFACE_MISSING + ): + # Land surface products for model terrain height: + if discipline == 2 and parameterCategory == 0 and parameterNumber == 7: + metadata["references"].append(ReferenceTarget("ref_orography", None)) + # Meteorological mass products for pressure: + elif discipline == 0 and parameterCategory == 3 and parameterNumber == 0: + metadata["references"].append( + ReferenceTarget( + "ref_surface_pressure", ensure_surface_air_pressure_name + ) + ) + + +def ensure_surface_air_pressure_name(cube): + # A 'transform' function for a iris.fileformats.rules.ReferenceTarget, + # instructing the rules code to rename the reference as + # 'surface_air_pressure'. + # + # Needed because the surface-air-pressure (reference) message normally + # loads as a plain 'air_pressure' cube. + # As references for factory construction are identified by .name(), in this + # case that can get confused with the derived coordinate produced by the + # HybridPressureFactory itself, which is also named 'air_pressure'. + # This will cause an infinite loop when building the derived coord (!) + name = cube.name() + # Just check the passed cube is of the sort expected. + expected_names = ("air_pressure", "surface_air_pressure") + if name not in expected_names: + msg = ( + "Unexpected cube name for hybrid-pressure reference data : " + "Expected one of {}, got {!r}." + ) + raise ValueError(msg.format(expected_names, name)) + # Get the caller (in rules.py) to rename it. + return {"standard_name": "surface_air_pressure"} + + +def time_range_unit(indicatorOfUnitForForecastTime): + """ + Translate the time range indicator. + + Translate the time range indicator to an equivalent + :class:`cf_units.Unit`. + + Args: + + * indicatorOfUnitForForecastTime: + Message section 4, octet 18. + + Returns: + :class:`cf_units.Unit`. + + """ + try: + unit = Unit(_TIME_RANGE_UNITS[indicatorOfUnitForForecastTime]) + except (KeyError, ValueError): + msg = ( + "Product definition section 4 contains unsupported " + "time range unit [{}]".format(indicatorOfUnitForForecastTime) + ) + raise TranslationError(msg) + return unit + + +def hybrid_factories(section, metadata): + """ + Translate the section 4 optional hybrid vertical coordinates. + + Updates the metadata in-place with the translations. + + Reference GRIB2 Code Table 4.5. + + Relevant notes: + [3] Hybrid pressure level (119) shall be used instead of Hybrid level (105) + + Args: + + * section: + Dictionary of coded key/value pairs from section 4 of the message. + + * metadata: + :class:`collections.OrderedDict` of metadata. + + """ + NV = section["NV"] + if NV > 0: + typeOfFirstFixedSurface = section["typeOfFirstFixedSurface"] + if typeOfFirstFixedSurface == _TYPE_OF_FIXED_SURFACE_MISSING: + msg = ( + "Product definition section 4 contains missing " + "type of first fixed surface" + ) + raise TranslationError(msg) + + typeOfSecondFixedSurface = section["typeOfSecondFixedSurface"] + if typeOfSecondFixedSurface != _TYPE_OF_FIXED_SURFACE_MISSING: + msg = ( + "Product definition section 4 contains unsupported type " + "of second fixed surface [{}]".format(typeOfSecondFixedSurface) + ) + raise TranslationError(msg) + + if typeOfFirstFixedSurface in [105, 118, 119]: + # Hybrid level (105), Hybrid height level (118) and Hybrid + # pressure level (119). + scaleFactor = section["scaleFactorOfFirstFixedSurface"] + if scaleFactor != 0: + msg = ( + "Product definition section 4 contains invalid scale " + "factor of first fixed surface [{}]".format(scaleFactor) + ) + raise TranslationError(msg) + + # Create the model level number scalar coordinate. + scaledValue = section["scaledValueOfFirstFixedSurface"] + coord = DimCoord( + scaledValue, + standard_name="model_level_number", + units=1, + attributes=dict(positive="up"), + ) + metadata["aux_coords_and_dims"].append((coord, None)) + + if typeOfFirstFixedSurface == 118: + # height + level_value_name = "level_height" + level_value_units = "m" + factory_class = HybridHeightFactory + factory_args = [ + {"long_name": level_value_name}, + {"long_name": "sigma"}, + Reference("ref_orography"), + ] + else: + # pressure + level_value_name = "level_pressure" + level_value_units = "Pa" + factory_class = HybridPressureFactory + factory_args = [ + {"long_name": level_value_name}, + {"long_name": "sigma"}, + Reference("ref_surface_pressure"), + ] + + # Create the level height/pressure scalar coordinate. + # scaledValue represents the level number, which is used to select + # the sigma and delta values as follows: + # sigma, delta = PV[i], PV[NV/2+i] : where i=1..level_number + pv = section["pv"] + offset = scaledValue + coord = DimCoord( + pv[offset], long_name=level_value_name, units=level_value_units + ) + metadata["aux_coords_and_dims"].append((coord, None)) + # Create the sigma scalar coordinate. + offset = NV // 2 + scaledValue + coord = AuxCoord(pv[offset], long_name="sigma", units=1) + metadata["aux_coords_and_dims"].append((coord, None)) + # Create the associated factory reference. + factory = Factory(factory_class, factory_args) + metadata["factories"].append(factory) + + else: + msg = ( + "Product definition section 4 contains unsupported " + "first fixed surface [{}]".format(typeOfFirstFixedSurface) + ) + raise TranslationError(msg) + + +def vertical_coords(section, metadata): + """ + Translate the vertical coordinates or hybrid vertical coordinates. + + Updates the metadata in-place with the translations. + + Reference GRIB2 Code Table 4.5. + + Args: + + * section: + Dictionary of coded key/value pairs from section 4 of the message. + + * metadata: + :class:`collections.OrderedDict` of metadata. + + """ + if section["NV"] > 0: + # Generate hybrid vertical coordinates. + hybrid_factories(section, metadata) + else: + # Generate vertical coordinate. + # section is not a true dict and does not support the get method. + try: + typeOfFirstFixedSurface = section["typeOfFirstFixedSurface"] + except KeyError: + typeOfFirstFixedSurface = _TYPE_OF_FIXED_SURFACE_MISSING + try: + typeOfSecondFixedSurface = section["typeOfSecondFixedSurface"] + except KeyError: + typeOfSecondFixedSurface = _TYPE_OF_FIXED_SURFACE_MISSING + + # We treat fixed surface level type=1 as having no vertical coordinate. + # See https://github.com/SciTools/iris/issues/519 + if typeOfFirstFixedSurface in [ + _TYPE_OF_FIXED_SURFACE_MISSING, + 1, + ] and typeOfSecondFixedSurface in [_TYPE_OF_FIXED_SURFACE_MISSING, 1]: + return + fixed_surface_missing = FixedSurface(None, None, None, None) + fixed_surface_first = _FIXED_SURFACE.get( + typeOfFirstFixedSurface, fixed_surface_missing + ) + if fixed_surface_first.point is not None: + # We have a surface type that includes the point in its definition + lower_bound = fixed_surface_first.point + else: + lower_bound = _get_surface_value(section, "First", warn_only=True) + point = lower_bound + + if typeOfSecondFixedSurface != _TYPE_OF_FIXED_SURFACE_MISSING: + fixed_surface_second = _FIXED_SURFACE.get( + typeOfSecondFixedSurface, fixed_surface_missing + ) + if fixed_surface_second.point is not None: + # We have a surface type that includes the point in its definition + upper_bound = fixed_surface_second.point + else: + upper_bound = _get_surface_value(section, "Second") + if upper_bound is not None: + point = 0.5 * (lower_bound + upper_bound) + bounds = [lower_bound, upper_bound] + else: + bounds = None + fixed_surface_second = None + upper_bound = None + if point is None: + return + coords = _build_vertical_coords( + bounds, + fixed_surface_first, + fixed_surface_second, + lower_bound, + point, + upper_bound, + ) + for coord in coords: + # Add the vertical coordinate(s) to metadata aux coords. + if fixed_surface_first == fixed_surface_missing: + coord.attributes["GRIB_fixed_surface_type"] = typeOfFirstFixedSurface + metadata["aux_coords_and_dims"].append((coord, None)) + + +def _build_vertical_coords( + bounds: list[float] | None, + fixed_surface_first: FixedSurface, + fixed_surface_second: FixedSurface | None, + lower_bound: float, + point: float, + upper_bound: float, +) -> list[DimCoord]: + """ + Build the vertical coordinates based on the bounds and fixed surface types. + + If the bounds are not None and the first and second fixed surfaces represent + different quantities, create two coordinates, one for each bound. + Otherwise, create a single coordinate with the point and bounds values. + + Args: + bounds: + List of two floats representing the lower and upper bounds, or None. + fixed_surface_first: + FixedSurface object for the first surface type (lower bound). + fixed_surface_second: + FixedSurface object for the second surface type (upper bound). + lower_bound: + The lower bound value. + point: + The point value to use if bounds are None. + upper_bound: + The upper bound value. + + Returns: + List of Coord objects representing the vertical coordinates. + """ + first_coord_kwargs = fixed_surface_first._asdict() + first_coord_kwargs.pop("point", None) + second_coord_kwargs = fixed_surface_second._asdict() if fixed_surface_second else {} + second_coord_kwargs.pop("point", None) + coords = [] + if bounds and first_coord_kwargs != second_coord_kwargs: + # Create two coords, one for each bound. + first_bounds = np.ma.masked_array(bounds, [False, True]) + coord = AuxCoord(lower_bound, bounds=first_bounds, **first_coord_kwargs) + coords.append(coord) + + second_bounds = np.ma.masked_array(bounds, [True, False]) + coord = AuxCoord(upper_bound, bounds=second_bounds, **second_coord_kwargs) + coords.append(coord) + else: + coord = DimCoord(point, bounds=bounds, **first_coord_kwargs) + coords.append(coord) + return coords + + +def _get_surface_value(section, sub_item, warn_only=False): + key = f"scaledValueOf{sub_item}FixedSurface" + scaledValueOfFixedSurface = section[key] + if scaledValueOfFixedSurface == _MDI: + msg = ( + f"Unable to translate type of {sub_item} fixed " + "surface with missing scaled value." + ) + if warn_only: + if options.warn_on_unsupported: + warnings.warn(msg) + else: + raise TranslationError(msg) + first = None + else: + key = f"scaleFactorOf{sub_item}FixedSurface" + scaleFactorOfFixedSurface = section[key] + first = unscale( + scaledValueOfFixedSurface, + scaleFactorOfFixedSurface, + ) + return first + + +def forecast_period_coord(indicatorOfUnitForForecastTime, forecastTime): + """ + Create the forecast period coordinate. + + Args: + + * indicatorOfUnitForForecastTime: + Message section 4, octets 18. + + * forecastTime: + Message section 4, octets 19-22. + + Returns: + The scalar forecast period :class:`iris.coords.DimCoord`. + + """ + # Determine the forecast period and associated units. + unit = time_range_unit(indicatorOfUnitForForecastTime) + point = unit.convert(forecastTime, "hours") + # Create the forecast period scalar coordinate. + coord = DimCoord(point, standard_name="forecast_period", units="hours") + return coord + + +def statistical_forecast_period_coord(section, frt_coord): + """ + Create a forecast period coordinate for a time-statistic message. + + This applies only with a product definition template 4.8. + + Args: + + * section: + Dictionary of coded key/value pairs from section 4 of the message. + + * frt_coord: + The scalar forecast reference time :class:`iris.coords.DimCoord`. + + Returns: + The scalar forecast period :class:`iris.coords.DimCoord`, containing a + single, bounded point (period value). + + """ + # Get the period end time as a datetime. + end_time = datetime( + section["yearOfEndOfOverallTimeInterval"], + section["monthOfEndOfOverallTimeInterval"], + section["dayOfEndOfOverallTimeInterval"], + section["hourOfEndOfOverallTimeInterval"], + section["minuteOfEndOfOverallTimeInterval"], + section["secondOfEndOfOverallTimeInterval"], + ) + + # Get forecast reference time (frt) as a datetime. + frt_point = frt_coord.units.num2date(frt_coord.points[0]) + + # Get the period start time (as a timedelta relative to the frt). + forecast_time = section["forecastTime"] + if options.support_hindcast_values: + # Apply the hindcast fix. + forecast_time = _hindcast_fix(forecast_time) + forecast_units = time_range_unit(section["indicatorOfUnitForForecastTime"]) + forecast_seconds = forecast_units.convert(forecast_time, "seconds") + start_time_delta = timedelta(seconds=forecast_seconds) + + # Get the period end time (as a timedelta relative to the frt). + end_time_delta = end_time - frt_point + + # Get the middle of the period (as a timedelta relative to the frt). + # Note: timedelta division in 2.7 is odd. Even though we request integer + # division, it's to the nearest _micro_second. + mid_time_delta = (start_time_delta + end_time_delta) // 2 + + # Create and return the forecast period coordinate. + def timedelta_hours(timedelta): + return timedelta.total_seconds() / 3600.0 + + mid_point_hours = timedelta_hours(mid_time_delta) + bounds_hours = [timedelta_hours(start_time_delta), timedelta_hours(end_time_delta)] + fp_coord = DimCoord( + mid_point_hours, + bounds=bounds_hours, + standard_name="forecast_period", + units="hours", + ) + return fp_coord + + +def other_time_coord(rt_coord, fp_coord): + """ + Make the "other" scalar time DimCoord. + + Return the counterpart to the given scalar 'time' or + 'forecast_reference_time' coordinate, by combining it with the + given forecast_period coordinate. + + Bounds are not supported. + + Args: + + * rt_coord: + The scalar "reference time" :class:`iris.coords.DimCoord`, + as defined by section 1. This must be either a 'time' or + 'forecast_reference_time' coordinate. + + * fp_coord: + The scalar 'forecast_period' :class:`iris.coords.DimCoord`. + + Returns: + The scalar :class:`iris.coords.DimCoord` for either 'time' or + 'forecast_reference_time'. + + """ + if not rt_coord.units.is_time_reference(): + fmt = "Invalid unit for reference time coord: {}" + raise ValueError(fmt.format(rt_coord.units)) + if not fp_coord.units.is_time(): + fmt = "Invalid unit for forecast_period coord: {}" + raise ValueError(fmt.format(fp_coord.units)) + if rt_coord.has_bounds() or fp_coord.has_bounds(): + raise ValueError("Coordinate bounds are not supported") + if rt_coord.shape != (1,) or fp_coord.shape != (1,): + raise ValueError("Vector coordinates are not supported") + + if rt_coord.standard_name == "time": + rt_base_unit = str(rt_coord.units).split(" since ")[0] + fp = fp_coord.units.convert(fp_coord.points[0], rt_base_unit) + frt = rt_coord.points[0] - fp + return DimCoord(frt, "forecast_reference_time", units=rt_coord.units) + elif rt_coord.standard_name == "forecast_reference_time": + return validity_time_coord(rt_coord, fp_coord) + else: + fmt = "Unexpected reference time coordinate: {}" + raise ValueError(fmt.format(rt_coord.name())) + + +def validity_time_coord(frt_coord, fp_coord): + """ + Create the validity or phenomenon time coordinate. + + Args: + + * frt_coord: + The scalar forecast reference time :class:`iris.coords.DimCoord`. + + * fp_coord: + The scalar forecast period :class:`iris.coords.DimCoord`. + + Returns: + The scalar time :class:`iris.coords.DimCoord`. + It has bounds if the period coord has them, otherwise not. + + """ + if frt_coord.shape != (1,): + msg = ( + "Expected scalar forecast reference time coordinate when " + "calculating validity time, got shape {!r}".format(frt_coord.shape) + ) + raise ValueError(msg) + + if fp_coord.shape != (1,): + msg = ( + "Expected scalar forecast period coordinate when " + "calculating validity time, got shape {!r}".format(fp_coord.shape) + ) + raise ValueError(msg) + + def coord_timedelta(coord, value): + # Helper to convert a time coordinate value into a timedelta. + seconds = coord.units.convert(value, "seconds") + return timedelta(seconds=seconds) + + # Calculate validity (phenomenon) time in forecast-reference-time units. + frt_point = frt_coord.units.num2date(frt_coord.points[0]) + point_delta = coord_timedelta(fp_coord, fp_coord.points[0]) + point = float(frt_coord.units.date2num(frt_point + point_delta)) + + # Calculate bounds (if any) in the same way. + if fp_coord.bounds is None: + bounds = None + else: + bounds_deltas = [ + coord_timedelta(fp_coord, bound_point) for bound_point in fp_coord.bounds[0] + ] + bounds = [ + float(frt_coord.units.date2num(frt_point + delta)) + for delta in bounds_deltas + ] + + # Create the time scalar coordinate. + coord = DimCoord(point, bounds=bounds, standard_name="time", units=frt_coord.units) + return coord + + +def time_coords(section, metadata, rt_coord): + if "forecastTime" in section.keys(): + forecast_time = section["forecastTime"] + # ecCodes encodes the forecast time as 'startStep' for pdt 4.4x; + # product_definition_template_40 makes use of this function. The + # following will be removed once the suspected bug is fixed. + elif "startStep" in section.keys(): + forecast_time = section["startStep"] + + # Calculate the forecast period coordinate. + fp_coord = forecast_period_coord( + section["indicatorOfUnitForForecastTime"], forecast_time + ) + # Add the forecast period coordinate to the metadata aux coords. + metadata["aux_coords_and_dims"].append((fp_coord, None)) + # Calculate the "other" time coordinate - i.e. whichever of 'time' + # or 'forecast_reference_time' we don't already have. + other_coord = other_time_coord(rt_coord, fp_coord) + # Add the time coordinate to the metadata aux coords. + metadata["aux_coords_and_dims"].append((other_coord, None)) + # Add the reference time coordinate to the metadata aux coords. + metadata["aux_coords_and_dims"].append((rt_coord, None)) + + +def generating_process(section, include_forecast_process=True): + if options.warn_on_unsupported: + # Reference Code Table 4.3. + warnings.warn("Unable to translate type of generating process.") + warnings.warn("Unable to translate background generating process identifier.") + if include_forecast_process: + warnings.warn("Unable to translate forecast generating process identifier.") + + +def data_cutoff(hoursAfterDataCutoff, minutesAfterDataCutoff): + """ + Handle the after reference time data cutoff. + + Args: + + * hoursAfterDataCutoff: + Message section 4, octets 15-16. + + * minutesAfterDataCutoff: + Message section 4, octet 17. + + """ + if hoursAfterDataCutoff != _MDI or minutesAfterDataCutoff != _MDI: + if options.warn_on_unsupported: + warnings.warn( + 'Unable to translate "hours and/or minutes after data cutoff".' + ) + + +def statistical_method_name(section): + # Decode the type of statistic as a cell_method 'method' string. + # Templates 8, 9, 10, 11 and 15 all use this type code, which is defined + # in table 4.10. + # However, the actual keyname is different for template 15. + section_number = section["productDefinitionTemplateNumber"] + if section_number in (8, 9, 10, 11): + stat_keyname = "typeOfStatisticalProcessing" + elif section_number == 15: + stat_keyname = "statisticalProcess" + else: + # This should *never* happen, as only called by pdt 8 and 15. + msg = ( + "Internal error: can't get statistical method for unsupported pdt : 4.{:d}." + ) + raise ValueError(msg.format(section_number)) + statistic_code = section[stat_keyname] + statistic_name = _STATISTIC_TYPE_NAMES.get(statistic_code) + if statistic_name is None: + msg = ( + "Product definition section 4 contains an unsupported " + "statistical process type [{}] " + ) + raise TranslationError(msg.format(statistic_code)) + return statistic_name + + +def statistical_cell_method(section): + """ + Create a cell method representing a time statistic. + + This applies only with a product definition template 4.8. + + Args: + + * section: + Dictionary of coded key/value pairs from section 4 of the message. + + Returns: + A cell method over 'time'. + + """ + # Handle the number of time ranges -- we currently only support one. + n_time_ranges = section["numberOfTimeRange"] + if n_time_ranges != 1: + if n_time_ranges == 0: + msg = ( + "Product definition section 4 specifies aggregation over " + '"0 time ranges".' + ) + raise TranslationError(msg) + else: + msg = ( + "Product definition section 4 specifies aggregation over " + "multiple time ranges [{}], which is not yet " + "supported.".format(n_time_ranges) + ) + raise TranslationError(msg) + + # Decode the type of statistic (aggregation method). + statistic_name = statistical_method_name(section) + + # Decode the type of time increment. + increment_typecode = section["typeOfTimeIncrement"] + if increment_typecode not in (2, 255): + # NOTE: All our current test data seems to contain the value 2, which + # is all we currently support. + # The exact interpretation of this is still unclear so we also accept + # a missing value. + msg = "grib statistic time-increment type [{}] is not supported.".format( + increment_typecode + ) + raise TranslationError(msg) + + interval_number = section["timeIncrement"] + if interval_number in (0, _TIME_RANGE_MISSING): + intervals_string = None + else: + units_string = _TIME_RANGE_UNITS[section["indicatorOfUnitForTimeIncrement"]] + intervals_string = "{} {}".format(interval_number, units_string) + + # Create a cell method to represent the time aggregation. + cell_method = CellMethod( + method=statistic_name, coords="time", intervals=intervals_string + ) + return cell_method + + +def ensemble_identifier(section): + if options.warn_on_unsupported: + # Reference Code Table 4.6. + warnings.warn("Unable to translate type of ensemble forecast.") + warnings.warn("Unable to translate number of forecasts in ensemble.") + + # Create the realization coordinates. + realization = DimCoord( + section["perturbationNumber"], standard_name="realization", units="no_unit" + ) + return realization + + +def product_definition_template_0(section, metadata, rt_coord): + """ + Translate product definition template 0. + + This template represents an analysis or forecast at a horizontal + level or in a horizontal layer at a point in time. + + Updates the metadata in-place with the translations. + + Args: + + * section: + Dictionary of coded key/value pairs from section 4 of the message. + + * metadata: + :class:`collections.OrderedDict` of metadata. + + * rt_coord: + The scalar "reference time" :class:`iris.coords.DimCoord`. + This will be either 'time' or 'forecast_reference_time'. + + """ + # Handle generating process details. + generating_process(section) + + # Handle the data cutoff. + data_cutoff(section["hoursAfterDataCutoff"], section["minutesAfterDataCutoff"]) + + time_coords(section, metadata, rt_coord) + + # Check for vertical coordinates. + vertical_coords(section, metadata) + + +def product_definition_template_1(section, metadata, frt_coord): + """ + Translate product definition template 1. + + This template represents individual ensemble forecast, control + and perturbed, at a horizontal level or in a horizontal layer at a + point in time. + + Updates the metadata in-place with the translations. + + Args: + + * section: + Dictionary of coded key/value pairs from section 4 of the message. + + * metadata: + :class:`collections.OrderedDict` of metadata. + + * frt_coord: + The scalar forecast reference time :class:`iris.coords.DimCoord`. + + """ + # Perform identical message processing. + product_definition_template_0(section, metadata, frt_coord) + + realization = ensemble_identifier(section) + + # Add the realization coordinate to the metadata aux coords. + metadata["aux_coords_and_dims"].append((realization, None)) + + +def product_definition_template_5(section, metadata, frt_coord): + """ + Translate product definition template 5. + + This template represents a probability forecast, + at a horizontal level or in a horizontal layer at a + point in time. + + Updates the metadata in-place with the translations. + + Args: + + * section: + Dictionary of coded key/value pairs from section 4 of the message. + + * metadata: + :class:`collections.OrderedDict` of metadata. + + * frt_coord: + The scalar forecast reference time :class:`iris.coords.DimCoord`. + + """ + # Perform identical message processing. + product_definition_template_0(section, metadata, frt_coord) + + probability_type = _probability_type(section) + return probability_type + + +def product_definition_template_6(section, metadata, frt_coord): + """ + Translate product definition template 6. + + This template represents a percentile forecast, + at a horizontal level or in a horizontal layer at a + point in time. + + Updates the metadata in-place with the translations. + + Args: + + * section: + Dictionary of coded key/value pairs from section 4 of the message. + + * metadata: + :class:`collections.OrderedDict` of metadata. + + * frt_coord: + The scalar forecast reference time :class:`iris.coords.DimCoord`. + + """ + # Perform identical message processing. + product_definition_template_0(section, metadata, frt_coord) + + percentile = DimCoord(section["percentileValue"], long_name="percentile", units="%") + + # Add the percentile coordinate to the metadata aux coords. + metadata["aux_coords_and_dims"].append((percentile, None)) + + +def product_definition_template_8(section, metadata, frt_coord): + """ + Translate product definition template 8. + + This template represents average, accumulation and/or extreme values + or other statistically processed values at a horizontal level or in a + horizontal layer in a continuous or non-continuous time interval. + + Updates the metadata in-place with the translations. + + Args: + + * section: + Dictionary of coded key/value pairs from section 4 of the message. + + * metadata: + :class:`collections.OrderedDict` of metadata. + + * frt_coord: + The scalar forecast reference time :class:`iris.coords.DimCoord`. + + """ + # Handle generating process details. + generating_process(section) + + # Handle the data cutoff. + data_cutoff(section["hoursAfterDataCutoff"], section["minutesAfterDataCutoff"]) + + # Create a cell method to represent the time statistic. + time_statistic_cell_method = statistical_cell_method(section) + # Add the forecast cell method to the metadata. + metadata["cell_methods"].append(time_statistic_cell_method) + + # Add the forecast reference time coordinate to the metadata aux coords, + # if it is a forecast reference time, not a time coord, as defined by + # significanceOfReferenceTime. + if frt_coord.name() != "time": + metadata["aux_coords_and_dims"].append((frt_coord, None)) + + # Add a bounded forecast period coordinate. + fp_coord = statistical_forecast_period_coord(section, frt_coord) + metadata["aux_coords_and_dims"].append((fp_coord, None)) + + # Calculate a bounded validity time coord matching the forecast period. + t_coord = validity_time_coord(frt_coord, fp_coord) + # Add the time coordinate to the metadata aux coords. + metadata["aux_coords_and_dims"].append((t_coord, None)) + + # Check for vertical coordinates. + vertical_coords(section, metadata) + + +def product_definition_template_9(section, metadata, frt_coord): + """ + Translate product definition template 9. + + This template represents probability forecasts at a + horizontal level or in a horizontal layer in a continuous or + non-continuous time interval. + + Updates the metadata in-place with the translations. + + Args: + + * section: + Dictionary of coded key/value pairs from section 4 of the message. + + * metadata: + :class:`collections.OrderedDict` of metadata. + + * frt_coord: + The scalar forecast reference time :class:`iris.coords.DimCoord`. + + """ + # Start by calling PDT8 as all elements of that are common to this. + product_definition_template_8(section, metadata, frt_coord) + + # Remove the cell_method encoding the underlying statistic, as CF does not + # currently support this type of representation. + (_cell_method,) = metadata["cell_methods"] # ERROR here if there is more than one. + metadata["cell_methods"] = [] + # NOTE: we currently don't record the nature of the underlying statistic, + # as we don't have an agreed way of representing that in CF. + + probability_type = _probability_type(section) + + return probability_type + + +def _probability_type(section): + # Return a probability object to control the production of a probability + # result. This is done once the underlying phenomenon type is determined, + # in 'translate_phenomenon'. + probability_typecode = section["probabilityType"] + # Note that GRIB provides separate "above lower threshold" and "above + # upper threshold" probability types. This naming style doesn't + # recognise that distinction. For now, assume this is not important. + match probability_typecode: + case 0: + # Type is "below lower level". + threshold = _probability_threshold(section, "lower") + probability_type = Probability("below_threshold", threshold) + case 1: + # Type is "above upper level". + threshold = _probability_threshold(section, "upper") + probability_type = Probability("above_threshold", threshold) + case 3: + # Type is "above lower level". + threshold = _probability_threshold(section, "lower") + probability_type = Probability("above_threshold", threshold) + case 4: + # Type is "below upper level". + threshold = _probability_threshold(section, "upper") + probability_type = Probability("below_threshold", threshold) + case _: + msg = ( + "Product definition section 4 contains an unsupported " + "probability type [{}]".format(probability_typecode) + ) + raise TranslationError(msg) + return probability_type + + +def _probability_threshold(section, limit_type): + """Get the unscaled probability threshold value for the given limit type.""" + value_key = f"scaledValueOf{limit_type.capitalize()}Limit" + scale_key = f"scaleFactorOf{limit_type.capitalize()}Limit" + msg = f"Product definition section 4 has missing {{item}} of {limit_type} limit" + + threshold_value = section[value_key] + if threshold_value == _MDI: + raise TranslationError(msg.format(item="scaled value")) + threshold_scaling = section[scale_key] + if threshold_scaling == _MDI: + raise TranslationError(msg.format(item="scale factor")) + threshold = unscale(threshold_value, threshold_scaling) + return threshold + + +def product_definition_template_10(section, metadata, frt_coord): + """ + Translate product definition template 10. + + This template represents percentile forecasts at a horizontal level + or in a horizontal layer in a continuous or non-continuous time interval. + + Updates the metadata in-place with the translations. + + Args: + + * section: + Dictionary of coded key/value pairs from section 4 of the message. + + * metadata: + :class:`collections.OrderedDict` of metadata. + + * frt_coord: + The scalar forecast reference time :class:`iris.coords.DimCoord`. + + """ + product_definition_template_8(section, metadata, frt_coord) + + percentile = DimCoord( + section["percentileValue"], long_name="percentile_over_time", units="no_unit" + ) + + # Add the percentile data info + metadata["aux_coords_and_dims"].append((percentile, None)) + + +def product_definition_template_11(section, metadata, frt_coord): + """ + Translate product definition template 11. + + This template represents individual ensemble forecast, control + or perturbed; average, accumulation and/or extreme values + or other statistically processed values at a horizontal level or in a + horizontal layer in a continuous or non-continuous time interval. + + Updates the metadata in-place with the translations. + + Args: + + * section: + Dictionary of coded key/value pairs from section 4 of the message. + + * metadata: + :class:`collections.OrderedDict` of metadata. + + * frt_coord: + The scalar forecast reference time :class:`iris.coords.DimCoord`. + + """ + product_definition_template_8(section, metadata, frt_coord) + + realization = ensemble_identifier(section) + + # Add the realization coordinate to the metadata aux coords. + metadata["aux_coords_and_dims"].append((realization, None)) + + +def product_definition_template_15(section, metadata, frt_coord): + """ + Translate product definition template 15. + + This template represents : "average, accumulation, extreme values, + or other statistically processed values over a spatial area at a + horizontal level or in a horizontal layer at a point in time". + + Updates the metadata in-place with the translations. + + Args: + + * section: + Dictionary of coded key/value pairs from section 4 of the message. + + * metadata: + :class:`collections.OrderedDict` of metadata. + + * frt_coord: + The scalar forecast reference time :class:`iris.coords.DimCoord`. + + """ + # Check unique keys for this template. + spatial_processing_code = section["spatialProcessing"] + + # Only a limited number of spatial processing codes are supported + if spatial_processing_code not in _SPATIAL_PROCESSING_TYPES.keys(): + msg = ( + "Product definition section 4 contains an unsupported " + "spatial processing type [{}]".format(spatial_processing_code) + ) + raise TranslationError(msg) + + # Process parts in common with PDT 4.0. + product_definition_template_0(section, metadata, frt_coord) + + # Add spatial processing type as an attribute. + metadata["attributes"]["spatial_processing_type"] = _SPATIAL_PROCESSING_TYPES[ + spatial_processing_code + ][0] + + # Add a cell method if the spatial processing type supports a + # statistical process. + if _SPATIAL_PROCESSING_TYPES[spatial_processing_code][1] == "cell_method": + # Decode the statistical method name. + cell_method_name = statistical_method_name(section) + + # Record an 'area' cell-method using this statistic. + metadata["cell_methods"] = [ + CellMethod(coords=("area",), method=cell_method_name) + ] + + +def satellite_common(section, metadata): + # Number of contributing spectral bands. + NB = section["NB"] + + if NB > 0: + # Create the satellite series coordinate. + satelliteSeries = section["satelliteSeries"] + coord = AuxCoord(satelliteSeries, long_name="satellite_series", units=1) + # Add the satellite series coordinate to the metadata aux coords. + metadata["aux_coords_and_dims"].append((coord, None)) + + # Create the satellite number coordinate. + satelliteNumber = section["satelliteNumber"] + coord = AuxCoord(satelliteNumber, long_name="satellite_number", units=1) + # Add the satellite number coordinate to the metadata aux coords. + metadata["aux_coords_and_dims"].append((coord, None)) + + # Create the satellite instrument type coordinate. + instrumentType = section["instrumentType"] + coord = AuxCoord(instrumentType, long_name="instrument_type", units=1) + # Add the instrument type coordinate to the metadata aux coords. + metadata["aux_coords_and_dims"].append((coord, None)) + + # Create the central wave number coordinate. + scaleFactor = section["scaleFactorOfCentralWaveNumber"] + scaledValue = section["scaledValueOfCentralWaveNumber"] + wave_number = unscale(scaledValue, scaleFactor) + standard_name = "sensor_band_central_radiation_wavenumber" + coord = AuxCoord(wave_number, standard_name=standard_name, units=Unit("m-1")) + # Add the central wave number coordinate to the metadata aux coords. + metadata["aux_coords_and_dims"].append((coord, None)) + + +def product_definition_template_31(section, metadata, rt_coord): + """ + Translate product definition template 31. + + This template represents a satellite product. + + Updates the metadata in-place with the translations. + + Args: + + * section: + Dictionary of coded key/value pairs from section 4 of the message. + + * metadata: + :class:`collections.OrderedDict` of metadata. + + * rt_coord: + The scalar observation time :class:`iris.coords.DimCoord'. + + """ + generating_process(section, include_forecast_process=False) + + satellite_common(section, metadata) + + # Add the observation time coordinate. + metadata["aux_coords_and_dims"].append((rt_coord, None)) + + +def product_definition_template_32(section, metadata, rt_coord): + """ + Translate product definition template 32. + + This template represents an analysis or forecast at a horizontal + level or in a horizontal layer at a point in time for simulated (synthetic) + satellite data. + + Updates the metadata in-place with the translations. + + Args: + + * section: + Dictionary of coded key/value pairs from section 4 of the message. + + * metadata: + :class:`collections.OrderedDict` of metadata. + + * rt_coord: + The scalar observation time :class:`iris.coords.DimCoord'. + + """ + generating_process(section, include_forecast_process=False) + + # Handle the data cutoff. + data_cutoff(section["hoursAfterDataCutoff"], section["minutesAfterDataCutoff"]) + + time_coords(section, metadata, rt_coord) + + satellite_common(section, metadata) + + +def product_definition_template_40(section, metadata, frt_coord): + """ + Translate product definition template 40. + + This template represents an analysis or forecast at a horizontal + level or in a horizontal layer at a point in time for atmospheric chemical + constituents. + + Updates the metadata in-place with the translations. + + Args: + + * section: + Dictionary of coded key/value pairs from section 4 of the message. + + * metadata: + :class:`collections.OrderedDict` of metadata. + + * frt_coord: + The scalar forecast reference time :class:`iris.coords.DimCoord`. + + """ + # Perform identical message processing. + product_definition_template_0(section, metadata, frt_coord) + + # Reference GRIB2 Code Table 4.230. + constituent_type = section["constituentType"] + + # Add the constituent type as an attribute. + metadata["attributes"]["WMO_constituent_type"] = constituent_type + + +def product_definition_section(section, metadata, discipline, tablesVersion, rt_coord): + """ + Translate section 4 from the GRIB2 message. + + Updates the metadata in-place with the translations. + + Args: + + * section: + Dictionary of coded key/value pairs from section 4 of the message. + + * metadata: + :class:`collections.OrderedDict` of metadata. + + * discipline: + Message section 0, octet 7. + + * tablesVersion: + Message section 1, octet 10. + + * rt_coord: + The scalar reference time :class:`iris.coords.DimCoord`. + + """ + # Reference GRIB2 Code Table 4.0. + template = section["productDefinitionTemplateNumber"] + + probability = None + includes_fixed_surface_keys = True + if template == 0: + # Process analysis or forecast at a horizontal level or + # in a horizontal layer at a point in time. + product_definition_template_0(section, metadata, rt_coord) + elif template == 1: + # Process individual ensemble forecast, control and perturbed, at + # a horizontal level or in a horizontal layer at a point in time. + product_definition_template_1(section, metadata, rt_coord) + elif template == 5: + # Process percentile forecast, at a horizontal level or in a horizontal + # layer at a point in time. + probability = product_definition_template_5(section, metadata, rt_coord) + elif template == 6: + # Process percentile forecast, at a horizontal level or in a horizontal + # layer at a point in time. + product_definition_template_6(section, metadata, rt_coord) + elif template == 8: + # Process statistically processed values at a horizontal level or in a + # horizontal layer in a continuous or non-continuous time interval. + product_definition_template_8(section, metadata, rt_coord) + elif template == 9: + probability = product_definition_template_9(section, metadata, rt_coord) + elif template == 10: + product_definition_template_10(section, metadata, rt_coord) + elif template == 11: + product_definition_template_11(section, metadata, rt_coord) + elif template == 15: + product_definition_template_15(section, metadata, rt_coord) + elif template == 31: + # Process satellite product. + includes_fixed_surface_keys = False + product_definition_template_31(section, metadata, rt_coord) + elif template == 32: + includes_fixed_surface_keys = False + product_definition_template_32(section, metadata, rt_coord) + elif template == 40: + product_definition_template_40(section, metadata, rt_coord) + else: + msg = "Product definition template [{}] is not supported".format(template) + raise TranslationError(msg) + + # Translate GRIB2 phenomenon to CF phenomenon. + if tablesVersion != _CODE_TABLES_MISSING: + translation_kwargs = { + "metadata": metadata, + "discipline": discipline, + "parameterCategory": section["parameterCategory"], + "parameterNumber": section["parameterNumber"], + "probability": probability, + } + + # Won't always be able to populate the below arguments - + # missing from some template definitions. + fixed_surface_keys = [ + "typeOfFirstFixedSurface", + "scaledValueOfFirstFixedSurface", + "typeOfSecondFixedSurface", + ] + + for section_key in fixed_surface_keys: + translation_kwargs[section_key] = ( + section[section_key] if includes_fixed_surface_keys else None + ) + + translate_phenomenon(**translation_kwargs) + + +############################################################################### +# +# Data Representation Section 5 +# +############################################################################### + + +def data_representation_section(section): + """ + Translate section 5 from the GRIB2 message. + + Grid point template decoding is fully provided by the ECMWF GRIB API, + all grid point and spectral templates are supported, the data payload + is returned from the GRIB API already unpacked. + + """ + # Reference GRIB2 Code Table 5.0. + template = section["dataRepresentationTemplateNumber"] + + # Supported templates for both grid point and spectral data: + grid_point_templates = (0, 1, 2, 3, 4, 40, 41, 42, 61) + spectral_templates = (50, 51) + supported_templates = grid_point_templates + spectral_templates + + if template not in supported_templates: + msg = "Data Representation Section Template [{}] is not supported".format( + template + ) + raise TranslationError(msg) + + +############################################################################### +# +# Bitmap Section 6 +# +############################################################################### + + +def bitmap_section(section): + """ + Translate section 6 from the GRIB2 message. + + The bitmap can take the following values: + + * 0: Bitmap applies to the data and is specified in this section + of this message. + * 1-253: Bitmap applies to the data, is specified by originating + centre and is not specified in section 6 of this message. + * 254: Bitmap applies to the data, is specified in an earlier + section 6 of this message and is not specified in this + section 6 of this message. + * 255: Bitmap does not apply to the data. + + Only values 0 and 255 are supported. + + """ + # Reference GRIB2 Code Table 6.0. + bitMapIndicator = section["bitMapIndicator"] + + if bitMapIndicator not in [_BITMAP_CODE_NONE, _BITMAP_CODE_PRESENT]: + msg = "Bitmap Section 6 contains unsupported bitmap indicator [{}]".format( + bitMapIndicator + ) + raise TranslationError(msg) + + +############################################################################### + + +def grib2_convert(field, metadata): + """ + Translate the GRIB2 message into the appropriate cube metadata. + + Updates the metadata in-place with the translations. + + Args: + + * field: + GRIB2 message to be translated. + + * metadata: + :class:`collections.OrderedDict` of metadata. + + """ + # Section 1 - Identification Section. + centre = _CENTRES.get(field.sections[1]["centre"]) + if centre is not None: + metadata["attributes"]["centre"] = centre + rt_coord = reference_time_coord(field.sections[1]) + + # Section 3 - Grid Definition Section (Grid Definition Template) + grid_definition_section(field.sections[3], metadata) + + # Section 4 - Product Definition Section (Product Definition Template) + product_definition_section( + field.sections[4], + metadata, + field.sections[0]["discipline"], + field.sections[1]["tablesVersion"], + rt_coord, + ) + + # Section 5 - Data Representation Section (Data Representation Template) + data_representation_section(field.sections[5]) + + # Section 6 - Bitmap Section. + bitmap_section(field.sections[6]) diff --git a/src/iris_grib/_load_convert.py b/src/iris_grib/_load_convert.py index 83f9902b..ae414f18 100644 --- a/src/iris_grib/_load_convert.py +++ b/src/iris_grib/_load_convert.py @@ -3,2928 +3,20 @@ # This file is part of iris-grib and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """ -Module to support loading of GRIB2 data. +Module to support loading of GRIB data. -Code to convert a GRIB2 message into cube metadata. +Code to convert a GRIB GribMessage or GribWrapper into cube metadata. """ from argparse import Namespace -from collections import namedtuple, OrderedDict -from collections.abc import Iterable -from datetime import datetime, timedelta -import math -import warnings +from collections import OrderedDict -import cartopy.crs as ccrs -from cf_units import CALENDAR_GREGORIAN, Unit -import numpy as np -import numpy.ma as ma - -from iris.aux_factory import HybridPressureFactory, HybridHeightFactory -import iris.coord_systems as icoord_systems -from iris.coords import AuxCoord, DimCoord, CellMethod -from iris.exceptions import TranslationError -from . import grib_phenom_translation as itranslation -from .grib_phenom_translation import GRIBCode -from iris.fileformats.rules import ( - ConversionMetadata, - Factory, - Reference, - ReferenceTarget, -) -from iris.util import _is_circular - -from ._grib1_load_rules import grib1_convert - - -# Restrict the names imported from this namespace. -__all__ = ["convert"] - - -options = Namespace(warn_on_unsupported=False, support_hindcast_values=True) - -ScanningMode = namedtuple( - "ScanningMode", ["i_negative", "j_positive", "j_consecutive", "i_alternative"] -) - -ProjectionCentre = namedtuple( - "ProjectionCentre", ["south_pole_on_projection_plane", "bipolar_and_symmetric"] -) - -ResolutionFlags = namedtuple( - "ResolutionFlags", ["i_increments_given", "j_increments_given", "uv_resolved"] -) - -FixedSurface = namedtuple( - "FixedSurface", ["standard_name", "long_name", "units", "point"] -) - -InterpolationParameters = namedtuple( - "InterpolationParameters", - ["interpolation_type", "statistical_process", "number_of_points_used"], -) -# Regulations 92.1.6. -_GRID_ACCURACY_IN_DEGREES = 1e-6 # 1/1,000,000 of a degree - -# Reference Common Code Table C-1. -_CENTRES = {"ecmf": "European Centre for Medium Range Weather Forecasts"} - -# Reference Code Table 1.0 -_CODE_TABLES_MISSING = 255 - -# UDUNITS-2 units time string. Reference GRIB2 Code Table 4.4. -_TIME_RANGE_UNITS = { - 0: "minutes", - 1: "hours", - 2: "days", - # 3: 'months', Unsupported - # 4: 'years', Unsupported - # 5: '10 years', Unsupported - # 6: '30 years', Unsupported - # 7: '100 years', Unsupported - # 8-9 Reserved - 10: "3 hours", - 11: "6 hours", - 12: "12 hours", - 13: "seconds", -} -# Regulation 92.1.4 -_TIME_RANGE_MISSING = 2**32 - 1 - -# Reference Code Table 4.5. Point values are included where these are part of the fixed -# surface definition. None indicates this comes from the GRIB metadata, -# eg. "scaledValueOfFirstFixedSurface". -_FIXED_SURFACE = { - 1: FixedSurface(None, "height", "m", 0.0), # Ground or water surface - 4: FixedSurface(None, "air_temperature", "Celsius", 0.0), # Level of 0C isotherm - 100: FixedSurface(None, "pressure", "Pa", None), # Isobaric surface - 103: FixedSurface(None, "height", "m", None), # Height level above ground -} -_TYPE_OF_FIXED_SURFACE_MISSING = 255 - -# Reference Code Table 6.0 -_BITMAP_CODE_PRESENT = 0 -_BITMAP_CODE_NONE = 255 - -# Reference Code Table 4.10. -_STATISTIC_TYPE_NAMES = { - 0: "mean", - 1: "sum", - 2: "maximum", - 3: "minimum", - 6: "standard_deviation", -} - -# Reference Code Table 4.11. -_STATISTIC_TYPE_OF_TIME_INTERVAL = { - 2: "same start time of forecast, forecast time is incremented" -} -# NOTE: Our test data contains the value 2, which is all we currently support. -# The exact interpretation of this is still unclear. - -# See Code Table 4.15 for full spatial processing type descriptors: -# http://apps.ecmwf.int/codes/grib/format/grib2/ctables/4/15 - -# InterpolationParameters(spatial process descriptor, statistical process -# (octet 35), number of points used in interpolation (octet 37)) -_SPATIAL_PROCESSING_TYPES = { - 0: InterpolationParameters("No interpolation", "cell_method", 0), - 1: InterpolationParameters("Bilinear interpolation", None, 4), - 2: InterpolationParameters("Bicubic interpolation", None, 4), - 3: InterpolationParameters("Nearest neighbour interpolation", None, 1), - 4: InterpolationParameters("Budget interpolation", None, 4), - 5: InterpolationParameters("Spectral interpolation", None, 4), - 6: InterpolationParameters("Neighbour-budget interpolation", None, 4), -} - -# Class containing details of a probability analysis. -Probability = namedtuple("Probability", ("probability_type_name", "threshold")) - -# List of grid definition template numbers which use either (i,j) or (x,y) -# for (lat,lon) -_IJGRIDLENGTH_GDT_NUMBERS = (10,) -_XYGRIDLENGTH_GDT_NUMBERS = (20, 30, 31, 110, 140) - - -# Regulation 92.1.12 -def unscale(value, factor): - """ - Implement Regulation 92.1.12. - - Args: - - * value: - Scaled value or sequence of scaled values. - - * factor: - Scale factor or sequence of scale factors. - - Returns: - For scalar value and factor, the unscaled floating point - result is returned. If either value and/or factor are - MDI, then :data:`numpy.ma.masked` is returned. - - For sequence value and factor, the unscaled floating point - :class:`numpy.ndarray` is returned. If either value and/or - factor contain MDI, then :class:`numpy.ma.core.MaskedArray` - is returned. - - """ - - def _unscale(v, f): - return v / 10.0**f - - if isinstance(value, Iterable) or isinstance(factor, Iterable): - - def _masker(item): - # This is a small work around for an edge case, which is not - # evident in any of our sample GRIB2 messages, where an array - # of header elements contains missing values. - # iris.fileformats.grib.message returns these as None, but they - # are wanted as a numerical masked array, so a temporary mdi - # value is used, selected from a legacy implementation of iris, - # to construct the masked array. The valure is transient, only in - # scope for this function. - numerical_mdi = 2**32 - 1 - item = [numerical_mdi if i is None else i for i in item] - result = ma.masked_equal(item, numerical_mdi) - if ma.count_masked(result): - # Circumvent downstream NumPy "RuntimeWarning" - # of "overflow encountered in power" in _unscale - # for data containing _MDI. Remove transient _MDI value. - result.data[result.mask] = 0 - return result - - value = _masker(value) - factor = _masker(factor) - result = _unscale(value, factor) - if ma.count_masked(result) == 0: - result = result.data - else: - result = ma.masked - if value != _MDI and factor != _MDI: - result = _unscale(value, factor) - return result - - -# Use ECCodes to recognise missing value -_MDI = None - - -class HindcastOverflowWarning(Warning): - pass - - -# Non-standardised usage for negative forecast times. -def _hindcast_fix(forecast_time): - """Return a forecast time interpreted as a possibly negative value.""" - uft = np.array(forecast_time).astype(np.int64) - HIGHBIT = 2**30 - - # Workaround grib api's assumption that forecast time is positive. - # Handles correctly encoded -ve forecast times up to one -1 billion. - if 2 * HIGHBIT < uft < 3 * HIGHBIT: - original_forecast_time = forecast_time - forecast_time = -(uft - 2 * HIGHBIT) - if options.warn_on_unsupported: - msg = "Re-interpreting large grib forecastTime from {} to {}.".format( - original_forecast_time, forecast_time - ) - warnings.warn(msg, HindcastOverflowWarning) - - return forecast_time - - -############################################################################### -# -# Identification Section 1 -# -############################################################################### - - -def reference_time_coord(section): - """ - Translate section 1 reference time according to its significance. - - Reference section 1, year octets 13-14, month octet 15, day octet 16, - hour octet 17, minute octet 18, second octet 19. - - Returns: - The scalar reference time :class:`iris.coords.DimCoord`. - - """ - # Look-up standard name by significanceOfReferenceTime. - _lookup = { - 0: "forecast_reference_time", - 1: "forecast_reference_time", - 2: "time", - 3: "time", - } - - # Calculate the reference time and units. - dt = datetime( - section["year"], - section["month"], - section["day"], - section["hour"], - section["minute"], - section["second"], - ) - # XXX Defaulting to a Gregorian calendar. - # Current GRIBAPI does not cover GRIB Section 1 - Octets 22-nn (optional) - # which are part of GRIB spec v12. - unit = Unit("hours since epoch", calendar=CALENDAR_GREGORIAN) - point = float(unit.date2num(dt)) - - # Reference Code Table 1.2. - significanceOfReferenceTime = section["significanceOfReferenceTime"] - standard_name = _lookup.get(significanceOfReferenceTime) - - if standard_name is None: - msg = ( - "Identificaton section 1 contains an unsupported significance " - "of reference time [{}]".format(significanceOfReferenceTime) - ) - raise TranslationError(msg) - - # Create the associated reference time of data coordinate. - coord = DimCoord(point, standard_name=standard_name, units=unit) - - return coord - - -############################################################################### -# -# Grid Definition Section 3 -# -############################################################################### - - -def projection_centre(projectionCentreFlag): - """ - Translate the projection centre flag bitmask. - - Reference GRIB2 Flag Table 3.5. - - Args: - - * projectionCentreFlag - Message section 3, coded key value. - - Returns: - A :class:`collections.namedtuple` representation. - - """ - south_pole_on_projection_plane = bool(projectionCentreFlag & 0x80) - bipolar_and_symmetric = bool(projectionCentreFlag & 0x40) - return ProjectionCentre(south_pole_on_projection_plane, bipolar_and_symmetric) - - -def scanning_mode(scanningMode): - """ - Translate the scanning mode bitmask. - - Reference GRIB2 Flag Table 3.4. - - Args: - - * scanningMode: - Message section 3, coded key value. - - Returns: - A :class:`collections.namedtuple` representation. - - """ - i_negative = bool(scanningMode & 0x80) - j_positive = bool(scanningMode & 0x40) - j_consecutive = bool(scanningMode & 0x20) - i_alternative = bool(scanningMode & 0x10) - - if i_alternative: - msg = ( - "Grid definition section 3 contains unsupported " - "alternative row scanning mode" - ) - raise TranslationError(msg) - - return ScanningMode(i_negative, j_positive, j_consecutive, i_alternative) - - -def resolution_flags(resolutionAndComponentFlags): - """ - Translate the resolution and component bitmask. - - Reference GRIB2 Flag Table 3.3. - - Args: - - * resolutionAndComponentFlags: - Message section 3, coded key value. - - Returns: - A :class:`collections.namedtuple` representation. - - """ - i_inc_given = bool(resolutionAndComponentFlags & 0x20) - j_inc_given = bool(resolutionAndComponentFlags & 0x10) - uv_resolved = bool(resolutionAndComponentFlags & 0x08) - - return ResolutionFlags(i_inc_given, j_inc_given, uv_resolved) - - -def ellipsoid(shapeOfTheEarth, major, minor, radius): - """ - Translate the shape of the earth code. - - Convert the code to an appropriate Iris coordinate system. - - For MDI set either major and minor or radius to :data:`numpy.ma.masked` - - Reference GRIB2 Code Table 3.2. - - Args: - - * shapeOfTheEarth: - Message section 3, octet 15. - - * major: - Semi-major axis of the oblate spheroid in units determined by - the shapeOfTheEarth. - - * minor: - Semi-minor axis of the oblate spheroid in units determined by - the shapeOfTheEarth. - - * radius: - Radius of sphere (in m). - - Returns: - :class:`iris.coord_systems.CoordSystem` - - """ - # Supported shapeOfTheEarth values. - if shapeOfTheEarth not in (0, 1, 2, 3, 4, 5, 6, 7): - msg = ( - "Grid definition section 3 contains an unsupported " - "shape of the earth [{}]".format(shapeOfTheEarth) - ) - raise TranslationError(msg) - - if shapeOfTheEarth == 0: - # Earth assumed spherical with radius of 6 367 470.0m - result = icoord_systems.GeogCS(6367470) - elif shapeOfTheEarth == 1: - # Earth assumed spherical with radius specified (in m) by - # data producer. - if ma.is_masked(radius): - msg = ( - "Ellipsoid for shape of the earth {} requires a" - "radius to be specified.".format(shapeOfTheEarth) - ) - raise ValueError(msg) - result = icoord_systems.GeogCS(radius) - elif shapeOfTheEarth == 2: - # Earth assumed oblate spheroid with size as determined by IAU in 1965. - result = icoord_systems.GeogCS(6378160, inverse_flattening=297.0) - elif shapeOfTheEarth in [3, 7]: - # Earth assumed oblate spheroid with major and minor axes - # specified (in km)/(in m) by data producer. - emsg_oblate = ( - "Ellipsoid for shape of the earth [{}] requires a" - "semi-{} axis to be specified." - ) - if ma.is_masked(major): - raise ValueError(emsg_oblate.format(shapeOfTheEarth, "major")) - if ma.is_masked(minor): - raise ValueError(emsg_oblate.format(shapeOfTheEarth, "minor")) - # Check whether to convert from km to m. - if shapeOfTheEarth == 3: - major *= 1000 - minor *= 1000 - result = icoord_systems.GeogCS(major, minor) - elif shapeOfTheEarth == 4: - # Earth assumed oblate spheroid as defined in IAG-GRS80 model. - result = icoord_systems.GeogCS(6378137, inverse_flattening=298.257222101) - elif shapeOfTheEarth == 5: - # Earth assumed represented by WGS84 (as used by ICAO since 1998). - result = icoord_systems.GeogCS(6378137, inverse_flattening=298.257223563) - elif shapeOfTheEarth == 6: - # Earth assumed spherical with radius of 6 371 229.0m - result = icoord_systems.GeogCS(6371229) - - return result - - -def ellipsoid_geometry(section): - """ - Calculated the unscaled ellipsoid major-axis, minor-axis and radius. - - Args: - - * section: - Dictionary of coded key/value pairs from section 3 of the message. - - Returns: - Tuple containing the major-axis, minor-axis and radius. - - """ - major = unscale( - section["scaledValueOfEarthMajorAxis"], section["scaleFactorOfEarthMajorAxis"] - ) - minor = unscale( - section["scaledValueOfEarthMinorAxis"], section["scaleFactorOfEarthMinorAxis"] - ) - radius = unscale( - section["scaledValueOfRadiusOfSphericalEarth"], - section["scaleFactorOfRadiusOfSphericalEarth"], - ) - return major, minor, radius - - -def _calculate_increment(first_point, last_point, n_increments, mod=math.inf): - """ - Calculate a directional increment. - - Calculate the directional increment from the difference between the grid - point values divided by the total number of increments. Required by - template 0 & 40 when no increment values are provided. - """ - return (last_point - first_point) % mod / n_increments - - -def grid_definition_template_0_and_1(section, metadata, y_name, x_name, cs): - """ - Translate grid definition templates 0 and 1. - - Translate elements common to templates 0 and 1. - These templates represent regularly spaced latitude/longitude - on either a standard or rotated grid. - - Updates the metadata in-place with the translations. - - Args: - - * section: - Dictionary of coded key/value pairs from section 3 of the message - - * metadata: - :class:`collections.OrderedDict` of metadata. - - * y_name: - Name of the Y coordinate, e.g. latitude or grid_latitude. - - * x_name: - Name of the X coordinate, e.g. longitude or grid_longitude. - - * cs: - The :class:`iris.coord_systems.CoordSystem` to use when creating - the X and Y coordinates. - - """ - # Abort if this is a reduced grid, that case isn't handled yet. - if ( - section["numberOfOctectsForNumberOfPoints"] != 0 - or section["interpretationOfNumberOfPoints"] != 0 - ): - msg = "Grid definition section 3 contains unsupported quasi-regular grid" - raise TranslationError(msg) - - scan = scanning_mode(section["scanningMode"]) - - # Set resolution flags - res_flags = resolution_flags(section["resolutionAndComponentFlags"]) - - # Calculate longitude points. - x_inc = ( - section["iDirectionIncrement"] - if res_flags.i_increments_given - else _calculate_increment( - section["longitudeOfFirstGridPoint"], - section["longitudeOfLastGridPoint"], - section["Ni"] - 1, - 360.0 / _GRID_ACCURACY_IN_DEGREES, - ) - ) - x_inc *= _GRID_ACCURACY_IN_DEGREES - x_offset = section["longitudeOfFirstGridPoint"] * _GRID_ACCURACY_IN_DEGREES - x_direction = -1 if scan.i_negative else 1 - Ni = section["Ni"] - x_points = np.arange(Ni, dtype=np.float64) * x_inc * x_direction + x_offset - - # Determine whether the x-points (in degrees) are circular. - circular = _is_circular(x_points, 360.0) - - # Calculate latitude points. - y_inc = ( - section["jDirectionIncrement"] - if res_flags.j_increments_given - else _calculate_increment( - section["latitudeOfFirstGridPoint"], - section["latitudeOfLastGridPoint"], - section["Nj"] - 1, - ) - ) - y_inc *= _GRID_ACCURACY_IN_DEGREES - y_offset = section["latitudeOfFirstGridPoint"] * _GRID_ACCURACY_IN_DEGREES - y_direction = 1 if scan.j_positive else -1 - Nj = section["Nj"] - y_points = np.arange(Nj, dtype=np.float64) * y_inc * y_direction + y_offset - - # Create the lat/lon coordinates. - y_coord = DimCoord(y_points, standard_name=y_name, units="degrees", coord_system=cs) - x_coord = DimCoord( - x_points, - standard_name=x_name, - units="degrees", - coord_system=cs, - circular=circular, - ) - - # Determine the lat/lon dimensions. - y_dim, x_dim = 0, 1 - if scan.j_consecutive: - y_dim, x_dim = 1, 0 - - # Add the lat/lon coordinates to the metadata dim coords. - metadata["dim_coords_and_dims"].append((y_coord, y_dim)) - metadata["dim_coords_and_dims"].append((x_coord, x_dim)) - - -def grid_definition_template_0(section, metadata): - """ - Translate grid definition template 0. - - Template representing regular latitude/longitude grid (regular_ll). - - Updates the metadata in-place with the translations. - - Args: - - * section: - Dictionary of coded key/value pairs from section 3 of the message - - * metadata: - :class:`collections.OrderedDict` of metadata. - - """ - # Determine the coordinate system. - major, minor, radius = ellipsoid_geometry(section) - cs = ellipsoid(section["shapeOfTheEarth"], major, minor, radius) - grid_definition_template_0_and_1(section, metadata, "latitude", "longitude", cs) - - -def grid_definition_template_1(section, metadata): - """ - Translate grid definition template 1. - - Template representing rotated latitude/longitude grid. - - Updates the metadata in-place with the translations. - - Args: - - * section: - Dictionary of coded key/value pairs from section 3 of the message - - * metadata: - :class:`collections.OrderedDict` of metadata. - - """ - # Determine the coordinate system. - major, minor, radius = ellipsoid_geometry(section) - south_pole_lat = section["latitudeOfSouthernPole"] * _GRID_ACCURACY_IN_DEGREES - south_pole_lon = section["longitudeOfSouthernPole"] * _GRID_ACCURACY_IN_DEGREES - cs = icoord_systems.RotatedGeogCS( - -south_pole_lat, - math.fmod(south_pole_lon + 180, 360), - section["angleOfRotation"], - ellipsoid(section["shapeOfTheEarth"], major, minor, radius), - ) - grid_definition_template_0_and_1( - section, metadata, "grid_latitude", "grid_longitude", cs - ) - - -def grid_definition_template_4_and_5(section, metadata, y_name, x_name, cs): - """ - Translate grid definition templates 4 and 5. - - Translate elements common to templates 4 and 5. - These templates represent variable-resolution latitude/longitude - and common forms of variable-resolution rotated latitude/longitude. - - Updates the metadata in-place with the translations. - - Args: - - * section: - Dictionary of coded key/value pairs from section 3 of the message. - - * metadata: - :class:`collections.OrderedDict` of metadata. - - * y_name: - Name of the Y coordinate, e.g. 'latitude' or 'grid_latitude'. - - * x_name: - Name of the X coordinate, e.g. 'longitude' or 'grid_longitude'. - - * cs: - The :class:`iris.coord_systems.CoordSystem` to use when creating - the X and Y coordinates. - - """ - # Determine the (variable) units of resolution. - key = "basicAngleOfTheInitialProductionDomain" - basicAngleOfTheInitialProductDomain = section[key] - subdivisionsOfBasicAngle = section["subdivisionsOfBasicAngle"] - - if basicAngleOfTheInitialProductDomain in [0, _MDI]: - basicAngleOfTheInitialProductDomain = 1.0 - - if subdivisionsOfBasicAngle in [0, _MDI]: - subdivisionsOfBasicAngle = 1.0 / _GRID_ACCURACY_IN_DEGREES - - resolution = np.float64(basicAngleOfTheInitialProductDomain) - resolution /= subdivisionsOfBasicAngle - flags = resolution_flags(section["resolutionAndComponentFlags"]) - - # Grid Definition Template 3.4. Notes (2). - # Flag bits 3-4 are not applicable for this template. - if flags.uv_resolved and options.warn_on_unsupported: - msg = "Unable to translate resolution and component flags." - warnings.warn(msg) - - # Calculate the latitude and longitude points. - x_points = np.array(section["longitudes"], dtype=np.float64) * resolution - y_points = np.array(section["latitudes"], dtype=np.float64) * resolution - - # Determine whether the x-points (in degrees) are circular. - circular = _is_circular(x_points, 360.0) - - # Create the lat/lon coordinates. - y_coord = DimCoord(y_points, standard_name=y_name, units="degrees", coord_system=cs) - x_coord = DimCoord( - x_points, - standard_name=x_name, - units="degrees", - coord_system=cs, - circular=circular, - ) - - scan = scanning_mode(section["scanningMode"]) - - # Determine the lat/lon dimensions. - y_dim, x_dim = 0, 1 - if scan.j_consecutive: - y_dim, x_dim = 1, 0 - - # Add the lat/lon coordinates to the metadata dim coords. - metadata["dim_coords_and_dims"].append((y_coord, y_dim)) - metadata["dim_coords_and_dims"].append((x_coord, x_dim)) - - -def grid_definition_template_4(section, metadata): - """ - Translate grid definition template 4. - - This template represents variable resolution latitude/longitude. - - Updates the metadata in-place with the translations. - - Args: - - * section: - Dictionary of coded key/value pairs from section 3 of the message. - - * metadata: - :class:`collections.OrderedDict` of metadata. - - """ - # Determine the coordinate system. - major, minor, radius = ellipsoid_geometry(section) - cs = ellipsoid(section["shapeOfTheEarth"], major, minor, radius) - grid_definition_template_4_and_5(section, metadata, "latitude", "longitude", cs) - - -def grid_definition_template_5(section, metadata): - """ - Translate grid definition template 5. - - This template represents variable resolution rotated - latitude/longitude. - - Updates the metadata in-place with the translations. - - Args: - - * section: - Dictionary of coded key/value pairs from section 3 of the message. - - * metadata: - :class:`collections.OrderedDict` of metadata. - - """ - # Determine the coordinate system. - major, minor, radius = ellipsoid_geometry(section) - south_pole_lat = section["latitudeOfSouthernPole"] * _GRID_ACCURACY_IN_DEGREES - south_pole_lon = section["longitudeOfSouthernPole"] * _GRID_ACCURACY_IN_DEGREES - cs = icoord_systems.RotatedGeogCS( - -south_pole_lat, - math.fmod(south_pole_lon + 180, 360), - section["angleOfRotation"], - ellipsoid(section["shapeOfTheEarth"], major, minor, radius), - ) - grid_definition_template_4_and_5( - section, metadata, "grid_latitude", "grid_longitude", cs - ) - - -def grid_definition_template_10(section, metadata): - """ - Translate grid definition template 10. - - This template represents a Mercator grid. - - Updates the metadata in-place with the translations. - - Args: - - * section: - Dictionary of coded key/value pairs from section 3 of the message. - - * metadata: - :class:`collections.OrderedDict` of metadata. - - """ - major, minor, radius = ellipsoid_geometry(section) - geog_cs = ellipsoid(section["shapeOfTheEarth"], major, minor, radius) - - # standard_parallel is the latitude at which the Mercator projection - # intersects the Earth - standard_parallel = section["LaD"] * _GRID_ACCURACY_IN_DEGREES - - cs = icoord_systems.Mercator(standard_parallel=standard_parallel, ellipsoid=geog_cs) - - # Create the X and Y coordinates. - x_coord, y_coord, scan = _calculate_proj_coords_from_grid_lengths(section, cs) - - # Determine the lat/lon dimensions. - y_dim, x_dim = 0, 1 - if scan.j_consecutive: - y_dim, x_dim = 1, 0 - - # Add the X and Y coordinates to the metadata dim coords. - metadata["dim_coords_and_dims"].append((y_coord, y_dim)) - metadata["dim_coords_and_dims"].append((x_coord, x_dim)) - - -def grid_definition_template_12(section, metadata): - """ - Translate grid definition template 12. - - This template represents transverse Mercator. - - Updates the metadata in-place with the translations. - - Args: - - * section: - Dictionary of coded key/value pairs from section 3 of the message. - - * metadata: - :class:`collections.OrderedDict` of metadata. - - """ - major, minor, radius = ellipsoid_geometry(section) - geog_cs = ellipsoid(section["shapeOfTheEarth"], major, minor, radius) - - lat = section["latitudeOfReferencePoint"] * _GRID_ACCURACY_IN_DEGREES - lon = section["longitudeOfReferencePoint"] * _GRID_ACCURACY_IN_DEGREES - scale = section["scaleFactorAtReferencePoint"] - CM_TO_M = 0.01 - easting = section["XR"] * CM_TO_M - northing = section["YR"] * CM_TO_M - cs = icoord_systems.TransverseMercator(lat, lon, easting, northing, scale, geog_cs) - - # Fetch grid extents - x1 = section["X1"] - y1 = section["Y1"] - x2 = section["X2"] - y2 = section["Y2"] - - # Rather unhelpfully this grid definition template seems to be - # overspecified, and thus open to inconsistency. But for determining - # the extents the X1, Y1, X2, and Y2 points have the highest - # precision, as opposed to using Di and Dj. - # Check whether Di and Dj are as consistent as possible with that - # interpretation - i.e. they are within 1cm. - def check_range(v1, v2, n, d, axis_name): - small = min(v1, v2) - large = max(v1, v2) - min_last = small + (n - 1) * (d - 1) - max_last = small + (n - 1) * (d + 1) - if not (min_last < large < max_last): - message = ( - f"File grid {axis_name} definition inconsistent: " - f"{v1} to {v2} in {n} steps is incompatible with step-size " - f"{d} ." - ) - raise TranslationError(message) - - check_range(x1, x2, section["Ni"], section["Di"], "X") - check_range(y1, y2, section["Nj"], section["Dj"], "Y") - - # Further over-specification - the sequence of X1 & X2 is enough to - # generate the sequence in the correct direction (also Y1 & Y2). All - # scanningMode can do is add confusion; warn if there is inconsistency. - def validate_scanning(axis: str, stated: bool, encoded: bool): - def scan_str(scanning_bool): - return "positive" if scanning_bool else "negative" - - if stated != encoded: - message = ( - f"File grid {axis} definition inconsistent: " - f"scanningMode = {scan_str(stated)}, actual grid point " - f"direction is {scan_str(encoded)}." - ) - warnings.warn(message) - - scan = scanning_mode(section["scanningMode"]) - validate_scanning("X", not scan.i_negative, x1 < x2) - validate_scanning("Y", scan.j_positive, y1 < y2) - - x_points = np.linspace(x1 * CM_TO_M, x2 * CM_TO_M, section["Ni"]) - y_points = np.linspace(y1 * CM_TO_M, y2 * CM_TO_M, section["Nj"]) - - # Create the X and Y coordinates. - y_coord = DimCoord(y_points, "projection_y_coordinate", units="m", coord_system=cs) - x_coord = DimCoord(x_points, "projection_x_coordinate", units="m", coord_system=cs) - - # Determine the lat/lon dimensions. - y_dim, x_dim = 0, 1 - if scan.j_consecutive: - y_dim, x_dim = 1, 0 - - # Add the X and Y coordinates to the metadata dim coords. - metadata["dim_coords_and_dims"].append((y_coord, y_dim)) - metadata["dim_coords_and_dims"].append((x_coord, x_dim)) - - -def grid_definition_template_20(section, metadata): - """ - Translate grid definition template 20. - - This template represents a Polar Stereographic grid. - - Updates the metadata in-place with the translations. - - Args: - - * section: - Dictionary of coded key/value pairs from section 3 of the message. - - * metadata: - :class:`collections.OrderedDict` of metadata. - - """ - major, minor, radius = ellipsoid_geometry(section) - geog_cs = ellipsoid(section["shapeOfTheEarth"], major, minor, radius) - - proj_centre = projection_centre(section["projectionCentreFlag"]) - if proj_centre.bipolar_and_symmetric: - raise TranslationError( - "Bipolar and symmetric polar stereo projections" - " are not supported by the " - "grid_definition_template_20 translation." - ) - if proj_centre.south_pole_on_projection_plane: - central_lat = -90.0 - else: - central_lat = 90.0 - central_lon = section["orientationOfTheGrid"] * _GRID_ACCURACY_IN_DEGREES - true_scale_lat = section["LaD"] * _GRID_ACCURACY_IN_DEGREES - # Always load PolarStereographic - never Stereographic. - # Stereographic is a CF/Iris concept and not something described - # in GRIB. - cs = icoord_systems.PolarStereographic( - central_lat=central_lat, - central_lon=central_lon, - true_scale_lat=true_scale_lat, - ellipsoid=geog_cs, - ) - x_coord, y_coord, scan = _calculate_proj_coords_from_grid_lengths(section, cs) - - # Determine the order of the dimensions. - y_dim, x_dim = 0, 1 - if scan.j_consecutive: - y_dim, x_dim = 1, 0 - - # Add the projection coordinates to the metadata dim coords. - metadata["dim_coords_and_dims"].append((y_coord, y_dim)) - metadata["dim_coords_and_dims"].append((x_coord, x_dim)) - - -def _calculate_proj_coords_from_grid_lengths(section, cs): - # Construct the coordinate points, the start point is given in millidegrees - # but the distance measurement is in 10-3 m, so a conversion is necessary - # to find the origin in m. - - # Conversion factor millimetres to metres - mm_to_m = 1e-3 - - if section["gridDefinitionTemplateNumber"] in _XYGRIDLENGTH_GDT_NUMBERS: - if section["gridDefinitionTemplateNumber"] == 140: - dx = section["xDirectionGridLengthInMillimetres"] - dy = section["yDirectionGridLengthInMillimetres"] - nx = section["numberOfPointsAlongXAxis"] - ny = section["numberOfPointsAlongYAxis"] - else: - dx = section["Dx"] - dy = section["Dy"] - nx = section["Nx"] - ny = section["Ny"] - elif section["gridDefinitionTemplateNumber"] in _IJGRIDLENGTH_GDT_NUMBERS: - dx = section["Di"] - dy = section["Dj"] - nx = section["Ni"] - ny = section["Nj"] - else: - raise TranslationError("Unsupported lat-lon point parameters") - - scan = scanning_mode(section["scanningMode"]) - lon_0 = section["longitudeOfFirstGridPoint"] * _GRID_ACCURACY_IN_DEGREES - lat_0 = section["latitudeOfFirstGridPoint"] * _GRID_ACCURACY_IN_DEGREES - x0_m, y0_m = cs.as_cartopy_crs().transform_point(lon_0, lat_0, ccrs.Geodetic()) - dx_m = dx * mm_to_m - dy_m = dy * mm_to_m - x_dir = -1 if scan.i_negative else 1 - y_dir = 1 if scan.j_positive else -1 - x_points = x0_m + dx_m * x_dir * np.arange(nx, dtype=np.float64) - y_points = y0_m + dy_m * y_dir * np.arange(ny, dtype=np.float64) - - # Create the dimension coordinates. - x_coord = DimCoord( - x_points, standard_name="projection_x_coordinate", units="m", coord_system=cs - ) - y_coord = DimCoord( - y_points, standard_name="projection_y_coordinate", units="m", coord_system=cs - ) - return x_coord, y_coord, scan - - -def grid_definition_template_30(section, metadata): - """ - Translate grid definition template 30. - - This template represents a Lambert Conformal grid. - - Updates the metadata in-place with the translations. - - Args: - - * section: - Dictionary of coded key/value pairs from section 3 of the message. - - * metadata: - :class:`collections.OrderedDict` of metadata. - - """ - major, minor, radius = ellipsoid_geometry(section) - geog_cs = ellipsoid(section["shapeOfTheEarth"], major, minor, radius) - - central_latitude = section["LaD"] * _GRID_ACCURACY_IN_DEGREES - central_longitude = section["LoV"] * _GRID_ACCURACY_IN_DEGREES - false_easting = 0 - false_northing = 0 - secant_latitudes = ( - section["Latin1"] * _GRID_ACCURACY_IN_DEGREES, - section["Latin2"] * _GRID_ACCURACY_IN_DEGREES, - ) - - cs = icoord_systems.LambertConformal( - central_latitude, - central_longitude, - false_easting, - false_northing, - secant_latitudes=secant_latitudes, - ellipsoid=geog_cs, - ) - - # A projection centre flag is defined for GDT30. However, we don't need to - # know which pole is in the projection plane as Cartopy handles that. The - # Other component of the projection centre flag determines if there are - # multiple projection centres. There is no support for this in Proj4 or - # Cartopy so a translation error is raised if this flag is set. - proj_centre = projection_centre(section["projectionCentreFlag"]) - if proj_centre.bipolar_and_symmetric: - msg = "Unsupported projection centre: Bipolar and symmetric." - raise TranslationError(msg) - - res_flags = resolution_flags(section["resolutionAndComponentFlags"]) - if not res_flags.uv_resolved and options.warn_on_unsupported: - # Vector components are given as relative to east an north, rather than - # relative to the projection coordinates, issue a warning in this case. - # (ideally we need a way to add this information to a cube) - msg = "Unable to translate resolution and component flags." - warnings.warn(msg) - - x_coord, y_coord, scan = _calculate_proj_coords_from_grid_lengths(section, cs) - - # Determine the order of the dimensions. - y_dim, x_dim = 0, 1 - if scan.j_consecutive: - y_dim, x_dim = 1, 0 - - # Add the projection coordinates to the metadata dim coords. - metadata["dim_coords_and_dims"].append((y_coord, y_dim)) - metadata["dim_coords_and_dims"].append((x_coord, x_dim)) - - -def grid_definition_template_40(section, metadata): - """ - Translate an "irregular form" grid definition template 40. - - This template represents a Gaussian grid. - - Updates the metadata in-place with the translations. - - Args: - - * section: - Dictionary of coded key/value pairs from section 3 of the message. - - * metadata: - :class:`collections.OrderedDict` of metadata. - - """ - major, minor, radius = ellipsoid_geometry(section) - cs = ellipsoid(section["shapeOfTheEarth"], major, minor, radius) - - if ( - section["numberOfOctectsForNumberOfPoints"] != 0 - or section["interpretationOfNumberOfPoints"] != 0 - ): - grid_definition_template_40_reduced(section, metadata, cs) - else: - grid_definition_template_40_regular(section, metadata, cs) - - -def grid_definition_template_40_regular(section, metadata, cs): - """ - Translate a "regular form" grid definition template 40. - - This template represents a regular Gaussian grid. - - """ - scan = scanning_mode(section["scanningMode"]) - - # Set resolution flags - res_flags = resolution_flags(section["resolutionAndComponentFlags"]) - - # Calculate longitude points. - x_inc = ( - section["iDirectionIncrement"] - if res_flags.i_increments_given - else _calculate_increment( - section["longitudeOfFirstGridPoint"], - section["longitudeOfLastGridPoint"], - section["Ni"] - 1, - 360.0 / _GRID_ACCURACY_IN_DEGREES, - ) - ) - x_inc *= _GRID_ACCURACY_IN_DEGREES - x_offset = section["longitudeOfFirstGridPoint"] * _GRID_ACCURACY_IN_DEGREES - x_direction = -1 if scan.i_negative else 1 - Ni = section["Ni"] - x_points = np.arange(Ni, dtype=np.float64) * x_inc * x_direction + x_offset - - # Determine whether the x-points (in degrees) are circular. - circular = _is_circular(x_points, 360.0) - - # Get the latitude points. - # - # Gaussian latitudes are defined by Gauss-Legendre quadrature and the Gauss - # quadrature rule (http://en.wikipedia.org/wiki/Gaussian_quadrature). The - # latitudes of a particular Gaussian grid are uniquely defined by the - # number of latitudes between the equator and the pole, N. The latitudes - # are calculated from the roots of a Legendre series which must be - # calculated numerically. This process involves forming a (possibly large) - # companion matrix, computing its eigenvalues, and usually at least one - # application of Newton's method to achieve best results - # (http://en.wikipedia.org/wiki/Newton%27s_method). The latitudes are given - # by the arcsine of the roots converted to degrees. This computation can be - # time-consuming, especially for large grid sizes. - # - # A direct computation would require: - # 1. Reading the coded key 'N' representing the number of latitudes - # between the equator and pole. - # 2. Computing the set of global Gaussian latitudes associated with the - # value of N. - # 3. Determining the direction of the latitude points from the scanning - # mode. - # 4. Producing a subset of the latitudes based on the given first and - # last latitude points, given by the coded keys La1 and La2. - # - # Given the complexity and potential for poor performance of calculating - # the Gaussian latitudes directly, the GRIB-API computed key - # 'distinctLatitudes' is utilised to obtain the latitude points from the - # GRIB2 message. This computed key provides a rapid calculation of the - # monotonic latitude points that form the Gaussian grid, accounting for - # the coverage of the grid. - y_points = section.get_computed_key("distinctLatitudes") - y_points.sort() - if not scan.j_positive: - y_points = y_points[::-1] - - # Create lat/lon coordinates. - x_coord = DimCoord( - x_points, - standard_name="longitude", - units="degrees", - coord_system=cs, - circular=circular, - ) - y_coord = DimCoord( - y_points, standard_name="latitude", units="degrees", coord_system=cs - ) - - # Determine the lat/lon dimensions. - y_dim, x_dim = 0, 1 - if scan.j_consecutive: - y_dim, x_dim = 1, 0 - - # Add the lat/lon coordinates to the metadata dim coords. - metadata["dim_coords_and_dims"].append((y_coord, y_dim)) - metadata["dim_coords_and_dims"].append((x_coord, x_dim)) - - -def grid_definition_template_40_reduced(section, metadata, cs): - """ - Translate a "reduced form" grid definition template 40. - - This template represents a reduced Gaussian grid. - - """ - # Get the latitude and longitude points. - # - # The same comments made in grid_definition_template_40_regular regarding - # computation of Gaussian lattiudes applies here too. Further to this the - # reduced Gaussian grid is not rectangular, the number of points along - # each latitude circle vary with latitude. Whilst it is possible to - # compute the latitudes and longitudes individually for each grid point - # from coded keys, it would be complex and time-consuming compared to - # loading the latitude and longitude arrays directly using the computed - # keys 'latitudes' and 'longitudes'. - x_points = section.get_computed_key("longitudes") - y_points = section.get_computed_key("latitudes") - - # Create lat/lon coordinates. - x_coord = AuxCoord( - x_points, standard_name="longitude", units="degrees", coord_system=cs - ) - y_coord = AuxCoord( - y_points, standard_name="latitude", units="degrees", coord_system=cs - ) - - # Add the lat/lon coordinates to the metadata dim coords. - metadata["aux_coords_and_dims"].append((y_coord, 0)) - metadata["aux_coords_and_dims"].append((x_coord, 0)) - - -def grid_definition_template_90(section, metadata): - """ - Translate grid definition template 90. - - This template represents a space view. - - Updates the metadata in-place with the translations. - - Args: - - * section: - Dictionary of coded key/value pairs from section 3 of the message. - - * metadata: - :class:`collections.OrderedDict` of metadata. - - """ - if section["Nr"] == _MDI: - raise TranslationError("Unsupported orthographic grid.") - elif section["Nr"] == 0: - raise TranslationError("Unsupported zero height for space-view.") - if section["orientationOfTheGrid"] != 0: - raise TranslationError("Unsupported space-view orientation.") - - # Determine the coordinate system. - sub_satellite_lat = ( - section["latitudeOfSubSatellitePoint"] * _GRID_ACCURACY_IN_DEGREES - ) - # The subsequent calculations to determine the apparent Earth - # diameters rely on the satellite being over the equator. - if sub_satellite_lat != 0: - raise TranslationError( - "Unsupported non-zero latitude for space-view perspective." - ) - sub_satellite_lon = ( - section["longitudeOfSubSatellitePoint"] * _GRID_ACCURACY_IN_DEGREES - ) - major, minor, radius = ellipsoid_geometry(section) - geog_cs = ellipsoid(section["shapeOfTheEarth"], major, minor, radius) - height_above_centre = geog_cs.semi_major_axis * section["Nr"] / 1e6 - height_above_ellipsoid = height_above_centre - geog_cs.semi_major_axis - - # Figure out how large the Earth would appear in projection coordinates. - # For both the apparent equatorial and polar diameters this is a - # two-step process: - # 1) Determine the angle subtended by the visible surface. - # 2) Convert that angle into projection coordinates. - # NB. The solutions given below assume the satellite is over the - # equator. - # The apparent equatorial angle uses simple, circular geometry. - # But to derive the apparent polar angle we use the auxiliary circle - # parametric form of the ellipse. In this form, the equation for the - # tangent line is given by: - # x cos(psi) y sin(psi) - # ---------- + ---------- = 1 - # a b - # By considering the cases when x=0 and y=0, the apparent polar - # angle (theta) is given by: - # tan(theta) = b / sin(psi) - # ------------ - # a / cos(psi) - # This can be simplified using: cos(psi) = a / height_above_centre - half_apparent_equatorial_angle = math.asin( - geog_cs.semi_major_axis / height_above_centre - ) - parametric_angle = math.acos(geog_cs.semi_major_axis / height_above_centre) - half_apparent_polar_angle = math.atan( - geog_cs.semi_minor_axis / (height_above_centre * math.sin(parametric_angle)) - ) - y_apparent_angular_diameter = 2 * half_apparent_polar_angle - x_apparent_angular_diameter = 2 * half_apparent_equatorial_angle - y_step = y_apparent_angular_diameter / section["dy"] - x_step = x_apparent_angular_diameter / section["dx"] - y_start = y_step * (section["Yo"] - section["Yp"] / 1000) - x_start = x_step * (section["Xo"] - section["Xp"] / 1000) - y_points = y_start + np.arange(section["Ny"]) * y_step - x_points = x_start + np.arange(section["Nx"]) * x_step - - # This has only been tested with -x/+y scanning, so raise an error - # for other permutations. - scan = scanning_mode(section["scanningMode"]) - if scan.i_negative: - x_points = -x_points - else: - raise TranslationError("Unsupported +x scanning") - if not scan.j_positive: - raise TranslationError("Unsupported -y scanning") - - # Make a coordinate system for the X and Y coordinates. - # Note: false_easting/northing are always just zero, as the calculation of - # x_points/y_points takes both Xp/Yp and Xo/Yo into account. - cs = icoord_systems.Geostationary( - latitude_of_projection_origin=sub_satellite_lat, - longitude_of_projection_origin=sub_satellite_lon, - perspective_point_height=height_above_ellipsoid, - sweep_angle_axis="y", - ellipsoid=geog_cs, - ) - - # Create the X and Y coordinates. - y_coord = DimCoord( - y_points, "projection_y_coordinate", units="radians", coord_system=cs - ) - x_coord = DimCoord( - x_points, "projection_x_coordinate", units="radians", coord_system=cs - ) - - # Determine the lat/lon dimensions. - y_dim, x_dim = 0, 1 - if scan.j_consecutive: - y_dim, x_dim = 1, 0 - - # Add the X and Y coordinates to the metadata dim coords. - metadata["dim_coords_and_dims"].append((y_coord, y_dim)) - metadata["dim_coords_and_dims"].append((x_coord, x_dim)) - - -def grid_definition_template_140(section, metadata): - """ - Translate grid definition template 140. - - This template represents Lambert Azimuthal Equal Area. - - Updates the metadata in-place with the translations. - - Args: - - * section: - Dictionary of coded key/value pairs from section 3 of the message. - - * metadata: - :class:`collections.OrderedDict` of metadata. - """ - # Define the coordinate system - major, minor, radius = ellipsoid_geometry(section) - cs = icoord_systems.LambertAzimuthalEqualArea( - section["standardParallelInMicrodegrees"] * _GRID_ACCURACY_IN_DEGREES, - section["centralLongitudeInMicrodegrees"] * _GRID_ACCURACY_IN_DEGREES, - 0, - 0, - ellipsoid(section["shapeOfTheEarth"], major, minor, radius), - ) - - x_coord, y_coord, scan = _calculate_proj_coords_from_grid_lengths(section, cs) - - # Determine the order of the dimensions. - y_dim, x_dim = 0, 1 - if scan.j_consecutive: - y_dim, x_dim = 1, 0 - - # Add the projection coordinates to the metadata dim coords. - metadata["dim_coords_and_dims"].append((y_coord, y_dim)) - metadata["dim_coords_and_dims"].append((x_coord, x_dim)) - - -def grid_definition_section(section, metadata): - """ - Translate section 3 from the GRIB2 message. - - Update the metadata in-place with the translations. - - Args: - - * section: - Dictionary of coded key/value pairs from section 3 of the message. - - * metadata: - :class:`collections.OrderedDict` of metadata. - - """ - # Reference GRIB2 Code Table 3.0. - value = section["sourceOfGridDefinition"] - if value != 0: - msg = ( - "Grid definition section 3 contains unsupported " - "source of grid definition [{}]".format(value) - ) - raise TranslationError(msg) - - # Reference GRIB2 Code Table 3.1. - template = section["gridDefinitionTemplateNumber"] - - if template == 0: - # Process regular latitude/longitude grid (regular_ll) - grid_definition_template_0(section, metadata) - elif template == 1: - # Process rotated latitude/longitude grid. - grid_definition_template_1(section, metadata) - elif template == 4: - # Process variable resolution latitude/longitude. - grid_definition_template_4(section, metadata) - elif template == 5: - # Process variable resolution rotated latitude/longitude. - grid_definition_template_5(section, metadata) - elif template == 10: - # Process Mercator. - grid_definition_template_10(section, metadata) - elif template == 12: - # Process transverse Mercator. - grid_definition_template_12(section, metadata) - elif template == 20: - # Polar stereographic. - grid_definition_template_20(section, metadata) - elif template == 30: - # Process Lambert conformal: - grid_definition_template_30(section, metadata) - elif template == 40: - grid_definition_template_40(section, metadata) - elif template == 90: - # Process space view. - grid_definition_template_90(section, metadata) - elif template == 140: - # Process Lambert Azimuthal Equal Area. - grid_definition_template_140(section, metadata) - else: - msg = "Grid definition template [{}] is not supported".format(template) - raise TranslationError(msg) - - -############################################################################### -# -# Product Definition Section 4 -# -############################################################################### - - -def translate_phenomenon( - metadata, - discipline, - parameterCategory, - parameterNumber, - typeOfFirstFixedSurface, - scaledValueOfFirstFixedSurface, - typeOfSecondFixedSurface, - probability=None, -): - """ - Translate GRIB2 phenomenon to CF phenomenon. - - Updates the metadata in-place with the translations. - - Args: - - * metadata: - :class:`collections.OrderedDict` of metadata. - - * discipline: - Message section 0, octet 7. - - * parameterCategory: - Message section 4, octet 10. - - * parameterNumber: - Message section 4, octet 11. - - Kwargs: - - * probability (:class:`Probability`): - If present, the data encodes a forecast probability analysis with the - given properties. - - """ - cf = itranslation.grib2_phenom_to_cf_info( - param_discipline=discipline, - param_category=parameterCategory, - param_number=parameterNumber, - ) - if cf is not None: - if probability is None: - metadata["standard_name"] = cf.standard_name - metadata["long_name"] = cf.long_name - metadata["units"] = cf.units - else: - # The basic name+unit info goes into a 'threshold coordinate' which - # encodes probability threshold values. - threshold_coord = DimCoord( - probability.threshold, - standard_name=cf.standard_name, - long_name=cf.long_name, - units=cf.units, - ) - metadata["aux_coords_and_dims"].append((threshold_coord, None)) - # The main cube has an adjusted name, and units of '1'. - base_name = cf.standard_name or cf.long_name - long_name = "probability_of_{}_{}".format( - base_name, probability.probability_type_name - ) - metadata["standard_name"] = None - metadata["long_name"] = long_name - metadata["units"] = Unit(1) - - # Add a standard attribute recording the grib phenomenon identity. - metadata["attributes"]["GRIB_PARAM"] = GRIBCode( - edition=2, - discipline=discipline, - category=parameterCategory, - number=parameterNumber, - ) - - # Identify hybrid height and pressure reference fields. - # Look for fields at surface level first. - if ( - typeOfFirstFixedSurface == 1 - and scaledValueOfFirstFixedSurface == 0 - and typeOfSecondFixedSurface == _TYPE_OF_FIXED_SURFACE_MISSING - ): - # Land surface products for model terrain height: - if discipline == 2 and parameterCategory == 0 and parameterNumber == 7: - metadata["references"].append(ReferenceTarget("ref_orography", None)) - # Meteorological mass products for pressure: - elif discipline == 0 and parameterCategory == 3 and parameterNumber == 0: - metadata["references"].append( - ReferenceTarget( - "ref_surface_pressure", ensure_surface_air_pressure_name - ) - ) - - -def ensure_surface_air_pressure_name(cube): - # A 'transform' function for a iris.fileformats.rules.ReferenceTarget, - # instructing the rules code to rename the reference as - # 'surface_air_pressure'. - # - # Needed because the surface-air-pressure (reference) message normally - # loads as a plain 'air_pressure' cube. - # As references for factory construction are identified by .name(), in this - # case that can get confused with the derived coordinate produced by the - # HybridPressureFactory itself, which is also named 'air_pressure'. - # This will cause an infinite loop when building the derived coord (!) - name = cube.name() - # Just check the passed cube is of the sort expected. - expected_names = ("air_pressure", "surface_air_pressure") - if name not in expected_names: - msg = ( - "Unexpected cube name for hybrid-pressure reference data : " - "Expected one of {}, got {!r}." - ) - raise ValueError(msg.format(expected_names, name)) - # Get the caller (in rules.py) to rename it. - return {"standard_name": "surface_air_pressure"} - - -def time_range_unit(indicatorOfUnitForForecastTime): - """ - Translate the time range indicator. - - Translate the time range indicator to an equivalent - :class:`cf_units.Unit`. - - Args: - - * indicatorOfUnitForForecastTime: - Message section 4, octet 18. - - Returns: - :class:`cf_units.Unit`. - - """ - try: - unit = Unit(_TIME_RANGE_UNITS[indicatorOfUnitForForecastTime]) - except (KeyError, ValueError): - msg = ( - "Product definition section 4 contains unsupported " - "time range unit [{}]".format(indicatorOfUnitForForecastTime) - ) - raise TranslationError(msg) - return unit - - -def hybrid_factories(section, metadata): - """ - Translate the section 4 optional hybrid vertical coordinates. - - Updates the metadata in-place with the translations. - - Reference GRIB2 Code Table 4.5. - - Relevant notes: - [3] Hybrid pressure level (119) shall be used instead of Hybrid level (105) - - Args: - - * section: - Dictionary of coded key/value pairs from section 4 of the message. - - * metadata: - :class:`collections.OrderedDict` of metadata. - - """ - NV = section["NV"] - if NV > 0: - typeOfFirstFixedSurface = section["typeOfFirstFixedSurface"] - if typeOfFirstFixedSurface == _TYPE_OF_FIXED_SURFACE_MISSING: - msg = ( - "Product definition section 4 contains missing " - "type of first fixed surface" - ) - raise TranslationError(msg) - - typeOfSecondFixedSurface = section["typeOfSecondFixedSurface"] - if typeOfSecondFixedSurface != _TYPE_OF_FIXED_SURFACE_MISSING: - msg = ( - "Product definition section 4 contains unsupported type " - "of second fixed surface [{}]".format(typeOfSecondFixedSurface) - ) - raise TranslationError(msg) - - if typeOfFirstFixedSurface in [105, 118, 119]: - # Hybrid level (105), Hybrid height level (118) and Hybrid - # pressure level (119). - scaleFactor = section["scaleFactorOfFirstFixedSurface"] - if scaleFactor != 0: - msg = ( - "Product definition section 4 contains invalid scale " - "factor of first fixed surface [{}]".format(scaleFactor) - ) - raise TranslationError(msg) - - # Create the model level number scalar coordinate. - scaledValue = section["scaledValueOfFirstFixedSurface"] - coord = DimCoord( - scaledValue, - standard_name="model_level_number", - units=1, - attributes=dict(positive="up"), - ) - metadata["aux_coords_and_dims"].append((coord, None)) - - if typeOfFirstFixedSurface == 118: - # height - level_value_name = "level_height" - level_value_units = "m" - factory_class = HybridHeightFactory - factory_args = [ - {"long_name": level_value_name}, - {"long_name": "sigma"}, - Reference("ref_orography"), - ] - else: - # pressure - level_value_name = "level_pressure" - level_value_units = "Pa" - factory_class = HybridPressureFactory - factory_args = [ - {"long_name": level_value_name}, - {"long_name": "sigma"}, - Reference("ref_surface_pressure"), - ] - - # Create the level height/pressure scalar coordinate. - # scaledValue represents the level number, which is used to select - # the sigma and delta values as follows: - # sigma, delta = PV[i], PV[NV/2+i] : where i=1..level_number - pv = section["pv"] - offset = scaledValue - coord = DimCoord( - pv[offset], long_name=level_value_name, units=level_value_units - ) - metadata["aux_coords_and_dims"].append((coord, None)) - # Create the sigma scalar coordinate. - offset = NV // 2 + scaledValue - coord = AuxCoord(pv[offset], long_name="sigma", units=1) - metadata["aux_coords_and_dims"].append((coord, None)) - # Create the associated factory reference. - factory = Factory(factory_class, factory_args) - metadata["factories"].append(factory) - - else: - msg = ( - "Product definition section 4 contains unsupported " - "first fixed surface [{}]".format(typeOfFirstFixedSurface) - ) - raise TranslationError(msg) - - -def vertical_coords(section, metadata): - """ - Translate the vertical coordinates or hybrid vertical coordinates. - - Updates the metadata in-place with the translations. - - Reference GRIB2 Code Table 4.5. - - Args: - - * section: - Dictionary of coded key/value pairs from section 4 of the message. - - * metadata: - :class:`collections.OrderedDict` of metadata. - - """ - if section["NV"] > 0: - # Generate hybrid vertical coordinates. - hybrid_factories(section, metadata) - else: - # Generate vertical coordinate. - # section is not a true dict and does not support the get method. - try: - typeOfFirstFixedSurface = section["typeOfFirstFixedSurface"] - except KeyError: - typeOfFirstFixedSurface = _TYPE_OF_FIXED_SURFACE_MISSING - try: - typeOfSecondFixedSurface = section["typeOfSecondFixedSurface"] - except KeyError: - typeOfSecondFixedSurface = _TYPE_OF_FIXED_SURFACE_MISSING - - # We treat fixed surface level type=1 as having no vertical coordinate. - # See https://github.com/SciTools/iris/issues/519 - if typeOfFirstFixedSurface in [ - _TYPE_OF_FIXED_SURFACE_MISSING, - 1, - ] and typeOfSecondFixedSurface in [_TYPE_OF_FIXED_SURFACE_MISSING, 1]: - return - fixed_surface_missing = FixedSurface(None, None, None, None) - fixed_surface_first = _FIXED_SURFACE.get( - typeOfFirstFixedSurface, fixed_surface_missing - ) - if fixed_surface_first.point is not None: - # We have a surface type that includes the point in its definition - lower_bound = fixed_surface_first.point - else: - lower_bound = _get_surface_value(section, "First", warn_only=True) - point = lower_bound - - if typeOfSecondFixedSurface != _TYPE_OF_FIXED_SURFACE_MISSING: - fixed_surface_second = _FIXED_SURFACE.get( - typeOfSecondFixedSurface, fixed_surface_missing - ) - if fixed_surface_second.point is not None: - # We have a surface type that includes the point in its definition - upper_bound = fixed_surface_second.point - else: - upper_bound = _get_surface_value(section, "Second") - if upper_bound is not None: - point = 0.5 * (lower_bound + upper_bound) - bounds = [lower_bound, upper_bound] - else: - bounds = None - fixed_surface_second = None - upper_bound = None - if point is None: - return - coords = _build_vertical_coords( - bounds, - fixed_surface_first, - fixed_surface_second, - lower_bound, - point, - upper_bound, - ) - for coord in coords: - # Add the vertical coordinate(s) to metadata aux coords. - if fixed_surface_first == fixed_surface_missing: - coord.attributes["GRIB_fixed_surface_type"] = typeOfFirstFixedSurface - metadata["aux_coords_and_dims"].append((coord, None)) - - -def _build_vertical_coords( - bounds: list[float] | None, - fixed_surface_first: FixedSurface, - fixed_surface_second: FixedSurface | None, - lower_bound: float, - point: float, - upper_bound: float, -) -> list[DimCoord]: - """ - Build the vertical coordinates based on the bounds and fixed surface types. - - If the bounds are not None and the first and second fixed surfaces represent - different quantities, create two coordinates, one for each bound. - Otherwise, create a single coordinate with the point and bounds values. - - Args: - bounds: - List of two floats representing the lower and upper bounds, or None. - fixed_surface_first: - FixedSurface object for the first surface type (lower bound). - fixed_surface_second: - FixedSurface object for the second surface type (upper bound). - lower_bound: - The lower bound value. - point: - The point value to use if bounds are None. - upper_bound: - The upper bound value. - - Returns: - List of Coord objects representing the vertical coordinates. - """ - first_coord_kwargs = fixed_surface_first._asdict() - first_coord_kwargs.pop("point", None) - second_coord_kwargs = fixed_surface_second._asdict() if fixed_surface_second else {} - second_coord_kwargs.pop("point", None) - coords = [] - if bounds and first_coord_kwargs != second_coord_kwargs: - # Create two coords, one for each bound. - first_bounds = np.ma.masked_array(bounds, [False, True]) - coord = AuxCoord(lower_bound, bounds=first_bounds, **first_coord_kwargs) - coords.append(coord) - - second_bounds = np.ma.masked_array(bounds, [True, False]) - coord = AuxCoord(upper_bound, bounds=second_bounds, **second_coord_kwargs) - coords.append(coord) - else: - coord = DimCoord(point, bounds=bounds, **first_coord_kwargs) - coords.append(coord) - return coords - - -def _get_surface_value(section, sub_item, warn_only=False): - key = f"scaledValueOf{sub_item}FixedSurface" - scaledValueOfFixedSurface = section[key] - if scaledValueOfFixedSurface == _MDI: - msg = ( - f"Unable to translate type of {sub_item} fixed " - "surface with missing scaled value." - ) - if warn_only: - if options.warn_on_unsupported: - warnings.warn(msg) - else: - raise TranslationError(msg) - first = None - else: - key = f"scaleFactorOf{sub_item}FixedSurface" - scaleFactorOfFixedSurface = section[key] - first = unscale( - scaledValueOfFixedSurface, - scaleFactorOfFixedSurface, - ) - return first - - -def forecast_period_coord(indicatorOfUnitForForecastTime, forecastTime): - """ - Create the forecast period coordinate. - - Args: - - * indicatorOfUnitForForecastTime: - Message section 4, octets 18. - - * forecastTime: - Message section 4, octets 19-22. - - Returns: - The scalar forecast period :class:`iris.coords.DimCoord`. - - """ - # Determine the forecast period and associated units. - unit = time_range_unit(indicatorOfUnitForForecastTime) - point = unit.convert(forecastTime, "hours") - # Create the forecast period scalar coordinate. - coord = DimCoord(point, standard_name="forecast_period", units="hours") - return coord - - -def statistical_forecast_period_coord(section, frt_coord): - """ - Create a forecast period coordinate for a time-statistic message. - - This applies only with a product definition template 4.8. - - Args: - - * section: - Dictionary of coded key/value pairs from section 4 of the message. - - * frt_coord: - The scalar forecast reference time :class:`iris.coords.DimCoord`. - - Returns: - The scalar forecast period :class:`iris.coords.DimCoord`, containing a - single, bounded point (period value). - - """ - # Get the period end time as a datetime. - end_time = datetime( - section["yearOfEndOfOverallTimeInterval"], - section["monthOfEndOfOverallTimeInterval"], - section["dayOfEndOfOverallTimeInterval"], - section["hourOfEndOfOverallTimeInterval"], - section["minuteOfEndOfOverallTimeInterval"], - section["secondOfEndOfOverallTimeInterval"], - ) - - # Get forecast reference time (frt) as a datetime. - frt_point = frt_coord.units.num2date(frt_coord.points[0]) - - # Get the period start time (as a timedelta relative to the frt). - forecast_time = section["forecastTime"] - if options.support_hindcast_values: - # Apply the hindcast fix. - forecast_time = _hindcast_fix(forecast_time) - forecast_units = time_range_unit(section["indicatorOfUnitForForecastTime"]) - forecast_seconds = forecast_units.convert(forecast_time, "seconds") - start_time_delta = timedelta(seconds=forecast_seconds) - - # Get the period end time (as a timedelta relative to the frt). - end_time_delta = end_time - frt_point - - # Get the middle of the period (as a timedelta relative to the frt). - # Note: timedelta division in 2.7 is odd. Even though we request integer - # division, it's to the nearest _micro_second. - mid_time_delta = (start_time_delta + end_time_delta) // 2 - - # Create and return the forecast period coordinate. - def timedelta_hours(timedelta): - return timedelta.total_seconds() / 3600.0 - - mid_point_hours = timedelta_hours(mid_time_delta) - bounds_hours = [timedelta_hours(start_time_delta), timedelta_hours(end_time_delta)] - fp_coord = DimCoord( - mid_point_hours, - bounds=bounds_hours, - standard_name="forecast_period", - units="hours", - ) - return fp_coord - - -def other_time_coord(rt_coord, fp_coord): - """ - Make the "other" scalar time DimCoord. - - Return the counterpart to the given scalar 'time' or - 'forecast_reference_time' coordinate, by combining it with the - given forecast_period coordinate. - - Bounds are not supported. - - Args: - - * rt_coord: - The scalar "reference time" :class:`iris.coords.DimCoord`, - as defined by section 1. This must be either a 'time' or - 'forecast_reference_time' coordinate. - - * fp_coord: - The scalar 'forecast_period' :class:`iris.coords.DimCoord`. - - Returns: - The scalar :class:`iris.coords.DimCoord` for either 'time' or - 'forecast_reference_time'. - - """ - if not rt_coord.units.is_time_reference(): - fmt = "Invalid unit for reference time coord: {}" - raise ValueError(fmt.format(rt_coord.units)) - if not fp_coord.units.is_time(): - fmt = "Invalid unit for forecast_period coord: {}" - raise ValueError(fmt.format(fp_coord.units)) - if rt_coord.has_bounds() or fp_coord.has_bounds(): - raise ValueError("Coordinate bounds are not supported") - if rt_coord.shape != (1,) or fp_coord.shape != (1,): - raise ValueError("Vector coordinates are not supported") - - if rt_coord.standard_name == "time": - rt_base_unit = str(rt_coord.units).split(" since ")[0] - fp = fp_coord.units.convert(fp_coord.points[0], rt_base_unit) - frt = rt_coord.points[0] - fp - return DimCoord(frt, "forecast_reference_time", units=rt_coord.units) - elif rt_coord.standard_name == "forecast_reference_time": - return validity_time_coord(rt_coord, fp_coord) - else: - fmt = "Unexpected reference time coordinate: {}" - raise ValueError(fmt.format(rt_coord.name())) - - -def validity_time_coord(frt_coord, fp_coord): - """ - Create the validity or phenomenon time coordinate. - - Args: - - * frt_coord: - The scalar forecast reference time :class:`iris.coords.DimCoord`. - - * fp_coord: - The scalar forecast period :class:`iris.coords.DimCoord`. - - Returns: - The scalar time :class:`iris.coords.DimCoord`. - It has bounds if the period coord has them, otherwise not. - - """ - if frt_coord.shape != (1,): - msg = ( - "Expected scalar forecast reference time coordinate when " - "calculating validity time, got shape {!r}".format(frt_coord.shape) - ) - raise ValueError(msg) - - if fp_coord.shape != (1,): - msg = ( - "Expected scalar forecast period coordinate when " - "calculating validity time, got shape {!r}".format(fp_coord.shape) - ) - raise ValueError(msg) - - def coord_timedelta(coord, value): - # Helper to convert a time coordinate value into a timedelta. - seconds = coord.units.convert(value, "seconds") - return timedelta(seconds=seconds) - - # Calculate validity (phenomenon) time in forecast-reference-time units. - frt_point = frt_coord.units.num2date(frt_coord.points[0]) - point_delta = coord_timedelta(fp_coord, fp_coord.points[0]) - point = float(frt_coord.units.date2num(frt_point + point_delta)) - - # Calculate bounds (if any) in the same way. - if fp_coord.bounds is None: - bounds = None - else: - bounds_deltas = [ - coord_timedelta(fp_coord, bound_point) for bound_point in fp_coord.bounds[0] - ] - bounds = [ - float(frt_coord.units.date2num(frt_point + delta)) - for delta in bounds_deltas - ] - - # Create the time scalar coordinate. - coord = DimCoord(point, bounds=bounds, standard_name="time", units=frt_coord.units) - return coord - - -def time_coords(section, metadata, rt_coord): - if "forecastTime" in section.keys(): - forecast_time = section["forecastTime"] - # ecCodes encodes the forecast time as 'startStep' for pdt 4.4x; - # product_definition_template_40 makes use of this function. The - # following will be removed once the suspected bug is fixed. - elif "startStep" in section.keys(): - forecast_time = section["startStep"] - - # Calculate the forecast period coordinate. - fp_coord = forecast_period_coord( - section["indicatorOfUnitForForecastTime"], forecast_time - ) - # Add the forecast period coordinate to the metadata aux coords. - metadata["aux_coords_and_dims"].append((fp_coord, None)) - # Calculate the "other" time coordinate - i.e. whichever of 'time' - # or 'forecast_reference_time' we don't already have. - other_coord = other_time_coord(rt_coord, fp_coord) - # Add the time coordinate to the metadata aux coords. - metadata["aux_coords_and_dims"].append((other_coord, None)) - # Add the reference time coordinate to the metadata aux coords. - metadata["aux_coords_and_dims"].append((rt_coord, None)) - - -def generating_process(section, include_forecast_process=True): - if options.warn_on_unsupported: - # Reference Code Table 4.3. - warnings.warn("Unable to translate type of generating process.") - warnings.warn("Unable to translate background generating process identifier.") - if include_forecast_process: - warnings.warn("Unable to translate forecast generating process identifier.") - - -def data_cutoff(hoursAfterDataCutoff, minutesAfterDataCutoff): - """ - Handle the after reference time data cutoff. - - Args: - - * hoursAfterDataCutoff: - Message section 4, octets 15-16. - - * minutesAfterDataCutoff: - Message section 4, octet 17. - - """ - if hoursAfterDataCutoff != _MDI or minutesAfterDataCutoff != _MDI: - if options.warn_on_unsupported: - warnings.warn( - 'Unable to translate "hours and/or minutes after data cutoff".' - ) - - -def statistical_method_name(section): - # Decode the type of statistic as a cell_method 'method' string. - # Templates 8, 9, 10, 11 and 15 all use this type code, which is defined - # in table 4.10. - # However, the actual keyname is different for template 15. - section_number = section["productDefinitionTemplateNumber"] - if section_number in (8, 9, 10, 11): - stat_keyname = "typeOfStatisticalProcessing" - elif section_number == 15: - stat_keyname = "statisticalProcess" - else: - # This should *never* happen, as only called by pdt 8 and 15. - msg = ( - "Internal error: can't get statistical method for unsupported pdt : 4.{:d}." - ) - raise ValueError(msg.format(section_number)) - statistic_code = section[stat_keyname] - statistic_name = _STATISTIC_TYPE_NAMES.get(statistic_code) - if statistic_name is None: - msg = ( - "Product definition section 4 contains an unsupported " - "statistical process type [{}] " - ) - raise TranslationError(msg.format(statistic_code)) - return statistic_name - - -def statistical_cell_method(section): - """ - Create a cell method representing a time statistic. - - This applies only with a product definition template 4.8. - - Args: - - * section: - Dictionary of coded key/value pairs from section 4 of the message. - - Returns: - A cell method over 'time'. - - """ - # Handle the number of time ranges -- we currently only support one. - n_time_ranges = section["numberOfTimeRange"] - if n_time_ranges != 1: - if n_time_ranges == 0: - msg = ( - "Product definition section 4 specifies aggregation over " - '"0 time ranges".' - ) - raise TranslationError(msg) - else: - msg = ( - "Product definition section 4 specifies aggregation over " - "multiple time ranges [{}], which is not yet " - "supported.".format(n_time_ranges) - ) - raise TranslationError(msg) - - # Decode the type of statistic (aggregation method). - statistic_name = statistical_method_name(section) - - # Decode the type of time increment. - increment_typecode = section["typeOfTimeIncrement"] - if increment_typecode not in (2, 255): - # NOTE: All our current test data seems to contain the value 2, which - # is all we currently support. - # The exact interpretation of this is still unclear so we also accept - # a missing value. - msg = "grib statistic time-increment type [{}] is not supported.".format( - increment_typecode - ) - raise TranslationError(msg) - - interval_number = section["timeIncrement"] - if interval_number in (0, _TIME_RANGE_MISSING): - intervals_string = None - else: - units_string = _TIME_RANGE_UNITS[section["indicatorOfUnitForTimeIncrement"]] - intervals_string = "{} {}".format(interval_number, units_string) - - # Create a cell method to represent the time aggregation. - cell_method = CellMethod( - method=statistic_name, coords="time", intervals=intervals_string - ) - return cell_method - - -def ensemble_identifier(section): - if options.warn_on_unsupported: - # Reference Code Table 4.6. - warnings.warn("Unable to translate type of ensemble forecast.") - warnings.warn("Unable to translate number of forecasts in ensemble.") - - # Create the realization coordinates. - realization = DimCoord( - section["perturbationNumber"], standard_name="realization", units="no_unit" - ) - return realization - - -def product_definition_template_0(section, metadata, rt_coord): - """ - Translate product definition template 0. - - This template represents an analysis or forecast at a horizontal - level or in a horizontal layer at a point in time. - - Updates the metadata in-place with the translations. - - Args: - - * section: - Dictionary of coded key/value pairs from section 4 of the message. - - * metadata: - :class:`collections.OrderedDict` of metadata. - - * rt_coord: - The scalar "reference time" :class:`iris.coords.DimCoord`. - This will be either 'time' or 'forecast_reference_time'. - - """ - # Handle generating process details. - generating_process(section) - - # Handle the data cutoff. - data_cutoff(section["hoursAfterDataCutoff"], section["minutesAfterDataCutoff"]) - - time_coords(section, metadata, rt_coord) - - # Check for vertical coordinates. - vertical_coords(section, metadata) - - -def product_definition_template_1(section, metadata, frt_coord): - """ - Translate product definition template 1. - - This template represents individual ensemble forecast, control - and perturbed, at a horizontal level or in a horizontal layer at a - point in time. - - Updates the metadata in-place with the translations. - - Args: - - * section: - Dictionary of coded key/value pairs from section 4 of the message. - - * metadata: - :class:`collections.OrderedDict` of metadata. - - * frt_coord: - The scalar forecast reference time :class:`iris.coords.DimCoord`. - - """ - # Perform identical message processing. - product_definition_template_0(section, metadata, frt_coord) - - realization = ensemble_identifier(section) - - # Add the realization coordinate to the metadata aux coords. - metadata["aux_coords_and_dims"].append((realization, None)) - - -def product_definition_template_5(section, metadata, frt_coord): - """ - Translate product definition template 5. - - This template represents a probability forecast, - at a horizontal level or in a horizontal layer at a - point in time. - - Updates the metadata in-place with the translations. - - Args: - - * section: - Dictionary of coded key/value pairs from section 4 of the message. - - * metadata: - :class:`collections.OrderedDict` of metadata. - - * frt_coord: - The scalar forecast reference time :class:`iris.coords.DimCoord`. - - """ - # Perform identical message processing. - product_definition_template_0(section, metadata, frt_coord) - - probability_type = _probability_type(section) - return probability_type - - -def product_definition_template_6(section, metadata, frt_coord): - """ - Translate product definition template 6. - - This template represents a percentile forecast, - at a horizontal level or in a horizontal layer at a - point in time. - - Updates the metadata in-place with the translations. - - Args: - - * section: - Dictionary of coded key/value pairs from section 4 of the message. - - * metadata: - :class:`collections.OrderedDict` of metadata. - - * frt_coord: - The scalar forecast reference time :class:`iris.coords.DimCoord`. - - """ - # Perform identical message processing. - product_definition_template_0(section, metadata, frt_coord) - - percentile = DimCoord(section["percentileValue"], long_name="percentile", units="%") - - # Add the percentile coordinate to the metadata aux coords. - metadata["aux_coords_and_dims"].append((percentile, None)) - - -def product_definition_template_8(section, metadata, frt_coord): - """ - Translate product definition template 8. - - This template represents average, accumulation and/or extreme values - or other statistically processed values at a horizontal level or in a - horizontal layer in a continuous or non-continuous time interval. - - Updates the metadata in-place with the translations. - - Args: - - * section: - Dictionary of coded key/value pairs from section 4 of the message. - - * metadata: - :class:`collections.OrderedDict` of metadata. - - * frt_coord: - The scalar forecast reference time :class:`iris.coords.DimCoord`. - - """ - # Handle generating process details. - generating_process(section) - - # Handle the data cutoff. - data_cutoff(section["hoursAfterDataCutoff"], section["minutesAfterDataCutoff"]) - - # Create a cell method to represent the time statistic. - time_statistic_cell_method = statistical_cell_method(section) - # Add the forecast cell method to the metadata. - metadata["cell_methods"].append(time_statistic_cell_method) - - # Add the forecast reference time coordinate to the metadata aux coords, - # if it is a forecast reference time, not a time coord, as defined by - # significanceOfReferenceTime. - if frt_coord.name() != "time": - metadata["aux_coords_and_dims"].append((frt_coord, None)) - - # Add a bounded forecast period coordinate. - fp_coord = statistical_forecast_period_coord(section, frt_coord) - metadata["aux_coords_and_dims"].append((fp_coord, None)) - - # Calculate a bounded validity time coord matching the forecast period. - t_coord = validity_time_coord(frt_coord, fp_coord) - # Add the time coordinate to the metadata aux coords. - metadata["aux_coords_and_dims"].append((t_coord, None)) - - # Check for vertical coordinates. - vertical_coords(section, metadata) - - -def product_definition_template_9(section, metadata, frt_coord): - """ - Translate product definition template 9. - - This template represents probability forecasts at a - horizontal level or in a horizontal layer in a continuous or - non-continuous time interval. - - Updates the metadata in-place with the translations. - - Args: - - * section: - Dictionary of coded key/value pairs from section 4 of the message. - - * metadata: - :class:`collections.OrderedDict` of metadata. - - * frt_coord: - The scalar forecast reference time :class:`iris.coords.DimCoord`. - - """ - # Start by calling PDT8 as all elements of that are common to this. - product_definition_template_8(section, metadata, frt_coord) - - # Remove the cell_method encoding the underlying statistic, as CF does not - # currently support this type of representation. - (_cell_method,) = metadata["cell_methods"] # ERROR here if there is more than one. - metadata["cell_methods"] = [] - # NOTE: we currently don't record the nature of the underlying statistic, - # as we don't have an agreed way of representing that in CF. - - probability_type = _probability_type(section) - - return probability_type - - -def _probability_type(section): - # Return a probability object to control the production of a probability - # result. This is done once the underlying phenomenon type is determined, - # in 'translate_phenomenon'. - probability_typecode = section["probabilityType"] - # Note that GRIB provides separate "above lower threshold" and "above - # upper threshold" probability types. This naming style doesn't - # recognise that distinction. For now, assume this is not important. - match probability_typecode: - case 0: - # Type is "below lower level". - threshold = _probability_threshold(section, "lower") - probability_type = Probability("below_threshold", threshold) - case 1: - # Type is "above upper level". - threshold = _probability_threshold(section, "upper") - probability_type = Probability("above_threshold", threshold) - case 3: - # Type is "above lower level". - threshold = _probability_threshold(section, "lower") - probability_type = Probability("above_threshold", threshold) - case 4: - # Type is "below upper level". - threshold = _probability_threshold(section, "upper") - probability_type = Probability("below_threshold", threshold) - case _: - msg = ( - "Product definition section 4 contains an unsupported " - "probability type [{}]".format(probability_typecode) - ) - raise TranslationError(msg) - return probability_type - - -def _probability_threshold(section, limit_type): - """Get the unscaled probability threshold value for the given limit type.""" - value_key = f"scaledValueOf{limit_type.capitalize()}Limit" - scale_key = f"scaleFactorOf{limit_type.capitalize()}Limit" - msg = f"Product definition section 4 has missing {{item}} of {limit_type} limit" - - threshold_value = section[value_key] - if threshold_value == _MDI: - raise TranslationError(msg.format(item="scaled value")) - threshold_scaling = section[scale_key] - if threshold_scaling == _MDI: - raise TranslationError(msg.format(item="scale factor")) - threshold = unscale(threshold_value, threshold_scaling) - return threshold - - -def product_definition_template_10(section, metadata, frt_coord): - """ - Translate product definition template 10. - - This template represents percentile forecasts at a horizontal level - or in a horizontal layer in a continuous or non-continuous time interval. - - Updates the metadata in-place with the translations. - - Args: - - * section: - Dictionary of coded key/value pairs from section 4 of the message. - - * metadata: - :class:`collections.OrderedDict` of metadata. - - * frt_coord: - The scalar forecast reference time :class:`iris.coords.DimCoord`. - - """ - product_definition_template_8(section, metadata, frt_coord) - - percentile = DimCoord( - section["percentileValue"], long_name="percentile_over_time", units="no_unit" - ) - - # Add the percentile data info - metadata["aux_coords_and_dims"].append((percentile, None)) - - -def product_definition_template_11(section, metadata, frt_coord): - """ - Translate product definition template 11. - - This template represents individual ensemble forecast, control - or perturbed; average, accumulation and/or extreme values - or other statistically processed values at a horizontal level or in a - horizontal layer in a continuous or non-continuous time interval. - - Updates the metadata in-place with the translations. - - Args: - - * section: - Dictionary of coded key/value pairs from section 4 of the message. - - * metadata: - :class:`collections.OrderedDict` of metadata. - - * frt_coord: - The scalar forecast reference time :class:`iris.coords.DimCoord`. - - """ - product_definition_template_8(section, metadata, frt_coord) - - realization = ensemble_identifier(section) - - # Add the realization coordinate to the metadata aux coords. - metadata["aux_coords_and_dims"].append((realization, None)) - - -def product_definition_template_15(section, metadata, frt_coord): - """ - Translate product definition template 15. - - This template represents : "average, accumulation, extreme values, - or other statistically processed values over a spatial area at a - horizontal level or in a horizontal layer at a point in time". - - Updates the metadata in-place with the translations. - - Args: - - * section: - Dictionary of coded key/value pairs from section 4 of the message. - - * metadata: - :class:`collections.OrderedDict` of metadata. - - * frt_coord: - The scalar forecast reference time :class:`iris.coords.DimCoord`. - - """ - # Check unique keys for this template. - spatial_processing_code = section["spatialProcessing"] - - # Only a limited number of spatial processing codes are supported - if spatial_processing_code not in _SPATIAL_PROCESSING_TYPES.keys(): - msg = ( - "Product definition section 4 contains an unsupported " - "spatial processing type [{}]".format(spatial_processing_code) - ) - raise TranslationError(msg) - - # Process parts in common with PDT 4.0. - product_definition_template_0(section, metadata, frt_coord) - - # Add spatial processing type as an attribute. - metadata["attributes"]["spatial_processing_type"] = _SPATIAL_PROCESSING_TYPES[ - spatial_processing_code - ][0] - - # Add a cell method if the spatial processing type supports a - # statistical process. - if _SPATIAL_PROCESSING_TYPES[spatial_processing_code][1] == "cell_method": - # Decode the statistical method name. - cell_method_name = statistical_method_name(section) - - # Record an 'area' cell-method using this statistic. - metadata["cell_methods"] = [ - CellMethod(coords=("area",), method=cell_method_name) - ] - - -def satellite_common(section, metadata): - # Number of contributing spectral bands. - NB = section["NB"] - - if NB > 0: - # Create the satellite series coordinate. - satelliteSeries = section["satelliteSeries"] - coord = AuxCoord(satelliteSeries, long_name="satellite_series", units=1) - # Add the satellite series coordinate to the metadata aux coords. - metadata["aux_coords_and_dims"].append((coord, None)) - - # Create the satellite number coordinate. - satelliteNumber = section["satelliteNumber"] - coord = AuxCoord(satelliteNumber, long_name="satellite_number", units=1) - # Add the satellite number coordinate to the metadata aux coords. - metadata["aux_coords_and_dims"].append((coord, None)) - - # Create the satellite instrument type coordinate. - instrumentType = section["instrumentType"] - coord = AuxCoord(instrumentType, long_name="instrument_type", units=1) - # Add the instrument type coordinate to the metadata aux coords. - metadata["aux_coords_and_dims"].append((coord, None)) - - # Create the central wave number coordinate. - scaleFactor = section["scaleFactorOfCentralWaveNumber"] - scaledValue = section["scaledValueOfCentralWaveNumber"] - wave_number = unscale(scaledValue, scaleFactor) - standard_name = "sensor_band_central_radiation_wavenumber" - coord = AuxCoord(wave_number, standard_name=standard_name, units=Unit("m-1")) - # Add the central wave number coordinate to the metadata aux coords. - metadata["aux_coords_and_dims"].append((coord, None)) - - -def product_definition_template_31(section, metadata, rt_coord): - """ - Translate product definition template 31. - - This template represents a satellite product. - - Updates the metadata in-place with the translations. - - Args: - - * section: - Dictionary of coded key/value pairs from section 4 of the message. - - * metadata: - :class:`collections.OrderedDict` of metadata. - - * rt_coord: - The scalar observation time :class:`iris.coords.DimCoord'. - - """ - generating_process(section, include_forecast_process=False) - - satellite_common(section, metadata) - - # Add the observation time coordinate. - metadata["aux_coords_and_dims"].append((rt_coord, None)) - - -def product_definition_template_32(section, metadata, rt_coord): - """ - Translate product definition template 32. - - This template represents an analysis or forecast at a horizontal - level or in a horizontal layer at a point in time for simulated (synthetic) - satellite data. - - Updates the metadata in-place with the translations. - - Args: - - * section: - Dictionary of coded key/value pairs from section 4 of the message. - - * metadata: - :class:`collections.OrderedDict` of metadata. - - * rt_coord: - The scalar observation time :class:`iris.coords.DimCoord'. - - """ - generating_process(section, include_forecast_process=False) - - # Handle the data cutoff. - data_cutoff(section["hoursAfterDataCutoff"], section["minutesAfterDataCutoff"]) - - time_coords(section, metadata, rt_coord) - - satellite_common(section, metadata) - - -def product_definition_template_40(section, metadata, frt_coord): - """ - Translate product definition template 40. - - This template represents an analysis or forecast at a horizontal - level or in a horizontal layer at a point in time for atmospheric chemical - constituents. - - Updates the metadata in-place with the translations. - - Args: - - * section: - Dictionary of coded key/value pairs from section 4 of the message. - - * metadata: - :class:`collections.OrderedDict` of metadata. - - * frt_coord: - The scalar forecast reference time :class:`iris.coords.DimCoord`. - - """ - # Perform identical message processing. - product_definition_template_0(section, metadata, frt_coord) - - # Reference GRIB2 Code Table 4.230. - constituent_type = section["constituentType"] - - # Add the constituent type as an attribute. - metadata["attributes"]["WMO_constituent_type"] = constituent_type - - -def product_definition_section(section, metadata, discipline, tablesVersion, rt_coord): - """ - Translate section 4 from the GRIB2 message. - - Updates the metadata in-place with the translations. - - Args: - - * section: - Dictionary of coded key/value pairs from section 4 of the message. - - * metadata: - :class:`collections.OrderedDict` of metadata. - - * discipline: - Message section 0, octet 7. - - * tablesVersion: - Message section 1, octet 10. - - * rt_coord: - The scalar reference time :class:`iris.coords.DimCoord`. - - """ - # Reference GRIB2 Code Table 4.0. - template = section["productDefinitionTemplateNumber"] - - probability = None - includes_fixed_surface_keys = True - if template == 0: - # Process analysis or forecast at a horizontal level or - # in a horizontal layer at a point in time. - product_definition_template_0(section, metadata, rt_coord) - elif template == 1: - # Process individual ensemble forecast, control and perturbed, at - # a horizontal level or in a horizontal layer at a point in time. - product_definition_template_1(section, metadata, rt_coord) - elif template == 5: - # Process percentile forecast, at a horizontal level or in a horizontal - # layer at a point in time. - probability = product_definition_template_5(section, metadata, rt_coord) - elif template == 6: - # Process percentile forecast, at a horizontal level or in a horizontal - # layer at a point in time. - product_definition_template_6(section, metadata, rt_coord) - elif template == 8: - # Process statistically processed values at a horizontal level or in a - # horizontal layer in a continuous or non-continuous time interval. - product_definition_template_8(section, metadata, rt_coord) - elif template == 9: - probability = product_definition_template_9(section, metadata, rt_coord) - elif template == 10: - product_definition_template_10(section, metadata, rt_coord) - elif template == 11: - product_definition_template_11(section, metadata, rt_coord) - elif template == 15: - product_definition_template_15(section, metadata, rt_coord) - elif template == 31: - # Process satellite product. - includes_fixed_surface_keys = False - product_definition_template_31(section, metadata, rt_coord) - elif template == 32: - includes_fixed_surface_keys = False - product_definition_template_32(section, metadata, rt_coord) - elif template == 40: - product_definition_template_40(section, metadata, rt_coord) - else: - msg = "Product definition template [{}] is not supported".format(template) - raise TranslationError(msg) - - # Translate GRIB2 phenomenon to CF phenomenon. - if tablesVersion != _CODE_TABLES_MISSING: - translation_kwargs = { - "metadata": metadata, - "discipline": discipline, - "parameterCategory": section["parameterCategory"], - "parameterNumber": section["parameterNumber"], - "probability": probability, - } - - # Won't always be able to populate the below arguments - - # missing from some template definitions. - fixed_surface_keys = [ - "typeOfFirstFixedSurface", - "scaledValueOfFirstFixedSurface", - "typeOfSecondFixedSurface", - ] - - for section_key in fixed_surface_keys: - translation_kwargs[section_key] = ( - section[section_key] if includes_fixed_surface_keys else None - ) - - translate_phenomenon(**translation_kwargs) - - -############################################################################### -# -# Data Representation Section 5 -# -############################################################################### - - -def data_representation_section(section): - """ - Translate section 5 from the GRIB2 message. - - Grid point template decoding is fully provided by the ECMWF GRIB API, - all grid point and spectral templates are supported, the data payload - is returned from the GRIB API already unpacked. - - """ - # Reference GRIB2 Code Table 5.0. - template = section["dataRepresentationTemplateNumber"] - - # Supported templates for both grid point and spectral data: - grid_point_templates = (0, 1, 2, 3, 4, 40, 41, 42, 61) - spectral_templates = (50, 51) - supported_templates = grid_point_templates + spectral_templates - - if template not in supported_templates: - msg = "Data Representation Section Template [{}] is not supported".format( - template - ) - raise TranslationError(msg) - - -############################################################################### -# -# Bitmap Section 6 -# -############################################################################### - - -def bitmap_section(section): - """ - Translate section 6 from the GRIB2 message. - - The bitmap can take the following values: - - * 0: Bitmap applies to the data and is specified in this section - of this message. - * 1-253: Bitmap applies to the data, is specified by originating - centre and is not specified in section 6 of this message. - * 254: Bitmap applies to the data, is specified in an earlier - section 6 of this message and is not specified in this - section 6 of this message. - * 255: Bitmap does not apply to the data. - - Only values 0 and 255 are supported. - - """ - # Reference GRIB2 Code Table 6.0. - bitMapIndicator = section["bitMapIndicator"] - - if bitMapIndicator not in [_BITMAP_CODE_NONE, _BITMAP_CODE_PRESENT]: - msg = "Bitmap Section 6 contains unsupported bitmap indicator [{}]".format( - bitMapIndicator - ) - raise TranslationError(msg) - - -############################################################################### - - -def grib2_convert(field, metadata): - """ - Translate the GRIB2 message into the appropriate cube metadata. - - Updates the metadata in-place with the translations. - - Args: - - * field: - GRIB2 message to be translated. - - * metadata: - :class:`collections.OrderedDict` of metadata. - - """ - # Section 1 - Identification Section. - centre = _CENTRES.get(field.sections[1]["centre"]) - if centre is not None: - metadata["attributes"]["centre"] = centre - rt_coord = reference_time_coord(field.sections[1]) - - # Section 3 - Grid Definition Section (Grid Definition Template) - grid_definition_section(field.sections[3], metadata) - - # Section 4 - Product Definition Section (Product Definition Template) - product_definition_section( - field.sections[4], - metadata, - field.sections[0]["discipline"], - field.sections[1]["tablesVersion"], - rt_coord, - ) - - # Section 5 - Data Representation Section (Data Representation Template) - data_representation_section(field.sections[5]) - - # Section 6 - Bitmap Section. - bitmap_section(field.sections[6]) +from iris.exceptions import TranslationError +from iris.fileformats.rules import ConversionMetadata -############################################################################### +options = Namespace(warn_on_unsupported=False, support_hindcast_values=True) def convert(field): @@ -2940,6 +32,9 @@ def convert(field): A :class:`iris.fileformats.rules.ConversionMetadata` object. """ + from ._grib1_legacy.grib1_load_rules import grib1_convert as old_grib1_convert # noqa: PLC0415 + from ._grib2_convert import grib2_convert # noqa: PLC0415 + if hasattr(field, "sections"): editionNumber = field.sections[0]["editionNumber"] @@ -2970,6 +65,6 @@ def convert(field): emsg = "GRIB edition {} is not supported by {!r}." raise TranslationError(emsg.format(editionNumber, type(field).__name__)) - result = grib1_convert(field) + result = old_grib1_convert(field) return result diff --git a/src/iris_grib/_save_rules.py b/src/iris_grib/_save_rules.py index a533b03b..0e728be5 100644 --- a/src/iris_grib/_save_rules.py +++ b/src/iris_grib/_save_rules.py @@ -33,7 +33,7 @@ from . import grib_phenom_translation as gptx -from ._load_convert import ( +from ._grib2_convert import ( _STATISTIC_TYPE_NAMES, _TIME_RANGE_UNITS, _SPATIAL_PROCESSING_TYPES, diff --git a/src/iris_grib/tests/integration/save_rules/test_grib_save.py b/src/iris_grib/tests/integration/save_rules/test_grib_save.py index 875c2ecf..1df156d6 100644 --- a/src/iris_grib/tests/integration/save_rules/test_grib_save.py +++ b/src/iris_grib/tests/integration/save_rules/test_grib_save.py @@ -26,7 +26,7 @@ import iris.util import eccodes -from iris_grib._load_convert import _MDI as MDI +from iris_grib._grib2_convert import _MDI as MDI class TestLoadSave(tests.TestGribMessage): diff --git a/src/iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py b/src/iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py index 840313b0..e8f2c2f9 100644 --- a/src/iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py +++ b/src/iris_grib/tests/unit/grib1_load_rules/test_grib1_convert.py @@ -15,8 +15,8 @@ from iris.exceptions import TranslationError from iris.fileformats.rules import Reference -from iris_grib import GribWrapper -from iris_grib._grib1_load_rules import grib1_convert +from iris_grib._grib1_legacy.grib_wrapper import GribWrapper +from iris_grib._grib1_legacy.grib1_load_rules import grib1_convert from iris_grib.tests.unit import TestField diff --git a/src/iris_grib/tests/unit/grib1_load_rules/test_grib1_load_translations.py b/src/iris_grib/tests/unit/grib1_load_rules/test_grib1_load_translations.py index d60802f4..35ad9548 100644 --- a/src/iris_grib/tests/unit/grib1_load_rules/test_grib1_load_translations.py +++ b/src/iris_grib/tests/unit/grib1_load_rules/test_grib1_load_translations.py @@ -26,6 +26,8 @@ import iris.fileformats import iris_grib +from iris_grib._grib1_legacy.grib_wrapper import GribWrapper + def _mock_eccodes_fetch(message, key): """ @@ -168,7 +170,7 @@ def _run_timetests(self, test_set): # Operates on lists of cases for various time-units and grib-editions. # Format: (edition, code, expected-exception, # equivalent-seconds, description-string) - with mock.patch("iris_grib.eccodes", _mock_eccodes): + with mock.patch("iris_grib._grib1_legacy.grib_wrapper.eccodes", _mock_eccodes): for test_controls in test_set: ( grib_edition, @@ -186,14 +188,14 @@ def _run_timetests(self, test_set): if expected_error: # Expect GribWrapper construction to fail. with self.assertRaises(type(expected_error)) as ar_context: - _ = iris_grib.GribWrapper(message) + _ = GribWrapper(message) self.assertEqual(ar_context.exception.args, expected_error.args) continue # 'ELSE'... # Expect the wrapper construction to work. # Make a GribWrapper object and test it. - wrapped_msg = iris_grib.GribWrapper(message) + wrapped_msg = GribWrapper(message) # Check the units string. forecast_timeunit = wrapped_msg._forecastTimeUnit @@ -319,11 +321,11 @@ def mock_grib(self): def cube_from_message(self, grib): # Parameter translation now uses the GribWrapper, so we must convert # the Mock-based fake message to a FakeGribMessage. - with mock.patch("iris_grib.eccodes", _mock_eccodes): + with mock.patch("iris_grib._grib1_legacy.grib_wrapper.eccodes", _mock_eccodes): grib_message = FakeGribMessage(**grib.__dict__) - wrapped_msg = iris_grib.GribWrapper(grib_message) + wrapped_msg = GribWrapper(grib_message) cube, _, _ = iris.fileformats.rules._make_cube( - wrapped_msg, iris_grib._grib1_load_rules.grib1_convert + wrapped_msg, iris_grib._grib1_legacy.grib1_load_rules.grib1_convert ) return cube diff --git a/src/iris_grib/tests/unit/load_convert/__init__.py b/src/iris_grib/tests/unit/grib2_convert/__init__.py similarity index 94% rename from src/iris_grib/tests/unit/load_convert/__init__.py rename to src/iris_grib/tests/unit/grib2_convert/__init__.py index 68d333df..9a46adf4 100644 --- a/src/iris_grib/tests/unit/load_convert/__init__.py +++ b/src/iris_grib/tests/unit/grib2_convert/__init__.py @@ -2,7 +2,7 @@ # # This file is part of iris-grib and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Unit tests for the :mod:`iris_grib._load_convert` package.""" +"""Unit tests for the :mod:`iris_grib._grib2_convert` package.""" # import iris_grib.tests first so that some things can be initialised # before importing anything else. diff --git a/src/iris_grib/tests/unit/load_convert/test__hindcast_fix.py b/src/iris_grib/tests/unit/grib2_convert/test__hindcast_fix.py similarity index 85% rename from src/iris_grib/tests/unit/load_convert/test__hindcast_fix.py rename to src/iris_grib/tests/unit/grib2_convert/test__hindcast_fix.py index 99d13ddd..aabd19d8 100644 --- a/src/iris_grib/tests/unit/load_convert/test__hindcast_fix.py +++ b/src/iris_grib/tests/unit/grib2_convert/test__hindcast_fix.py @@ -3,7 +3,7 @@ # This file is part of iris-grib and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """ -Tests for function :func:`iris_grib._load_convert._hindcast_fix`. +Tests for function :func:`iris_grib._grib2_convert._hindcast_fix`. """ @@ -12,8 +12,8 @@ import pytest -from iris_grib._load_convert import _hindcast_fix as hindcast_fix -from iris_grib._load_convert import HindcastOverflowWarning +from iris_grib._grib2_convert import _hindcast_fix as hindcast_fix +from iris_grib._grib2_convert import HindcastOverflowWarning FixTest = namedtuple("FixTest", ("given", "fixable", "fixed")) @@ -44,7 +44,7 @@ def test_fix(self, testval): def test_fix_warning(self, mocker): # Check warning appears when enabled. - mocker.patch("iris_grib._load_convert.options.warn_on_unsupported", True) + mocker.patch("iris_grib._grib2_convert.options.warn_on_unsupported", True) msg = "Re-interpreting large grib forecastTime" with pytest.warns(HindcastOverflowWarning, match=msg): hindcast_fix(2 * 2**30 + 5) diff --git a/src/iris_grib/tests/unit/load_convert/test_bitmap_section.py b/src/iris_grib/tests/unit/grib2_convert/test_bitmap_section.py similarity index 89% rename from src/iris_grib/tests/unit/load_convert/test_bitmap_section.py rename to src/iris_grib/tests/unit/grib2_convert/test_bitmap_section.py index 2fabdac2..c80aaf66 100644 --- a/src/iris_grib/tests/unit/load_convert/test_bitmap_section.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_bitmap_section.py @@ -3,7 +3,7 @@ # This file is part of iris-grib and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """ -Test function :func:`iris_grib._load_convert.bitmap_section.` +Test function :func:`iris_grib._grib2_convert.bitmap_section.` """ @@ -13,7 +13,7 @@ from iris.exceptions import TranslationError -from iris_grib._load_convert import bitmap_section +from iris_grib._grib2_convert import bitmap_section from iris_grib.tests.unit import _make_test_message diff --git a/src/iris_grib/tests/unit/load_convert/test_calculate_increment.py b/src/iris_grib/tests/unit/grib2_convert/test_calculate_increment.py similarity index 86% rename from src/iris_grib/tests/unit/load_convert/test_calculate_increment.py rename to src/iris_grib/tests/unit/grib2_convert/test_calculate_increment.py index da0a6310..646c8da7 100644 --- a/src/iris_grib/tests/unit/load_convert/test_calculate_increment.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_calculate_increment.py @@ -3,7 +3,7 @@ # This file is part of iris-grib and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """ -Unit tests for `iris_grib._load_convert._calculate_increment`. +Unit tests for `iris_grib._grib2_convert._calculate_increment`. """ @@ -11,7 +11,7 @@ # importing anything else. import iris_grib.tests as tests -from iris_grib._load_convert import _calculate_increment +from iris_grib._grib2_convert import _calculate_increment class Test(tests.IrisGribTest): diff --git a/src/iris_grib/tests/unit/load_convert/test_convert.py b/src/iris_grib/tests/unit/grib2_convert/test_convert.py similarity index 91% rename from src/iris_grib/tests/unit/load_convert/test_convert.py rename to src/iris_grib/tests/unit/grib2_convert/test_convert.py index ebf02a6f..12933c7c 100644 --- a/src/iris_grib/tests/unit/load_convert/test_convert.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_convert.py @@ -2,7 +2,7 @@ # # This file is part of iris-grib and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Test function :func:`iris_grib._load_convert.convert`.""" +"""Test function :func:`iris_grib._grib2_convert.convert`.""" # import iris_grib.tests first so that some things can be initialised # before importing anything else. @@ -23,7 +23,7 @@ def func(field, metadata): sections = [{"editionNumber": 2}] field = _make_test_message(sections) - this = "iris_grib._load_convert.grib2_convert" + this = "iris_grib._grib2_convert.grib2_convert" factory = mock.sentinel.factory with mock.patch(this, side_effect=func) as grib2_convert: # The call being tested. @@ -51,7 +51,7 @@ def test_edition_2_bad(self): def test_edition_1(self): # Test object with no '.sections', and '.edition' ==1. field = mock.Mock(edition=1, spec=("edition")) - func = "iris_grib._load_convert.grib1_convert" + func = "iris_grib._grib1_legacy.grib1_load_rules.grib1_convert" metadata = mock.sentinel.metadata with mock.patch(func, return_value=metadata) as grib1_convert: result = convert(field) diff --git a/src/iris_grib/tests/unit/load_convert/test_data_cutoff.py b/src/iris_grib/tests/unit/grib2_convert/test_data_cutoff.py similarity index 88% rename from src/iris_grib/tests/unit/load_convert/test_data_cutoff.py rename to src/iris_grib/tests/unit/grib2_convert/test_data_cutoff.py index d94a1ace..b1c03343 100644 --- a/src/iris_grib/tests/unit/load_convert/test_data_cutoff.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_data_cutoff.py @@ -3,7 +3,7 @@ # This file is part of iris-grib and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """ -Tests for function :func:`iris_grib._load_convert.data_cutoff`. +Tests for function :func:`iris_grib._grib2_convert.data_cutoff`. """ @@ -13,14 +13,14 @@ from unittest import mock -from iris_grib._load_convert import _MDI as MDI -from iris_grib._load_convert import data_cutoff +from iris_grib._grib2_convert import _MDI as MDI +from iris_grib._grib2_convert import data_cutoff class TestDataCutoff(tests.IrisGribTest): def _check(self, hours, minutes, request_warning, expect_warning=False): # Setup the environment. - patch_target = "iris_grib._load_convert.options" + patch_target = "iris_grib._grib2_convert.options" with mock.patch(patch_target) as options: options.warn_on_unsupported = request_warning with mock.patch("warnings.warn") as warn: diff --git a/src/iris_grib/tests/unit/load_convert/test_data_representation_section.py b/src/iris_grib/tests/unit/grib2_convert/test_data_representation_section.py similarity index 89% rename from src/iris_grib/tests/unit/load_convert/test_data_representation_section.py rename to src/iris_grib/tests/unit/grib2_convert/test_data_representation_section.py index 9bf03478..8ffe2831 100644 --- a/src/iris_grib/tests/unit/load_convert/test_data_representation_section.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_data_representation_section.py @@ -3,7 +3,7 @@ # This file is part of iris-grib and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """ -Test function :func:`iris_grib._load_convert.data_representation_section.` +Test function :func:`iris_grib._grib2_convert.data_representation_section.` """ @@ -13,7 +13,7 @@ from iris.exceptions import TranslationError -from iris_grib._load_convert import data_representation_section +from iris_grib._grib2_convert import data_representation_section from iris_grib.tests.unit import _make_test_message diff --git a/src/iris_grib/tests/unit/load_convert/test_ellipsoid.py b/src/iris_grib/tests/unit/grib2_convert/test_ellipsoid.py similarity index 96% rename from src/iris_grib/tests/unit/load_convert/test_ellipsoid.py rename to src/iris_grib/tests/unit/grib2_convert/test_ellipsoid.py index 52dbbe23..bd14bf6c 100644 --- a/src/iris_grib/tests/unit/load_convert/test_ellipsoid.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_ellipsoid.py @@ -3,7 +3,7 @@ # This file is part of iris-grib and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """ -Test function :func:`iris_grib._load_convert.ellipsoid. +Test function :func:`iris_grib._grib2_convert.ellipsoid. """ @@ -16,7 +16,7 @@ import iris.coord_systems as icoord_systems from iris.exceptions import TranslationError -from iris_grib._load_convert import ellipsoid +from iris_grib._grib2_convert import ellipsoid # Reference GRIB2 Code Table 3.2 - Shape of the Earth. diff --git a/src/iris_grib/tests/unit/load_convert/test_ellipsoid_geometry.py b/src/iris_grib/tests/unit/grib2_convert/test_ellipsoid_geometry.py similarity index 87% rename from src/iris_grib/tests/unit/load_convert/test_ellipsoid_geometry.py rename to src/iris_grib/tests/unit/grib2_convert/test_ellipsoid_geometry.py index 0ed1e93b..374e82e0 100644 --- a/src/iris_grib/tests/unit/load_convert/test_ellipsoid_geometry.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_ellipsoid_geometry.py @@ -3,7 +3,7 @@ # This file is part of iris-grib and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """ -Test function :func:`iris_grib._load_convert.ellipsoid_geometry. +Test function :func:`iris_grib._grib2_convert.ellipsoid_geometry. """ @@ -11,7 +11,7 @@ # before importing anything else. import iris_grib.tests as tests -from iris_grib._load_convert import ellipsoid_geometry +from iris_grib._grib2_convert import ellipsoid_geometry class Test(tests.IrisGribTest): diff --git a/src/iris_grib/tests/unit/load_convert/test_ensemble_identifier.py b/src/iris_grib/tests/unit/grib2_convert/test_ensemble_identifier.py similarity index 90% rename from src/iris_grib/tests/unit/load_convert/test_ensemble_identifier.py rename to src/iris_grib/tests/unit/grib2_convert/test_ensemble_identifier.py index 84b78213..8138fc63 100644 --- a/src/iris_grib/tests/unit/load_convert/test_ensemble_identifier.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_ensemble_identifier.py @@ -4,7 +4,7 @@ # See LICENSE in the root of the repository for full licensing details. """ Test function -:func:`iris_grib._load_convert.ensemble_identifier`. +:func:`iris_grib._grib2_convert.ensemble_identifier`. """ @@ -17,7 +17,7 @@ from iris.coords import DimCoord -from iris_grib._load_convert import ensemble_identifier +from iris_grib._grib2_convert import ensemble_identifier class Test(tests.IrisGribTest): @@ -26,7 +26,7 @@ def setUp(self): def _check(self, request_warning): section = {"perturbationNumber": 17} - this = "iris_grib._load_convert.options" + this = "iris_grib._grib2_convert.options" with mock.patch(this, warn_on_unsupported=request_warning): realization = ensemble_identifier(section) expected = DimCoord( diff --git a/src/iris_grib/tests/unit/load_convert/test_forecast_period_coord.py b/src/iris_grib/tests/unit/grib2_convert/test_forecast_period_coord.py similarity index 90% rename from src/iris_grib/tests/unit/load_convert/test_forecast_period_coord.py rename to src/iris_grib/tests/unit/grib2_convert/test_forecast_period_coord.py index 29ef27c4..f837942c 100644 --- a/src/iris_grib/tests/unit/load_convert/test_forecast_period_coord.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_forecast_period_coord.py @@ -3,7 +3,7 @@ # This file is part of iris-grib and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """ -Test function :func:`iris_grib._load_convert.forecast_period_coord. +Test function :func:`iris_grib._grib2_convert.forecast_period_coord. """ @@ -13,7 +13,7 @@ from iris.coords import DimCoord -from iris_grib._load_convert import forecast_period_coord +from iris_grib._grib2_convert import forecast_period_coord class Test(tests.IrisGribTest): diff --git a/src/iris_grib/tests/unit/load_convert/test_generating_process.py b/src/iris_grib/tests/unit/grib2_convert/test_generating_process.py similarity index 91% rename from src/iris_grib/tests/unit/load_convert/test_generating_process.py rename to src/iris_grib/tests/unit/grib2_convert/test_generating_process.py index 35c0dc93..eacd4b4f 100644 --- a/src/iris_grib/tests/unit/load_convert/test_generating_process.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_generating_process.py @@ -4,7 +4,7 @@ # See LICENSE in the root of the repository for full licensing details. """ Tests for function -:func:`iris_grib._load_convert.generating_process`. +:func:`iris_grib._grib2_convert.generating_process`. """ @@ -12,7 +12,7 @@ # before importing anything else. import iris_grib.tests as tests -from iris_grib._load_convert import generating_process +from iris_grib._grib2_convert import generating_process class TestGeneratingProcess(tests.IrisGribTest): @@ -24,7 +24,7 @@ def test_nowarn(self): self.assertEqual(self.warn_patch.call_count, 0) def _check_warnings(self, with_forecast=True): - module = "iris_grib._load_convert" + module = "iris_grib._grib2_convert" self.patch(module + ".options.warn_on_unsupported", True) call_args = [None] call_kwargs = {} diff --git a/src/iris_grib/tests/unit/load_convert/test_grib2_convert.py b/src/iris_grib/tests/unit/grib2_convert/test_grib2_convert.py similarity index 92% rename from src/iris_grib/tests/unit/load_convert/test_grib2_convert.py rename to src/iris_grib/tests/unit/grib2_convert/test_grib2_convert.py index cc06cd09..9a1dc6d2 100644 --- a/src/iris_grib/tests/unit/load_convert/test_grib2_convert.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_grib2_convert.py @@ -2,7 +2,7 @@ # # This file is part of iris-grib and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Test function :func:`iris_grib._load_convert.grib2_convert`.""" +"""Test function :func:`iris_grib._grib2_convert.grib2_convert`.""" # import iris_grib.tests first so that some things can be initialised # before importing anything else. @@ -12,13 +12,13 @@ from unittest import mock import iris_grib -from iris_grib._load_convert import grib2_convert +from iris_grib._grib2_convert import grib2_convert from iris_grib.tests.unit import _make_test_message class Test(tests.IrisGribTest): def setUp(self): - this = "iris_grib._load_convert" + this = "iris_grib._grib2_convert" self.patch("{}.reference_time_coord".format(this), return_value=None) self.patch("{}.grid_definition_section".format(this)) self.patch("{}.product_definition_section".format(this)) @@ -56,7 +56,7 @@ def test(self): # The call being tested. grib2_convert(field, metadata) self.assertEqual(metadata, expected) - this = iris_grib._load_convert + this = iris_grib._grib2_convert this.reference_time_coord.assert_called_with(sections[1]) this.grid_definition_section.assert_called_with(sections[3], expected) args = ( diff --git a/src/iris_grib/tests/unit/load_convert/test_grid_definition_template_0_and_1.py b/src/iris_grib/tests/unit/grib2_convert/test_grid_definition_template_0_and_1.py similarity index 96% rename from src/iris_grib/tests/unit/load_convert/test_grid_definition_template_0_and_1.py rename to src/iris_grib/tests/unit/grib2_convert/test_grid_definition_template_0_and_1.py index 1d8a9fa3..8335e9aa 100644 --- a/src/iris_grib/tests/unit/load_convert/test_grid_definition_template_0_and_1.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_grid_definition_template_0_and_1.py @@ -4,7 +4,7 @@ # See LICENSE in the root of the repository for full licensing details. """ Test function -:func:`iris_grib._load_convert.grid_definition_template_0_and_1`. +:func:`iris_grib._grib2_convert.grid_definition_template_0_and_1`. """ @@ -19,9 +19,9 @@ from iris.exceptions import TranslationError -from iris_grib.tests.unit.load_convert import empty_metadata +from iris_grib.tests.unit.grib2_convert import empty_metadata -from iris_grib._load_convert import grid_definition_template_0_and_1 +from iris_grib._grib2_convert import grid_definition_template_0_and_1 class _Section(dict): diff --git a/src/iris_grib/tests/unit/load_convert/test_grid_definition_template_10.py b/src/iris_grib/tests/unit/grib2_convert/test_grid_definition_template_10.py similarity index 93% rename from src/iris_grib/tests/unit/load_convert/test_grid_definition_template_10.py rename to src/iris_grib/tests/unit/grib2_convert/test_grid_definition_template_10.py index 093f7507..858996e4 100644 --- a/src/iris_grib/tests/unit/load_convert/test_grid_definition_template_10.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_grid_definition_template_10.py @@ -4,7 +4,7 @@ # See LICENSE in the root of the repository for full licensing details. """ Unit tests for -:func:`iris_grib._load_convert.grid_definition_template_10`. +:func:`iris_grib._grib2_convert.grid_definition_template_10`. """ @@ -18,9 +18,9 @@ import iris.coords import iris.exceptions -from iris_grib.tests.unit.load_convert import empty_metadata +from iris_grib.tests.unit.grib2_convert import empty_metadata -from iris_grib._load_convert import grid_definition_template_10 +from iris_grib._grib2_convert import grid_definition_template_10 class Test(tests.IrisGribTest): diff --git a/src/iris_grib/tests/unit/load_convert/test_grid_definition_template_12.py b/src/iris_grib/tests/unit/grib2_convert/test_grid_definition_template_12.py similarity index 96% rename from src/iris_grib/tests/unit/load_convert/test_grid_definition_template_12.py rename to src/iris_grib/tests/unit/grib2_convert/test_grid_definition_template_12.py index 02485d14..8999f6ef 100644 --- a/src/iris_grib/tests/unit/load_convert/test_grid_definition_template_12.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_grid_definition_template_12.py @@ -4,7 +4,7 @@ # See LICENSE in the root of the repository for full licensing details. """ Unit tests for -:func:`iris_grib._load_convert.grid_definition_template_12`. +:func:`iris_grib._grib2_convert.grid_definition_template_12`. """ @@ -19,10 +19,10 @@ import iris.coords import iris.exceptions -from iris_grib.tests.unit.load_convert import empty_metadata -from iris_grib._load_convert import _MDI as MDI +from iris_grib.tests.unit.grib2_convert import empty_metadata +from iris_grib._grib2_convert import _MDI as MDI -from iris_grib._load_convert import grid_definition_template_12 +from iris_grib._grib2_convert import grid_definition_template_12 class Test(tests.IrisGribTest): diff --git a/src/iris_grib/tests/unit/load_convert/test_grid_definition_template_140.py b/src/iris_grib/tests/unit/grib2_convert/test_grid_definition_template_140.py similarity index 92% rename from src/iris_grib/tests/unit/load_convert/test_grid_definition_template_140.py rename to src/iris_grib/tests/unit/grib2_convert/test_grid_definition_template_140.py index a99010e3..5068a41c 100644 --- a/src/iris_grib/tests/unit/load_convert/test_grid_definition_template_140.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_grid_definition_template_140.py @@ -4,7 +4,7 @@ # See LICENSE in the root of the repository for full licensing details. """ Unit tests for -:func:`iris_grib._load_convert.grid_definition_template_140`. +:func:`iris_grib._grib2_convert.grid_definition_template_140`. """ # import iris_grib.tests first so that some things can be initialised @@ -17,10 +17,10 @@ import iris.coord_systems import iris.coords -from iris_grib.tests.unit.load_convert import empty_metadata -from iris_grib._load_convert import _MDI as MDI +from iris_grib.tests.unit.grib2_convert import empty_metadata +from iris_grib._grib2_convert import _MDI as MDI -from iris_grib._load_convert import grid_definition_template_140 +from iris_grib._grib2_convert import grid_definition_template_140 class Test(tests.IrisGribTest): diff --git a/src/iris_grib/tests/unit/load_convert/test_grid_definition_template_20.py b/src/iris_grib/tests/unit/grib2_convert/test_grid_definition_template_20.py similarity index 92% rename from src/iris_grib/tests/unit/load_convert/test_grid_definition_template_20.py rename to src/iris_grib/tests/unit/grib2_convert/test_grid_definition_template_20.py index 3aeaed43..b2d2687c 100644 --- a/src/iris_grib/tests/unit/load_convert/test_grid_definition_template_20.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_grid_definition_template_20.py @@ -4,7 +4,7 @@ # See LICENSE in the root of the repository for full licensing details. """ Unit tests for -:func:`iris_grib._load_convert.grid_definition_template_20`. +:func:`iris_grib._grib2_convert.grid_definition_template_20`. """ # import iris_grib.tests first so that some things can be initialised @@ -17,10 +17,10 @@ import iris.coord_systems import iris.coords -from iris_grib.tests.unit.load_convert import empty_metadata -from iris_grib._load_convert import _MDI as MDI +from iris_grib.tests.unit.grib2_convert import empty_metadata +from iris_grib._grib2_convert import _MDI as MDI -from iris_grib._load_convert import grid_definition_template_20 +from iris_grib._grib2_convert import grid_definition_template_20 class Test(tests.IrisGribTest): diff --git a/src/iris_grib/tests/unit/load_convert/test_grid_definition_template_30.py b/src/iris_grib/tests/unit/grib2_convert/test_grid_definition_template_30.py similarity index 92% rename from src/iris_grib/tests/unit/load_convert/test_grid_definition_template_30.py rename to src/iris_grib/tests/unit/grib2_convert/test_grid_definition_template_30.py index 635bf173..d040f91b 100644 --- a/src/iris_grib/tests/unit/load_convert/test_grid_definition_template_30.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_grid_definition_template_30.py @@ -4,7 +4,7 @@ # See LICENSE in the root of the repository for full licensing details. """ Unit tests for -:func:`iris_grib._load_convert.grid_definition_template_30`. +:func:`iris_grib._grib2_convert.grid_definition_template_30`. """ # import iris_grib.tests first so that some things can be initialised @@ -17,10 +17,10 @@ import iris.coord_systems import iris.coords -from iris_grib.tests.unit.load_convert import empty_metadata -from iris_grib._load_convert import _MDI as MDI +from iris_grib.tests.unit.grib2_convert import empty_metadata +from iris_grib._grib2_convert import _MDI as MDI -from iris_grib._load_convert import grid_definition_template_30 +from iris_grib._grib2_convert import grid_definition_template_30 class Test(tests.IrisGribTest): diff --git a/src/iris_grib/tests/unit/load_convert/test_grid_definition_template_40.py b/src/iris_grib/tests/unit/grib2_convert/test_grid_definition_template_40.py similarity index 96% rename from src/iris_grib/tests/unit/load_convert/test_grid_definition_template_40.py rename to src/iris_grib/tests/unit/grib2_convert/test_grid_definition_template_40.py index 0b4cca01..96e6c900 100644 --- a/src/iris_grib/tests/unit/load_convert/test_grid_definition_template_40.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_grid_definition_template_40.py @@ -4,7 +4,7 @@ # See LICENSE in the root of the repository for full licensing details. """ Unit tests for -:func:`iris_grib._load_convert.grid_definition_template_40`. +:func:`iris_grib._grib2_convert.grid_definition_template_40`. """ @@ -17,10 +17,10 @@ import iris.coord_systems import iris.coords -from iris_grib.tests.unit.load_convert import empty_metadata -from iris_grib._load_convert import _MDI as MDI +from iris_grib.tests.unit.grib2_convert import empty_metadata +from iris_grib._grib2_convert import _MDI as MDI -from iris_grib._load_convert import grid_definition_template_40 +from iris_grib._grib2_convert import grid_definition_template_40 class _Section(dict): diff --git a/src/iris_grib/tests/unit/load_convert/test_grid_definition_template_4_and_5.py b/src/iris_grib/tests/unit/grib2_convert/test_grid_definition_template_4_and_5.py similarity index 94% rename from src/iris_grib/tests/unit/load_convert/test_grid_definition_template_4_and_5.py rename to src/iris_grib/tests/unit/grib2_convert/test_grid_definition_template_4_and_5.py index 5a6b0ace..fdc472ea 100644 --- a/src/iris_grib/tests/unit/load_convert/test_grid_definition_template_4_and_5.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_grid_definition_template_4_and_5.py @@ -4,7 +4,7 @@ # See LICENSE in the root of the repository for full licensing details. """ Test function -:func:`iris_grib._load_convert.grid_definition_template_4_and_5`. +:func:`iris_grib._grib2_convert.grid_definition_template_4_and_5`. """ @@ -19,7 +19,7 @@ from iris.coords import DimCoord import numpy as np -from iris_grib._load_convert import grid_definition_template_4_and_5, _MDI as MDI +from iris_grib._grib2_convert import grid_definition_template_4_and_5, _MDI as MDI RESOLUTION = 1e6 @@ -28,7 +28,7 @@ class Test(tests.IrisGribTest): def setUp(self): self.patch("warnings.warn") - self.patch("iris_grib._load_convert._is_circular", return_value=False) + self.patch("iris_grib._grib2_convert._is_circular", return_value=False) self.metadata = { "factories": [], "references": [], @@ -44,7 +44,7 @@ def setUp(self): self.data = np.arange(10, dtype=np.float64) def _check(self, section, request_warning, expect_warning=False, y_dim=0, x_dim=1): - this = "iris_grib._load_convert.options" + this = "iris_grib._grib2_convert.options" with mock.patch(this, warn_on_unsupported=request_warning): metadata = deepcopy(self.metadata) # The called being tested. diff --git a/src/iris_grib/tests/unit/load_convert/test_grid_definition_template_5.py b/src/iris_grib/tests/unit/grib2_convert/test_grid_definition_template_5.py similarity index 93% rename from src/iris_grib/tests/unit/load_convert/test_grid_definition_template_5.py rename to src/iris_grib/tests/unit/grib2_convert/test_grid_definition_template_5.py index 9e31f0f4..c32b1a9e 100644 --- a/src/iris_grib/tests/unit/load_convert/test_grid_definition_template_5.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_grid_definition_template_5.py @@ -4,7 +4,7 @@ # See LICENSE in the root of the repository for full licensing details. """ Test function -:func:`iris_grib._load_convert.grid_definition_template_5`. +:func:`iris_grib._grib2_convert.grid_definition_template_5`. """ @@ -15,7 +15,7 @@ from copy import deepcopy from unittest import mock -from iris_grib._load_convert import grid_definition_template_5 +from iris_grib._grib2_convert import grid_definition_template_5 class Test(tests.IrisGribTest): @@ -23,7 +23,7 @@ def setUp(self): def func(s, m, y, x, c): return m["dim_coords_and_dims"].append(item) - module = "iris_grib._load_convert" + module = "iris_grib._grib2_convert" self.major = mock.sentinel.major self.minor = mock.sentinel.minor @@ -75,7 +75,7 @@ def test(self): # Note: import certain functions *dynamically*, so that we pickup the patched # versions established by the setUp fixture. - from iris_grib._load_convert import ( # noqa: PLC0415 + from iris_grib._grib2_convert import ( # noqa: PLC0415 ellipsoid_geometry, ellipsoid, grid_definition_template_4_and_5 as gdt_4_5, diff --git a/src/iris_grib/tests/unit/load_convert/test_grid_definition_template_90.py b/src/iris_grib/tests/unit/grib2_convert/test_grid_definition_template_90.py similarity index 97% rename from src/iris_grib/tests/unit/load_convert/test_grid_definition_template_90.py rename to src/iris_grib/tests/unit/grib2_convert/test_grid_definition_template_90.py index 7f6ece4f..eb0a4780 100644 --- a/src/iris_grib/tests/unit/load_convert/test_grid_definition_template_90.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_grid_definition_template_90.py @@ -4,7 +4,7 @@ # See LICENSE in the root of the repository for full licensing details. """ Unit tests for -:func:`iris_grib._load_convert.grid_definition_template_90`. +:func:`iris_grib._grib2_convert.grid_definition_template_90`. """ @@ -18,10 +18,10 @@ import iris.coords import iris.exceptions -from iris_grib.tests.unit.load_convert import empty_metadata -from iris_grib._load_convert import _MDI as MDI +from iris_grib.tests.unit.grib2_convert import empty_metadata +from iris_grib._grib2_convert import _MDI as MDI -from iris_grib._load_convert import grid_definition_template_90 +from iris_grib._grib2_convert import grid_definition_template_90 class Test(tests.IrisGribTest): diff --git a/src/iris_grib/tests/unit/load_convert/test_other_time_coord.py b/src/iris_grib/tests/unit/grib2_convert/test_other_time_coord.py similarity index 97% rename from src/iris_grib/tests/unit/load_convert/test_other_time_coord.py rename to src/iris_grib/tests/unit/grib2_convert/test_other_time_coord.py index 18226c81..519d088e 100644 --- a/src/iris_grib/tests/unit/load_convert/test_other_time_coord.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_other_time_coord.py @@ -3,7 +3,7 @@ # This file is part of iris-grib and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """ -Test function :func:`iris_grib._load_convert.other_time_coord. +Test function :func:`iris_grib._grib2_convert.other_time_coord. """ @@ -13,7 +13,7 @@ import iris.coords -from iris_grib._load_convert import other_time_coord +from iris_grib._grib2_convert import other_time_coord class TestValid(tests.IrisGribTest): diff --git a/src/iris_grib/tests/unit/load_convert/test_product_definition_section.py b/src/iris_grib/tests/unit/grib2_convert/test_product_definition_section.py similarity index 91% rename from src/iris_grib/tests/unit/load_convert/test_product_definition_section.py rename to src/iris_grib/tests/unit/grib2_convert/test_product_definition_section.py index 32903493..cca60501 100644 --- a/src/iris_grib/tests/unit/load_convert/test_product_definition_section.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_product_definition_section.py @@ -3,7 +3,7 @@ # This file is part of iris-grib and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """ -Tests for `iris_grib._load_convert.product_definition_section`. +Tests for `iris_grib._grib2_convert.product_definition_section`. """ @@ -16,12 +16,12 @@ from iris.coords import DimCoord -from iris_grib._load_convert import product_definition_section -from iris_grib.tests.unit.load_convert import empty_metadata -from iris_grib.tests.unit.load_convert.test_product_definition_template_0 import ( +from iris_grib._grib2_convert import product_definition_section +from iris_grib.tests.unit.grib2_convert import empty_metadata +from iris_grib.tests.unit.grib2_convert.test_product_definition_template_0 import ( section_4 as pdt_0_section_4, ) -from iris_grib.tests.unit.load_convert.test_product_definition_template_31 import ( +from iris_grib.tests.unit.grib2_convert.test_product_definition_template_31 import ( section_4 as pdt_31_section_4, ) @@ -35,7 +35,7 @@ class TestFixedSurfaces(tests.IrisGribTest): def setUp(self): self.patch("warnings.warn") self.translate_phenomenon_patch = self.patch( - "iris_grib._load_convert.translate_phenomenon" + "iris_grib._grib2_convert.translate_phenomenon" ) # Prep placeholder variables for product_definition_section. diff --git a/src/iris_grib/tests/unit/load_convert/test_product_definition_template_0.py b/src/iris_grib/tests/unit/grib2_convert/test_product_definition_template_0.py similarity index 90% rename from src/iris_grib/tests/unit/load_convert/test_product_definition_template_0.py rename to src/iris_grib/tests/unit/grib2_convert/test_product_definition_template_0.py index a53bd015..e945a4b0 100644 --- a/src/iris_grib/tests/unit/load_convert/test_product_definition_template_0.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_product_definition_template_0.py @@ -4,7 +4,7 @@ # See LICENSE in the root of the repository for full licensing details. """ Test function -:func:`iris_grib._load_convert.product_definition_template_0`. +:func:`iris_grib._grib2_convert.product_definition_template_0`. """ @@ -18,11 +18,11 @@ import iris.coords import iris_grib -from iris_grib.tests.unit.load_convert import empty_metadata -from iris_grib.tests.unit.load_convert import LoadConvertTest -from iris_grib._load_convert import _MDI as MDI +from iris_grib.tests.unit.grib2_convert import empty_metadata +from iris_grib.tests.unit.grib2_convert import LoadConvertTest +from iris_grib._grib2_convert import _MDI as MDI -from iris_grib._load_convert import product_definition_template_0 +from iris_grib._grib2_convert import product_definition_template_0 def section_4(): @@ -78,7 +78,7 @@ def test_generating_process_warnings(self): rt_coord = iris.coords.DimCoord( 24, "forecast_reference_time", units="hours since epoch" ) - convert_options = iris_grib._load_convert.options + convert_options = iris_grib._grib2_convert.options emit_warnings = convert_options.warn_on_unsupported try: convert_options.warn_on_unsupported = True diff --git a/src/iris_grib/tests/unit/load_convert/test_product_definition_template_1.py b/src/iris_grib/tests/unit/grib2_convert/test_product_definition_template_1.py similarity index 92% rename from src/iris_grib/tests/unit/load_convert/test_product_definition_template_1.py rename to src/iris_grib/tests/unit/grib2_convert/test_product_definition_template_1.py index 47bde0ee..eaf6f1a3 100644 --- a/src/iris_grib/tests/unit/load_convert/test_product_definition_template_1.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_product_definition_template_1.py @@ -4,7 +4,7 @@ # See LICENSE in the root of the repository for full licensing details. """ Test function -:func:`iris_grib._load_convert.product_definition_template_1`. +:func:`iris_grib._grib2_convert.product_definition_template_1`. """ @@ -18,7 +18,7 @@ from iris.coords import DimCoord -from iris_grib._load_convert import product_definition_template_1 +from iris_grib._grib2_convert import product_definition_template_1 class Test(tests.IrisGribTest): @@ -26,7 +26,7 @@ def setUp(self): def func(s, m, f): return m["cell_methods"].append(self.cell_method) - module = "iris_grib._load_convert" + module = "iris_grib._grib2_convert" self.patch("warnings.warn") this = "{}.product_definition_template_0".format(module) self.cell_method = mock.sentinel.cell_method @@ -44,7 +44,7 @@ def func(s, m, f): } def _check(self, request_warning): - this = "iris_grib._load_convert.options" + this = "iris_grib._grib2_convert.options" with mock.patch(this, warn_on_unsupported=request_warning): metadata = deepcopy(self.metadata) perturbationNumber = 666 diff --git a/src/iris_grib/tests/unit/load_convert/test_product_definition_template_10.py b/src/iris_grib/tests/unit/grib2_convert/test_product_definition_template_10.py similarity index 89% rename from src/iris_grib/tests/unit/load_convert/test_product_definition_template_10.py rename to src/iris_grib/tests/unit/grib2_convert/test_product_definition_template_10.py index b725a156..4da9e4b5 100644 --- a/src/iris_grib/tests/unit/load_convert/test_product_definition_template_10.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_product_definition_template_10.py @@ -3,7 +3,7 @@ # This file is part of iris-grib and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """ -Test function :func:`iris_grib._load_convert.product_definition_template_10`. +Test function :func:`iris_grib._grib2_convert.product_definition_template_10`. """ @@ -14,13 +14,13 @@ from unittest import mock from iris.coords import DimCoord -from iris_grib._load_convert import product_definition_template_10 -from iris_grib.tests.unit.load_convert import empty_metadata +from iris_grib._grib2_convert import product_definition_template_10 +from iris_grib.tests.unit.grib2_convert import empty_metadata class Test(tests.IrisGribTest): def setUp(self): - module = "iris_grib._load_convert" + module = "iris_grib._grib2_convert" self.patch_statistical_fp_coord = self.patch( module + ".statistical_forecast_period_coord", return_value=mock.sentinel.dummy_fp_coord, diff --git a/src/iris_grib/tests/unit/load_convert/test_product_definition_template_11.py b/src/iris_grib/tests/unit/grib2_convert/test_product_definition_template_11.py similarity index 93% rename from src/iris_grib/tests/unit/load_convert/test_product_definition_template_11.py rename to src/iris_grib/tests/unit/grib2_convert/test_product_definition_template_11.py index 891ba447..41f04e99 100644 --- a/src/iris_grib/tests/unit/load_convert/test_product_definition_template_11.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_product_definition_template_11.py @@ -3,7 +3,7 @@ # This file is part of iris-grib and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """ -Test function :func:`iris_grib._load_convert.product_definition_template_11`. +Test function :func:`iris_grib._grib2_convert.product_definition_template_11`. """ @@ -17,7 +17,7 @@ from iris.coords import DimCoord, CellMethod -from iris_grib._load_convert import product_definition_template_11 +from iris_grib._grib2_convert import product_definition_template_11 class Test(tests.IrisGribTest): @@ -25,7 +25,7 @@ def setUp(self): def func(s, m, f): return m["cell_methods"].append(self.cell_method) - module = "iris_grib._load_convert" + module = "iris_grib._grib2_convert" self.patch("warnings.warn") this_module = "{}.product_definition_template_11".format(module) self.cell_method = mock.sentinel.cell_method @@ -51,7 +51,7 @@ def func(s, m, f): } def _check(self, request_warning): - grib_lconv_opt = "iris_grib._load_convert.options" + grib_lconv_opt = "iris_grib._grib2_convert.options" with mock.patch(grib_lconv_opt, warn_on_unsupported=request_warning): metadata = deepcopy(self.metadata) perturbationNumber = 666 diff --git a/src/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py b/src/iris_grib/tests/unit/grib2_convert/test_product_definition_template_15.py similarity index 91% rename from src/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py rename to src/iris_grib/tests/unit/grib2_convert/test_product_definition_template_15.py index 970cb37b..634109f9 100644 --- a/src/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_product_definition_template_15.py @@ -4,7 +4,7 @@ # See LICENSE in the root of the repository for full licensing details. """ Test function -:func:`iris_grib._load_convert.product_definition_template_15`. +:func:`iris_grib._grib2_convert.product_definition_template_15`. This basically copies code from 'test_product_definition_template_0', and adds testing for the statistical method and spatial-processing type. @@ -19,11 +19,11 @@ from iris.exceptions import TranslationError from iris.coords import CellMethod, DimCoord -from iris_grib.tests.unit.load_convert import empty_metadata -from iris_grib.tests.unit.load_convert import LoadConvertTest -from iris_grib._load_convert import _MDI as MDI +from iris_grib.tests.unit.grib2_convert import empty_metadata +from iris_grib.tests.unit.grib2_convert import LoadConvertTest +from iris_grib._grib2_convert import _MDI as MDI -from iris_grib._load_convert import product_definition_template_15 +from iris_grib._grib2_convert import product_definition_template_15 def section_4_sample(): diff --git a/src/iris_grib/tests/unit/load_convert/test_product_definition_template_31.py b/src/iris_grib/tests/unit/grib2_convert/test_product_definition_template_31.py similarity index 84% rename from src/iris_grib/tests/unit/load_convert/test_product_definition_template_31.py rename to src/iris_grib/tests/unit/grib2_convert/test_product_definition_template_31.py index 182a0178..1b6873ed 100644 --- a/src/iris_grib/tests/unit/load_convert/test_product_definition_template_31.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_product_definition_template_31.py @@ -3,7 +3,7 @@ # This file is part of iris-grib and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """ -Tests for `iris_grib._load_convert.product_definition_template_31`. +Tests for `iris_grib._grib2_convert.product_definition_template_31`. """ @@ -13,9 +13,9 @@ from unittest import mock -from iris_grib.tests.unit.load_convert import empty_metadata +from iris_grib.tests.unit.grib2_convert import empty_metadata -from iris_grib._load_convert import product_definition_template_31 +from iris_grib._grib2_convert import product_definition_template_31 def section_4(): @@ -37,10 +37,10 @@ class Test(tests.IrisGribTest): def setUp(self): self.patch("warnings.warn") self.satellite_common_patch = self.patch( - "iris_grib._load_convert.satellite_common" + "iris_grib._grib2_convert.satellite_common" ) self.generating_process_patch = self.patch( - "iris_grib._load_convert.generating_process" + "iris_grib._grib2_convert.generating_process" ) def test(self): diff --git a/src/iris_grib/tests/unit/load_convert/test_product_definition_template_32.py b/src/iris_grib/tests/unit/grib2_convert/test_product_definition_template_32.py similarity index 79% rename from src/iris_grib/tests/unit/load_convert/test_product_definition_template_32.py rename to src/iris_grib/tests/unit/grib2_convert/test_product_definition_template_32.py index 5ba86b8f..eea51943 100644 --- a/src/iris_grib/tests/unit/load_convert/test_product_definition_template_32.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_product_definition_template_32.py @@ -3,7 +3,7 @@ # This file is part of iris-grib and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """ -Tests for `iris_grib._load_convert.product_definition_template_32`. +Tests for `iris_grib._grib2_convert.product_definition_template_32`. """ @@ -13,21 +13,21 @@ from unittest import mock -from iris_grib.tests.unit.load_convert import empty_metadata -from iris_grib._load_convert import product_definition_template_32 +from iris_grib.tests.unit.grib2_convert import empty_metadata +from iris_grib._grib2_convert import product_definition_template_32 class Test(tests.IrisGribTest): def setUp(self): self.patch("warnings.warn") self.generating_process_patch = self.patch( - "iris_grib._load_convert.generating_process" + "iris_grib._grib2_convert.generating_process" ) self.satellite_common_patch = self.patch( - "iris_grib._load_convert.satellite_common" + "iris_grib._grib2_convert.satellite_common" ) - self.time_coords_patch = self.patch("iris_grib._load_convert.time_coords") - self.data_cutoff_patch = self.patch("iris_grib._load_convert.data_cutoff") + self.time_coords_patch = self.patch("iris_grib._grib2_convert.time_coords") + self.data_cutoff_patch = self.patch("iris_grib._grib2_convert.data_cutoff") def test(self): # Prepare the arguments. diff --git a/src/iris_grib/tests/unit/load_convert/test_product_definition_template_40.py b/src/iris_grib/tests/unit/grib2_convert/test_product_definition_template_40.py similarity index 86% rename from src/iris_grib/tests/unit/load_convert/test_product_definition_template_40.py rename to src/iris_grib/tests/unit/grib2_convert/test_product_definition_template_40.py index 9a7cc456..07b99ea2 100644 --- a/src/iris_grib/tests/unit/load_convert/test_product_definition_template_40.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_product_definition_template_40.py @@ -3,7 +3,7 @@ # This file is part of iris-grib and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """ -Test function :func:`iris_grib._load_convert.product_definition_template_40`. +Test function :func:`iris_grib._grib2_convert.product_definition_template_40`. """ @@ -13,8 +13,8 @@ import iris.coords -from iris_grib._load_convert import product_definition_template_40, _MDI -from iris_grib.tests.unit.load_convert import empty_metadata +from iris_grib._grib2_convert import product_definition_template_40, _MDI +from iris_grib.tests.unit.grib2_convert import empty_metadata class Test(tests.IrisGribTest): diff --git a/src/iris_grib/tests/unit/load_convert/test_product_definition_template_5.py b/src/iris_grib/tests/unit/grib2_convert/test_product_definition_template_5.py similarity index 95% rename from src/iris_grib/tests/unit/load_convert/test_product_definition_template_5.py rename to src/iris_grib/tests/unit/grib2_convert/test_product_definition_template_5.py index 1ed4faac..b3557275 100644 --- a/src/iris_grib/tests/unit/load_convert/test_product_definition_template_5.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_product_definition_template_5.py @@ -4,7 +4,7 @@ # See LICENSE in the root of the repository for full licensing details. """ Tests for function -:func:`iris_grib._load_convert.product_definition_template_5`. +:func:`iris_grib._grib2_convert.product_definition_template_5`. """ @@ -17,15 +17,15 @@ from iris.exceptions import TranslationError from iris.coords import DimCoord -from iris_grib._load_convert import product_definition_template_5 -from iris_grib._load_convert import Probability, _MDI +from iris_grib._grib2_convert import product_definition_template_5 +from iris_grib._grib2_convert import Probability, _MDI from .test_product_definition_template_0 import section_4 class Test(tests.IrisGribTest): def setUp(self): # Create patches for called routines - module = "iris_grib._load_convert" + module = "iris_grib._grib2_convert" self.patch_pdt0_call = self.patch(module + ".product_definition_template_0") # Construct dummy call arguments self.section = section_4() diff --git a/src/iris_grib/tests/unit/load_convert/test_product_definition_template_6.py b/src/iris_grib/tests/unit/grib2_convert/test_product_definition_template_6.py similarity index 89% rename from src/iris_grib/tests/unit/load_convert/test_product_definition_template_6.py rename to src/iris_grib/tests/unit/grib2_convert/test_product_definition_template_6.py index 3c45fabc..4d011ece 100644 --- a/src/iris_grib/tests/unit/load_convert/test_product_definition_template_6.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_product_definition_template_6.py @@ -4,7 +4,7 @@ # See LICENSE in the root of the repository for full licensing details. """ Test function -:func:`iris_grib._load_convert.product_definition_template_6`. +:func:`iris_grib._grib2_convert.product_definition_template_6`. """ @@ -17,7 +17,7 @@ from iris.coords import DimCoord -from iris_grib._load_convert import product_definition_template_6 +from iris_grib._grib2_convert import product_definition_template_6 class Test(tests.IrisGribTest): @@ -25,7 +25,7 @@ def setUp(self): def func(s, m, f): return m["cell_methods"].append(self.cell_method) - module = "iris_grib._load_convert" + module = "iris_grib._grib2_convert" self.patch("warnings.warn") this = "{}.product_definition_template_0".format(module) self.cell_method = mock.sentinel.cell_method @@ -43,7 +43,7 @@ def func(s, m, f): } def _check(self, request_warning): - this = "iris_grib._load_convert.options" + this = "iris_grib._grib2_convert.options" with mock.patch(this, warn_on_unsupported=request_warning): metadata = deepcopy(self.metadata) percentile = 50 diff --git a/src/iris_grib/tests/unit/load_convert/test_product_definition_template_8.py b/src/iris_grib/tests/unit/grib2_convert/test_product_definition_template_8.py similarity index 93% rename from src/iris_grib/tests/unit/load_convert/test_product_definition_template_8.py rename to src/iris_grib/tests/unit/grib2_convert/test_product_definition_template_8.py index f8dab4ed..39c9e242 100644 --- a/src/iris_grib/tests/unit/load_convert/test_product_definition_template_8.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_product_definition_template_8.py @@ -4,7 +4,7 @@ # See LICENSE in the root of the repository for full licensing details. """ Tests for function -:func:`iris_grib._load_convert.product_definition_template_8`. +:func:`iris_grib._grib2_convert.product_definition_template_8`. """ @@ -14,12 +14,12 @@ from unittest import mock -from iris_grib._load_convert import product_definition_template_8 +from iris_grib._grib2_convert import product_definition_template_8 class Test(tests.IrisGribTest): def setUp(self): - module = "iris_grib._load_convert" + module = "iris_grib._grib2_convert" self.module = module # Create patches for called routines self.patch_generating_process = self.patch(module + ".generating_process") diff --git a/src/iris_grib/tests/unit/load_convert/test_product_definition_template_9.py b/src/iris_grib/tests/unit/grib2_convert/test_product_definition_template_9.py similarity index 93% rename from src/iris_grib/tests/unit/load_convert/test_product_definition_template_9.py rename to src/iris_grib/tests/unit/grib2_convert/test_product_definition_template_9.py index 8bb47901..ae2a1ca0 100644 --- a/src/iris_grib/tests/unit/load_convert/test_product_definition_template_9.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_product_definition_template_9.py @@ -4,7 +4,7 @@ # See LICENSE in the root of the repository for full licensing details. """ Tests for function -:func:`iris_grib._load_convert.product_definition_template_9`. +:func:`iris_grib._grib2_convert.product_definition_template_9`. """ @@ -16,14 +16,14 @@ from iris.exceptions import TranslationError -from iris_grib._load_convert import product_definition_template_9 -from iris_grib._load_convert import Probability, _MDI +from iris_grib._grib2_convert import product_definition_template_9 +from iris_grib._grib2_convert import Probability, _MDI class Test(tests.IrisGribTest): def setUp(self): # Create patches for called routines - module = "iris_grib._load_convert" + module = "iris_grib._grib2_convert" self.patch_pdt8_call = self.patch(module + ".product_definition_template_8") # Construct dummy call arguments self.section = {} diff --git a/src/iris_grib/tests/unit/load_convert/test_projection_centre.py b/src/iris_grib/tests/unit/grib2_convert/test_projection_centre.py similarity index 87% rename from src/iris_grib/tests/unit/load_convert/test_projection_centre.py rename to src/iris_grib/tests/unit/grib2_convert/test_projection_centre.py index 5bbfa625..58e3a2dd 100644 --- a/src/iris_grib/tests/unit/load_convert/test_projection_centre.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_projection_centre.py @@ -3,7 +3,7 @@ # This file is part of iris-grib and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """ -Test function :func:`iris_grib._load_convert.projection centre. +Test function :func:`iris_grib._grib2_convert.projection centre. """ @@ -11,7 +11,7 @@ # before importing anything else. import iris_grib.tests as tests -from iris_grib._load_convert import projection_centre, ProjectionCentre +from iris_grib._grib2_convert import projection_centre, ProjectionCentre class Test(tests.IrisGribTest): diff --git a/src/iris_grib/tests/unit/load_convert/test_reference_time_coord.py b/src/iris_grib/tests/unit/grib2_convert/test_reference_time_coord.py similarity index 94% rename from src/iris_grib/tests/unit/load_convert/test_reference_time_coord.py rename to src/iris_grib/tests/unit/grib2_convert/test_reference_time_coord.py index f3d2b5f9..5a9efbde 100644 --- a/src/iris_grib/tests/unit/load_convert/test_reference_time_coord.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_reference_time_coord.py @@ -3,7 +3,7 @@ # This file is part of iris-grib and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """ -Test function :func:`iris_grib._load_convert.reference_time_coord. +Test function :func:`iris_grib._grib2_convert.reference_time_coord. Reference Code Table 1.2. @@ -21,7 +21,7 @@ from iris.coords import DimCoord from iris.exceptions import TranslationError -from iris_grib._load_convert import reference_time_coord +from iris_grib._grib2_convert import reference_time_coord class Test(tests.IrisGribTest): diff --git a/src/iris_grib/tests/unit/load_convert/test_resolution_flags.py b/src/iris_grib/tests/unit/grib2_convert/test_resolution_flags.py similarity index 88% rename from src/iris_grib/tests/unit/load_convert/test_resolution_flags.py rename to src/iris_grib/tests/unit/grib2_convert/test_resolution_flags.py index dc26fa9e..9c738b8e 100644 --- a/src/iris_grib/tests/unit/load_convert/test_resolution_flags.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_resolution_flags.py @@ -3,7 +3,7 @@ # This file is part of iris-grib and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """ -Test function :func:`iris_grib._load_convert.resolution_flags.` +Test function :func:`iris_grib._grib2_convert.resolution_flags.` """ @@ -11,7 +11,7 @@ # before importing anything else. import iris_grib.tests as tests -from iris_grib._load_convert import resolution_flags, ResolutionFlags +from iris_grib._grib2_convert import resolution_flags, ResolutionFlags class Test(tests.IrisGribTest): diff --git a/src/iris_grib/tests/unit/load_convert/test_satellite_common.py b/src/iris_grib/tests/unit/grib2_convert/test_satellite_common.py similarity index 92% rename from src/iris_grib/tests/unit/load_convert/test_satellite_common.py rename to src/iris_grib/tests/unit/grib2_convert/test_satellite_common.py index fb0ab654..c5309441 100644 --- a/src/iris_grib/tests/unit/load_convert/test_satellite_common.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_satellite_common.py @@ -3,7 +3,7 @@ # This file is part of iris-grib and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """ -Tests for `iris_grib._load_convert.satellite_common`. +Tests for `iris_grib._grib2_convert.satellite_common`. """ @@ -16,9 +16,9 @@ from iris.coords import AuxCoord import numpy as np -from iris_grib.tests.unit.load_convert import empty_metadata +from iris_grib.tests.unit.grib2_convert import empty_metadata -from iris_grib._load_convert import satellite_common +from iris_grib._grib2_convert import satellite_common class Test(tests.IrisGribTest): diff --git a/src/iris_grib/tests/unit/load_convert/test_scanning_mode.py b/src/iris_grib/tests/unit/grib2_convert/test_scanning_mode.py similarity index 91% rename from src/iris_grib/tests/unit/load_convert/test_scanning_mode.py rename to src/iris_grib/tests/unit/grib2_convert/test_scanning_mode.py index 00d8332a..1c6089d5 100644 --- a/src/iris_grib/tests/unit/load_convert/test_scanning_mode.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_scanning_mode.py @@ -3,7 +3,7 @@ # This file is part of iris-grib and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """ -Test function :func:`iris_grib._load_convert.scanning_mode. +Test function :func:`iris_grib._grib2_convert.scanning_mode. """ @@ -13,7 +13,7 @@ from iris.exceptions import TranslationError -from iris_grib._load_convert import scanning_mode, ScanningMode +from iris_grib._grib2_convert import scanning_mode, ScanningMode class Test(tests.IrisGribTest): diff --git a/src/iris_grib/tests/unit/load_convert/test_statistical_cell_method.py b/src/iris_grib/tests/unit/grib2_convert/test_statistical_cell_method.py similarity index 97% rename from src/iris_grib/tests/unit/load_convert/test_statistical_cell_method.py rename to src/iris_grib/tests/unit/grib2_convert/test_statistical_cell_method.py index ef2ba3be..cedd173e 100644 --- a/src/iris_grib/tests/unit/load_convert/test_statistical_cell_method.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_statistical_cell_method.py @@ -4,7 +4,7 @@ # See LICENSE in the root of the repository for full licensing details. """ Tests for function -:func:`iris_grib._load_convert.statistical_cell_method`. +:func:`iris_grib._grib2_convert.statistical_cell_method`. """ @@ -15,7 +15,7 @@ from iris.coords import CellMethod from iris.exceptions import TranslationError -from iris_grib._load_convert import statistical_cell_method +from iris_grib._grib2_convert import statistical_cell_method class Test(tests.IrisGribTest): diff --git a/src/iris_grib/tests/unit/load_convert/test_statistical_forecast_period_coord.py b/src/iris_grib/tests/unit/grib2_convert/test_statistical_forecast_period_coord.py similarity index 92% rename from src/iris_grib/tests/unit/load_convert/test_statistical_forecast_period_coord.py rename to src/iris_grib/tests/unit/grib2_convert/test_statistical_forecast_period_coord.py index 21fae48c..1438d661 100644 --- a/src/iris_grib/tests/unit/load_convert/test_statistical_forecast_period_coord.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_statistical_forecast_period_coord.py @@ -3,7 +3,7 @@ # This file is part of iris-grib and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """ -Tests for function :func:`iris_grib._load_convert.statistical_forecast_period`. +Tests for function :func:`iris_grib._grib2_convert.statistical_forecast_period`. """ @@ -14,12 +14,12 @@ import datetime from unittest import mock -from iris_grib._load_convert import statistical_forecast_period_coord +from iris_grib._grib2_convert import statistical_forecast_period_coord class Test(tests.IrisGribTest): def setUp(self): - module = "iris_grib._load_convert" + module = "iris_grib._grib2_convert" self.module = module self.patch_hindcast = self.patch(module + "._hindcast_fix") self.forecast_seconds = 0.0 diff --git a/src/iris_grib/tests/unit/load_convert/test_time_range_unit.py b/src/iris_grib/tests/unit/grib2_convert/test_time_range_unit.py similarity index 90% rename from src/iris_grib/tests/unit/load_convert/test_time_range_unit.py rename to src/iris_grib/tests/unit/grib2_convert/test_time_range_unit.py index e8b9f73e..1ed0fac6 100644 --- a/src/iris_grib/tests/unit/load_convert/test_time_range_unit.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_time_range_unit.py @@ -3,7 +3,7 @@ # This file is part of iris-grib and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """ -Test function :func:`iris_grib._load_convert.time_range_unit. +Test function :func:`iris_grib._grib2_convert.time_range_unit. """ @@ -14,7 +14,7 @@ from cf_units import Unit from iris.exceptions import TranslationError -from iris_grib._load_convert import time_range_unit +from iris_grib._grib2_convert import time_range_unit class Test(tests.IrisGribTest): diff --git a/src/iris_grib/tests/unit/load_convert/test_translate_phenomenon.py b/src/iris_grib/tests/unit/grib2_convert/test_translate_phenomenon.py similarity index 92% rename from src/iris_grib/tests/unit/load_convert/test_translate_phenomenon.py rename to src/iris_grib/tests/unit/grib2_convert/test_translate_phenomenon.py index b19a03db..a4104834 100644 --- a/src/iris_grib/tests/unit/load_convert/test_translate_phenomenon.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_translate_phenomenon.py @@ -3,7 +3,7 @@ # This file is part of iris-grib and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """ -Tests for function :func:`iris_grib._load_convert.translate_phenomenon`. +Tests for function :func:`iris_grib._grib2_convert.translate_phenomenon`. """ @@ -14,14 +14,14 @@ from cf_units import Unit from iris.coords import DimCoord -from iris_grib._load_convert import Probability, translate_phenomenon +from iris_grib._grib2_convert import Probability, translate_phenomenon from iris_grib.grib_phenom_translation import Grib1CfData, GRIBCode class Test_probability(tests.IrisGribTest): def setUp(self): # Patch inner call to return a given phenomenon type. - target_module = "iris_grib._load_convert" + target_module = "iris_grib._grib2_convert" self.phenom_lookup_patch = self.patch( target_module + ".itranslation.grib2_phenom_to_cf_info", return_value=Grib1CfData("air_temperature", "", "K", None), diff --git a/src/iris_grib/tests/unit/load_convert/test_unscale.py b/src/iris_grib/tests/unit/grib2_convert/test_unscale.py similarity index 93% rename from src/iris_grib/tests/unit/load_convert/test_unscale.py rename to src/iris_grib/tests/unit/grib2_convert/test_unscale.py index 0005b13a..90211a86 100644 --- a/src/iris_grib/tests/unit/load_convert/test_unscale.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_unscale.py @@ -3,7 +3,7 @@ # This file is part of iris-grib and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """ -Test function :func:`iris_grib._load_convert.unscale. +Test function :func:`iris_grib._grib2_convert.unscale. """ @@ -14,7 +14,7 @@ import numpy as np import numpy.ma as ma -from iris_grib._load_convert import unscale, _MDI as MDI +from iris_grib._grib2_convert import unscale, _MDI as MDI # Reference GRIB2 Regulation 92.1.12. diff --git a/src/iris_grib/tests/unit/load_convert/test_validity_time_coord.py b/src/iris_grib/tests/unit/grib2_convert/test_validity_time_coord.py similarity index 94% rename from src/iris_grib/tests/unit/load_convert/test_validity_time_coord.py rename to src/iris_grib/tests/unit/grib2_convert/test_validity_time_coord.py index 45068226..deb805e1 100644 --- a/src/iris_grib/tests/unit/load_convert/test_validity_time_coord.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_validity_time_coord.py @@ -3,7 +3,7 @@ # This file is part of iris-grib and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """ -Test function :func:`iris_grib._load_convert.validity_time_coord. +Test function :func:`iris_grib._grib2_convert.validity_time_coord. """ @@ -17,7 +17,7 @@ from iris.coords import DimCoord import numpy as np -from iris_grib._load_convert import validity_time_coord +from iris_grib._grib2_convert import validity_time_coord class Test(tests.IrisGribTest): diff --git a/src/iris_grib/tests/unit/load_convert/test_vertical_coords.py b/src/iris_grib/tests/unit/grib2_convert/test_vertical_coords.py similarity index 97% rename from src/iris_grib/tests/unit/load_convert/test_vertical_coords.py rename to src/iris_grib/tests/unit/grib2_convert/test_vertical_coords.py index 5662a324..bfc574ff 100644 --- a/src/iris_grib/tests/unit/load_convert/test_vertical_coords.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_vertical_coords.py @@ -3,7 +3,7 @@ # This file is part of iris-grib and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. """ -Test function :func:`iris_grib._load_convert.vertical_coords`. +Test function :func:`iris_grib._grib2_convert.vertical_coords`. """ @@ -18,8 +18,8 @@ from iris.coords import AuxCoord, DimCoord from iris.exceptions import TranslationError -from iris_grib._load_convert import vertical_coords -from iris_grib._load_convert import ( +from iris_grib._grib2_convert import vertical_coords +from iris_grib._grib2_convert import ( _TYPE_OF_FIXED_SURFACE_MISSING as MISSING_SURFACE, _MDI as MISSING_LEVEL, ) @@ -45,7 +45,7 @@ def func(section, metadata): metadata = deepcopy(self.metadata) section = {"NV": 1} - this = "iris_grib._load_convert.hybrid_factories" + this = "iris_grib._grib2_convert.hybrid_factories" factory = mock.sentinel.factory with mock.patch(this, side_effect=func) as hybrid_factories: vertical_coords(section, metadata) @@ -142,7 +142,7 @@ def test_fixed_upper_surface_type_4_missing_scaled_value(self): self.assertEqual(metadata, expected) def test_unknown_first_fixed_surface_with_missing_scaled_value(self): - this = "iris_grib._load_convert.options" + this = "iris_grib._grib2_convert.options" with mock.patch("warnings.warn") as warn: with mock.patch(this) as options: for request_warning in [False, True]: diff --git a/src/iris_grib/tests/unit/test_Grib1LoadingMode.py b/src/iris_grib/tests/unit/test_Grib1LoadingMode.py new file mode 100644 index 00000000..0433d386 --- /dev/null +++ b/src/iris_grib/tests/unit/test_Grib1LoadingMode.py @@ -0,0 +1,90 @@ +# Copyright iris-grib contributors +# +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +""" +Unit tests for the :class:`iris_grib.Grib1LoadingMode` class. +""" + +import pytest + +from iris_grib import Grib1LoadingMode + + +@pytest.fixture(autouse=True) +def mode_obj(): + test_object = Grib1LoadingMode() + return test_object + + +class TestInit: + def test_default(self): + result = Grib1LoadingMode() + assert result.use_legacy_grib1_loading + + def test_kwarg(self): + result = Grib1LoadingMode(legacy=False) + assert not result.use_legacy_grib1_loading + + def test_arg_fail(self): + msg = "takes 1 positional argument but 2 were given" + with pytest.raises(TypeError, match=msg): + Grib1LoadingMode(1) + + +class TestLegacyProperty: + def test_get_legacy(self, mode_obj): + assert mode_obj.use_legacy_grib1_loading + + def test_set_legacy_fail(self, mode_obj): + msg1 = "'use_legacy_grib1_loading' of 'Grib1LoadingMode' object has no setter" + # NOTE: message was different in Python <= 3.10 + msg2 = "can't set attribute 'use_legacy_grib1_loading'" + try: + mode_obj.use_legacy_grib1_loading = False + except AttributeError as err: + result = str(err) + assert msg1 in result or msg2 in result + + +class TestSet: + def test_set_unset(self, mode_obj): + assert mode_obj.use_legacy_grib1_loading + mode_obj.set(legacy=False) + assert not mode_obj.use_legacy_grib1_loading + mode_obj.set(legacy=True) + assert mode_obj.use_legacy_grib1_loading + + def test_arg_fail(self, mode_obj): + msg = "takes 1 positional argument but 2 were given" + with pytest.raises(TypeError, match=msg): + mode_obj.set(False) + + +class TestContext: + def test_context(self, mode_obj): + assert mode_obj.use_legacy_grib1_loading + with mode_obj.context(legacy=False): + assert not mode_obj.use_legacy_grib1_loading + with mode_obj.context(legacy=True): + assert mode_obj.use_legacy_grib1_loading + + assert not mode_obj.use_legacy_grib1_loading + + assert mode_obj.use_legacy_grib1_loading + + def test_arg_fail(self, mode_obj): + msg = "takes 1 positional argument but 2 were given" + with pytest.raises(TypeError, match=msg): + mode_obj.context(False) + + +class TestStrRepr: + @pytest.mark.parametrize("func", ["str", "repr"]) + def test_strrepr(self, mode_obj, func): + func = {"str": str, "repr": repr}[func] + result = func(mode_obj) + assert result == "GRIB1_LOADING_MODE(legacy=True)" + mode_obj.set(legacy=False) + result2 = func(mode_obj) + assert result2 == "GRIB1_LOADING_MODE(legacy=False)" diff --git a/src/iris_grib/tests/unit/test_GribWrapper.py b/src/iris_grib/tests/unit/test_GribWrapper.py index 2f1484f3..bfba803c 100644 --- a/src/iris_grib/tests/unit/test_GribWrapper.py +++ b/src/iris_grib/tests/unit/test_GribWrapper.py @@ -17,7 +17,8 @@ from iris._lazy_data import is_lazy_data from iris.exceptions import TranslationError -from iris_grib import GribWrapper, _load_generate +from iris_grib._grib1_legacy.grib_wrapper import GribWrapper +from iris_grib import _load_generate _offset = 0 @@ -56,10 +57,14 @@ def _mock_codes_get_message_offset(grib_message): return _offset +_TGT_GRIBWRAPPER_CLASS = "iris_grib._grib1_legacy.grib_wrapper.GribWrapper" +_TGT_GRIBDATAPROXY_CLASS = "iris_grib._grib1_legacy.grib_wrapper.GribDataProxy" + + class Test_edition(tests.IrisGribTest): def setUp(self): - self.patch("iris_grib.GribWrapper._confirm_in_scope") - self.patch("iris_grib.GribWrapper._compute_extra_keys") + self.patch(_TGT_GRIBWRAPPER_CLASS + "._confirm_in_scope") + self.patch(_TGT_GRIBWRAPPER_CLASS + "._compute_extra_keys") self.patch("eccodes.codes_get_long", _mock_codes_get_long) self.patch("eccodes.codes_get_string", _mock_codes_get_string) self.patch("eccodes.codes_get_native_type", _mock_codes_get_native_type) @@ -96,8 +101,8 @@ def test_reduced_data(self): class Test_deferred_proxy_args(tests.IrisTest): def setUp(self): - self.patch("iris_grib.GribWrapper._confirm_in_scope") - self.patch("iris_grib.GribWrapper._compute_extra_keys") + self.patch(_TGT_GRIBWRAPPER_CLASS + "._confirm_in_scope") + self.patch(_TGT_GRIBWRAPPER_CLASS + "._compute_extra_keys") self.patch("eccodes.codes_get_long", _mock_codes_get_long) self.patch("eccodes.codes_get_string", _mock_codes_get_string) self.patch("eccodes.codes_get_native_type", _mock_codes_get_native_type) @@ -112,7 +117,7 @@ def test_regular_proxy_args(self): grib_message = "regular_ll" shape = (self.lookup(grib_message, "Nj"), self.lookup(grib_message, "Ni")) for offset in self.expected: - with mock.patch("iris_grib.GribDataProxy") as mock_gdp: + with mock.patch(_TGT_GRIBDATAPROXY_CLASS) as mock_gdp: _ = GribWrapper(grib_message, self.grib_fh) mock_gdp.assert_called_once_with(shape, self.dtype, self.path, offset) @@ -120,7 +125,7 @@ def test_reduced_proxy_args(self): grib_message = "reduced_gg" shape = self.lookup(grib_message, "numberOfValues") for offset in self.expected: - with mock.patch("iris_grib.GribDataProxy") as mock_gdp: + with mock.patch(_TGT_GRIBDATAPROXY_CLASS) as mock_gdp: _ = GribWrapper(grib_message, self.grib_fh) mock_gdp.assert_called_once_with((shape,), self.dtype, self.path, offset) diff --git a/src/iris_grib/tests/unit/test__load_generate.py b/src/iris_grib/tests/unit/test__load_generate.py index 43a24508..e9eea062 100644 --- a/src/iris_grib/tests/unit/test__load_generate.py +++ b/src/iris_grib/tests/unit/test__load_generate.py @@ -10,7 +10,7 @@ from iris.exceptions import TranslationError -from iris_grib import GribWrapper +from iris_grib._grib1_legacy.grib_wrapper import GribWrapper from iris_grib import _load_generate from iris_grib.message import GribMessage @@ -30,7 +30,7 @@ def test_grib1(self): sections = [{"editionNumber": 1}] message = self._make_test_message(sections) mfunc = "iris_grib.GribMessage.messages_from_filename" - mclass = "iris_grib.GribWrapper" + mclass = "iris_grib._grib1_legacy.grib_wrapper.GribWrapper" with mock.patch(mfunc, return_value=[message]) as mock_func: with mock.patch(mclass, spec=GribWrapper) as mock_wrapper: field = next(_load_generate(self.fname)) From 4b7ea30cb83520acc941b11772a5cb1857e03645 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 18 Dec 2025 09:43:44 +0000 Subject: [PATCH 527/583] Bump the dependencies group with 3 updates (#742) Bumps the dependencies group with 3 updates: [scitools/workflows/.github/workflows/ci-manifest.yml](https://github.com/scitools/workflows), [scitools/workflows/.github/workflows/ci-template-check.yml](https://github.com/scitools/workflows) and [scitools/workflows/.github/workflows/refresh-lockfiles.yml](https://github.com/scitools/workflows). Updates `scitools/workflows/.github/workflows/ci-manifest.yml` from 2025.12.1 to 2025.12.4 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.12.1...2025.12.4) Updates `scitools/workflows/.github/workflows/ci-template-check.yml` from 2025.12.1 to 2025.12.4 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.12.1...2025.12.4) Updates `scitools/workflows/.github/workflows/refresh-lockfiles.yml` from 2025.12.1 to 2025.12.4 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.12.1...2025.12.4) --- updated-dependencies: - dependency-name: scitools/workflows/.github/workflows/ci-manifest.yml dependency-version: 2025.12.4 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: scitools/workflows/.github/workflows/ci-template-check.yml dependency-version: 2025.12.4 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: scitools/workflows/.github/workflows/refresh-lockfiles.yml dependency-version: 2025.12.4 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/ci-template-check.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index dc3640a4..a5974f9c 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.12.1 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.12.4 diff --git a/.github/workflows/ci-template-check.yml b/.github/workflows/ci-template-check.yml index 8d3cdf2e..5de3ae5f 100644 --- a/.github/workflows/ci-template-check.yml +++ b/.github/workflows/ci-template-check.yml @@ -10,7 +10,7 @@ on: jobs: prompt-share: - uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.12.1 + uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.12.4 secrets: inherit with: pr_number: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 11470e4e..c15462c9 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.12.1 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.12.4 secrets: inherit From 63bd2d15617e6f030464b44da77b89a386e9c047 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 29 Dec 2025 09:31:21 +0000 Subject: [PATCH 528/583] Updated environment lockfiles (#743) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 43 +++++++++++----------- requirements/locks/py311-linux-64.lock | 50 +++++++++++++------------- requirements/locks/py312-linux-64.lock | 50 +++++++++++++------------- 3 files changed, 74 insertions(+), 69 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index d9419319..5ddfe012 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -4,7 +4,7 @@ @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.conda#05e00f3b21e88bb3d658ac700b2ce58c -https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h8577fbf_1.conda#e4e8496b68cf5f25e76fbe67f3856550 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-h8577fbf_0.conda#338201218b54cadff2e774ac27733990 https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda#f0991f0f84902f6b6009b4d2350a83aa https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda#26c46f90d0e727e95c6c9498a33a09f3 @@ -26,7 +26,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.c https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda#68f68355000ec3f1d6f26ea13e8f525f -https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-h5347b49_1.conda#41f5c09a211985c3ce642d60721e7c3e +https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda#db409b7c1720428638e7c0d509d3e1b5 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 @@ -37,6 +37,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.c https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb47aa4a_0.conda#607e13a8caac17f9a664bcab5302ce06 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.1-h480dda7_0.conda#4d4efd0645cd556fab54617c4ad477ef +https://conda.anaconda.org/conda-forge/linux-64/icu-78.1-h33c6efd_0.conda#518e9bbbc3e3486d6a4519192ba690f8 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.4-h3f801dc_0.conda#01ba04e414e47f95c03d6ddd81fd37be https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda#366b40a69f0ad6072561c1d09301c886 @@ -46,43 +47,43 @@ https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172b https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_16.conda#40d9b534410403c821ff64f00d0adc22 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.53-h421ea60_0.conda#00d4e66b1f746cb14944cad23fffb405 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.1-h0c1763c_0.conda#2e1b84d273b01835256e53fd938de355 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_16.conda#1b3152694d236cf233b76b8c56bf0eae https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc -https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-hf2a90c1_0.conda#23720d17346b21efb08d68c2255c8431 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 -https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 +https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda#d7d95fc8287ea7bf33e0e7116d2b95ec https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda#98b6c9dc80eb87b2519b97bcf7e578dd https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda#86bc20552bf46075e3d92b67f089172d https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 -https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.2-h54a6638_0.conda#0faadd01896315ceea58bcc3479b1d21 +https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.2-hceb46e0_1.conda#40feea2979654ed579f1cda7c63ccb94 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda#4a13eeac0b5c8e5b8ab496e6c4ddd829 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda#af39b9a8711d4a8d437b52c1d78eb6a1 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda#a6abd2796fc332536735f68ba23f7901 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_105.conda#3ec0aa5037d39b06554109a01e6fb0c6 https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda#8e7251989bca326a28f4a5ffbd74557a https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda#b499ce4b026493a13774bcf0f4c33849 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda#be43915efc66345cccb3c310b6ed0374 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.1-hf4e2dac_1.conda#b1f35e70f047918b49fb4b181e40300e https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#cd5a90476766d53e901500df9215e927 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-h031cc0b_0.conda#a67cd8f7b0369bbf2c40411f05a62f3b +https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-hca6bf5a_1.conda#3fdd8d99683da9fe279c2f4cecd1e048 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.51.1-hbc0de68_0.conda#968f50847d17c74a428fc47a2c70fd6f https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda#8ccf913aaba749a5496c17629d859ed1 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-4_h4a7cf45_openblas.conda#14ff9fdfbd8bd590fca383b995470711 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda#c160954f7418d7b6e87eaf05a8913fa9 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_1.conda#117499f93e892ea1e57fdca16c2e8351 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda#f4084e4e6577797150f9b04a4560ceb0 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-he237659_1.conda#417955234eccd8f252b86a265ccdab7f https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd https://conda.anaconda.org/conda-forge/linux-64/python-3.10.19-h3c07f61_2_cpython.conda#27ac896a8b4970f8977503a9e70dc745 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.51.1-h04a0ce9_1.conda#941ee610ebf7a8047140831091dcb1f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a @@ -90,7 +91,7 @@ https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda#537296d57ea995666c68c821b00e360b https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.2.0-py310h69bd2ac_0.conda#22be0d7b12ae6ff92aa1fd73272c65d7 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py310hba01987_1.conda#393fca4557fbd2c4d995dcb89f569048 -https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.2-pyhd8ed1ab_0.conda#9c265afcec13eb6e844ae51b4a4b52ad +https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.4-pyhd8ed1ab_0.conda#629c8fd0c11eb853732608e2454abf8e https://conda.anaconda.org/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda#96a02a5c1a65470a7e4eedb644c872fd https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c @@ -102,21 +103,21 @@ https://conda.anaconda.org/conda-forge/noarch/colorlog-6.10.1-pyh707e725_0.conda https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda#4c2a8fef270f6c69591889b93f9f55c1 https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc -https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda#66b8b26023b8efdf8fcb23bac4b6325d +https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.1-pyhd8ed1ab_0.conda#81a651287d3000eb12f0860ade0a1b41 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda#4afc585cd97ba8a23809406cd8a9eda8 https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.12.0-pyhd8ed1ab_0.conda#a3b9510e2491c20c7fc0f5e730227fbb https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h1b119a7_104.conda#0857f4d157820dcd5625f61fdfefb780 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e -https://conda.anaconda.org/conda-forge/noarch/humanize-4.14.0-pyhd8ed1ab_0.conda#8b8884a6375830fe0cfb806ccbbd755c +https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda#daddf757c3ecd6067b9af1df1f25d89e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda#53abe63df7e10a6ba605dc5f9f961d36 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda#9614359868482abba1bd15ce465e3c42 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py310haaf941d_2.conda#7426d76535fc6347f1b74f85fb17d6eb -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-4_h0358290_openblas.conda#25f5e5af61cee1ffedd9b4c9947d3af8 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-4_h47877c9_openblas.conda#8ba8431802764597f400ee3e99026367 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda#6636a2b6f1a87572df2970d3ebc87cc0 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda#b38076eb5c8e40d0106beda6f95d7609 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py310h3406613_0.conda#8854df4fb4e37cc3ea0a024e48c9c180 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 @@ -127,7 +128,7 @@ https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda#d7 https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h18fbb6c_2.conda#1aeede769ec2fa0f474f8b73a7ac057f https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.5-pyhcf101f3_0.conda#6c8979be6d7a17692793114fa26916e8 +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.1-pyhcf101f3_0.conda#d837065e4e0de4962c3462079c23f969 https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.3-pyhd8ed1ab_0.conda#c138c7aaa6a10b5762dcd92247864aff https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.6.0-py310hf3bd8b6_1.conda#a49d7089a9d44aa209f970fc0e5abd1c @@ -150,7 +151,7 @@ https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py310he7384ee_1.conda https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.0-py310h3406613_0.conda#87a9020d32817a12115e5ddfce4693ac https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda#8e662bd460bda79b1ea39194e3c4c9ab -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.61.0-py310h3406613_0.conda#4b2ad208fec1e850ba82a0a17534d3d5 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.61.1-py310h3406613_0.conda#24fa891e40acdb1c7f51efd0c5f97084 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda#4b69232755285701bc86a5afe4d9933a https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 @@ -158,7 +159,7 @@ https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda#04558c96691bed63104678757beb4f8d https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.3-nompi_h11f7409_103.conda#3ccff1066c05a1e6c221356eecc40581 -https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 +https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda#eb52d14a901e23c39e9e7b4a1a5c015f https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.6-py310hefbff90_0.conda#b0cea2c364bf65cd19e023040eeab05d https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/noarch/pip-25.3-pyh8b19718_0.conda#c55515ca43c6444d2572e0f0d93cb6b9 @@ -179,7 +180,7 @@ https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0. https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py310hc8bbb35_2.conda#0937b0e88a24c82e02d5b714acc9957c https://conda.anaconda.org/conda-forge/noarch/tox-4.32.0-pyhcf101f3_0.conda#1b49a3b817df5c88742219c4d6e5ee57 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310h03d9f68_6.conda#34778c3f9a6ea19610e7e340dc2caaab -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.1-pyhd8ed1ab_0.conda#fb84f0f6ee8a0ad67213cd1bea98bf5b +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.2-pyhd8ed1ab_0.conda#4949ca7b83065cfe94ebe320aece8c72 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py310h139afa4_1.conda#3741aefc198dfed2e3c9adc79d706bb7 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py310hf779ad0_1.conda#5e4aea6b728177b53e8a216922ebd6a2 https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 @@ -195,10 +196,10 @@ https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.co https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py310h0158d43_1.conda#871b5f746960f99ac23dbc73d14e2ad0 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 -https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.0-pyha770c72_0.conda#af8d4882203bccefec6f1aeed70030c6 +https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda#7f3ac694319c7eaf81a0325d6405e974 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.44.0-py310hf779ad0_1.conda#fd8c4f1cebd49ffbea2d817dc56eb4cd https://conda.anaconda.org/conda-forge/noarch/iris-3.11.1-pyha770c72_1.conda#f501583062225a070455d011d81b07bf -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2025.12.5-pyhd8ed1ab_0.conda#281eb382cddac0cce7da25f98b747ae0 +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2025.12.17-pyhd8ed1ab_0.conda#60d5572f46988af591492c1f137d5204 https://conda.anaconda.org/conda-forge/noarch/nox-2025.11.12-pyhcf101f3_0.conda#ae74047e4fe04ff7760d9529c49b7475 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index b75a15fa..570d1497 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -4,7 +4,7 @@ @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda#8fcb6b0e2161850556231336dae58358 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h8577fbf_1.conda#e4e8496b68cf5f25e76fbe67f3856550 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-h8577fbf_0.conda#338201218b54cadff2e774ac27733990 https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda#f0991f0f84902f6b6009b4d2350a83aa https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda#26c46f90d0e727e95c6c9498a33a09f3 @@ -26,7 +26,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.c https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda#68f68355000ec3f1d6f26ea13e8f525f -https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-h5347b49_1.conda#41f5c09a211985c3ce642d60721e7c3e +https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda#db409b7c1720428638e7c0d509d3e1b5 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 @@ -37,6 +37,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.c https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb47aa4a_0.conda#607e13a8caac17f9a664bcab5302ce06 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.1-h480dda7_0.conda#4d4efd0645cd556fab54617c4ad477ef +https://conda.anaconda.org/conda-forge/linux-64/icu-78.1-h33c6efd_0.conda#518e9bbbc3e3486d6a4519192ba690f8 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.4-h3f801dc_0.conda#01ba04e414e47f95c03d6ddd81fd37be https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda#366b40a69f0ad6072561c1d09301c886 @@ -46,43 +47,43 @@ https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172b https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_16.conda#40d9b534410403c821ff64f00d0adc22 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.53-h421ea60_0.conda#00d4e66b1f746cb14944cad23fffb405 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.1-h0c1763c_0.conda#2e1b84d273b01835256e53fd938de355 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_16.conda#1b3152694d236cf233b76b8c56bf0eae https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc -https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-hf2a90c1_0.conda#23720d17346b21efb08d68c2255c8431 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 -https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 +https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda#d7d95fc8287ea7bf33e0e7116d2b95ec https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda#98b6c9dc80eb87b2519b97bcf7e578dd https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda#86bc20552bf46075e3d92b67f089172d https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 -https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.2-h54a6638_0.conda#0faadd01896315ceea58bcc3479b1d21 +https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.2-hceb46e0_1.conda#40feea2979654ed579f1cda7c63ccb94 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda#4a13eeac0b5c8e5b8ab496e6c4ddd829 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda#af39b9a8711d4a8d437b52c1d78eb6a1 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda#a6abd2796fc332536735f68ba23f7901 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_105.conda#3ec0aa5037d39b06554109a01e6fb0c6 https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda#8e7251989bca326a28f4a5ffbd74557a https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda#b499ce4b026493a13774bcf0f4c33849 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda#be43915efc66345cccb3c310b6ed0374 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.1-hf4e2dac_1.conda#b1f35e70f047918b49fb4b181e40300e https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#cd5a90476766d53e901500df9215e927 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-h031cc0b_0.conda#a67cd8f7b0369bbf2c40411f05a62f3b +https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-hca6bf5a_1.conda#3fdd8d99683da9fe279c2f4cecd1e048 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.51.1-hbc0de68_0.conda#968f50847d17c74a428fc47a2c70fd6f https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda#8ccf913aaba749a5496c17629d859ed1 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-4_h4a7cf45_openblas.conda#14ff9fdfbd8bd590fca383b995470711 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda#c160954f7418d7b6e87eaf05a8913fa9 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_1.conda#117499f93e892ea1e57fdca16c2e8351 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda#f4084e4e6577797150f9b04a4560ceb0 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-he237659_1.conda#417955234eccd8f252b86a265ccdab7f https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd https://conda.anaconda.org/conda-forge/linux-64/python-3.11.14-hd63d673_2_cpython.conda#c4202a55b4486314fbb8c11bc43a29a0 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.51.1-h04a0ce9_1.conda#941ee610ebf7a8047140831091dcb1f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a @@ -90,7 +91,7 @@ https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda#537296d57ea995666c68c821b00e360b https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.2.0-py311h6b1f9c4_0.conda#596b9cc36b7af0640825b399e6b11ccc https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py311h66f275b_1.conda#86daecb8e4ed1042d5dc6efbe0152590 -https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.2-pyhd8ed1ab_0.conda#9c265afcec13eb6e844ae51b4a4b52ad +https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.4-pyhd8ed1ab_0.conda#629c8fd0c11eb853732608e2454abf8e https://conda.anaconda.org/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda#96a02a5c1a65470a7e4eedb644c872fd https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c @@ -102,21 +103,21 @@ https://conda.anaconda.org/conda-forge/noarch/colorlog-6.10.1-pyh707e725_0.conda https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda#4c2a8fef270f6c69591889b93f9f55c1 https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc -https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda#66b8b26023b8efdf8fcb23bac4b6325d +https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.1-pyhd8ed1ab_0.conda#81a651287d3000eb12f0860ade0a1b41 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda#4afc585cd97ba8a23809406cd8a9eda8 https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.12.0-pyhd8ed1ab_0.conda#a3b9510e2491c20c7fc0f5e730227fbb https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h1b119a7_104.conda#0857f4d157820dcd5625f61fdfefb780 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e -https://conda.anaconda.org/conda-forge/noarch/humanize-4.14.0-pyhd8ed1ab_0.conda#8b8884a6375830fe0cfb806ccbbd755c +https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda#daddf757c3ecd6067b9af1df1f25d89e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda#53abe63df7e10a6ba605dc5f9f961d36 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda#9614359868482abba1bd15ce465e3c42 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py311h724c32c_2.conda#4089f739463c798e10d8644bc34e24de -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-4_h0358290_openblas.conda#25f5e5af61cee1ffedd9b4c9947d3af8 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-4_h47877c9_openblas.conda#8ba8431802764597f400ee3e99026367 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda#6636a2b6f1a87572df2970d3ebc87cc0 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda#b38076eb5c8e40d0106beda6f95d7609 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py311h3778330_0.conda#0954f1a6a26df4a510b54f73b2a0345c https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 @@ -127,13 +128,13 @@ https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda#d7 https://conda.anaconda.org/conda-forge/linux-64/proj-9.7.1-h99ae125_0.conda#8bbc19a6e87fbe8b97796e9a42a47a30 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.5-pyhcf101f3_0.conda#6c8979be6d7a17692793114fa26916e8 +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.1-pyhcf101f3_0.conda#d837065e4e0de4962c3462079c23f969 https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.3-pyhd8ed1ab_0.conda#c138c7aaa6a10b5762dcd92247864aff https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.6.0-py311h041eb40_1.conda#9dcb9824894fb920414608447ccdf3ce https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py311h3778330_0.conda#707c3d23f2476d3bfde8345b4e7d7853 -https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-3.1.0-pyhd8ed1ab_0.conda#5f0f24f8032c2c1bb33f59b75974f5fc +https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda#0dc48b4b570931adc8641e55c6c17fe4 https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda#03fe290994c5e4ec17293cfb6bdce520 @@ -151,7 +152,7 @@ https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py311h03d9500_1.conda https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.0-py311h3778330_0.conda#95294f5480dae437d7c15d40238c9b1c https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda#8e662bd460bda79b1ea39194e3c4c9ab -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.61.0-py311h3778330_0.conda#f5ee391df23b7f50676ebe79fc53ee03 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.61.1-py311h3778330_0.conda#2e8ccb31890a95d5cd90d74a11c7d5e2 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda#4b69232755285701bc86a5afe4d9933a https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 @@ -159,13 +160,14 @@ https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda#04558c96691bed63104678757beb4f8d https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.3-nompi_h11f7409_103.conda#3ccff1066c05a1e6c221356eecc40581 -https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.5-py311h2e04523_0.conda#01da92ddaf561cabebd06019ae521510 +https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda#eb52d14a901e23c39e9e7b4a1a5c015f +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.0-py311h2e04523_0.conda#c6c7e0db448312b204667a13d7f7346d https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/noarch/pip-25.3-pyh8b19718_0.conda#c55515ca43c6444d2572e0f0d93cb6b9 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py311h4e6619b_2.conda#8092837339ae2e3697980df6686f996e https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 +https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda#28687768633154993d521aecfa4a56ac https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.35.4-pyhd8ed1ab_0.conda#cfccfd4e8d9de82ed75c8e2c91cab375 https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.0-pyhcf101f3_0.conda#9958d4a1ee7e9c768fe8f4fb51bd07ea @@ -175,12 +177,12 @@ https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.12.0-pyhcf101f3_1.c https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a04073db11c2c86c555fb088acc8f8c1 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py311h0372a8f_2.conda#487756753716efba090d06c71fb73eb6 https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda#2b694bad8a50dc2f712f5368de866480 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.3-py311h1e13796_1.conda#e1947291b713cb0afa949e1bcda1f935 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.3-py311hbe70eeb_2.conda#1f9587850322d7d77ea14d4fee3d16d8 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0.conda#e2e4d7094d0580ccd62e2a41947444f3 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py311h8a92878_2.conda#b37c338ff0f69883188c9b3b127be059 https://conda.anaconda.org/conda-forge/noarch/tox-4.32.0-pyhcf101f3_0.conda#1b49a3b817df5c88742219c4d6e5ee57 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hdf67eae_6.conda#57e703b0057f992687fb9ad154dc48e4 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.1-pyhd8ed1ab_0.conda#fb84f0f6ee8a0ad67213cd1bea98bf5b +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.2-pyhd8ed1ab_0.conda#4949ca7b83065cfe94ebe320aece8c72 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py311haee01d2_1.conda#ca45bfd4871af957aaa5035593d5efd2 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py311h0372a8f_1.conda#ef8650a6059a907122d59a740207f50e https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.44.0-h83bc92c_0.conda#2d37fd4ccfd98453a02a278e4112da39 @@ -195,10 +197,10 @@ https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.co https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py311hed34c8f_1.conda#17c710c32010688086b28c088a8be579 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 -https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.0-pyha770c72_0.conda#af8d4882203bccefec6f1aeed70030c6 +https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda#7f3ac694319c7eaf81a0325d6405e974 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.44.0-py311h0372a8f_1.conda#c5a5fef7f068abe2858a89ddf19e5a79 https://conda.anaconda.org/conda-forge/noarch/iris-3.14.1-pyha770c72_0.conda#0b6f532e907ce57be6905bd6d44fbe71 -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2025.12.5-pyhd8ed1ab_0.conda#281eb382cddac0cce7da25f98b747ae0 +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2025.12.17-pyhd8ed1ab_0.conda#60d5572f46988af591492c1f137d5204 https://conda.anaconda.org/conda-forge/noarch/nox-2025.11.12-pyhcf101f3_0.conda#ae74047e4fe04ff7760d9529c49b7475 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 3be1b413..164cb1fe 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -4,7 +4,7 @@ @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda#c3efd25ac4d74b1584d2f7a57195ddf1 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h8577fbf_1.conda#e4e8496b68cf5f25e76fbe67f3856550 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-h8577fbf_0.conda#338201218b54cadff2e774ac27733990 https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda#f0991f0f84902f6b6009b4d2350a83aa https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda#26c46f90d0e727e95c6c9498a33a09f3 @@ -26,7 +26,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.c https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda#68f68355000ec3f1d6f26ea13e8f525f -https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-h5347b49_1.conda#41f5c09a211985c3ce642d60721e7c3e +https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda#db409b7c1720428638e7c0d509d3e1b5 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 @@ -37,6 +37,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.c https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb47aa4a_0.conda#607e13a8caac17f9a664bcab5302ce06 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.1-h480dda7_0.conda#4d4efd0645cd556fab54617c4ad477ef +https://conda.anaconda.org/conda-forge/linux-64/icu-78.1-h33c6efd_0.conda#518e9bbbc3e3486d6a4519192ba690f8 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.4-h3f801dc_0.conda#01ba04e414e47f95c03d6ddd81fd37be https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda#366b40a69f0ad6072561c1d09301c886 @@ -46,43 +47,43 @@ https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172b https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_16.conda#40d9b534410403c821ff64f00d0adc22 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.53-h421ea60_0.conda#00d4e66b1f746cb14944cad23fffb405 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.1-h0c1763c_0.conda#2e1b84d273b01835256e53fd938de355 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_16.conda#1b3152694d236cf233b76b8c56bf0eae https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc -https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-hf2a90c1_0.conda#23720d17346b21efb08d68c2255c8431 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 -https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 +https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda#d7d95fc8287ea7bf33e0e7116d2b95ec https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda#98b6c9dc80eb87b2519b97bcf7e578dd https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda#86bc20552bf46075e3d92b67f089172d https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 -https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.2-h54a6638_0.conda#0faadd01896315ceea58bcc3479b1d21 +https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.2-hceb46e0_1.conda#40feea2979654ed579f1cda7c63ccb94 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda#4a13eeac0b5c8e5b8ab496e6c4ddd829 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda#af39b9a8711d4a8d437b52c1d78eb6a1 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_104.conda#a6abd2796fc332536735f68ba23f7901 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_105.conda#3ec0aa5037d39b06554109a01e6fb0c6 https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda#8e7251989bca326a28f4a5ffbd74557a https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda#b499ce4b026493a13774bcf0f4c33849 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda#be43915efc66345cccb3c310b6ed0374 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.1-hf4e2dac_1.conda#b1f35e70f047918b49fb4b181e40300e https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#cd5a90476766d53e901500df9215e927 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-h031cc0b_0.conda#a67cd8f7b0369bbf2c40411f05a62f3b +https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-hca6bf5a_1.conda#3fdd8d99683da9fe279c2f4cecd1e048 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.51.1-hbc0de68_0.conda#968f50847d17c74a428fc47a2c70fd6f https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda#8ccf913aaba749a5496c17629d859ed1 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-4_h4a7cf45_openblas.conda#14ff9fdfbd8bd590fca383b995470711 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda#c160954f7418d7b6e87eaf05a8913fa9 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_1.conda#117499f93e892ea1e57fdca16c2e8351 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda#f4084e4e6577797150f9b04a4560ceb0 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-he237659_1.conda#417955234eccd8f252b86a265ccdab7f https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd https://conda.anaconda.org/conda-forge/linux-64/python-3.12.12-hd63d673_1_cpython.conda#5c00c8cea14ee8d02941cab9121dce41 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.51.1-h04a0ce9_1.conda#941ee610ebf7a8047140831091dcb1f7 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a @@ -90,7 +91,7 @@ https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda#537296d57ea995666c68c821b00e360b https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.2.0-py312h90b7ffd_0.conda#9fc7e65938c0e4b2658631b8bfd380e8 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py312hdb49522_1.conda#64088dffd7413a2dd557ce837b4cbbdb -https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.2-pyhd8ed1ab_0.conda#9c265afcec13eb6e844ae51b4a4b52ad +https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.4-pyhd8ed1ab_0.conda#629c8fd0c11eb853732608e2454abf8e https://conda.anaconda.org/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda#96a02a5c1a65470a7e4eedb644c872fd https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c @@ -102,21 +103,21 @@ https://conda.anaconda.org/conda-forge/noarch/colorlog-6.10.1-pyh707e725_0.conda https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda#4c2a8fef270f6c69591889b93f9f55c1 https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc -https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda#66b8b26023b8efdf8fcb23bac4b6325d +https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.1-pyhd8ed1ab_0.conda#81a651287d3000eb12f0860ade0a1b41 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda#4afc585cd97ba8a23809406cd8a9eda8 https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.12.0-pyhd8ed1ab_0.conda#a3b9510e2491c20c7fc0f5e730227fbb https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h1b119a7_104.conda#0857f4d157820dcd5625f61fdfefb780 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e -https://conda.anaconda.org/conda-forge/noarch/humanize-4.14.0-pyhd8ed1ab_0.conda#8b8884a6375830fe0cfb806ccbbd755c +https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda#daddf757c3ecd6067b9af1df1f25d89e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda#53abe63df7e10a6ba605dc5f9f961d36 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda#9614359868482abba1bd15ce465e3c42 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py312h0a2e395_2.conda#3a3004fddd39e3bb1a631b08d7045156 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-4_h0358290_openblas.conda#25f5e5af61cee1ffedd9b4c9947d3af8 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-4_h47877c9_openblas.conda#8ba8431802764597f400ee3e99026367 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda#6636a2b6f1a87572df2970d3ebc87cc0 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda#b38076eb5c8e40d0106beda6f95d7609 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_0.conda#f775a43412f7f3d7ed218113ad233869 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 @@ -127,13 +128,13 @@ https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda#d7 https://conda.anaconda.org/conda-forge/linux-64/proj-9.7.1-h99ae125_0.conda#8bbc19a6e87fbe8b97796e9a42a47a30 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.5-pyhcf101f3_0.conda#6c8979be6d7a17692793114fa26916e8 +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.1-pyhcf101f3_0.conda#d837065e4e0de4962c3462079c23f969 https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.3-pyhd8ed1ab_0.conda#c138c7aaa6a10b5762dcd92247864aff https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.6.0-py312h0d868a3_1.conda#1cfb9b04c827219597def32c22fb9ca2 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_0.conda#fba10c2007c8b06f77c5a23ce3a635ad -https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-3.1.0-pyhd8ed1ab_0.conda#5f0f24f8032c2c1bb33f59b75974f5fc +https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda#0dc48b4b570931adc8641e55c6c17fe4 https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda#03fe290994c5e4ec17293cfb6bdce520 @@ -151,7 +152,7 @@ https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py312h460c074_1.conda https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.0-py312h8a5da7c_0.conda#da396284d1f498e20b4377478dbb830c https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda#8e662bd460bda79b1ea39194e3c4c9ab -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.61.0-py312h8a5da7c_0.conda#a214816edb28136aabcfad864b3a445b +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.61.1-py312h8a5da7c_0.conda#3bf8fb959dc598c67dac0430b4aff57a https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda#4b69232755285701bc86a5afe4d9933a https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 @@ -159,13 +160,14 @@ https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda#04558c96691bed63104678757beb4f8d https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.3-nompi_h11f7409_103.conda#3ccff1066c05a1e6c221356eecc40581 -https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.5-py312h33ff503_0.conda#1570db96376f9f01cf495afe203672e5 +https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda#eb52d14a901e23c39e9e7b4a1a5c015f +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.0-py312h33ff503_0.conda#4ba148299453b88d8fa9b6351eaa0df8 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/noarch/pip-25.3-pyh8b19718_0.conda#c55515ca43c6444d2572e0f0d93cb6b9 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py312h9b6a7d9_2.conda#573b9a879a3a42990f9c51d7376dce6b https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 +https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda#28687768633154993d521aecfa4a56ac https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.35.4-pyhd8ed1ab_0.conda#cfccfd4e8d9de82ed75c8e2c91cab375 https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.0-pyhcf101f3_0.conda#9958d4a1ee7e9c768fe8f4fb51bd07ea @@ -175,12 +177,12 @@ https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.12.0-pyhcf101f3_1.c https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a04073db11c2c86c555fb088acc8f8c1 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h4f23490_2.conda#cec5bc5f7d374f8f8095f8e28e31f6cb https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda#2b694bad8a50dc2f712f5368de866480 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.3-py312h7a1785b_1.conda#c6e0e1f1d9ac014a980574cfe8caa25f +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.3-py312h54fa4ab_2.conda#e82683871cbc4bb257b7694f31a91327 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0.conda#e2e4d7094d0580ccd62e2a41947444f3 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py312h383787d_2.conda#69e400d3deca12ee7afd4b73a5596905 https://conda.anaconda.org/conda-forge/noarch/tox-4.32.0-pyhcf101f3_0.conda#1b49a3b817df5c88742219c4d6e5ee57 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312hd9148b4_6.conda#f30ece80e76f9cc96e30cc5c71d2818e -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.1-pyhd8ed1ab_0.conda#fb84f0f6ee8a0ad67213cd1bea98bf5b +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.2-pyhd8ed1ab_0.conda#4949ca7b83065cfe94ebe320aece8c72 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py312h5253ce2_1.conda#02738ff9855946075cbd1b5274399a41 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py312h4f23490_1.conda#ac0a1a874ce9e3f8940a3a908ff74da9 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.44.0-h83bc92c_0.conda#2d37fd4ccfd98453a02a278e4112da39 @@ -195,10 +197,10 @@ https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.co https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py312hf79963d_1.conda#6c913a686cb4060cbd7639a36fa144f0 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 -https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.0-pyha770c72_0.conda#af8d4882203bccefec6f1aeed70030c6 +https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda#7f3ac694319c7eaf81a0325d6405e974 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.44.0-py312h4f23490_1.conda#eea306a68c483e1305381130b35a09ff https://conda.anaconda.org/conda-forge/noarch/iris-3.14.1-pyha770c72_0.conda#0b6f532e907ce57be6905bd6d44fbe71 -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2025.12.5-pyhd8ed1ab_0.conda#281eb382cddac0cce7da25f98b747ae0 +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2025.12.17-pyhd8ed1ab_0.conda#60d5572f46988af591492c1f137d5204 https://conda.anaconda.org/conda-forge/noarch/nox-2025.11.12-pyhcf101f3_0.conda#ae74047e4fe04ff7760d9529c49b7475 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff From 26ffdceee74620e3d9fefbbba75d3bfc29ca4716 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 5 Jan 2026 09:32:04 +0000 Subject: [PATCH 529/583] Updated environment lockfiles (#744) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 12 ++++++------ requirements/locks/py311-linux-64.lock | 12 ++++++------ requirements/locks/py312-linux-64.lock | 12 ++++++------ 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 5ddfe012..146de6c7 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -4,7 +4,7 @@ @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.conda#05e00f3b21e88bb3d658ac700b2ce58c -https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-h8577fbf_0.conda#338201218b54cadff2e774ac27733990 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda#ad659d0a2b3e47e38d829aa8cad2d610 https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda#f0991f0f84902f6b6009b4d2350a83aa https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda#26c46f90d0e727e95c6c9498a33a09f3 @@ -89,7 +89,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0. https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda#8f37c8fb7116a18da04e52fa9e2c8df9 https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda#537296d57ea995666c68c821b00e360b -https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.2.0-py310h69bd2ac_0.conda#22be0d7b12ae6ff92aa1fd73272c65d7 +https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py310h69bd2ac_0.conda#276a3ddf300498921601822e3b407088 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py310hba01987_1.conda#393fca4557fbd2c4d995dcb89f569048 https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.4-pyhd8ed1ab_0.conda#629c8fd0c11eb853732608e2454abf8e https://conda.anaconda.org/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda#96a02a5c1a65470a7e4eedb644c872fd @@ -103,7 +103,7 @@ https://conda.anaconda.org/conda-forge/noarch/colorlog-6.10.1-pyh707e725_0.conda https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda#4c2a8fef270f6c69591889b93f9f55c1 https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc -https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.1-pyhd8ed1ab_0.conda#81a651287d3000eb12f0860ade0a1b41 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.2-pyhd8ed1ab_0.conda#7e7cf4d6c2be6991e6ae2b3f4331701c https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda#4afc585cd97ba8a23809406cd8a9eda8 https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.12.0-pyhd8ed1ab_0.conda#a3b9510e2491c20c7fc0f5e730227fbb @@ -122,7 +122,7 @@ https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2# https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py310h3406613_0.conda#8854df4fb4e37cc3ea0a024e48c9c180 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 -https://conda.anaconda.org/conda-forge/linux-64/pillow-12.0.0-py310h5a73078_2.conda#b258053ab882158e39c6f8aff00b4c37 +https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.0-py310h5a73078_0.conda#6fcf01b5f1d2614fbe900c2434fd3913 https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda#1bd2e65c8c7ef24f4639ae6e850dacc2 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda#d7585b6550ad04c8c5e21097ada2888e https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h18fbb6c_2.conda#1aeede769ec2fa0f474f8b73a7ac057f @@ -148,7 +148,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.cond https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda#30cd29cb87d819caead4d55184c1d115 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py310he7384ee_1.conda#803e2d778b8dcccdc014127ec5001681 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.0-py310h3406613_0.conda#87a9020d32817a12115e5ddfce4693ac +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.1-py310h3406613_0.conda#c41ab071ecc2686b335edcfcb0727f87 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda#8e662bd460bda79b1ea39194e3c4c9ab https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.61.1-py310h3406613_0.conda#24fa891e40acdb1c7f51efd0c5f97084 @@ -191,7 +191,7 @@ https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py310hfde https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.3-nompi_py310he90c06d_100.conda#e1a3c6a1e8ceec1fe91a3660b97a43b6 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda#6891acad5e136cb62a8c2ed2679d6528 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda#c65df89a0b2e321045a9e01d1337b182 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py310h0158d43_1.conda#871b5f746960f99ac23dbc73d14e2ad0 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 570d1497..36455bff 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -4,7 +4,7 @@ @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda#8fcb6b0e2161850556231336dae58358 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-h8577fbf_0.conda#338201218b54cadff2e774ac27733990 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda#ad659d0a2b3e47e38d829aa8cad2d610 https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda#f0991f0f84902f6b6009b4d2350a83aa https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda#26c46f90d0e727e95c6c9498a33a09f3 @@ -89,7 +89,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0. https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda#8f37c8fb7116a18da04e52fa9e2c8df9 https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda#537296d57ea995666c68c821b00e360b -https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.2.0-py311h6b1f9c4_0.conda#596b9cc36b7af0640825b399e6b11ccc +https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py311h6b1f9c4_0.conda#adda5ef2a74c9bdb338ff8a51192898a https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py311h66f275b_1.conda#86daecb8e4ed1042d5dc6efbe0152590 https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.4-pyhd8ed1ab_0.conda#629c8fd0c11eb853732608e2454abf8e https://conda.anaconda.org/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda#96a02a5c1a65470a7e4eedb644c872fd @@ -103,7 +103,7 @@ https://conda.anaconda.org/conda-forge/noarch/colorlog-6.10.1-pyh707e725_0.conda https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda#4c2a8fef270f6c69591889b93f9f55c1 https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc -https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.1-pyhd8ed1ab_0.conda#81a651287d3000eb12f0860ade0a1b41 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.2-pyhd8ed1ab_0.conda#7e7cf4d6c2be6991e6ae2b3f4331701c https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda#4afc585cd97ba8a23809406cd8a9eda8 https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.12.0-pyhd8ed1ab_0.conda#a3b9510e2491c20c7fc0f5e730227fbb @@ -122,7 +122,7 @@ https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2# https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py311h3778330_0.conda#0954f1a6a26df4a510b54f73b2a0345c https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 -https://conda.anaconda.org/conda-forge/linux-64/pillow-12.0.0-py311hf88fc01_2.conda#79edb22fb652ee142099df18042ca8c0 +https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.0-py311hf88fc01_0.conda#ce51a1258d127e1c72bad676235b9d6c https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda#1bd2e65c8c7ef24f4639ae6e850dacc2 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda#d7585b6550ad04c8c5e21097ada2888e https://conda.anaconda.org/conda-forge/linux-64/proj-9.7.1-h99ae125_0.conda#8bbc19a6e87fbe8b97796e9a42a47a30 @@ -149,7 +149,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.cond https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda#30cd29cb87d819caead4d55184c1d115 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py311h03d9500_1.conda#3912e4373de46adafd8f1e97e4bd166b -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.0-py311h3778330_0.conda#95294f5480dae437d7c15d40238c9b1c +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.1-py311h3778330_0.conda#9d38ee59f3535da3ee59652dcef8fd96 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda#8e662bd460bda79b1ea39194e3c4c9ab https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.61.1-py311h3778330_0.conda#2e8ccb31890a95d5cd90d74a11c7d5e2 @@ -192,7 +192,7 @@ https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py311h0f3 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.3-nompi_py311h6623971_100.conda#d625880a4f700264c5aad388856479ee https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda#6891acad5e136cb62a8c2ed2679d6528 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda#c65df89a0b2e321045a9e01d1337b182 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py311hed34c8f_1.conda#17c710c32010688086b28c088a8be579 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 164cb1fe..b58381e4 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -4,7 +4,7 @@ @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda#c3efd25ac4d74b1584d2f7a57195ddf1 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-h8577fbf_0.conda#338201218b54cadff2e774ac27733990 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda#ad659d0a2b3e47e38d829aa8cad2d610 https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda#f0991f0f84902f6b6009b4d2350a83aa https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda#26c46f90d0e727e95c6c9498a33a09f3 @@ -89,7 +89,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0. https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda#8f37c8fb7116a18da04e52fa9e2c8df9 https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda#537296d57ea995666c68c821b00e360b -https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.2.0-py312h90b7ffd_0.conda#9fc7e65938c0e4b2658631b8bfd380e8 +https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py312h90b7ffd_0.conda#5b8c55fed2e576dde4b0b33693a4fdb1 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py312hdb49522_1.conda#64088dffd7413a2dd557ce837b4cbbdb https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.4-pyhd8ed1ab_0.conda#629c8fd0c11eb853732608e2454abf8e https://conda.anaconda.org/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda#96a02a5c1a65470a7e4eedb644c872fd @@ -103,7 +103,7 @@ https://conda.anaconda.org/conda-forge/noarch/colorlog-6.10.1-pyh707e725_0.conda https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda#4c2a8fef270f6c69591889b93f9f55c1 https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc -https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.1-pyhd8ed1ab_0.conda#81a651287d3000eb12f0860ade0a1b41 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.2-pyhd8ed1ab_0.conda#7e7cf4d6c2be6991e6ae2b3f4331701c https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda#4afc585cd97ba8a23809406cd8a9eda8 https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.12.0-pyhd8ed1ab_0.conda#a3b9510e2491c20c7fc0f5e730227fbb @@ -122,7 +122,7 @@ https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2# https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_0.conda#f775a43412f7f3d7ed218113ad233869 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 -https://conda.anaconda.org/conda-forge/linux-64/pillow-12.0.0-py312h50c33e8_2.conda#f2aef8ecea68f4d35330f0c48949bff2 +https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.0-py312h50c33e8_0.conda#923b06ad75b7acc888fa20a22dc397cd https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda#1bd2e65c8c7ef24f4639ae6e850dacc2 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda#d7585b6550ad04c8c5e21097ada2888e https://conda.anaconda.org/conda-forge/linux-64/proj-9.7.1-h99ae125_0.conda#8bbc19a6e87fbe8b97796e9a42a47a30 @@ -149,7 +149,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.cond https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda#30cd29cb87d819caead4d55184c1d115 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py312h460c074_1.conda#648ee28dcd4e07a1940a17da62eccd40 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.0-py312h8a5da7c_0.conda#da396284d1f498e20b4377478dbb830c +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.1-py312h8a5da7c_0.conda#eafe0b486a7910e4a6973029c80d437f https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda#8e662bd460bda79b1ea39194e3c4c9ab https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.61.1-py312h8a5da7c_0.conda#3bf8fb959dc598c67dac0430b4aff57a @@ -192,7 +192,7 @@ https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py312he3d https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.3-nompi_py312hf6400b3_100.conda#ed7ab4073fe4c48d0f9d3a80b6a17f74 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda#6891acad5e136cb62a8c2ed2679d6528 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda#c65df89a0b2e321045a9e01d1337b182 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py312hf79963d_1.conda#6c913a686cb4060cbd7639a36fa144f0 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 From fd87772e4a4ae2c40e7a8cfac1652ea03434200f Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 6 Jan 2026 10:18:21 +0000 Subject: [PATCH 530/583] chore: update pre-commit hooks (#745) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/pre-commit/mirrors-mypy: v1.19.0 → v1.19.1](https://github.com/pre-commit/mirrors-mypy/compare/v1.19.0...v1.19.1) - [github.com/numpy/numpydoc: v1.9.0 → v1.10.0](https://github.com/numpy/numpydoc/compare/v1.9.0...v1.10.0) - [github.com/astral-sh/ruff-pre-commit: v0.14.7 → v0.14.10](https://github.com/astral-sh/ruff-pre-commit/compare/v0.14.7...v0.14.10) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 03dc1064..9f97ded0 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -67,20 +67,20 @@ repos: additional_dependencies: [tomli] - repo: https://github.com/pre-commit/mirrors-mypy - rev: 'v1.19.0' + rev: 'v1.19.1' hooks: - id: mypy exclude: 'noxfile\.py|docs/conf\.py' - repo: https://github.com/numpy/numpydoc - rev: v1.9.0 + rev: v1.10.0 hooks: - id: numpydoc-validation exclude: "src/iris_grib/tests/|noxfile.py" types: [file, python] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.14.7" + rev: "v0.14.10" hooks: - id: ruff-check types: [file, python] From 542e3dcc70f761e868f0673e8f10861013f8f4b2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 8 Jan 2026 08:58:50 +0000 Subject: [PATCH 531/583] Bump the dependencies group with 3 updates (#746) Bumps the dependencies group with 3 updates: [scitools/workflows/.github/workflows/ci-manifest.yml](https://github.com/scitools/workflows), [scitools/workflows/.github/workflows/ci-template-check.yml](https://github.com/scitools/workflows) and [scitools/workflows/.github/workflows/refresh-lockfiles.yml](https://github.com/scitools/workflows). Updates `scitools/workflows/.github/workflows/ci-manifest.yml` from 2025.12.4 to 2026.01.0 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.12.4...2026.01.0) Updates `scitools/workflows/.github/workflows/ci-template-check.yml` from 2025.12.4 to 2026.01.0 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.12.4...2026.01.0) Updates `scitools/workflows/.github/workflows/refresh-lockfiles.yml` from 2025.12.4 to 2026.01.0 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2025.12.4...2026.01.0) --- updated-dependencies: - dependency-name: scitools/workflows/.github/workflows/ci-manifest.yml dependency-version: 2026.01.0 dependency-type: direct:production dependency-group: dependencies - dependency-name: scitools/workflows/.github/workflows/ci-template-check.yml dependency-version: 2026.01.0 dependency-type: direct:production dependency-group: dependencies - dependency-name: scitools/workflows/.github/workflows/refresh-lockfiles.yml dependency-version: 2026.01.0 dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/ci-template-check.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index a5974f9c..41c84abe 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2025.12.4 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2026.01.0 diff --git a/.github/workflows/ci-template-check.yml b/.github/workflows/ci-template-check.yml index 5de3ae5f..cc9f85ae 100644 --- a/.github/workflows/ci-template-check.yml +++ b/.github/workflows/ci-template-check.yml @@ -10,7 +10,7 @@ on: jobs: prompt-share: - uses: scitools/workflows/.github/workflows/ci-template-check.yml@2025.12.4 + uses: scitools/workflows/.github/workflows/ci-template-check.yml@2026.01.0 secrets: inherit with: pr_number: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index c15462c9..46d31e19 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2025.12.4 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2026.01.0 secrets: inherit From 20476060152c97042a029fe755f982151b7d4907 Mon Sep 17 00:00:00 2001 From: Martin Yeo <40734014+trexfeathers@users.noreply.github.com> Date: Tue, 27 Jan 2026 09:51:39 +0000 Subject: [PATCH 532/583] Lock file update plus adapt to Unidata/cftime#355 (#748) * Updated environment lockfiles * Adjust CML result for fixed bug in Unidata/cftime#355 . --------- Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 60 ++++++++-------- requirements/locks/py311-linux-64.lock | 72 +++++++++---------- requirements/locks/py312-linux-64.lock | 72 +++++++++---------- .../second_order_packing.cml | 2 +- 4 files changed, 103 insertions(+), 103 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 146de6c7..d8f6f14a 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -5,7 +5,7 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.conda#05e00f3b21e88bb3d658ac700b2ce58c https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda#ad659d0a2b3e47e38d829aa8cad2d610 -https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda#f0991f0f84902f6b6009b4d2350a83aa +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda#bddacf101bb4dd0e51811cb69c7790e2 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda#26c46f90d0e727e95c6c9498a33a09f3 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d @@ -23,7 +23,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_16.con https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_16.conda#39183d4e0c05609fd65f130633194e37 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda#8397539e3a0bbd1695584fb4f927485a -https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda#c7c83eecbb72d88b940c249af56c8b17 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda#68f68355000ec3f1d6f26ea13e8f525f https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda#db409b7c1720428638e7c0d509d3e1b5 @@ -37,7 +37,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.c https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb47aa4a_0.conda#607e13a8caac17f9a664bcab5302ce06 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.1-h480dda7_0.conda#4d4efd0645cd556fab54617c4ad477ef -https://conda.anaconda.org/conda-forge/linux-64/icu-78.1-h33c6efd_0.conda#518e9bbbc3e3486d6a4519192ba690f8 +https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda#186a18e3ba246eccfc7cff00cd19a870 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.4-h3f801dc_0.conda#01ba04e414e47f95c03d6ddd81fd37be https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda#366b40a69f0ad6072561c1d09301c886 @@ -46,7 +46,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_16.conda#40d9b534410403c821ff64f00d0adc22 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.53-h421ea60_0.conda#00d4e66b1f746cb14944cad23fffb405 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.54-h421ea60_0.conda#d361fa2a59e53b61c2675bfa073e5b7e https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_16.conda#1b3152694d236cf233b76b8c56bf0eae https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 @@ -69,21 +69,21 @@ https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.c https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda#b499ce4b026493a13774bcf0f4c33849 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda#be43915efc66345cccb3c310b6ed0374 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.1-hf4e2dac_1.conda#b1f35e70f047918b49fb4b181e40300e +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda#da5be73701eecd0e8454423fd6ffcf30 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#cd5a90476766d53e901500df9215e927 https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-hca6bf5a_1.conda#3fdd8d99683da9fe279c2f4cecd1e048 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda#8ccf913aaba749a5496c17629d859ed1 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda#6f2e2c8f58160147c4d1c6f4c14cbac4 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda#c160954f7418d7b6e87eaf05a8913fa9 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_1.conda#117499f93e892ea1e57fdca16c2e8351 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.18.0-h4e3cde8_0.conda#0a5563efed19ca4461cf927419b6eb73 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda#f4084e4e6577797150f9b04a4560ceb0 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-he237659_1.conda#417955234eccd8f252b86a265ccdab7f https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd https://conda.anaconda.org/conda-forge/linux-64/python-3.10.19-h3c07f61_2_cpython.conda#27ac896a8b4970f8977503a9e70dc745 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.51.1-h04a0ce9_1.conda#941ee610ebf7a8047140831091dcb1f7 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.51.2-h04a0ce9_0.conda#bb88d9335d09e54c7e6b5529d1856917 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a @@ -92,7 +92,7 @@ https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda#53 https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py310h69bd2ac_0.conda#276a3ddf300498921601822e3b407088 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py310hba01987_1.conda#393fca4557fbd2c4d995dcb89f569048 https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.4-pyhd8ed1ab_0.conda#629c8fd0c11eb853732608e2454abf8e -https://conda.anaconda.org/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda#96a02a5c1a65470a7e4eedb644c872fd +https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda#eacc711330cd46939f66cd401ff9c44b https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda#a22d1fd9bf98827e280a02875d9a007a @@ -103,11 +103,11 @@ https://conda.anaconda.org/conda-forge/noarch/colorlog-6.10.1-pyh707e725_0.conda https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda#4c2a8fef270f6c69591889b93f9f55c1 https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc -https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.2-pyhd8ed1ab_0.conda#7e7cf4d6c2be6991e6ae2b3f4331701c +https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.3-pyhd8ed1ab_0.conda#2cfaaccf085c133a477f0a7a8657afe9 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda#4afc585cd97ba8a23809406cd8a9eda8 -https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.12.0-pyhd8ed1ab_0.conda#a3b9510e2491c20c7fc0f5e730227fbb -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h1b119a7_104.conda#0857f4d157820dcd5625f61fdfefb780 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.1.0-pyhd8ed1ab_0.conda#1daaf94a304a27ba3446a306235a37ea +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h1b119a7_105.conda#d58cd79121dd51128f2a5dab44edf1ea https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda#daddf757c3ecd6067b9af1df1f25d89e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac @@ -121,29 +121,28 @@ https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_open https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py310h3406613_0.conda#8854df4fb4e37cc3ea0a024e48c9c180 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 -https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 +https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda#b76541e68fea4d511b1ac46a28dcd2c6 https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.0-py310h5a73078_0.conda#6fcf01b5f1d2614fbe900c2434fd3913 https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda#1bd2e65c8c7ef24f4639ae6e850dacc2 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda#d7585b6550ad04c8c5e21097ada2888e https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h18fbb6c_2.conda#1aeede769ec2fa0f474f8b73a7ac057f https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.1-pyhcf101f3_0.conda#d837065e4e0de4962c3462079c23f969 +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda#3687cc0b82a8b4c17e1f0eb7e47163d5 https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.3-pyhd8ed1ab_0.conda#c138c7aaa6a10b5762dcd92247864aff https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.6.0-py310hf3bd8b6_1.conda#a49d7089a9d44aa209f970fc0e5abd1c https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py310h3406613_0.conda#bc058b3b89fcb525bb4977832aa52014 -https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e +https://conda.anaconda.org/conda-forge/noarch/setuptools-80.10.1-pyh332efcf_0.conda#cb72cedd94dd923c6a9405a3d3b1c018 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda#03fe290994c5e4ec17293cfb6bdce520 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda#755cf22df8693aa0d1aec1c123fa5863 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb -https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda#d2732eb636c264dc9aa4cbee404b1a53 +https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda#72e780e9aa2d0a3295f59b1874e3768b https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda#c07a6153f8306e45794774cf9b13bd32 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.0-py310h7c4b9e2_1.conda#b1ccdb989be682ab0dd430c1c15d5012 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda#30cd29cb87d819caead4d55184c1d115 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 @@ -153,7 +152,7 @@ https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda#8e662bd460bda79b1ea39194e3c4c9ab https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.61.1-py310h3406613_0.conda#24fa891e40acdb1c7f51efd0c5f97084 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 -https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda#4b69232755285701bc86a5afe4d9933a +https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda#b8993c19b0c32a2f7b66cbb58ca27069 https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 @@ -162,33 +161,34 @@ https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.3-nompi_h11f7409_1 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda#eb52d14a901e23c39e9e7b4a1a5c015f https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.6-py310hefbff90_0.conda#b0cea2c364bf65cd19e023040eeab05d https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/noarch/pip-25.3-pyh8b19718_0.conda#c55515ca43c6444d2572e0f0d93cb6b9 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py310h71d0299_1.conda#e54b1eaeb50ad1767680181a8575a8db https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.35.4-pyhd8ed1ab_0.conda#cfccfd4e8d9de82ed75c8e2c91cab375 -https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.0-pyhcf101f3_0.conda#9958d4a1ee7e9c768fe8f4fb51bd07ea -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310hf779ad0_2.conda#30167b9702fd4a46cd4a98e74c9840d8 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.36.1-pyhd8ed1ab_0.conda#6b0259cea8ffa6b66b35bae0ca01c447 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.46.3-pyhd8ed1ab_0.conda#bdbd7385b4a67025ac2dba4ef8cb6a8f +https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda#11a2b8c732d215d977998ccd69a9d5e8 +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py310hf779ad0_1.conda#702cd87d652ec1956ee503b9e16bb1c0 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py310h3788b33_0.conda#b6420d29123c7c823de168f49ccdfe6a https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.7.0-h40b2b14_1.conda#8a77895fb29728b736a1a6c75906ea1a https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a04073db11c2c86c555fb088acc8f8c1 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py310hf779ad0_2.conda#4906d8c3680f6c1273ad5a5775807867 +https://conda.anaconda.org/conda-forge/noarch/pip-25.3-pyh8b19718_0.conda#c55515ca43c6444d2572e0f0d93cb6b9 https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda#2b694bad8a50dc2f712f5368de866480 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.conda#8c29cd33b64b2eb78597fa28b5595c8d https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0.conda#e2e4d7094d0580ccd62e2a41947444f3 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py310hc8bbb35_2.conda#0937b0e88a24c82e02d5b714acc9957c -https://conda.anaconda.org/conda-forge/noarch/tox-4.32.0-pyhcf101f3_0.conda#1b49a3b817df5c88742219c4d6e5ee57 +https://conda.anaconda.org/conda-forge/noarch/tox-4.34.1-pyhcf101f3_0.conda#1e1c68df36eb6e419c7c833291443552 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310h03d9f68_6.conda#34778c3f9a6ea19610e7e340dc2caaab -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.2-pyhd8ed1ab_0.conda#4949ca7b83065cfe94ebe320aece8c72 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda#9272daa869e03efe68833e3dc7a02130 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py310h139afa4_1.conda#3741aefc198dfed2e3c9adc79d706bb7 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py310hf779ad0_1.conda#5e4aea6b728177b53e8a216922ebd6a2 https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.44.0-h83bc92c_0.conda#2d37fd4ccfd98453a02a278e4112da39 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.45.0-h83bc92c_0.conda#a981ecc85b1ff6307b8f09cf66b77083 https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.15-pyhd8ed1ab_0.conda#25f954b7dae6dd7b0dc004dab74f1ce9 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.16-pyhd8ed1ab_0.conda#8bc5851c415865334882157127e75799 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py310hfde16b3_0.conda#093b60a14d2c0d8c10f17e14a73a60d3 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.3-nompi_py310he90c06d_100.conda#e1a3c6a1e8ceec1fe91a3660b97a43b6 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py310hd27e1a9_102.conda#424961f9f166613016bc4737796ef44b https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda#6891acad5e136cb62a8c2ed2679d6528 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda#c65df89a0b2e321045a9e01d1337b182 @@ -197,15 +197,15 @@ https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py310h0158d43_1.c https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda#7f3ac694319c7eaf81a0325d6405e974 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.44.0-py310hf779ad0_1.conda#fd8c4f1cebd49ffbea2d817dc56eb4cd +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.45.0-np2py310h99de88f_1.conda#775e439c57d4c2f8e54cae32c6d5ce5e https://conda.anaconda.org/conda-forge/noarch/iris-3.11.1-pyha770c72_1.conda#f501583062225a070455d011d81b07bf -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2025.12.17-pyhd8ed1ab_0.conda#60d5572f46988af591492c1f137d5204 +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.1.14-pyhd8ed1ab_0.conda#b62298ac3e5ab2b2b694105010492439 https://conda.anaconda.org/conda-forge/noarch/nox-2025.11.12-pyhcf101f3_0.conda#ae74047e4fe04ff7760d9529c49b7475 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda#e9fb3fe8a5b758b4aff187d434f94f03 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jquery-4.1-pyhd8ed1ab_1.conda#403185829255321ea427333f7773dd1f -https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-3.0.2-pyha770c72_0.conda#cec0cc87b40171bc323a9d80b619c9c5 +https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-3.1.0-pyha770c72_0.conda#cede6bc99a0253fa676f03cfdc666d57 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda#00534ebcc0375929b45c3039b5ba7636 https://conda.anaconda.org/conda-forge/noarch/sphinx-8.1.3-pyhd8ed1ab_1.conda#1a3281a0dc355c02b5506d87db2d78ac https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda#3bc61f7161d28137797e038263c04c54 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 36455bff..6d61883c 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -5,7 +5,7 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda#8fcb6b0e2161850556231336dae58358 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda#ad659d0a2b3e47e38d829aa8cad2d610 -https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda#f0991f0f84902f6b6009b4d2350a83aa +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda#bddacf101bb4dd0e51811cb69c7790e2 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda#26c46f90d0e727e95c6c9498a33a09f3 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d @@ -23,7 +23,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_16.con https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_16.conda#39183d4e0c05609fd65f130633194e37 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda#8397539e3a0bbd1695584fb4f927485a -https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda#c7c83eecbb72d88b940c249af56c8b17 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda#68f68355000ec3f1d6f26ea13e8f525f https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda#db409b7c1720428638e7c0d509d3e1b5 @@ -37,7 +37,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.c https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb47aa4a_0.conda#607e13a8caac17f9a664bcab5302ce06 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.1-h480dda7_0.conda#4d4efd0645cd556fab54617c4ad477ef -https://conda.anaconda.org/conda-forge/linux-64/icu-78.1-h33c6efd_0.conda#518e9bbbc3e3486d6a4519192ba690f8 +https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda#186a18e3ba246eccfc7cff00cd19a870 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.4-h3f801dc_0.conda#01ba04e414e47f95c03d6ddd81fd37be https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda#366b40a69f0ad6072561c1d09301c886 @@ -46,7 +46,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_16.conda#40d9b534410403c821ff64f00d0adc22 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.53-h421ea60_0.conda#00d4e66b1f746cb14944cad23fffb405 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.54-h421ea60_0.conda#d361fa2a59e53b61c2675bfa073e5b7e https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_16.conda#1b3152694d236cf233b76b8c56bf0eae https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 @@ -69,21 +69,21 @@ https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.c https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda#b499ce4b026493a13774bcf0f4c33849 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda#be43915efc66345cccb3c310b6ed0374 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.1-hf4e2dac_1.conda#b1f35e70f047918b49fb4b181e40300e +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda#da5be73701eecd0e8454423fd6ffcf30 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#cd5a90476766d53e901500df9215e927 https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-hca6bf5a_1.conda#3fdd8d99683da9fe279c2f4cecd1e048 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda#8ccf913aaba749a5496c17629d859ed1 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda#6f2e2c8f58160147c4d1c6f4c14cbac4 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda#c160954f7418d7b6e87eaf05a8913fa9 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_1.conda#117499f93e892ea1e57fdca16c2e8351 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.18.0-h4e3cde8_0.conda#0a5563efed19ca4461cf927419b6eb73 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda#f4084e4e6577797150f9b04a4560ceb0 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-he237659_1.conda#417955234eccd8f252b86a265ccdab7f https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd https://conda.anaconda.org/conda-forge/linux-64/python-3.11.14-hd63d673_2_cpython.conda#c4202a55b4486314fbb8c11bc43a29a0 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.51.1-h04a0ce9_1.conda#941ee610ebf7a8047140831091dcb1f7 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.51.2-h04a0ce9_0.conda#bb88d9335d09e54c7e6b5529d1856917 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a @@ -92,7 +92,7 @@ https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda#53 https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py311h6b1f9c4_0.conda#adda5ef2a74c9bdb338ff8a51192898a https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py311h66f275b_1.conda#86daecb8e4ed1042d5dc6efbe0152590 https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.4-pyhd8ed1ab_0.conda#629c8fd0c11eb853732608e2454abf8e -https://conda.anaconda.org/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda#96a02a5c1a65470a7e4eedb644c872fd +https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda#eacc711330cd46939f66cd401ff9c44b https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda#a22d1fd9bf98827e280a02875d9a007a @@ -103,11 +103,11 @@ https://conda.anaconda.org/conda-forge/noarch/colorlog-6.10.1-pyh707e725_0.conda https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda#4c2a8fef270f6c69591889b93f9f55c1 https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc -https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.2-pyhd8ed1ab_0.conda#7e7cf4d6c2be6991e6ae2b3f4331701c +https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.3-pyhd8ed1ab_0.conda#2cfaaccf085c133a477f0a7a8657afe9 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda#4afc585cd97ba8a23809406cd8a9eda8 -https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.12.0-pyhd8ed1ab_0.conda#a3b9510e2491c20c7fc0f5e730227fbb -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h1b119a7_104.conda#0857f4d157820dcd5625f61fdfefb780 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.1.0-pyhd8ed1ab_0.conda#1daaf94a304a27ba3446a306235a37ea +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h1b119a7_105.conda#d58cd79121dd51128f2a5dab44edf1ea https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda#daddf757c3ecd6067b9af1df1f25d89e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac @@ -121,30 +121,29 @@ https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_open https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py311h3778330_0.conda#0954f1a6a26df4a510b54f73b2a0345c https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 -https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 +https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda#b76541e68fea4d511b1ac46a28dcd2c6 https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.0-py311hf88fc01_0.conda#ce51a1258d127e1c72bad676235b9d6c https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda#1bd2e65c8c7ef24f4639ae6e850dacc2 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda#d7585b6550ad04c8c5e21097ada2888e -https://conda.anaconda.org/conda-forge/linux-64/proj-9.7.1-h99ae125_0.conda#8bbc19a6e87fbe8b97796e9a42a47a30 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.7.1-he0df7b0_2.conda#beb1885cfdb793193bba83c9720d53b1 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.1-pyhcf101f3_0.conda#d837065e4e0de4962c3462079c23f969 +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda#3687cc0b82a8b4c17e1f0eb7e47163d5 https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.3-pyhd8ed1ab_0.conda#c138c7aaa6a10b5762dcd92247864aff https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.6.0-py311h041eb40_1.conda#9dcb9824894fb920414608447ccdf3ce https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py311h3778330_0.conda#707c3d23f2476d3bfde8345b4e7d7853 https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda#0dc48b4b570931adc8641e55c6c17fe4 -https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e +https://conda.anaconda.org/conda-forge/noarch/setuptools-80.10.1-pyh332efcf_0.conda#cb72cedd94dd923c6a9405a3d3b1c018 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda#03fe290994c5e4ec17293cfb6bdce520 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda#755cf22df8693aa0d1aec1c123fa5863 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb -https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda#d2732eb636c264dc9aa4cbee404b1a53 +https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda#72e780e9aa2d0a3295f59b1874e3768b https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda#c07a6153f8306e45794774cf9b13bd32 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.0-py311h49ec1c0_1.conda#5e6d4026784e83c0a51c86ec428e8cc8 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda#30cd29cb87d819caead4d55184c1d115 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 @@ -154,42 +153,43 @@ https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda#8e662bd460bda79b1ea39194e3c4c9ab https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.61.1-py311h3778330_0.conda#2e8ccb31890a95d5cd90d74a11c7d5e2 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 -https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda#4b69232755285701bc86a5afe4d9933a +https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda#b8993c19b0c32a2f7b66cbb58ca27069 https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda#04558c96691bed63104678757beb4f8d https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.3-nompi_h11f7409_103.conda#3ccff1066c05a1e6c221356eecc40581 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda#eb52d14a901e23c39e9e7b4a1a5c015f -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.0-py311h2e04523_0.conda#c6c7e0db448312b204667a13d7f7346d +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.1-py311h2e04523_0.conda#716357afd11c16214cdac522da447704 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/noarch/pip-25.3-pyh8b19718_0.conda#c55515ca43c6444d2572e0f0d93cb6b9 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py311h4e6619b_2.conda#8092837339ae2e3697980df6686f996e https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda#28687768633154993d521aecfa4a56ac https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.35.4-pyhd8ed1ab_0.conda#cfccfd4e8d9de82ed75c8e2c91cab375 -https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.0-pyhcf101f3_0.conda#9958d4a1ee7e9c768fe8f4fb51bd07ea -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h0372a8f_2.conda#c85f7b94f099fddb08358e0997dded95 -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py311hdf67eae_3.conda#c4e2f4d5193e55a70bb67a2aa07006ae -https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.12.0-pyhcf101f3_1.conda#cc7b371edd70319942c802c7d828a428 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.36.1-pyhd8ed1ab_0.conda#6b0259cea8ffa6b66b35bae0ca01c447 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.46.3-pyhd8ed1ab_0.conda#bdbd7385b4a67025ac2dba4ef8cb6a8f +https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda#11a2b8c732d215d977998ccd69a9d5e8 +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py311h0372a8f_1.conda#77cf197e2f03986b6505bab6e214d22a +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py311h724c32c_4.conda#d04e508f5a03162c8bab4586a65d00bf +https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.1.1-pyhcf101f3_1.conda#91e3b2a0d014ac032c066a2e18051686 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a04073db11c2c86c555fb088acc8f8c1 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py311h0372a8f_2.conda#487756753716efba090d06c71fb73eb6 +https://conda.anaconda.org/conda-forge/noarch/pip-25.3-pyh8b19718_0.conda#c55515ca43c6444d2572e0f0d93cb6b9 https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda#2b694bad8a50dc2f712f5368de866480 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.3-py311hbe70eeb_2.conda#1f9587850322d7d77ea14d4fee3d16d8 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.0-py311hbe70eeb_1.conda#f4dda6316cc4718cbcab7009b5d60c41 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0.conda#e2e4d7094d0580ccd62e2a41947444f3 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py311h8a92878_2.conda#b37c338ff0f69883188c9b3b127be059 -https://conda.anaconda.org/conda-forge/noarch/tox-4.32.0-pyhcf101f3_0.conda#1b49a3b817df5c88742219c4d6e5ee57 +https://conda.anaconda.org/conda-forge/noarch/tox-4.34.1-pyhcf101f3_0.conda#1e1c68df36eb6e419c7c833291443552 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hdf67eae_6.conda#57e703b0057f992687fb9ad154dc48e4 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.2-pyhd8ed1ab_0.conda#4949ca7b83065cfe94ebe320aece8c72 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda#9272daa869e03efe68833e3dc7a02130 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py311haee01d2_1.conda#ca45bfd4871af957aaa5035593d5efd2 -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py311h0372a8f_1.conda#ef8650a6059a907122d59a740207f50e -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.44.0-h83bc92c_0.conda#2d37fd4ccfd98453a02a278e4112da39 +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.1-py311h0372a8f_0.conda#dd96428f7ee2aef4dc32076631418323 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.45.0-h83bc92c_0.conda#a981ecc85b1ff6307b8f09cf66b77083 https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.15-pyhd8ed1ab_0.conda#25f954b7dae6dd7b0dc004dab74f1ce9 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.16-pyhd8ed1ab_0.conda#8bc5851c415865334882157127e75799 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py311h0f3be63_0.conda#21a0139015232dc0edbf6c2179b5ec24 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.3-nompi_py311h6623971_100.conda#d625880a4f700264c5aad388856479ee +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py311h66524b1_102.conda#aebe42b1c8b797e41fb7d7d05ebc5932 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda#6891acad5e136cb62a8c2ed2679d6528 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda#c65df89a0b2e321045a9e01d1337b182 @@ -198,15 +198,15 @@ https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py311hed34c8f_1.c https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda#7f3ac694319c7eaf81a0325d6405e974 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.44.0-py311h0372a8f_1.conda#c5a5fef7f068abe2858a89ddf19e5a79 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.45.0-np2py311h50facf7_1.conda#c29c3bf5965c5831d6d759ae1b5c58b3 https://conda.anaconda.org/conda-forge/noarch/iris-3.14.1-pyha770c72_0.conda#0b6f532e907ce57be6905bd6d44fbe71 -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2025.12.17-pyhd8ed1ab_0.conda#60d5572f46988af591492c1f137d5204 +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.1.14-pyhd8ed1ab_0.conda#b62298ac3e5ab2b2b694105010492439 https://conda.anaconda.org/conda-forge/noarch/nox-2025.11.12-pyhcf101f3_0.conda#ae74047e4fe04ff7760d9529c49b7475 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda#e9fb3fe8a5b758b4aff187d434f94f03 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jquery-4.1-pyhd8ed1ab_1.conda#403185829255321ea427333f7773dd1f -https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-3.0.2-pyha770c72_0.conda#cec0cc87b40171bc323a9d80b619c9c5 +https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-3.1.0-pyha770c72_0.conda#cede6bc99a0253fa676f03cfdc666d57 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda#00534ebcc0375929b45c3039b5ba7636 https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda#f7af826063ed569bb13f7207d6f949b0 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda#3bc61f7161d28137797e038263c04c54 diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index b58381e4..2e964088 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -5,7 +5,7 @@ https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda#c3efd25ac4d74b1584d2f7a57195ddf1 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda#ad659d0a2b3e47e38d829aa8cad2d610 -https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.11.12-hbd8a1cb_0.conda#f0991f0f84902f6b6009b4d2350a83aa +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda#bddacf101bb4dd0e51811cb69c7790e2 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda#26c46f90d0e727e95c6c9498a33a09f3 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d @@ -23,7 +23,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_16.con https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_16.conda#39183d4e0c05609fd65f130633194e37 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda#8397539e3a0bbd1695584fb4f927485a -https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda#c7c83eecbb72d88b940c249af56c8b17 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda#68f68355000ec3f1d6f26ea13e8f525f https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda#db409b7c1720428638e7c0d509d3e1b5 @@ -37,7 +37,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.c https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb47aa4a_0.conda#607e13a8caac17f9a664bcab5302ce06 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.1-h480dda7_0.conda#4d4efd0645cd556fab54617c4ad477ef -https://conda.anaconda.org/conda-forge/linux-64/icu-78.1-h33c6efd_0.conda#518e9bbbc3e3486d6a4519192ba690f8 +https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda#186a18e3ba246eccfc7cff00cd19a870 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.4-h3f801dc_0.conda#01ba04e414e47f95c03d6ddd81fd37be https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda#366b40a69f0ad6072561c1d09301c886 @@ -46,7 +46,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_16.conda#40d9b534410403c821ff64f00d0adc22 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.53-h421ea60_0.conda#00d4e66b1f746cb14944cad23fffb405 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.54-h421ea60_0.conda#d361fa2a59e53b61c2675bfa073e5b7e https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_16.conda#1b3152694d236cf233b76b8c56bf0eae https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 @@ -69,21 +69,21 @@ https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.c https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda#b499ce4b026493a13774bcf0f4c33849 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda#be43915efc66345cccb3c310b6ed0374 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.1-hf4e2dac_1.conda#b1f35e70f047918b49fb4b181e40300e +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda#da5be73701eecd0e8454423fd6ffcf30 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#cd5a90476766d53e901500df9215e927 https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-hca6bf5a_1.conda#3fdd8d99683da9fe279c2f4cecd1e048 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda#8ccf913aaba749a5496c17629d859ed1 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda#000e85703f0fd9594c81710dd5066471 +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda#6f2e2c8f58160147c4d1c6f4c14cbac4 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda#c160954f7418d7b6e87eaf05a8913fa9 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_1.conda#117499f93e892ea1e57fdca16c2e8351 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.18.0-h4e3cde8_0.conda#0a5563efed19ca4461cf927419b6eb73 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda#f4084e4e6577797150f9b04a4560ceb0 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-he237659_1.conda#417955234eccd8f252b86a265ccdab7f https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd https://conda.anaconda.org/conda-forge/linux-64/python-3.12.12-hd63d673_1_cpython.conda#5c00c8cea14ee8d02941cab9121dce41 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.51.1-h04a0ce9_1.conda#941ee610ebf7a8047140831091dcb1f7 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.51.2-h04a0ce9_0.conda#bb88d9335d09e54c7e6b5529d1856917 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a @@ -92,7 +92,7 @@ https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda#53 https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py312h90b7ffd_0.conda#5b8c55fed2e576dde4b0b33693a4fdb1 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py312hdb49522_1.conda#64088dffd7413a2dd557ce837b4cbbdb https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.4-pyhd8ed1ab_0.conda#629c8fd0c11eb853732608e2454abf8e -https://conda.anaconda.org/conda-forge/noarch/certifi-2025.11.12-pyhd8ed1ab_0.conda#96a02a5c1a65470a7e4eedb644c872fd +https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda#eacc711330cd46939f66cd401ff9c44b https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda#a22d1fd9bf98827e280a02875d9a007a @@ -103,11 +103,11 @@ https://conda.anaconda.org/conda-forge/noarch/colorlog-6.10.1-pyh707e725_0.conda https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda#4c2a8fef270f6c69591889b93f9f55c1 https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc -https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.2-pyhd8ed1ab_0.conda#7e7cf4d6c2be6991e6ae2b3f4331701c +https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.3-pyhd8ed1ab_0.conda#2cfaaccf085c133a477f0a7a8657afe9 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda#4afc585cd97ba8a23809406cd8a9eda8 -https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.12.0-pyhd8ed1ab_0.conda#a3b9510e2491c20c7fc0f5e730227fbb -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h1b119a7_104.conda#0857f4d157820dcd5625f61fdfefb780 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.1.0-pyhd8ed1ab_0.conda#1daaf94a304a27ba3446a306235a37ea +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h1b119a7_105.conda#d58cd79121dd51128f2a5dab44edf1ea https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda#daddf757c3ecd6067b9af1df1f25d89e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac @@ -121,30 +121,29 @@ https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_open https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_0.conda#f775a43412f7f3d7ed218113ad233869 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 -https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 +https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda#b76541e68fea4d511b1ac46a28dcd2c6 https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.0-py312h50c33e8_0.conda#923b06ad75b7acc888fa20a22dc397cd https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda#1bd2e65c8c7ef24f4639ae6e850dacc2 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda#d7585b6550ad04c8c5e21097ada2888e -https://conda.anaconda.org/conda-forge/linux-64/proj-9.7.1-h99ae125_0.conda#8bbc19a6e87fbe8b97796e9a42a47a30 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.7.1-he0df7b0_2.conda#beb1885cfdb793193bba83c9720d53b1 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.1-pyhcf101f3_0.conda#d837065e4e0de4962c3462079c23f969 +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda#3687cc0b82a8b4c17e1f0eb7e47163d5 https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.3-pyhd8ed1ab_0.conda#c138c7aaa6a10b5762dcd92247864aff https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.6.0-py312h0d868a3_1.conda#1cfb9b04c827219597def32c22fb9ca2 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_0.conda#fba10c2007c8b06f77c5a23ce3a635ad https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda#0dc48b4b570931adc8641e55c6c17fe4 -https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e +https://conda.anaconda.org/conda-forge/noarch/setuptools-80.10.1-pyh332efcf_0.conda#cb72cedd94dd923c6a9405a3d3b1c018 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda#03fe290994c5e4ec17293cfb6bdce520 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda#755cf22df8693aa0d1aec1c123fa5863 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb -https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda#d2732eb636c264dc9aa4cbee404b1a53 +https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda#72e780e9aa2d0a3295f59b1874e3768b https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda#c07a6153f8306e45794774cf9b13bd32 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.0-py312h4c3975b_1.conda#a0b8efbe73c90f810a171a6c746be087 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda#30cd29cb87d819caead4d55184c1d115 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 @@ -154,42 +153,43 @@ https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda#8e662bd460bda79b1ea39194e3c4c9ab https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.61.1-py312h8a5da7c_0.conda#3bf8fb959dc598c67dac0430b4aff57a https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 -https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhd8ed1ab_0.conda#4b69232755285701bc86a5afe4d9933a +https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda#b8993c19b0c32a2f7b66cbb58ca27069 https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda#04558c96691bed63104678757beb4f8d https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.3-nompi_h11f7409_103.conda#3ccff1066c05a1e6c221356eecc40581 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda#eb52d14a901e23c39e9e7b4a1a5c015f -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.0-py312h33ff503_0.conda#4ba148299453b88d8fa9b6351eaa0df8 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.1-py312h33ff503_0.conda#ba7e6cb06c372eae6f164623e6e06db8 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/noarch/pip-25.3-pyh8b19718_0.conda#c55515ca43c6444d2572e0f0d93cb6b9 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py312h9b6a7d9_2.conda#573b9a879a3a42990f9c51d7376dce6b https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda#28687768633154993d521aecfa4a56ac https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.35.4-pyhd8ed1ab_0.conda#cfccfd4e8d9de82ed75c8e2c91cab375 -https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.0-pyhcf101f3_0.conda#9958d4a1ee7e9c768fe8f4fb51bd07ea -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312h4f23490_2.conda#ff4b5976814bc00861f962276c8fb87f -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312hd9148b4_3.conda#86cf7a7d861b79d38e3f0e5097e4965b -https://conda.anaconda.org/conda-forge/noarch/dask-core-2025.12.0-pyhcf101f3_1.conda#cc7b371edd70319942c802c7d828a428 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.36.1-pyhd8ed1ab_0.conda#6b0259cea8ffa6b66b35bae0ca01c447 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.46.3-pyhd8ed1ab_0.conda#bdbd7385b4a67025ac2dba4ef8cb6a8f +https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda#11a2b8c732d215d977998ccd69a9d5e8 +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py312h4f23490_1.conda#84bf349fad55056ed326fc550671b65c +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda#43c2bc96af3ae5ed9e8a10ded942aa50 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.1.1-pyhcf101f3_1.conda#91e3b2a0d014ac032c066a2e18051686 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a04073db11c2c86c555fb088acc8f8c1 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h4f23490_2.conda#cec5bc5f7d374f8f8095f8e28e31f6cb +https://conda.anaconda.org/conda-forge/noarch/pip-25.3-pyh8b19718_0.conda#c55515ca43c6444d2572e0f0d93cb6b9 https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda#2b694bad8a50dc2f712f5368de866480 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.3-py312h54fa4ab_2.conda#e82683871cbc4bb257b7694f31a91327 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.0-py312h54fa4ab_1.conda#828eb07c4c87c38ed8c6560c25893280 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0.conda#e2e4d7094d0580ccd62e2a41947444f3 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py312h383787d_2.conda#69e400d3deca12ee7afd4b73a5596905 -https://conda.anaconda.org/conda-forge/noarch/tox-4.32.0-pyhcf101f3_0.conda#1b49a3b817df5c88742219c4d6e5ee57 +https://conda.anaconda.org/conda-forge/noarch/tox-4.34.1-pyhcf101f3_0.conda#1e1c68df36eb6e419c7c833291443552 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312hd9148b4_6.conda#f30ece80e76f9cc96e30cc5c71d2818e -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.2-pyhd8ed1ab_0.conda#4949ca7b83065cfe94ebe320aece8c72 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda#9272daa869e03efe68833e3dc7a02130 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py312h5253ce2_1.conda#02738ff9855946075cbd1b5274399a41 -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py312h4f23490_1.conda#ac0a1a874ce9e3f8940a3a908ff74da9 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.44.0-h83bc92c_0.conda#2d37fd4ccfd98453a02a278e4112da39 +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.1-py312h4f23490_0.conda#6aef45ba3c0123547eb7b0f15852cac9 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.45.0-h83bc92c_0.conda#a981ecc85b1ff6307b8f09cf66b77083 https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.15-pyhd8ed1ab_0.conda#25f954b7dae6dd7b0dc004dab74f1ce9 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.16-pyhd8ed1ab_0.conda#8bc5851c415865334882157127e75799 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py312he3d6523_0.conda#b8dc157bbbb69c1407478feede8b7b42 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.3-nompi_py312hf6400b3_100.conda#ed7ab4073fe4c48d0f9d3a80b6a17f74 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py312h25f8dc5_102.conda#99217b58c029977345b72bb36a1f6596 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda#6891acad5e136cb62a8c2ed2679d6528 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda#c65df89a0b2e321045a9e01d1337b182 @@ -198,15 +198,15 @@ https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py312hf79963d_1.c https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda#7f3ac694319c7eaf81a0325d6405e974 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.44.0-py312h4f23490_1.conda#eea306a68c483e1305381130b35a09ff +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.45.0-np2py312hfb8c2c5_1.conda#66f8d5e7005b9d38b4c1cd00068881ae https://conda.anaconda.org/conda-forge/noarch/iris-3.14.1-pyha770c72_0.conda#0b6f532e907ce57be6905bd6d44fbe71 -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2025.12.17-pyhd8ed1ab_0.conda#60d5572f46988af591492c1f137d5204 +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.1.14-pyhd8ed1ab_0.conda#b62298ac3e5ab2b2b694105010492439 https://conda.anaconda.org/conda-forge/noarch/nox-2025.11.12-pyhcf101f3_0.conda#ae74047e4fe04ff7760d9529c49b7475 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda#e9fb3fe8a5b758b4aff187d434f94f03 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jquery-4.1-pyhd8ed1ab_1.conda#403185829255321ea427333f7773dd1f -https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-3.0.2-pyha770c72_0.conda#cec0cc87b40171bc323a9d80b619c9c5 +https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-3.1.0-pyha770c72_0.conda#cede6bc99a0253fa676f03cfdc666d57 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda#00534ebcc0375929b45c3039b5ba7636 https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda#f7af826063ed569bb13f7207d6f949b0 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda#3bc61f7161d28137797e038263c04c54 diff --git a/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/second_order_packing.cml b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/second_order_packing.cml index a62118c9..9d89d7c5 100644 --- a/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/second_order_packing.cml +++ b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/second_order_packing.cml @@ -22,7 +22,7 @@ - + From 7cae4a10e8690ae9a87528741aef83ffa605abde Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 29 Jan 2026 12:41:38 +0000 Subject: [PATCH 533/583] Bump the dependencies group with 3 updates (#749) Bumps the dependencies group with 3 updates: [scitools/workflows/.github/workflows/ci-manifest.yml](https://github.com/scitools/workflows), [scitools/workflows/.github/workflows/ci-template-check.yml](https://github.com/scitools/workflows) and [scitools/workflows/.github/workflows/refresh-lockfiles.yml](https://github.com/scitools/workflows). Updates `scitools/workflows/.github/workflows/ci-manifest.yml` from 2026.01.0 to 2026.01.1 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2026.01.0...2026.01.1) Updates `scitools/workflows/.github/workflows/ci-template-check.yml` from 2026.01.0 to 2026.01.1 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2026.01.0...2026.01.1) Updates `scitools/workflows/.github/workflows/refresh-lockfiles.yml` from 2026.01.0 to 2026.01.1 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2026.01.0...2026.01.1) --- updated-dependencies: - dependency-name: scitools/workflows/.github/workflows/ci-manifest.yml dependency-version: 2026.01.1 dependency-type: direct:production dependency-group: dependencies - dependency-name: scitools/workflows/.github/workflows/ci-template-check.yml dependency-version: 2026.01.1 dependency-type: direct:production dependency-group: dependencies - dependency-name: scitools/workflows/.github/workflows/refresh-lockfiles.yml dependency-version: 2026.01.1 dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/ci-template-check.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 41c84abe..3bc567b6 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2026.01.0 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2026.01.1 diff --git a/.github/workflows/ci-template-check.yml b/.github/workflows/ci-template-check.yml index cc9f85ae..6f97bdd1 100644 --- a/.github/workflows/ci-template-check.yml +++ b/.github/workflows/ci-template-check.yml @@ -10,7 +10,7 @@ on: jobs: prompt-share: - uses: scitools/workflows/.github/workflows/ci-template-check.yml@2026.01.0 + uses: scitools/workflows/.github/workflows/ci-template-check.yml@2026.01.1 secrets: inherit with: pr_number: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 46d31e19..a1f6a9ed 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2026.01.0 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2026.01.1 secrets: inherit From 961a84c4f54bfe1fc1b3559320295c0fbc90f760 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 2 Feb 2026 10:43:07 +0000 Subject: [PATCH 534/583] Updated environment lockfiles (#750) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 22 +++++++++++----------- requirements/locks/py311-linux-64.lock | 22 +++++++++++----------- requirements/locks/py312-linux-64.lock | 22 +++++++++++----------- 3 files changed, 33 insertions(+), 33 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index d8f6f14a..4088d1f9 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -18,7 +18,7 @@ https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda# https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda#72c8fd1af66bd67bf580645b426513ed https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda#6c77a605a7a689d17d4819c0f8ac9a00 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda#8b09ae86839581147ef2e5c5e229d164 -https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda#35f29eec58405aaf55e01cb470d8c26a +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda#a360c33a5abe61c07959e449fa1453eb https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_16.conda#5a68259fac2da8f2ee6f7bfe49c9eb8b https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_16.conda#39183d4e0c05609fd65f130633194e37 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 @@ -30,7 +30,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda# https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda#9ee58d5c534af06558933af3c845a780 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda#f61eb8cd60ff9057122a3d338b99c00f https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda#b2895afaf55bf96a8c8282a2e47a5de0 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda#1dafce8548e38671bea82e3f5c6ce22f @@ -39,7 +39,7 @@ https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.1-h480dda7_0.conda#4d4efd0645cd556fab54617c4ad477ef https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda#186a18e3ba246eccfc7cff00cd19a870 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 -https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.4-h3f801dc_0.conda#01ba04e414e47f95c03d6ddd81fd37be +https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda#86f7414544ae606282352fa1e116b41f https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda#366b40a69f0ad6072561c1d09301c886 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda#4ffbb341c8b616aa2494b6afb26a0c5f https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b @@ -56,7 +56,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda#d7d95fc8287ea7bf33e0e7116d2b95ec https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda#98b6c9dc80eb87b2519b97bcf7e578dd -https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda#86bc20552bf46075e3d92b67f089172d +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda#cffd3bdd58090148f4cfcd831f4b26ab https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.2-hceb46e0_1.conda#40feea2979654ed579f1cda7c63ccb94 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda#4a13eeac0b5c8e5b8ab496e6c4ddd829 @@ -82,16 +82,16 @@ https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.18.0-h4e3cde8_0.conda# https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda#f4084e4e6577797150f9b04a4560ceb0 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-he237659_1.conda#417955234eccd8f252b86a265ccdab7f https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd -https://conda.anaconda.org/conda-forge/linux-64/python-3.10.19-h3c07f61_2_cpython.conda#27ac896a8b4970f8977503a9e70dc745 +https://conda.anaconda.org/conda-forge/linux-64/python-3.10.19-h3c07f61_3_cpython.conda#be48679ccfbc8710dea1d5970600fa04 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.51.2-h04a0ce9_0.conda#bb88d9335d09e54c7e6b5529d1856917 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda#34e54f03dfea3e7a2dcf1453a85f1085 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda#8f37c8fb7116a18da04e52fa9e2c8df9 https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda#537296d57ea995666c68c821b00e360b https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py310h69bd2ac_0.conda#276a3ddf300498921601822e3b407088 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py310hba01987_1.conda#393fca4557fbd2c4d995dcb89f569048 -https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.4-pyhd8ed1ab_0.conda#629c8fd0c11eb853732608e2454abf8e +https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.6-pyhd8ed1ab_0.conda#9e5f8e2fe9770c4730163d2e289adb53 https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda#eacc711330cd46939f66cd401ff9c44b https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c @@ -134,7 +134,7 @@ https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#4 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.6.0-py310hf3bd8b6_1.conda#a49d7089a9d44aa209f970fc0e5abd1c https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py310h3406613_0.conda#bc058b3b89fcb525bb4977832aa52014 -https://conda.anaconda.org/conda-forge/noarch/setuptools-80.10.1-pyh332efcf_0.conda#cb72cedd94dd923c6a9405a3d3b1c018 +https://conda.anaconda.org/conda-forge/noarch/setuptools-80.10.2-pyh332efcf_0.conda#7b446fcbb6779ee479debb4fd7453e6c https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda#03fe290994c5e4ec17293cfb6bdce520 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda#755cf22df8693aa0d1aec1c123fa5863 @@ -147,7 +147,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.cond https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda#30cd29cb87d819caead4d55184c1d115 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py310he7384ee_1.conda#803e2d778b8dcccdc014127ec5001681 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.1-py310h3406613_0.conda#c41ab071ecc2686b335edcfcb0727f87 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.2-py310h3406613_0.conda#e0be08915e346de9a1308c2c9baa865f https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda#8e662bd460bda79b1ea39194e3c4c9ab https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.61.1-py310h3406613_0.conda#24fa891e40acdb1c7f51efd0c5f97084 @@ -179,7 +179,7 @@ https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.con https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0.conda#e2e4d7094d0580ccd62e2a41947444f3 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py310hc8bbb35_2.conda#0937b0e88a24c82e02d5b714acc9957c https://conda.anaconda.org/conda-forge/noarch/tox-4.34.1-pyhcf101f3_0.conda#1e1c68df36eb6e419c7c833291443552 -https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310h03d9f68_6.conda#34778c3f9a6ea19610e7e340dc2caaab +https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py310h03d9f68_0.conda#c3b1f5bc28ae6282ba95156d18fde825 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda#9272daa869e03efe68833e3dc7a02130 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py310h139afa4_1.conda#3741aefc198dfed2e3c9adc79d706bb7 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py310hf779ad0_1.conda#5e4aea6b728177b53e8a216922ebd6a2 @@ -199,7 +199,7 @@ https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda#7f3ac694319c7eaf81a0325d6405e974 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.45.0-np2py310h99de88f_1.conda#775e439c57d4c2f8e54cae32c6d5ce5e https://conda.anaconda.org/conda-forge/noarch/iris-3.11.1-pyha770c72_1.conda#f501583062225a070455d011d81b07bf -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.1.14-pyhd8ed1ab_0.conda#b62298ac3e5ab2b2b694105010492439 +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.1.27-pyhd8ed1ab_0.conda#178bc8ae5daecc7bbcfbf51aad35ddf6 https://conda.anaconda.org/conda-forge/noarch/nox-2025.11.12-pyhcf101f3_0.conda#ae74047e4fe04ff7760d9529c49b7475 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 6d61883c..9b0937a0 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -18,7 +18,7 @@ https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda# https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda#72c8fd1af66bd67bf580645b426513ed https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda#6c77a605a7a689d17d4819c0f8ac9a00 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda#8b09ae86839581147ef2e5c5e229d164 -https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda#35f29eec58405aaf55e01cb470d8c26a +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda#a360c33a5abe61c07959e449fa1453eb https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_16.conda#5a68259fac2da8f2ee6f7bfe49c9eb8b https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_16.conda#39183d4e0c05609fd65f130633194e37 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 @@ -30,7 +30,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda# https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda#9ee58d5c534af06558933af3c845a780 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda#f61eb8cd60ff9057122a3d338b99c00f https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda#b2895afaf55bf96a8c8282a2e47a5de0 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda#1dafce8548e38671bea82e3f5c6ce22f @@ -39,7 +39,7 @@ https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.1-h480dda7_0.conda#4d4efd0645cd556fab54617c4ad477ef https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda#186a18e3ba246eccfc7cff00cd19a870 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 -https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.4-h3f801dc_0.conda#01ba04e414e47f95c03d6ddd81fd37be +https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda#86f7414544ae606282352fa1e116b41f https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda#366b40a69f0ad6072561c1d09301c886 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda#4ffbb341c8b616aa2494b6afb26a0c5f https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b @@ -56,7 +56,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda#d7d95fc8287ea7bf33e0e7116d2b95ec https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda#98b6c9dc80eb87b2519b97bcf7e578dd -https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda#86bc20552bf46075e3d92b67f089172d +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda#cffd3bdd58090148f4cfcd831f4b26ab https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.2-hceb46e0_1.conda#40feea2979654ed579f1cda7c63ccb94 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda#4a13eeac0b5c8e5b8ab496e6c4ddd829 @@ -82,16 +82,16 @@ https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.18.0-h4e3cde8_0.conda# https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda#f4084e4e6577797150f9b04a4560ceb0 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-he237659_1.conda#417955234eccd8f252b86a265ccdab7f https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd -https://conda.anaconda.org/conda-forge/linux-64/python-3.11.14-hd63d673_2_cpython.conda#c4202a55b4486314fbb8c11bc43a29a0 +https://conda.anaconda.org/conda-forge/linux-64/python-3.11.14-hd63d673_3_cpython.conda#26d8f4db8c578dedba9f2c11423e59e5 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.51.2-h04a0ce9_0.conda#bb88d9335d09e54c7e6b5529d1856917 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda#34e54f03dfea3e7a2dcf1453a85f1085 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda#8f37c8fb7116a18da04e52fa9e2c8df9 https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda#537296d57ea995666c68c821b00e360b https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py311h6b1f9c4_0.conda#adda5ef2a74c9bdb338ff8a51192898a https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py311h66f275b_1.conda#86daecb8e4ed1042d5dc6efbe0152590 -https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.4-pyhd8ed1ab_0.conda#629c8fd0c11eb853732608e2454abf8e +https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.6-pyhd8ed1ab_0.conda#9e5f8e2fe9770c4730163d2e289adb53 https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda#eacc711330cd46939f66cd401ff9c44b https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c @@ -135,7 +135,7 @@ https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.6.0-py311h041eb4 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py311h3778330_0.conda#707c3d23f2476d3bfde8345b4e7d7853 https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda#0dc48b4b570931adc8641e55c6c17fe4 -https://conda.anaconda.org/conda-forge/noarch/setuptools-80.10.1-pyh332efcf_0.conda#cb72cedd94dd923c6a9405a3d3b1c018 +https://conda.anaconda.org/conda-forge/noarch/setuptools-80.10.2-pyh332efcf_0.conda#7b446fcbb6779ee479debb4fd7453e6c https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda#03fe290994c5e4ec17293cfb6bdce520 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda#755cf22df8693aa0d1aec1c123fa5863 @@ -148,7 +148,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.cond https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda#30cd29cb87d819caead4d55184c1d115 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py311h03d9500_1.conda#3912e4373de46adafd8f1e97e4bd166b -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.1-py311h3778330_0.conda#9d38ee59f3535da3ee59652dcef8fd96 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.2-py311h3778330_0.conda#b25c1e3463dde575d6701b8dee76d965 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda#8e662bd460bda79b1ea39194e3c4c9ab https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.61.1-py311h3778330_0.conda#2e8ccb31890a95d5cd90d74a11c7d5e2 @@ -181,7 +181,7 @@ https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.0-py311hbe70eeb_1.con https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0.conda#e2e4d7094d0580ccd62e2a41947444f3 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py311h8a92878_2.conda#b37c338ff0f69883188c9b3b127be059 https://conda.anaconda.org/conda-forge/noarch/tox-4.34.1-pyhcf101f3_0.conda#1e1c68df36eb6e419c7c833291443552 -https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311hdf67eae_6.conda#57e703b0057f992687fb9ad154dc48e4 +https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py311hdf67eae_0.conda#5a715cf5e3dc6cd68717c50e47dd7b6b https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda#9272daa869e03efe68833e3dc7a02130 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py311haee01d2_1.conda#ca45bfd4871af957aaa5035593d5efd2 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.1-py311h0372a8f_0.conda#dd96428f7ee2aef4dc32076631418323 @@ -200,7 +200,7 @@ https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda#7f3ac694319c7eaf81a0325d6405e974 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.45.0-np2py311h50facf7_1.conda#c29c3bf5965c5831d6d759ae1b5c58b3 https://conda.anaconda.org/conda-forge/noarch/iris-3.14.1-pyha770c72_0.conda#0b6f532e907ce57be6905bd6d44fbe71 -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.1.14-pyhd8ed1ab_0.conda#b62298ac3e5ab2b2b694105010492439 +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.1.27-pyhd8ed1ab_0.conda#178bc8ae5daecc7bbcfbf51aad35ddf6 https://conda.anaconda.org/conda-forge/noarch/nox-2025.11.12-pyhcf101f3_0.conda#ae74047e4fe04ff7760d9529c49b7475 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 2e964088..538ac97a 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -18,7 +18,7 @@ https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda# https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda#72c8fd1af66bd67bf580645b426513ed https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda#6c77a605a7a689d17d4819c0f8ac9a00 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda#8b09ae86839581147ef2e5c5e229d164 -https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda#35f29eec58405aaf55e01cb470d8c26a +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda#a360c33a5abe61c07959e449fa1453eb https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_16.conda#5a68259fac2da8f2ee6f7bfe49c9eb8b https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_16.conda#39183d4e0c05609fd65f130633194e37 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 @@ -30,7 +30,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda# https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda#9ee58d5c534af06558933af3c845a780 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda#f61eb8cd60ff9057122a3d338b99c00f https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda#b2895afaf55bf96a8c8282a2e47a5de0 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda#1dafce8548e38671bea82e3f5c6ce22f @@ -39,7 +39,7 @@ https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.1-h480dda7_0.conda#4d4efd0645cd556fab54617c4ad477ef https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda#186a18e3ba246eccfc7cff00cd19a870 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 -https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.4-h3f801dc_0.conda#01ba04e414e47f95c03d6ddd81fd37be +https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda#86f7414544ae606282352fa1e116b41f https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda#366b40a69f0ad6072561c1d09301c886 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda#4ffbb341c8b616aa2494b6afb26a0c5f https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b @@ -56,7 +56,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda#d7d95fc8287ea7bf33e0e7116d2b95ec https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda#98b6c9dc80eb87b2519b97bcf7e578dd -https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda#86bc20552bf46075e3d92b67f089172d +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda#cffd3bdd58090148f4cfcd831f4b26ab https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.2-hceb46e0_1.conda#40feea2979654ed579f1cda7c63ccb94 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda#4a13eeac0b5c8e5b8ab496e6c4ddd829 @@ -82,16 +82,16 @@ https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.18.0-h4e3cde8_0.conda# https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda#f4084e4e6577797150f9b04a4560ceb0 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-he237659_1.conda#417955234eccd8f252b86a265ccdab7f https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd -https://conda.anaconda.org/conda-forge/linux-64/python-3.12.12-hd63d673_1_cpython.conda#5c00c8cea14ee8d02941cab9121dce41 +https://conda.anaconda.org/conda-forge/linux-64/python-3.12.12-hd63d673_2_cpython.conda#c4540d3de3fa228d9fa95e31f8e97f89 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.51.2-h04a0ce9_0.conda#bb88d9335d09e54c7e6b5529d1856917 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda#febbab7d15033c913d53c7a2c102309d +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda#34e54f03dfea3e7a2dcf1453a85f1085 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda#8f37c8fb7116a18da04e52fa9e2c8df9 https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda#537296d57ea995666c68c821b00e360b https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py312h90b7ffd_0.conda#5b8c55fed2e576dde4b0b33693a4fdb1 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py312hdb49522_1.conda#64088dffd7413a2dd557ce837b4cbbdb -https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.4-pyhd8ed1ab_0.conda#629c8fd0c11eb853732608e2454abf8e +https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.6-pyhd8ed1ab_0.conda#9e5f8e2fe9770c4730163d2e289adb53 https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda#eacc711330cd46939f66cd401ff9c44b https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c @@ -135,7 +135,7 @@ https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.6.0-py312h0d868a https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_0.conda#fba10c2007c8b06f77c5a23ce3a635ad https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda#0dc48b4b570931adc8641e55c6c17fe4 -https://conda.anaconda.org/conda-forge/noarch/setuptools-80.10.1-pyh332efcf_0.conda#cb72cedd94dd923c6a9405a3d3b1c018 +https://conda.anaconda.org/conda-forge/noarch/setuptools-80.10.2-pyh332efcf_0.conda#7b446fcbb6779ee479debb4fd7453e6c https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda#03fe290994c5e4ec17293cfb6bdce520 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda#755cf22df8693aa0d1aec1c123fa5863 @@ -148,7 +148,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.cond https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda#30cd29cb87d819caead4d55184c1d115 https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py312h460c074_1.conda#648ee28dcd4e07a1940a17da62eccd40 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.1-py312h8a5da7c_0.conda#eafe0b486a7910e4a6973029c80d437f +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.2-py312h8a5da7c_0.conda#3935daadad011d007deb379b8188588d https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda#8e662bd460bda79b1ea39194e3c4c9ab https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.61.1-py312h8a5da7c_0.conda#3bf8fb959dc598c67dac0430b4aff57a @@ -181,7 +181,7 @@ https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.0-py312h54fa4ab_1.con https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0.conda#e2e4d7094d0580ccd62e2a41947444f3 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py312h383787d_2.conda#69e400d3deca12ee7afd4b73a5596905 https://conda.anaconda.org/conda-forge/noarch/tox-4.34.1-pyhcf101f3_0.conda#1e1c68df36eb6e419c7c833291443552 -https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312hd9148b4_6.conda#f30ece80e76f9cc96e30cc5c71d2818e +https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py312hd9148b4_0.conda#55fd03988b1b1bc6faabbfb5b481ecd7 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda#9272daa869e03efe68833e3dc7a02130 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py312h5253ce2_1.conda#02738ff9855946075cbd1b5274399a41 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.1-py312h4f23490_0.conda#6aef45ba3c0123547eb7b0f15852cac9 @@ -200,7 +200,7 @@ https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda#7f3ac694319c7eaf81a0325d6405e974 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.45.0-np2py312hfb8c2c5_1.conda#66f8d5e7005b9d38b4c1cd00068881ae https://conda.anaconda.org/conda-forge/noarch/iris-3.14.1-pyha770c72_0.conda#0b6f532e907ce57be6905bd6d44fbe71 -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.1.14-pyhd8ed1ab_0.conda#b62298ac3e5ab2b2b694105010492439 +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.1.27-pyhd8ed1ab_0.conda#178bc8ae5daecc7bbcfbf51aad35ddf6 https://conda.anaconda.org/conda-forge/noarch/nox-2025.11.12-pyhcf101f3_0.conda#ae74047e4fe04ff7760d9529c49b7475 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff From 6f1896440e48ed77c10644b17dc7b35eadbc2417 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 3 Feb 2026 09:47:24 +0000 Subject: [PATCH 535/583] chore: update pre-commit hooks (#751) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.14.10 → v0.14.14](https://github.com/astral-sh/ruff-pre-commit/compare/v0.14.10...v0.14.14) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 9f97ded0..85eca283 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -80,7 +80,7 @@ repos: types: [file, python] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.14.10" + rev: "v0.14.14" hooks: - id: ruff-check types: [file, python] From d331961b914720671da16724cadf60b424185339 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 6 Feb 2026 09:32:21 +0000 Subject: [PATCH 536/583] Bump the dependencies group with 3 updates (#752) Bumps the dependencies group with 3 updates: [scitools/workflows/.github/workflows/ci-manifest.yml](https://github.com/scitools/workflows), [scitools/workflows/.github/workflows/ci-template-check.yml](https://github.com/scitools/workflows) and [scitools/workflows/.github/workflows/refresh-lockfiles.yml](https://github.com/scitools/workflows). Updates `scitools/workflows/.github/workflows/ci-manifest.yml` from 2026.01.1 to 2026.02.0 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2026.01.1...2026.02.0) Updates `scitools/workflows/.github/workflows/ci-template-check.yml` from 2026.01.1 to 2026.02.0 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2026.01.1...2026.02.0) Updates `scitools/workflows/.github/workflows/refresh-lockfiles.yml` from 2026.01.1 to 2026.02.0 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2026.01.1...2026.02.0) --- updated-dependencies: - dependency-name: scitools/workflows/.github/workflows/ci-manifest.yml dependency-version: 2026.02.0 dependency-type: direct:production dependency-group: dependencies - dependency-name: scitools/workflows/.github/workflows/ci-template-check.yml dependency-version: 2026.02.0 dependency-type: direct:production dependency-group: dependencies - dependency-name: scitools/workflows/.github/workflows/refresh-lockfiles.yml dependency-version: 2026.02.0 dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/ci-template-check.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 3bc567b6..d724c232 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2026.01.1 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2026.02.0 diff --git a/.github/workflows/ci-template-check.yml b/.github/workflows/ci-template-check.yml index 6f97bdd1..32f74f90 100644 --- a/.github/workflows/ci-template-check.yml +++ b/.github/workflows/ci-template-check.yml @@ -10,7 +10,7 @@ on: jobs: prompt-share: - uses: scitools/workflows/.github/workflows/ci-template-check.yml@2026.01.1 + uses: scitools/workflows/.github/workflows/ci-template-check.yml@2026.02.0 secrets: inherit with: pr_number: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index a1f6a9ed..45165531 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2026.01.1 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2026.02.0 secrets: inherit From 426e0c31a676c444e4f8499078ee51b1f73e4ac0 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 9 Feb 2026 09:00:12 +0000 Subject: [PATCH 537/583] Updated environment lockfiles (#753) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 34 +++++++++++------------ requirements/locks/py311-linux-64.lock | 38 +++++++++++++------------- requirements/locks/py312-linux-64.lock | 38 +++++++++++++------------- 3 files changed, 55 insertions(+), 55 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 4088d1f9..460e08a2 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -7,10 +7,10 @@ https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.conda#05e0 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda#ad659d0a2b3e47e38d829aa8cad2d610 https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda#bddacf101bb4dd0e51811cb69c7790e2 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda#26c46f90d0e727e95c6c9498a33a09f3 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_17.conda#51b78c6a757575c0d12f4401ffc67029 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_16.conda#6d0363467e6ed84f11435eb309f2ff06 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_17.conda#3c281169ea25b987311400d7a7e28445 https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda#791365c5f65975051e4e017b5da3abf5 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda#51a19bba1b8ebfb60df25cde030b7ebc https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda#920bb03579f15389b9e512095ad995b7 @@ -19,13 +19,13 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda#6c77a605a7a689d17d4819c0f8ac9a00 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda#8b09ae86839581147ef2e5c5e229d164 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda#a360c33a5abe61c07959e449fa1453eb -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_16.conda#5a68259fac2da8f2ee6f7bfe49c9eb8b -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_16.conda#39183d4e0c05609fd65f130633194e37 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_17.conda#1478bfa85224a65ab096d69ffd2af1e5 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_17.conda#202fdf8cad9eea704c2b0d823d1732bf https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda#8397539e3a0bbd1695584fb4f927485a https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda#c7c83eecbb72d88b940c249af56c8b17 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda#68f68355000ec3f1d6f26ea13e8f525f +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_17.conda#24c2fe35fa45cd71214beba6f337c071 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda#db409b7c1720428638e7c0d509d3e1b5 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 @@ -44,11 +44,11 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.co https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda#4ffbb341c8b616aa2494b6afb26a0c5f https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_16.conda#40d9b534410403c821ff64f00d0adc22 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_17.conda#a6c682ac611cb1fa4d73478f9e6efb06 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.54-h421ea60_0.conda#d361fa2a59e53b61c2675bfa073e5b7e https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_16.conda#1b3152694d236cf233b76b8c56bf0eae +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_17.conda#ea12f5a6bf12c88c06750d9803e1a570 https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc @@ -58,13 +58,13 @@ https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda#d7 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda#98b6c9dc80eb87b2519b97bcf7e578dd https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda#cffd3bdd58090148f4cfcd831f4b26ab https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 -https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.2-hceb46e0_1.conda#40feea2979654ed579f1cda7c63ccb94 +https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda#2aadb0d17215603a82a2a6b0afd9a4cb https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda#4a13eeac0b5c8e5b8ab496e6c4ddd829 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda#af39b9a8711d4a8d437b52c1d78eb6a1 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_105.conda#3ec0aa5037d39b06554109a01e6fb0c6 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda#12bd9a3f089ee6c9266a37dab82afabd https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda#8e7251989bca326a28f4a5ffbd74557a https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda#b499ce4b026493a13774bcf0f4c33849 @@ -91,7 +91,7 @@ https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda#537296d57ea995666c68c821b00e360b https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py310h69bd2ac_0.conda#276a3ddf300498921601822e3b407088 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py310hba01987_1.conda#393fca4557fbd2c4d995dcb89f569048 -https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.6-pyhd8ed1ab_0.conda#9e5f8e2fe9770c4730163d2e289adb53 +https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.0-pyhd8ed1ab_0.conda#715059df4fa9f291a2d84954b274b71b https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda#eacc711330cd46939f66cd401ff9c44b https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c @@ -106,8 +106,8 @@ https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.3-pyhd8ed1ab_0.conda#2cfaaccf085c133a477f0a7a8657afe9 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda#4afc585cd97ba8a23809406cd8a9eda8 -https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.1.0-pyhd8ed1ab_0.conda#1daaf94a304a27ba3446a306235a37ea -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h1b119a7_105.conda#d58cd79121dd51128f2a5dab44edf1ea +https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.2.0-pyhd8ed1ab_0.conda#496c6c9411a6284addf55c898d6ed8d7 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h19486de_106.conda#c223ee1429ba538f3e48cfb4a0b97357 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda#daddf757c3ecd6067b9af1df1f25d89e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac @@ -133,7 +133,7 @@ https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.3-pyhd8ed1ab_0.conda#c13 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.6.0-py310hf3bd8b6_1.conda#a49d7089a9d44aa209f970fc0e5abd1c https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py310h3406613_0.conda#bc058b3b89fcb525bb4977832aa52014 +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py310h3406613_1.conda#2160894f57a40d2d629a34ee8497795f https://conda.anaconda.org/conda-forge/noarch/setuptools-80.10.2-pyh332efcf_0.conda#7b446fcbb6779ee479debb4fd7453e6c https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda#03fe290994c5e4ec17293cfb6bdce520 @@ -145,9 +145,9 @@ https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.0-py310h7c4b9e2_1.conda#b1ccdb989be682ab0dd430c1c15d5012 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda#30cd29cb87d819caead4d55184c1d115 -https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 +https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_0.conda#ea5be9abc2939c8431893b4e123a2065 https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py310he7384ee_1.conda#803e2d778b8dcccdc014127ec5001681 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.2-py310h3406613_0.conda#e0be08915e346de9a1308c2c9baa865f +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.3-py310h3406613_0.conda#5939bd2a4f49dc77bff80949c12b3521 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda#8e662bd460bda79b1ea39194e3c4c9ab https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.61.1-py310h3406613_0.conda#24fa891e40acdb1c7f51efd0c5f97084 @@ -173,7 +173,7 @@ https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py310h3788b33_0. https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.7.0-h40b2b14_1.conda#8a77895fb29728b736a1a6c75906ea1a https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a04073db11c2c86c555fb088acc8f8c1 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py310hf779ad0_2.conda#4906d8c3680f6c1273ad5a5775807867 -https://conda.anaconda.org/conda-forge/noarch/pip-25.3-pyh8b19718_0.conda#c55515ca43c6444d2572e0f0d93cb6b9 +https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh8b19718_0.conda#67bdec43082fd8a9cffb9484420b39a2 https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda#2b694bad8a50dc2f712f5368de866480 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.conda#8c29cd33b64b2eb78597fa28b5595c8d https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0.conda#e2e4d7094d0580ccd62e2a41947444f3 @@ -199,7 +199,7 @@ https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda#7f3ac694319c7eaf81a0325d6405e974 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.45.0-np2py310h99de88f_1.conda#775e439c57d4c2f8e54cae32c6d5ce5e https://conda.anaconda.org/conda-forge/noarch/iris-3.11.1-pyha770c72_1.conda#f501583062225a070455d011d81b07bf -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.1.27-pyhd8ed1ab_0.conda#178bc8ae5daecc7bbcfbf51aad35ddf6 +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.2.3-pyhd8ed1ab_0.conda#99b90c09aac09a766864e2ef73966f3f https://conda.anaconda.org/conda-forge/noarch/nox-2025.11.12-pyhcf101f3_0.conda#ae74047e4fe04ff7760d9529c49b7475 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 9b0937a0..a8e21f4b 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -7,10 +7,10 @@ https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda#8fcb https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda#ad659d0a2b3e47e38d829aa8cad2d610 https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda#bddacf101bb4dd0e51811cb69c7790e2 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda#26c46f90d0e727e95c6c9498a33a09f3 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_17.conda#51b78c6a757575c0d12f4401ffc67029 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_16.conda#6d0363467e6ed84f11435eb309f2ff06 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_17.conda#3c281169ea25b987311400d7a7e28445 https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda#791365c5f65975051e4e017b5da3abf5 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda#51a19bba1b8ebfb60df25cde030b7ebc https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda#920bb03579f15389b9e512095ad995b7 @@ -19,13 +19,13 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda#6c77a605a7a689d17d4819c0f8ac9a00 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda#8b09ae86839581147ef2e5c5e229d164 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda#a360c33a5abe61c07959e449fa1453eb -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_16.conda#5a68259fac2da8f2ee6f7bfe49c9eb8b -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_16.conda#39183d4e0c05609fd65f130633194e37 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_17.conda#1478bfa85224a65ab096d69ffd2af1e5 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_17.conda#202fdf8cad9eea704c2b0d823d1732bf https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda#8397539e3a0bbd1695584fb4f927485a https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda#c7c83eecbb72d88b940c249af56c8b17 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda#68f68355000ec3f1d6f26ea13e8f525f +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_17.conda#24c2fe35fa45cd71214beba6f337c071 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda#db409b7c1720428638e7c0d509d3e1b5 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 @@ -44,11 +44,11 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.co https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda#4ffbb341c8b616aa2494b6afb26a0c5f https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_16.conda#40d9b534410403c821ff64f00d0adc22 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_17.conda#a6c682ac611cb1fa4d73478f9e6efb06 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.54-h421ea60_0.conda#d361fa2a59e53b61c2675bfa073e5b7e https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_16.conda#1b3152694d236cf233b76b8c56bf0eae +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_17.conda#ea12f5a6bf12c88c06750d9803e1a570 https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc @@ -58,13 +58,13 @@ https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda#d7 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda#98b6c9dc80eb87b2519b97bcf7e578dd https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda#cffd3bdd58090148f4cfcd831f4b26ab https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 -https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.2-hceb46e0_1.conda#40feea2979654ed579f1cda7c63ccb94 +https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda#2aadb0d17215603a82a2a6b0afd9a4cb https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda#4a13eeac0b5c8e5b8ab496e6c4ddd829 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda#af39b9a8711d4a8d437b52c1d78eb6a1 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_105.conda#3ec0aa5037d39b06554109a01e6fb0c6 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda#12bd9a3f089ee6c9266a37dab82afabd https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda#8e7251989bca326a28f4a5ffbd74557a https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda#b499ce4b026493a13774bcf0f4c33849 @@ -91,7 +91,7 @@ https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda#537296d57ea995666c68c821b00e360b https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py311h6b1f9c4_0.conda#adda5ef2a74c9bdb338ff8a51192898a https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py311h66f275b_1.conda#86daecb8e4ed1042d5dc6efbe0152590 -https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.6-pyhd8ed1ab_0.conda#9e5f8e2fe9770c4730163d2e289adb53 +https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.0-pyhd8ed1ab_0.conda#715059df4fa9f291a2d84954b274b71b https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda#eacc711330cd46939f66cd401ff9c44b https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c @@ -106,8 +106,8 @@ https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.3-pyhd8ed1ab_0.conda#2cfaaccf085c133a477f0a7a8657afe9 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda#4afc585cd97ba8a23809406cd8a9eda8 -https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.1.0-pyhd8ed1ab_0.conda#1daaf94a304a27ba3446a306235a37ea -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h1b119a7_105.conda#d58cd79121dd51128f2a5dab44edf1ea +https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.2.0-pyhd8ed1ab_0.conda#496c6c9411a6284addf55c898d6ed8d7 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h19486de_106.conda#c223ee1429ba538f3e48cfb4a0b97357 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda#daddf757c3ecd6067b9af1df1f25d89e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac @@ -133,7 +133,7 @@ https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.3-pyhd8ed1ab_0.conda#c13 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.6.0-py311h041eb40_1.conda#9dcb9824894fb920414608447ccdf3ce https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py311h3778330_0.conda#707c3d23f2476d3bfde8345b4e7d7853 +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py311h3778330_1.conda#a24add9a3bababee946f3bc1c829acfe https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda#0dc48b4b570931adc8641e55c6c17fe4 https://conda.anaconda.org/conda-forge/noarch/setuptools-80.10.2-pyh332efcf_0.conda#7b446fcbb6779ee479debb4fd7453e6c https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 @@ -146,9 +146,9 @@ https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.0-py311h49ec1c0_1.conda#5e6d4026784e83c0a51c86ec428e8cc8 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda#30cd29cb87d819caead4d55184c1d115 -https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 +https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_0.conda#ea5be9abc2939c8431893b4e123a2065 https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py311h03d9500_1.conda#3912e4373de46adafd8f1e97e4bd166b -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.2-py311h3778330_0.conda#b25c1e3463dde575d6701b8dee76d965 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.3-py311h3778330_0.conda#620e453607709b49ffdc834da5887217 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda#8e662bd460bda79b1ea39194e3c4c9ab https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.61.1-py311h3778330_0.conda#2e8ccb31890a95d5cd90d74a11c7d5e2 @@ -160,7 +160,7 @@ https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda#04558c96691bed63104678757beb4f8d https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.3-nompi_h11f7409_103.conda#3ccff1066c05a1e6c221356eecc40581 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda#eb52d14a901e23c39e9e7b4a1a5c015f -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.1-py311h2e04523_0.conda#716357afd11c16214cdac522da447704 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.2-py311h2e04523_1.conda#a8105076864776eceae69d64d30e24d7 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py311h4e6619b_2.conda#8092837339ae2e3697980df6686f996e https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 @@ -172,10 +172,10 @@ https://conda.anaconda.org/conda-forge/noarch/wheel-0.46.3-pyhd8ed1ab_0.conda#bd https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda#11a2b8c732d215d977998ccd69a9d5e8 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py311h0372a8f_1.conda#77cf197e2f03986b6505bab6e214d22a https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py311h724c32c_4.conda#d04e508f5a03162c8bab4586a65d00bf -https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.1.1-pyhcf101f3_1.conda#91e3b2a0d014ac032c066a2e18051686 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.1.2-pyhcf101f3_0.conda#b20e7ce9afd59036ab194f3d1e27edf5 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a04073db11c2c86c555fb088acc8f8c1 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py311h0372a8f_2.conda#487756753716efba090d06c71fb73eb6 -https://conda.anaconda.org/conda-forge/noarch/pip-25.3-pyh8b19718_0.conda#c55515ca43c6444d2572e0f0d93cb6b9 +https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh8b19718_0.conda#67bdec43082fd8a9cffb9484420b39a2 https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda#2b694bad8a50dc2f712f5368de866480 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.0-py311hbe70eeb_1.conda#f4dda6316cc4718cbcab7009b5d60c41 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0.conda#e2e4d7094d0580ccd62e2a41947444f3 @@ -200,7 +200,7 @@ https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda#7f3ac694319c7eaf81a0325d6405e974 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.45.0-np2py311h50facf7_1.conda#c29c3bf5965c5831d6d759ae1b5c58b3 https://conda.anaconda.org/conda-forge/noarch/iris-3.14.1-pyha770c72_0.conda#0b6f532e907ce57be6905bd6d44fbe71 -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.1.27-pyhd8ed1ab_0.conda#178bc8ae5daecc7bbcfbf51aad35ddf6 +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.2.3-pyhd8ed1ab_0.conda#99b90c09aac09a766864e2ef73966f3f https://conda.anaconda.org/conda-forge/noarch/nox-2025.11.12-pyhcf101f3_0.conda#ae74047e4fe04ff7760d9529c49b7475 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 538ac97a..7b2cecb7 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -7,10 +7,10 @@ https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda#c3ef https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda#ad659d0a2b3e47e38d829aa8cad2d610 https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda#bddacf101bb4dd0e51811cb69c7790e2 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda#26c46f90d0e727e95c6c9498a33a09f3 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_17.conda#51b78c6a757575c0d12f4401ffc67029 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_16.conda#6d0363467e6ed84f11435eb309f2ff06 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_17.conda#3c281169ea25b987311400d7a7e28445 https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda#791365c5f65975051e4e017b5da3abf5 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda#51a19bba1b8ebfb60df25cde030b7ebc https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda#920bb03579f15389b9e512095ad995b7 @@ -19,13 +19,13 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda#6c77a605a7a689d17d4819c0f8ac9a00 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda#8b09ae86839581147ef2e5c5e229d164 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda#a360c33a5abe61c07959e449fa1453eb -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_16.conda#5a68259fac2da8f2ee6f7bfe49c9eb8b -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_16.conda#39183d4e0c05609fd65f130633194e37 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_17.conda#1478bfa85224a65ab096d69ffd2af1e5 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_17.conda#202fdf8cad9eea704c2b0d823d1732bf https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda#8397539e3a0bbd1695584fb4f927485a https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda#c7c83eecbb72d88b940c249af56c8b17 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda#68f68355000ec3f1d6f26ea13e8f525f +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_17.conda#24c2fe35fa45cd71214beba6f337c071 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda#db409b7c1720428638e7c0d509d3e1b5 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 @@ -44,11 +44,11 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.co https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda#4ffbb341c8b616aa2494b6afb26a0c5f https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_16.conda#40d9b534410403c821ff64f00d0adc22 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_17.conda#a6c682ac611cb1fa4d73478f9e6efb06 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.54-h421ea60_0.conda#d361fa2a59e53b61c2675bfa073e5b7e https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_16.conda#1b3152694d236cf233b76b8c56bf0eae +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_17.conda#ea12f5a6bf12c88c06750d9803e1a570 https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc @@ -58,13 +58,13 @@ https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda#d7 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda#98b6c9dc80eb87b2519b97bcf7e578dd https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda#cffd3bdd58090148f4cfcd831f4b26ab https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 -https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.2-hceb46e0_1.conda#40feea2979654ed579f1cda7c63ccb94 +https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda#2aadb0d17215603a82a2a6b0afd9a4cb https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda#4a13eeac0b5c8e5b8ab496e6c4ddd829 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda#af39b9a8711d4a8d437b52c1d78eb6a1 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_105.conda#3ec0aa5037d39b06554109a01e6fb0c6 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda#12bd9a3f089ee6c9266a37dab82afabd https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda#8e7251989bca326a28f4a5ffbd74557a https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda#b499ce4b026493a13774bcf0f4c33849 @@ -91,7 +91,7 @@ https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda#537296d57ea995666c68c821b00e360b https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py312h90b7ffd_0.conda#5b8c55fed2e576dde4b0b33693a4fdb1 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py312hdb49522_1.conda#64088dffd7413a2dd557ce837b4cbbdb -https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.6-pyhd8ed1ab_0.conda#9e5f8e2fe9770c4730163d2e289adb53 +https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.0-pyhd8ed1ab_0.conda#715059df4fa9f291a2d84954b274b71b https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda#eacc711330cd46939f66cd401ff9c44b https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c @@ -106,8 +106,8 @@ https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.3-pyhd8ed1ab_0.conda#2cfaaccf085c133a477f0a7a8657afe9 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda#4afc585cd97ba8a23809406cd8a9eda8 -https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.1.0-pyhd8ed1ab_0.conda#1daaf94a304a27ba3446a306235a37ea -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h1b119a7_105.conda#d58cd79121dd51128f2a5dab44edf1ea +https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.2.0-pyhd8ed1ab_0.conda#496c6c9411a6284addf55c898d6ed8d7 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h19486de_106.conda#c223ee1429ba538f3e48cfb4a0b97357 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda#daddf757c3ecd6067b9af1df1f25d89e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac @@ -133,7 +133,7 @@ https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.3-pyhd8ed1ab_0.conda#c13 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.6.0-py312h0d868a3_1.conda#1cfb9b04c827219597def32c22fb9ca2 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_0.conda#fba10c2007c8b06f77c5a23ce3a635ad +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda#15878599a87992e44c059731771591cb https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda#0dc48b4b570931adc8641e55c6c17fe4 https://conda.anaconda.org/conda-forge/noarch/setuptools-80.10.2-pyh332efcf_0.conda#7b446fcbb6779ee479debb4fd7453e6c https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 @@ -146,9 +146,9 @@ https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.0-py312h4c3975b_1.conda#a0b8efbe73c90f810a171a6c746be087 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda#30cd29cb87d819caead4d55184c1d115 -https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 +https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_0.conda#ea5be9abc2939c8431893b4e123a2065 https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py312h460c074_1.conda#648ee28dcd4e07a1940a17da62eccd40 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.2-py312h8a5da7c_0.conda#3935daadad011d007deb379b8188588d +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.3-py312h8a5da7c_0.conda#f3c0bc6e23bd3653d74390aa644b0a95 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda#8e662bd460bda79b1ea39194e3c4c9ab https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.61.1-py312h8a5da7c_0.conda#3bf8fb959dc598c67dac0430b4aff57a @@ -160,7 +160,7 @@ https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda#04558c96691bed63104678757beb4f8d https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.3-nompi_h11f7409_103.conda#3ccff1066c05a1e6c221356eecc40581 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda#eb52d14a901e23c39e9e7b4a1a5c015f -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.1-py312h33ff503_0.conda#ba7e6cb06c372eae6f164623e6e06db8 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.2-py312h33ff503_1.conda#3569a8fca2dd3202e4ab08f42499f6d3 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py312h9b6a7d9_2.conda#573b9a879a3a42990f9c51d7376dce6b https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 @@ -172,10 +172,10 @@ https://conda.anaconda.org/conda-forge/noarch/wheel-0.46.3-pyhd8ed1ab_0.conda#bd https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda#11a2b8c732d215d977998ccd69a9d5e8 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py312h4f23490_1.conda#84bf349fad55056ed326fc550671b65c https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda#43c2bc96af3ae5ed9e8a10ded942aa50 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.1.1-pyhcf101f3_1.conda#91e3b2a0d014ac032c066a2e18051686 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.1.2-pyhcf101f3_0.conda#b20e7ce9afd59036ab194f3d1e27edf5 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a04073db11c2c86c555fb088acc8f8c1 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h4f23490_2.conda#cec5bc5f7d374f8f8095f8e28e31f6cb -https://conda.anaconda.org/conda-forge/noarch/pip-25.3-pyh8b19718_0.conda#c55515ca43c6444d2572e0f0d93cb6b9 +https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh8b19718_0.conda#67bdec43082fd8a9cffb9484420b39a2 https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda#2b694bad8a50dc2f712f5368de866480 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.0-py312h54fa4ab_1.conda#828eb07c4c87c38ed8c6560c25893280 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0.conda#e2e4d7094d0580ccd62e2a41947444f3 @@ -200,7 +200,7 @@ https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda#7f3ac694319c7eaf81a0325d6405e974 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.45.0-np2py312hfb8c2c5_1.conda#66f8d5e7005b9d38b4c1cd00068881ae https://conda.anaconda.org/conda-forge/noarch/iris-3.14.1-pyha770c72_0.conda#0b6f532e907ce57be6905bd6d44fbe71 -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.1.27-pyhd8ed1ab_0.conda#178bc8ae5daecc7bbcfbf51aad35ddf6 +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.2.3-pyhd8ed1ab_0.conda#99b90c09aac09a766864e2ef73966f3f https://conda.anaconda.org/conda-forge/noarch/nox-2025.11.12-pyhcf101f3_0.conda#ae74047e4fe04ff7760d9529c49b7475 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff From ba6c5e1229246a743a1386305e4ba0ac438ae8ce Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 16 Feb 2026 15:15:38 +0000 Subject: [PATCH 538/583] Updated environment lockfiles (#755) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 34 ++++++++++++------------ requirements/locks/py311-linux-64.lock | 36 ++++++++++++-------------- requirements/locks/py312-linux-64.lock | 36 ++++++++++++-------------- 3 files changed, 50 insertions(+), 56 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 460e08a2..cd20174c 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -2,13 +2,12 @@ # platform: linux-64 # input_hash: c9c2cc109eb8c116e9db50df49eb69ec6fe34d489a4cff5ff3dd3984e09456f4 @EXPLICIT -https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.conda#05e00f3b21e88bb3d658ac700b2ce58c https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda#ad659d0a2b3e47e38d829aa8cad2d610 https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda#bddacf101bb4dd0e51811cb69c7790e2 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_17.conda#51b78c6a757575c0d12f4401ffc67029 -https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d +https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda#a9f577daf3de00bca7c3c76c0ecbd1de https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_17.conda#3c281169ea25b987311400d7a7e28445 https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda#791365c5f65975051e4e017b5da3abf5 @@ -46,7 +45,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_17.conda#a6c682ac611cb1fa4d73478f9e6efb06 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.54-h421ea60_0.conda#d361fa2a59e53b61c2675bfa073e5b7e +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda#5f13ffc7d30ffec87864e678df9957b4 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_17.conda#ea12f5a6bf12c88c06750d9803e1a570 https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 @@ -57,13 +56,12 @@ https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9d https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda#d7d95fc8287ea7bf33e0e7116d2b95ec https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda#98b6c9dc80eb87b2519b97bcf7e578dd https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda#cffd3bdd58090148f4cfcd831f4b26ab -https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda#2aadb0d17215603a82a2a6b0afd9a4cb https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda#4a13eeac0b5c8e5b8ab496e6c4ddd829 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda#af39b9a8711d4a8d437b52c1d78eb6a1 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 -https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda#fb53fb07ce46a575c5d004bbc96032c2 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda#12bd9a3f089ee6c9266a37dab82afabd https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda#8e7251989bca326a28f4a5ffbd74557a https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d @@ -74,11 +72,11 @@ https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#c https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-hca6bf5a_1.conda#3fdd8d99683da9fe279c2f4cecd1e048 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda#861fb6ccbc677bb9a9fb2468430b9c6a https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda#8ccf913aaba749a5496c17629d859ed1 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda#6f2e2c8f58160147c4d1c6f4c14cbac4 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda#c160954f7418d7b6e87eaf05a8913fa9 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.18.0-h4e3cde8_0.conda#0a5563efed19ca4461cf927419b6eb73 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.18.0-hcf29cc6_1.conda#1707cdd636af2ff697b53186572c9f77 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda#f4084e4e6577797150f9b04a4560ceb0 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-he237659_1.conda#417955234eccd8f252b86a265ccdab7f https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd @@ -91,7 +89,7 @@ https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda#537296d57ea995666c68c821b00e360b https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py310h69bd2ac_0.conda#276a3ddf300498921601822e3b407088 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py310hba01987_1.conda#393fca4557fbd2c4d995dcb89f569048 -https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.0-pyhd8ed1ab_0.conda#715059df4fa9f291a2d84954b274b71b +https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.1-pyhd8ed1ab_0.conda#aa5a912c855a6e64e8a92e03f6fd3e96 https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda#eacc711330cd46939f66cd401ff9c44b https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c @@ -103,7 +101,7 @@ https://conda.anaconda.org/conda-forge/noarch/colorlog-6.10.1-pyh707e725_0.conda https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda#4c2a8fef270f6c69591889b93f9f55c1 https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc -https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.3-pyhd8ed1ab_0.conda#2cfaaccf085c133a477f0a7a8657afe9 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.21.2-pyhd8ed1ab_0.conda#0b3041d2b101e48bee2df46dffd6f047 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda#4afc585cd97ba8a23809406cd8a9eda8 https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.2.0-pyhd8ed1ab_0.conda#496c6c9411a6284addf55c898d6ed8d7 @@ -122,8 +120,8 @@ https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2# https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py310h3406613_0.conda#8854df4fb4e37cc3ea0a024e48c9c180 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda#b76541e68fea4d511b1ac46a28dcd2c6 -https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.0-py310h5a73078_0.conda#6fcf01b5f1d2614fbe900c2434fd3913 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda#1bd2e65c8c7ef24f4639ae6e850dacc2 +https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py310h5a73078_0.conda#5e79faa7f34986b6124525f3d234512e +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.7.0-pyhcf101f3_0.conda#2157d0900a4bc2e9a0ba3cccb8497e8c https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda#d7585b6550ad04c8c5e21097ada2888e https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h18fbb6c_2.conda#1aeede769ec2fa0f474f8b73a7ac057f https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef @@ -134,7 +132,7 @@ https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#4 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.6.0-py310hf3bd8b6_1.conda#a49d7089a9d44aa209f970fc0e5abd1c https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py310h3406613_1.conda#2160894f57a40d2d629a34ee8497795f -https://conda.anaconda.org/conda-forge/noarch/setuptools-80.10.2-pyh332efcf_0.conda#7b446fcbb6779ee479debb4fd7453e6c +https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.0-pyh332efcf_0.conda#1d00d46c634177fc8ede8b99d6089239 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda#03fe290994c5e4ec17293cfb6bdce520 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda#755cf22df8693aa0d1aec1c123fa5863 @@ -142,12 +140,12 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda#72e780e9aa2d0a3295f59b1874e3768b https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda#c07a6153f8306e45794774cf9b13bd32 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d -https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.0-py310h7c4b9e2_1.conda#b1ccdb989be682ab0dd430c1c15d5012 +https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py310h7c4b9e2_0.conda#234e9858dd691d3f597147e22cbf16cf https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda#30cd29cb87d819caead4d55184c1d115 https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_0.conda#ea5be9abc2939c8431893b4e123a2065 https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py310he7384ee_1.conda#803e2d778b8dcccdc014127ec5001681 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.3-py310h3406613_0.conda#5939bd2a4f49dc77bff80949c12b3521 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.4-py310h3406613_0.conda#be1cd42538c1a1f587ea319f756ecc37 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda#8e662bd460bda79b1ea39194e3c4c9ab https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.61.1-py310h3406613_0.conda#24fa891e40acdb1c7f51efd0c5f97084 @@ -157,7 +155,7 @@ https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc4 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda#04558c96691bed63104678757beb4f8d -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.3-nompi_h11f7409_103.conda#3ccff1066c05a1e6c221356eecc40581 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.3-nompi_hbf2fc22_104.conda#a2956b63b1851e9d5eb9f882d02fa3a9 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda#eb52d14a901e23c39e9e7b4a1a5c015f https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.6-py310hefbff90_0.conda#b0cea2c364bf65cd19e023040eeab05d https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 @@ -178,7 +176,7 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda#2b https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.conda#8c29cd33b64b2eb78597fa28b5595c8d https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0.conda#e2e4d7094d0580ccd62e2a41947444f3 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py310hc8bbb35_2.conda#0937b0e88a24c82e02d5b714acc9957c -https://conda.anaconda.org/conda-forge/noarch/tox-4.34.1-pyhcf101f3_0.conda#1e1c68df36eb6e419c7c833291443552 +https://conda.anaconda.org/conda-forge/noarch/tox-4.35.0-pyhcf101f3_0.conda#faa8b0790c984ae410cdd2aedb0a9637 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py310h03d9f68_0.conda#c3b1f5bc28ae6282ba95156d18fde825 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda#9272daa869e03efe68833e3dc7a02130 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py310h139afa4_1.conda#3741aefc198dfed2e3c9adc79d706bb7 @@ -199,8 +197,8 @@ https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda#7f3ac694319c7eaf81a0325d6405e974 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.45.0-np2py310h99de88f_1.conda#775e439c57d4c2f8e54cae32c6d5ce5e https://conda.anaconda.org/conda-forge/noarch/iris-3.11.1-pyha770c72_1.conda#f501583062225a070455d011d81b07bf -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.2.3-pyhd8ed1ab_0.conda#99b90c09aac09a766864e2ef73966f3f -https://conda.anaconda.org/conda-forge/noarch/nox-2025.11.12-pyhcf101f3_0.conda#ae74047e4fe04ff7760d9529c49b7475 +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.2.11-pyhd8ed1ab_0.conda#a2666a859b9b17cbab511faf7f49b346 +https://conda.anaconda.org/conda-forge/noarch/nox-2026.2.9-pyhcf101f3_0.conda#f59e57ff0cf84c21b070c206bbaa27db https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda#e9fb3fe8a5b758b4aff187d434f94f03 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index a8e21f4b..cbb6fe25 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -2,13 +2,12 @@ # platform: linux-64 # input_hash: 84b15051cf21e4aaa0500a4d04539836bcd04717d1bc6930fd28c616793acc49 @EXPLICIT -https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda#8fcb6b0e2161850556231336dae58358 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda#ad659d0a2b3e47e38d829aa8cad2d610 https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda#bddacf101bb4dd0e51811cb69c7790e2 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_17.conda#51b78c6a757575c0d12f4401ffc67029 -https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d +https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda#a9f577daf3de00bca7c3c76c0ecbd1de https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_17.conda#3c281169ea25b987311400d7a7e28445 https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda#791365c5f65975051e4e017b5da3abf5 @@ -46,7 +45,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_17.conda#a6c682ac611cb1fa4d73478f9e6efb06 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.54-h421ea60_0.conda#d361fa2a59e53b61c2675bfa073e5b7e +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda#5f13ffc7d30ffec87864e678df9957b4 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_17.conda#ea12f5a6bf12c88c06750d9803e1a570 https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 @@ -57,13 +56,12 @@ https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9d https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda#d7d95fc8287ea7bf33e0e7116d2b95ec https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda#98b6c9dc80eb87b2519b97bcf7e578dd https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda#cffd3bdd58090148f4cfcd831f4b26ab -https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda#2aadb0d17215603a82a2a6b0afd9a4cb https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda#4a13eeac0b5c8e5b8ab496e6c4ddd829 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda#af39b9a8711d4a8d437b52c1d78eb6a1 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 -https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda#fb53fb07ce46a575c5d004bbc96032c2 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda#12bd9a3f089ee6c9266a37dab82afabd https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda#8e7251989bca326a28f4a5ffbd74557a https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d @@ -74,11 +72,11 @@ https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#c https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-hca6bf5a_1.conda#3fdd8d99683da9fe279c2f4cecd1e048 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda#861fb6ccbc677bb9a9fb2468430b9c6a https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda#8ccf913aaba749a5496c17629d859ed1 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda#6f2e2c8f58160147c4d1c6f4c14cbac4 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda#c160954f7418d7b6e87eaf05a8913fa9 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.18.0-h4e3cde8_0.conda#0a5563efed19ca4461cf927419b6eb73 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.18.0-hcf29cc6_1.conda#1707cdd636af2ff697b53186572c9f77 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda#f4084e4e6577797150f9b04a4560ceb0 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-he237659_1.conda#417955234eccd8f252b86a265ccdab7f https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd @@ -91,7 +89,7 @@ https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda#537296d57ea995666c68c821b00e360b https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py311h6b1f9c4_0.conda#adda5ef2a74c9bdb338ff8a51192898a https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py311h66f275b_1.conda#86daecb8e4ed1042d5dc6efbe0152590 -https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.0-pyhd8ed1ab_0.conda#715059df4fa9f291a2d84954b274b71b +https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.1-pyhd8ed1ab_0.conda#aa5a912c855a6e64e8a92e03f6fd3e96 https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda#eacc711330cd46939f66cd401ff9c44b https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c @@ -103,7 +101,7 @@ https://conda.anaconda.org/conda-forge/noarch/colorlog-6.10.1-pyh707e725_0.conda https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda#4c2a8fef270f6c69591889b93f9f55c1 https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc -https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.3-pyhd8ed1ab_0.conda#2cfaaccf085c133a477f0a7a8657afe9 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.21.2-pyhd8ed1ab_0.conda#0b3041d2b101e48bee2df46dffd6f047 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda#4afc585cd97ba8a23809406cd8a9eda8 https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.2.0-pyhd8ed1ab_0.conda#496c6c9411a6284addf55c898d6ed8d7 @@ -122,10 +120,10 @@ https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2# https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py311h3778330_0.conda#0954f1a6a26df4a510b54f73b2a0345c https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda#b76541e68fea4d511b1ac46a28dcd2c6 -https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.0-py311hf88fc01_0.conda#ce51a1258d127e1c72bad676235b9d6c -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda#1bd2e65c8c7ef24f4639ae6e850dacc2 +https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py311hf88fc01_0.conda#0415141f4e3d4dad3c39ad4718936352 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.7.0-pyhcf101f3_0.conda#2157d0900a4bc2e9a0ba3cccb8497e8c https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda#d7585b6550ad04c8c5e21097ada2888e -https://conda.anaconda.org/conda-forge/linux-64/proj-9.7.1-he0df7b0_2.conda#beb1885cfdb793193bba83c9720d53b1 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.7.1-he0df7b0_3.conda#031e33ae075b336c0ce92b14efa886c5 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda#3687cc0b82a8b4c17e1f0eb7e47163d5 @@ -135,7 +133,7 @@ https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.6.0-py311h041eb4 https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py311h3778330_1.conda#a24add9a3bababee946f3bc1c829acfe https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda#0dc48b4b570931adc8641e55c6c17fe4 -https://conda.anaconda.org/conda-forge/noarch/setuptools-80.10.2-pyh332efcf_0.conda#7b446fcbb6779ee479debb4fd7453e6c +https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.0-pyh332efcf_0.conda#1d00d46c634177fc8ede8b99d6089239 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda#03fe290994c5e4ec17293cfb6bdce520 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda#755cf22df8693aa0d1aec1c123fa5863 @@ -143,12 +141,12 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda#72e780e9aa2d0a3295f59b1874e3768b https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda#c07a6153f8306e45794774cf9b13bd32 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d -https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.0-py311h49ec1c0_1.conda#5e6d4026784e83c0a51c86ec428e8cc8 +https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py311h49ec1c0_0.conda#2889f0c0b6a6d7a37bd64ec60f4cc210 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda#30cd29cb87d819caead4d55184c1d115 https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_0.conda#ea5be9abc2939c8431893b4e123a2065 https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py311h03d9500_1.conda#3912e4373de46adafd8f1e97e4bd166b -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.3-py311h3778330_0.conda#620e453607709b49ffdc834da5887217 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.4-py311h3778330_0.conda#6b1b19bdc407007d5e41079eab797ddc https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda#8e662bd460bda79b1ea39194e3c4c9ab https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.61.1-py311h3778330_0.conda#2e8ccb31890a95d5cd90d74a11c7d5e2 @@ -158,7 +156,7 @@ https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc4 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda#04558c96691bed63104678757beb4f8d -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.3-nompi_h11f7409_103.conda#3ccff1066c05a1e6c221356eecc40581 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.3-nompi_hbf2fc22_104.conda#a2956b63b1851e9d5eb9f882d02fa3a9 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda#eb52d14a901e23c39e9e7b4a1a5c015f https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.2-py311h2e04523_1.conda#a8105076864776eceae69d64d30e24d7 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 @@ -180,7 +178,7 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda#2b https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.0-py311hbe70eeb_1.conda#f4dda6316cc4718cbcab7009b5d60c41 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0.conda#e2e4d7094d0580ccd62e2a41947444f3 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py311h8a92878_2.conda#b37c338ff0f69883188c9b3b127be059 -https://conda.anaconda.org/conda-forge/noarch/tox-4.34.1-pyhcf101f3_0.conda#1e1c68df36eb6e419c7c833291443552 +https://conda.anaconda.org/conda-forge/noarch/tox-4.35.0-pyhcf101f3_0.conda#faa8b0790c984ae410cdd2aedb0a9637 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py311hdf67eae_0.conda#5a715cf5e3dc6cd68717c50e47dd7b6b https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda#9272daa869e03efe68833e3dc7a02130 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py311haee01d2_1.conda#ca45bfd4871af957aaa5035593d5efd2 @@ -200,8 +198,8 @@ https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda#7f3ac694319c7eaf81a0325d6405e974 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.45.0-np2py311h50facf7_1.conda#c29c3bf5965c5831d6d759ae1b5c58b3 https://conda.anaconda.org/conda-forge/noarch/iris-3.14.1-pyha770c72_0.conda#0b6f532e907ce57be6905bd6d44fbe71 -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.2.3-pyhd8ed1ab_0.conda#99b90c09aac09a766864e2ef73966f3f -https://conda.anaconda.org/conda-forge/noarch/nox-2025.11.12-pyhcf101f3_0.conda#ae74047e4fe04ff7760d9529c49b7475 +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.2.11-pyhd8ed1ab_0.conda#a2666a859b9b17cbab511faf7f49b346 +https://conda.anaconda.org/conda-forge/noarch/nox-2026.2.9-pyhcf101f3_0.conda#f59e57ff0cf84c21b070c206bbaa27db https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda#e9fb3fe8a5b758b4aff187d434f94f03 diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 7b2cecb7..e60562a3 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -2,13 +2,12 @@ # platform: linux-64 # input_hash: 91532b637582431f4f0f4b6b1cc13a5ed67d3de3d47cda643e03c5547b4a5340 @EXPLICIT -https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda#c3efd25ac4d74b1584d2f7a57195ddf1 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda#ad659d0a2b3e47e38d829aa8cad2d610 https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda#bddacf101bb4dd0e51811cb69c7790e2 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_17.conda#51b78c6a757575c0d12f4401ffc67029 -https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d +https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda#a9f577daf3de00bca7c3c76c0ecbd1de https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_17.conda#3c281169ea25b987311400d7a7e28445 https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda#791365c5f65975051e4e017b5da3abf5 @@ -46,7 +45,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_17.conda#a6c682ac611cb1fa4d73478f9e6efb06 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.54-h421ea60_0.conda#d361fa2a59e53b61c2675bfa073e5b7e +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda#5f13ffc7d30ffec87864e678df9957b4 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_17.conda#ea12f5a6bf12c88c06750d9803e1a570 https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 @@ -57,13 +56,12 @@ https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9d https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda#d7d95fc8287ea7bf33e0e7116d2b95ec https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda#98b6c9dc80eb87b2519b97bcf7e578dd https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda#cffd3bdd58090148f4cfcd831f4b26ab -https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda#c9f075ab2f33b3bbee9e62d4ad0a6cd8 https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda#2aadb0d17215603a82a2a6b0afd9a4cb https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda#4a13eeac0b5c8e5b8ab496e6c4ddd829 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda#af39b9a8711d4a8d437b52c1d78eb6a1 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 -https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda#fb53fb07ce46a575c5d004bbc96032c2 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda#12bd9a3f089ee6c9266a37dab82afabd https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda#8e7251989bca326a28f4a5ffbd74557a https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d @@ -74,11 +72,11 @@ https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#c https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-hca6bf5a_1.conda#3fdd8d99683da9fe279c2f4cecd1e048 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda#db038ce880f100acc74dba10302b5630 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda#861fb6ccbc677bb9a9fb2468430b9c6a https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda#8ccf913aaba749a5496c17629d859ed1 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda#6f2e2c8f58160147c4d1c6f4c14cbac4 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda#c160954f7418d7b6e87eaf05a8913fa9 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.18.0-h4e3cde8_0.conda#0a5563efed19ca4461cf927419b6eb73 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.18.0-hcf29cc6_1.conda#1707cdd636af2ff697b53186572c9f77 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda#f4084e4e6577797150f9b04a4560ceb0 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-he237659_1.conda#417955234eccd8f252b86a265ccdab7f https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd @@ -91,7 +89,7 @@ https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda#537296d57ea995666c68c821b00e360b https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py312h90b7ffd_0.conda#5b8c55fed2e576dde4b0b33693a4fdb1 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py312hdb49522_1.conda#64088dffd7413a2dd557ce837b4cbbdb -https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.0-pyhd8ed1ab_0.conda#715059df4fa9f291a2d84954b274b71b +https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.1-pyhd8ed1ab_0.conda#aa5a912c855a6e64e8a92e03f6fd3e96 https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda#eacc711330cd46939f66cd401ff9c44b https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c @@ -103,7 +101,7 @@ https://conda.anaconda.org/conda-forge/noarch/colorlog-6.10.1-pyh707e725_0.conda https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda#4c2a8fef270f6c69591889b93f9f55c1 https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc -https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.3-pyhd8ed1ab_0.conda#2cfaaccf085c133a477f0a7a8657afe9 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.21.2-pyhd8ed1ab_0.conda#0b3041d2b101e48bee2df46dffd6f047 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda#4afc585cd97ba8a23809406cd8a9eda8 https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.2.0-pyhd8ed1ab_0.conda#496c6c9411a6284addf55c898d6ed8d7 @@ -122,10 +120,10 @@ https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2# https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_0.conda#f775a43412f7f3d7ed218113ad233869 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda#b76541e68fea4d511b1ac46a28dcd2c6 -https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.0-py312h50c33e8_0.conda#923b06ad75b7acc888fa20a22dc397cd -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda#1bd2e65c8c7ef24f4639ae6e850dacc2 +https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py312h50c33e8_0.conda#c5eff3ada1a829f0bdb780dc4b62bbae +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.7.0-pyhcf101f3_0.conda#2157d0900a4bc2e9a0ba3cccb8497e8c https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda#d7585b6550ad04c8c5e21097ada2888e -https://conda.anaconda.org/conda-forge/linux-64/proj-9.7.1-he0df7b0_2.conda#beb1885cfdb793193bba83c9720d53b1 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.7.1-he0df7b0_3.conda#031e33ae075b336c0ce92b14efa886c5 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda#3687cc0b82a8b4c17e1f0eb7e47163d5 @@ -135,7 +133,7 @@ https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.6.0-py312h0d868a https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda#15878599a87992e44c059731771591cb https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda#0dc48b4b570931adc8641e55c6c17fe4 -https://conda.anaconda.org/conda-forge/noarch/setuptools-80.10.2-pyh332efcf_0.conda#7b446fcbb6779ee479debb4fd7453e6c +https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.0-pyh332efcf_0.conda#1d00d46c634177fc8ede8b99d6089239 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda#03fe290994c5e4ec17293cfb6bdce520 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda#755cf22df8693aa0d1aec1c123fa5863 @@ -143,12 +141,12 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda#72e780e9aa2d0a3295f59b1874e3768b https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda#c07a6153f8306e45794774cf9b13bd32 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d -https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.0-py312h4c3975b_1.conda#a0b8efbe73c90f810a171a6c746be087 +https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975b_0.conda#0b6c506ec1f272b685240e70a29261b8 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda#30cd29cb87d819caead4d55184c1d115 https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_0.conda#ea5be9abc2939c8431893b4e123a2065 https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py312h460c074_1.conda#648ee28dcd4e07a1940a17da62eccd40 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.3-py312h8a5da7c_0.conda#f3c0bc6e23bd3653d74390aa644b0a95 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.4-py312h8a5da7c_0.conda#a8df7f0812ac4fa6bbc7135556d3e2c4 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda#8e662bd460bda79b1ea39194e3c4c9ab https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.61.1-py312h8a5da7c_0.conda#3bf8fb959dc598c67dac0430b4aff57a @@ -158,7 +156,7 @@ https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc4 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda#04558c96691bed63104678757beb4f8d -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.3-nompi_h11f7409_103.conda#3ccff1066c05a1e6c221356eecc40581 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.3-nompi_hbf2fc22_104.conda#a2956b63b1851e9d5eb9f882d02fa3a9 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda#eb52d14a901e23c39e9e7b4a1a5c015f https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.2-py312h33ff503_1.conda#3569a8fca2dd3202e4ab08f42499f6d3 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 @@ -180,7 +178,7 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda#2b https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.0-py312h54fa4ab_1.conda#828eb07c4c87c38ed8c6560c25893280 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0.conda#e2e4d7094d0580ccd62e2a41947444f3 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py312h383787d_2.conda#69e400d3deca12ee7afd4b73a5596905 -https://conda.anaconda.org/conda-forge/noarch/tox-4.34.1-pyhcf101f3_0.conda#1e1c68df36eb6e419c7c833291443552 +https://conda.anaconda.org/conda-forge/noarch/tox-4.35.0-pyhcf101f3_0.conda#faa8b0790c984ae410cdd2aedb0a9637 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py312hd9148b4_0.conda#55fd03988b1b1bc6faabbfb5b481ecd7 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda#9272daa869e03efe68833e3dc7a02130 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py312h5253ce2_1.conda#02738ff9855946075cbd1b5274399a41 @@ -200,8 +198,8 @@ https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda#7f3ac694319c7eaf81a0325d6405e974 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.45.0-np2py312hfb8c2c5_1.conda#66f8d5e7005b9d38b4c1cd00068881ae https://conda.anaconda.org/conda-forge/noarch/iris-3.14.1-pyha770c72_0.conda#0b6f532e907ce57be6905bd6d44fbe71 -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.2.3-pyhd8ed1ab_0.conda#99b90c09aac09a766864e2ef73966f3f -https://conda.anaconda.org/conda-forge/noarch/nox-2025.11.12-pyhcf101f3_0.conda#ae74047e4fe04ff7760d9529c49b7475 +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.2.11-pyhd8ed1ab_0.conda#a2666a859b9b17cbab511faf7f49b346 +https://conda.anaconda.org/conda-forge/noarch/nox-2026.2.9-pyhcf101f3_0.conda#f59e57ff0cf84c21b070c206bbaa27db https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda#e9fb3fe8a5b758b4aff187d434f94f03 From 1f64f429e0a8c3101a7cec784cf71eb5e071c58c Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 23 Feb 2026 11:31:56 +0000 Subject: [PATCH 539/583] Updated environment lockfiles (#756) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 26 +++++++++++++------------- requirements/locks/py311-linux-64.lock | 26 +++++++++++++------------- requirements/locks/py312-linux-64.lock | 26 +++++++++++++------------- 3 files changed, 39 insertions(+), 39 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index cd20174c..393399c9 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -6,25 +6,25 @@ https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.conda#05e0 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda#ad659d0a2b3e47e38d829aa8cad2d610 https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda#bddacf101bb4dd0e51811cb69c7790e2 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_17.conda#51b78c6a757575c0d12f4401ffc67029 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda#239c5e9546c38a1e884d69effcf4c882 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda#a9f577daf3de00bca7c3c76c0ecbd1de https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_17.conda#3c281169ea25b987311400d7a7e28445 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda#0aa00f03f9e39fb9876085dee11a85d4 https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda#791365c5f65975051e4e017b5da3abf5 -https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda#51a19bba1b8ebfb60df25cde030b7ebc +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda#d2ffd7602c02f2b316fd921d39876885 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda#920bb03579f15389b9e512095ad995b7 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda#72c8fd1af66bd67bf580645b426513ed https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda#6c77a605a7a689d17d4819c0f8ac9a00 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda#8b09ae86839581147ef2e5c5e229d164 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda#e7f7ce06ec24cfcfb9e36d28cf82ba57 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda#a360c33a5abe61c07959e449fa1453eb -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_17.conda#1478bfa85224a65ab096d69ffd2af1e5 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_17.conda#202fdf8cad9eea704c2b0d823d1732bf +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda#d5e96b1ed75ca01906b3d2469b4ce493 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda#646855f357199a12f02a87382d429b75 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda#8397539e3a0bbd1695584fb4f927485a https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda#c7c83eecbb72d88b940c249af56c8b17 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_17.conda#24c2fe35fa45cd71214beba6f337c071 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda#1b08cd684f34175e4514474793d44bcb https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda#db409b7c1720428638e7c0d509d3e1b5 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 @@ -43,11 +43,11 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.co https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda#4ffbb341c8b616aa2494b6afb26a0c5f https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_17.conda#a6c682ac611cb1fa4d73478f9e6efb06 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda#9063115da5bc35fdc3e1002e69b9ef6e https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda#5f13ffc7d30ffec87864e678df9957b4 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_17.conda#ea12f5a6bf12c88c06750d9803e1a570 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda#6235adb93d064ecdf3d44faee6f468de https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc @@ -101,7 +101,7 @@ https://conda.anaconda.org/conda-forge/noarch/colorlog-6.10.1-pyh707e725_0.conda https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda#4c2a8fef270f6c69591889b93f9f55c1 https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc -https://conda.anaconda.org/conda-forge/noarch/filelock-3.21.2-pyhd8ed1ab_0.conda#0b3041d2b101e48bee2df46dffd6f047 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.24.3-pyhd8ed1ab_0.conda#9dbb20eec24beb026291c20a35ce1ff9 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda#4afc585cd97ba8a23809406cd8a9eda8 https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.2.0-pyhd8ed1ab_0.conda#496c6c9411a6284addf55c898d6ed8d7 @@ -121,7 +121,7 @@ https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py310h3406613_0 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda#b76541e68fea4d511b1ac46a28dcd2c6 https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py310h5a73078_0.conda#5e79faa7f34986b6124525f3d234512e -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.7.0-pyhcf101f3_0.conda#2157d0900a4bc2e9a0ba3cccb8497e8c +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.2-pyhcf101f3_0.conda#4fefefb892ce9cc1539405bec2f1a6cd https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda#d7585b6550ad04c8c5e21097ada2888e https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h18fbb6c_2.conda#1aeede769ec2fa0f474f8b73a7ac057f https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef @@ -163,7 +163,6 @@ https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py310h71d0299_1.con https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.36.1-pyhd8ed1ab_0.conda#6b0259cea8ffa6b66b35bae0ca01c447 https://conda.anaconda.org/conda-forge/noarch/wheel-0.46.3-pyhd8ed1ab_0.conda#bdbd7385b4a67025ac2dba4ef8cb6a8f https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda#11a2b8c732d215d977998ccd69a9d5e8 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py310hf779ad0_1.conda#702cd87d652ec1956ee503b9e16bb1c0 @@ -176,9 +175,9 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda#2b https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.conda#8c29cd33b64b2eb78597fa28b5595c8d https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0.conda#e2e4d7094d0580ccd62e2a41947444f3 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py310hc8bbb35_2.conda#0937b0e88a24c82e02d5b714acc9957c -https://conda.anaconda.org/conda-forge/noarch/tox-4.35.0-pyhcf101f3_0.conda#faa8b0790c984ae410cdd2aedb0a9637 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py310h03d9f68_0.conda#c3b1f5bc28ae6282ba95156d18fde825 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda#9272daa869e03efe68833e3dc7a02130 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.38.0-pyhcf101f3_0.conda#eaf8f08a04ab2d8612e45aa4f4c33357 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py310h139afa4_1.conda#3741aefc198dfed2e3c9adc79d706bb7 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py310hf779ad0_1.conda#5e4aea6b728177b53e8a216922ebd6a2 https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 @@ -191,6 +190,7 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.cond https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda#c65df89a0b2e321045a9e01d1337b182 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 +https://conda.anaconda.org/conda-forge/noarch/tox-4.41.0-pyhcf101f3_0.conda#0ec77daee92c460b03c9734351eabe69 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py310h0158d43_1.conda#871b5f746960f99ac23dbc73d14e2ad0 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index cbb6fe25..bd3e7482 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -6,25 +6,25 @@ https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda#8fcb https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda#ad659d0a2b3e47e38d829aa8cad2d610 https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda#bddacf101bb4dd0e51811cb69c7790e2 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_17.conda#51b78c6a757575c0d12f4401ffc67029 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda#239c5e9546c38a1e884d69effcf4c882 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda#a9f577daf3de00bca7c3c76c0ecbd1de https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_17.conda#3c281169ea25b987311400d7a7e28445 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda#0aa00f03f9e39fb9876085dee11a85d4 https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda#791365c5f65975051e4e017b5da3abf5 -https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda#51a19bba1b8ebfb60df25cde030b7ebc +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda#d2ffd7602c02f2b316fd921d39876885 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda#920bb03579f15389b9e512095ad995b7 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda#72c8fd1af66bd67bf580645b426513ed https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda#6c77a605a7a689d17d4819c0f8ac9a00 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda#8b09ae86839581147ef2e5c5e229d164 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda#e7f7ce06ec24cfcfb9e36d28cf82ba57 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda#a360c33a5abe61c07959e449fa1453eb -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_17.conda#1478bfa85224a65ab096d69ffd2af1e5 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_17.conda#202fdf8cad9eea704c2b0d823d1732bf +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda#d5e96b1ed75ca01906b3d2469b4ce493 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda#646855f357199a12f02a87382d429b75 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda#8397539e3a0bbd1695584fb4f927485a https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda#c7c83eecbb72d88b940c249af56c8b17 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_17.conda#24c2fe35fa45cd71214beba6f337c071 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda#1b08cd684f34175e4514474793d44bcb https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda#db409b7c1720428638e7c0d509d3e1b5 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 @@ -43,11 +43,11 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.co https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda#4ffbb341c8b616aa2494b6afb26a0c5f https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_17.conda#a6c682ac611cb1fa4d73478f9e6efb06 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda#9063115da5bc35fdc3e1002e69b9ef6e https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda#5f13ffc7d30ffec87864e678df9957b4 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_17.conda#ea12f5a6bf12c88c06750d9803e1a570 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda#6235adb93d064ecdf3d44faee6f468de https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc @@ -101,7 +101,7 @@ https://conda.anaconda.org/conda-forge/noarch/colorlog-6.10.1-pyh707e725_0.conda https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda#4c2a8fef270f6c69591889b93f9f55c1 https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc -https://conda.anaconda.org/conda-forge/noarch/filelock-3.21.2-pyhd8ed1ab_0.conda#0b3041d2b101e48bee2df46dffd6f047 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.24.3-pyhd8ed1ab_0.conda#9dbb20eec24beb026291c20a35ce1ff9 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda#4afc585cd97ba8a23809406cd8a9eda8 https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.2.0-pyhd8ed1ab_0.conda#496c6c9411a6284addf55c898d6ed8d7 @@ -121,7 +121,7 @@ https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py311h3778330_0 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda#b76541e68fea4d511b1ac46a28dcd2c6 https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py311hf88fc01_0.conda#0415141f4e3d4dad3c39ad4718936352 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.7.0-pyhcf101f3_0.conda#2157d0900a4bc2e9a0ba3cccb8497e8c +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.2-pyhcf101f3_0.conda#4fefefb892ce9cc1539405bec2f1a6cd https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda#d7585b6550ad04c8c5e21097ada2888e https://conda.anaconda.org/conda-forge/linux-64/proj-9.7.1-he0df7b0_3.conda#031e33ae075b336c0ce92b14efa886c5 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef @@ -165,7 +165,6 @@ https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0. https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda#28687768633154993d521aecfa4a56ac https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.36.1-pyhd8ed1ab_0.conda#6b0259cea8ffa6b66b35bae0ca01c447 https://conda.anaconda.org/conda-forge/noarch/wheel-0.46.3-pyhd8ed1ab_0.conda#bdbd7385b4a67025ac2dba4ef8cb6a8f https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda#11a2b8c732d215d977998ccd69a9d5e8 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py311h0372a8f_1.conda#77cf197e2f03986b6505bab6e214d22a @@ -178,9 +177,9 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda#2b https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.0-py311hbe70eeb_1.conda#f4dda6316cc4718cbcab7009b5d60c41 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0.conda#e2e4d7094d0580ccd62e2a41947444f3 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py311h8a92878_2.conda#b37c338ff0f69883188c9b3b127be059 -https://conda.anaconda.org/conda-forge/noarch/tox-4.35.0-pyhcf101f3_0.conda#faa8b0790c984ae410cdd2aedb0a9637 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py311hdf67eae_0.conda#5a715cf5e3dc6cd68717c50e47dd7b6b https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda#9272daa869e03efe68833e3dc7a02130 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.38.0-pyhcf101f3_0.conda#eaf8f08a04ab2d8612e45aa4f4c33357 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py311haee01d2_1.conda#ca45bfd4871af957aaa5035593d5efd2 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.1-py311h0372a8f_0.conda#dd96428f7ee2aef4dc32076631418323 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.45.0-h83bc92c_0.conda#a981ecc85b1ff6307b8f09cf66b77083 @@ -192,6 +191,7 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.cond https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda#c65df89a0b2e321045a9e01d1337b182 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 +https://conda.anaconda.org/conda-forge/noarch/tox-4.41.0-pyhcf101f3_0.conda#0ec77daee92c460b03c9734351eabe69 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py311hed34c8f_1.conda#17c710c32010688086b28c088a8be579 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index e60562a3..261be676 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -6,25 +6,25 @@ https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda#c3ef https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda#ad659d0a2b3e47e38d829aa8cad2d610 https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda#bddacf101bb4dd0e51811cb69c7790e2 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_17.conda#51b78c6a757575c0d12f4401ffc67029 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda#239c5e9546c38a1e884d69effcf4c882 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda#a9f577daf3de00bca7c3c76c0ecbd1de https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_17.conda#3c281169ea25b987311400d7a7e28445 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda#0aa00f03f9e39fb9876085dee11a85d4 https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda#791365c5f65975051e4e017b5da3abf5 -https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda#51a19bba1b8ebfb60df25cde030b7ebc +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda#d2ffd7602c02f2b316fd921d39876885 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda#920bb03579f15389b9e512095ad995b7 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda#72c8fd1af66bd67bf580645b426513ed https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda#6c77a605a7a689d17d4819c0f8ac9a00 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda#8b09ae86839581147ef2e5c5e229d164 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda#e7f7ce06ec24cfcfb9e36d28cf82ba57 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda#a360c33a5abe61c07959e449fa1453eb -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_17.conda#1478bfa85224a65ab096d69ffd2af1e5 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_17.conda#202fdf8cad9eea704c2b0d823d1732bf +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda#d5e96b1ed75ca01906b3d2469b4ce493 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda#646855f357199a12f02a87382d429b75 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda#8397539e3a0bbd1695584fb4f927485a https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda#c7c83eecbb72d88b940c249af56c8b17 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_17.conda#24c2fe35fa45cd71214beba6f337c071 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda#1b08cd684f34175e4514474793d44bcb https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda#db409b7c1720428638e7c0d509d3e1b5 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 @@ -43,11 +43,11 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.co https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda#4ffbb341c8b616aa2494b6afb26a0c5f https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_17.conda#a6c682ac611cb1fa4d73478f9e6efb06 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda#9063115da5bc35fdc3e1002e69b9ef6e https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda#5f13ffc7d30ffec87864e678df9957b4 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_17.conda#ea12f5a6bf12c88c06750d9803e1a570 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda#6235adb93d064ecdf3d44faee6f468de https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc @@ -101,7 +101,7 @@ https://conda.anaconda.org/conda-forge/noarch/colorlog-6.10.1-pyh707e725_0.conda https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda#4c2a8fef270f6c69591889b93f9f55c1 https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc -https://conda.anaconda.org/conda-forge/noarch/filelock-3.21.2-pyhd8ed1ab_0.conda#0b3041d2b101e48bee2df46dffd6f047 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.24.3-pyhd8ed1ab_0.conda#9dbb20eec24beb026291c20a35ce1ff9 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda#4afc585cd97ba8a23809406cd8a9eda8 https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.2.0-pyhd8ed1ab_0.conda#496c6c9411a6284addf55c898d6ed8d7 @@ -121,7 +121,7 @@ https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_0 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda#b76541e68fea4d511b1ac46a28dcd2c6 https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py312h50c33e8_0.conda#c5eff3ada1a829f0bdb780dc4b62bbae -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.7.0-pyhcf101f3_0.conda#2157d0900a4bc2e9a0ba3cccb8497e8c +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.2-pyhcf101f3_0.conda#4fefefb892ce9cc1539405bec2f1a6cd https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda#d7585b6550ad04c8c5e21097ada2888e https://conda.anaconda.org/conda-forge/linux-64/proj-9.7.1-he0df7b0_3.conda#031e33ae075b336c0ce92b14efa886c5 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef @@ -165,7 +165,6 @@ https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0. https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda#28687768633154993d521aecfa4a56ac https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.36.1-pyhd8ed1ab_0.conda#6b0259cea8ffa6b66b35bae0ca01c447 https://conda.anaconda.org/conda-forge/noarch/wheel-0.46.3-pyhd8ed1ab_0.conda#bdbd7385b4a67025ac2dba4ef8cb6a8f https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda#11a2b8c732d215d977998ccd69a9d5e8 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py312h4f23490_1.conda#84bf349fad55056ed326fc550671b65c @@ -178,9 +177,9 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda#2b https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.0-py312h54fa4ab_1.conda#828eb07c4c87c38ed8c6560c25893280 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0.conda#e2e4d7094d0580ccd62e2a41947444f3 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py312h383787d_2.conda#69e400d3deca12ee7afd4b73a5596905 -https://conda.anaconda.org/conda-forge/noarch/tox-4.35.0-pyhcf101f3_0.conda#faa8b0790c984ae410cdd2aedb0a9637 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py312hd9148b4_0.conda#55fd03988b1b1bc6faabbfb5b481ecd7 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda#9272daa869e03efe68833e3dc7a02130 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.38.0-pyhcf101f3_0.conda#eaf8f08a04ab2d8612e45aa4f4c33357 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py312h5253ce2_1.conda#02738ff9855946075cbd1b5274399a41 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.1-py312h4f23490_0.conda#6aef45ba3c0123547eb7b0f15852cac9 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.45.0-h83bc92c_0.conda#a981ecc85b1ff6307b8f09cf66b77083 @@ -192,6 +191,7 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.cond https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda#c65df89a0b2e321045a9e01d1337b182 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 +https://conda.anaconda.org/conda-forge/noarch/tox-4.41.0-pyhcf101f3_0.conda#0ec77daee92c460b03c9734351eabe69 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py312hf79963d_1.conda#6c913a686cb4060cbd7639a36fa144f0 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 From 4659b09db3a400561010d56476a546e3ee419741 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 2 Mar 2026 14:59:38 +0000 Subject: [PATCH 540/583] Updated environment lockfiles (#757) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 10 +++++----- requirements/locks/py311-linux-64.lock | 12 ++++++------ requirements/locks/py312-linux-64.lock | 12 ++++++------ 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 393399c9..da64139c 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -4,7 +4,7 @@ @EXPLICIT https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.conda#05e00f3b21e88bb3d658ac700b2ce58c https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda#ad659d0a2b3e47e38d829aa8cad2d610 -https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda#bddacf101bb4dd0e51811cb69c7790e2 +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda#4492fd26db29495f0ba23f146cd5638d https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda#239c5e9546c38a1e884d69effcf4c882 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda#a9f577daf3de00bca7c3c76c0ecbd1de @@ -90,9 +90,8 @@ https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda#53 https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py310h69bd2ac_0.conda#276a3ddf300498921601822e3b407088 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py310hba01987_1.conda#393fca4557fbd2c4d995dcb89f569048 https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.1-pyhd8ed1ab_0.conda#aa5a912c855a6e64e8a92e03f6fd3e96 -https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda#eacc711330cd46939f66cd401ff9c44b +https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda#765c4d97e877cdbbb88ff33152b86125 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 -https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda#a22d1fd9bf98827e280a02875d9a007a https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda#ea8a6c3256897cc31263de9f455e25d9 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda#61b8078a0905b12529abc622406cb62c @@ -162,6 +161,7 @@ https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0ba https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py310h71d0299_1.conda#e54b1eaeb50ad1767680181a8575a8db https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 +https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.1.0-pyhcf101f3_0.conda#ee4e2cad073411bdfa8598f599537498 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 https://conda.anaconda.org/conda-forge/noarch/wheel-0.46.3-pyhd8ed1ab_0.conda#bdbd7385b4a67025ac2dba4ef8cb6a8f https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda#11a2b8c732d215d977998ccd69a9d5e8 @@ -177,7 +177,7 @@ https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0. https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py310hc8bbb35_2.conda#0937b0e88a24c82e02d5b714acc9957c https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py310h03d9f68_0.conda#c3b1f5bc28ae6282ba95156d18fde825 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda#9272daa869e03efe68833e3dc7a02130 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.38.0-pyhcf101f3_0.conda#eaf8f08a04ab2d8612e45aa4f4c33357 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.0.0-pyhcf101f3_0.conda#0d574419484a88ee7e753cc0c80ee2c1 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py310h139afa4_1.conda#3741aefc198dfed2e3c9adc79d706bb7 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py310hf779ad0_1.conda#5e4aea6b728177b53e8a216922ebd6a2 https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 @@ -190,7 +190,7 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.cond https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda#c65df89a0b2e321045a9e01d1337b182 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 -https://conda.anaconda.org/conda-forge/noarch/tox-4.41.0-pyhcf101f3_0.conda#0ec77daee92c460b03c9734351eabe69 +https://conda.anaconda.org/conda-forge/noarch/tox-4.46.3-pyhcf101f3_0.conda#fffac8cbe3056aab524ee3f65b0e6676 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py310h0158d43_1.conda#871b5f746960f99ac23dbc73d14e2ad0 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index bd3e7482..d499ae2a 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -4,7 +4,7 @@ @EXPLICIT https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda#8fcb6b0e2161850556231336dae58358 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda#ad659d0a2b3e47e38d829aa8cad2d610 -https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda#bddacf101bb4dd0e51811cb69c7790e2 +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda#4492fd26db29495f0ba23f146cd5638d https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda#239c5e9546c38a1e884d69effcf4c882 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda#a9f577daf3de00bca7c3c76c0ecbd1de @@ -90,9 +90,8 @@ https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda#53 https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py311h6b1f9c4_0.conda#adda5ef2a74c9bdb338ff8a51192898a https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py311h66f275b_1.conda#86daecb8e4ed1042d5dc6efbe0152590 https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.1-pyhd8ed1ab_0.conda#aa5a912c855a6e64e8a92e03f6fd3e96 -https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda#eacc711330cd46939f66cd401ff9c44b +https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda#765c4d97e877cdbbb88ff33152b86125 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 -https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda#a22d1fd9bf98827e280a02875d9a007a https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda#ea8a6c3256897cc31263de9f455e25d9 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda#61b8078a0905b12529abc622406cb62c @@ -163,6 +162,7 @@ https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0ba https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py311h4e6619b_2.conda#8092837339ae2e3697980df6686f996e https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 +https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.1.0-pyhcf101f3_0.conda#ee4e2cad073411bdfa8598f599537498 https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda#28687768633154993d521aecfa4a56ac https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 https://conda.anaconda.org/conda-forge/noarch/wheel-0.46.3-pyhd8ed1ab_0.conda#bdbd7385b4a67025ac2dba4ef8cb6a8f @@ -174,12 +174,12 @@ https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a0 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py311h0372a8f_2.conda#487756753716efba090d06c71fb73eb6 https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh8b19718_0.conda#67bdec43082fd8a9cffb9484420b39a2 https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda#2b694bad8a50dc2f712f5368de866480 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.0-py311hbe70eeb_1.conda#f4dda6316cc4718cbcab7009b5d60c41 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py311hbe70eeb_0.conda#5ae6d73ab0bebbc892c2d46dc51e90a5 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0.conda#e2e4d7094d0580ccd62e2a41947444f3 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py311h8a92878_2.conda#b37c338ff0f69883188c9b3b127be059 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py311hdf67eae_0.conda#5a715cf5e3dc6cd68717c50e47dd7b6b https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda#9272daa869e03efe68833e3dc7a02130 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.38.0-pyhcf101f3_0.conda#eaf8f08a04ab2d8612e45aa4f4c33357 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.0.0-pyhcf101f3_0.conda#0d574419484a88ee7e753cc0c80ee2c1 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py311haee01d2_1.conda#ca45bfd4871af957aaa5035593d5efd2 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.1-py311h0372a8f_0.conda#dd96428f7ee2aef4dc32076631418323 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.45.0-h83bc92c_0.conda#a981ecc85b1ff6307b8f09cf66b77083 @@ -191,7 +191,7 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.cond https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda#c65df89a0b2e321045a9e01d1337b182 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 -https://conda.anaconda.org/conda-forge/noarch/tox-4.41.0-pyhcf101f3_0.conda#0ec77daee92c460b03c9734351eabe69 +https://conda.anaconda.org/conda-forge/noarch/tox-4.46.3-pyhcf101f3_0.conda#fffac8cbe3056aab524ee3f65b0e6676 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py311hed34c8f_1.conda#17c710c32010688086b28c088a8be579 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 261be676..56b50512 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -4,7 +4,7 @@ @EXPLICIT https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda#c3efd25ac4d74b1584d2f7a57195ddf1 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda#ad659d0a2b3e47e38d829aa8cad2d610 -https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda#bddacf101bb4dd0e51811cb69c7790e2 +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda#4492fd26db29495f0ba23f146cd5638d https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda#239c5e9546c38a1e884d69effcf4c882 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda#a9f577daf3de00bca7c3c76c0ecbd1de @@ -90,9 +90,8 @@ https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda#53 https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py312h90b7ffd_0.conda#5b8c55fed2e576dde4b0b33693a4fdb1 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py312hdb49522_1.conda#64088dffd7413a2dd557ce837b4cbbdb https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.1-pyhd8ed1ab_0.conda#aa5a912c855a6e64e8a92e03f6fd3e96 -https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda#eacc711330cd46939f66cd401ff9c44b +https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda#765c4d97e877cdbbb88ff33152b86125 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 -https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda#56bfd153e523d9b9d05e4cf3c1cfe01c https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda#a22d1fd9bf98827e280a02875d9a007a https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda#ea8a6c3256897cc31263de9f455e25d9 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda#61b8078a0905b12529abc622406cb62c @@ -163,6 +162,7 @@ https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0ba https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py312h9b6a7d9_2.conda#573b9a879a3a42990f9c51d7376dce6b https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 +https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.1.0-pyhcf101f3_0.conda#ee4e2cad073411bdfa8598f599537498 https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda#28687768633154993d521aecfa4a56ac https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 https://conda.anaconda.org/conda-forge/noarch/wheel-0.46.3-pyhd8ed1ab_0.conda#bdbd7385b4a67025ac2dba4ef8cb6a8f @@ -174,12 +174,12 @@ https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a0 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h4f23490_2.conda#cec5bc5f7d374f8f8095f8e28e31f6cb https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh8b19718_0.conda#67bdec43082fd8a9cffb9484420b39a2 https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda#2b694bad8a50dc2f712f5368de866480 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.0-py312h54fa4ab_1.conda#828eb07c4c87c38ed8c6560c25893280 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py312h54fa4ab_0.conda#3e38daeb1fb05a95656ff5af089d2e4c https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0.conda#e2e4d7094d0580ccd62e2a41947444f3 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py312h383787d_2.conda#69e400d3deca12ee7afd4b73a5596905 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py312hd9148b4_0.conda#55fd03988b1b1bc6faabbfb5b481ecd7 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda#9272daa869e03efe68833e3dc7a02130 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.38.0-pyhcf101f3_0.conda#eaf8f08a04ab2d8612e45aa4f4c33357 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.0.0-pyhcf101f3_0.conda#0d574419484a88ee7e753cc0c80ee2c1 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py312h5253ce2_1.conda#02738ff9855946075cbd1b5274399a41 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.1-py312h4f23490_0.conda#6aef45ba3c0123547eb7b0f15852cac9 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.45.0-h83bc92c_0.conda#a981ecc85b1ff6307b8f09cf66b77083 @@ -191,7 +191,7 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.cond https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda#c65df89a0b2e321045a9e01d1337b182 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 -https://conda.anaconda.org/conda-forge/noarch/tox-4.41.0-pyhcf101f3_0.conda#0ec77daee92c460b03c9734351eabe69 +https://conda.anaconda.org/conda-forge/noarch/tox-4.46.3-pyhcf101f3_0.conda#fffac8cbe3056aab524ee3f65b0e6676 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py312hf79963d_1.conda#6c913a686cb4060cbd7639a36fa144f0 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 From 3de5982921e7db3edb00fc5d5add160961a7c1f6 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 4 Mar 2026 13:57:25 +0000 Subject: [PATCH 541/583] chore: update pre-commit hooks (#758) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: update pre-commit hooks updates: - [github.com/astral-sh/ruff-pre-commit: v0.14.14 → v0.15.4](https://github.com/astral-sh/ruff-pre-commit/compare/v0.14.14...v0.15.4) - [github.com/abravalheri/validate-pyproject: v0.24.1 → v0.25](https://github.com/abravalheri/validate-pyproject/compare/v0.24.1...v0.25) * Ruff FURB171, grib_wrapper: replace if with match, to maintain syntax consistency. * Ruff FURB171, message.py: replace not in with equality check. --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Martin Yeo --- .pre-commit-config.yaml | 4 +- src/iris_grib/_grib1_legacy/grib_wrapper.py | 95 +++++++++++---------- src/iris_grib/message.py | 2 +- 3 files changed, 53 insertions(+), 48 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 85eca283..3b7ca607 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -80,7 +80,7 @@ repos: types: [file, python] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.14.14" + rev: "v0.15.4" hooks: - id: ruff-check types: [file, python] @@ -103,7 +103,7 @@ repos: - repo: https://github.com/abravalheri/validate-pyproject # More exhaustive than Ruff RUF200. - rev: "v0.24.1" + rev: "v0.25" hooks: - id: validate-pyproject diff --git a/src/iris_grib/_grib1_legacy/grib_wrapper.py b/src/iris_grib/_grib1_legacy/grib_wrapper.py index 5f0f165a..b550f3f4 100644 --- a/src/iris_grib/_grib1_legacy/grib_wrapper.py +++ b/src/iris_grib/_grib1_legacy/grib_wrapper.py @@ -439,56 +439,61 @@ def _compute_extra_keys(self): else: raise TranslationError("unhandled grid type: {}".format(gridType)) - if gridType in ["regular_ll", "rotated_ll"]: - self._regular_longitude_common() - j_step = self.jDirectionIncrementInDegrees - if not self.jScansPositively: - j_step = -j_step - self._y_points = ( - np.arange(self.Nj, dtype=np.float64) * j_step - + self.latitudeOfFirstGridPointInDegrees - ) - - elif gridType in ["regular_gg"]: - # longitude coordinate is straight-forward - self._regular_longitude_common() - # get the distinct latitudes, and make sure they are sorted - # (south-to-north) and then put them in the right direction - # depending on the scan direction - latitude_points = eccodes.codes_get_double_array( - self.grib_message, "distinctLatitudes" - ).astype(np.float64) - latitude_points.sort() - if not self.jScansPositively: - # we require latitudes north-to-south - self._y_points = latitude_points[::-1] - else: - self._y_points = latitude_points - - elif gridType in ["polar_stereographic", "lambert"]: - # convert the starting latlon into meters - cartopy_crs = self.extra_keys["_coord_system"].as_cartopy_crs() - x1, y1 = cartopy_crs.transform_point( - self.longitudeOfFirstGridPointInDegrees, - self.latitudeOfFirstGridPointInDegrees, - ccrs.Geodetic(), - ) + match gridType: + case "regular_ll" | "rotated_ll": + self._regular_longitude_common() + j_step = self.jDirectionIncrementInDegrees + if not self.jScansPositively: + j_step = -j_step + self._y_points = ( + np.arange(self.Nj, dtype=np.float64) * j_step + + self.latitudeOfFirstGridPointInDegrees + ) - if not np.all(np.isfinite([x1, y1])): - raise TranslationError( - "Could not determine the first latitude" - " and/or longitude grid point." + case "regular_gg": + # longitude coordinate is straight-forward + self._regular_longitude_common() + # get the distinct latitudes, and make sure they are sorted + # (south-to-north) and then put them in the right direction + # depending on the scan direction + latitude_points = eccodes.codes_get_double_array( + self.grib_message, "distinctLatitudes" + ).astype(np.float64) + latitude_points.sort() + if not self.jScansPositively: + # we require latitudes north-to-south + self._y_points = latitude_points[::-1] + else: + self._y_points = latitude_points + + case "polar_stereographic" | "lambert": + # convert the starting latlon into meters + cartopy_crs = self.extra_keys["_coord_system"].as_cartopy_crs() + x1, y1 = cartopy_crs.transform_point( + self.longitudeOfFirstGridPointInDegrees, + self.latitudeOfFirstGridPointInDegrees, + ccrs.Geodetic(), ) - self._x_points = x1 + self.DxInMetres * np.arange(self.Nx, dtype=np.float64) - self._y_points = y1 + self.DyInMetres * np.arange(self.Ny, dtype=np.float64) + if not np.all(np.isfinite([x1, y1])): + raise TranslationError( + "Could not determine the first latitude" + " and/or longitude grid point." + ) - elif gridType in ["reduced_ll", "reduced_gg"]: - self._x_points = self.longitudes - self._y_points = self.latitudes + self._x_points = x1 + self.DxInMetres * np.arange( + self.Nx, dtype=np.float64 + ) + self._y_points = y1 + self.DyInMetres * np.arange( + self.Ny, dtype=np.float64 + ) - else: - raise TranslationError("unhandled grid type") + case "reduced_ll" | "reduced_gg": + self._x_points = self.longitudes + self._y_points = self.latitudes + + case _: + raise TranslationError("unhandled grid type") def _regular_longitude_common(self): """Define a regular longitude dimension.""" diff --git a/src/iris_grib/message.py b/src/iris_grib/message.py index 10319345..0b4dd2d6 100644 --- a/src/iris_grib/message.py +++ b/src/iris_grib/message.py @@ -155,7 +155,7 @@ def data(self): or grid_section["interpretationOfNumberOfPoints"] != 0 ) template = grid_section["gridDefinitionTemplateNumber"] - if reduced and template not in (40,): + if reduced and template != 40: raise TranslationError( "Grid definition Section 3 contains unsupported quasi-regular grid." ) From e1bfebd9cd424cd71cade10ee1f04f755722a3b4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 5 Mar 2026 09:45:37 +0000 Subject: [PATCH 542/583] Bump the dependencies group with 3 updates (#759) Bumps the dependencies group with 3 updates: [scitools/workflows/.github/workflows/ci-manifest.yml](https://github.com/scitools/workflows), [scitools/workflows/.github/workflows/ci-template-check.yml](https://github.com/scitools/workflows) and [scitools/workflows/.github/workflows/refresh-lockfiles.yml](https://github.com/scitools/workflows). Updates `scitools/workflows/.github/workflows/ci-manifest.yml` from 2026.02.0 to 2026.03.2 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2026.02.0...2026.03.2) Updates `scitools/workflows/.github/workflows/ci-template-check.yml` from 2026.02.0 to 2026.03.2 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2026.02.0...2026.03.2) Updates `scitools/workflows/.github/workflows/refresh-lockfiles.yml` from 2026.02.0 to 2026.03.2 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2026.02.0...2026.03.2) --- updated-dependencies: - dependency-name: scitools/workflows/.github/workflows/ci-manifest.yml dependency-version: 2026.03.2 dependency-type: direct:production dependency-group: dependencies - dependency-name: scitools/workflows/.github/workflows/ci-template-check.yml dependency-version: 2026.03.2 dependency-type: direct:production dependency-group: dependencies - dependency-name: scitools/workflows/.github/workflows/refresh-lockfiles.yml dependency-version: 2026.03.2 dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/ci-template-check.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index d724c232..793c8e99 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2026.02.0 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2026.03.2 diff --git a/.github/workflows/ci-template-check.yml b/.github/workflows/ci-template-check.yml index 32f74f90..3d0bb0d1 100644 --- a/.github/workflows/ci-template-check.yml +++ b/.github/workflows/ci-template-check.yml @@ -10,7 +10,7 @@ on: jobs: prompt-share: - uses: scitools/workflows/.github/workflows/ci-template-check.yml@2026.02.0 + uses: scitools/workflows/.github/workflows/ci-template-check.yml@2026.03.2 secrets: inherit with: pr_number: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 45165531..3c9a5bca 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2026.02.0 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2026.03.2 secrets: inherit From 58717e2f28cddb096638257fe8368ce7426651c1 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Wed, 11 Mar 2026 15:45:28 +0000 Subject: [PATCH 543/583] Updated environment lockfiles (#760) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 46 +++++++++++------------ requirements/locks/py311-linux-64.lock | 51 ++++++++++++++------------ requirements/locks/py312-linux-64.lock | 51 ++++++++++++++------------ 3 files changed, 77 insertions(+), 71 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index da64139c..98acc841 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -63,13 +63,13 @@ https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.cond https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda#fb53fb07ce46a575c5d004bbc96032c2 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda#12bd9a3f089ee6c9266a37dab82afabd -https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda#8e7251989bca326a28f4a5ffbd74557a +https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.2-h73754d4_0.conda#8eaba3d1a4d7525c6814e861614457fd https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda#b499ce4b026493a13774bcf0f4c33849 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda#be43915efc66345cccb3c310b6ed0374 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda#da5be73701eecd0e8454423fd6ffcf30 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda#fd893f6a3002a635b5e50ceb9dd2c0f4 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#cd5a90476766d53e901500df9215e927 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-hca6bf5a_1.conda#3fdd8d99683da9fe279c2f4cecd1e048 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda#f3bc152cb4f86babe30f3a4bf0dbef69 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda#861fb6ccbc677bb9a9fb2468430b9c6a @@ -77,22 +77,23 @@ https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda#8c https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda#6f2e2c8f58160147c4d1c6f4c14cbac4 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda#c160954f7418d7b6e87eaf05a8913fa9 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.18.0-hcf29cc6_1.conda#1707cdd636af2ff697b53186572c9f77 -https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda#f4084e4e6577797150f9b04a4560ceb0 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-he237659_1.conda#417955234eccd8f252b86a265ccdab7f +https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.2-ha770c72_0.conda#26c746d14402a3b6c684d045b23b9437 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda#e49238a1609f9a4a844b09d9926f2c3d https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd -https://conda.anaconda.org/conda-forge/linux-64/python-3.10.19-h3c07f61_3_cpython.conda#be48679ccfbc8710dea1d5970600fa04 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.51.2-h04a0ce9_0.conda#bb88d9335d09e54c7e6b5529d1856917 +https://conda.anaconda.org/conda-forge/linux-64/python-3.10.20-h3c07f61_0_cpython.conda#5d4e2b00d99feacd026859b7fa239dc0 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.52.0-h04a0ce9_0.conda#7d9d7efe9541d4bb71b5934e8ee348ea https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda#34e54f03dfea3e7a2dcf1453a85f1085 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda#8f37c8fb7116a18da04e52fa9e2c8df9 https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda#537296d57ea995666c68c821b00e360b +https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda#f1976ce927373500cc19d3c0b2c85177 https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py310h69bd2ac_0.conda#276a3ddf300498921601822e3b407088 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py310hba01987_1.conda#393fca4557fbd2c4d995dcb89f569048 -https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.1-pyhd8ed1ab_0.conda#aa5a912c855a6e64e8a92e03f6fd3e96 +https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.3-pyhd8ed1ab_0.conda#8a7ead9f9c99bcdd2dda94f31cfb4f4b https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda#765c4d97e877cdbbb88ff33152b86125 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda#a22d1fd9bf98827e280a02875d9a007a +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.5-pyhd8ed1ab_0.conda#beb628209b2b354b98203066f90b3287 https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda#ea8a6c3256897cc31263de9f455e25d9 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda#61b8078a0905b12529abc622406cb62c https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 @@ -100,9 +101,9 @@ https://conda.anaconda.org/conda-forge/noarch/colorlog-6.10.1-pyh707e725_0.conda https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda#4c2a8fef270f6c69591889b93f9f55c1 https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc -https://conda.anaconda.org/conda-forge/noarch/filelock-3.24.3-pyhd8ed1ab_0.conda#9dbb20eec24beb026291c20a35ce1ff9 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.25.0-pyhd8ed1ab_0.conda#49a92015e912176999ae81bea11ea778 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda#4afc585cd97ba8a23809406cd8a9eda8 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.2-ha770c72_0.conda#eeec961fec28e747e1e1dc0446277452 https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.2.0-pyhd8ed1ab_0.conda#496c6c9411a6284addf55c898d6ed8d7 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h19486de_106.conda#c223ee1429ba538f3e48cfb4a0b97357 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e @@ -116,7 +117,7 @@ https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py310haaf941d_2 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda#6636a2b6f1a87572df2970d3ebc87cc0 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda#b38076eb5c8e40d0106beda6f95d7609 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py310h3406613_0.conda#8854df4fb4e37cc3ea0a024e48c9c180 +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py310h3406613_1.conda#671afe636d2a97759804723f5afc22e0 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda#b76541e68fea4d511b1ac46a28dcd2c6 https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py310h5a73078_0.conda#5e79faa7f34986b6124525f3d234512e @@ -129,7 +130,6 @@ https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.3-pyhd8ed1ab_0.conda#c138c7aaa6a10b5762dcd92247864aff https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.6.0-py310hf3bd8b6_1.conda#a49d7089a9d44aa209f970fc0e5abd1c -https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py310h3406613_1.conda#2160894f57a40d2d629a34ee8497795f https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.0-pyh332efcf_0.conda#1d00d46c634177fc8ede8b99d6089239 https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 @@ -137,12 +137,12 @@ https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda#0 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda#755cf22df8693aa0d1aec1c123fa5863 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda#72e780e9aa2d0a3295f59b1874e3768b +https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda#32e37e8fe9ef45c637ee38ad51377769 https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda#c07a6153f8306e45794774cf9b13bd32 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py310h7c4b9e2_0.conda#234e9858dd691d3f597147e22cbf16cf https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda#30cd29cb87d819caead4d55184c1d115 -https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_0.conda#ea5be9abc2939c8431893b4e123a2065 https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py310he7384ee_1.conda#803e2d778b8dcccdc014127ec5001681 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.4-py310h3406613_0.conda#be1cd42538c1a1f587ea319f756ecc37 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 @@ -154,7 +154,7 @@ https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc4 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda#04558c96691bed63104678757beb4f8d -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.3-nompi_hbf2fc22_104.conda#a2956b63b1851e9d5eb9f882d02fa3a9 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.10.0-nompi_hbf2fc22_100.conda#0eb36a09dad274e750d60b49aaec0af7 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda#eb52d14a901e23c39e9e7b4a1a5c015f https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.6-py310hefbff90_0.conda#b0cea2c364bf65cd19e023040eeab05d https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 @@ -168,7 +168,7 @@ https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda#11 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py310hf779ad0_1.conda#702cd87d652ec1956ee503b9e16bb1c0 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py310h3788b33_0.conda#b6420d29123c7c823de168f49ccdfe6a https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.7.0-h40b2b14_1.conda#8a77895fb29728b736a1a6c75906ea1a -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a04073db11c2c86c555fb088acc8f8c1 +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.9-he3c4edf_0.conda#5455c1a77c2aa337f04d94ff0ef413c3 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py310hf779ad0_2.conda#4906d8c3680f6c1273ad5a5775807867 https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh8b19718_0.conda#67bdec43082fd8a9cffb9484420b39a2 https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda#2b694bad8a50dc2f712f5368de866480 @@ -177,27 +177,27 @@ https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0. https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py310hc8bbb35_2.conda#0937b0e88a24c82e02d5b714acc9957c https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py310h03d9f68_0.conda#c3b1f5bc28ae6282ba95156d18fde825 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda#9272daa869e03efe68833e3dc7a02130 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.0.0-pyhcf101f3_0.conda#0d574419484a88ee7e753cc0c80ee2c1 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.1.0-pyhcf101f3_0.conda#047d1cc5b89b7b15e2a368976e70fb1d https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py310h139afa4_1.conda#3741aefc198dfed2e3c9adc79d706bb7 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py310hf779ad0_1.conda#5e4aea6b728177b53e8a216922ebd6a2 https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.45.0-h83bc92c_0.conda#a981ecc85b1ff6307b8f09cf66b77083 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.46.0-h1c03fa5_1.conda#1c4634d840fc26122fa2fa0f2430c8e6 https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.16-pyhd8ed1ab_0.conda#8bc5851c415865334882157127e75799 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.17-pyhd8ed1ab_0.conda#5b7ae2ec4e0750e094f804a6cf1b2a37 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py310hfde16b3_0.conda#093b60a14d2c0d8c10f17e14a73a60d3 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py310hd27e1a9_102.conda#424961f9f166613016bc4737796ef44b +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py310h21e55d4_104.conda#795e0bf8ab211cd6894fa8fa4067daa0 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda#6891acad5e136cb62a8c2ed2679d6528 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda#c65df89a0b2e321045a9e01d1337b182 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 -https://conda.anaconda.org/conda-forge/noarch/tox-4.46.3-pyhcf101f3_0.conda#fffac8cbe3056aab524ee3f65b0e6676 +https://conda.anaconda.org/conda-forge/noarch/tox-4.48.1-pyhcf101f3_0.conda#5e5466d28fb271ed1f468d4cbe0ba977 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py310h0158d43_1.conda#871b5f746960f99ac23dbc73d14e2ad0 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda#7f3ac694319c7eaf81a0325d6405e974 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.45.0-np2py310h99de88f_1.conda#775e439c57d4c2f8e54cae32c6d5ce5e +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.46.0-np2py310h99de88f_0.conda#5cd2885529c45190b7374d8c79176a6f https://conda.anaconda.org/conda-forge/noarch/iris-3.11.1-pyha770c72_1.conda#f501583062225a070455d011d81b07bf -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.2.11-pyhd8ed1ab_0.conda#a2666a859b9b17cbab511faf7f49b346 +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.3.3-pyhd8ed1ab_0.conda#ebb0166e81b997a8609b1efc7a6bf036 https://conda.anaconda.org/conda-forge/noarch/nox-2026.2.9-pyhcf101f3_0.conda#f59e57ff0cf84c21b070c206bbaa27db https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index d499ae2a..7985ebd9 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -63,13 +63,13 @@ https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.cond https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda#fb53fb07ce46a575c5d004bbc96032c2 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda#12bd9a3f089ee6c9266a37dab82afabd -https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda#8e7251989bca326a28f4a5ffbd74557a +https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.2-h73754d4_0.conda#8eaba3d1a4d7525c6814e861614457fd https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda#b499ce4b026493a13774bcf0f4c33849 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda#be43915efc66345cccb3c310b6ed0374 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda#da5be73701eecd0e8454423fd6ffcf30 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda#fd893f6a3002a635b5e50ceb9dd2c0f4 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#cd5a90476766d53e901500df9215e927 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-hca6bf5a_1.conda#3fdd8d99683da9fe279c2f4cecd1e048 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda#f3bc152cb4f86babe30f3a4bf0dbef69 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda#861fb6ccbc677bb9a9fb2468430b9c6a @@ -77,32 +77,34 @@ https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda#8c https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda#6f2e2c8f58160147c4d1c6f4c14cbac4 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda#c160954f7418d7b6e87eaf05a8913fa9 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.18.0-hcf29cc6_1.conda#1707cdd636af2ff697b53186572c9f77 -https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda#f4084e4e6577797150f9b04a4560ceb0 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-he237659_1.conda#417955234eccd8f252b86a265ccdab7f +https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.2-ha770c72_0.conda#26c746d14402a3b6c684d045b23b9437 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda#e49238a1609f9a4a844b09d9926f2c3d https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd -https://conda.anaconda.org/conda-forge/linux-64/python-3.11.14-hd63d673_3_cpython.conda#26d8f4db8c578dedba9f2c11423e59e5 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.51.2-h04a0ce9_0.conda#bb88d9335d09e54c7e6b5529d1856917 +https://conda.anaconda.org/conda-forge/linux-64/python-3.11.15-hd63d673_0_cpython.conda#a5ebcefec0c12a333bcd6d7bf3bddc1f +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.52.0-h04a0ce9_0.conda#7d9d7efe9541d4bb71b5934e8ee348ea https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda#34e54f03dfea3e7a2dcf1453a85f1085 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda#8f37c8fb7116a18da04e52fa9e2c8df9 https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda#537296d57ea995666c68c821b00e360b +https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda#f1976ce927373500cc19d3c0b2c85177 https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py311h6b1f9c4_0.conda#adda5ef2a74c9bdb338ff8a51192898a https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py311h66f275b_1.conda#86daecb8e4ed1042d5dc6efbe0152590 -https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.1-pyhd8ed1ab_0.conda#aa5a912c855a6e64e8a92e03f6fd3e96 +https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.3-pyhd8ed1ab_0.conda#8a7ead9f9c99bcdd2dda94f31cfb4f4b https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda#765c4d97e877cdbbb88ff33152b86125 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda#a22d1fd9bf98827e280a02875d9a007a +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.5-pyhd8ed1ab_0.conda#beb628209b2b354b98203066f90b3287 https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda#ea8a6c3256897cc31263de9f455e25d9 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda#61b8078a0905b12529abc622406cb62c https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/colorlog-6.10.1-pyh707e725_0.conda#33e96df3785bf61676ffee387e5a19e5 +https://conda.anaconda.org/conda-forge/noarch/cpython-3.11.15-py311hd8ed1ab_0.conda#bf0d09d5c2b61aaf7b11c551c8545cfa https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda#4c2a8fef270f6c69591889b93f9f55c1 https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc -https://conda.anaconda.org/conda-forge/noarch/filelock-3.24.3-pyhd8ed1ab_0.conda#9dbb20eec24beb026291c20a35ce1ff9 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.25.0-pyhd8ed1ab_0.conda#49a92015e912176999ae81bea11ea778 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda#4afc585cd97ba8a23809406cd8a9eda8 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.2-ha770c72_0.conda#eeec961fec28e747e1e1dc0446277452 https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.2.0-pyhd8ed1ab_0.conda#496c6c9411a6284addf55c898d6ed8d7 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h19486de_106.conda#c223ee1429ba538f3e48cfb4a0b97357 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e @@ -116,7 +118,7 @@ https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py311h724c32c_2 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda#6636a2b6f1a87572df2970d3ebc87cc0 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda#b38076eb5c8e40d0106beda6f95d7609 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py311h3778330_0.conda#0954f1a6a26df4a510b54f73b2a0345c +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py311h3778330_1.conda#f9efdf9b0f3d0cc309d56af6edf2a6b0 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda#b76541e68fea4d511b1ac46a28dcd2c6 https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py311hf88fc01_0.conda#0415141f4e3d4dad3c39ad4718936352 @@ -129,7 +131,6 @@ https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.3-pyhd8ed1ab_0.conda#c138c7aaa6a10b5762dcd92247864aff https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.6.0-py311h041eb40_1.conda#9dcb9824894fb920414608447ccdf3ce -https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py311h3778330_1.conda#a24add9a3bababee946f3bc1c829acfe https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda#0dc48b4b570931adc8641e55c6c17fe4 https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.0-pyh332efcf_0.conda#1d00d46c634177fc8ede8b99d6089239 @@ -138,12 +139,12 @@ https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda#0 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda#755cf22df8693aa0d1aec1c123fa5863 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda#72e780e9aa2d0a3295f59b1874e3768b +https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda#32e37e8fe9ef45c637ee38ad51377769 https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda#c07a6153f8306e45794774cf9b13bd32 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py311h49ec1c0_0.conda#2889f0c0b6a6d7a37bd64ec60f4cc210 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda#30cd29cb87d819caead4d55184c1d115 -https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_0.conda#ea5be9abc2939c8431893b4e123a2065 https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py311h03d9500_1.conda#3912e4373de46adafd8f1e97e4bd166b https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.4-py311h3778330_0.conda#6b1b19bdc407007d5e41079eab797ddc https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 @@ -155,22 +156,24 @@ https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc4 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda#04558c96691bed63104678757beb4f8d -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.3-nompi_hbf2fc22_104.conda#a2956b63b1851e9d5eb9f882d02fa3a9 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.10.0-nompi_hbf2fc22_100.conda#0eb36a09dad274e750d60b49aaec0af7 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda#eb52d14a901e23c39e9e7b4a1a5c015f https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.2-py311h2e04523_1.conda#a8105076864776eceae69d64d30e24d7 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py311h4e6619b_2.conda#8092837339ae2e3697980df6686f996e +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py311h400b93a_3.conda#4582b11f49c2dff4e806218fcf292eff https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.1.0-pyhcf101f3_0.conda#ee4e2cad073411bdfa8598f599537498 +https://conda.anaconda.org/conda-forge/noarch/python-gil-3.11.15-hd8ed1ab_0.conda#8793751936480e56ce4047b4f54b997f https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda#28687768633154993d521aecfa4a56ac https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 https://conda.anaconda.org/conda-forge/noarch/wheel-0.46.3-pyhd8ed1ab_0.conda#bdbd7385b4a67025ac2dba4ef8cb6a8f +https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda#11a2b8c732d215d977998ccd69a9d5e8 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py311h0372a8f_1.conda#77cf197e2f03986b6505bab6e214d22a https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py311h724c32c_4.conda#d04e508f5a03162c8bab4586a65d00bf https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.1.2-pyhcf101f3_0.conda#b20e7ce9afd59036ab194f3d1e27edf5 -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a04073db11c2c86c555fb088acc8f8c1 +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.9-he3c4edf_0.conda#5455c1a77c2aa337f04d94ff0ef413c3 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py311h0372a8f_2.conda#487756753716efba090d06c71fb73eb6 https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh8b19718_0.conda#67bdec43082fd8a9cffb9484420b39a2 https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda#2b694bad8a50dc2f712f5368de866480 @@ -179,26 +182,26 @@ https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0. https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py311h8a92878_2.conda#b37c338ff0f69883188c9b3b127be059 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py311hdf67eae_0.conda#5a715cf5e3dc6cd68717c50e47dd7b6b https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda#9272daa869e03efe68833e3dc7a02130 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.0.0-pyhcf101f3_0.conda#0d574419484a88ee7e753cc0c80ee2c1 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.1.0-pyhcf101f3_0.conda#047d1cc5b89b7b15e2a368976e70fb1d https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py311haee01d2_1.conda#ca45bfd4871af957aaa5035593d5efd2 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.1-py311h0372a8f_0.conda#dd96428f7ee2aef4dc32076631418323 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.45.0-h83bc92c_0.conda#a981ecc85b1ff6307b8f09cf66b77083 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.46.0-h1c03fa5_1.conda#1c4634d840fc26122fa2fa0f2430c8e6 https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.16-pyhd8ed1ab_0.conda#8bc5851c415865334882157127e75799 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.17-pyhd8ed1ab_0.conda#5b7ae2ec4e0750e094f804a6cf1b2a37 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py311h0f3be63_0.conda#21a0139015232dc0edbf6c2179b5ec24 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py311h66524b1_102.conda#aebe42b1c8b797e41fb7d7d05ebc5932 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py311ha0596eb_105.conda#71b833f92f41ab92b16ca9f87e8735fe https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda#6891acad5e136cb62a8c2ed2679d6528 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda#c65df89a0b2e321045a9e01d1337b182 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 -https://conda.anaconda.org/conda-forge/noarch/tox-4.46.3-pyhcf101f3_0.conda#fffac8cbe3056aab524ee3f65b0e6676 +https://conda.anaconda.org/conda-forge/noarch/tox-4.48.1-pyhcf101f3_0.conda#5e5466d28fb271ed1f468d4cbe0ba977 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py311hed34c8f_1.conda#17c710c32010688086b28c088a8be579 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda#7f3ac694319c7eaf81a0325d6405e974 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.45.0-np2py311h50facf7_1.conda#c29c3bf5965c5831d6d759ae1b5c58b3 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.46.0-np2py311h50facf7_0.conda#14a6d65bf8496ee5cd538d6dffb7d2b3 https://conda.anaconda.org/conda-forge/noarch/iris-3.14.1-pyha770c72_0.conda#0b6f532e907ce57be6905bd6d44fbe71 -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.2.11-pyhd8ed1ab_0.conda#a2666a859b9b17cbab511faf7f49b346 +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.3.3-pyhd8ed1ab_0.conda#ebb0166e81b997a8609b1efc7a6bf036 https://conda.anaconda.org/conda-forge/noarch/nox-2026.2.9-pyhcf101f3_0.conda#f59e57ff0cf84c21b070c206bbaa27db https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 56b50512..6533161f 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -63,13 +63,13 @@ https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.cond https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda#fb53fb07ce46a575c5d004bbc96032c2 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda#12bd9a3f089ee6c9266a37dab82afabd -https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda#8e7251989bca326a28f4a5ffbd74557a +https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.2-h73754d4_0.conda#8eaba3d1a4d7525c6814e861614457fd https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda#b499ce4b026493a13774bcf0f4c33849 https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda#be43915efc66345cccb3c310b6ed0374 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.2-hf4e2dac_0.conda#da5be73701eecd0e8454423fd6ffcf30 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda#fd893f6a3002a635b5e50ceb9dd2c0f4 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#cd5a90476766d53e901500df9215e927 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-hca6bf5a_1.conda#3fdd8d99683da9fe279c2f4cecd1e048 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda#f3bc152cb4f86babe30f3a4bf0dbef69 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda#861fb6ccbc677bb9a9fb2468430b9c6a @@ -77,32 +77,34 @@ https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda#8c https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda#6f2e2c8f58160147c4d1c6f4c14cbac4 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda#c160954f7418d7b6e87eaf05a8913fa9 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.18.0-hcf29cc6_1.conda#1707cdd636af2ff697b53186572c9f77 -https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda#f4084e4e6577797150f9b04a4560ceb0 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-he237659_1.conda#417955234eccd8f252b86a265ccdab7f +https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.2-ha770c72_0.conda#26c746d14402a3b6c684d045b23b9437 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda#e49238a1609f9a4a844b09d9926f2c3d https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd -https://conda.anaconda.org/conda-forge/linux-64/python-3.12.12-hd63d673_2_cpython.conda#c4540d3de3fa228d9fa95e31f8e97f89 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.51.2-h04a0ce9_0.conda#bb88d9335d09e54c7e6b5529d1856917 +https://conda.anaconda.org/conda-forge/linux-64/python-3.12.13-hd63d673_0_cpython.conda#7eccb41177e15cc672e1babe9056018e +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.52.0-h04a0ce9_0.conda#7d9d7efe9541d4bb71b5934e8ee348ea https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda#34e54f03dfea3e7a2dcf1453a85f1085 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda#8f37c8fb7116a18da04e52fa9e2c8df9 https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda#537296d57ea995666c68c821b00e360b +https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda#f1976ce927373500cc19d3c0b2c85177 https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py312h90b7ffd_0.conda#5b8c55fed2e576dde4b0b33693a4fdb1 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py312hdb49522_1.conda#64088dffd7413a2dd557ce837b4cbbdb -https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.1-pyhd8ed1ab_0.conda#aa5a912c855a6e64e8a92e03f6fd3e96 +https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.3-pyhd8ed1ab_0.conda#8a7ead9f9c99bcdd2dda94f31cfb4f4b https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda#765c4d97e877cdbbb88ff33152b86125 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda#a22d1fd9bf98827e280a02875d9a007a +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.5-pyhd8ed1ab_0.conda#beb628209b2b354b98203066f90b3287 https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda#ea8a6c3256897cc31263de9f455e25d9 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda#61b8078a0905b12529abc622406cb62c https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/colorlog-6.10.1-pyh707e725_0.conda#33e96df3785bf61676ffee387e5a19e5 +https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_0.conda#f54c1ffb8ecedb85a8b7fcde3a187212 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda#4c2a8fef270f6c69591889b93f9f55c1 https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc -https://conda.anaconda.org/conda-forge/noarch/filelock-3.24.3-pyhd8ed1ab_0.conda#9dbb20eec24beb026291c20a35ce1ff9 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.25.0-pyhd8ed1ab_0.conda#49a92015e912176999ae81bea11ea778 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda#4afc585cd97ba8a23809406cd8a9eda8 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.2-ha770c72_0.conda#eeec961fec28e747e1e1dc0446277452 https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.2.0-pyhd8ed1ab_0.conda#496c6c9411a6284addf55c898d6ed8d7 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h19486de_106.conda#c223ee1429ba538f3e48cfb4a0b97357 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e @@ -116,7 +118,7 @@ https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py312h0a2e395_2 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda#6636a2b6f1a87572df2970d3ebc87cc0 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda#b38076eb5c8e40d0106beda6f95d7609 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_0.conda#f775a43412f7f3d7ed218113ad233869 +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda#93a4752d42b12943a355b682ee43285b https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda#b76541e68fea4d511b1ac46a28dcd2c6 https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py312h50c33e8_0.conda#c5eff3ada1a829f0bdb780dc4b62bbae @@ -129,7 +131,6 @@ https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.3-pyhd8ed1ab_0.conda#c138c7aaa6a10b5762dcd92247864aff https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.6.0-py312h0d868a3_1.conda#1cfb9b04c827219597def32c22fb9ca2 -https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda#15878599a87992e44c059731771591cb https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda#0dc48b4b570931adc8641e55c6c17fe4 https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.0-pyh332efcf_0.conda#1d00d46c634177fc8ede8b99d6089239 @@ -138,12 +139,12 @@ https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda#0 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda#755cf22df8693aa0d1aec1c123fa5863 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda#72e780e9aa2d0a3295f59b1874e3768b +https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda#32e37e8fe9ef45c637ee38ad51377769 https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda#c07a6153f8306e45794774cf9b13bd32 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975b_0.conda#0b6c506ec1f272b685240e70a29261b8 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda#30cd29cb87d819caead4d55184c1d115 -https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_0.conda#ea5be9abc2939c8431893b4e123a2065 https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py312h460c074_1.conda#648ee28dcd4e07a1940a17da62eccd40 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.4-py312h8a5da7c_0.conda#a8df7f0812ac4fa6bbc7135556d3e2c4 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 @@ -155,22 +156,24 @@ https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc4 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda#04558c96691bed63104678757beb4f8d -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.3-nompi_hbf2fc22_104.conda#a2956b63b1851e9d5eb9f882d02fa3a9 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.10.0-nompi_hbf2fc22_100.conda#0eb36a09dad274e750d60b49aaec0af7 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda#eb52d14a901e23c39e9e7b4a1a5c015f https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.2-py312h33ff503_1.conda#3569a8fca2dd3202e4ab08f42499f6d3 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py312h9b6a7d9_2.conda#573b9a879a3a42990f9c51d7376dce6b +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py312he675c61_3.conda#c3258c31e507a81f0b52156bcca81e73 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.1.0-pyhcf101f3_0.conda#ee4e2cad073411bdfa8598f599537498 +https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.13-hd8ed1ab_0.conda#32780d6794b8056b78602103a04e90ef https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda#28687768633154993d521aecfa4a56ac https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 https://conda.anaconda.org/conda-forge/noarch/wheel-0.46.3-pyhd8ed1ab_0.conda#bdbd7385b4a67025ac2dba4ef8cb6a8f +https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda#11a2b8c732d215d977998ccd69a9d5e8 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py312h4f23490_1.conda#84bf349fad55056ed326fc550671b65c https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda#43c2bc96af3ae5ed9e8a10ded942aa50 https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.1.2-pyhcf101f3_0.conda#b20e7ce9afd59036ab194f3d1e27edf5 -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.8-he3c4edf_0.conda#a04073db11c2c86c555fb088acc8f8c1 +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.9-he3c4edf_0.conda#5455c1a77c2aa337f04d94ff0ef413c3 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h4f23490_2.conda#cec5bc5f7d374f8f8095f8e28e31f6cb https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh8b19718_0.conda#67bdec43082fd8a9cffb9484420b39a2 https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda#2b694bad8a50dc2f712f5368de866480 @@ -179,26 +182,26 @@ https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0. https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py312h383787d_2.conda#69e400d3deca12ee7afd4b73a5596905 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py312hd9148b4_0.conda#55fd03988b1b1bc6faabbfb5b481ecd7 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda#9272daa869e03efe68833e3dc7a02130 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.0.0-pyhcf101f3_0.conda#0d574419484a88ee7e753cc0c80ee2c1 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.1.0-pyhcf101f3_0.conda#047d1cc5b89b7b15e2a368976e70fb1d https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py312h5253ce2_1.conda#02738ff9855946075cbd1b5274399a41 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.1-py312h4f23490_0.conda#6aef45ba3c0123547eb7b0f15852cac9 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.45.0-h83bc92c_0.conda#a981ecc85b1ff6307b8f09cf66b77083 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.46.0-h1c03fa5_1.conda#1c4634d840fc26122fa2fa0f2430c8e6 https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.16-pyhd8ed1ab_0.conda#8bc5851c415865334882157127e75799 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.17-pyhd8ed1ab_0.conda#5b7ae2ec4e0750e094f804a6cf1b2a37 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py312he3d6523_0.conda#b8dc157bbbb69c1407478feede8b7b42 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py312h25f8dc5_102.conda#99217b58c029977345b72bb36a1f6596 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py311ha0596eb_105.conda#71b833f92f41ab92b16ca9f87e8735fe https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda#6891acad5e136cb62a8c2ed2679d6528 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda#c65df89a0b2e321045a9e01d1337b182 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 -https://conda.anaconda.org/conda-forge/noarch/tox-4.46.3-pyhcf101f3_0.conda#fffac8cbe3056aab524ee3f65b0e6676 +https://conda.anaconda.org/conda-forge/noarch/tox-4.48.1-pyhcf101f3_0.conda#5e5466d28fb271ed1f468d4cbe0ba977 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py312hf79963d_1.conda#6c913a686cb4060cbd7639a36fa144f0 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda#7f3ac694319c7eaf81a0325d6405e974 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.45.0-np2py312hfb8c2c5_1.conda#66f8d5e7005b9d38b4c1cd00068881ae +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.46.0-np2py312hfb8c2c5_0.conda#fe3e310aa4a84610012a3889e23d76eb https://conda.anaconda.org/conda-forge/noarch/iris-3.14.1-pyha770c72_0.conda#0b6f532e907ce57be6905bd6d44fbe71 -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.2.11-pyhd8ed1ab_0.conda#a2666a859b9b17cbab511faf7f49b346 +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.3.3-pyhd8ed1ab_0.conda#ebb0166e81b997a8609b1efc7a6bf036 https://conda.anaconda.org/conda-forge/noarch/nox-2026.2.9-pyhcf101f3_0.conda#f59e57ff0cf84c21b070c206bbaa27db https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff From f0b37c59805570bf74d3e2f808ffc75abbf99d8c Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 16 Mar 2026 10:45:52 +0000 Subject: [PATCH 544/583] Updated environment lockfiles (#761) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 24 +++++++++++----------- requirements/locks/py311-linux-64.lock | 28 +++++++++++++------------- requirements/locks/py312-linux-64.lock | 28 +++++++++++++------------- 3 files changed, 40 insertions(+), 40 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 98acc841..e8ecc606 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -37,7 +37,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb47aa4a_0.conda#60 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.1-h480dda7_0.conda#4d4efd0645cd556fab54617c4ad477ef https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda#186a18e3ba246eccfc7cff00cd19a870 -https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 +https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda#a752488c68f2e7c456bcbd8f16eec275 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda#86f7414544ae606282352fa1e116b41f https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda#366b40a69f0ad6072561c1d09301c886 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda#4ffbb341c8b616aa2494b6afb26a0c5f @@ -76,7 +76,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.co https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda#8ccf913aaba749a5496c17629d859ed1 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda#6f2e2c8f58160147c4d1c6f4c14cbac4 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda#c160954f7418d7b6e87eaf05a8913fa9 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.18.0-hcf29cc6_1.conda#1707cdd636af2ff697b53186572c9f77 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda#d50608c443a30c341c24277d28290f76 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.2-ha770c72_0.conda#26c746d14402a3b6c684d045b23b9437 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda#e49238a1609f9a4a844b09d9926f2c3d https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd @@ -90,7 +90,7 @@ https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda#53 https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda#f1976ce927373500cc19d3c0b2c85177 https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py310h69bd2ac_0.conda#276a3ddf300498921601822e3b407088 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py310hba01987_1.conda#393fca4557fbd2c4d995dcb89f569048 -https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.3-pyhd8ed1ab_0.conda#8a7ead9f9c99bcdd2dda94f31cfb4f4b +https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.5-pyhd8ed1ab_0.conda#a66a1542c3ed584ca4fdb23955d81e91 https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda#765c4d97e877cdbbb88ff33152b86125 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.5-pyhd8ed1ab_0.conda#beb628209b2b354b98203066f90b3287 @@ -101,7 +101,7 @@ https://conda.anaconda.org/conda-forge/noarch/colorlog-6.10.1-pyh707e725_0.conda https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda#4c2a8fef270f6c69591889b93f9f55c1 https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc -https://conda.anaconda.org/conda-forge/noarch/filelock-3.25.0-pyhd8ed1ab_0.conda#49a92015e912176999ae81bea11ea778 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.25.2-pyhd8ed1ab_0.conda#f58064cec97b12a7136ebb8a6f8a129b https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.2-ha770c72_0.conda#eeec961fec28e747e1e1dc0446277452 https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.2.0-pyhd8ed1ab_0.conda#496c6c9411a6284addf55c898d6ed8d7 @@ -113,7 +113,7 @@ https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda#53abe https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda#9614359868482abba1bd15ce465e3c42 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de -https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py310haaf941d_2.conda#7426d76535fc6347f1b74f85fb17d6eb +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py310haaf941d_0.conda#8993ab7e5dce89147288dd78686e790c https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda#6636a2b6f1a87572df2970d3ebc87cc0 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda#b38076eb5c8e40d0106beda6f95d7609 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 @@ -121,7 +121,7 @@ https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py310h3406613_1 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda#b76541e68fea4d511b1ac46a28dcd2c6 https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py310h5a73078_0.conda#5e79faa7f34986b6124525f3d234512e -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.2-pyhcf101f3_0.conda#4fefefb892ce9cc1539405bec2f1a6cd +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda#82c1787f2a65c0155ef9652466ee98d6 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda#d7585b6550ad04c8c5e21097ada2888e https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h18fbb6c_2.conda#1aeede769ec2fa0f474f8b73a7ac057f https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef @@ -131,7 +131,7 @@ https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.3-pyhd8ed1ab_0.conda#c13 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.6.0-py310hf3bd8b6_1.conda#a49d7089a9d44aa209f970fc0e5abd1c https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py310h3406613_1.conda#2160894f57a40d2d629a34ee8497795f -https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.0-pyh332efcf_0.conda#1d00d46c634177fc8ede8b99d6089239 +https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda#8e194e7b992f99a5015edbd4ebd38efd https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda#03fe290994c5e4ec17293cfb6bdce520 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda#755cf22df8693aa0d1aec1c123fa5863 @@ -147,7 +147,7 @@ https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py310he7384ee_1.conda https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.4-py310h3406613_0.conda#be1cd42538c1a1f587ea319f756ecc37 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda#8e662bd460bda79b1ea39194e3c4c9ab -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.61.1-py310h3406613_0.conda#24fa891e40acdb1c7f51efd0c5f97084 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.62.0-py310h3406613_0.conda#5ec9c93a61d857c8bdefdcebd49a5ef8 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda#b8993c19b0c32a2f7b66cbb58ca27069 https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 @@ -161,7 +161,7 @@ https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0ba https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py310h71d0299_1.conda#e54b1eaeb50ad1767680181a8575a8db https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 -https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.1.0-pyhcf101f3_0.conda#ee4e2cad073411bdfa8598f599537498 +https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.1.3-pyhcf101f3_0.conda#69fc0a99fc21b26b81026c72e00f83df https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 https://conda.anaconda.org/conda-forge/noarch/wheel-0.46.3-pyhd8ed1ab_0.conda#bdbd7385b4a67025ac2dba4ef8cb6a8f https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda#11a2b8c732d215d977998ccd69a9d5e8 @@ -177,7 +177,7 @@ https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0. https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py310hc8bbb35_2.conda#0937b0e88a24c82e02d5b714acc9957c https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py310h03d9f68_0.conda#c3b1f5bc28ae6282ba95156d18fde825 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda#9272daa869e03efe68833e3dc7a02130 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.1.0-pyhcf101f3_0.conda#047d1cc5b89b7b15e2a368976e70fb1d +https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.2.0-pyhcf101f3_0.conda#704c22301912f7e37d0a92b2e7d5942d https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py310h139afa4_1.conda#3741aefc198dfed2e3c9adc79d706bb7 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py310hf779ad0_1.conda#5e4aea6b728177b53e8a216922ebd6a2 https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 @@ -190,14 +190,14 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.cond https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda#c65df89a0b2e321045a9e01d1337b182 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 -https://conda.anaconda.org/conda-forge/noarch/tox-4.48.1-pyhcf101f3_0.conda#5e5466d28fb271ed1f468d4cbe0ba977 +https://conda.anaconda.org/conda-forge/noarch/tox-4.49.1-pyhcf101f3_0.conda#51ae9b6c673003083102df769d5c13d2 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py310h0158d43_1.conda#871b5f746960f99ac23dbc73d14e2ad0 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda#7f3ac694319c7eaf81a0325d6405e974 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.46.0-np2py310h99de88f_0.conda#5cd2885529c45190b7374d8c79176a6f https://conda.anaconda.org/conda-forge/noarch/iris-3.11.1-pyha770c72_1.conda#f501583062225a070455d011d81b07bf -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.3.3-pyhd8ed1ab_0.conda#ebb0166e81b997a8609b1efc7a6bf036 +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.3.10-pyhd8ed1ab_0.conda#7680e9ff5808963d358f41accdb95dc9 https://conda.anaconda.org/conda-forge/noarch/nox-2026.2.9-pyhcf101f3_0.conda#f59e57ff0cf84c21b070c206bbaa27db https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 7985ebd9..d90dd16b 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -37,7 +37,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb47aa4a_0.conda#60 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.1-h480dda7_0.conda#4d4efd0645cd556fab54617c4ad477ef https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda#186a18e3ba246eccfc7cff00cd19a870 -https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 +https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda#a752488c68f2e7c456bcbd8f16eec275 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda#86f7414544ae606282352fa1e116b41f https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda#366b40a69f0ad6072561c1d09301c886 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda#4ffbb341c8b616aa2494b6afb26a0c5f @@ -76,7 +76,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.co https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda#8ccf913aaba749a5496c17629d859ed1 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda#6f2e2c8f58160147c4d1c6f4c14cbac4 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda#c160954f7418d7b6e87eaf05a8913fa9 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.18.0-hcf29cc6_1.conda#1707cdd636af2ff697b53186572c9f77 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda#d50608c443a30c341c24277d28290f76 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.2-ha770c72_0.conda#26c746d14402a3b6c684d045b23b9437 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda#e49238a1609f9a4a844b09d9926f2c3d https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd @@ -90,7 +90,7 @@ https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda#53 https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda#f1976ce927373500cc19d3c0b2c85177 https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py311h6b1f9c4_0.conda#adda5ef2a74c9bdb338ff8a51192898a https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py311h66f275b_1.conda#86daecb8e4ed1042d5dc6efbe0152590 -https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.3-pyhd8ed1ab_0.conda#8a7ead9f9c99bcdd2dda94f31cfb4f4b +https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.5-pyhd8ed1ab_0.conda#a66a1542c3ed584ca4fdb23955d81e91 https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda#765c4d97e877cdbbb88ff33152b86125 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.5-pyhd8ed1ab_0.conda#beb628209b2b354b98203066f90b3287 @@ -102,7 +102,7 @@ https://conda.anaconda.org/conda-forge/noarch/cpython-3.11.15-py311hd8ed1ab_0.co https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda#4c2a8fef270f6c69591889b93f9f55c1 https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc -https://conda.anaconda.org/conda-forge/noarch/filelock-3.25.0-pyhd8ed1ab_0.conda#49a92015e912176999ae81bea11ea778 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.25.2-pyhd8ed1ab_0.conda#f58064cec97b12a7136ebb8a6f8a129b https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.2-ha770c72_0.conda#eeec961fec28e747e1e1dc0446277452 https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.2.0-pyhd8ed1ab_0.conda#496c6c9411a6284addf55c898d6ed8d7 @@ -114,7 +114,7 @@ https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda#53abe https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda#9614359868482abba1bd15ce465e3c42 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de -https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py311h724c32c_2.conda#4089f739463c798e10d8644bc34e24de +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py311h724c32c_0.conda#3d82751e8d682068b58f049edc924ce4 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda#6636a2b6f1a87572df2970d3ebc87cc0 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda#b38076eb5c8e40d0106beda6f95d7609 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 @@ -122,9 +122,9 @@ https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py311h3778330_1 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda#b76541e68fea4d511b1ac46a28dcd2c6 https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py311hf88fc01_0.conda#0415141f4e3d4dad3c39ad4718936352 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.2-pyhcf101f3_0.conda#4fefefb892ce9cc1539405bec2f1a6cd +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda#82c1787f2a65c0155ef9652466ee98d6 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda#d7585b6550ad04c8c5e21097ada2888e -https://conda.anaconda.org/conda-forge/linux-64/proj-9.7.1-he0df7b0_3.conda#031e33ae075b336c0ce92b14efa886c5 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.8.0-he0df7b0_0.conda#3732388938fc3decf65b90884c2d8198 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda#3687cc0b82a8b4c17e1f0eb7e47163d5 @@ -133,7 +133,7 @@ https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#4 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.6.0-py311h041eb40_1.conda#9dcb9824894fb920414608447ccdf3ce https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py311h3778330_1.conda#a24add9a3bababee946f3bc1c829acfe https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda#0dc48b4b570931adc8641e55c6c17fe4 -https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.0-pyh332efcf_0.conda#1d00d46c634177fc8ede8b99d6089239 +https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda#8e194e7b992f99a5015edbd4ebd38efd https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda#03fe290994c5e4ec17293cfb6bdce520 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda#755cf22df8693aa0d1aec1c123fa5863 @@ -149,7 +149,7 @@ https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py311h03d9500_1.conda https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.4-py311h3778330_0.conda#6b1b19bdc407007d5e41079eab797ddc https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda#8e662bd460bda79b1ea39194e3c4c9ab -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.61.1-py311h3778330_0.conda#2e8ccb31890a95d5cd90d74a11c7d5e2 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.62.0-py311h3778330_0.conda#bd4aa764c1b2f877aff5049f26cbffde https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda#b8993c19b0c32a2f7b66cbb58ca27069 https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 @@ -160,10 +160,10 @@ https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.10.0-nompi_hbf2fc22_ https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda#eb52d14a901e23c39e9e7b4a1a5c015f https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.2-py311h2e04523_1.conda#a8105076864776eceae69d64d30e24d7 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py311h400b93a_3.conda#4582b11f49c2dff4e806218fcf292eff +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py311hc7c0204_4.conda#17f22789a811c010b53542bd6b2aeb14 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 -https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.1.0-pyhcf101f3_0.conda#ee4e2cad073411bdfa8598f599537498 +https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.1.3-pyhcf101f3_0.conda#69fc0a99fc21b26b81026c72e00f83df https://conda.anaconda.org/conda-forge/noarch/python-gil-3.11.15-hd8ed1ab_0.conda#8793751936480e56ce4047b4f54b997f https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda#28687768633154993d521aecfa4a56ac https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 @@ -182,7 +182,7 @@ https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0. https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py311h8a92878_2.conda#b37c338ff0f69883188c9b3b127be059 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py311hdf67eae_0.conda#5a715cf5e3dc6cd68717c50e47dd7b6b https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda#9272daa869e03efe68833e3dc7a02130 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.1.0-pyhcf101f3_0.conda#047d1cc5b89b7b15e2a368976e70fb1d +https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.2.0-pyhcf101f3_0.conda#704c22301912f7e37d0a92b2e7d5942d https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py311haee01d2_1.conda#ca45bfd4871af957aaa5035593d5efd2 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.1-py311h0372a8f_0.conda#dd96428f7ee2aef4dc32076631418323 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.46.0-h1c03fa5_1.conda#1c4634d840fc26122fa2fa0f2430c8e6 @@ -194,14 +194,14 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.cond https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda#c65df89a0b2e321045a9e01d1337b182 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 -https://conda.anaconda.org/conda-forge/noarch/tox-4.48.1-pyhcf101f3_0.conda#5e5466d28fb271ed1f468d4cbe0ba977 +https://conda.anaconda.org/conda-forge/noarch/tox-4.49.1-pyhcf101f3_0.conda#51ae9b6c673003083102df769d5c13d2 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py311hed34c8f_1.conda#17c710c32010688086b28c088a8be579 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda#7f3ac694319c7eaf81a0325d6405e974 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.46.0-np2py311h50facf7_0.conda#14a6d65bf8496ee5cd538d6dffb7d2b3 https://conda.anaconda.org/conda-forge/noarch/iris-3.14.1-pyha770c72_0.conda#0b6f532e907ce57be6905bd6d44fbe71 -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.3.3-pyhd8ed1ab_0.conda#ebb0166e81b997a8609b1efc7a6bf036 +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.3.10-pyhd8ed1ab_0.conda#7680e9ff5808963d358f41accdb95dc9 https://conda.anaconda.org/conda-forge/noarch/nox-2026.2.9-pyhcf101f3_0.conda#f59e57ff0cf84c21b070c206bbaa27db https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 6533161f..b79c67e9 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -37,7 +37,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb47aa4a_0.conda#60 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.1-h480dda7_0.conda#4d4efd0645cd556fab54617c4ad477ef https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda#186a18e3ba246eccfc7cff00cd19a870 -https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda#9344155d33912347b37f0ae6c410a835 +https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda#a752488c68f2e7c456bcbd8f16eec275 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda#86f7414544ae606282352fa1e116b41f https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda#366b40a69f0ad6072561c1d09301c886 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda#4ffbb341c8b616aa2494b6afb26a0c5f @@ -76,7 +76,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.co https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda#8ccf913aaba749a5496c17629d859ed1 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda#6f2e2c8f58160147c4d1c6f4c14cbac4 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda#c160954f7418d7b6e87eaf05a8913fa9 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.18.0-hcf29cc6_1.conda#1707cdd636af2ff697b53186572c9f77 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda#d50608c443a30c341c24277d28290f76 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.2-ha770c72_0.conda#26c746d14402a3b6c684d045b23b9437 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda#e49238a1609f9a4a844b09d9926f2c3d https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd @@ -90,7 +90,7 @@ https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda#53 https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda#f1976ce927373500cc19d3c0b2c85177 https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py312h90b7ffd_0.conda#5b8c55fed2e576dde4b0b33693a4fdb1 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py312hdb49522_1.conda#64088dffd7413a2dd557ce837b4cbbdb -https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.3-pyhd8ed1ab_0.conda#8a7ead9f9c99bcdd2dda94f31cfb4f4b +https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.5-pyhd8ed1ab_0.conda#a66a1542c3ed584ca4fdb23955d81e91 https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda#765c4d97e877cdbbb88ff33152b86125 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.5-pyhd8ed1ab_0.conda#beb628209b2b354b98203066f90b3287 @@ -102,7 +102,7 @@ https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_0.co https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda#4c2a8fef270f6c69591889b93f9f55c1 https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc -https://conda.anaconda.org/conda-forge/noarch/filelock-3.25.0-pyhd8ed1ab_0.conda#49a92015e912176999ae81bea11ea778 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.25.2-pyhd8ed1ab_0.conda#f58064cec97b12a7136ebb8a6f8a129b https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.2-ha770c72_0.conda#eeec961fec28e747e1e1dc0446277452 https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.2.0-pyhd8ed1ab_0.conda#496c6c9411a6284addf55c898d6ed8d7 @@ -114,7 +114,7 @@ https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda#53abe https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda#9614359868482abba1bd15ce465e3c42 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de -https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py312h0a2e395_2.conda#3a3004fddd39e3bb1a631b08d7045156 +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py312h0a2e395_0.conda#cd74a9525dc74bbbf93cf8aa2fa9eb5b https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda#6636a2b6f1a87572df2970d3ebc87cc0 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda#b38076eb5c8e40d0106beda6f95d7609 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 @@ -122,9 +122,9 @@ https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda#b76541e68fea4d511b1ac46a28dcd2c6 https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py312h50c33e8_0.conda#c5eff3ada1a829f0bdb780dc4b62bbae -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.2-pyhcf101f3_0.conda#4fefefb892ce9cc1539405bec2f1a6cd +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda#82c1787f2a65c0155ef9652466ee98d6 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda#d7585b6550ad04c8c5e21097ada2888e -https://conda.anaconda.org/conda-forge/linux-64/proj-9.7.1-he0df7b0_3.conda#031e33ae075b336c0ce92b14efa886c5 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.8.0-he0df7b0_0.conda#3732388938fc3decf65b90884c2d8198 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda#3687cc0b82a8b4c17e1f0eb7e47163d5 @@ -133,7 +133,7 @@ https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#4 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.6.0-py312h0d868a3_1.conda#1cfb9b04c827219597def32c22fb9ca2 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda#15878599a87992e44c059731771591cb https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda#0dc48b4b570931adc8641e55c6c17fe4 -https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.0-pyh332efcf_0.conda#1d00d46c634177fc8ede8b99d6089239 +https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda#8e194e7b992f99a5015edbd4ebd38efd https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda#03fe290994c5e4ec17293cfb6bdce520 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda#755cf22df8693aa0d1aec1c123fa5863 @@ -149,7 +149,7 @@ https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py312h460c074_1.conda https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.4-py312h8a5da7c_0.conda#a8df7f0812ac4fa6bbc7135556d3e2c4 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda#8e662bd460bda79b1ea39194e3c4c9ab -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.61.1-py312h8a5da7c_0.conda#3bf8fb959dc598c67dac0430b4aff57a +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.62.0-py312h8a5da7c_0.conda#526f7ffd63820e55d7992cc1cf931a36 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda#b8993c19b0c32a2f7b66cbb58ca27069 https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 @@ -160,10 +160,10 @@ https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.10.0-nompi_hbf2fc22_ https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda#eb52d14a901e23c39e9e7b4a1a5c015f https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.2-py312h33ff503_1.conda#3569a8fca2dd3202e4ab08f42499f6d3 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py312he675c61_3.conda#c3258c31e507a81f0b52156bcca81e73 +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py312hbc8341d_4.conda#9d5ea11aefbdf548a2d8c965c1b2ebad https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 -https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.1.0-pyhcf101f3_0.conda#ee4e2cad073411bdfa8598f599537498 +https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.1.3-pyhcf101f3_0.conda#69fc0a99fc21b26b81026c72e00f83df https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.13-hd8ed1ab_0.conda#32780d6794b8056b78602103a04e90ef https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda#28687768633154993d521aecfa4a56ac https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 @@ -182,7 +182,7 @@ https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0. https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py312h383787d_2.conda#69e400d3deca12ee7afd4b73a5596905 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py312hd9148b4_0.conda#55fd03988b1b1bc6faabbfb5b481ecd7 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda#9272daa869e03efe68833e3dc7a02130 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.1.0-pyhcf101f3_0.conda#047d1cc5b89b7b15e2a368976e70fb1d +https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.2.0-pyhcf101f3_0.conda#704c22301912f7e37d0a92b2e7d5942d https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py312h5253ce2_1.conda#02738ff9855946075cbd1b5274399a41 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.1-py312h4f23490_0.conda#6aef45ba3c0123547eb7b0f15852cac9 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.46.0-h1c03fa5_1.conda#1c4634d840fc26122fa2fa0f2430c8e6 @@ -194,14 +194,14 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.cond https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda#c65df89a0b2e321045a9e01d1337b182 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 -https://conda.anaconda.org/conda-forge/noarch/tox-4.48.1-pyhcf101f3_0.conda#5e5466d28fb271ed1f468d4cbe0ba977 +https://conda.anaconda.org/conda-forge/noarch/tox-4.49.1-pyhcf101f3_0.conda#51ae9b6c673003083102df769d5c13d2 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py312hf79963d_1.conda#6c913a686cb4060cbd7639a36fa144f0 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda#7f3ac694319c7eaf81a0325d6405e974 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.46.0-np2py312hfb8c2c5_0.conda#fe3e310aa4a84610012a3889e23d76eb https://conda.anaconda.org/conda-forge/noarch/iris-3.14.1-pyha770c72_0.conda#0b6f532e907ce57be6905bd6d44fbe71 -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.3.3-pyhd8ed1ab_0.conda#ebb0166e81b997a8609b1efc7a6bf036 +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.3.10-pyhd8ed1ab_0.conda#7680e9ff5808963d358f41accdb95dc9 https://conda.anaconda.org/conda-forge/noarch/nox-2026.2.9-pyhcf101f3_0.conda#f59e57ff0cf84c21b070c206bbaa27db https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff From d5113e05047b8fdbcce258be8f8b69c798cc0e47 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 19 Mar 2026 09:44:28 +0000 Subject: [PATCH 545/583] Bump the dependencies group with 3 updates (#762) Bumps the dependencies group with 3 updates: [scitools/workflows/.github/workflows/ci-manifest.yml](https://github.com/scitools/workflows), [scitools/workflows/.github/workflows/ci-template-check.yml](https://github.com/scitools/workflows) and [scitools/workflows/.github/workflows/refresh-lockfiles.yml](https://github.com/scitools/workflows). Updates `scitools/workflows/.github/workflows/ci-manifest.yml` from 2026.03.2 to 2026.03.4 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2026.03.2...2026.03.4) Updates `scitools/workflows/.github/workflows/ci-template-check.yml` from 2026.03.2 to 2026.03.4 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2026.03.2...2026.03.4) Updates `scitools/workflows/.github/workflows/refresh-lockfiles.yml` from 2026.03.2 to 2026.03.4 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2026.03.2...2026.03.4) --- updated-dependencies: - dependency-name: scitools/workflows/.github/workflows/ci-manifest.yml dependency-version: 2026.03.4 dependency-type: direct:production dependency-group: dependencies - dependency-name: scitools/workflows/.github/workflows/ci-template-check.yml dependency-version: 2026.03.4 dependency-type: direct:production dependency-group: dependencies - dependency-name: scitools/workflows/.github/workflows/refresh-lockfiles.yml dependency-version: 2026.03.4 dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/ci-template-check.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 793c8e99..6a0d3aaf 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2026.03.2 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2026.03.4 diff --git a/.github/workflows/ci-template-check.yml b/.github/workflows/ci-template-check.yml index 3d0bb0d1..46cb96ce 100644 --- a/.github/workflows/ci-template-check.yml +++ b/.github/workflows/ci-template-check.yml @@ -10,7 +10,7 @@ on: jobs: prompt-share: - uses: scitools/workflows/.github/workflows/ci-template-check.yml@2026.03.2 + uses: scitools/workflows/.github/workflows/ci-template-check.yml@2026.03.4 secrets: inherit with: pr_number: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 3c9a5bca..98b3a84d 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2026.03.2 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2026.03.4 secrets: inherit From b2dbf2a53a9c4e2fd64014923178a1123215fbe9 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 23 Mar 2026 10:17:42 +0000 Subject: [PATCH 546/583] Updated environment lockfiles (#763) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 27 +++++++++++++----------- requirements/locks/py311-linux-64.lock | 29 ++++++++++++++------------ requirements/locks/py312-linux-64.lock | 29 ++++++++++++++------------ 3 files changed, 47 insertions(+), 38 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index e8ecc606..8a69382f 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -10,10 +10,10 @@ https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda#a9f577daf3de00bca7c3c76c0ecbd1de https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda#0aa00f03f9e39fb9876085dee11a85d4 -https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda#791365c5f65975051e4e017b5da3abf5 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda#d2ffd7602c02f2b316fd921d39876885 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda#920bb03579f15389b9e512095ad995b7 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 +https://conda.anaconda.org/conda-forge/linux-64/libattr-2.5.2-hb03c661_1.conda#7e7f0a692eb62b95d3010563e7f963b6 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda#72c8fd1af66bd67bf580645b426513ed https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda#6c77a605a7a689d17d4819c0f8ac9a00 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda#e7f7ce06ec24cfcfb9e36d28cf82ba57 @@ -35,8 +35,9 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda#1dafce8548e38671bea82e3f5c6ce22f https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb47aa4a_0.conda#607e13a8caac17f9a664bcab5302ce06 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a +https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-hb03c661_1.conda#9bb149f49de3f322fca007283eaa2725 https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.1-h480dda7_0.conda#4d4efd0645cd556fab54617c4ad477ef -https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda#186a18e3ba246eccfc7cff00cd19a870 +https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda#c80d8a3b84358cb967fa81e7075fbc8a https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda#a752488c68f2e7c456bcbd8f16eec275 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda#86f7414544ae606282352fa1e116b41f https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda#366b40a69f0ad6072561c1d09301c886 @@ -65,7 +66,7 @@ https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda#fb5 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda#12bd9a3f089ee6c9266a37dab82afabd https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.2-h73754d4_0.conda#8eaba3d1a4d7525c6814e861614457fd https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d -https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda#b499ce4b026493a13774bcf0f4c33849 +https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda#2a45e7f8af083626f009645a6481f12d https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda#be43915efc66345cccb3c310b6ed0374 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda#fd893f6a3002a635b5e50ceb9dd2c0f4 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#cd5a90476766d53e901500df9215e927 @@ -78,6 +79,7 @@ https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda#6f2e https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda#c160954f7418d7b6e87eaf05a8913fa9 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda#d50608c443a30c341c24277d28290f76 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.2-ha770c72_0.conda#26c746d14402a3b6c684d045b23b9437 +https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda#e49238a1609f9a4a844b09d9926f2c3d https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd https://conda.anaconda.org/conda-forge/linux-64/python-3.10.20-h3c07f61_0_cpython.conda#5d4e2b00d99feacd026859b7fa239dc0 @@ -86,14 +88,14 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda#8f37c8fb7116a18da04e52fa9e2c8df9 -https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda#537296d57ea995666c68c821b00e360b +https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda#c6b0543676ecb1fb2d7643941fe375f2 https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda#f1976ce927373500cc19d3c0b2c85177 https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py310h69bd2ac_0.conda#276a3ddf300498921601822e3b407088 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py310hba01987_1.conda#393fca4557fbd2c4d995dcb89f569048 https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.5-pyhd8ed1ab_0.conda#a66a1542c3ed584ca4fdb23955d81e91 https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda#765c4d97e877cdbbb88ff33152b86125 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.5-pyhd8ed1ab_0.conda#beb628209b2b354b98203066f90b3287 +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda#49ee13eb9b8f44d63879c69b8a40a74b https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda#ea8a6c3256897cc31263de9f455e25d9 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda#61b8078a0905b12529abc622406cb62c https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 @@ -110,11 +112,12 @@ https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a8 https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda#daddf757c3ecd6067b9af1df1f25d89e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda#53abe63df7e10a6ba605dc5f9f961d36 -https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 +https://conda.anaconda.org/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda#92617c2ba2847cca7a6ed813b6f4ab79 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda#9614359868482abba1bd15ce465e3c42 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py310haaf941d_0.conda#8993ab7e5dce89147288dd78686e790c https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda#6636a2b6f1a87572df2970d3ebc87cc0 +https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda#b38076eb5c8e40d0106beda6f95d7609 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py310h3406613_1.conda#671afe636d2a97759804723f5afc22e0 @@ -144,14 +147,14 @@ https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py310h7c4b9e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda#30cd29cb87d819caead4d55184c1d115 https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py310he7384ee_1.conda#803e2d778b8dcccdc014127ec5001681 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.4-py310h3406613_0.conda#be1cd42538c1a1f587ea319f756ecc37 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.5-py310h3406613_0.conda#85cbfbcc0c49f7fb6da6259ce0048909 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda#8e662bd460bda79b1ea39194e3c4c9ab https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.62.0-py310h3406613_0.conda#5ec9c93a61d857c8bdefdcebd49a5ef8 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda#b8993c19b0c32a2f7b66cbb58ca27069 https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda#080594bf4493e6bae2607e65390c520a https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda#04558c96691bed63104678757beb4f8d https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.10.0-nompi_hbf2fc22_100.conda#0eb36a09dad274e750d60b49aaec0af7 @@ -161,14 +164,14 @@ https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0ba https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py310h71d0299_1.conda#e54b1eaeb50ad1767680181a8575a8db https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 -https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.1.3-pyhcf101f3_0.conda#69fc0a99fc21b26b81026c72e00f83df +https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.0-pyhcf101f3_0.conda#c178102b6e9a0ef95e70610fe7f00af3 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 https://conda.anaconda.org/conda-forge/noarch/wheel-0.46.3-pyhd8ed1ab_0.conda#bdbd7385b4a67025ac2dba4ef8cb6a8f https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda#11a2b8c732d215d977998ccd69a9d5e8 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py310hf779ad0_1.conda#702cd87d652ec1956ee503b9e16bb1c0 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py310h3788b33_0.conda#b6420d29123c7c823de168f49ccdfe6a -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.7.0-h40b2b14_1.conda#8a77895fb29728b736a1a6c75906ea1a -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.9-he3c4edf_0.conda#5455c1a77c2aa337f04d94ff0ef413c3 +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.8.0-h8f7a5dd_0.conda#12e7a110add59a05b337484568a83a4d +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.9-h1588d4d_1.conda#115ecf05370670f93bc81a8c4f7fd57f https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py310hf779ad0_2.conda#4906d8c3680f6c1273ad5a5775807867 https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh8b19718_0.conda#67bdec43082fd8a9cffb9484420b39a2 https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda#2b694bad8a50dc2f712f5368de866480 @@ -190,7 +193,7 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.cond https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda#c65df89a0b2e321045a9e01d1337b182 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 -https://conda.anaconda.org/conda-forge/noarch/tox-4.49.1-pyhcf101f3_0.conda#51ae9b6c673003083102df769d5c13d2 +https://conda.anaconda.org/conda-forge/noarch/tox-4.50.3-pyhcf101f3_0.conda#fe9872281200927f634c5efc2c96654c https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py310h0158d43_1.conda#871b5f746960f99ac23dbc73d14e2ad0 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index d90dd16b..ad8066d6 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -10,10 +10,10 @@ https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda#a9f577daf3de00bca7c3c76c0ecbd1de https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda#0aa00f03f9e39fb9876085dee11a85d4 -https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda#791365c5f65975051e4e017b5da3abf5 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda#d2ffd7602c02f2b316fd921d39876885 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda#920bb03579f15389b9e512095ad995b7 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 +https://conda.anaconda.org/conda-forge/linux-64/libattr-2.5.2-hb03c661_1.conda#7e7f0a692eb62b95d3010563e7f963b6 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda#72c8fd1af66bd67bf580645b426513ed https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda#6c77a605a7a689d17d4819c0f8ac9a00 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda#e7f7ce06ec24cfcfb9e36d28cf82ba57 @@ -35,8 +35,9 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda#1dafce8548e38671bea82e3f5c6ce22f https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb47aa4a_0.conda#607e13a8caac17f9a664bcab5302ce06 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a +https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-hb03c661_1.conda#9bb149f49de3f322fca007283eaa2725 https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.1-h480dda7_0.conda#4d4efd0645cd556fab54617c4ad477ef -https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda#186a18e3ba246eccfc7cff00cd19a870 +https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda#c80d8a3b84358cb967fa81e7075fbc8a https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda#a752488c68f2e7c456bcbd8f16eec275 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda#86f7414544ae606282352fa1e116b41f https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda#366b40a69f0ad6072561c1d09301c886 @@ -65,7 +66,7 @@ https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda#fb5 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda#12bd9a3f089ee6c9266a37dab82afabd https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.2-h73754d4_0.conda#8eaba3d1a4d7525c6814e861614457fd https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d -https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda#b499ce4b026493a13774bcf0f4c33849 +https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda#2a45e7f8af083626f009645a6481f12d https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda#be43915efc66345cccb3c310b6ed0374 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda#fd893f6a3002a635b5e50ceb9dd2c0f4 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#cd5a90476766d53e901500df9215e927 @@ -78,6 +79,7 @@ https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda#6f2e https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda#c160954f7418d7b6e87eaf05a8913fa9 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda#d50608c443a30c341c24277d28290f76 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.2-ha770c72_0.conda#26c746d14402a3b6c684d045b23b9437 +https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda#e49238a1609f9a4a844b09d9926f2c3d https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd https://conda.anaconda.org/conda-forge/linux-64/python-3.11.15-hd63d673_0_cpython.conda#a5ebcefec0c12a333bcd6d7bf3bddc1f @@ -86,14 +88,14 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda#8f37c8fb7116a18da04e52fa9e2c8df9 -https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda#537296d57ea995666c68c821b00e360b +https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda#c6b0543676ecb1fb2d7643941fe375f2 https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda#f1976ce927373500cc19d3c0b2c85177 https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py311h6b1f9c4_0.conda#adda5ef2a74c9bdb338ff8a51192898a https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py311h66f275b_1.conda#86daecb8e4ed1042d5dc6efbe0152590 https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.5-pyhd8ed1ab_0.conda#a66a1542c3ed584ca4fdb23955d81e91 https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda#765c4d97e877cdbbb88ff33152b86125 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.5-pyhd8ed1ab_0.conda#beb628209b2b354b98203066f90b3287 +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda#49ee13eb9b8f44d63879c69b8a40a74b https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda#ea8a6c3256897cc31263de9f455e25d9 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda#61b8078a0905b12529abc622406cb62c https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 @@ -111,11 +113,12 @@ https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a8 https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda#daddf757c3ecd6067b9af1df1f25d89e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda#53abe63df7e10a6ba605dc5f9f961d36 -https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 +https://conda.anaconda.org/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda#92617c2ba2847cca7a6ed813b6f4ab79 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda#9614359868482abba1bd15ce465e3c42 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py311h724c32c_0.conda#3d82751e8d682068b58f049edc924ce4 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda#6636a2b6f1a87572df2970d3ebc87cc0 +https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda#b38076eb5c8e40d0106beda6f95d7609 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py311h3778330_1.conda#f9efdf9b0f3d0cc309d56af6edf2a6b0 @@ -146,24 +149,24 @@ https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py311h49ec1c https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda#30cd29cb87d819caead4d55184c1d115 https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py311h03d9500_1.conda#3912e4373de46adafd8f1e97e4bd166b -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.4-py311h3778330_0.conda#6b1b19bdc407007d5e41079eab797ddc +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.5-py311h3778330_0.conda#e32c4e7639b1c1b5680fabdaa6081e56 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda#8e662bd460bda79b1ea39194e3c4c9ab https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.62.0-py311h3778330_0.conda#bd4aa764c1b2f877aff5049f26cbffde https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda#b8993c19b0c32a2f7b66cbb58ca27069 https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda#080594bf4493e6bae2607e65390c520a https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda#04558c96691bed63104678757beb4f8d https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.10.0-nompi_hbf2fc22_100.conda#0eb36a09dad274e750d60b49aaec0af7 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda#eb52d14a901e23c39e9e7b4a1a5c015f -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.2-py311h2e04523_1.conda#a8105076864776eceae69d64d30e24d7 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py311h2e04523_0.conda#cfc8f864dea571677095ebae8e6f0c07 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py311hc7c0204_4.conda#17f22789a811c010b53542bd6b2aeb14 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 -https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.1.3-pyhcf101f3_0.conda#69fc0a99fc21b26b81026c72e00f83df +https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.0-pyhcf101f3_0.conda#c178102b6e9a0ef95e70610fe7f00af3 https://conda.anaconda.org/conda-forge/noarch/python-gil-3.11.15-hd8ed1ab_0.conda#8793751936480e56ce4047b4f54b997f https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda#28687768633154993d521aecfa4a56ac https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 @@ -172,8 +175,8 @@ https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_ https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda#11a2b8c732d215d977998ccd69a9d5e8 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py311h0372a8f_1.conda#77cf197e2f03986b6505bab6e214d22a https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py311h724c32c_4.conda#d04e508f5a03162c8bab4586a65d00bf -https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.1.2-pyhcf101f3_0.conda#b20e7ce9afd59036ab194f3d1e27edf5 -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.9-he3c4edf_0.conda#5455c1a77c2aa337f04d94ff0ef413c3 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda#809f4cde7c853f437becc43415a2ecdf +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.9-h1588d4d_1.conda#115ecf05370670f93bc81a8c4f7fd57f https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py311h0372a8f_2.conda#487756753716efba090d06c71fb73eb6 https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh8b19718_0.conda#67bdec43082fd8a9cffb9484420b39a2 https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda#2b694bad8a50dc2f712f5368de866480 @@ -194,7 +197,7 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.cond https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda#c65df89a0b2e321045a9e01d1337b182 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 -https://conda.anaconda.org/conda-forge/noarch/tox-4.49.1-pyhcf101f3_0.conda#51ae9b6c673003083102df769d5c13d2 +https://conda.anaconda.org/conda-forge/noarch/tox-4.50.3-pyhcf101f3_0.conda#fe9872281200927f634c5efc2c96654c https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py311hed34c8f_1.conda#17c710c32010688086b28c088a8be579 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index b79c67e9..e0c9b8dd 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -10,10 +10,10 @@ https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda#a9f577daf3de00bca7c3c76c0ecbd1de https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda#0aa00f03f9e39fb9876085dee11a85d4 -https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda#791365c5f65975051e4e017b5da3abf5 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda#d2ffd7602c02f2b316fd921d39876885 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda#920bb03579f15389b9e512095ad995b7 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 +https://conda.anaconda.org/conda-forge/linux-64/libattr-2.5.2-hb03c661_1.conda#7e7f0a692eb62b95d3010563e7f963b6 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda#72c8fd1af66bd67bf580645b426513ed https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda#6c77a605a7a689d17d4819c0f8ac9a00 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda#e7f7ce06ec24cfcfb9e36d28cf82ba57 @@ -35,8 +35,9 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda#1dafce8548e38671bea82e3f5c6ce22f https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb47aa4a_0.conda#607e13a8caac17f9a664bcab5302ce06 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a +https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-hb03c661_1.conda#9bb149f49de3f322fca007283eaa2725 https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.1-h480dda7_0.conda#4d4efd0645cd556fab54617c4ad477ef -https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda#186a18e3ba246eccfc7cff00cd19a870 +https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda#c80d8a3b84358cb967fa81e7075fbc8a https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda#a752488c68f2e7c456bcbd8f16eec275 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda#86f7414544ae606282352fa1e116b41f https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda#366b40a69f0ad6072561c1d09301c886 @@ -65,7 +66,7 @@ https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda#fb5 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda#12bd9a3f089ee6c9266a37dab82afabd https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.2-h73754d4_0.conda#8eaba3d1a4d7525c6814e861614457fd https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d -https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda#b499ce4b026493a13774bcf0f4c33849 +https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda#2a45e7f8af083626f009645a6481f12d https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda#be43915efc66345cccb3c310b6ed0374 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda#fd893f6a3002a635b5e50ceb9dd2c0f4 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#cd5a90476766d53e901500df9215e927 @@ -78,6 +79,7 @@ https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda#6f2e https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda#c160954f7418d7b6e87eaf05a8913fa9 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda#d50608c443a30c341c24277d28290f76 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.2-ha770c72_0.conda#26c746d14402a3b6c684d045b23b9437 +https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda#e49238a1609f9a4a844b09d9926f2c3d https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd https://conda.anaconda.org/conda-forge/linux-64/python-3.12.13-hd63d673_0_cpython.conda#7eccb41177e15cc672e1babe9056018e @@ -86,14 +88,14 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda#8f37c8fb7116a18da04e52fa9e2c8df9 -https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda#537296d57ea995666c68c821b00e360b +https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda#c6b0543676ecb1fb2d7643941fe375f2 https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda#f1976ce927373500cc19d3c0b2c85177 https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py312h90b7ffd_0.conda#5b8c55fed2e576dde4b0b33693a4fdb1 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py312hdb49522_1.conda#64088dffd7413a2dd557ce837b4cbbdb https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.5-pyhd8ed1ab_0.conda#a66a1542c3ed584ca4fdb23955d81e91 https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda#765c4d97e877cdbbb88ff33152b86125 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.5-pyhd8ed1ab_0.conda#beb628209b2b354b98203066f90b3287 +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda#49ee13eb9b8f44d63879c69b8a40a74b https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda#ea8a6c3256897cc31263de9f455e25d9 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda#61b8078a0905b12529abc622406cb62c https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 @@ -111,11 +113,12 @@ https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a8 https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda#daddf757c3ecd6067b9af1df1f25d89e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda#53abe63df7e10a6ba605dc5f9f961d36 -https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 +https://conda.anaconda.org/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda#92617c2ba2847cca7a6ed813b6f4ab79 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda#9614359868482abba1bd15ce465e3c42 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py312h0a2e395_0.conda#cd74a9525dc74bbbf93cf8aa2fa9eb5b https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda#6636a2b6f1a87572df2970d3ebc87cc0 +https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda#b38076eb5c8e40d0106beda6f95d7609 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda#93a4752d42b12943a355b682ee43285b @@ -146,24 +149,24 @@ https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda#30cd29cb87d819caead4d55184c1d115 https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py312h460c074_1.conda#648ee28dcd4e07a1940a17da62eccd40 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.4-py312h8a5da7c_0.conda#a8df7f0812ac4fa6bbc7135556d3e2c4 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.5-py312h8a5da7c_0.conda#c4d858e15305e70b255e756a4dc96e58 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda#8e662bd460bda79b1ea39194e3c4c9ab https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.62.0-py312h8a5da7c_0.conda#526f7ffd63820e55d7992cc1cf931a36 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda#b8993c19b0c32a2f7b66cbb58ca27069 https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda#080594bf4493e6bae2607e65390c520a https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda#04558c96691bed63104678757beb4f8d https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.10.0-nompi_hbf2fc22_100.conda#0eb36a09dad274e750d60b49aaec0af7 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda#eb52d14a901e23c39e9e7b4a1a5c015f -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.2-py312h33ff503_1.conda#3569a8fca2dd3202e4ab08f42499f6d3 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py312h33ff503_0.conda#5930ee8a175a242b4f001b1e9e72024f https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py312hbc8341d_4.conda#9d5ea11aefbdf548a2d8c965c1b2ebad https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 -https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.1.3-pyhcf101f3_0.conda#69fc0a99fc21b26b81026c72e00f83df +https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.0-pyhcf101f3_0.conda#c178102b6e9a0ef95e70610fe7f00af3 https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.13-hd8ed1ab_0.conda#32780d6794b8056b78602103a04e90ef https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda#28687768633154993d521aecfa4a56ac https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 @@ -172,8 +175,8 @@ https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_ https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda#11a2b8c732d215d977998ccd69a9d5e8 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py312h4f23490_1.conda#84bf349fad55056ed326fc550671b65c https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda#43c2bc96af3ae5ed9e8a10ded942aa50 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.1.2-pyhcf101f3_0.conda#b20e7ce9afd59036ab194f3d1e27edf5 -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.9-he3c4edf_0.conda#5455c1a77c2aa337f04d94ff0ef413c3 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda#809f4cde7c853f437becc43415a2ecdf +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.9-h1588d4d_1.conda#115ecf05370670f93bc81a8c4f7fd57f https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h4f23490_2.conda#cec5bc5f7d374f8f8095f8e28e31f6cb https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh8b19718_0.conda#67bdec43082fd8a9cffb9484420b39a2 https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda#2b694bad8a50dc2f712f5368de866480 @@ -194,7 +197,7 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.cond https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda#c65df89a0b2e321045a9e01d1337b182 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 -https://conda.anaconda.org/conda-forge/noarch/tox-4.49.1-pyhcf101f3_0.conda#51ae9b6c673003083102df769d5c13d2 +https://conda.anaconda.org/conda-forge/noarch/tox-4.50.3-pyhcf101f3_0.conda#fe9872281200927f634c5efc2c96654c https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py312hf79963d_1.conda#6c913a686cb4060cbd7639a36fa144f0 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 From 00c5eb631790e3a3c3f57b633cbdf788f7dc75ae Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Mon, 23 Mar 2026 15:56:55 +0000 Subject: [PATCH 547/583] Fix the 'setitem' for Section keys. (#766) * Fix the 'setitem' for Section keys. * Add issue reference. --- src/iris_grib/message.py | 30 ++++++----- .../tests/unit/message/test_Section.py | 50 +++++++++++++++++++ 2 files changed, 67 insertions(+), 13 deletions(-) diff --git a/src/iris_grib/message.py b/src/iris_grib/message.py index 0b4dd2d6..c61212f5 100644 --- a/src/iris_grib/message.py +++ b/src/iris_grib/message.py @@ -464,18 +464,22 @@ def __repr__(self): items.append("{}={}".format(key, value)) return "<{} {}: {}>".format(type(self).__name__, self._number, ", ".join(items)) + def _valid_key(self, key): + if key not in self._keys: + key2 = KEY_ALIAS.get(key) + if key2 and key2 in self._keys: + key = key2 + else: + emsg = f"{key!r} is not a valid key for section {self._number}." + raise KeyError(emsg) + return key + def __getitem__(self, key): if key not in self._cache: if key == "numberOfSection": value = self._number else: - if key not in self._keys: - key2 = KEY_ALIAS.get(key) - if key2 and key2 in self._keys: - key = key2 - else: - emsg = f"{key} not defined in section {self._number}" - raise KeyError(emsg) + key = self._valid_key(key) value = self._get_key_value(key) self._cache[key] = value @@ -483,13 +487,13 @@ def __getitem__(self, key): return self._cache[key] def __setitem__(self, key, value): - # Allow the overwriting of any entry already in the _cache. - if key in self._cache: - self._cache[key] = value + # Allow the overwriting of any valid key. + if key == "numberOfSection": + emsg = "Cannot write 'numberOfSection' key." + raise KeyError(emsg) else: - raise KeyError( - "{!r} cannot be redefined in section {}".format(key, self._number) - ) + key = self._valid_key(key) + self._cache[key] = value def _get_key_value(self, key): """ diff --git a/src/iris_grib/tests/unit/message/test_Section.py b/src/iris_grib/tests/unit/message/test_Section.py index a1af5277..c65f98f8 100644 --- a/src/iris_grib/tests/unit/message/test_Section.py +++ b/src/iris_grib/tests/unit/message/test_Section.py @@ -11,6 +11,7 @@ # importing anything else. import iris_grib.tests as tests + import eccodes import numpy as np @@ -47,12 +48,61 @@ def test_numberOfSection(self): section = Section(self.grib_id, n, ["numberOfSection"]) self.assertEqual(section["numberOfSection"], n) + def test_alias(self): + # Note: I think this particular alias is really 'the wrong way around' + # TODO: resolve? see https://github.com/SciTools/iris-grib/issues/765 + section = Section(self.grib_id, None, ["indicatorOfUnitOfTimeRange"]) + self.assertEqual(section["indicatorOfUnitForForecastTime"], 1) + self.assertEqual(section["indicatorOfUnitOfTimeRange"], 1) + def test_invalid(self): section = Section(self.grib_id, None, ["Ni"]) with self.assertRaisesRegex(KeyError, "Nii"): section["Nii"] +@tests.skip_data +class Test___setitem__(tests.IrisGribTest): + """Check writing keys, including error modes.""" + + def setUp(self): + # Open test file. Don't need writeable, as we only 'write' our own values. + filename = tests.get_data_path(("GRIB", "uk_t", "uk_t.grib2")) + with open(filename, "rb") as grib_fh: + self.grib_id = eccodes.codes_new_from_file( + grib_fh, eccodes.CODES_PRODUCT_GRIB + ) + + def test_withread_first(self): + section = Section(self.grib_id, None, ["Ni"]) + self.assertEqual(section["Ni"], 47) + section["Ni"] = 99 + self.assertEqual(section["Ni"], 99) + + def test_noread_first(self): + section = Section(self.grib_id, None, ["Ni"]) + section["Ni"] = 99 + self.assertEqual(section["Ni"], 99) + + def test_badkey_error(self): + section = Section(self.grib_id, 333, ["Ni"]) + msg = "'unknown' is not a valid key for section 333" + with self.assertRaisesRegex(KeyError, msg): + section["unknown"] = 99 + + def test_numberOfSection_error(self): + section = Section(self.grib_id, 3, ["Ni"]) + msg = "Cannot write 'numberOfSection'" + with self.assertRaisesRegex(KeyError, msg): + section["numberOfSection"] = 4 + + def test_write_alias(self): + # "indicatorOfUnitForForecastTime": "indicatorOfUnitOfTimeRange", + section = Section(self.grib_id, 101, ["indicatorOfUnitOfTimeRange"]) + section["indicatorOfUnitForForecastTime"] = 202 + self.assertEqual(section["indicatorOfUnitOfTimeRange"], 202) + + @tests.skip_data class Test__getitem___pdt_31(tests.IrisGribTest): def setUp(self): From 642b70c302954ff8cc8ce1c975839243515d22b5 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Tue, 24 Mar 2026 09:09:44 +0000 Subject: [PATCH 548/583] Hide not-yet-usable GRIB1 loading controls from public API, and docs. (#769) --- src/iris_grib/__init__.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/iris_grib/__init__.py b/src/iris_grib/__init__.py index 41d1bd48..905b5328 100644 --- a/src/iris_grib/__init__.py +++ b/src/iris_grib/__init__.py @@ -29,8 +29,9 @@ __version__ = "unknown" __all__ = [ - "GRIB1_LOADING_MODE", - "Grib1LoadingMode", + # TODO: publish grib1 loading controls, when ready to announce + # "GRIB1_LOADING_MODE", + # "Grib1LoadingMode", "load_cubes", "load_pairs_from_fields", "save_grib2", From 61bb343689d93d2528dbe5a05835ccd0113ae558 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Tue, 24 Mar 2026 09:24:24 +0000 Subject: [PATCH 549/583] Fix rounding of scaled integers. (#767) * Fix rounding of scaled integers. * Restore longitude wrapping. --- src/iris_grib/_save_rules.py | 40 +++++++-------- .../unit/save_rules/test_latlon_first_last.py | 51 +++++++++++++++++++ 2 files changed, 69 insertions(+), 22 deletions(-) create mode 100644 src/iris_grib/tests/unit/save_rules/test_latlon_first_last.py diff --git a/src/iris_grib/_save_rules.py b/src/iris_grib/_save_rules.py index 0e728be5..5bb3f959 100644 --- a/src/iris_grib/_save_rules.py +++ b/src/iris_grib/_save_rules.py @@ -219,28 +219,24 @@ def latlon_first_last(x_coord, y_coord, grib): if x_coord.has_bounds() or y_coord.has_bounds(): warnings.warn("Ignoring xy bounds") - # XXX Pending #1125 - # eccodes.codes_set_double(grib, "latitudeOfFirstGridPointInDegrees", - # float(y_coord.points[0])) - # eccodes.codes_set_double(grib, "latitudeOfLastGridPointInDegrees", - # float(y_coord.points[-1])) - # eccodes.codes_set_double(grib, "longitudeOfFirstGridPointInDegrees", - # float(x_coord.points[0])) - # eccodes.codes_set_double(grib, "longitudeOfLastGridPointInDegrees", - # float(x_coord.points[-1])) - # WORKAROUND - eccodes.codes_set_long( - grib, "latitudeOfFirstGridPoint", int(y_coord.points[0] * 1000000) - ) - eccodes.codes_set_long( - grib, "latitudeOfLastGridPoint", int(y_coord.points[-1] * 1000000) - ) - eccodes.codes_set_long( - grib, "longitudeOfFirstGridPoint", int((x_coord.points[0] % 360) * 1000000) - ) - eccodes.codes_set_long( - grib, "longitudeOfLastGridPoint", int((x_coord.points[-1] % 360) * 1000000) - ) + def scaled_minmax_points(coord, wrap_360=False): + """Get coord scaled min+max values. + + Return numpy integer values, in millionths. + Promote values to double-precision before rounding. + """ + point0, point1 = coord.points[[0, -1]] + if wrap_360: + point0, point1 = [point % 360 for point in [point0, point1]] + int0, int1 = [int(flt.astype("f8") * 1000000) for flt in (point0, point1)] + return int0, int1 + + lat0, lat1 = scaled_minmax_points(y_coord) + eccodes.codes_set_long(grib, "latitudeOfFirstGridPoint", lat0) + eccodes.codes_set_long(grib, "latitudeOfLastGridPoint", lat1) + lon0, lon1 = scaled_minmax_points(x_coord, wrap_360=True) + eccodes.codes_set_long(grib, "longitudeOfFirstGridPoint", lon0) + eccodes.codes_set_long(grib, "longitudeOfLastGridPoint", lon1) def dx_dy(x_coord, y_coord, grib): diff --git a/src/iris_grib/tests/unit/save_rules/test_latlon_first_last.py b/src/iris_grib/tests/unit/save_rules/test_latlon_first_last.py new file mode 100644 index 00000000..1ddc9e72 --- /dev/null +++ b/src/iris_grib/tests/unit/save_rules/test_latlon_first_last.py @@ -0,0 +1,51 @@ +# Copyright iris-grib contributors +# +# This file is part of iris-grib and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +"""Unit tests for `iris_grib.grib_save_rules.identification`.""" + +import numpy as np +import pytest + +from iris.coords import AuxCoord + +from iris_grib._save_rules import latlon_first_last + + +class Test: + """Check operation for specific test values. + + The specific point is that coord values should be promoted to "double" to optimise + rounding error when converting to integer. + In effect, this was the default with numpy 1, but changed in numpy 2. + See : https://github.com/SciTools/iris-grib/issues/686 + """ + + # Numbers from a real testcase, where naive non-promoted calculation got it "wrong". + lbrow = 1920 + lbnpt = 2560 + bzx = -0.070312500000000000000000000000 + bdx = 0.140625000000000000000000000000 + bzy = -90.046875000000000000000000000000 + bdy = 0.093750000000000000000000000000 + + @pytest.mark.parametrize("wraplons", ["wrapped", "nowrap"]) + def test_latlons(self, wraplons, mocker): + patch = mocker.patch("iris_grib._save_rules.eccodes.codes_set_long") + x_points = np.array( + [self.bzx + self.bdx, self.bzx + self.lbnpt * self.bdx], dtype=np.float32 + ) + if wraplons == "wrapped": + # Drive longitudes negative : results should be just the same. + x_points -= 720 + y_points = np.array( + [self.bzy + self.bdy, self.bzy + self.lbrow * self.bdy], dtype=np.float32 + ) + x_coord = AuxCoord(x_points) + y_coord = AuxCoord(y_points) + latlon_first_last(x_coord, y_coord, None) + cal = patch.call_args_list + assert len(cal) == 4 + results = [call.args[2] for call in cal] + expected = [-89953125, 89953125, 70312, 359929687] + assert results == expected From e5fa7f3fff4823be76db3b7d4cf63a38665bb07f Mon Sep 17 00:00:00 2001 From: Martin Yeo <40734014+trexfeathers@users.noreply.github.com> Date: Tue, 24 Mar 2026 11:58:26 +0000 Subject: [PATCH 550/583] Update Python and Iris minimum pins (#770) * Iris 3.10 minimum pin, SciTools/iris#465 . * Support Python 3.13 and 3.14. * SPEC0 minimum Python version. * Update requirements symbolic links. * Update CI. * Fix lock files. --- .github/workflows/ci-tests.yml | 10 +- noxfile.py | 2 +- pyproject.toml | 6 +- requirements/iris-grib.yml | 2 +- requirements/locks/py312-linux-64.lock | 1 + ...y311-linux-64.lock => py313-linux-64.lock} | 92 ++++++++------- ...y310-linux-64.lock => py314-linux-64.lock} | 105 +++++++++--------- requirements/py312.yml | 2 +- requirements/{py310.yml => py313.yml} | 4 +- requirements/{py311.yml => py314.yml} | 4 +- requirements/pypi-core.txt | 2 +- requirements/readthedocs.yml | 2 +- 12 files changed, 115 insertions(+), 117 deletions(-) rename requirements/locks/{py311-linux-64.lock => py313-linux-64.lock} (85%) rename requirements/locks/{py310-linux-64.lock => py314-linux-64.lock} (82%) rename requirements/{py310.yml => py313.yml} (93%) rename requirements/{py311.yml => py314.yml} (93%) diff --git a/.github/workflows/ci-tests.yml b/.github/workflows/ci-tests.yml index 95824a94..dc4425fa 100644 --- a/.github/workflows/ci-tests.yml +++ b/.github/workflows/ci-tests.yml @@ -35,25 +35,25 @@ jobs: fail-fast: false matrix: os: ["ubuntu-latest"] - python-version: ["3.12"] + python-version: ["3.14"] session: ["doctest", "linkcheck"] iris-source : ["conda-forge"] include: - os: "ubuntu-latest" - python-version: "3.12" + python-version: "3.14" session: "tests" iris-source: "conda-forge" coverage: "--coverage" - os: "ubuntu-latest" - python-version: "3.12" + python-version: "3.14" session: "tests" iris-source: "source" - os: "ubuntu-latest" - python-version: "3.11" + python-version: "3.13" session: "tests" iris-source: "conda-forge" - os: "ubuntu-latest" - python-version: "3.10" + python-version: "3.12" session: "tests" iris-source: "conda-forge" diff --git a/noxfile.py b/noxfile.py index 29fc262c..6e489e1d 100755 --- a/noxfile.py +++ b/noxfile.py @@ -36,7 +36,7 @@ PY_VER = os.environ.get("PY_VER") if PY_VER is None: # Default to testing against 3 standard Python versions. - PY_VER = ["3.10", "3.11", "3.12"] + PY_VER = ["3.12", "3.13", "3.14"] IRIS_SOURCE = os.environ.get("IRIS_SOURCE") if IRIS_SOURCE is None: # Default to testing against *both* "upstream-main" and "latest-release" Iris. diff --git a/pyproject.toml b/pyproject.toml index 8966d6a3..479cba55 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,9 +23,9 @@ classifiers = [ "Operating System :: Unix", "Programming Language :: Python", "Programming Language :: Python :: 3 :: Only", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", "Programming Language :: Python :: Implementation :: CPython", "Topic :: Scientific/Engineering", "Topic :: Scientific/Engineering :: Atmospheric Science", @@ -48,7 +48,7 @@ keywords = [ license = "BSD-3-Clause" license-files = ["LICENSE"] name = "iris-grib" -requires-python = ">=3.10" +requires-python = ">=3.12" [project.urls] Code = "https://github.com/SciTools/iris-grib" diff --git a/requirements/iris-grib.yml b/requirements/iris-grib.yml index 331a25f1..05372566 120000 --- a/requirements/iris-grib.yml +++ b/requirements/iris-grib.yml @@ -1 +1 @@ -py312.yml \ No newline at end of file +py314.yml \ No newline at end of file diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index e0c9b8dd..e1c01674 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -214,3 +214,4 @@ https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-3.1.0-pyha770c72_ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda#00534ebcc0375929b45c3039b5ba7636 https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda#f7af826063ed569bb13f7207d6f949b0 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda#3bc61f7161d28137797e038263c04c54 + diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py313-linux-64.lock similarity index 85% rename from requirements/locks/py311-linux-64.lock rename to requirements/locks/py313-linux-64.lock index ad8066d6..413c9954 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py313-linux-64.lock @@ -1,19 +1,21 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 84b15051cf21e4aaa0500a4d04539836bcd04717d1bc6930fd28c616793acc49 +# input_hash: aa9ab4ebce2999e04d2a5ba5730179ca016c08c045ebce12a021dd69105ec6c6 @EXPLICIT -https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda#8fcb6b0e2161850556231336dae58358 +https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda#94305520c52a4aa3f6c2b1ff6008d9f8 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda#ad659d0a2b3e47e38d829aa8cad2d610 https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda#4492fd26db29495f0ba23f146cd5638d https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda#239c5e9546c38a1e884d69effcf4c882 +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda#d87ff7921124eccd67248aa483c23fec https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda#a9f577daf3de00bca7c3c76c0ecbd1de https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda#4a13eeac0b5c8e5b8ab496e6c4ddd829 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda#18335a698559cdbcd86150a48bf54ba6 https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda#0aa00f03f9e39fb9876085dee11a85d4 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda#d2ffd7602c02f2b316fd921d39876885 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda#920bb03579f15389b9e512095ad995b7 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 -https://conda.anaconda.org/conda-forge/linux-64/libattr-2.5.2-hb03c661_1.conda#7e7f0a692eb62b95d3010563e7f963b6 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda#72c8fd1af66bd67bf580645b426513ed https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda#6c77a605a7a689d17d4819c0f8ac9a00 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda#e7f7ce06ec24cfcfb9e36d28cf82ba57 @@ -23,19 +25,19 @@ https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18. https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda#8397539e3a0bbd1695584fb4f927485a https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda#c7c83eecbb72d88b940c249af56c8b17 -https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 +https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda#2c21e66f50753a083cbe6b80f38268fa +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda#5f13ffc7d30ffec87864e678df9957b4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda#1b08cd684f34175e4514474793d44bcb https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda#db409b7c1720428638e7c0d509d3e1b5 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 -https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda#f61eb8cd60ff9057122a3d338b99c00f https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda#cffd3bdd58090148f4cfcd831f4b26ab https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda#b2895afaf55bf96a8c8282a2e47a5de0 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda#1dafce8548e38671bea82e3f5c6ce22f https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb47aa4a_0.conda#607e13a8caac17f9a664bcab5302ce06 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a -https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-hb03c661_1.conda#9bb149f49de3f322fca007283eaa2725 https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.1-h480dda7_0.conda#4d4efd0645cd556fab54617c4ad477ef https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda#c80d8a3b84358cb967fa81e7075fbc8a https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda#a752488c68f2e7c456bcbd8f16eec275 @@ -44,27 +46,23 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.co https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda#4ffbb341c8b616aa2494b6afb26a0c5f https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 +https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda#fb16b4b69e3f1dcfe79d80db8fd0c55d https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda#9063115da5bc35fdc3e1002e69b9ef6e https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda#5f13ffc7d30ffec87864e678df9957b4 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda#6235adb93d064ecdf3d44faee6f468de https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 -https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda#d7d95fc8287ea7bf33e0e7116d2b95ec https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda#98b6c9dc80eb87b2519b97bcf7e578dd -https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda#cffd3bdd58090148f4cfcd831f4b26ab https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda#2aadb0d17215603a82a2a6b0afd9a4cb -https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda#4a13eeac0b5c8e5b8ab496e6c4ddd829 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda#af39b9a8711d4a8d437b52c1d78eb6a1 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda#fb53fb07ce46a575c5d004bbc96032c2 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda#12bd9a3f089ee6c9266a37dab82afabd -https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.2-h73754d4_0.conda#8eaba3d1a4d7525c6814e861614457fd +https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda#e289f3d17880e44b633ba911d57a321b https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda#2a45e7f8af083626f009645a6481f12d https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda#be43915efc66345cccb3c310b6ed0374 @@ -75,14 +73,14 @@ https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#35 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda#861fb6ccbc677bb9a9fb2468430b9c6a https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda#8ccf913aaba749a5496c17629d859ed1 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_0.conda#8462b5322567212beeb025f3519fb3e2 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda#6f2e2c8f58160147c4d1c6f4c14cbac4 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda#c160954f7418d7b6e87eaf05a8913fa9 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda#d50608c443a30c341c24277d28290f76 -https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.2-ha770c72_0.conda#26c746d14402a3b6c684d045b23b9437 https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda#e49238a1609f9a4a844b09d9926f2c3d https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd -https://conda.anaconda.org/conda-forge/linux-64/python-3.11.15-hd63d673_0_cpython.conda#a5ebcefec0c12a333bcd6d7bf3bddc1f +https://conda.anaconda.org/conda-forge/linux-64/python-3.13.12-hc97d973_100_cp313.conda#4c875ed0e78c2d407ec55eadffb8cf3d https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.52.0-h04a0ce9_0.conda#7d9d7efe9541d4bb71b5934e8ee348ea https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda#34e54f03dfea3e7a2dcf1453a85f1085 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 @@ -90,8 +88,8 @@ https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda#8f37c8fb7116a18da04e52fa9e2c8df9 https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda#c6b0543676ecb1fb2d7643941fe375f2 https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda#f1976ce927373500cc19d3c0b2c85177 -https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py311h6b1f9c4_0.conda#adda5ef2a74c9bdb338ff8a51192898a -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py311h66f275b_1.conda#86daecb8e4ed1042d5dc6efbe0152590 +https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py313h18e8e13_0.conda#d9e90792551a527200637e23a915dd79 +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py313hf159716_1.conda#6c4d3597cf43f3439a51b2b13e29a4ba https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.5-pyhd8ed1ab_0.conda#a66a1542c3ed584ca4fdb23955d81e91 https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda#765c4d97e877cdbbb88ff33152b86125 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 @@ -100,15 +98,14 @@ https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda#ea8 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda#61b8078a0905b12529abc622406cb62c https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/colorlog-6.10.1-pyh707e725_0.conda#33e96df3785bf61676ffee387e5a19e5 -https://conda.anaconda.org/conda-forge/noarch/cpython-3.11.15-py311hd8ed1ab_0.conda#bf0d09d5c2b61aaf7b11c551c8545cfa +https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.12-py313hd8ed1ab_100.conda#9a4b8a37303b933b847c14a310f0557b https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda#4c2a8fef270f6c69591889b93f9f55c1 https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc https://conda.anaconda.org/conda-forge/noarch/filelock-3.25.2-pyhd8ed1ab_0.conda#f58064cec97b12a7136ebb8a6f8a129b https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.2-ha770c72_0.conda#eeec961fec28e747e1e1dc0446277452 https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.2.0-pyhd8ed1ab_0.conda#496c6c9411a6284addf55c898d6ed8d7 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h19486de_106.conda#c223ee1429ba538f3e48cfb4a0b97357 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h19486de_107.conda#27bd895de855fc7b600d8ea692cacba0 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda#daddf757c3ecd6067b9af1df1f25d89e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac @@ -116,15 +113,16 @@ https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda#53abe https://conda.anaconda.org/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda#92617c2ba2847cca7a6ed813b6f4ab79 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda#9614359868482abba1bd15ce465e3c42 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de -https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py311h724c32c_0.conda#3d82751e8d682068b58f049edc924ce4 +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py313hc8edb43_0.conda#b81883b9dbf5069821c2fb09a8ba1407 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda#6636a2b6f1a87572df2970d3ebc87cc0 https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda#b38076eb5c8e40d0106beda6f95d7609 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py311h3778330_1.conda#f9efdf9b0f3d0cc309d56af6edf2a6b0 +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py313h3dea7bd_1.conda#aeb9b9da79fd0258b3db091d1fefcd71 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda#b76541e68fea4d511b1ac46a28dcd2c6 -https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py311hf88fc01_0.conda#0415141f4e3d4dad3c39ad4718936352 +https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py313h80991f8_0.conda#2d5ee4938cdde91a8967f3eea686c546 +https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh145f28c_0.conda#09a970fbf75e8ed1aa633827ded6aa4f https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda#82c1787f2a65c0155ef9652466ee98d6 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda#d7585b6550ad04c8c5e21097ada2888e https://conda.anaconda.org/conda-forge/linux-64/proj-9.8.0-he0df7b0_0.conda#3732388938fc3decf65b90884c2d8198 @@ -133,8 +131,8 @@ https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda#3687cc0b82a8b4c17e1f0eb7e47163d5 https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.3-pyhd8ed1ab_0.conda#c138c7aaa6a10b5762dcd92247864aff https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac -https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.6.0-py311h041eb40_1.conda#9dcb9824894fb920414608447ccdf3ce -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py311h3778330_1.conda#a24add9a3bababee946f3bc1c829acfe +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.6.0-py313heab5758_1.conda#82df5d372f2796c389fcbe5104664f5a +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py313h3dea7bd_1.conda#f256753e840c3cd3766488c9437a8f8b https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda#0dc48b4b570931adc8641e55c6c17fe4 https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda#8e194e7b992f99a5015edbd4ebd38efd https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 @@ -145,66 +143,63 @@ https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda#72e https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda#32e37e8fe9ef45c637ee38ad51377769 https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda#c07a6153f8306e45794774cf9b13bd32 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d -https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py311h49ec1c0_0.conda#2889f0c0b6a6d7a37bd64ec60f4cc210 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda#30cd29cb87d819caead4d55184c1d115 -https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py311h03d9500_1.conda#3912e4373de46adafd8f1e97e4bd166b -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.5-py311h3778330_0.conda#e32c4e7639b1c1b5680fabdaa6081e56 +https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py313hf46b229_1.conda#d0616e7935acab407d1543b28c446f6f +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.5-py313h3dea7bd_0.conda#acbda45380f5097ade59014704eb0ba0 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda#8e662bd460bda79b1ea39194e3c4c9ab -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.62.0-py311h3778330_0.conda#bd4aa764c1b2f877aff5049f26cbffde +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.62.0-py313h3dea7bd_0.conda#e479cfdec38fb69dc81ce8806b5c75f6 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda#b8993c19b0c32a2f7b66cbb58ca27069 https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda#080594bf4493e6bae2607e65390c520a https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda#04558c96691bed63104678757beb4f8d -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.10.0-nompi_hbf2fc22_100.conda#0eb36a09dad274e750d60b49aaec0af7 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.10.0-nompi_hb6f1874_102.conda#dafc798d5e897b8024220ecbab686873 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda#eb52d14a901e23c39e9e7b4a1a5c015f -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py311h2e04523_0.conda#cfc8f864dea571677095ebae8e6f0c07 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py313hf6604e3_0.conda#c4a9d2e77eb9fee983a70cf5f047c202 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py311hc7c0204_4.conda#17f22789a811c010b53542bd6b2aeb14 +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py313he648cc1_4.conda#fe69af9ea9bb222c067bca5888e5aabe https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.0-pyhcf101f3_0.conda#c178102b6e9a0ef95e70610fe7f00af3 -https://conda.anaconda.org/conda-forge/noarch/python-gil-3.11.15-hd8ed1ab_0.conda#8793751936480e56ce4047b4f54b997f +https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.12-h4df99d1_100.conda#3d92938d5b83c49162ade038aab58a59 https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda#28687768633154993d521aecfa4a56ac https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.46.3-pyhd8ed1ab_0.conda#bdbd7385b4a67025ac2dba4ef8cb6a8f https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda#11a2b8c732d215d977998ccd69a9d5e8 -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py311h0372a8f_1.conda#77cf197e2f03986b6505bab6e214d22a -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py311h724c32c_4.conda#d04e508f5a03162c8bab4586a65d00bf +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py313h29aa505_1.conda#c63d5f9d63fe2f48b0ad75005fcae7ba +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py313hc8edb43_4.conda#33639459bc29437315d4bff9ed5bc7a7 https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda#809f4cde7c853f437becc43415a2ecdf https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.9-h1588d4d_1.conda#115ecf05370670f93bc81a8c4f7fd57f -https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py311h0372a8f_2.conda#487756753716efba090d06c71fb73eb6 -https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh8b19718_0.conda#67bdec43082fd8a9cffb9484420b39a2 +https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py313h29aa505_2.conda#ad53894d278895bf15c8fc324727d224 https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda#2b694bad8a50dc2f712f5368de866480 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py311hbe70eeb_0.conda#5ae6d73ab0bebbc892c2d46dc51e90a5 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py313h4b8bb8b_0.conda#ec81bc03787968decae6765c7f61b7cf https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0.conda#e2e4d7094d0580ccd62e2a41947444f3 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py311h8a92878_2.conda#b37c338ff0f69883188c9b3b127be059 -https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py311hdf67eae_0.conda#5a715cf5e3dc6cd68717c50e47dd7b6b +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py313had47c43_2.conda#6e550dd748e9ac9b2925411684e076a1 +https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py313h7037e92_0.conda#cb423e0853b3dde2b3738db4dedf5ba2 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda#9272daa869e03efe68833e3dc7a02130 https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.2.0-pyhcf101f3_0.conda#704c22301912f7e37d0a92b2e7d5942d -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py311haee01d2_1.conda#ca45bfd4871af957aaa5035593d5efd2 -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.1-py311h0372a8f_0.conda#dd96428f7ee2aef4dc32076631418323 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py313h54dd161_1.conda#710d4663806d0f72b2fb414e936223b5 +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.1-py313h29aa505_0.conda#3942b6a86fe92d0888b3373f2c1e1676 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.46.0-h1c03fa5_1.conda#1c4634d840fc26122fa2fa0f2430c8e6 https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.17-pyhd8ed1ab_0.conda#5b7ae2ec4e0750e094f804a6cf1b2a37 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py311h0f3be63_0.conda#21a0139015232dc0edbf6c2179b5ec24 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.18-pyhd8ed1ab_0.conda#635d1a924e1c55416fce044ed96144a2 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py313h683a580_0.conda#ffe67570e1a9192d2f4c189b27f75f89 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py311ha0596eb_105.conda#71b833f92f41ab92b16ca9f87e8735fe -https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda#6891acad5e136cb62a8c2ed2679d6528 +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda#67d1790eefa81ed305b89d8e314c7923 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda#c65df89a0b2e321045a9e01d1337b182 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 https://conda.anaconda.org/conda-forge/noarch/tox-4.50.3-pyhcf101f3_0.conda#fe9872281200927f634c5efc2c96654c -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py311hed34c8f_1.conda#17c710c32010688086b28c088a8be579 +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py313h08cd8bf_1.conda#a0d8dc5c90850d9f1a79f69c98aef0ff https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda#7f3ac694319c7eaf81a0325d6405e974 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.46.0-np2py311h50facf7_0.conda#14a6d65bf8496ee5cd538d6dffb7d2b3 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.46.0-np2py313hc18bace_0.conda#93af5d555b8f2aa6f6f4c98cb0768b5f https://conda.anaconda.org/conda-forge/noarch/iris-3.14.1-pyha770c72_0.conda#0b6f532e907ce57be6905bd6d44fbe71 -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.3.10-pyhd8ed1ab_0.conda#7680e9ff5808963d358f41accdb95dc9 +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.3.20-pyhd8ed1ab_0.conda#9a37c51db3205bde40d44f4e3cf61b18 https://conda.anaconda.org/conda-forge/noarch/nox-2026.2.9-pyhcf101f3_0.conda#f59e57ff0cf84c21b070c206bbaa27db https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff @@ -214,3 +209,4 @@ https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-3.1.0-pyha770c72_ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda#00534ebcc0375929b45c3039b5ba7636 https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda#f7af826063ed569bb13f7207d6f949b0 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda#3bc61f7161d28137797e038263c04c54 + diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py314-linux-64.lock similarity index 82% rename from requirements/locks/py310-linux-64.lock rename to requirements/locks/py314-linux-64.lock index 8a69382f..acd9ae01 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py314-linux-64.lock @@ -1,19 +1,21 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: c9c2cc109eb8c116e9db50df49eb69ec6fe34d489a4cff5ff3dd3984e09456f4 +# input_hash: b2648fecfc3f0d0f5e69dd4931944bedc4983c156f236c1a82e0f40f012a7ef8 @EXPLICIT -https://conda.anaconda.org/conda-forge/noarch/python_abi-3.10-8_cp310.conda#05e00f3b21e88bb3d658ac700b2ce58c +https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda#0539938c55b6b1a59b560e843ad864a4 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda#ad659d0a2b3e47e38d829aa8cad2d610 https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda#4492fd26db29495f0ba23f146cd5638d https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda#239c5e9546c38a1e884d69effcf4c882 +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda#d87ff7921124eccd67248aa483c23fec https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda#a9f577daf3de00bca7c3c76c0ecbd1de https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda#4a13eeac0b5c8e5b8ab496e6c4ddd829 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda#18335a698559cdbcd86150a48bf54ba6 https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda#0aa00f03f9e39fb9876085dee11a85d4 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda#d2ffd7602c02f2b316fd921d39876885 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda#920bb03579f15389b9e512095ad995b7 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 -https://conda.anaconda.org/conda-forge/linux-64/libattr-2.5.2-hb03c661_1.conda#7e7f0a692eb62b95d3010563e7f963b6 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda#72c8fd1af66bd67bf580645b426513ed https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda#6c77a605a7a689d17d4819c0f8ac9a00 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda#e7f7ce06ec24cfcfb9e36d28cf82ba57 @@ -23,19 +25,19 @@ https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18. https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda#8397539e3a0bbd1695584fb4f927485a https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda#c7c83eecbb72d88b940c249af56c8b17 -https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 +https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda#2c21e66f50753a083cbe6b80f38268fa +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda#5f13ffc7d30ffec87864e678df9957b4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda#1b08cd684f34175e4514474793d44bcb https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda#db409b7c1720428638e7c0d509d3e1b5 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 -https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda#f61eb8cd60ff9057122a3d338b99c00f https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda#cffd3bdd58090148f4cfcd831f4b26ab https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda#b2895afaf55bf96a8c8282a2e47a5de0 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda#1dafce8548e38671bea82e3f5c6ce22f https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb47aa4a_0.conda#607e13a8caac17f9a664bcab5302ce06 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a -https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-hb03c661_1.conda#9bb149f49de3f322fca007283eaa2725 https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.1-h480dda7_0.conda#4d4efd0645cd556fab54617c4ad477ef https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda#c80d8a3b84358cb967fa81e7075fbc8a https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda#a752488c68f2e7c456bcbd8f16eec275 @@ -44,27 +46,23 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.co https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda#4ffbb341c8b616aa2494b6afb26a0c5f https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 +https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda#fb16b4b69e3f1dcfe79d80db8fd0c55d https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda#9063115da5bc35fdc3e1002e69b9ef6e https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda#5f13ffc7d30ffec87864e678df9957b4 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda#6235adb93d064ecdf3d44faee6f468de https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 -https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda#d7d95fc8287ea7bf33e0e7116d2b95ec https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda#98b6c9dc80eb87b2519b97bcf7e578dd -https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda#cffd3bdd58090148f4cfcd831f4b26ab https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda#2aadb0d17215603a82a2a6b0afd9a4cb -https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda#4a13eeac0b5c8e5b8ab496e6c4ddd829 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda#af39b9a8711d4a8d437b52c1d78eb6a1 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda#fb53fb07ce46a575c5d004bbc96032c2 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda#12bd9a3f089ee6c9266a37dab82afabd -https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.2-h73754d4_0.conda#8eaba3d1a4d7525c6814e861614457fd +https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda#e289f3d17880e44b633ba911d57a321b https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda#2a45e7f8af083626f009645a6481f12d https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda#be43915efc66345cccb3c310b6ed0374 @@ -75,14 +73,14 @@ https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#35 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda#861fb6ccbc677bb9a9fb2468430b9c6a https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda#8ccf913aaba749a5496c17629d859ed1 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_0.conda#8462b5322567212beeb025f3519fb3e2 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda#6f2e2c8f58160147c4d1c6f4c14cbac4 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda#c160954f7418d7b6e87eaf05a8913fa9 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda#d50608c443a30c341c24277d28290f76 -https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.2-ha770c72_0.conda#26c746d14402a3b6c684d045b23b9437 https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda#e49238a1609f9a4a844b09d9926f2c3d https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd -https://conda.anaconda.org/conda-forge/linux-64/python-3.10.20-h3c07f61_0_cpython.conda#5d4e2b00d99feacd026859b7fa239dc0 +https://conda.anaconda.org/conda-forge/linux-64/python-3.14.3-h32b2ec7_101_cp314.conda#c014ad06e60441661737121d3eae8a60 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.52.0-h04a0ce9_0.conda#7d9d7efe9541d4bb71b5934e8ee348ea https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda#34e54f03dfea3e7a2dcf1453a85f1085 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 @@ -90,8 +88,8 @@ https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda#8f37c8fb7116a18da04e52fa9e2c8df9 https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda#c6b0543676ecb1fb2d7643941fe375f2 https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda#f1976ce927373500cc19d3c0b2c85177 -https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py310h69bd2ac_0.conda#276a3ddf300498921601822e3b407088 -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py310hba01987_1.conda#393fca4557fbd2c4d995dcb89f569048 +https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda#a2ac7763a9ac75055b68f325d3255265 +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda#8910d2c46f7e7b519129f486e0fe927a https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.5-pyhd8ed1ab_0.conda#a66a1542c3ed584ca4fdb23955d81e91 https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda#765c4d97e877cdbbb88ff33152b86125 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 @@ -100,14 +98,14 @@ https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda#ea8 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda#61b8078a0905b12529abc622406cb62c https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/colorlog-6.10.1-pyh707e725_0.conda#33e96df3785bf61676ffee387e5a19e5 +https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.3-py314hd8ed1ab_101.conda#3bb89e4f795e5414addaa531d6b1500a https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda#4c2a8fef270f6c69591889b93f9f55c1 https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc https://conda.anaconda.org/conda-forge/noarch/filelock-3.25.2-pyhd8ed1ab_0.conda#f58064cec97b12a7136ebb8a6f8a129b https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.2-ha770c72_0.conda#eeec961fec28e747e1e1dc0446277452 https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.2.0-pyhd8ed1ab_0.conda#496c6c9411a6284addf55c898d6ed8d7 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h19486de_106.conda#c223ee1429ba538f3e48cfb4a0b97357 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h19486de_107.conda#27bd895de855fc7b600d8ea692cacba0 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda#daddf757c3ecd6067b9af1df1f25d89e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac @@ -115,25 +113,27 @@ https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda#53abe https://conda.anaconda.org/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda#92617c2ba2847cca7a6ed813b6f4ab79 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda#9614359868482abba1bd15ce465e3c42 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de -https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py310haaf941d_0.conda#8993ab7e5dce89147288dd78686e790c +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py314h97ea11e_0.conda#7397e418cab519b8d789936cf2dde6f6 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda#6636a2b6f1a87572df2970d3ebc87cc0 https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda#b38076eb5c8e40d0106beda6f95d7609 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py310h3406613_1.conda#671afe636d2a97759804723f5afc22e0 +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda#9a17c4307d23318476d7fbf0fedc0cde https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda#b76541e68fea4d511b1ac46a28dcd2c6 -https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py310h5a73078_0.conda#5e79faa7f34986b6124525f3d234512e +https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py314h8ec4b1a_0.conda#79678378ae235e24b3aa83cee1b38207 +https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh145f28c_0.conda#09a970fbf75e8ed1aa633827ded6aa4f https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda#82c1787f2a65c0155ef9652466ee98d6 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda#d7585b6550ad04c8c5e21097ada2888e -https://conda.anaconda.org/conda-forge/linux-64/proj-9.6.2-h18fbb6c_2.conda#1aeede769ec2fa0f474f8b73a7ac057f +https://conda.anaconda.org/conda-forge/linux-64/proj-9.8.0-he0df7b0_0.conda#3732388938fc3decf65b90884c2d8198 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda#3687cc0b82a8b4c17e1f0eb7e47163d5 https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.3-pyhd8ed1ab_0.conda#c138c7aaa6a10b5762dcd92247864aff https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac -https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.6.0-py310hf3bd8b6_1.conda#a49d7089a9d44aa209f970fc0e5abd1c -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py310h3406613_1.conda#2160894f57a40d2d629a34ee8497795f +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.6.0-py314he82b845_1.conda#21dce7c80bbdb9785633011ad348e530 +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda#2035f68f96be30dc60a5dfd7452c7941 +https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda#0dc48b4b570931adc8641e55c6c17fe4 https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda#8e194e7b992f99a5015edbd4ebd38efd https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda#03fe290994c5e4ec17293cfb6bdce520 @@ -143,64 +143,64 @@ https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda#72e https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda#32e37e8fe9ef45c637ee38ad51377769 https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda#c07a6153f8306e45794774cf9b13bd32 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d -https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py310h7c4b9e2_0.conda#234e9858dd691d3f597147e22cbf16cf +https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py314h5bd0f2a_0.conda#494fdf358c152f9fdd0673c128c2f3dd https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda#30cd29cb87d819caead4d55184c1d115 -https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py310he7384ee_1.conda#803e2d778b8dcccdc014127ec5001681 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.5-py310h3406613_0.conda#85cbfbcc0c49f7fb6da6259ce0048909 +https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda#cf45f4278afd6f4e6d03eda0f435d527 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.5-py314h67df5f8_0.conda#78f547b78ace7541c4f54c4268ac9d2e https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda#8e662bd460bda79b1ea39194e3c4c9ab -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.62.0-py310h3406613_0.conda#5ec9c93a61d857c8bdefdcebd49a5ef8 +https://conda.anaconda.org/conda-forge/noarch/fonttools-4.62.0-pyh7db6752_0.conda#049f68f9c90f00069c748cd6fb7bfb55 https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda#b8993c19b0c32a2f7b66cbb58ca27069 https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda#080594bf4493e6bae2607e65390c520a https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda#04558c96691bed63104678757beb4f8d -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.10.0-nompi_hbf2fc22_100.conda#0eb36a09dad274e750d60b49aaec0af7 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.10.0-nompi_hb6f1874_102.conda#dafc798d5e897b8024220ecbab686873 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda#eb52d14a901e23c39e9e7b4a1a5c015f -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.2.6-py310hefbff90_0.conda#b0cea2c364bf65cd19e023040eeab05d +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda#36f5b7eb328bdc204954a2225cf908e2 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.1-py310h71d0299_1.conda#e54b1eaeb50ad1767680181a8575a8db +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py314h7ce3bca_4.conda#d5d862492bbd0f4be1f6d57289459066 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.0-pyhcf101f3_0.conda#c178102b6e9a0ef95e70610fe7f00af3 +https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.3-h4df99d1_101.conda#235765e4ea0d0301c75965985163b5a1 +https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda#28687768633154993d521aecfa4a56ac https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.46.3-pyhd8ed1ab_0.conda#bdbd7385b4a67025ac2dba4ef8cb6a8f +https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda#11a2b8c732d215d977998ccd69a9d5e8 -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py310hf779ad0_1.conda#702cd87d652ec1956ee503b9e16bb1c0 -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.2-py310h3788b33_0.conda#b6420d29123c7c823de168f49ccdfe6a -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.8.0-h8f7a5dd_0.conda#12e7a110add59a05b337484568a83a4d +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py314hc02f841_1.conda#552b5d9d8a2a4be882e1c638953e7281 +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py314h97ea11e_4.conda#95bede9cdb7a30a4b611223d52a01aa4 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda#809f4cde7c853f437becc43415a2ecdf https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.9-h1588d4d_1.conda#115ecf05370670f93bc81a8c4f7fd57f -https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py310hf779ad0_2.conda#4906d8c3680f6c1273ad5a5775807867 -https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh8b19718_0.conda#67bdec43082fd8a9cffb9484420b39a2 +https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py314hc02f841_2.conda#55ac6d85f5dd8ec5e9919e7762fcb31a https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda#2b694bad8a50dc2f712f5368de866480 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py310h1d65ade_0.conda#8c29cd33b64b2eb78597fa28b5595c8d +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py314hf07bd8e_0.conda#d0510124f87c75403090e220db1e9d41 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0.conda#e2e4d7094d0580ccd62e2a41947444f3 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py310hc8bbb35_2.conda#0937b0e88a24c82e02d5b714acc9957c -https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py310h03d9f68_0.conda#c3b1f5bc28ae6282ba95156d18fde825 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py314hbe3edd8_2.conda#5963e6ee81772d450a35e6bc95522761 +https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py314h9891dd4_0.conda#5d3c008e54c7f49592fca9c32896a76f https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda#9272daa869e03efe68833e3dc7a02130 https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.2.0-pyhcf101f3_0.conda#704c22301912f7e37d0a92b2e7d5942d -https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py310h139afa4_1.conda#3741aefc198dfed2e3c9adc79d706bb7 -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.0-py310hf779ad0_1.conda#5e4aea6b728177b53e8a216922ebd6a2 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.8.2-pyhd8ed1ab_0.conda#8e7524a2fb561506260db789806c7ee9 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py314h0f05182_1.conda#2930a6e1c7b3bc5f66172e324a8f5fc3 +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.1-py314hc02f841_0.conda#de50a60eab348de04809a33e180b4b01 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.46.0-h1c03fa5_1.conda#1c4634d840fc26122fa2fa0f2430c8e6 https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.17-pyhd8ed1ab_0.conda#5b7ae2ec4e0750e094f804a6cf1b2a37 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py310hfde16b3_0.conda#093b60a14d2c0d8c10f17e14a73a60d3 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py310h21e55d4_104.conda#795e0bf8ab211cd6894fa8fa4067daa0 -https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda#6891acad5e136cb62a8c2ed2679d6528 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.18-pyhd8ed1ab_0.conda#635d1a924e1c55416fce044ed96144a2 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py314h1194b4b_0.conda#b8683e6068099b69c10dbfcf7204203f +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py311ha0596eb_105.conda#71b833f92f41ab92b16ca9f87e8735fe +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda#67d1790eefa81ed305b89d8e314c7923 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda#c65df89a0b2e321045a9e01d1337b182 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 https://conda.anaconda.org/conda-forge/noarch/tox-4.50.3-pyhcf101f3_0.conda#fe9872281200927f634c5efc2c96654c -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py310h0158d43_1.conda#871b5f746960f99ac23dbc73d14e2ad0 +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py314ha0b5721_1.conda#fe89c5fa422f215b0d75046ecd4667de https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda#7f3ac694319c7eaf81a0325d6405e974 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.46.0-np2py310h99de88f_0.conda#5cd2885529c45190b7374d8c79176a6f -https://conda.anaconda.org/conda-forge/noarch/iris-3.11.1-pyha770c72_1.conda#f501583062225a070455d011d81b07bf -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.3.10-pyhd8ed1ab_0.conda#7680e9ff5808963d358f41accdb95dc9 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.46.0-np2py314h56abb78_0.conda#8da2d87e5f1c73ec72c5e827d3df2033 +https://conda.anaconda.org/conda-forge/noarch/iris-3.14.1-pyha770c72_0.conda#0b6f532e907ce57be6905bd6d44fbe71 +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.3.20-pyhd8ed1ab_0.conda#9a37c51db3205bde40d44f4e3cf61b18 https://conda.anaconda.org/conda-forge/noarch/nox-2026.2.9-pyhcf101f3_0.conda#f59e57ff0cf84c21b070c206bbaa27db https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff @@ -208,5 +208,6 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jquery-4.1-pyhd8ed1ab_1.conda#403185829255321ea427333f7773dd1f https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-3.1.0-pyha770c72_0.conda#cede6bc99a0253fa676f03cfdc666d57 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda#00534ebcc0375929b45c3039b5ba7636 -https://conda.anaconda.org/conda-forge/noarch/sphinx-8.1.3-pyhd8ed1ab_1.conda#1a3281a0dc355c02b5506d87db2d78ac +https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda#f7af826063ed569bb13f7207d6f949b0 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda#3bc61f7161d28137797e038263c04c54 + diff --git a/requirements/py312.yml b/requirements/py312.yml index 20e283f4..f606c9c4 100644 --- a/requirements/py312.yml +++ b/requirements/py312.yml @@ -11,7 +11,7 @@ dependencies: - setuptools_scm>=8 # Core dependencies. - - iris>=3.0.2 + - iris>=3.10 - python-eccodes>=1.6.1 - eccodes>=2.33 diff --git a/requirements/py310.yml b/requirements/py313.yml similarity index 93% rename from requirements/py310.yml rename to requirements/py313.yml index 0288f292..1ecb9018 100644 --- a/requirements/py310.yml +++ b/requirements/py313.yml @@ -4,14 +4,14 @@ channels: - conda-forge dependencies: - - python=3.10 + - python=3.13 # Setup dependencies. - setuptools>=77.0.3 - setuptools_scm>=8 # Core dependencies. - - iris>=3.0.2 + - iris>=3.10 - python-eccodes>=1.6.1 - eccodes>=2.33 diff --git a/requirements/py311.yml b/requirements/py314.yml similarity index 93% rename from requirements/py311.yml rename to requirements/py314.yml index 772f6131..c986b671 100644 --- a/requirements/py311.yml +++ b/requirements/py314.yml @@ -4,14 +4,14 @@ channels: - conda-forge dependencies: - - python=3.11 + - python=3.14 # Setup dependencies. - setuptools>=77.0.3 - setuptools_scm>=8 # Core dependencies. - - iris>=3.0.2 + - iris>=3.10 - python-eccodes>=1.6.1 - eccodes>=2.33 diff --git a/requirements/pypi-core.txt b/requirements/pypi-core.txt index 0c3e69c5..cd285b47 100644 --- a/requirements/pypi-core.txt +++ b/requirements/pypi-core.txt @@ -1,2 +1,2 @@ -scitools-iris>=3.0.2 +scitools-iris>=3.10 eccodes>=1.6.1 diff --git a/requirements/readthedocs.yml b/requirements/readthedocs.yml index 331a25f1..05372566 120000 --- a/requirements/readthedocs.yml +++ b/requirements/readthedocs.yml @@ -1 +1 @@ -py312.yml \ No newline at end of file +py314.yml \ No newline at end of file From 6109ecd5731b97caf23bbe64b25360faaf6fd34b Mon Sep 17 00:00:00 2001 From: Martin Yeo <40734014+trexfeathers@users.noreply.github.com> Date: Tue, 24 Mar 2026 13:03:21 +0000 Subject: [PATCH 551/583] Refactor docs and add new example (#768) * Add Diataxis structure. * Refactor docs into Diataxis structure. * Hack to show whole structure in sidebar. * How to modify GRIB content during loading. * Fix doctests. * More vanilla site navigation. * Revert "Hack to show whole structure in sidebar." This reverts commit 7ba78fa8b70b500a006695789de7a4a05e4582e7. * Review comments. --- docs/explanation/phenom_translation.rst | 33 +++ docs/how_to/get_started.rst | 21 ++ docs/how_to/modify_during_load.rst | 45 ++++ docs/how_to/simple_grib_io.rst | 29 +++ docs/index.rst | 273 +++++------------------- docs/{ => reference}/release_notes.rst | 2 - docs/tutorial/load_save_api.rst | 160 ++++++++++++++ 7 files changed, 342 insertions(+), 221 deletions(-) create mode 100644 docs/explanation/phenom_translation.rst create mode 100644 docs/how_to/get_started.rst create mode 100644 docs/how_to/modify_during_load.rst create mode 100644 docs/how_to/simple_grib_io.rst rename docs/{ => reference}/release_notes.rst (99%) create mode 100644 docs/tutorial/load_save_api.rst diff --git a/docs/explanation/phenom_translation.rst b/docs/explanation/phenom_translation.rst new file mode 100644 index 00000000..0759477f --- /dev/null +++ b/docs/explanation/phenom_translation.rst @@ -0,0 +1,33 @@ +Phenomenon translation +====================== + +``iris-grib`` attempts to translate between CF phenomenon identities +(i.e. 'standard_name' and possibly 'long_name' attributes), and GRIB parameter codes, +when converting cubes to or from the GRIB format. + +A set of tables define known CF translations for GRIB1 and GRIB2 parameters, and can be +interrogated with the functions in :mod:`iris_grib.grib_phenom_translation`. + +Parameter loading record +------------------------ +All cubes loaded from GRIB have a ``GRIB_PARAM`` attribute, which records the parameter +encodings present in the original file message. + +Examples : + +* ``"GRIB2:d000c003n005"`` represents GRIB2, discipline=0 ("Meteorological products"), + category=3 ("Mass") and indicatorOfParameter=5 ("Geopotential height (gpm)"). + + * This translates to a standard_name and units of "geopotential_height / m" + +* ``"GRIB1:t002c007n033"`` is GRIB1 with table2Version=2, centre=7 + ("US National Weather Service - NCEP (WMC)"), and indicatorOfParameter=33 + ("U-component of wind m s**-1"). + + * This translates to a standard_name and units of "x_wind / m s-1". + +Parameter saving control +------------------------ +When a cube has a ``GRIB_PARAM`` attribute, as described above, this controls what the +relevant message keys are set to on saving. +(N.B. at present applies only to GRIB2, since we don't support GRIB1 saving) diff --git a/docs/how_to/get_started.rst b/docs/how_to/get_started.rst new file mode 100644 index 00000000..98538453 --- /dev/null +++ b/docs/how_to/get_started.rst @@ -0,0 +1,21 @@ +Getting Started +=============== + +To ensure all ``iris-grib`` dependencies, it is sufficient to have installed +:mod:`Iris ` itself, and +`ecCodes `_ . + +The simplest way to install is with +`conda `_ , using the +`package on conda-forge `_ , +with the command:: + + $ conda install -c conda-forge iris-grib + +Pip can also be used, to install from the +`package on PyPI `_ , +with the command:: + + $ pip install iris-grib + +Development sources are hosted at ``_ . diff --git a/docs/how_to/modify_during_load.rst b/docs/how_to/modify_during_load.rst new file mode 100644 index 00000000..84fb6790 --- /dev/null +++ b/docs/how_to/modify_during_load.rst @@ -0,0 +1,45 @@ +How to modify GRIB content during loading +========================================= + +See also: :doc:`/tutorial/load_save_api`. + +.. testsetup:: + + import iris + import iris_grib + import warnings + + warnings.simplefilter("ignore") + cube = iris.load_cube(iris.sample_data_path("A1B_north_america.nc")) + cube.coord("forecast_period").guess_bounds() + filename = "testfile.grib" + iris.save(cube, filename, saver="grib2") + +Here is a basic example of how you can modify the GRIB messages being loaded, +and how to turn those modified messages into Iris cubes. + + >>> import iris + >>> from iris.cube import CubeList + >>> from iris_grib import GribMessage, load_pairs_from_fields + >>> + >>> def adjust_message(msg: GribMessage) -> GribMessage: + ... # Advance all time steps by 1 hour. + ... if msg.sections[0]["editionNumber"] == 2: + ... s1 = msg.sections[1] + ... s1["hour"] += 1 + ... s4 = msg.sections[4] + ... s4["hourOfEndOfOverallTimeInterval"] += 1 + ... return msg + + >>> original = iris.load_cube(filename) + >>> fields = GribMessage.messages_from_filename(filename) + >>> fields = (adjust_message(msg) for msg in fields) + >>> cubes = CubeList(cube for cube, _ in load_pairs_from_fields(fields)) + >>> modified = cubes.combine_cube() + +Compare the final 5 time steps of the original and modified cubes: + + >>> print(original.coord("time").points[-5:]) + [1084524. 1093236. 1101936. 1110636. 1119336.] + >>> print(modified.coord("time").points[-5:]) + [1084525. 1093237. 1101937. 1110637. 1119337.] diff --git a/docs/how_to/simple_grib_io.rst b/docs/how_to/simple_grib_io.rst new file mode 100644 index 00000000..6d5c4fd0 --- /dev/null +++ b/docs/how_to/simple_grib_io.rst @@ -0,0 +1,29 @@ +Simple GRIB Loading and Saving with Iris +======================================== + +You can use the functionality provided by ``iris-grib`` directly within Iris +without having to explicitly import ``iris-grib``, as long as you have both Iris +and ``iris-grib`` installed in your Python environment. + +**This is the preferred route if no special control is required.** + +.. testsetup:: + + import iris + import iris_grib + import warnings + + warnings.simplefilter("ignore") + cube = iris.load_cube(iris.sample_data_path("rotated_pole.nc")) + iris.save(cube, "testfile.grib", saver="grib2") + +For example, to load GRIB data : + + >>> cube = iris.load_cube('testfile.grib') + +Similarly, you can save cubes to a GRIB file directly from Iris : + + >>> iris.save(cube, 'my_file.grib2') + +.. note:: + As the filename suggests, **only saving to GRIB2 is currently supported**. diff --git a/docs/index.rst b/docs/index.rst index d015c639..83d5f9e7 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -13,244 +13,79 @@ for analysing and visualising the contents of the GRIB files. Iris cubes can als saved to GRIB edition-2 files using ``iris-grib``. -Simple GRIB Loading and Saving with Iris ----------------------------------------- -You can use the functionality provided by ``iris-grib`` directly within Iris -without having to explicitly import ``iris-grib``, as long as you have both Iris -and ``iris-grib`` installed in your Python environment. - -**This is the preferred route if no special control is required.** - -.. testsetup:: - - import iris - import iris_grib - import warnings - - warnings.simplefilter("ignore") - cube = iris.load_cube(iris.sample_data_path("rotated_pole.nc")) - iris.save(cube, "testfile.grib", saver="grib2") - -For example, to load GRIB data : - - >>> cube = iris.load_cube('testfile.grib') - -Similarly, you can save cubes to a GRIB file directly from Iris : - - >>> iris.save(cube, 'my_file.grib2') - -.. note:: - As the filename suggests, **only saving to GRIB2 is currently supported**. - - -Phenomenon translation ----------------------- -``iris-grib`` attempts to translate between CF phenomenon identities -(i.e. 'standard_name' and possibly 'long_name' attributes), and GRIB parameter codes, -when converting cubes to or from the GRIB format. - -A set of tables define known CF translations for GRIB1 and GRIB2 parameters, and can be -interrogated with the functions in :mod:`iris_grib.grib_phenom_translation`. - - -Parameter loading record -^^^^^^^^^^^^^^^^^^^^^^^^ -All cubes loaded from GRIB have a ``GRIB_PARAM`` attribute, which records the parameter -encodings present in the original file message. - -Examples : - -* ``"GRIB2:d000c003n005"`` represents GRIB2, discipline=0 ("Meteorological products"), - category=3 ("Mass") and indicatorOfParameter=5 ("Geopotential height (gpm)"). - - * This translates to a standard_name and units of "geopotential_height / m" - -* ``"GRIB1:t002c007n033"`` is GRIB1 with table2Version=2, centre=7 - ("US National Weather Service - NCEP (WMC)"), and indicatorOfParameter=33 - ("U-component of wind m s**-1"). - - * This translates to a standard_name and units of "x_wind / m s-1". - -Parameter saving control -^^^^^^^^^^^^^^^^^^^^^^^^ -When a cube has a ``GRIB_PARAM`` attribute, as described above, this controls what the -relevant message keys are set to on saving. -(N.B. at present applies only to GRIB2, since we don't support GRIB1 saving) - - -Iris-grib Load and Save API ---------------------------- -In addition to direct load and save with Iris, as described above, -it is also possible to load and save GRIB data using iris-grib functions. - -Loading and saving Cubes -^^^^^^^^^^^^^^^^^^^^^^^^ -Load -~~~~ -To load from a GRIB file with ``iris-grib``, you can call the -:func:`~iris_grib.load_cubes` function : - - >>> cubes_iter = iris_grib.load_cubes('testfile.grib') - >>> print(cubes_iter) - - -As we can see, this returns a generator object. The generator object may be iterated -over to access all the Iris cubes loaded from the GRIB file, or converted directly -to a list:: - - >>> cubes = list(cubes_iter) - >>> print(cubes) - [] - -In effect, this is the same as using ``iris.load_raw(...)``. -So, in most cases, **that is preferable.** - -Save -~~~~ -To use ``iris-grib`` to save Iris cubes to a GRIB file we can make use of the -:func:`~iris_grib.save_grib2` function : - - >>> iris_grib.save_grib2(cube, 'my_file.grib2') - -In effect, this is the same as using ``iris.save(cube, ...)``. -So, in most cases, **that is preferable.** - - -Working with GRIB messages -^^^^^^^^^^^^^^^^^^^^^^^^^^ -Iris-grib also provides lower-level functions which allow the user to inspect and -adjust actual GRIB encoding details, for precise custom control of loading and saving. - -These functions use intermediate objects which represent individual GRIB file -"messages", with all the GRIB metadata. - -For example: - -* correct loading of some messages with incorrectly encoded parameter number -* save messages with adjusted parameter encodings -* load messages with an unsupported parameter definition template : adjust them to - mimic a similar type which *is* supported by cube translation, and post-modify the - resulting cubes to correct the Iris metadata - -You can load and save messages to and from files, and convert them to and from Cubes. - -.. note:: - at present this only works with GRIB2 data. - -.. note:: - Messages are not represented in the same way for loading and saving : the messages - generated by loading *from* files are represented by - :class:`iris_grib.message.GribMessage` objects, whereas messages generated from - cubes, for saving *to* files, are represented as message handles from the - `Python eccodes library `_ . - -Load -~~~~ -The key functions are :func:`~iris_grib.load_pairs_from_fields` and -:func:`~iris_grib.message.GribMessage.messages_from_filename`. -See those for more detail. - -You can load data to 'messages', and filter or modify them to enable or correct -how Iris converts them to 'raw' cubes (i.e. individual 2-dimensional fields). - -For example: - - >>> from iris_grib.message import GribMessage - >>> fields_iter = GribMessage.messages_from_filename('testfile.grib') - >>> # select only wanted data - >>> selected_fields = [ - ... field - ... for field in fields_iter - ... if field.sections[4]['parameterNumber'] == 33 - ... ] - >>> cube_field_pairs = iris_grib.load_pairs_from_fields(selected_fields) - -Filtering fields can be very useful to speed up loading, since otherwise all data must -be converted to Iris *before* selection with constraints, which can be quite costly. - - -Save -~~~~ -The key functions are :func:`~iris_grib.save_pairs_from_cubes` and -:func:`~iris_grib.save_messages`. -See those for more detail. - -You can convert Iris cubes to eccodes messages, and modify or filter them before saving. - -.. note:: - The messages here are eccodes message "ids", essentially integers, and *not* - :class:`~iris_grib.message.GribMessages`. Thus, they must be inspected and - manipulated using the eccodes library functions. - -.. testsetup:: - - from iris.coords import DimCoord - import eccodes - - cube_height_2m5 = iris.load_cube(iris.sample_data_path("rotated_pole.nc")) - cube_height_2m5.add_aux_coord(DimCoord([2.5], standard_name="height", units="m"), ()) +New here? +--------- -For example: +We recommend: - >>> # translate data to grib2 fields - >>> cube_field_pairs = list(iris_grib.save_pairs_from_cube(cube_height_2m5)) - >>> # adjust some of them - >>> for cube, field in cube_field_pairs: - ... if cube.coords('height') and cube.coord('height').points[0] == 2.5: - ... # we know this will have been rounded, badly, so needs re-scaling. - ... assert eccodes.codes_get_long(field, 'scaleFactorOfFirstFixedSurface') == 0 - ... assert eccodes.codes_get_long(field, 'scaledValueOfFirstFixedSurface') == 2 - ... eccodes.codes_set_long(field, 'scaleFactorOfFirstFixedSurface', 1) - ... eccodes.codes_set_long(field, 'scaledValueOfFirstFixedSurface', 25) - ... - >>> # save to file - >>> messages = [msg for (cube, msg) in cube_field_pairs] - >>> iris_grib.save_messages(messages, 'temp.grib2') - >>> # check result - >>> print(iris.load_cube('temp.grib2').coord('height').points) - [2.5] +- :doc:`/how_to/get_started` +- :doc:`/how_to/simple_grib_io` -Getting Started -=============== +Navigating this site +-------------------- -To ensure all ``iris-grib`` dependencies, it is sufficient to have installed -:mod:`Iris ` itself, and -`ecCodes `_ . +.. list-table:: + :header-rows: 1 + :stub-columns: 1 -The simplest way to install is with -`conda `_ , using the -`package on conda-forge `_ , -with the command:: + * - + - Description + - supports ... + - via ... + * - Tutorials + - Guided lessons for understanding a topic. + - study + - action + * - Explanation + - In-depth discussion for understanding concepts. + - study + - theory + * - How-To Guides + - Step by step instructions for achieving a specific goal. + - work + - action + * - Reference + - Concise information to look up when needed. + - work + - theory - $ conda install -c conda-forge iris-grib +Read more: `Diataxis.fr`_ -Pip can also be used, to install from the -`package on PyPI `_ , -with the command:: - $ pip install iris-grib +.. toctree:: + :maxdepth: 1 + :caption: Tutorials -Development sources are hosted at ``_ . + tutorial/load_save_api -Releases -======== +.. toctree:: + :maxdepth: 1 + :caption: Explanation -For recent changes, see :ref:`release_notes` . + explanation/phenom_translation +.. toctree:: + :maxdepth: 1 + :caption: How-To Guides -API Documentation -================== + how_to/get_started + how_to/simple_grib_io + how_to/modify_during_load .. toctree:: - :maxdepth: 4 + :maxdepth: 1 + :caption: Reference - api/modules + reference/release_notes + Iris-grib API -See also: ---------- +See also +-------- * :ref:`genindex` * :ref:`modindex` -* :ref:`search` + + +.. _Diataxis.fr: https://diataxis.fr/ diff --git a/docs/release_notes.rst b/docs/reference/release_notes.rst similarity index 99% rename from docs/release_notes.rst rename to docs/reference/release_notes.rst index f3ae02c9..e0ae9fde 100644 --- a/docs/release_notes.rst +++ b/docs/reference/release_notes.rst @@ -1,5 +1,3 @@ -:orphan: - .. _release_notes: Release Notes diff --git a/docs/tutorial/load_save_api.rst b/docs/tutorial/load_save_api.rst new file mode 100644 index 00000000..9e6fe01d --- /dev/null +++ b/docs/tutorial/load_save_api.rst @@ -0,0 +1,160 @@ +Iris-grib Load and Save API +=========================== + +In addition to direct load and save with Iris, as described above, +it is also possible to load and save GRIB data using iris-grib functions. + +.. note:: + + The API here is for special cases. It is usually simplest to load and + save GRIB data using the regular iris load and save functions, as described + at :doc:`/how_to/simple_grib_io`. + +.. testsetup:: + + import iris + import iris_grib + import warnings + + warnings.simplefilter("ignore") + cube = iris.load_cube(iris.sample_data_path("rotated_pole.nc")) + iris.save(cube, "testfile.grib", saver="grib2") + +Loading and saving Cubes +------------------------ + +Load +^^^^ + +To load from a GRIB file with ``iris-grib``, you can call the +:func:`~iris_grib.load_cubes` function : + + >>> cubes_iter = iris_grib.load_cubes('testfile.grib') + >>> print(cubes_iter) + + +As we can see, this returns a generator object. The generator object may be iterated +over to access all the Iris cubes loaded from the GRIB file, or converted directly +to a list:: + + >>> cubes = list(cubes_iter) + >>> print(cubes) + [] + +In effect, this is the same as using ``iris.load_raw(...)``. +So, in most cases, **that is preferable.** + +Save +^^^^ + +To use ``iris-grib`` to save Iris cubes to a GRIB file we can make use of the +:func:`~iris_grib.save_grib2` function : + + >>> iris_grib.save_grib2(cube, 'my_file.grib2') + +In effect, this is the same as using ``iris.save(cube, ...)``. +So, in most cases, **that is preferable.** + + +Working with GRIB messages +-------------------------- + +Iris-grib also provides lower-level functions which allow the user to inspect and +adjust actual GRIB encoding details, for precise custom control of loading and saving. + +These functions use intermediate objects which represent individual GRIB file +"messages", with all the GRIB metadata. + +For example: + +* correct loading of some messages with incorrectly encoded parameter number +* save messages with adjusted parameter encodings +* load messages with an unsupported parameter definition template : adjust them to + mimic a similar type which *is* supported by cube translation, and post-modify the + resulting cubes to correct the Iris metadata + +You can load and save messages to and from files, and convert them to and from Cubes. + +.. note:: + at present this only works with GRIB2 data. + +.. note:: + Messages are not represented in the same way for loading and saving : the messages + generated by loading *from* files are represented by + :class:`iris_grib.message.GribMessage` objects, whereas messages generated from + cubes, for saving *to* files, are represented as message handles from the + `Python eccodes library `_ . + +Load +^^^^ + +The key functions are :func:`~iris_grib.load_pairs_from_fields` and +:func:`~iris_grib.message.GribMessage.messages_from_filename`. +See those for more detail. + +You can load data to 'messages', and filter or modify them to enable or correct +how Iris converts them to 'raw' cubes (i.e. individual 2-dimensional fields). + +.. caution:: + + Remember: modifying a :class:`~iris_grib.message.GribMessage` does NOT modify + the underlying GRIB file. + +For example: + + >>> from iris_grib.message import GribMessage + >>> fields_iter = GribMessage.messages_from_filename('testfile.grib') + >>> # select only wanted data + >>> selected_fields = [ + ... field + ... for field in fields_iter + ... if field.sections[4]['parameterNumber'] == 33 + ... ] + >>> cube_field_pairs = iris_grib.load_pairs_from_fields(selected_fields) + +Filtering fields can be very useful to speed up loading, since otherwise all data must +be converted to Iris *before* selection with constraints, which can be quite costly. + +See also: :doc:`/how_to/modify_during_load`. + +Save +^^^^ + +The key functions are :func:`~iris_grib.save_pairs_from_cubes` and +:func:`~iris_grib.save_messages`. +See those for more detail. + +You can convert Iris cubes to eccodes messages, and modify or filter them before saving. + +.. note:: + The messages here are eccodes message "ids", essentially integers, and *not* + :class:`~iris_grib.message.GribMessages`. Thus, they must be inspected and + manipulated using the eccodes library functions. + +.. testsetup:: + + from iris.coords import DimCoord + import eccodes + + cube_height_2m5 = iris.load_cube(iris.sample_data_path("rotated_pole.nc")) + cube_height_2m5.add_aux_coord(DimCoord([2.5], standard_name="height", units="m"), ()) + +For example: + + >>> # translate data to grib2 fields + >>> cube_field_pairs = list(iris_grib.save_pairs_from_cube(cube_height_2m5)) + >>> # adjust some of them + >>> for cube, field in cube_field_pairs: + ... if cube.coords('height') and cube.coord('height').points[0] == 2.5: + ... # we know this will have been rounded, badly, so needs re-scaling. + ... assert eccodes.codes_get_long(field, 'scaleFactorOfFirstFixedSurface') == 0 + ... assert eccodes.codes_get_long(field, 'scaledValueOfFirstFixedSurface') == 2 + ... eccodes.codes_set_long(field, 'scaleFactorOfFirstFixedSurface', 1) + ... eccodes.codes_set_long(field, 'scaledValueOfFirstFixedSurface', 25) + ... + >>> # save to file + >>> messages = [msg for (cube, msg) in cube_field_pairs] + >>> iris_grib.save_messages(messages, 'temp.grib2') + >>> # check result + >>> print(iris.load_cube('temp.grib2').coord('height').points) + [2.5] From a8a2fbba58eacd9c49ffeba83d00d4a1af99a68a Mon Sep 17 00:00:00 2001 From: Martin Yeo <40734014+trexfeathers@users.noreply.github.com> Date: Tue, 24 Mar 2026 14:45:07 +0000 Subject: [PATCH 552/583] Release notes for v0.22 (#771) * v0.22 release notes. * Add entry about SciTools/iris-grib#786. * Typo in PR number. Co-authored-by: Patrick Peglar --------- Co-authored-by: Patrick Peglar --- docs/reference/release_notes.rst | 90 +++++++++++++++++++++++++++++++- 1 file changed, 89 insertions(+), 1 deletion(-) diff --git a/docs/reference/release_notes.rst b/docs/reference/release_notes.rst index f885f783..9e1cadfb 100644 --- a/docs/reference/release_notes.rst +++ b/docs/reference/release_notes.rst @@ -15,10 +15,97 @@ Features * `@MoseleyS `_ added support for loading GRIB2 data found in the Met Office wholesale Weather Data Hub and CEDA archive. `(PR#647) `_ + * `@andrewgryan `_ and `@trexfeathers `_ added saving support for Earth shape 6 - fixed radius 6,371,229 m. - `(PR#712) `_ + `(PR#712) `_ + + +Fixes +^^^^^ +* `@pp-mo `_ fixed the setting of + :class:`~iris_grib.grib_message.GribMessage` values, making it possible to + set values for keys that have not been read yet. + `(PR#766) `_ + +* `@pp-mo `_ fixed a problem of scaled integers + rounding incorrectly, resulting from the transition to NumPy v2. + `(PR#767) `_ + + +Documentation +^^^^^^^^^^^^^ +* `@trexfeathers `_ reorganised the + documentation to be easier to navigate, using the Diataxis framework. + `(PR#768) `_ + +Dependencies +^^^^^^^^^^^^ +* `@trexfeathers `_ updated the supported + Python versions to be 3.12, 3.13, 3.14; in line with + `SPEC 0 `_. + `(PR#770) `_ + +* `@trexfeathers `_ updated the minimum + supported Iris version to >=3.10, owing to some internal changes in Iris-grib. + `(PR#770) `_ + +* Iris-grib is continually updated to test against the latest version of its + dependencies, allowing us to respond promptly to any breaking changes, and to + provide a record of what changed and when. + +* Iris-grib is continually updated to follow the latest coding standard + conventions in scientific Python - via + `repo-review `_ + and `pre-commit `_ - maximising the ease of + contribution and maintenance. + + +Internal +^^^^^^^^ +* `@ESadek-MO `_ improved Pickle testing to not + rely on Iris, and to use PyTest. + `(PR#620) `_ + +* `@stephenworsley `_ increased Iris-grib's + compliance with Scientific Python's + `repo-review `_. + `(PR#638) `_ + +* `@pp-mo `_ added testing for reading/writing + ``GRIB_PARAM`` attributes in NetCDF files. + `(PR#677) `_ + +* Various improvements to coding standards ('linting'): + + * `PR#599 `_ + * `PR#625 `_ + * `PR#667 `_ + * `PR#694 `_ + * `PR#758 `_ + +* `@pp-mo `_ dropped the outdated use of the + ``np.floating`` type. `PR#664 `_ + +* `@trexfeathers `_ adapted tests for upstream + changes in ecCodes test data (ECC-2110). + `(PR#716) `_ + +* `@trexfeathers `_ adapted tests for an + upstream fix in cf-time date2num conversion (cftime#355). + `(PR#748) `_ + +* `@pp-mo `_ and + `@trexfeathers `_ are working through a + large refactor so that GRIB1 and GRIB2 support share as much code as possible. + Progress in this release: `PR#738 `_ + +* `@ukmo-ccbunney `_ and + `@ESadek-MO `_ aligned ``CITATION.cff`` and + ``MANIFEST.in`` with agreed SciTools standards. + `(PR#675) `_, + `(PR#676) `_ New Contributors @@ -27,6 +114,7 @@ Welcome to * `@MoseleyS `_ * `@andrewgryan `_ +* `@ukmo-ccbunney `_ What's new in iris-grib v0.21.0 From 82d5443fca0fb8af226c4e481d620ceaecb04a64 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 30 Mar 2026 11:39:06 +0100 Subject: [PATCH 553/583] Updated environment lockfiles (#776) Co-authored-by: Lockfile bot --- requirements/locks/py312-linux-64.lock | 63 ++++++++++++++------------ requirements/locks/py313-linux-64.lock | 41 ++++++++++------- requirements/locks/py314-linux-64.lock | 41 ++++++++++------- 3 files changed, 85 insertions(+), 60 deletions(-) diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index e1c01674..dcfcc808 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -1,19 +1,22 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 91532b637582431f4f0f4b6b1cc13a5ed67d3de3d47cda643e03c5547b4a5340 +# input_hash: fae040897887b28275b44381a11bec8be6c19b1c3e8767ab882fd39f1a971757 @EXPLICIT https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda#c3efd25ac4d74b1584d2f7a57195ddf1 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda#ad659d0a2b3e47e38d829aa8cad2d610 https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda#4492fd26db29495f0ba23f146cd5638d https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda#239c5e9546c38a1e884d69effcf4c882 +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda#d87ff7921124eccd67248aa483c23fec https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda#a9f577daf3de00bca7c3c76c0ecbd1de https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda#4a13eeac0b5c8e5b8ab496e6c4ddd829 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda#18335a698559cdbcd86150a48bf54ba6 https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda#0aa00f03f9e39fb9876085dee11a85d4 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.6-hb03c661_0.conda#e36ad70a7e0b48f091ed6902f04c23b8 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda#d2ffd7602c02f2b316fd921d39876885 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda#920bb03579f15389b9e512095ad995b7 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 -https://conda.anaconda.org/conda-forge/linux-64/libattr-2.5.2-hb03c661_1.conda#7e7f0a692eb62b95d3010563e7f963b6 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda#72c8fd1af66bd67bf580645b426513ed https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda#6c77a605a7a689d17d4819c0f8ac9a00 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda#e7f7ce06ec24cfcfb9e36d28cf82ba57 @@ -24,18 +27,22 @@ https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#9 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda#8397539e3a0bbd1695584fb4f927485a https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda#c7c83eecbb72d88b940c249af56c8b17 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.56-h421ea60_0.conda#97169784f0775c85683c3d8badcea2c3 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda#1b08cd684f34175e4514474793d44bcb https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda#db409b7c1720428638e7c0d509d3e1b5 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 -https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda#f61eb8cd60ff9057122a3d338b99c00f https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda#cffd3bdd58090148f4cfcd831f4b26ab https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda#b2895afaf55bf96a8c8282a2e47a5de0 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda#1dafce8548e38671bea82e3f5c6ce22f https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb47aa4a_0.conda#607e13a8caac17f9a664bcab5302ce06 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a -https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-hb03c661_1.conda#9bb149f49de3f322fca007283eaa2725 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.13-h2c9d079_1.conda#3c3d02681058c3d206b562b2e3bc337f +https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h8b1a151_0.conda#f16f498641c9e05b645fe65902df661a +https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-h8b1a151_4.conda#c7e3e08b7b1b285524ab9d74162ce40b +https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h8b1a151_0.conda#f8e1bcc5c7d839c5882e94498791be08 https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.1-h480dda7_0.conda#4d4efd0645cd556fab54617c4ad477ef https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda#c80d8a3b84358cb967fa81e7075fbc8a https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda#a752488c68f2e7c456bcbd8f16eec275 @@ -44,9 +51,9 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.co https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda#4ffbb341c8b616aa2494b6afb26a0c5f https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 +https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda#fb16b4b69e3f1dcfe79d80db8fd0c55d https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda#9063115da5bc35fdc3e1002e69b9ef6e https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda#5f13ffc7d30ffec87864e678df9957b4 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda#6235adb93d064ecdf3d44faee6f468de https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 @@ -55,30 +62,30 @@ https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.cond https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda#d7d95fc8287ea7bf33e0e7116d2b95ec +https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.1-h1cbb8d7_1.conda#9d978822b57bafe72ebd3f8b527bba71 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda#98b6c9dc80eb87b2519b97bcf7e578dd -https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda#cffd3bdd58090148f4cfcd831f4b26ab https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda#2aadb0d17215603a82a2a6b0afd9a4cb -https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda#4a13eeac0b5c8e5b8ab496e6c4ddd829 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-hc87160b_0.conda#dde6a3e4fe6bb2ecd2a7050dd1e701fb https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda#af39b9a8711d4a8d437b52c1d78eb6a1 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda#fb53fb07ce46a575c5d004bbc96032c2 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda#12bd9a3f089ee6c9266a37dab82afabd -https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.2-h73754d4_0.conda#8eaba3d1a4d7525c6814e861614457fd +https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda#e289f3d17880e44b633ba911d57a321b https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda#2a45e7f8af083626f009645a6481f12d -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda#be43915efc66345cccb3c310b6ed0374 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda#89d61bc91d3f39fda0ca10fcd3c68594 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda#fd893f6a3002a635b5e50ceb9dd2c0f4 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#cd5a90476766d53e901500df9215e927 https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda#f3bc152cb4f86babe30f3a4bf0dbef69 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda#861fb6ccbc677bb9a9fb2468430b9c6a +https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.12-h4bacb7b_1.conda#7bc920933e5fb225aba86a788164a8f1 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda#8ccf913aaba749a5496c17629d859ed1 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_0.conda#8462b5322567212beeb025f3519fb3e2 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda#6f2e2c8f58160147c4d1c6f4c14cbac4 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda#c160954f7418d7b6e87eaf05a8913fa9 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h4a7cf45_openblas.conda#6d6d225559bfa6e2f3c90ee9c03d4e2e https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda#d50608c443a30c341c24277d28290f76 -https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.2-ha770c72_0.conda#26c746d14402a3b6c684d045b23b9437 https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda#e49238a1609f9a4a844b09d9926f2c3d https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd @@ -89,6 +96,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0. https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda#8f37c8fb7116a18da04e52fa9e2c8df9 https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda#c6b0543676ecb1fb2d7643941fe375f2 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-h2d2dd48_2.conda#675ea6d90900350b1dcfa8231a5ea2dd https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda#f1976ce927373500cc19d3c0b2c85177 https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py312h90b7ffd_0.conda#5b8c55fed2e576dde4b0b33693a4fdb1 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py312hdb49522_1.conda#64088dffd7413a2dd557ce837b4cbbdb @@ -106,9 +114,7 @@ https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#0 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc https://conda.anaconda.org/conda-forge/noarch/filelock-3.25.2-pyhd8ed1ab_0.conda#f58064cec97b12a7136ebb8a6f8a129b https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.2-ha770c72_0.conda#eeec961fec28e747e1e1dc0446277452 https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.2.0-pyhd8ed1ab_0.conda#496c6c9411a6284addf55c898d6ed8d7 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h19486de_106.conda#c223ee1429ba538f3e48cfb4a0b97357 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda#daddf757c3ecd6067b9af1df1f25d89e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac @@ -117,9 +123,9 @@ https://conda.anaconda.org/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda#9614359868482abba1bd15ce465e3c42 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py312h0a2e395_0.conda#cd74a9525dc74bbbf93cf8aa2fa9eb5b -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda#6636a2b6f1a87572df2970d3ebc87cc0 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-6_h0358290_openblas.conda#36ae340a916635b97ac8a0655ace2a35 https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda#b38076eb5c8e40d0106beda6f95d7609 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h47877c9_openblas.conda#881d801569b201c2e753f03c84b85e15 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda#93a4752d42b12943a355b682ee43285b https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 @@ -141,13 +147,14 @@ https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339 https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda#03fe290994c5e4ec17293cfb6bdce520 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda#755cf22df8693aa0d1aec1c123fa5863 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb -https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda#72e780e9aa2d0a3295f59b1874e3768b +https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda#b5325cf06a000c5b14970462ff5e4d58 https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda#32e37e8fe9ef45c637ee38ad51377769 https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda#c07a6153f8306e45794774cf9b13bd32 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975b_0.conda#0b6c506ec1f272b685240e70a29261b8 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda#30cd29cb87d819caead4d55184c1d115 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.11.5-h6d69fc9_5.conda#4c5c16bf1133dcfe100f33dd4470998e https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py312h460c074_1.conda#648ee28dcd4e07a1940a17da62eccd40 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.5-py312h8a5da7c_0.conda#c4d858e15305e70b255e756a4dc96e58 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 @@ -159,23 +166,23 @@ https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc4 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda#080594bf4493e6bae2607e65390c520a https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda#04558c96691bed63104678757beb4f8d -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.10.0-nompi_hbf2fc22_100.conda#0eb36a09dad274e750d60b49aaec0af7 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda#eb52d14a901e23c39e9e7b4a1a5c015f https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py312h33ff503_0.conda#5930ee8a175a242b4f001b1e9e72024f https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py312hbc8341d_4.conda#9d5ea11aefbdf548a2d8c965c1b2ebad https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 -https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.0-pyhcf101f3_0.conda#c178102b6e9a0ef95e70610fe7f00af3 +https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.1-pyhcf101f3_0.conda#f2e88fc463b249bc1f40d9ca969d9b5e https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.13-hd8ed1ab_0.conda#32780d6794b8056b78602103a04e90ef https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda#28687768633154993d521aecfa4a56ac https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 https://conda.anaconda.org/conda-forge/noarch/wheel-0.46.3-pyhd8ed1ab_0.conda#bdbd7385b4a67025ac2dba4ef8cb6a8f https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f -https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda#11a2b8c732d215d977998ccd69a9d5e8 +https://conda.anaconda.org/conda-forge/noarch/anyio-4.13.0-pyhcf101f3_0.conda#af2df4b9108808da3dc76710fe50eae2 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py312h4f23490_1.conda#84bf349fad55056ed326fc550671b65c https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda#43c2bc96af3ae5ed9e8a10ded942aa50 https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda#809f4cde7c853f437becc43415a2ecdf +https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_hd4fcb43_102.conda#3570f96426a632c3304dd25435b15b68 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.9-h1588d4d_1.conda#115ecf05370670f93bc81a8c4f7fd57f https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h4f23490_2.conda#cec5bc5f7d374f8f8095f8e28e31f6cb https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh8b19718_0.conda#67bdec43082fd8a9cffb9484420b39a2 @@ -188,23 +195,24 @@ https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda#9 https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.2.0-pyhcf101f3_0.conda#704c22301912f7e37d0a92b2e7d5942d https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py312h5253ce2_1.conda#02738ff9855946075cbd1b5274399a41 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.1-py312h4f23490_0.conda#6aef45ba3c0123547eb7b0f15852cac9 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.46.0-h1c03fa5_1.conda#1c4634d840fc26122fa2fa0f2430c8e6 https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.17-pyhd8ed1ab_0.conda#5b7ae2ec4e0750e094f804a6cf1b2a37 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.18-pyhd8ed1ab_0.conda#635d1a924e1c55416fce044ed96144a2 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.10.0-nompi_h3c9b436_103.conda#ad7bf9d342d5b123c5d28389d5cea223 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py312he3d6523_0.conda#b8dc157bbbb69c1407478feede8b7b42 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py311ha0596eb_105.conda#71b833f92f41ab92b16ca9f87e8735fe -https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda#6891acad5e136cb62a8c2ed2679d6528 +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda#67d1790eefa81ed305b89d8e314c7923 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda#c65df89a0b2e321045a9e01d1337b182 +https://conda.anaconda.org/conda-forge/noarch/requests-2.33.0-pyhcf101f3_0.conda#bee5ed456361bfe8af502beaf5db82e2 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 https://conda.anaconda.org/conda-forge/noarch/tox-4.50.3-pyhcf101f3_0.conda#fe9872281200927f634c5efc2c96654c https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py312hf79963d_1.conda#6c913a686cb4060cbd7639a36fa144f0 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.46.0-ha1d8304_2.conda#a6f0fd37646b5dedc6f52daa609f1aec https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py311h498b1eb_107.conda#7f5488cf61943e6221325b454c2c2e9c https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda#7f3ac694319c7eaf81a0325d6405e974 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.46.0-np2py312hfb8c2c5_0.conda#fe3e310aa4a84610012a3889e23d76eb https://conda.anaconda.org/conda-forge/noarch/iris-3.14.1-pyha770c72_0.conda#0b6f532e907ce57be6905bd6d44fbe71 -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.3.10-pyhd8ed1ab_0.conda#7680e9ff5808963d358f41accdb95dc9 +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.3.25-pyhd8ed1ab_0.conda#159b53b0fa68c2a570c9602e67afc71a +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.46.0-np2py312hfb8c2c5_0.conda#fe3e310aa4a84610012a3889e23d76eb https://conda.anaconda.org/conda-forge/noarch/nox-2026.2.9-pyhcf101f3_0.conda#f59e57ff0cf84c21b070c206bbaa27db https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff @@ -214,4 +222,3 @@ https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-3.1.0-pyha770c72_ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda#00534ebcc0375929b45c3039b5ba7636 https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda#f7af826063ed569bb13f7207d6f949b0 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda#3bc61f7161d28137797e038263c04c54 - diff --git a/requirements/locks/py313-linux-64.lock b/requirements/locks/py313-linux-64.lock index 413c9954..45bbb49c 100644 --- a/requirements/locks/py313-linux-64.lock +++ b/requirements/locks/py313-linux-64.lock @@ -13,6 +13,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda#4a13eeac0b5c8e5b8ab496e6c4ddd829 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda#18335a698559cdbcd86150a48bf54ba6 https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda#0aa00f03f9e39fb9876085dee11a85d4 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.6-hb03c661_0.conda#e36ad70a7e0b48f091ed6902f04c23b8 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda#d2ffd7602c02f2b316fd921d39876885 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda#920bb03579f15389b9e512095ad995b7 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 @@ -26,7 +27,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#9 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda#8397539e3a0bbd1695584fb4f927485a https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda#c7c83eecbb72d88b940c249af56c8b17 https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda#2c21e66f50753a083cbe6b80f38268fa -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda#5f13ffc7d30ffec87864e678df9957b4 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.56-h421ea60_0.conda#97169784f0775c85683c3d8badcea2c3 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda#1b08cd684f34175e4514474793d44bcb https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda#db409b7c1720428638e7c0d509d3e1b5 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 @@ -38,6 +39,10 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda#1dafce8548e38671bea82e3f5c6ce22f https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb47aa4a_0.conda#607e13a8caac17f9a664bcab5302ce06 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a +https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.13-h2c9d079_1.conda#3c3d02681058c3d206b562b2e3bc337f +https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h8b1a151_0.conda#f16f498641c9e05b645fe65902df661a +https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-h8b1a151_4.conda#c7e3e08b7b1b285524ab9d74162ce40b +https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h8b1a151_0.conda#f8e1bcc5c7d839c5882e94498791be08 https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.1-h480dda7_0.conda#4d4efd0645cd556fab54617c4ad477ef https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda#c80d8a3b84358cb967fa81e7075fbc8a https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda#a752488c68f2e7c456bcbd8f16eec275 @@ -56,8 +61,10 @@ https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#9 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda#d7d95fc8287ea7bf33e0e7116d2b95ec +https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.1-h1cbb8d7_1.conda#9d978822b57bafe72ebd3f8b527bba71 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda#98b6c9dc80eb87b2519b97bcf7e578dd https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda#2aadb0d17215603a82a2a6b0afd9a4cb +https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-hc87160b_0.conda#dde6a3e4fe6bb2ecd2a7050dd1e701fb https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda#af39b9a8711d4a8d437b52c1d78eb6a1 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 @@ -65,17 +72,18 @@ https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda#fb5 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda#e289f3d17880e44b633ba911d57a321b https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda#2a45e7f8af083626f009645a6481f12d -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda#be43915efc66345cccb3c310b6ed0374 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda#89d61bc91d3f39fda0ca10fcd3c68594 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda#fd893f6a3002a635b5e50ceb9dd2c0f4 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#cd5a90476766d53e901500df9215e927 https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda#f3bc152cb4f86babe30f3a4bf0dbef69 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda#861fb6ccbc677bb9a9fb2468430b9c6a +https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.12-h4bacb7b_1.conda#7bc920933e5fb225aba86a788164a8f1 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda#8ccf913aaba749a5496c17629d859ed1 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_0.conda#8462b5322567212beeb025f3519fb3e2 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda#6f2e2c8f58160147c4d1c6f4c14cbac4 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda#c160954f7418d7b6e87eaf05a8913fa9 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h4a7cf45_openblas.conda#6d6d225559bfa6e2f3c90ee9c03d4e2e https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda#d50608c443a30c341c24277d28290f76 https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda#e49238a1609f9a4a844b09d9926f2c3d @@ -87,6 +95,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0. https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda#8f37c8fb7116a18da04e52fa9e2c8df9 https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda#c6b0543676ecb1fb2d7643941fe375f2 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-h2d2dd48_2.conda#675ea6d90900350b1dcfa8231a5ea2dd https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda#f1976ce927373500cc19d3c0b2c85177 https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py313h18e8e13_0.conda#d9e90792551a527200637e23a915dd79 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py313hf159716_1.conda#6c4d3597cf43f3439a51b2b13e29a4ba @@ -105,7 +114,6 @@ https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/noarch/filelock-3.25.2-pyhd8ed1ab_0.conda#f58064cec97b12a7136ebb8a6f8a129b https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.2.0-pyhd8ed1ab_0.conda#496c6c9411a6284addf55c898d6ed8d7 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h19486de_107.conda#27bd895de855fc7b600d8ea692cacba0 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda#daddf757c3ecd6067b9af1df1f25d89e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac @@ -114,9 +122,9 @@ https://conda.anaconda.org/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda#9614359868482abba1bd15ce465e3c42 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py313hc8edb43_0.conda#b81883b9dbf5069821c2fb09a8ba1407 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda#6636a2b6f1a87572df2970d3ebc87cc0 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-6_h0358290_openblas.conda#36ae340a916635b97ac8a0655ace2a35 https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda#b38076eb5c8e40d0106beda6f95d7609 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h47877c9_openblas.conda#881d801569b201c2e753f03c84b85e15 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py313h3dea7bd_1.conda#aeb9b9da79fd0258b3db091d1fefcd71 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 @@ -139,12 +147,13 @@ https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339 https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda#03fe290994c5e4ec17293cfb6bdce520 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda#755cf22df8693aa0d1aec1c123fa5863 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb -https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda#72e780e9aa2d0a3295f59b1874e3768b +https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda#b5325cf06a000c5b14970462ff5e4d58 https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda#32e37e8fe9ef45c637ee38ad51377769 https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda#c07a6153f8306e45794774cf9b13bd32 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda#30cd29cb87d819caead4d55184c1d115 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.11.5-h6d69fc9_5.conda#4c5c16bf1133dcfe100f33dd4470998e https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py313hf46b229_1.conda#d0616e7935acab407d1543b28c446f6f https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.5-py313h3dea7bd_0.conda#acbda45380f5097ade59014704eb0ba0 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 @@ -156,22 +165,22 @@ https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc4 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda#080594bf4493e6bae2607e65390c520a https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda#04558c96691bed63104678757beb4f8d -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.10.0-nompi_hb6f1874_102.conda#dafc798d5e897b8024220ecbab686873 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda#eb52d14a901e23c39e9e7b4a1a5c015f https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py313hf6604e3_0.conda#c4a9d2e77eb9fee983a70cf5f047c202 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py313he648cc1_4.conda#fe69af9ea9bb222c067bca5888e5aabe https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 -https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.0-pyhcf101f3_0.conda#c178102b6e9a0ef95e70610fe7f00af3 +https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.1-pyhcf101f3_0.conda#f2e88fc463b249bc1f40d9ca969d9b5e https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.12-h4df99d1_100.conda#3d92938d5b83c49162ade038aab58a59 https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda#28687768633154993d521aecfa4a56ac https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f -https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda#11a2b8c732d215d977998ccd69a9d5e8 +https://conda.anaconda.org/conda-forge/noarch/anyio-4.13.0-pyhcf101f3_0.conda#af2df4b9108808da3dc76710fe50eae2 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py313h29aa505_1.conda#c63d5f9d63fe2f48b0ad75005fcae7ba https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py313hc8edb43_4.conda#33639459bc29437315d4bff9ed5bc7a7 https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda#809f4cde7c853f437becc43415a2ecdf +https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_hd4fcb43_102.conda#3570f96426a632c3304dd25435b15b68 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.9-h1588d4d_1.conda#115ecf05370670f93bc81a8c4f7fd57f https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py313h29aa505_2.conda#ad53894d278895bf15c8fc324727d224 https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda#2b694bad8a50dc2f712f5368de866480 @@ -183,23 +192,24 @@ https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda#9 https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.2.0-pyhcf101f3_0.conda#704c22301912f7e37d0a92b2e7d5942d https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py313h54dd161_1.conda#710d4663806d0f72b2fb414e936223b5 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.1-py313h29aa505_0.conda#3942b6a86fe92d0888b3373f2c1e1676 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.46.0-h1c03fa5_1.conda#1c4634d840fc26122fa2fa0f2430c8e6 https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb https://conda.anaconda.org/conda-forge/noarch/identify-2.6.18-pyhd8ed1ab_0.conda#635d1a924e1c55416fce044ed96144a2 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.10.0-nompi_h3c9b436_103.conda#ad7bf9d342d5b123c5d28389d5cea223 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py313h683a580_0.conda#ffe67570e1a9192d2f4c189b27f75f89 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py311ha0596eb_105.conda#71b833f92f41ab92b16ca9f87e8735fe https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda#67d1790eefa81ed305b89d8e314c7923 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda#c65df89a0b2e321045a9e01d1337b182 +https://conda.anaconda.org/conda-forge/noarch/requests-2.33.0-pyhcf101f3_0.conda#bee5ed456361bfe8af502beaf5db82e2 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 https://conda.anaconda.org/conda-forge/noarch/tox-4.50.3-pyhcf101f3_0.conda#fe9872281200927f634c5efc2c96654c https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py313h08cd8bf_1.conda#a0d8dc5c90850d9f1a79f69c98aef0ff https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.46.0-ha1d8304_2.conda#a6f0fd37646b5dedc6f52daa609f1aec https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py311h498b1eb_107.conda#7f5488cf61943e6221325b454c2c2e9c https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda#7f3ac694319c7eaf81a0325d6405e974 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.46.0-np2py313hc18bace_0.conda#93af5d555b8f2aa6f6f4c98cb0768b5f https://conda.anaconda.org/conda-forge/noarch/iris-3.14.1-pyha770c72_0.conda#0b6f532e907ce57be6905bd6d44fbe71 -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.3.20-pyhd8ed1ab_0.conda#9a37c51db3205bde40d44f4e3cf61b18 +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.3.25-pyhd8ed1ab_0.conda#159b53b0fa68c2a570c9602e67afc71a +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.46.0-np2py313hc18bace_0.conda#93af5d555b8f2aa6f6f4c98cb0768b5f https://conda.anaconda.org/conda-forge/noarch/nox-2026.2.9-pyhcf101f3_0.conda#f59e57ff0cf84c21b070c206bbaa27db https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff @@ -209,4 +219,3 @@ https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-3.1.0-pyha770c72_ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda#00534ebcc0375929b45c3039b5ba7636 https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda#f7af826063ed569bb13f7207d6f949b0 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda#3bc61f7161d28137797e038263c04c54 - diff --git a/requirements/locks/py314-linux-64.lock b/requirements/locks/py314-linux-64.lock index acd9ae01..adcaaddf 100644 --- a/requirements/locks/py314-linux-64.lock +++ b/requirements/locks/py314-linux-64.lock @@ -13,6 +13,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda#4a13eeac0b5c8e5b8ab496e6c4ddd829 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda#18335a698559cdbcd86150a48bf54ba6 https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda#0aa00f03f9e39fb9876085dee11a85d4 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.6-hb03c661_0.conda#e36ad70a7e0b48f091ed6902f04c23b8 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda#d2ffd7602c02f2b316fd921d39876885 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda#920bb03579f15389b9e512095ad995b7 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 @@ -26,7 +27,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#9 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda#8397539e3a0bbd1695584fb4f927485a https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda#c7c83eecbb72d88b940c249af56c8b17 https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda#2c21e66f50753a083cbe6b80f38268fa -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda#5f13ffc7d30ffec87864e678df9957b4 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.56-h421ea60_0.conda#97169784f0775c85683c3d8badcea2c3 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda#1b08cd684f34175e4514474793d44bcb https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda#db409b7c1720428638e7c0d509d3e1b5 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 @@ -38,6 +39,10 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda#1dafce8548e38671bea82e3f5c6ce22f https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb47aa4a_0.conda#607e13a8caac17f9a664bcab5302ce06 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a +https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.13-h2c9d079_1.conda#3c3d02681058c3d206b562b2e3bc337f +https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h8b1a151_0.conda#f16f498641c9e05b645fe65902df661a +https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-h8b1a151_4.conda#c7e3e08b7b1b285524ab9d74162ce40b +https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h8b1a151_0.conda#f8e1bcc5c7d839c5882e94498791be08 https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.1-h480dda7_0.conda#4d4efd0645cd556fab54617c4ad477ef https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda#c80d8a3b84358cb967fa81e7075fbc8a https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda#a752488c68f2e7c456bcbd8f16eec275 @@ -56,8 +61,10 @@ https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#9 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda#d7d95fc8287ea7bf33e0e7116d2b95ec +https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.1-h1cbb8d7_1.conda#9d978822b57bafe72ebd3f8b527bba71 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda#98b6c9dc80eb87b2519b97bcf7e578dd https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda#2aadb0d17215603a82a2a6b0afd9a4cb +https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-hc87160b_0.conda#dde6a3e4fe6bb2ecd2a7050dd1e701fb https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda#af39b9a8711d4a8d437b52c1d78eb6a1 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 @@ -65,17 +72,18 @@ https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda#fb5 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda#e289f3d17880e44b633ba911d57a321b https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda#2a45e7f8af083626f009645a6481f12d -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda#be43915efc66345cccb3c310b6ed0374 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda#89d61bc91d3f39fda0ca10fcd3c68594 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda#fd893f6a3002a635b5e50ceb9dd2c0f4 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#cd5a90476766d53e901500df9215e927 https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda#f3bc152cb4f86babe30f3a4bf0dbef69 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda#861fb6ccbc677bb9a9fb2468430b9c6a +https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.12-h4bacb7b_1.conda#7bc920933e5fb225aba86a788164a8f1 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda#8ccf913aaba749a5496c17629d859ed1 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_0.conda#8462b5322567212beeb025f3519fb3e2 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda#6f2e2c8f58160147c4d1c6f4c14cbac4 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda#c160954f7418d7b6e87eaf05a8913fa9 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h4a7cf45_openblas.conda#6d6d225559bfa6e2f3c90ee9c03d4e2e https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda#d50608c443a30c341c24277d28290f76 https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda#e49238a1609f9a4a844b09d9926f2c3d @@ -87,6 +95,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0. https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda#8f37c8fb7116a18da04e52fa9e2c8df9 https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda#c6b0543676ecb1fb2d7643941fe375f2 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-h2d2dd48_2.conda#675ea6d90900350b1dcfa8231a5ea2dd https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda#f1976ce927373500cc19d3c0b2c85177 https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda#a2ac7763a9ac75055b68f325d3255265 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda#8910d2c46f7e7b519129f486e0fe927a @@ -105,7 +114,6 @@ https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/noarch/filelock-3.25.2-pyhd8ed1ab_0.conda#f58064cec97b12a7136ebb8a6f8a129b https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.2.0-pyhd8ed1ab_0.conda#496c6c9411a6284addf55c898d6ed8d7 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h19486de_107.conda#27bd895de855fc7b600d8ea692cacba0 https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda#daddf757c3ecd6067b9af1df1f25d89e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac @@ -114,9 +122,9 @@ https://conda.anaconda.org/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda#9614359868482abba1bd15ce465e3c42 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py314h97ea11e_0.conda#7397e418cab519b8d789936cf2dde6f6 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda#6636a2b6f1a87572df2970d3ebc87cc0 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-6_h0358290_openblas.conda#36ae340a916635b97ac8a0655ace2a35 https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda#b38076eb5c8e40d0106beda6f95d7609 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h47877c9_openblas.conda#881d801569b201c2e753f03c84b85e15 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda#9a17c4307d23318476d7fbf0fedc0cde https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 @@ -139,13 +147,14 @@ https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339 https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda#03fe290994c5e4ec17293cfb6bdce520 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda#755cf22df8693aa0d1aec1c123fa5863 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb -https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda#72e780e9aa2d0a3295f59b1874e3768b +https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda#b5325cf06a000c5b14970462ff5e4d58 https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda#32e37e8fe9ef45c637ee38ad51377769 https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda#c07a6153f8306e45794774cf9b13bd32 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py314h5bd0f2a_0.conda#494fdf358c152f9fdd0673c128c2f3dd https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda#30cd29cb87d819caead4d55184c1d115 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.11.5-h6d69fc9_5.conda#4c5c16bf1133dcfe100f33dd4470998e https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda#cf45f4278afd6f4e6d03eda0f435d527 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.5-py314h67df5f8_0.conda#78f547b78ace7541c4f54c4268ac9d2e https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 @@ -157,22 +166,22 @@ https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc4 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda#080594bf4493e6bae2607e65390c520a https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda#04558c96691bed63104678757beb4f8d -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.10.0-nompi_hb6f1874_102.conda#dafc798d5e897b8024220ecbab686873 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda#eb52d14a901e23c39e9e7b4a1a5c015f https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda#36f5b7eb328bdc204954a2225cf908e2 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py314h7ce3bca_4.conda#d5d862492bbd0f4be1f6d57289459066 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 -https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.0-pyhcf101f3_0.conda#c178102b6e9a0ef95e70610fe7f00af3 +https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.1-pyhcf101f3_0.conda#f2e88fc463b249bc1f40d9ca969d9b5e https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.3-h4df99d1_101.conda#235765e4ea0d0301c75965985163b5a1 https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda#28687768633154993d521aecfa4a56ac https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f -https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda#11a2b8c732d215d977998ccd69a9d5e8 +https://conda.anaconda.org/conda-forge/noarch/anyio-4.13.0-pyhcf101f3_0.conda#af2df4b9108808da3dc76710fe50eae2 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py314hc02f841_1.conda#552b5d9d8a2a4be882e1c638953e7281 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py314h97ea11e_4.conda#95bede9cdb7a30a4b611223d52a01aa4 https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda#809f4cde7c853f437becc43415a2ecdf +https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_hd4fcb43_102.conda#3570f96426a632c3304dd25435b15b68 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.9-h1588d4d_1.conda#115ecf05370670f93bc81a8c4f7fd57f https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py314hc02f841_2.conda#55ac6d85f5dd8ec5e9919e7762fcb31a https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda#2b694bad8a50dc2f712f5368de866480 @@ -184,23 +193,24 @@ https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda#9 https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.2.0-pyhcf101f3_0.conda#704c22301912f7e37d0a92b2e7d5942d https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py314h0f05182_1.conda#2930a6e1c7b3bc5f66172e324a8f5fc3 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.1-py314hc02f841_0.conda#de50a60eab348de04809a33e180b4b01 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.46.0-h1c03fa5_1.conda#1c4634d840fc26122fa2fa0f2430c8e6 https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb https://conda.anaconda.org/conda-forge/noarch/identify-2.6.18-pyhd8ed1ab_0.conda#635d1a924e1c55416fce044ed96144a2 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.10.0-nompi_h3c9b436_103.conda#ad7bf9d342d5b123c5d28389d5cea223 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py314h1194b4b_0.conda#b8683e6068099b69c10dbfcf7204203f -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py311ha0596eb_105.conda#71b833f92f41ab92b16ca9f87e8735fe https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda#67d1790eefa81ed305b89d8e314c7923 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda#c65df89a0b2e321045a9e01d1337b182 +https://conda.anaconda.org/conda-forge/noarch/requests-2.33.0-pyhcf101f3_0.conda#bee5ed456361bfe8af502beaf5db82e2 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 https://conda.anaconda.org/conda-forge/noarch/tox-4.50.3-pyhcf101f3_0.conda#fe9872281200927f634c5efc2c96654c https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py314ha0b5721_1.conda#fe89c5fa422f215b0d75046ecd4667de https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.46.0-ha1d8304_2.conda#a6f0fd37646b5dedc6f52daa609f1aec https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py311h498b1eb_107.conda#7f5488cf61943e6221325b454c2c2e9c https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda#7f3ac694319c7eaf81a0325d6405e974 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.46.0-np2py314h56abb78_0.conda#8da2d87e5f1c73ec72c5e827d3df2033 https://conda.anaconda.org/conda-forge/noarch/iris-3.14.1-pyha770c72_0.conda#0b6f532e907ce57be6905bd6d44fbe71 -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.3.20-pyhd8ed1ab_0.conda#9a37c51db3205bde40d44f4e3cf61b18 +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.3.25-pyhd8ed1ab_0.conda#159b53b0fa68c2a570c9602e67afc71a +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.46.0-np2py314h56abb78_0.conda#8da2d87e5f1c73ec72c5e827d3df2033 https://conda.anaconda.org/conda-forge/noarch/nox-2026.2.9-pyhcf101f3_0.conda#f59e57ff0cf84c21b070c206bbaa27db https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff @@ -210,4 +220,3 @@ https://conda.anaconda.org/conda-forge/noarch/sphinx_rtd_theme-3.1.0-pyha770c72_ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda#00534ebcc0375929b45c3039b5ba7636 https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda#f7af826063ed569bb13f7207d6f949b0 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda#3bc61f7161d28137797e038263c04c54 - From 1ccf0a6b5d0ffbe3e6937bd972f69ff080906a8e Mon Sep 17 00:00:00 2001 From: Martin Yeo <40734014+trexfeathers@users.noreply.github.com> Date: Mon, 30 Mar 2026 11:41:50 +0100 Subject: [PATCH 554/583] Docs updated ready for release v0.22.0. (#774) (#775) Co-authored-by: Patrick Peglar --- docs/index.rst | 2 +- docs/reference/release_notes.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index e25ac795..1e1de2bd 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -3,7 +3,7 @@ You can adapt this file completely to your liking, but it should at least contain the root ``toctree`` directive. -Iris-grib v0.21 +Iris-grib v0.22 =============== The library ``iris-grib`` provides functionality for converting between weather and diff --git a/docs/reference/release_notes.rst b/docs/reference/release_notes.rst index 9e1cadfb..946c5c74 100644 --- a/docs/reference/release_notes.rst +++ b/docs/reference/release_notes.rst @@ -8,7 +8,7 @@ What's new in iris-grib v0.22.0 ------------------------------- :Release: 0.22.0 -:Date: TBC +:Date: 24 March 2026 Features ^^^^^^^^ From 4eb084e804e5618fe07733913a23c79ed0910eb3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Apr 2026 12:05:51 +0100 Subject: [PATCH 555/583] Bump codecov/codecov-action from 5 to 6 in the dependencies group (#778) Bumps the dependencies group with 1 update: [codecov/codecov-action](https://github.com/codecov/codecov-action). Updates `codecov/codecov-action` from 5 to 6 - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/v5...v6) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-tests.yml b/.github/workflows/ci-tests.yml index dc4425fa..b91cc5ef 100644 --- a/.github/workflows/ci-tests.yml +++ b/.github/workflows/ci-tests.yml @@ -133,6 +133,6 @@ jobs: - name: "upload coverage report" if: ${{ matrix.coverage }} - uses: codecov/codecov-action@v5 + uses: codecov/codecov-action@v6 with: token: ${{ secrets.CODECOV_TOKEN }} From e791c1a4b36e28f02c05cc95af6be681e3224e60 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Wed, 8 Apr 2026 13:58:35 +0100 Subject: [PATCH 556/583] Updated environment lockfiles (#780) Co-authored-by: Lockfile bot --- requirements/locks/py312-linux-64.lock | 20 ++++++++++---------- requirements/locks/py313-linux-64.lock | 20 ++++++++++---------- requirements/locks/py314-linux-64.lock | 20 ++++++++++---------- 3 files changed, 30 insertions(+), 30 deletions(-) diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index dcfcc808..619302d6 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -19,7 +19,7 @@ https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda#9 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda#72c8fd1af66bd67bf580645b426513ed https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda#6c77a605a7a689d17d4819c0f8ac9a00 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda#e7f7ce06ec24cfcfb9e36d28cf82ba57 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.5-hecca717_0.conda#49f570f3bc4c874a06ea69b7225753af https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda#a360c33a5abe61c07959e449fa1453eb https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda#d5e96b1ed75ca01906b3d2469b4ce493 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda#646855f357199a12f02a87382d429b75 @@ -29,7 +29,7 @@ https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda#c https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.56-h421ea60_0.conda#97169784f0775c85683c3d8badcea2c3 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda#1b08cd684f34175e4514474793d44bcb -https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda#db409b7c1720428638e7c0d509d3e1b5 +https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda#38ffe67b78c9d4de527be8315e5ada2c https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda#f61eb8cd60ff9057122a3d338b99c00f @@ -103,7 +103,7 @@ https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py312hdb4952 https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.5-pyhd8ed1ab_0.conda#a66a1542c3ed584ca4fdb23955d81e91 https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda#765c4d97e877cdbbb88ff33152b86125 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda#49ee13eb9b8f44d63879c69b8a40a74b +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda#a9167b9571f3baa9d448faa2139d1089 https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda#ea8a6c3256897cc31263de9f455e25d9 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda#61b8078a0905b12529abc622406cb62c https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 @@ -114,7 +114,7 @@ https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#0 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc https://conda.anaconda.org/conda-forge/noarch/filelock-3.25.2-pyhd8ed1ab_0.conda#f58064cec97b12a7136ebb8a6f8a129b https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 -https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.2.0-pyhd8ed1ab_0.conda#496c6c9411a6284addf55c898d6ed8d7 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.3.0-pyhd8ed1ab_0.conda#c18d2ba7577cdc618a20d45f1e31d14b https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda#daddf757c3ecd6067b9af1df1f25d89e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac @@ -130,12 +130,12 @@ https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2# https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda#93a4752d42b12943a355b682ee43285b https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda#b76541e68fea4d511b1ac46a28dcd2c6 -https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py312h50c33e8_0.conda#c5eff3ada1a829f0bdb780dc4b62bbae +https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py312h50c33e8_0.conda#9e5609720e31213d4f39afe377f6217e https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda#82c1787f2a65c0155ef9652466ee98d6 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda#d7585b6550ad04c8c5e21097ada2888e https://conda.anaconda.org/conda-forge/linux-64/proj-9.8.0-he0df7b0_0.conda#3732388938fc3decf65b90884c2d8198 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef -https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 +https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda#16c18772b340887160c79a6acc022db0 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda#3687cc0b82a8b4c17e1f0eb7e47163d5 https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.3-pyhd8ed1ab_0.conda#c138c7aaa6a10b5762dcd92247864aff https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac @@ -182,7 +182,7 @@ https://conda.anaconda.org/conda-forge/noarch/anyio-4.13.0-pyhcf101f3_0.conda#af https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py312h4f23490_1.conda#84bf349fad55056ed326fc550671b65c https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda#43c2bc96af3ae5ed9e8a10ded942aa50 https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda#809f4cde7c853f437becc43415a2ecdf -https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_hd4fcb43_102.conda#3570f96426a632c3304dd25435b15b68 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_hd4fcb43_104.conda#1d92558abd05cea0577f83a5eca38733 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.9-h1588d4d_1.conda#115ecf05370670f93bc81a8c4f7fd57f https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h4f23490_2.conda#cec5bc5f7d374f8f8095f8e28e31f6cb https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh8b19718_0.conda#67bdec43082fd8a9cffb9484420b39a2 @@ -201,16 +201,16 @@ https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.10.0-nompi_h3c9b436_ https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py312he3d6523_0.conda#b8dc157bbbb69c1407478feede8b7b42 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda#67d1790eefa81ed305b89d8e314c7923 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 -https://conda.anaconda.org/conda-forge/noarch/requests-2.33.0-pyhcf101f3_0.conda#bee5ed456361bfe8af502beaf5db82e2 +https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda#10afbb4dbf06ff959ad25a92ccee6e59 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 -https://conda.anaconda.org/conda-forge/noarch/tox-4.50.3-pyhcf101f3_0.conda#fe9872281200927f634c5efc2c96654c +https://conda.anaconda.org/conda-forge/noarch/tox-4.52.0-pyhcf101f3_0.conda#0a784cd6b798beb76b522f81b51080c7 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py312hf79963d_1.conda#6c913a686cb4060cbd7639a36fa144f0 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.46.0-ha1d8304_2.conda#a6f0fd37646b5dedc6f52daa609f1aec https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py311h498b1eb_107.conda#7f5488cf61943e6221325b454c2c2e9c https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda#7f3ac694319c7eaf81a0325d6405e974 -https://conda.anaconda.org/conda-forge/noarch/iris-3.14.1-pyha770c72_0.conda#0b6f532e907ce57be6905bd6d44fbe71 +https://conda.anaconda.org/conda-forge/noarch/iris-3.15.0-pyha770c72_0.conda#bfe6588cbbd6e2e97e9439f95de02af8 https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.3.25-pyhd8ed1ab_0.conda#159b53b0fa68c2a570c9602e67afc71a https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.46.0-np2py312hfb8c2c5_0.conda#fe3e310aa4a84610012a3889e23d76eb https://conda.anaconda.org/conda-forge/noarch/nox-2026.2.9-pyhcf101f3_0.conda#f59e57ff0cf84c21b070c206bbaa27db diff --git a/requirements/locks/py313-linux-64.lock b/requirements/locks/py313-linux-64.lock index 45bbb49c..1f1f0a1f 100644 --- a/requirements/locks/py313-linux-64.lock +++ b/requirements/locks/py313-linux-64.lock @@ -19,7 +19,7 @@ https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda#9 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda#72c8fd1af66bd67bf580645b426513ed https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda#6c77a605a7a689d17d4819c0f8ac9a00 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda#e7f7ce06ec24cfcfb9e36d28cf82ba57 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.5-hecca717_0.conda#49f570f3bc4c874a06ea69b7225753af https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda#a360c33a5abe61c07959e449fa1453eb https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda#d5e96b1ed75ca01906b3d2469b4ce493 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda#646855f357199a12f02a87382d429b75 @@ -29,7 +29,7 @@ https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda#c https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda#2c21e66f50753a083cbe6b80f38268fa https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.56-h421ea60_0.conda#97169784f0775c85683c3d8badcea2c3 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda#1b08cd684f34175e4514474793d44bcb -https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda#db409b7c1720428638e7c0d509d3e1b5 +https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda#38ffe67b78c9d4de527be8315e5ada2c https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda#f61eb8cd60ff9057122a3d338b99c00f @@ -102,7 +102,7 @@ https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py313hf15971 https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.5-pyhd8ed1ab_0.conda#a66a1542c3ed584ca4fdb23955d81e91 https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda#765c4d97e877cdbbb88ff33152b86125 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda#49ee13eb9b8f44d63879c69b8a40a74b +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda#a9167b9571f3baa9d448faa2139d1089 https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda#ea8a6c3256897cc31263de9f455e25d9 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda#61b8078a0905b12529abc622406cb62c https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 @@ -113,7 +113,7 @@ https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#0 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc https://conda.anaconda.org/conda-forge/noarch/filelock-3.25.2-pyhd8ed1ab_0.conda#f58064cec97b12a7136ebb8a6f8a129b https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 -https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.2.0-pyhd8ed1ab_0.conda#496c6c9411a6284addf55c898d6ed8d7 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.3.0-pyhd8ed1ab_0.conda#c18d2ba7577cdc618a20d45f1e31d14b https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda#daddf757c3ecd6067b9af1df1f25d89e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac @@ -129,13 +129,13 @@ https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2# https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py313h3dea7bd_1.conda#aeb9b9da79fd0258b3db091d1fefcd71 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda#b76541e68fea4d511b1ac46a28dcd2c6 -https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py313h80991f8_0.conda#2d5ee4938cdde91a8967f3eea686c546 +https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py313h80991f8_0.conda#7245f1bbf52ed5e3818d742f51b44a7d https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh145f28c_0.conda#09a970fbf75e8ed1aa633827ded6aa4f https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda#82c1787f2a65c0155ef9652466ee98d6 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda#d7585b6550ad04c8c5e21097ada2888e https://conda.anaconda.org/conda-forge/linux-64/proj-9.8.0-he0df7b0_0.conda#3732388938fc3decf65b90884c2d8198 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef -https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 +https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda#16c18772b340887160c79a6acc022db0 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda#3687cc0b82a8b4c17e1f0eb7e47163d5 https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.3-pyhd8ed1ab_0.conda#c138c7aaa6a10b5762dcd92247864aff https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac @@ -180,7 +180,7 @@ https://conda.anaconda.org/conda-forge/noarch/anyio-4.13.0-pyhcf101f3_0.conda#af https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py313h29aa505_1.conda#c63d5f9d63fe2f48b0ad75005fcae7ba https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py313hc8edb43_4.conda#33639459bc29437315d4bff9ed5bc7a7 https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda#809f4cde7c853f437becc43415a2ecdf -https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_hd4fcb43_102.conda#3570f96426a632c3304dd25435b15b68 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_hd4fcb43_104.conda#1d92558abd05cea0577f83a5eca38733 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.9-h1588d4d_1.conda#115ecf05370670f93bc81a8c4f7fd57f https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py313h29aa505_2.conda#ad53894d278895bf15c8fc324727d224 https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda#2b694bad8a50dc2f712f5368de866480 @@ -198,16 +198,16 @@ https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.10.0-nompi_h3c9b436_ https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py313h683a580_0.conda#ffe67570e1a9192d2f4c189b27f75f89 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda#67d1790eefa81ed305b89d8e314c7923 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 -https://conda.anaconda.org/conda-forge/noarch/requests-2.33.0-pyhcf101f3_0.conda#bee5ed456361bfe8af502beaf5db82e2 +https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda#10afbb4dbf06ff959ad25a92ccee6e59 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 -https://conda.anaconda.org/conda-forge/noarch/tox-4.50.3-pyhcf101f3_0.conda#fe9872281200927f634c5efc2c96654c +https://conda.anaconda.org/conda-forge/noarch/tox-4.52.0-pyhcf101f3_0.conda#0a784cd6b798beb76b522f81b51080c7 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py313h08cd8bf_1.conda#a0d8dc5c90850d9f1a79f69c98aef0ff https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.46.0-ha1d8304_2.conda#a6f0fd37646b5dedc6f52daa609f1aec https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py311h498b1eb_107.conda#7f5488cf61943e6221325b454c2c2e9c https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda#7f3ac694319c7eaf81a0325d6405e974 -https://conda.anaconda.org/conda-forge/noarch/iris-3.14.1-pyha770c72_0.conda#0b6f532e907ce57be6905bd6d44fbe71 +https://conda.anaconda.org/conda-forge/noarch/iris-3.15.0-pyha770c72_0.conda#bfe6588cbbd6e2e97e9439f95de02af8 https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.3.25-pyhd8ed1ab_0.conda#159b53b0fa68c2a570c9602e67afc71a https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.46.0-np2py313hc18bace_0.conda#93af5d555b8f2aa6f6f4c98cb0768b5f https://conda.anaconda.org/conda-forge/noarch/nox-2026.2.9-pyhcf101f3_0.conda#f59e57ff0cf84c21b070c206bbaa27db diff --git a/requirements/locks/py314-linux-64.lock b/requirements/locks/py314-linux-64.lock index adcaaddf..a925166d 100644 --- a/requirements/locks/py314-linux-64.lock +++ b/requirements/locks/py314-linux-64.lock @@ -19,7 +19,7 @@ https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda#9 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda#72c8fd1af66bd67bf580645b426513ed https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda#6c77a605a7a689d17d4819c0f8ac9a00 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda#e7f7ce06ec24cfcfb9e36d28cf82ba57 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.5-hecca717_0.conda#49f570f3bc4c874a06ea69b7225753af https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda#a360c33a5abe61c07959e449fa1453eb https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda#d5e96b1ed75ca01906b3d2469b4ce493 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda#646855f357199a12f02a87382d429b75 @@ -29,7 +29,7 @@ https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda#c https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda#2c21e66f50753a083cbe6b80f38268fa https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.56-h421ea60_0.conda#97169784f0775c85683c3d8badcea2c3 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda#1b08cd684f34175e4514474793d44bcb -https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda#db409b7c1720428638e7c0d509d3e1b5 +https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda#38ffe67b78c9d4de527be8315e5ada2c https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda#f61eb8cd60ff9057122a3d338b99c00f @@ -102,7 +102,7 @@ https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8 https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.5-pyhd8ed1ab_0.conda#a66a1542c3ed584ca4fdb23955d81e91 https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda#765c4d97e877cdbbb88ff33152b86125 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.6-pyhd8ed1ab_0.conda#49ee13eb9b8f44d63879c69b8a40a74b +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda#a9167b9571f3baa9d448faa2139d1089 https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda#ea8a6c3256897cc31263de9f455e25d9 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda#61b8078a0905b12529abc622406cb62c https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 @@ -113,7 +113,7 @@ https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#0 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc https://conda.anaconda.org/conda-forge/noarch/filelock-3.25.2-pyhd8ed1ab_0.conda#f58064cec97b12a7136ebb8a6f8a129b https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 -https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.2.0-pyhd8ed1ab_0.conda#496c6c9411a6284addf55c898d6ed8d7 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.3.0-pyhd8ed1ab_0.conda#c18d2ba7577cdc618a20d45f1e31d14b https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda#daddf757c3ecd6067b9af1df1f25d89e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac @@ -129,13 +129,13 @@ https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2# https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda#9a17c4307d23318476d7fbf0fedc0cde https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda#b76541e68fea4d511b1ac46a28dcd2c6 -https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py314h8ec4b1a_0.conda#79678378ae235e24b3aa83cee1b38207 +https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py314h8ec4b1a_0.conda#76c4757c0ec9d11f969e8eb44899307b https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh145f28c_0.conda#09a970fbf75e8ed1aa633827ded6aa4f https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda#82c1787f2a65c0155ef9652466ee98d6 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda#d7585b6550ad04c8c5e21097ada2888e https://conda.anaconda.org/conda-forge/linux-64/proj-9.8.0-he0df7b0_0.conda#3732388938fc3decf65b90884c2d8198 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef -https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 +https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda#16c18772b340887160c79a6acc022db0 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda#3687cc0b82a8b4c17e1f0eb7e47163d5 https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.3-pyhd8ed1ab_0.conda#c138c7aaa6a10b5762dcd92247864aff https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac @@ -181,7 +181,7 @@ https://conda.anaconda.org/conda-forge/noarch/anyio-4.13.0-pyhcf101f3_0.conda#af https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py314hc02f841_1.conda#552b5d9d8a2a4be882e1c638953e7281 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py314h97ea11e_4.conda#95bede9cdb7a30a4b611223d52a01aa4 https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda#809f4cde7c853f437becc43415a2ecdf -https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_hd4fcb43_102.conda#3570f96426a632c3304dd25435b15b68 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_hd4fcb43_104.conda#1d92558abd05cea0577f83a5eca38733 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.9-h1588d4d_1.conda#115ecf05370670f93bc81a8c4f7fd57f https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py314hc02f841_2.conda#55ac6d85f5dd8ec5e9919e7762fcb31a https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda#2b694bad8a50dc2f712f5368de866480 @@ -199,16 +199,16 @@ https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.10.0-nompi_h3c9b436_ https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py314h1194b4b_0.conda#b8683e6068099b69c10dbfcf7204203f https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda#67d1790eefa81ed305b89d8e314c7923 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 -https://conda.anaconda.org/conda-forge/noarch/requests-2.33.0-pyhcf101f3_0.conda#bee5ed456361bfe8af502beaf5db82e2 +https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda#10afbb4dbf06ff959ad25a92ccee6e59 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 -https://conda.anaconda.org/conda-forge/noarch/tox-4.50.3-pyhcf101f3_0.conda#fe9872281200927f634c5efc2c96654c +https://conda.anaconda.org/conda-forge/noarch/tox-4.52.0-pyhcf101f3_0.conda#0a784cd6b798beb76b522f81b51080c7 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py314ha0b5721_1.conda#fe89c5fa422f215b0d75046ecd4667de https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.46.0-ha1d8304_2.conda#a6f0fd37646b5dedc6f52daa609f1aec https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py311h498b1eb_107.conda#7f5488cf61943e6221325b454c2c2e9c https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda#7f3ac694319c7eaf81a0325d6405e974 -https://conda.anaconda.org/conda-forge/noarch/iris-3.14.1-pyha770c72_0.conda#0b6f532e907ce57be6905bd6d44fbe71 +https://conda.anaconda.org/conda-forge/noarch/iris-3.15.0-pyha770c72_0.conda#bfe6588cbbd6e2e97e9439f95de02af8 https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.3.25-pyhd8ed1ab_0.conda#159b53b0fa68c2a570c9602e67afc71a https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.46.0-np2py314h56abb78_0.conda#8da2d87e5f1c73ec72c5e827d3df2033 https://conda.anaconda.org/conda-forge/noarch/nox-2026.2.9-pyhcf101f3_0.conda#f59e57ff0cf84c21b070c206bbaa27db From 84929f51acc6d9e56b4549ce50d47fb9cfdca194 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 8 Apr 2026 14:42:21 +0100 Subject: [PATCH 557/583] chore: update pre-commit hooks (#781) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: update pre-commit hooks updates: - [github.com/codespell-project/codespell: v2.4.1 → v2.4.2](https://github.com/codespell-project/codespell/compare/v2.4.1...v2.4.2) - [github.com/pre-commit/mirrors-mypy: v1.19.1 → v1.20.0](https://github.com/pre-commit/mirrors-mypy/compare/v1.19.1...v1.20.0) - [github.com/astral-sh/ruff-pre-commit: v0.15.4 → v0.15.9](https://github.com/astral-sh/ruff-pre-commit/compare/v0.15.4...v0.15.9) - [github.com/scientific-python/cookie: 2025.11.21 → 2026.04.04](https://github.com/scientific-python/cookie/compare/2025.11.21...2026.04.04) * Correct spelling. --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Martin Yeo --- .pre-commit-config.yaml | 8 ++++---- src/iris_grib/__init__.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3b7ca607..b294d69b 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -60,14 +60,14 @@ repos: types: [file, rst] - repo: https://github.com/codespell-project/codespell - rev: "v2.4.1" + rev: "v2.4.2" hooks: - id: codespell types_or: [asciidoc, python, markdown, rst] additional_dependencies: [tomli] - repo: https://github.com/pre-commit/mirrors-mypy - rev: 'v1.19.1' + rev: 'v1.20.0' hooks: - id: mypy exclude: 'noxfile\.py|docs/conf\.py' @@ -80,7 +80,7 @@ repos: types: [file, python] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.15.4" + rev: "v0.15.9" hooks: - id: ruff-check types: [file, python] @@ -95,7 +95,7 @@ repos: types: [file, python] - repo: https://github.com/scientific-python/cookie - rev: 2025.11.21 + rev: 2026.04.04 hooks: - id: sp-repo-review additional_dependencies: ["repo-review[cli]"] diff --git a/src/iris_grib/__init__.py b/src/iris_grib/__init__.py index 905b5328..b6dfd177 100644 --- a/src/iris_grib/__init__.py +++ b/src/iris_grib/__init__.py @@ -111,7 +111,7 @@ def set(self, *, legacy): .. note:: The legacy implementation is now deprecated and will be removed in due - course. However, for full backwwards compatibility, 'legacy' mode is still + course. However, for full backwards compatibility, 'legacy' mode is still the default. You are advised to use ``iris_grib.GRIB1_LOADING_MODE.set(legacy=False)`` From 2f9ec9700eb7b30d1f3de698ba2d5487d17b5e26 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 Apr 2026 08:53:06 +0100 Subject: [PATCH 558/583] Bump the dependencies group with 3 updates (#782) Bumps the dependencies group with 3 updates: [scitools/workflows/.github/workflows/ci-manifest.yml](https://github.com/scitools/workflows), [scitools/workflows/.github/workflows/ci-template-check.yml](https://github.com/scitools/workflows) and [scitools/workflows/.github/workflows/refresh-lockfiles.yml](https://github.com/scitools/workflows). Updates `scitools/workflows/.github/workflows/ci-manifest.yml` from 2026.03.4 to 2026.04.0 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2026.03.4...2026.04.0) Updates `scitools/workflows/.github/workflows/ci-template-check.yml` from 2026.03.4 to 2026.04.0 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2026.03.4...2026.04.0) Updates `scitools/workflows/.github/workflows/refresh-lockfiles.yml` from 2026.03.4 to 2026.04.0 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2026.03.4...2026.04.0) --- updated-dependencies: - dependency-name: scitools/workflows/.github/workflows/ci-manifest.yml dependency-version: 2026.04.0 dependency-type: direct:production dependency-group: dependencies - dependency-name: scitools/workflows/.github/workflows/ci-template-check.yml dependency-version: 2026.04.0 dependency-type: direct:production dependency-group: dependencies - dependency-name: scitools/workflows/.github/workflows/refresh-lockfiles.yml dependency-version: 2026.04.0 dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/ci-template-check.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 6a0d3aaf..004fb602 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2026.03.4 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2026.04.0 diff --git a/.github/workflows/ci-template-check.yml b/.github/workflows/ci-template-check.yml index 46cb96ce..6becef87 100644 --- a/.github/workflows/ci-template-check.yml +++ b/.github/workflows/ci-template-check.yml @@ -10,7 +10,7 @@ on: jobs: prompt-share: - uses: scitools/workflows/.github/workflows/ci-template-check.yml@2026.03.4 + uses: scitools/workflows/.github/workflows/ci-template-check.yml@2026.04.0 secrets: inherit with: pr_number: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 98b3a84d..f5ebf59c 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2026.03.4 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2026.04.0 secrets: inherit From 627eef364748b9e3937a5bc3aa4b0af51cb1d860 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Tue, 14 Apr 2026 12:45:25 +0100 Subject: [PATCH 559/583] Updated environment lockfiles (#783) Co-authored-by: Lockfile bot --- requirements/locks/py312-linux-64.lock | 28 ++++++++++----------- requirements/locks/py313-linux-64.lock | 34 +++++++++++++------------- requirements/locks/py314-linux-64.lock | 34 +++++++++++++------------- 3 files changed, 48 insertions(+), 48 deletions(-) diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 619302d6..1959922a 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -25,14 +25,14 @@ https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.con https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda#646855f357199a12f02a87382d429b75 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda#8397539e3a0bbd1695584fb4f927485a -https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda#c7c83eecbb72d88b940c249af56c8b17 +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda#b88d90cad08e6bc8ad540cb310a761fb https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.56-h421ea60_0.conda#97169784f0775c85683c3d8badcea2c3 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.57-h421ea60_0.conda#06f225e6d8c549ad6c0201679828a882 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda#1b08cd684f34175e4514474793d44bcb https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda#38ffe67b78c9d4de527be8315e5ada2c https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda#f61eb8cd60ff9057122a3d338b99c00f +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda#da1b85b6a87e141f5140bb9924cecab0 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda#cffd3bdd58090148f4cfcd831f4b26ab https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda#b2895afaf55bf96a8c8282a2e47a5de0 @@ -74,7 +74,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.co https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda#2a45e7f8af083626f009645a6481f12d https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda#89d61bc91d3f39fda0ca10fcd3c68594 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda#fd893f6a3002a635b5e50ceb9dd2c0f4 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.0-hf4e2dac_0.conda#810d83373448da85c3f673fbcb7ad3a3 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#cd5a90476766d53e901500df9215e927 https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda#f3bc152cb4f86babe30f3a4bf0dbef69 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 @@ -90,7 +90,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8 https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda#e49238a1609f9a4a844b09d9926f2c3d https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd https://conda.anaconda.org/conda-forge/linux-64/python-3.12.13-hd63d673_0_cpython.conda#7eccb41177e15cc672e1babe9056018e -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.52.0-h04a0ce9_0.conda#7d9d7efe9541d4bb71b5934e8ee348ea +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.0-h04a0ce9_0.conda#dc540e5bd5616d83a1ec46af8315ff98 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda#34e54f03dfea3e7a2dcf1453a85f1085 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a @@ -104,7 +104,7 @@ https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.5-pyhd8ed1ab_0.cond https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda#765c4d97e877cdbbb88ff33152b86125 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda#a9167b9571f3baa9d448faa2139d1089 -https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda#ea8a6c3256897cc31263de9f455e25d9 +https://conda.anaconda.org/conda-forge/noarch/click-8.3.2-pyhc90fa1f_0.conda#4d18bc3af7cfcea97bd817164672a08c https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda#61b8078a0905b12529abc622406cb62c https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/colorlog-6.10.1-pyh707e725_0.conda#33e96df3785bf61676ffee387e5a19e5 @@ -131,9 +131,9 @@ https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda#b76541e68fea4d511b1ac46a28dcd2c6 https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py312h50c33e8_0.conda#9e5609720e31213d4f39afe377f6217e -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda#82c1787f2a65c0155ef9652466ee98d6 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda#89c0b6d1793601a2a3a3f7d2d3d8b937 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda#d7585b6550ad04c8c5e21097ada2888e -https://conda.anaconda.org/conda-forge/linux-64/proj-9.8.0-he0df7b0_0.conda#3732388938fc3decf65b90884c2d8198 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.8.1-he0df7b0_0.conda#b23619e5e9009eaa070ead0342034027 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda#16c18772b340887160c79a6acc022db0 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda#3687cc0b82a8b4c17e1f0eb7e47163d5 @@ -172,7 +172,7 @@ https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0ba https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py312hbc8341d_4.conda#9d5ea11aefbdf548a2d8c965c1b2ebad https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 -https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.1-pyhcf101f3_0.conda#f2e88fc463b249bc1f40d9ca969d9b5e +https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.2-pyhcf101f3_0.conda#feb2e11368da12d6ce473b6573efab41 https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.13-hd8ed1ab_0.conda#32780d6794b8056b78602103a04e90ef https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda#28687768633154993d521aecfa4a56ac https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 @@ -186,13 +186,13 @@ https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_hd4fcb43_104.co https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.9-h1588d4d_1.conda#115ecf05370670f93bc81a8c4f7fd57f https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h4f23490_2.conda#cec5bc5f7d374f8f8095f8e28e31f6cb https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh8b19718_0.conda#67bdec43082fd8a9cffb9484420b39a2 -https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda#2b694bad8a50dc2f712f5368de866480 +https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda#6a991452eadf2771952f39d43615bb3e https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py312h54fa4ab_0.conda#3e38daeb1fb05a95656ff5af089d2e4c https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0.conda#e2e4d7094d0580ccd62e2a41947444f3 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py312h383787d_2.conda#69e400d3deca12ee7afd4b73a5596905 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py312hd9148b4_0.conda#55fd03988b1b1bc6faabbfb5b481ecd7 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda#9272daa869e03efe68833e3dc7a02130 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.2.0-pyhcf101f3_0.conda#704c22301912f7e37d0a92b2e7d5942d +https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.2.1-pyhcf101f3_0.conda#fa76df129efc4550f272d8668acbe658 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py312h5253ce2_1.conda#02738ff9855946075cbd1b5274399a41 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.1-py312h4f23490_0.conda#6aef45ba3c0123547eb7b0f15852cac9 https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb @@ -203,7 +203,7 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.cond https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda#10afbb4dbf06ff959ad25a92ccee6e59 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 -https://conda.anaconda.org/conda-forge/noarch/tox-4.52.0-pyhcf101f3_0.conda#0a784cd6b798beb76b522f81b51080c7 +https://conda.anaconda.org/conda-forge/noarch/tox-4.52.1-pyhcf101f3_0.conda#4e613772846d96b2fe8793ffdacadbad https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py312hf79963d_1.conda#6c913a686cb4060cbd7639a36fa144f0 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.46.0-ha1d8304_2.conda#a6f0fd37646b5dedc6f52daa609f1aec @@ -211,9 +211,9 @@ https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py311h498b1eb_107.conda#7f5488cf61943e6221325b454c2c2e9c https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda#7f3ac694319c7eaf81a0325d6405e974 https://conda.anaconda.org/conda-forge/noarch/iris-3.15.0-pyha770c72_0.conda#bfe6588cbbd6e2e97e9439f95de02af8 -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.3.25-pyhd8ed1ab_0.conda#159b53b0fa68c2a570c9602e67afc71a +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.4.7-pyhd8ed1ab_0.conda#c93d5115d0c2782415a054db063a9d1d https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.46.0-np2py312hfb8c2c5_0.conda#fe3e310aa4a84610012a3889e23d76eb -https://conda.anaconda.org/conda-forge/noarch/nox-2026.2.9-pyhcf101f3_0.conda#f59e57ff0cf84c21b070c206bbaa27db +https://conda.anaconda.org/conda-forge/noarch/nox-2026.4.10-pyhc364b38_0.conda#10df85d0d06301e961c8b27805f66a56 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda#e9fb3fe8a5b758b4aff187d434f94f03 diff --git a/requirements/locks/py313-linux-64.lock b/requirements/locks/py313-linux-64.lock index 1f1f0a1f..4e46c250 100644 --- a/requirements/locks/py313-linux-64.lock +++ b/requirements/locks/py313-linux-64.lock @@ -25,14 +25,14 @@ https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.con https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda#646855f357199a12f02a87382d429b75 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda#8397539e3a0bbd1695584fb4f927485a -https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda#c7c83eecbb72d88b940c249af56c8b17 +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda#b88d90cad08e6bc8ad540cb310a761fb https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda#2c21e66f50753a083cbe6b80f38268fa -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.56-h421ea60_0.conda#97169784f0775c85683c3d8badcea2c3 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.57-h421ea60_0.conda#06f225e6d8c549ad6c0201679828a882 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda#1b08cd684f34175e4514474793d44bcb https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda#38ffe67b78c9d4de527be8315e5ada2c https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda#f61eb8cd60ff9057122a3d338b99c00f +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda#da1b85b6a87e141f5140bb9924cecab0 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda#cffd3bdd58090148f4cfcd831f4b26ab https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda#b2895afaf55bf96a8c8282a2e47a5de0 @@ -73,7 +73,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.co https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda#2a45e7f8af083626f009645a6481f12d https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda#89d61bc91d3f39fda0ca10fcd3c68594 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda#fd893f6a3002a635b5e50ceb9dd2c0f4 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.0-hf4e2dac_0.conda#810d83373448da85c3f673fbcb7ad3a3 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#cd5a90476766d53e901500df9215e927 https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda#f3bc152cb4f86babe30f3a4bf0dbef69 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 @@ -88,8 +88,8 @@ https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda# https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda#e49238a1609f9a4a844b09d9926f2c3d https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd -https://conda.anaconda.org/conda-forge/linux-64/python-3.13.12-hc97d973_100_cp313.conda#4c875ed0e78c2d407ec55eadffb8cf3d -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.52.0-h04a0ce9_0.conda#7d9d7efe9541d4bb71b5934e8ee348ea +https://conda.anaconda.org/conda-forge/linux-64/python-3.13.13-h6add32d_100_cp313.conda#05051be49267378d2fcd12931e319ac3 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.0-h04a0ce9_0.conda#dc540e5bd5616d83a1ec46af8315ff98 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda#34e54f03dfea3e7a2dcf1453a85f1085 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a @@ -103,11 +103,11 @@ https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.5-pyhd8ed1ab_0.cond https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda#765c4d97e877cdbbb88ff33152b86125 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda#a9167b9571f3baa9d448faa2139d1089 -https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda#ea8a6c3256897cc31263de9f455e25d9 +https://conda.anaconda.org/conda-forge/noarch/click-8.3.2-pyhc90fa1f_0.conda#4d18bc3af7cfcea97bd817164672a08c https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda#61b8078a0905b12529abc622406cb62c https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/colorlog-6.10.1-pyh707e725_0.conda#33e96df3785bf61676ffee387e5a19e5 -https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.12-py313hd8ed1ab_100.conda#9a4b8a37303b933b847c14a310f0557b +https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.13-py313hd8ed1ab_100.conda#3a8a8b87e72f95b54689fb588e154ec9 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda#4c2a8fef270f6c69591889b93f9f55c1 https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc @@ -131,9 +131,9 @@ https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#3 https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda#b76541e68fea4d511b1ac46a28dcd2c6 https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py313h80991f8_0.conda#7245f1bbf52ed5e3818d742f51b44a7d https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh145f28c_0.conda#09a970fbf75e8ed1aa633827ded6aa4f -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda#82c1787f2a65c0155ef9652466ee98d6 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda#89c0b6d1793601a2a3a3f7d2d3d8b937 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda#d7585b6550ad04c8c5e21097ada2888e -https://conda.anaconda.org/conda-forge/linux-64/proj-9.8.0-he0df7b0_0.conda#3732388938fc3decf65b90884c2d8198 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.8.1-he0df7b0_0.conda#b23619e5e9009eaa070ead0342034027 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda#16c18772b340887160c79a6acc022db0 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda#3687cc0b82a8b4c17e1f0eb7e47163d5 @@ -171,8 +171,8 @@ https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0ba https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py313he648cc1_4.conda#fe69af9ea9bb222c067bca5888e5aabe https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 -https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.1-pyhcf101f3_0.conda#f2e88fc463b249bc1f40d9ca969d9b5e -https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.12-h4df99d1_100.conda#3d92938d5b83c49162ade038aab58a59 +https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.2-pyhcf101f3_0.conda#feb2e11368da12d6ce473b6573efab41 +https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.13-h4df99d1_100.conda#fd00e4b24ea88093c93f5c9bad27b52f https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda#28687768633154993d521aecfa4a56ac https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f @@ -183,13 +183,13 @@ https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.co https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_hd4fcb43_104.conda#1d92558abd05cea0577f83a5eca38733 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.9-h1588d4d_1.conda#115ecf05370670f93bc81a8c4f7fd57f https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py313h29aa505_2.conda#ad53894d278895bf15c8fc324727d224 -https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda#2b694bad8a50dc2f712f5368de866480 +https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda#6a991452eadf2771952f39d43615bb3e https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py313h4b8bb8b_0.conda#ec81bc03787968decae6765c7f61b7cf https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0.conda#e2e4d7094d0580ccd62e2a41947444f3 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py313had47c43_2.conda#6e550dd748e9ac9b2925411684e076a1 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py313h7037e92_0.conda#cb423e0853b3dde2b3738db4dedf5ba2 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda#9272daa869e03efe68833e3dc7a02130 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.2.0-pyhcf101f3_0.conda#704c22301912f7e37d0a92b2e7d5942d +https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.2.1-pyhcf101f3_0.conda#fa76df129efc4550f272d8668acbe658 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py313h54dd161_1.conda#710d4663806d0f72b2fb414e936223b5 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.1-py313h29aa505_0.conda#3942b6a86fe92d0888b3373f2c1e1676 https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb @@ -200,7 +200,7 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.cond https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda#10afbb4dbf06ff959ad25a92ccee6e59 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 -https://conda.anaconda.org/conda-forge/noarch/tox-4.52.0-pyhcf101f3_0.conda#0a784cd6b798beb76b522f81b51080c7 +https://conda.anaconda.org/conda-forge/noarch/tox-4.52.1-pyhcf101f3_0.conda#4e613772846d96b2fe8793ffdacadbad https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py313h08cd8bf_1.conda#a0d8dc5c90850d9f1a79f69c98aef0ff https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.46.0-ha1d8304_2.conda#a6f0fd37646b5dedc6f52daa609f1aec @@ -208,9 +208,9 @@ https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py311h498b1eb_107.conda#7f5488cf61943e6221325b454c2c2e9c https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda#7f3ac694319c7eaf81a0325d6405e974 https://conda.anaconda.org/conda-forge/noarch/iris-3.15.0-pyha770c72_0.conda#bfe6588cbbd6e2e97e9439f95de02af8 -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.3.25-pyhd8ed1ab_0.conda#159b53b0fa68c2a570c9602e67afc71a +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.4.7-pyhd8ed1ab_0.conda#c93d5115d0c2782415a054db063a9d1d https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.46.0-np2py313hc18bace_0.conda#93af5d555b8f2aa6f6f4c98cb0768b5f -https://conda.anaconda.org/conda-forge/noarch/nox-2026.2.9-pyhcf101f3_0.conda#f59e57ff0cf84c21b070c206bbaa27db +https://conda.anaconda.org/conda-forge/noarch/nox-2026.4.10-pyhc364b38_0.conda#10df85d0d06301e961c8b27805f66a56 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda#e9fb3fe8a5b758b4aff187d434f94f03 diff --git a/requirements/locks/py314-linux-64.lock b/requirements/locks/py314-linux-64.lock index a925166d..4a28c3e7 100644 --- a/requirements/locks/py314-linux-64.lock +++ b/requirements/locks/py314-linux-64.lock @@ -25,14 +25,14 @@ https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.con https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda#646855f357199a12f02a87382d429b75 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda#8397539e3a0bbd1695584fb4f927485a -https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda#c7c83eecbb72d88b940c249af56c8b17 +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda#b88d90cad08e6bc8ad540cb310a761fb https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda#2c21e66f50753a083cbe6b80f38268fa -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.56-h421ea60_0.conda#97169784f0775c85683c3d8badcea2c3 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.57-h421ea60_0.conda#06f225e6d8c549ad6c0201679828a882 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda#1b08cd684f34175e4514474793d44bcb https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda#38ffe67b78c9d4de527be8315e5ada2c https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda#f61eb8cd60ff9057122a3d338b99c00f +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda#da1b85b6a87e141f5140bb9924cecab0 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda#cffd3bdd58090148f4cfcd831f4b26ab https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda#b2895afaf55bf96a8c8282a2e47a5de0 @@ -73,7 +73,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.co https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda#2a45e7f8af083626f009645a6481f12d https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda#89d61bc91d3f39fda0ca10fcd3c68594 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda#fd893f6a3002a635b5e50ceb9dd2c0f4 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.0-hf4e2dac_0.conda#810d83373448da85c3f673fbcb7ad3a3 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#cd5a90476766d53e901500df9215e927 https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda#f3bc152cb4f86babe30f3a4bf0dbef69 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 @@ -88,8 +88,8 @@ https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda# https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda#e49238a1609f9a4a844b09d9926f2c3d https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd -https://conda.anaconda.org/conda-forge/linux-64/python-3.14.3-h32b2ec7_101_cp314.conda#c014ad06e60441661737121d3eae8a60 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.52.0-h04a0ce9_0.conda#7d9d7efe9541d4bb71b5934e8ee348ea +https://conda.anaconda.org/conda-forge/linux-64/python-3.14.4-habeac84_100_cp314.conda#a443f87920815d41bfe611296e507995 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.0-h04a0ce9_0.conda#dc540e5bd5616d83a1ec46af8315ff98 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda#34e54f03dfea3e7a2dcf1453a85f1085 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a @@ -103,11 +103,11 @@ https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.5-pyhd8ed1ab_0.cond https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda#765c4d97e877cdbbb88ff33152b86125 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda#a9167b9571f3baa9d448faa2139d1089 -https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda#ea8a6c3256897cc31263de9f455e25d9 +https://conda.anaconda.org/conda-forge/noarch/click-8.3.2-pyhc90fa1f_0.conda#4d18bc3af7cfcea97bd817164672a08c https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda#61b8078a0905b12529abc622406cb62c https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/colorlog-6.10.1-pyh707e725_0.conda#33e96df3785bf61676ffee387e5a19e5 -https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.3-py314hd8ed1ab_101.conda#3bb89e4f795e5414addaa531d6b1500a +https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.4-py314hd8ed1ab_100.conda#f111d4cfaf1fe9496f386bc98ae94452 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda#4c2a8fef270f6c69591889b93f9f55c1 https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc @@ -131,9 +131,9 @@ https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#3 https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda#b76541e68fea4d511b1ac46a28dcd2c6 https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py314h8ec4b1a_0.conda#76c4757c0ec9d11f969e8eb44899307b https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh145f28c_0.conda#09a970fbf75e8ed1aa633827ded6aa4f -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda#82c1787f2a65c0155ef9652466ee98d6 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda#89c0b6d1793601a2a3a3f7d2d3d8b937 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda#d7585b6550ad04c8c5e21097ada2888e -https://conda.anaconda.org/conda-forge/linux-64/proj-9.8.0-he0df7b0_0.conda#3732388938fc3decf65b90884c2d8198 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.8.1-he0df7b0_0.conda#b23619e5e9009eaa070ead0342034027 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda#16c18772b340887160c79a6acc022db0 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda#3687cc0b82a8b4c17e1f0eb7e47163d5 @@ -172,8 +172,8 @@ https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0ba https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py314h7ce3bca_4.conda#d5d862492bbd0f4be1f6d57289459066 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 -https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.1-pyhcf101f3_0.conda#f2e88fc463b249bc1f40d9ca969d9b5e -https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.3-h4df99d1_101.conda#235765e4ea0d0301c75965985163b5a1 +https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.2-pyhcf101f3_0.conda#feb2e11368da12d6ce473b6573efab41 +https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.4-h4df99d1_100.conda#e4e60721757979d01d3964122f674959 https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda#28687768633154993d521aecfa4a56ac https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f @@ -184,13 +184,13 @@ https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.co https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_hd4fcb43_104.conda#1d92558abd05cea0577f83a5eca38733 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.9-h1588d4d_1.conda#115ecf05370670f93bc81a8c4f7fd57f https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py314hc02f841_2.conda#55ac6d85f5dd8ec5e9919e7762fcb31a -https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda#2b694bad8a50dc2f712f5368de866480 +https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda#6a991452eadf2771952f39d43615bb3e https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py314hf07bd8e_0.conda#d0510124f87c75403090e220db1e9d41 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0.conda#e2e4d7094d0580ccd62e2a41947444f3 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py314hbe3edd8_2.conda#5963e6ee81772d450a35e6bc95522761 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py314h9891dd4_0.conda#5d3c008e54c7f49592fca9c32896a76f https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda#9272daa869e03efe68833e3dc7a02130 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.2.0-pyhcf101f3_0.conda#704c22301912f7e37d0a92b2e7d5942d +https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.2.1-pyhcf101f3_0.conda#fa76df129efc4550f272d8668acbe658 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py314h0f05182_1.conda#2930a6e1c7b3bc5f66172e324a8f5fc3 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.1-py314hc02f841_0.conda#de50a60eab348de04809a33e180b4b01 https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb @@ -201,7 +201,7 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.cond https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda#10afbb4dbf06ff959ad25a92ccee6e59 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 -https://conda.anaconda.org/conda-forge/noarch/tox-4.52.0-pyhcf101f3_0.conda#0a784cd6b798beb76b522f81b51080c7 +https://conda.anaconda.org/conda-forge/noarch/tox-4.52.1-pyhcf101f3_0.conda#4e613772846d96b2fe8793ffdacadbad https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py314ha0b5721_1.conda#fe89c5fa422f215b0d75046ecd4667de https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.46.0-ha1d8304_2.conda#a6f0fd37646b5dedc6f52daa609f1aec @@ -209,9 +209,9 @@ https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py311h498b1eb_107.conda#7f5488cf61943e6221325b454c2c2e9c https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda#7f3ac694319c7eaf81a0325d6405e974 https://conda.anaconda.org/conda-forge/noarch/iris-3.15.0-pyha770c72_0.conda#bfe6588cbbd6e2e97e9439f95de02af8 -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.3.25-pyhd8ed1ab_0.conda#159b53b0fa68c2a570c9602e67afc71a +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.4.7-pyhd8ed1ab_0.conda#c93d5115d0c2782415a054db063a9d1d https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.46.0-np2py314h56abb78_0.conda#8da2d87e5f1c73ec72c5e827d3df2033 -https://conda.anaconda.org/conda-forge/noarch/nox-2026.2.9-pyhcf101f3_0.conda#f59e57ff0cf84c21b070c206bbaa27db +https://conda.anaconda.org/conda-forge/noarch/nox-2026.4.10-pyhc364b38_0.conda#10df85d0d06301e961c8b27805f66a56 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda#e9fb3fe8a5b758b4aff187d434f94f03 From 0e53c681e9b4c1f67c6e1291cd9b711492730df1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Apr 2026 10:16:27 +0100 Subject: [PATCH 560/583] Bump the dependencies group with 3 updates (#784) Bumps the dependencies group with 3 updates: [scitools/workflows/.github/workflows/ci-manifest.yml](https://github.com/scitools/workflows), [scitools/workflows/.github/workflows/ci-template-check.yml](https://github.com/scitools/workflows) and [scitools/workflows/.github/workflows/refresh-lockfiles.yml](https://github.com/scitools/workflows). Updates `scitools/workflows/.github/workflows/ci-manifest.yml` from 2026.04.0 to 2026.04.2 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2026.04.0...2026.04.2) Updates `scitools/workflows/.github/workflows/ci-template-check.yml` from 2026.04.0 to 2026.04.2 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2026.04.0...2026.04.2) Updates `scitools/workflows/.github/workflows/refresh-lockfiles.yml` from 2026.04.0 to 2026.04.2 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2026.04.0...2026.04.2) --- updated-dependencies: - dependency-name: scitools/workflows/.github/workflows/ci-manifest.yml dependency-version: 2026.04.2 dependency-type: direct:production dependency-group: dependencies - dependency-name: scitools/workflows/.github/workflows/ci-template-check.yml dependency-version: 2026.04.2 dependency-type: direct:production dependency-group: dependencies - dependency-name: scitools/workflows/.github/workflows/refresh-lockfiles.yml dependency-version: 2026.04.2 dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/ci-template-check.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 004fb602..e77c6a1c 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2026.04.0 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2026.04.2 diff --git a/.github/workflows/ci-template-check.yml b/.github/workflows/ci-template-check.yml index 6becef87..b98172dd 100644 --- a/.github/workflows/ci-template-check.yml +++ b/.github/workflows/ci-template-check.yml @@ -10,7 +10,7 @@ on: jobs: prompt-share: - uses: scitools/workflows/.github/workflows/ci-template-check.yml@2026.04.0 + uses: scitools/workflows/.github/workflows/ci-template-check.yml@2026.04.2 secrets: inherit with: pr_number: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index f5ebf59c..f443525a 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2026.04.0 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2026.04.2 secrets: inherit From 72ff9563bd8f1981be6b3ae02161167e41091fbd Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 20 Apr 2026 11:20:22 +0100 Subject: [PATCH 561/583] Updated environment lockfiles (#786) Co-authored-by: Lockfile bot --- requirements/locks/py312-linux-64.lock | 20 ++++++++++---------- requirements/locks/py313-linux-64.lock | 20 ++++++++++---------- requirements/locks/py314-linux-64.lock | 20 ++++++++++---------- 3 files changed, 30 insertions(+), 30 deletions(-) diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 1959922a..c9842994 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -24,10 +24,10 @@ https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda#a3 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda#d5e96b1ed75ca01906b3d2469b4ce493 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda#646855f357199a12f02a87382d429b75 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 -https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda#8397539e3a0bbd1695584fb4f927485a +https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda#6178c6f2fb254558238ef4e6c56fb782 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda#b88d90cad08e6bc8ad540cb310a761fb https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.57-h421ea60_0.conda#06f225e6d8c549ad6c0201679828a882 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda#eba48a68a1a2b9d3c0d9511548db85db https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda#1b08cd684f34175e4514474793d44bcb https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda#38ffe67b78c9d4de527be8315e5ada2c https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 @@ -76,7 +76,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.con https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda#89d61bc91d3f39fda0ca10fcd3c68594 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.0-hf4e2dac_0.conda#810d83373448da85c3f673fbcb7ad3a3 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#cd5a90476766d53e901500df9215e927 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda#f3bc152cb4f86babe30f3a4bf0dbef69 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda#e79d2c2f24b027aa8d5ab1b1ba3061e7 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda#861fb6ccbc677bb9a9fb2468430b9c6a @@ -87,7 +87,7 @@ https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda#6f2e https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h4a7cf45_openblas.conda#6d6d225559bfa6e2f3c90ee9c03d4e2e https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda#d50608c443a30c341c24277d28290f76 https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda#e49238a1609f9a4a844b09d9926f2c3d +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda#995d8c8bad2a3cc8db14675a153dec2b https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd https://conda.anaconda.org/conda-forge/linux-64/python-3.12.13-hd63d673_0_cpython.conda#7eccb41177e15cc672e1babe9056018e https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.0-h04a0ce9_0.conda#dc540e5bd5616d83a1ec46af8315ff98 @@ -112,7 +112,7 @@ https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_0.co https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda#4c2a8fef270f6c69591889b93f9f55c1 https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc -https://conda.anaconda.org/conda-forge/noarch/filelock-3.25.2-pyhd8ed1ab_0.conda#f58064cec97b12a7136ebb8a6f8a129b +https://conda.anaconda.org/conda-forge/noarch/filelock-3.28.0-pyhd8ed1ab_0.conda#60a871a0e893d6ec7083115beba05001 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.3.0-pyhd8ed1ab_0.conda#c18d2ba7577cdc618a20d45f1e31d14b https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e @@ -129,7 +129,7 @@ https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h47877c9_open https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda#93a4752d42b12943a355b682ee43285b https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 -https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda#b76541e68fea4d511b1ac46a28dcd2c6 +https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda#b8ae38639d323d808da535fb71e31be8 https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py312h50c33e8_0.conda#9e5609720e31213d4f39afe377f6217e https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda#89c0b6d1793601a2a3a3f7d2d3d8b937 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda#d7585b6550ad04c8c5e21097ada2888e @@ -153,7 +153,7 @@ https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda#c07 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975b_0.conda#0b6c506ec1f272b685240e70a29261b8 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda#30cd29cb87d819caead4d55184c1d115 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda#e1c36c6121a7c9c76f2f148f1e83b983 https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.11.5-h6d69fc9_5.conda#4c5c16bf1133dcfe100f33dd4470998e https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py312h460c074_1.conda#648ee28dcd4e07a1940a17da62eccd40 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.5-py312h8a5da7c_0.conda#c4d858e15305e70b255e756a4dc96e58 @@ -164,7 +164,7 @@ https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda# https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda#b8993c19b0c32a2f7b66cbb58ca27069 https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda#080594bf4493e6bae2607e65390c520a -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda#0ba6225c279baf7ea9473a62ea0ec9ae https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda#04558c96691bed63104678757beb4f8d https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda#eb52d14a901e23c39e9e7b4a1a5c015f https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py312h33ff503_0.conda#5930ee8a175a242b4f001b1e9e72024f @@ -192,11 +192,11 @@ https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0. https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py312h383787d_2.conda#69e400d3deca12ee7afd4b73a5596905 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py312hd9148b4_0.conda#55fd03988b1b1bc6faabbfb5b481ecd7 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda#9272daa869e03efe68833e3dc7a02130 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.2.1-pyhcf101f3_0.conda#fa76df129efc4550f272d8668acbe658 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.2.4-pyhcf101f3_0.conda#15be1b64e7a4501abb4f740c28ceadaf https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py312h5253ce2_1.conda#02738ff9855946075cbd1b5274399a41 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.1-py312h4f23490_0.conda#6aef45ba3c0123547eb7b0f15852cac9 https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.18-pyhd8ed1ab_0.conda#635d1a924e1c55416fce044ed96144a2 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.19-pyhd8ed1ab_0.conda#84a3233b709a289a4ddd7a2fd27dd988 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.10.0-nompi_h3c9b436_103.conda#ad7bf9d342d5b123c5d28389d5cea223 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py312he3d6523_0.conda#b8dc157bbbb69c1407478feede8b7b42 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda#67d1790eefa81ed305b89d8e314c7923 diff --git a/requirements/locks/py313-linux-64.lock b/requirements/locks/py313-linux-64.lock index 4e46c250..beac2ccb 100644 --- a/requirements/locks/py313-linux-64.lock +++ b/requirements/locks/py313-linux-64.lock @@ -24,10 +24,10 @@ https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda#a3 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda#d5e96b1ed75ca01906b3d2469b4ce493 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda#646855f357199a12f02a87382d429b75 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 -https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda#8397539e3a0bbd1695584fb4f927485a +https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda#6178c6f2fb254558238ef4e6c56fb782 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda#b88d90cad08e6bc8ad540cb310a761fb https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda#2c21e66f50753a083cbe6b80f38268fa -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.57-h421ea60_0.conda#06f225e6d8c549ad6c0201679828a882 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda#eba48a68a1a2b9d3c0d9511548db85db https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda#1b08cd684f34175e4514474793d44bcb https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda#38ffe67b78c9d4de527be8315e5ada2c https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 @@ -75,7 +75,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.con https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda#89d61bc91d3f39fda0ca10fcd3c68594 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.0-hf4e2dac_0.conda#810d83373448da85c3f673fbcb7ad3a3 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#cd5a90476766d53e901500df9215e927 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda#f3bc152cb4f86babe30f3a4bf0dbef69 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda#e79d2c2f24b027aa8d5ab1b1ba3061e7 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda#861fb6ccbc677bb9a9fb2468430b9c6a @@ -86,7 +86,7 @@ https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda#6f2e https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h4a7cf45_openblas.conda#6d6d225559bfa6e2f3c90ee9c03d4e2e https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda#d50608c443a30c341c24277d28290f76 https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda#e49238a1609f9a4a844b09d9926f2c3d +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda#995d8c8bad2a3cc8db14675a153dec2b https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd https://conda.anaconda.org/conda-forge/linux-64/python-3.13.13-h6add32d_100_cp313.conda#05051be49267378d2fcd12931e319ac3 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.0-h04a0ce9_0.conda#dc540e5bd5616d83a1ec46af8315ff98 @@ -111,7 +111,7 @@ https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.13-py313hd8ed1ab_100. https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda#4c2a8fef270f6c69591889b93f9f55c1 https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc -https://conda.anaconda.org/conda-forge/noarch/filelock-3.25.2-pyhd8ed1ab_0.conda#f58064cec97b12a7136ebb8a6f8a129b +https://conda.anaconda.org/conda-forge/noarch/filelock-3.28.0-pyhd8ed1ab_0.conda#60a871a0e893d6ec7083115beba05001 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.3.0-pyhd8ed1ab_0.conda#c18d2ba7577cdc618a20d45f1e31d14b https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e @@ -128,7 +128,7 @@ https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h47877c9_open https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py313h3dea7bd_1.conda#aeb9b9da79fd0258b3db091d1fefcd71 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 -https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda#b76541e68fea4d511b1ac46a28dcd2c6 +https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda#b8ae38639d323d808da535fb71e31be8 https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py313h80991f8_0.conda#7245f1bbf52ed5e3818d742f51b44a7d https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh145f28c_0.conda#09a970fbf75e8ed1aa633827ded6aa4f https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda#89c0b6d1793601a2a3a3f7d2d3d8b937 @@ -152,7 +152,7 @@ https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda#3 https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda#c07a6153f8306e45794774cf9b13bd32 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda#30cd29cb87d819caead4d55184c1d115 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda#e1c36c6121a7c9c76f2f148f1e83b983 https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.11.5-h6d69fc9_5.conda#4c5c16bf1133dcfe100f33dd4470998e https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py313hf46b229_1.conda#d0616e7935acab407d1543b28c446f6f https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.5-py313h3dea7bd_0.conda#acbda45380f5097ade59014704eb0ba0 @@ -163,7 +163,7 @@ https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda# https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda#b8993c19b0c32a2f7b66cbb58ca27069 https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda#080594bf4493e6bae2607e65390c520a -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda#0ba6225c279baf7ea9473a62ea0ec9ae https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda#04558c96691bed63104678757beb4f8d https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda#eb52d14a901e23c39e9e7b4a1a5c015f https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py313hf6604e3_0.conda#c4a9d2e77eb9fee983a70cf5f047c202 @@ -189,11 +189,11 @@ https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0. https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py313had47c43_2.conda#6e550dd748e9ac9b2925411684e076a1 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py313h7037e92_0.conda#cb423e0853b3dde2b3738db4dedf5ba2 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda#9272daa869e03efe68833e3dc7a02130 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.2.1-pyhcf101f3_0.conda#fa76df129efc4550f272d8668acbe658 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.2.4-pyhcf101f3_0.conda#15be1b64e7a4501abb4f740c28ceadaf https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py313h54dd161_1.conda#710d4663806d0f72b2fb414e936223b5 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.1-py313h29aa505_0.conda#3942b6a86fe92d0888b3373f2c1e1676 https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.18-pyhd8ed1ab_0.conda#635d1a924e1c55416fce044ed96144a2 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.19-pyhd8ed1ab_0.conda#84a3233b709a289a4ddd7a2fd27dd988 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.10.0-nompi_h3c9b436_103.conda#ad7bf9d342d5b123c5d28389d5cea223 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py313h683a580_0.conda#ffe67570e1a9192d2f4c189b27f75f89 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda#67d1790eefa81ed305b89d8e314c7923 diff --git a/requirements/locks/py314-linux-64.lock b/requirements/locks/py314-linux-64.lock index 4a28c3e7..17dc484a 100644 --- a/requirements/locks/py314-linux-64.lock +++ b/requirements/locks/py314-linux-64.lock @@ -24,10 +24,10 @@ https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda#a3 https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda#d5e96b1ed75ca01906b3d2469b4ce493 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda#646855f357199a12f02a87382d429b75 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 -https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda#8397539e3a0bbd1695584fb4f927485a +https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda#6178c6f2fb254558238ef4e6c56fb782 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda#b88d90cad08e6bc8ad540cb310a761fb https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda#2c21e66f50753a083cbe6b80f38268fa -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.57-h421ea60_0.conda#06f225e6d8c549ad6c0201679828a882 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda#eba48a68a1a2b9d3c0d9511548db85db https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda#1b08cd684f34175e4514474793d44bcb https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda#38ffe67b78c9d4de527be8315e5ada2c https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 @@ -75,7 +75,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.con https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda#89d61bc91d3f39fda0ca10fcd3c68594 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.0-hf4e2dac_0.conda#810d83373448da85c3f673fbcb7ad3a3 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#cd5a90476766d53e901500df9215e927 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda#f3bc152cb4f86babe30f3a4bf0dbef69 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda#e79d2c2f24b027aa8d5ab1b1ba3061e7 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda#861fb6ccbc677bb9a9fb2468430b9c6a @@ -86,7 +86,7 @@ https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda#6f2e https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h4a7cf45_openblas.conda#6d6d225559bfa6e2f3c90ee9c03d4e2e https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda#d50608c443a30c341c24277d28290f76 https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda#e49238a1609f9a4a844b09d9926f2c3d +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda#995d8c8bad2a3cc8db14675a153dec2b https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd https://conda.anaconda.org/conda-forge/linux-64/python-3.14.4-habeac84_100_cp314.conda#a443f87920815d41bfe611296e507995 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.0-h04a0ce9_0.conda#dc540e5bd5616d83a1ec46af8315ff98 @@ -111,7 +111,7 @@ https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.4-py314hd8ed1ab_100.c https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda#4c2a8fef270f6c69591889b93f9f55c1 https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc -https://conda.anaconda.org/conda-forge/noarch/filelock-3.25.2-pyhd8ed1ab_0.conda#f58064cec97b12a7136ebb8a6f8a129b +https://conda.anaconda.org/conda-forge/noarch/filelock-3.28.0-pyhd8ed1ab_0.conda#60a871a0e893d6ec7083115beba05001 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.3.0-pyhd8ed1ab_0.conda#c18d2ba7577cdc618a20d45f1e31d14b https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e @@ -128,7 +128,7 @@ https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h47877c9_open https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda#9a17c4307d23318476d7fbf0fedc0cde https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 -https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda#b76541e68fea4d511b1ac46a28dcd2c6 +https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda#b8ae38639d323d808da535fb71e31be8 https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py314h8ec4b1a_0.conda#76c4757c0ec9d11f969e8eb44899307b https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh145f28c_0.conda#09a970fbf75e8ed1aa633827ded6aa4f https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda#89c0b6d1793601a2a3a3f7d2d3d8b937 @@ -153,7 +153,7 @@ https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda#c07 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py314h5bd0f2a_0.conda#494fdf358c152f9fdd0673c128c2f3dd https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda#30cd29cb87d819caead4d55184c1d115 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda#e1c36c6121a7c9c76f2f148f1e83b983 https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.11.5-h6d69fc9_5.conda#4c5c16bf1133dcfe100f33dd4470998e https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda#cf45f4278afd6f4e6d03eda0f435d527 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.5-py314h67df5f8_0.conda#78f547b78ace7541c4f54c4268ac9d2e @@ -164,7 +164,7 @@ https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda# https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda#b8993c19b0c32a2f7b66cbb58ca27069 https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda#080594bf4493e6bae2607e65390c520a -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda#0ba6225c279baf7ea9473a62ea0ec9ae https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda#04558c96691bed63104678757beb4f8d https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda#eb52d14a901e23c39e9e7b4a1a5c015f https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda#36f5b7eb328bdc204954a2225cf908e2 @@ -190,11 +190,11 @@ https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0. https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py314hbe3edd8_2.conda#5963e6ee81772d450a35e6bc95522761 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py314h9891dd4_0.conda#5d3c008e54c7f49592fca9c32896a76f https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda#9272daa869e03efe68833e3dc7a02130 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.2.1-pyhcf101f3_0.conda#fa76df129efc4550f272d8668acbe658 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.2.4-pyhcf101f3_0.conda#15be1b64e7a4501abb4f740c28ceadaf https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py314h0f05182_1.conda#2930a6e1c7b3bc5f66172e324a8f5fc3 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.1-py314hc02f841_0.conda#de50a60eab348de04809a33e180b4b01 https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb -https://conda.anaconda.org/conda-forge/noarch/identify-2.6.18-pyhd8ed1ab_0.conda#635d1a924e1c55416fce044ed96144a2 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.19-pyhd8ed1ab_0.conda#84a3233b709a289a4ddd7a2fd27dd988 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.10.0-nompi_h3c9b436_103.conda#ad7bf9d342d5b123c5d28389d5cea223 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py314h1194b4b_0.conda#b8683e6068099b69c10dbfcf7204203f https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda#67d1790eefa81ed305b89d8e314c7923 From 0955e34d0d070afc57ca8ecbb2c840e90dfab48a Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 27 Apr 2026 10:14:57 +0100 Subject: [PATCH 562/583] Updated environment lockfiles (#787) Co-authored-by: Lockfile bot --- requirements/locks/py312-linux-64.lock | 25 +++++++++++++------------ requirements/locks/py313-linux-64.lock | 23 ++++++++++++----------- requirements/locks/py314-linux-64.lock | 23 ++++++++++++----------- 3 files changed, 37 insertions(+), 34 deletions(-) diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index c9842994..c3db077e 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -4,7 +4,7 @@ @EXPLICIT https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda#c3efd25ac4d74b1584d2f7a57195ddf1 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda#ad659d0a2b3e47e38d829aa8cad2d610 -https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda#4492fd26db29495f0ba23f146cd5638d +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda#e18ad67cf881dcadee8b8d9e2f8e5f73 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda#239c5e9546c38a1e884d69effcf4c882 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda#d87ff7921124eccd67248aa483c23fec @@ -100,8 +100,8 @@ https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-h2d2dd48_2.con https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda#f1976ce927373500cc19d3c0b2c85177 https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py312h90b7ffd_0.conda#5b8c55fed2e576dde4b0b33693a4fdb1 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py312hdb49522_1.conda#64088dffd7413a2dd557ce837b4cbbdb -https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.5-pyhd8ed1ab_0.conda#a66a1542c3ed584ca4fdb23955d81e91 -https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda#765c4d97e877cdbbb88ff33152b86125 +https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.6-pyhd8ed1ab_0.conda#14e77b3ebe7b8e37f6254a59ee245184 +https://conda.anaconda.org/conda-forge/noarch/certifi-2026.4.22-pyhd8ed1ab_0.conda#929471569c93acefb30282a22060dcd5 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda#a9167b9571f3baa9d448faa2139d1089 https://conda.anaconda.org/conda-forge/noarch/click-8.3.2-pyhc90fa1f_0.conda#4d18bc3af7cfcea97bd817164672a08c @@ -112,13 +112,13 @@ https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_0.co https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda#4c2a8fef270f6c69591889b93f9f55c1 https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc -https://conda.anaconda.org/conda-forge/noarch/filelock-3.28.0-pyhd8ed1ab_0.conda#60a871a0e893d6ec7083115beba05001 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.29.0-pyhd8ed1ab_0.conda#8fa8358d022a3a9bd101384a808044c6 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.3.0-pyhd8ed1ab_0.conda#c18d2ba7577cdc618a20d45f1e31d14b https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda#daddf757c3ecd6067b9af1df1f25d89e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac -https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda#53abe63df7e10a6ba605dc5f9f961d36 +https://conda.anaconda.org/conda-forge/noarch/idna-3.13-pyhcf101f3_0.conda#fb7130c190f9b4ec91219840a05ba3ac https://conda.anaconda.org/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda#92617c2ba2847cca7a6ed813b6f4ab79 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda#9614359868482abba1bd15ce465e3c42 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de @@ -153,14 +153,15 @@ https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda#c07 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975b_0.conda#0b6c506ec1f272b685240e70a29261b8 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.7-hb03c661_0.conda#665d152b9c6e78da404086088077c844 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda#e1c36c6121a7c9c76f2f148f1e83b983 https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.11.5-h6d69fc9_5.conda#4c5c16bf1133dcfe100f33dd4470998e https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py312h460c074_1.conda#648ee28dcd4e07a1940a17da62eccd40 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.5-py312h8a5da7c_0.conda#c4d858e15305e70b255e756a4dc96e58 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda#8e662bd460bda79b1ea39194e3c4c9ab -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.62.0-py312h8a5da7c_0.conda#526f7ffd63820e55d7992cc1cf931a36 -https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.62.1-py312h8a5da7c_0.conda#2396fee22e84f69dffc6e23135905ce8 +https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-h215f996_4.conda#b39dccf5af984bcb68ee2aa0f3213ea6 https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda#b8993c19b0c32a2f7b66cbb58ca27069 https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda#080594bf4493e6bae2607e65390c520a @@ -176,7 +177,7 @@ https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.2-pyhcf101f3_ https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.13-hd8ed1ab_0.conda#32780d6794b8056b78602103a04e90ef https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda#28687768633154993d521aecfa4a56ac https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.46.3-pyhd8ed1ab_0.conda#bdbd7385b4a67025ac2dba4ef8cb6a8f +https://conda.anaconda.org/conda-forge/noarch/wheel-0.47.0-pyhd8ed1ab_0.conda#d0e3b2f0030cf4fca58bde71d246e94c https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f https://conda.anaconda.org/conda-forge/noarch/anyio-4.13.0-pyhcf101f3_0.conda#af2df4b9108808da3dc76710fe50eae2 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py312h4f23490_1.conda#84bf349fad55056ed326fc550671b65c @@ -197,11 +198,11 @@ https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py312h5253ce2_1 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.1-py312h4f23490_0.conda#6aef45ba3c0123547eb7b0f15852cac9 https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb https://conda.anaconda.org/conda-forge/noarch/identify-2.6.19-pyhd8ed1ab_0.conda#84a3233b709a289a4ddd7a2fd27dd988 -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.10.0-nompi_h3c9b436_103.conda#ad7bf9d342d5b123c5d28389d5cea223 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py312he3d6523_0.conda#b8dc157bbbb69c1407478feede8b7b42 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.10.0-nompi_h3c9b436_104.conda#6d38346d49e4638ec98649121d295d54 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.9-py312he3d6523_0.conda#7d499b5b6d150f133800dc3a582771c7 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda#67d1790eefa81ed305b89d8e314c7923 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 -https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda#10afbb4dbf06ff959ad25a92ccee6e59 +https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_1.conda#9659f587a8ceacc21864260acd02fc67 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 https://conda.anaconda.org/conda-forge/noarch/tox-4.52.1-pyhcf101f3_0.conda#4e613772846d96b2fe8793ffdacadbad https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py312hf79963d_1.conda#6c913a686cb4060cbd7639a36fa144f0 @@ -209,7 +210,7 @@ https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda# https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.46.0-ha1d8304_2.conda#a6f0fd37646b5dedc6f52daa609f1aec https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py311h498b1eb_107.conda#7f5488cf61943e6221325b454c2c2e9c -https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda#7f3ac694319c7eaf81a0325d6405e974 +https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.6.0-pyha770c72_0.conda#7859736b4f8ebe6c8481bf48d91c9a1e https://conda.anaconda.org/conda-forge/noarch/iris-3.15.0-pyha770c72_0.conda#bfe6588cbbd6e2e97e9439f95de02af8 https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.4.7-pyhd8ed1ab_0.conda#c93d5115d0c2782415a054db063a9d1d https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.46.0-np2py312hfb8c2c5_0.conda#fe3e310aa4a84610012a3889e23d76eb diff --git a/requirements/locks/py313-linux-64.lock b/requirements/locks/py313-linux-64.lock index beac2ccb..f24dcc63 100644 --- a/requirements/locks/py313-linux-64.lock +++ b/requirements/locks/py313-linux-64.lock @@ -4,7 +4,7 @@ @EXPLICIT https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda#94305520c52a4aa3f6c2b1ff6008d9f8 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda#ad659d0a2b3e47e38d829aa8cad2d610 -https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda#4492fd26db29495f0ba23f146cd5638d +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda#e18ad67cf881dcadee8b8d9e2f8e5f73 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda#239c5e9546c38a1e884d69effcf4c882 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda#d87ff7921124eccd67248aa483c23fec @@ -99,8 +99,8 @@ https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-h2d2dd48_2.con https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda#f1976ce927373500cc19d3c0b2c85177 https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py313h18e8e13_0.conda#d9e90792551a527200637e23a915dd79 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py313hf159716_1.conda#6c4d3597cf43f3439a51b2b13e29a4ba -https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.5-pyhd8ed1ab_0.conda#a66a1542c3ed584ca4fdb23955d81e91 -https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda#765c4d97e877cdbbb88ff33152b86125 +https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.6-pyhd8ed1ab_0.conda#14e77b3ebe7b8e37f6254a59ee245184 +https://conda.anaconda.org/conda-forge/noarch/certifi-2026.4.22-pyhd8ed1ab_0.conda#929471569c93acefb30282a22060dcd5 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda#a9167b9571f3baa9d448faa2139d1089 https://conda.anaconda.org/conda-forge/noarch/click-8.3.2-pyhc90fa1f_0.conda#4d18bc3af7cfcea97bd817164672a08c @@ -111,13 +111,13 @@ https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.13-py313hd8ed1ab_100. https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda#4c2a8fef270f6c69591889b93f9f55c1 https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc -https://conda.anaconda.org/conda-forge/noarch/filelock-3.28.0-pyhd8ed1ab_0.conda#60a871a0e893d6ec7083115beba05001 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.29.0-pyhd8ed1ab_0.conda#8fa8358d022a3a9bd101384a808044c6 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.3.0-pyhd8ed1ab_0.conda#c18d2ba7577cdc618a20d45f1e31d14b https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda#daddf757c3ecd6067b9af1df1f25d89e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac -https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda#53abe63df7e10a6ba605dc5f9f961d36 +https://conda.anaconda.org/conda-forge/noarch/idna-3.13-pyhcf101f3_0.conda#fb7130c190f9b4ec91219840a05ba3ac https://conda.anaconda.org/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda#92617c2ba2847cca7a6ed813b6f4ab79 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda#9614359868482abba1bd15ce465e3c42 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de @@ -152,14 +152,15 @@ https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda#3 https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda#c07a6153f8306e45794774cf9b13bd32 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.7-hb03c661_0.conda#665d152b9c6e78da404086088077c844 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda#e1c36c6121a7c9c76f2f148f1e83b983 https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.11.5-h6d69fc9_5.conda#4c5c16bf1133dcfe100f33dd4470998e https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py313hf46b229_1.conda#d0616e7935acab407d1543b28c446f6f https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.5-py313h3dea7bd_0.conda#acbda45380f5097ade59014704eb0ba0 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda#8e662bd460bda79b1ea39194e3c4c9ab -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.62.0-py313h3dea7bd_0.conda#e479cfdec38fb69dc81ce8806b5c75f6 -https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.62.1-py313h3dea7bd_0.conda#98082dfa338d9f0dca885e4865c69a20 +https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-h215f996_4.conda#b39dccf5af984bcb68ee2aa0f3213ea6 https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda#b8993c19b0c32a2f7b66cbb58ca27069 https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda#080594bf4493e6bae2607e65390c520a @@ -194,11 +195,11 @@ https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py313h54dd161_1 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.1-py313h29aa505_0.conda#3942b6a86fe92d0888b3373f2c1e1676 https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb https://conda.anaconda.org/conda-forge/noarch/identify-2.6.19-pyhd8ed1ab_0.conda#84a3233b709a289a4ddd7a2fd27dd988 -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.10.0-nompi_h3c9b436_103.conda#ad7bf9d342d5b123c5d28389d5cea223 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py313h683a580_0.conda#ffe67570e1a9192d2f4c189b27f75f89 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.10.0-nompi_h3c9b436_104.conda#6d38346d49e4638ec98649121d295d54 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.9-py313h683a580_0.conda#4265d85b1d706caba7ac1d73b5f43dee https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda#67d1790eefa81ed305b89d8e314c7923 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 -https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda#10afbb4dbf06ff959ad25a92ccee6e59 +https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_1.conda#9659f587a8ceacc21864260acd02fc67 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 https://conda.anaconda.org/conda-forge/noarch/tox-4.52.1-pyhcf101f3_0.conda#4e613772846d96b2fe8793ffdacadbad https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py313h08cd8bf_1.conda#a0d8dc5c90850d9f1a79f69c98aef0ff @@ -206,7 +207,7 @@ https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda# https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.46.0-ha1d8304_2.conda#a6f0fd37646b5dedc6f52daa609f1aec https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py311h498b1eb_107.conda#7f5488cf61943e6221325b454c2c2e9c -https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda#7f3ac694319c7eaf81a0325d6405e974 +https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.6.0-pyha770c72_0.conda#7859736b4f8ebe6c8481bf48d91c9a1e https://conda.anaconda.org/conda-forge/noarch/iris-3.15.0-pyha770c72_0.conda#bfe6588cbbd6e2e97e9439f95de02af8 https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.4.7-pyhd8ed1ab_0.conda#c93d5115d0c2782415a054db063a9d1d https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.46.0-np2py313hc18bace_0.conda#93af5d555b8f2aa6f6f4c98cb0768b5f diff --git a/requirements/locks/py314-linux-64.lock b/requirements/locks/py314-linux-64.lock index 17dc484a..db7285ca 100644 --- a/requirements/locks/py314-linux-64.lock +++ b/requirements/locks/py314-linux-64.lock @@ -4,7 +4,7 @@ @EXPLICIT https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda#0539938c55b6b1a59b560e843ad864a4 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda#ad659d0a2b3e47e38d829aa8cad2d610 -https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda#4492fd26db29495f0ba23f146cd5638d +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda#e18ad67cf881dcadee8b8d9e2f8e5f73 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda#239c5e9546c38a1e884d69effcf4c882 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda#d87ff7921124eccd67248aa483c23fec @@ -99,8 +99,8 @@ https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-h2d2dd48_2.con https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda#f1976ce927373500cc19d3c0b2c85177 https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda#a2ac7763a9ac75055b68f325d3255265 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda#8910d2c46f7e7b519129f486e0fe927a -https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.5-pyhd8ed1ab_0.conda#a66a1542c3ed584ca4fdb23955d81e91 -https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda#765c4d97e877cdbbb88ff33152b86125 +https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.6-pyhd8ed1ab_0.conda#14e77b3ebe7b8e37f6254a59ee245184 +https://conda.anaconda.org/conda-forge/noarch/certifi-2026.4.22-pyhd8ed1ab_0.conda#929471569c93acefb30282a22060dcd5 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda#a9167b9571f3baa9d448faa2139d1089 https://conda.anaconda.org/conda-forge/noarch/click-8.3.2-pyhc90fa1f_0.conda#4d18bc3af7cfcea97bd817164672a08c @@ -111,13 +111,13 @@ https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.4-py314hd8ed1ab_100.c https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda#4c2a8fef270f6c69591889b93f9f55c1 https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc -https://conda.anaconda.org/conda-forge/noarch/filelock-3.28.0-pyhd8ed1ab_0.conda#60a871a0e893d6ec7083115beba05001 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.29.0-pyhd8ed1ab_0.conda#8fa8358d022a3a9bd101384a808044c6 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.3.0-pyhd8ed1ab_0.conda#c18d2ba7577cdc618a20d45f1e31d14b https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda#daddf757c3ecd6067b9af1df1f25d89e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac -https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda#53abe63df7e10a6ba605dc5f9f961d36 +https://conda.anaconda.org/conda-forge/noarch/idna-3.13-pyhcf101f3_0.conda#fb7130c190f9b4ec91219840a05ba3ac https://conda.anaconda.org/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda#92617c2ba2847cca7a6ed813b6f4ab79 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda#9614359868482abba1bd15ce465e3c42 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de @@ -153,14 +153,15 @@ https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda#c07 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py314h5bd0f2a_0.conda#494fdf358c152f9fdd0673c128c2f3dd https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.7-hb03c661_0.conda#665d152b9c6e78da404086088077c844 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda#e1c36c6121a7c9c76f2f148f1e83b983 https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.11.5-h6d69fc9_5.conda#4c5c16bf1133dcfe100f33dd4470998e https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda#cf45f4278afd6f4e6d03eda0f435d527 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.5-py314h67df5f8_0.conda#78f547b78ace7541c4f54c4268ac9d2e https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda#8e662bd460bda79b1ea39194e3c4c9ab -https://conda.anaconda.org/conda-forge/noarch/fonttools-4.62.0-pyh7db6752_0.conda#049f68f9c90f00069c748cd6fb7bfb55 -https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 +https://conda.anaconda.org/conda-forge/noarch/fonttools-4.62.1-pyh7db6752_0.conda#14cf1ac7a1e29553c6918f7860aab6d8 +https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-h215f996_4.conda#b39dccf5af984bcb68ee2aa0f3213ea6 https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda#b8993c19b0c32a2f7b66cbb58ca27069 https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda#080594bf4493e6bae2607e65390c520a @@ -195,11 +196,11 @@ https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py314h0f05182_1 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.1-py314hc02f841_0.conda#de50a60eab348de04809a33e180b4b01 https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb https://conda.anaconda.org/conda-forge/noarch/identify-2.6.19-pyhd8ed1ab_0.conda#84a3233b709a289a4ddd7a2fd27dd988 -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.10.0-nompi_h3c9b436_103.conda#ad7bf9d342d5b123c5d28389d5cea223 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py314h1194b4b_0.conda#b8683e6068099b69c10dbfcf7204203f +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.10.0-nompi_h3c9b436_104.conda#6d38346d49e4638ec98649121d295d54 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.9-py314h1194b4b_0.conda#11a821746ad11e642fcc615c3d66aa44 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda#67d1790eefa81ed305b89d8e314c7923 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 -https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda#10afbb4dbf06ff959ad25a92ccee6e59 +https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_1.conda#9659f587a8ceacc21864260acd02fc67 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 https://conda.anaconda.org/conda-forge/noarch/tox-4.52.1-pyhcf101f3_0.conda#4e613772846d96b2fe8793ffdacadbad https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py314ha0b5721_1.conda#fe89c5fa422f215b0d75046ecd4667de @@ -207,7 +208,7 @@ https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda# https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.46.0-ha1d8304_2.conda#a6f0fd37646b5dedc6f52daa609f1aec https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py311h498b1eb_107.conda#7f5488cf61943e6221325b454c2c2e9c -https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda#7f3ac694319c7eaf81a0325d6405e974 +https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.6.0-pyha770c72_0.conda#7859736b4f8ebe6c8481bf48d91c9a1e https://conda.anaconda.org/conda-forge/noarch/iris-3.15.0-pyha770c72_0.conda#bfe6588cbbd6e2e97e9439f95de02af8 https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.4.7-pyhd8ed1ab_0.conda#c93d5115d0c2782415a054db063a9d1d https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.46.0-np2py314h56abb78_0.conda#8da2d87e5f1c73ec72c5e827d3df2033 From ea56490d867e45e313a1baa40fac5bc45db0006a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 30 Apr 2026 17:37:39 +0100 Subject: [PATCH 563/583] Bump conda-incubator/setup-miniconda in the dependencies group (#788) Bumps the dependencies group with 1 update: [conda-incubator/setup-miniconda](https://github.com/conda-incubator/setup-miniconda). Updates `conda-incubator/setup-miniconda` from 3 to 4 - [Release notes](https://github.com/conda-incubator/setup-miniconda/releases) - [Changelog](https://github.com/conda-incubator/setup-miniconda/blob/main/CHANGELOG.md) - [Commits](https://github.com/conda-incubator/setup-miniconda/compare/v3...v4) --- updated-dependencies: - dependency-name: conda-incubator/setup-miniconda dependency-version: '4' dependency-type: direct:production update-type: version-update:semver-major dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-tests.yml b/.github/workflows/ci-tests.yml index b91cc5ef..0d5c205f 100644 --- a/.github/workflows/ci-tests.yml +++ b/.github/workflows/ci-tests.yml @@ -88,7 +88,7 @@ jobs: env_name: ${{ env.ENV_NAME }} - name: "conda install" - uses: conda-incubator/setup-miniconda@v3 + uses: conda-incubator/setup-miniconda@v4 with: miniforge-version: latest channels: conda-forge,defaults From 7497bfc515b69dbe7955984f26fea5af55e61543 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 5 May 2026 11:13:16 +0100 Subject: [PATCH 564/583] chore: update pre-commit hooks (#790) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/pre-commit/mirrors-mypy: v1.20.0 → v1.20.2](https://github.com/pre-commit/mirrors-mypy/compare/v1.20.0...v1.20.2) - [github.com/astral-sh/ruff-pre-commit: v0.15.9 → v0.15.12](https://github.com/astral-sh/ruff-pre-commit/compare/v0.15.9...v0.15.12) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b294d69b..13970687 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -67,7 +67,7 @@ repos: additional_dependencies: [tomli] - repo: https://github.com/pre-commit/mirrors-mypy - rev: 'v1.20.0' + rev: 'v1.20.2' hooks: - id: mypy exclude: 'noxfile\.py|docs/conf\.py' @@ -80,7 +80,7 @@ repos: types: [file, python] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.15.9" + rev: "v0.15.12" hooks: - id: ruff-check types: [file, python] From b6ccab58440bc754b4d918cf27823e3ee5561ce4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 May 2026 11:44:47 +0100 Subject: [PATCH 565/583] Bump the dependencies group with 3 updates (#791) Bumps the dependencies group with 3 updates: [scitools/workflows/.github/workflows/ci-manifest.yml](https://github.com/scitools/workflows), [scitools/workflows/.github/workflows/ci-template-check.yml](https://github.com/scitools/workflows) and [scitools/workflows/.github/workflows/refresh-lockfiles.yml](https://github.com/scitools/workflows). Updates `scitools/workflows/.github/workflows/ci-manifest.yml` from 2026.04.2 to 2026.05.0 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2026.04.2...2026.05.0) Updates `scitools/workflows/.github/workflows/ci-template-check.yml` from 2026.04.2 to 2026.05.0 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2026.04.2...2026.05.0) Updates `scitools/workflows/.github/workflows/refresh-lockfiles.yml` from 2026.04.2 to 2026.05.0 - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2026.04.2...2026.05.0) --- updated-dependencies: - dependency-name: scitools/workflows/.github/workflows/ci-manifest.yml dependency-version: 2026.05.0 dependency-type: direct:production dependency-group: dependencies - dependency-name: scitools/workflows/.github/workflows/ci-template-check.yml dependency-version: 2026.05.0 dependency-type: direct:production dependency-group: dependencies - dependency-name: scitools/workflows/.github/workflows/refresh-lockfiles.yml dependency-version: 2026.05.0 dependency-type: direct:production dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-manifest.yml | 2 +- .github/workflows/ci-template-check.yml | 2 +- .github/workflows/refresh-lockfiles.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index e77c6a1c..7c84fbd4 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -20,4 +20,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2026.04.2 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2026.05.0 diff --git a/.github/workflows/ci-template-check.yml b/.github/workflows/ci-template-check.yml index b98172dd..3475c14d 100644 --- a/.github/workflows/ci-template-check.yml +++ b/.github/workflows/ci-template-check.yml @@ -10,7 +10,7 @@ on: jobs: prompt-share: - uses: scitools/workflows/.github/workflows/ci-template-check.yml@2026.04.2 + uses: scitools/workflows/.github/workflows/ci-template-check.yml@2026.05.0 secrets: inherit with: pr_number: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index f443525a..728df96b 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -10,5 +10,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2026.04.2 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2026.05.0 secrets: inherit From c1513ecd585dfa35cfe43d9859abd8f057e5895f Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 11 May 2026 11:48:23 +0100 Subject: [PATCH 566/583] Updated environment lockfiles (#789) Co-authored-by: Lockfile bot --- requirements/locks/py312-linux-64.lock | 124 ++++++++++++------------- requirements/locks/py313-linux-64.lock | 124 ++++++++++++------------- requirements/locks/py314-linux-64.lock | 124 ++++++++++++------------- 3 files changed, 186 insertions(+), 186 deletions(-) diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index c3db077e..2ac4300a 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -6,32 +6,33 @@ https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda#c3ef https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda#ad659d0a2b3e47e38d829aa8cad2d610 https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda#e18ad67cf881dcadee8b8d9e2f8e5f73 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda#239c5e9546c38a1e884d69effcf4c882 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda#faac990cb7aedc7f3a2224f2c9b0c26c https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda#d87ff7921124eccd67248aa483c23fec https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda#a9f577daf3de00bca7c3c76c0ecbd1de https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda#4a13eeac0b5c8e5b8ab496e6c4ddd829 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda#18335a698559cdbcd86150a48bf54ba6 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda#0aa00f03f9e39fb9876085dee11a85d4 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda#57736f29cc2b0ec0b6c2952d3f101b6a https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.6-hb03c661_0.conda#e36ad70a7e0b48f091ed6902f04c23b8 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda#d2ffd7602c02f2b316fd921d39876885 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda#920bb03579f15389b9e512095ad995b7 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda#72c8fd1af66bd67bf580645b426513ed https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda#6c77a605a7a689d17d4819c0f8ac9a00 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.5-hecca717_0.conda#49f570f3bc4c874a06ea69b7225753af +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda#a3b390520c563d78cc58974de95a03e5 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda#a360c33a5abe61c07959e449fa1453eb -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda#d5e96b1ed75ca01906b3d2469b4ce493 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda#646855f357199a12f02a87382d429b75 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda#331ee9b72b9dff570d56b1302c5ab37d +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.conda#85072b0ad177c966294f129b7c04a2d5 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda#6178c6f2fb254558238ef4e6c56fb782 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda#b88d90cad08e6bc8ad540cb310a761fb https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda#eba48a68a1a2b9d3c0d9511548db85db -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda#1b08cd684f34175e4514474793d44bcb +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda#7dc38adcbf71e6b38748e919e16e0dce +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda#5794b3bdc38177caf969dabd3af08549 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda#38ffe67b78c9d4de527be8315e5ada2c https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda#fc21868a1a5aacc937e7a18747acb8a5 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda#da1b85b6a87e141f5140bb9924cecab0 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda#cffd3bdd58090148f4cfcd831f4b26ab @@ -52,20 +53,20 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.co https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda#fb16b4b69e3f1dcfe79d80db8fd0c55d -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda#9063115da5bc35fdc3e1002e69b9ef6e +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda#42bf7eca1a951735fa06c0e3c0d5c8e6 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda#6235adb93d064ecdf3d44faee6f468de +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda#e5ce228e579726c07255dbf90dc62101 https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda#d7d95fc8287ea7bf33e0e7116d2b95ec -https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.1-h1cbb8d7_1.conda#9d978822b57bafe72ebd3f8b527bba71 +https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.2-hc5a330e_1.conda#3f578c7d2b0bb52469340e4060d48d94 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda#98b6c9dc80eb87b2519b97bcf7e578dd https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda#2aadb0d17215603a82a2a6b0afd9a4cb -https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-hc87160b_0.conda#dde6a3e4fe6bb2ecd2a7050dd1e701fb +https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-h692f434_1.conda#14260392d0b491c537b5e26e9a506fff https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda#af39b9a8711d4a8d437b52c1d78eb6a1 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 @@ -74,37 +75,26 @@ https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.co https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda#2a45e7f8af083626f009645a6481f12d https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda#89d61bc91d3f39fda0ca10fcd3c68594 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.0-hf4e2dac_0.conda#810d83373448da85c3f673fbcb7ad3a3 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#cd5a90476766d53e901500df9215e927 https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda#e79d2c2f24b027aa8d5ab1b1ba3061e7 +https://conda.anaconda.org/conda-forge/linux-64/python-3.12.13-hd63d673_0_cpython.conda#7eccb41177e15cc672e1babe9056018e https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.1-hbc0de68_0.conda#8e0b8654ead18e50af552e54b5a08a61 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda#861fb6ccbc677bb9a9fb2468430b9c6a -https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.12-h4bacb7b_1.conda#7bc920933e5fb225aba86a788164a8f1 -https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda#8ccf913aaba749a5496c17629d859ed1 -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_0.conda#8462b5322567212beeb025f3519fb3e2 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda#6f2e2c8f58160147c4d1c6f4c14cbac4 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h4a7cf45_openblas.conda#6d6d225559bfa6e2f3c90ee9c03d4e2e -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda#d50608c443a30c341c24277d28290f76 -https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda#995d8c8bad2a3cc8db14675a153dec2b -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd -https://conda.anaconda.org/conda-forge/linux-64/python-3.12.13-hd63d673_0_cpython.conda#7eccb41177e15cc672e1babe9056018e -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.0-h04a0ce9_0.conda#dc540e5bd5616d83a1ec46af8315ff98 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda#34e54f03dfea3e7a2dcf1453a85f1085 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda#8f37c8fb7116a18da04e52fa9e2c8df9 https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda#c6b0543676ecb1fb2d7643941fe375f2 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-h2d2dd48_2.conda#675ea6d90900350b1dcfa8231a5ea2dd +https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.13-h4bacb7b_0.conda#77f70a9ab785a146dbf66fba00131403 https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda#f1976ce927373500cc19d3c0b2c85177 -https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py312h90b7ffd_0.conda#5b8c55fed2e576dde4b0b33693a4fdb1 +https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.4.0-py312h90b7ffd_0.conda#542da724e75cdeef19e29cca23935c25 +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda#8ccf913aaba749a5496c17629d859ed1 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py312hdb49522_1.conda#64088dffd7413a2dd557ce837b4cbbdb -https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.6-pyhd8ed1ab_0.conda#14e77b3ebe7b8e37f6254a59ee245184 +https://conda.anaconda.org/conda-forge/noarch/cachetools-7.1.1-pyhd8ed1ab_0.conda#bf63d5c36d9cfee27b7929aff260140b https://conda.anaconda.org/conda-forge/noarch/certifi-2026.4.22-pyhd8ed1ab_0.conda#929471569c93acefb30282a22060dcd5 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda#a9167b9571f3baa9d448faa2139d1089 -https://conda.anaconda.org/conda-forge/noarch/click-8.3.2-pyhc90fa1f_0.conda#4d18bc3af7cfcea97bd817164672a08c +https://conda.anaconda.org/conda-forge/noarch/click-8.3.3-pyhc90fa1f_0.conda#2266262ce8a425ecb6523d765f79b303 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda#61b8078a0905b12529abc622406cb62c https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/colorlog-6.10.1-pyh707e725_0.conda#33e96df3785bf61676ffee387e5a19e5 @@ -114,7 +104,8 @@ https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#0 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc https://conda.anaconda.org/conda-forge/noarch/filelock-3.29.0-pyhd8ed1ab_0.conda#8fa8358d022a3a9bd101384a808044c6 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 -https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.3.0-pyhd8ed1ab_0.conda#c18d2ba7577cdc618a20d45f1e31d14b +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_0.conda#8462b5322567212beeb025f3519fb3e2 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda#2c11aa96ea85ced419de710c1c3a78ff https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda#daddf757c3ecd6067b9af1df1f25d89e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac @@ -123,17 +114,18 @@ https://conda.anaconda.org/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda#9614359868482abba1bd15ce465e3c42 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py312h0a2e395_0.conda#cd74a9525dc74bbbf93cf8aa2fa9eb5b -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-6_h0358290_openblas.conda#36ae340a916635b97ac8a0655ace2a35 -https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h47877c9_openblas.conda#881d801569b201c2e753f03c84b85e15 +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_0.conda#f92f984b558e6e6204014b16d212b271 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h4a7cf45_openblas.conda#6d6d225559bfa6e2f3c90ee9c03d4e2e +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.20.0-hcf29cc6_0.conda#c3cc2864f82a944bc90a7beb4d3b0e88 +https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda#995d8c8bad2a3cc8db14675a153dec2b https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda#93a4752d42b12943a355b682ee43285b https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 -https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda#b8ae38639d323d808da535fb71e31be8 -https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py312h50c33e8_0.conda#9e5609720e31213d4f39afe377f6217e +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd +https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda#4c06a92e74452cfa53623a81592e8934 https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda#89c0b6d1793601a2a3a3f7d2d3d8b937 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda#d7585b6550ad04c8c5e21097ada2888e -https://conda.anaconda.org/conda-forge/linux-64/proj-9.8.1-he0df7b0_0.conda#b23619e5e9009eaa070ead0342034027 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda#16c18772b340887160c79a6acc022db0 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda#3687cc0b82a8b4c17e1f0eb7e47163d5 @@ -152,69 +144,77 @@ https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda#3 https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda#c07a6153f8306e45794774cf9b13bd32 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975b_0.conda#0b6c506ec1f272b685240e70a29261b8 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.7-hb03c661_0.conda#665d152b9c6e78da404086088077c844 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda#34e54f03dfea3e7a2dcf1453a85f1085 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda#e1c36c6121a7c9c76f2f148f1e83b983 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.11.5-h6d69fc9_5.conda#4c5c16bf1133dcfe100f33dd4470998e +https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-ha62d5e7_3.conda#55eaf7066da1299d217ab32baedc7fa8 https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py312h460c074_1.conda#648ee28dcd4e07a1940a17da62eccd40 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.5-py312h8a5da7c_0.conda#c4d858e15305e70b255e756a4dc96e58 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda#8e662bd460bda79b1ea39194e3c4c9ab https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.62.1-py312h8a5da7c_0.conda#2396fee22e84f69dffc6e23135905ce8 -https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-h215f996_4.conda#b39dccf5af984bcb68ee2aa0f3213ea6 https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda#b8993c19b0c32a2f7b66cbb58ca27069 https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda#080594bf4493e6bae2607e65390c520a https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda#0ba6225c279baf7ea9473a62ea0ec9ae https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda#04558c96691bed63104678757beb4f8d +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-6_h0358290_openblas.conda#36ae340a916635b97ac8a0655ace2a35 +https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h47877c9_openblas.conda#881d801569b201c2e753f03c84b85e15 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda#eb52d14a901e23c39e9e7b4a1a5c015f -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py312h33ff503_0.conda#5930ee8a175a242b4f001b1e9e72024f https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py312hbc8341d_4.conda#9d5ea11aefbdf548a2d8c965c1b2ebad +https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py312h50c33e8_0.conda#9e5609720e31213d4f39afe377f6217e +https://conda.anaconda.org/conda-forge/linux-64/proj-9.8.1-he0df7b0_0.conda#b23619e5e9009eaa070ead0342034027 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 -https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.2-pyhcf101f3_0.conda#feb2e11368da12d6ce473b6573efab41 +https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.3.0-pyhcf101f3_0.conda#696db6f25e56c0fafdccb0a7426fffb6 https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.13-hd8ed1ab_0.conda#32780d6794b8056b78602103a04e90ef https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda#28687768633154993d521aecfa4a56ac https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 https://conda.anaconda.org/conda-forge/noarch/wheel-0.47.0-pyhd8ed1ab_0.conda#d0e3b2f0030cf4fca58bde71d246e94c +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.7-hb03c661_0.conda#665d152b9c6e78da404086088077c844 https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f https://conda.anaconda.org/conda-forge/noarch/anyio-4.13.0-pyhcf101f3_0.conda#af2df4b9108808da3dc76710fe50eae2 -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py312h4f23490_1.conda#84bf349fad55056ed326fc550671b65c -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda#43c2bc96af3ae5ed9e8a10ded942aa50 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.2-he6ee468_1.conda#50ae8372984b8b98e056ac8f6b70ab29 https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda#809f4cde7c853f437becc43415a2ecdf -https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_hd4fcb43_104.conda#1d92558abd05cea0577f83a5eca38733 -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.9-h1588d4d_1.conda#115ecf05370670f93bc81a8c4f7fd57f -https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h4f23490_2.conda#cec5bc5f7d374f8f8095f8e28e31f6cb -https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh8b19718_0.conda#67bdec43082fd8a9cffb9484420b39a2 +https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-h215f996_4.conda#b39dccf5af984bcb68ee2aa0f3213ea6 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py312h33ff503_0.conda#5930ee8a175a242b4f001b1e9e72024f +https://conda.anaconda.org/conda-forge/noarch/pip-26.1.1-pyh8b19718_0.conda#35870d32aed92041d31cbb15e822dca3 +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py312hbc8341d_4.conda#9d5ea11aefbdf548a2d8c965c1b2ebad https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda#6a991452eadf2771952f39d43615bb3e -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py312h54fa4ab_0.conda#3e38daeb1fb05a95656ff5af089d2e4c https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0.conda#e2e4d7094d0580ccd62e2a41947444f3 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py312h383787d_2.conda#69e400d3deca12ee7afd4b73a5596905 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py312hd9148b4_0.conda#55fd03988b1b1bc6faabbfb5b481ecd7 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda#9272daa869e03efe68833e3dc7a02130 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.2.4-pyhcf101f3_0.conda#15be1b64e7a4501abb4f740c28ceadaf +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda#cbb88288f74dbe6ada1c6c7d0a97223e +https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.3.1-pyhcf101f3_0.conda#dd6a1f3ce9d1cfa8b5b1b32953a80a55 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py312h5253ce2_1.conda#02738ff9855946075cbd1b5274399a41 -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.1-py312h4f23490_0.conda#6aef45ba3c0123547eb7b0f15852cac9 +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py312h4f23490_1.conda#84bf349fad55056ed326fc550671b65c +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda#43c2bc96af3ae5ed9e8a10ded942aa50 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_h87a9417_105.conda#0d0595612fa229dddb5fc565c260a11f https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb https://conda.anaconda.org/conda-forge/noarch/identify-2.6.19-pyhd8ed1ab_0.conda#84a3233b709a289a4ddd7a2fd27dd988 -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.10.0-nompi_h3c9b436_104.conda#6d38346d49e4638ec98649121d295d54 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.9-py312he3d6523_0.conda#7d499b5b6d150f133800dc3a582771c7 +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.9-h1588d4d_1.conda#115ecf05370670f93bc81a8c4f7fd57f +https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h4f23490_2.conda#cec5bc5f7d374f8f8095f8e28e31f6cb https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda#67d1790eefa81ed305b89d8e314c7923 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_1.conda#9659f587a8ceacc21864260acd02fc67 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py312h54fa4ab_0.conda#3e38daeb1fb05a95656ff5af089d2e4c https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 -https://conda.anaconda.org/conda-forge/noarch/tox-4.52.1-pyhcf101f3_0.conda#4e613772846d96b2fe8793ffdacadbad -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py312hf79963d_1.conda#6c913a686cb4060cbd7639a36fa144f0 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py312h383787d_2.conda#69e400d3deca12ee7afd4b73a5596905 +https://conda.anaconda.org/conda-forge/noarch/tox-4.53.1-pyhcf101f3_0.conda#e01a2e7633841c0cd15e93e1a8c2dfcc +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.1-py312h4f23490_0.conda#6aef45ba3c0123547eb7b0f15852cac9 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.46.0-ha1d8304_2.conda#a6f0fd37646b5dedc6f52daa609f1aec https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py311h498b1eb_107.conda#7f5488cf61943e6221325b454c2c2e9c +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.10.0-nompi_h3c9b436_104.conda#6d38346d49e4638ec98649121d295d54 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.9-py312he3d6523_0.conda#7d499b5b6d150f133800dc3a582771c7 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.6.0-pyha770c72_0.conda#7859736b4f8ebe6c8481bf48d91c9a1e +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py312hf79963d_1.conda#6c913a686cb4060cbd7639a36fa144f0 +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.47.0-ha1d8304_0.conda#3ef42f61d9a66a0749cbe598b5acdeea +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py311h498b1eb_107.conda#7f5488cf61943e6221325b454c2c2e9c +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.5.4-pyhd8ed1ab_0.conda#e61c46481c176f01af41186667401131 https://conda.anaconda.org/conda-forge/noarch/iris-3.15.0-pyha770c72_0.conda#bfe6588cbbd6e2e97e9439f95de02af8 -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.4.7-pyhd8ed1ab_0.conda#c93d5115d0c2782415a054db063a9d1d -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.46.0-np2py312hfb8c2c5_0.conda#fe3e310aa4a84610012a3889e23d76eb https://conda.anaconda.org/conda-forge/noarch/nox-2026.4.10-pyhc364b38_0.conda#10df85d0d06301e961c8b27805f66a56 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.47.0-np2py312hfb8c2c5_0.conda#614309c6287d4edebffa95dc983241d3 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda#e9fb3fe8a5b758b4aff187d434f94f03 diff --git a/requirements/locks/py313-linux-64.lock b/requirements/locks/py313-linux-64.lock index f24dcc63..b62f88ca 100644 --- a/requirements/locks/py313-linux-64.lock +++ b/requirements/locks/py313-linux-64.lock @@ -6,32 +6,33 @@ https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda#9430 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda#ad659d0a2b3e47e38d829aa8cad2d610 https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda#e18ad67cf881dcadee8b8d9e2f8e5f73 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda#239c5e9546c38a1e884d69effcf4c882 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda#faac990cb7aedc7f3a2224f2c9b0c26c https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda#d87ff7921124eccd67248aa483c23fec https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda#a9f577daf3de00bca7c3c76c0ecbd1de https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda#4a13eeac0b5c8e5b8ab496e6c4ddd829 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda#18335a698559cdbcd86150a48bf54ba6 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda#0aa00f03f9e39fb9876085dee11a85d4 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda#57736f29cc2b0ec0b6c2952d3f101b6a https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.6-hb03c661_0.conda#e36ad70a7e0b48f091ed6902f04c23b8 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda#d2ffd7602c02f2b316fd921d39876885 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda#920bb03579f15389b9e512095ad995b7 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda#72c8fd1af66bd67bf580645b426513ed https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda#6c77a605a7a689d17d4819c0f8ac9a00 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.5-hecca717_0.conda#49f570f3bc4c874a06ea69b7225753af +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda#a3b390520c563d78cc58974de95a03e5 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda#a360c33a5abe61c07959e449fa1453eb -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda#d5e96b1ed75ca01906b3d2469b4ce493 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda#646855f357199a12f02a87382d429b75 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda#331ee9b72b9dff570d56b1302c5ab37d +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.conda#85072b0ad177c966294f129b7c04a2d5 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda#6178c6f2fb254558238ef4e6c56fb782 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda#b88d90cad08e6bc8ad540cb310a761fb https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda#2c21e66f50753a083cbe6b80f38268fa https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda#eba48a68a1a2b9d3c0d9511548db85db -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda#1b08cd684f34175e4514474793d44bcb +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda#7dc38adcbf71e6b38748e919e16e0dce +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda#5794b3bdc38177caf969dabd3af08549 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda#38ffe67b78c9d4de527be8315e5ada2c https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda#fc21868a1a5aacc937e7a18747acb8a5 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda#da1b85b6a87e141f5140bb9924cecab0 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda#cffd3bdd58090148f4cfcd831f4b26ab @@ -52,19 +53,19 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.co https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda#fb16b4b69e3f1dcfe79d80db8fd0c55d -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda#9063115da5bc35fdc3e1002e69b9ef6e +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda#42bf7eca1a951735fa06c0e3c0d5c8e6 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda#6235adb93d064ecdf3d44faee6f468de +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda#e5ce228e579726c07255dbf90dc62101 https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda#d7d95fc8287ea7bf33e0e7116d2b95ec -https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.1-h1cbb8d7_1.conda#9d978822b57bafe72ebd3f8b527bba71 +https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.2-hc5a330e_1.conda#3f578c7d2b0bb52469340e4060d48d94 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda#98b6c9dc80eb87b2519b97bcf7e578dd https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda#2aadb0d17215603a82a2a6b0afd9a4cb -https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-hc87160b_0.conda#dde6a3e4fe6bb2ecd2a7050dd1e701fb +https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-h692f434_1.conda#14260392d0b491c537b5e26e9a506fff https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda#af39b9a8711d4a8d437b52c1d78eb6a1 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 @@ -73,37 +74,26 @@ https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.co https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda#2a45e7f8af083626f009645a6481f12d https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda#89d61bc91d3f39fda0ca10fcd3c68594 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.0-hf4e2dac_0.conda#810d83373448da85c3f673fbcb7ad3a3 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#cd5a90476766d53e901500df9215e927 https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda#e79d2c2f24b027aa8d5ab1b1ba3061e7 +https://conda.anaconda.org/conda-forge/linux-64/python-3.13.13-h6add32d_100_cp313.conda#05051be49267378d2fcd12931e319ac3 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.1-hbc0de68_0.conda#8e0b8654ead18e50af552e54b5a08a61 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda#861fb6ccbc677bb9a9fb2468430b9c6a -https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.12-h4bacb7b_1.conda#7bc920933e5fb225aba86a788164a8f1 -https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda#8ccf913aaba749a5496c17629d859ed1 -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_0.conda#8462b5322567212beeb025f3519fb3e2 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda#6f2e2c8f58160147c4d1c6f4c14cbac4 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h4a7cf45_openblas.conda#6d6d225559bfa6e2f3c90ee9c03d4e2e -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda#d50608c443a30c341c24277d28290f76 -https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda#995d8c8bad2a3cc8db14675a153dec2b -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd -https://conda.anaconda.org/conda-forge/linux-64/python-3.13.13-h6add32d_100_cp313.conda#05051be49267378d2fcd12931e319ac3 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.0-h04a0ce9_0.conda#dc540e5bd5616d83a1ec46af8315ff98 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda#34e54f03dfea3e7a2dcf1453a85f1085 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda#8f37c8fb7116a18da04e52fa9e2c8df9 https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda#c6b0543676ecb1fb2d7643941fe375f2 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-h2d2dd48_2.conda#675ea6d90900350b1dcfa8231a5ea2dd +https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.13-h4bacb7b_0.conda#77f70a9ab785a146dbf66fba00131403 https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda#f1976ce927373500cc19d3c0b2c85177 -https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py313h18e8e13_0.conda#d9e90792551a527200637e23a915dd79 +https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.4.0-py313h18e8e13_0.conda#cfe95f3eab50bc3dbd4c3a03f2674bd8 +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda#8ccf913aaba749a5496c17629d859ed1 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py313hf159716_1.conda#6c4d3597cf43f3439a51b2b13e29a4ba -https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.6-pyhd8ed1ab_0.conda#14e77b3ebe7b8e37f6254a59ee245184 +https://conda.anaconda.org/conda-forge/noarch/cachetools-7.1.1-pyhd8ed1ab_0.conda#bf63d5c36d9cfee27b7929aff260140b https://conda.anaconda.org/conda-forge/noarch/certifi-2026.4.22-pyhd8ed1ab_0.conda#929471569c93acefb30282a22060dcd5 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda#a9167b9571f3baa9d448faa2139d1089 -https://conda.anaconda.org/conda-forge/noarch/click-8.3.2-pyhc90fa1f_0.conda#4d18bc3af7cfcea97bd817164672a08c +https://conda.anaconda.org/conda-forge/noarch/click-8.3.3-pyhc90fa1f_0.conda#2266262ce8a425ecb6523d765f79b303 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda#61b8078a0905b12529abc622406cb62c https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/colorlog-6.10.1-pyh707e725_0.conda#33e96df3785bf61676ffee387e5a19e5 @@ -113,7 +103,8 @@ https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#0 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc https://conda.anaconda.org/conda-forge/noarch/filelock-3.29.0-pyhd8ed1ab_0.conda#8fa8358d022a3a9bd101384a808044c6 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 -https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.3.0-pyhd8ed1ab_0.conda#c18d2ba7577cdc618a20d45f1e31d14b +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_0.conda#8462b5322567212beeb025f3519fb3e2 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda#2c11aa96ea85ced419de710c1c3a78ff https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda#daddf757c3ecd6067b9af1df1f25d89e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac @@ -122,18 +113,19 @@ https://conda.anaconda.org/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda#9614359868482abba1bd15ce465e3c42 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py313hc8edb43_0.conda#b81883b9dbf5069821c2fb09a8ba1407 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-6_h0358290_openblas.conda#36ae340a916635b97ac8a0655ace2a35 -https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h47877c9_openblas.conda#881d801569b201c2e753f03c84b85e15 +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_0.conda#f92f984b558e6e6204014b16d212b271 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h4a7cf45_openblas.conda#6d6d225559bfa6e2f3c90ee9c03d4e2e +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.20.0-hcf29cc6_0.conda#c3cc2864f82a944bc90a7beb4d3b0e88 +https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda#995d8c8bad2a3cc8db14675a153dec2b https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py313h3dea7bd_1.conda#aeb9b9da79fd0258b3db091d1fefcd71 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 -https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda#b8ae38639d323d808da535fb71e31be8 -https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py313h80991f8_0.conda#7245f1bbf52ed5e3818d742f51b44a7d -https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh145f28c_0.conda#09a970fbf75e8ed1aa633827ded6aa4f +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd +https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda#4c06a92e74452cfa53623a81592e8934 +https://conda.anaconda.org/conda-forge/noarch/pip-26.1.1-pyh145f28c_0.conda#2e7e59a063366f1fc4f45ac86bd9485f https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda#89c0b6d1793601a2a3a3f7d2d3d8b937 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda#d7585b6550ad04c8c5e21097ada2888e -https://conda.anaconda.org/conda-forge/linux-64/proj-9.8.1-he0df7b0_0.conda#b23619e5e9009eaa070ead0342034027 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda#16c18772b340887160c79a6acc022db0 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda#3687cc0b82a8b4c17e1f0eb7e47163d5 @@ -151,67 +143,75 @@ https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda#b53 https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda#32e37e8fe9ef45c637ee38ad51377769 https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda#c07a6153f8306e45794774cf9b13bd32 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.7-hb03c661_0.conda#665d152b9c6e78da404086088077c844 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda#34e54f03dfea3e7a2dcf1453a85f1085 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda#e1c36c6121a7c9c76f2f148f1e83b983 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.11.5-h6d69fc9_5.conda#4c5c16bf1133dcfe100f33dd4470998e +https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-ha62d5e7_3.conda#55eaf7066da1299d217ab32baedc7fa8 https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py313hf46b229_1.conda#d0616e7935acab407d1543b28c446f6f https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.5-py313h3dea7bd_0.conda#acbda45380f5097ade59014704eb0ba0 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda#8e662bd460bda79b1ea39194e3c4c9ab https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.62.1-py313h3dea7bd_0.conda#98082dfa338d9f0dca885e4865c69a20 -https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-h215f996_4.conda#b39dccf5af984bcb68ee2aa0f3213ea6 https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda#b8993c19b0c32a2f7b66cbb58ca27069 https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda#080594bf4493e6bae2607e65390c520a https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda#0ba6225c279baf7ea9473a62ea0ec9ae https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda#04558c96691bed63104678757beb4f8d +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-6_h0358290_openblas.conda#36ae340a916635b97ac8a0655ace2a35 +https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h47877c9_openblas.conda#881d801569b201c2e753f03c84b85e15 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda#eb52d14a901e23c39e9e7b4a1a5c015f -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py313hf6604e3_0.conda#c4a9d2e77eb9fee983a70cf5f047c202 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py313he648cc1_4.conda#fe69af9ea9bb222c067bca5888e5aabe +https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py313h80991f8_0.conda#7245f1bbf52ed5e3818d742f51b44a7d +https://conda.anaconda.org/conda-forge/linux-64/proj-9.8.1-he0df7b0_0.conda#b23619e5e9009eaa070ead0342034027 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 -https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.2-pyhcf101f3_0.conda#feb2e11368da12d6ce473b6573efab41 +https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.3.0-pyhcf101f3_0.conda#696db6f25e56c0fafdccb0a7426fffb6 https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.13-h4df99d1_100.conda#fd00e4b24ea88093c93f5c9bad27b52f https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda#28687768633154993d521aecfa4a56ac https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.7-hb03c661_0.conda#665d152b9c6e78da404086088077c844 https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f https://conda.anaconda.org/conda-forge/noarch/anyio-4.13.0-pyhcf101f3_0.conda#af2df4b9108808da3dc76710fe50eae2 -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py313h29aa505_1.conda#c63d5f9d63fe2f48b0ad75005fcae7ba -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py313hc8edb43_4.conda#33639459bc29437315d4bff9ed5bc7a7 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.2-he6ee468_1.conda#50ae8372984b8b98e056ac8f6b70ab29 https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda#809f4cde7c853f437becc43415a2ecdf -https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_hd4fcb43_104.conda#1d92558abd05cea0577f83a5eca38733 -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.9-h1588d4d_1.conda#115ecf05370670f93bc81a8c4f7fd57f -https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py313h29aa505_2.conda#ad53894d278895bf15c8fc324727d224 +https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-h215f996_4.conda#b39dccf5af984bcb68ee2aa0f3213ea6 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py313hf6604e3_0.conda#c4a9d2e77eb9fee983a70cf5f047c202 +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py313he648cc1_4.conda#fe69af9ea9bb222c067bca5888e5aabe https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda#6a991452eadf2771952f39d43615bb3e -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py313h4b8bb8b_0.conda#ec81bc03787968decae6765c7f61b7cf https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0.conda#e2e4d7094d0580ccd62e2a41947444f3 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py313had47c43_2.conda#6e550dd748e9ac9b2925411684e076a1 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py313h7037e92_0.conda#cb423e0853b3dde2b3738db4dedf5ba2 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda#9272daa869e03efe68833e3dc7a02130 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.2.4-pyhcf101f3_0.conda#15be1b64e7a4501abb4f740c28ceadaf +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda#cbb88288f74dbe6ada1c6c7d0a97223e +https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.3.1-pyhcf101f3_0.conda#dd6a1f3ce9d1cfa8b5b1b32953a80a55 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py313h54dd161_1.conda#710d4663806d0f72b2fb414e936223b5 -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.1-py313h29aa505_0.conda#3942b6a86fe92d0888b3373f2c1e1676 +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py313h29aa505_1.conda#c63d5f9d63fe2f48b0ad75005fcae7ba +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py313hc8edb43_4.conda#33639459bc29437315d4bff9ed5bc7a7 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_h87a9417_105.conda#0d0595612fa229dddb5fc565c260a11f https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb https://conda.anaconda.org/conda-forge/noarch/identify-2.6.19-pyhd8ed1ab_0.conda#84a3233b709a289a4ddd7a2fd27dd988 -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.10.0-nompi_h3c9b436_104.conda#6d38346d49e4638ec98649121d295d54 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.9-py313h683a580_0.conda#4265d85b1d706caba7ac1d73b5f43dee +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.9-h1588d4d_1.conda#115ecf05370670f93bc81a8c4f7fd57f +https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py313h29aa505_2.conda#ad53894d278895bf15c8fc324727d224 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda#67d1790eefa81ed305b89d8e314c7923 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_1.conda#9659f587a8ceacc21864260acd02fc67 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py313h4b8bb8b_0.conda#ec81bc03787968decae6765c7f61b7cf https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 -https://conda.anaconda.org/conda-forge/noarch/tox-4.52.1-pyhcf101f3_0.conda#4e613772846d96b2fe8793ffdacadbad -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py313h08cd8bf_1.conda#a0d8dc5c90850d9f1a79f69c98aef0ff +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py313had47c43_2.conda#6e550dd748e9ac9b2925411684e076a1 +https://conda.anaconda.org/conda-forge/noarch/tox-4.53.1-pyhcf101f3_0.conda#e01a2e7633841c0cd15e93e1a8c2dfcc +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.1-py313h29aa505_0.conda#3942b6a86fe92d0888b3373f2c1e1676 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.46.0-ha1d8304_2.conda#a6f0fd37646b5dedc6f52daa609f1aec https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py311h498b1eb_107.conda#7f5488cf61943e6221325b454c2c2e9c +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.10.0-nompi_h3c9b436_104.conda#6d38346d49e4638ec98649121d295d54 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.9-py313h683a580_0.conda#4265d85b1d706caba7ac1d73b5f43dee https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.6.0-pyha770c72_0.conda#7859736b4f8ebe6c8481bf48d91c9a1e +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py313h08cd8bf_1.conda#a0d8dc5c90850d9f1a79f69c98aef0ff +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.47.0-ha1d8304_0.conda#3ef42f61d9a66a0749cbe598b5acdeea +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py311h498b1eb_107.conda#7f5488cf61943e6221325b454c2c2e9c +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.5.4-pyhd8ed1ab_0.conda#e61c46481c176f01af41186667401131 https://conda.anaconda.org/conda-forge/noarch/iris-3.15.0-pyha770c72_0.conda#bfe6588cbbd6e2e97e9439f95de02af8 -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.4.7-pyhd8ed1ab_0.conda#c93d5115d0c2782415a054db063a9d1d -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.46.0-np2py313hc18bace_0.conda#93af5d555b8f2aa6f6f4c98cb0768b5f https://conda.anaconda.org/conda-forge/noarch/nox-2026.4.10-pyhc364b38_0.conda#10df85d0d06301e961c8b27805f66a56 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.47.0-np2py313hc18bace_0.conda#5ac58ad77ebc56ba99f965562315a69c https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda#e9fb3fe8a5b758b4aff187d434f94f03 diff --git a/requirements/locks/py314-linux-64.lock b/requirements/locks/py314-linux-64.lock index db7285ca..d445b9fb 100644 --- a/requirements/locks/py314-linux-64.lock +++ b/requirements/locks/py314-linux-64.lock @@ -6,32 +6,33 @@ https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda#0539 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda#ad659d0a2b3e47e38d829aa8cad2d610 https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda#e18ad67cf881dcadee8b8d9e2f8e5f73 https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda#239c5e9546c38a1e884d69effcf4c882 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda#faac990cb7aedc7f3a2224f2c9b0c26c https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda#d87ff7921124eccd67248aa483c23fec https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda#a9f577daf3de00bca7c3c76c0ecbd1de https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda#4a13eeac0b5c8e5b8ab496e6c4ddd829 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda#18335a698559cdbcd86150a48bf54ba6 -https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda#0aa00f03f9e39fb9876085dee11a85d4 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda#57736f29cc2b0ec0b6c2952d3f101b6a https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.6-hb03c661_0.conda#e36ad70a7e0b48f091ed6902f04c23b8 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda#d2ffd7602c02f2b316fd921d39876885 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda#920bb03579f15389b9e512095ad995b7 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda#72c8fd1af66bd67bf580645b426513ed https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda#6c77a605a7a689d17d4819c0f8ac9a00 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.5-hecca717_0.conda#49f570f3bc4c874a06ea69b7225753af +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda#a3b390520c563d78cc58974de95a03e5 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda#a360c33a5abe61c07959e449fa1453eb -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda#d5e96b1ed75ca01906b3d2469b4ce493 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda#646855f357199a12f02a87382d429b75 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda#331ee9b72b9dff570d56b1302c5ab37d +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.conda#85072b0ad177c966294f129b7c04a2d5 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda#6178c6f2fb254558238ef4e6c56fb782 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda#b88d90cad08e6bc8ad540cb310a761fb https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda#2c21e66f50753a083cbe6b80f38268fa https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda#eba48a68a1a2b9d3c0d9511548db85db -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda#1b08cd684f34175e4514474793d44bcb +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda#7dc38adcbf71e6b38748e919e16e0dce +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda#5794b3bdc38177caf969dabd3af08549 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda#38ffe67b78c9d4de527be8315e5ada2c https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda#fc21868a1a5aacc937e7a18747acb8a5 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda#da1b85b6a87e141f5140bb9924cecab0 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda#cffd3bdd58090148f4cfcd831f4b26ab @@ -52,19 +53,19 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.co https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda#fb16b4b69e3f1dcfe79d80db8fd0c55d -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda#9063115da5bc35fdc3e1002e69b9ef6e +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda#42bf7eca1a951735fa06c0e3c0d5c8e6 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.3-h5888daf_1.conda#8422fcc9e5e172c91e99aef703b3ce65 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda#6235adb93d064ecdf3d44faee6f468de +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda#e5ce228e579726c07255dbf90dc62101 https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda#d7d95fc8287ea7bf33e0e7116d2b95ec -https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.1-h1cbb8d7_1.conda#9d978822b57bafe72ebd3f8b527bba71 +https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.2-hc5a330e_1.conda#3f578c7d2b0bb52469340e4060d48d94 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda#98b6c9dc80eb87b2519b97bcf7e578dd https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda#2aadb0d17215603a82a2a6b0afd9a4cb -https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-hc87160b_0.conda#dde6a3e4fe6bb2ecd2a7050dd1e701fb +https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-h692f434_1.conda#14260392d0b491c537b5e26e9a506fff https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda#af39b9a8711d4a8d437b52c1d78eb6a1 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 @@ -73,37 +74,26 @@ https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.co https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda#2a45e7f8af083626f009645a6481f12d https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda#89d61bc91d3f39fda0ca10fcd3c68594 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.0-hf4e2dac_0.conda#810d83373448da85c3f673fbcb7ad3a3 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#cd5a90476766d53e901500df9215e927 https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda#e79d2c2f24b027aa8d5ab1b1ba3061e7 +https://conda.anaconda.org/conda-forge/linux-64/python-3.14.4-habeac84_100_cp314.conda#a443f87920815d41bfe611296e507995 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.1-hbc0de68_0.conda#8e0b8654ead18e50af552e54b5a08a61 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda#861fb6ccbc677bb9a9fb2468430b9c6a -https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.12-h4bacb7b_1.conda#7bc920933e5fb225aba86a788164a8f1 -https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda#8ccf913aaba749a5496c17629d859ed1 -https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_0.conda#8462b5322567212beeb025f3519fb3e2 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda#6f2e2c8f58160147c4d1c6f4c14cbac4 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h4a7cf45_openblas.conda#6d6d225559bfa6e2f3c90ee9c03d4e2e -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda#d50608c443a30c341c24277d28290f76 -https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda#995d8c8bad2a3cc8db14675a153dec2b -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd -https://conda.anaconda.org/conda-forge/linux-64/python-3.14.4-habeac84_100_cp314.conda#a443f87920815d41bfe611296e507995 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.0-h04a0ce9_0.conda#dc540e5bd5616d83a1ec46af8315ff98 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda#34e54f03dfea3e7a2dcf1453a85f1085 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda#8f37c8fb7116a18da04e52fa9e2c8df9 https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda#c6b0543676ecb1fb2d7643941fe375f2 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-h2d2dd48_2.conda#675ea6d90900350b1dcfa8231a5ea2dd +https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.13-h4bacb7b_0.conda#77f70a9ab785a146dbf66fba00131403 https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda#f1976ce927373500cc19d3c0b2c85177 -https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda#a2ac7763a9ac75055b68f325d3255265 +https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.4.0-py314h680f03e_0.conda#b712198b257f378e9bd8cde277218296 +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda#8ccf913aaba749a5496c17629d859ed1 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda#8910d2c46f7e7b519129f486e0fe927a -https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.6-pyhd8ed1ab_0.conda#14e77b3ebe7b8e37f6254a59ee245184 +https://conda.anaconda.org/conda-forge/noarch/cachetools-7.1.1-pyhd8ed1ab_0.conda#bf63d5c36d9cfee27b7929aff260140b https://conda.anaconda.org/conda-forge/noarch/certifi-2026.4.22-pyhd8ed1ab_0.conda#929471569c93acefb30282a22060dcd5 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda#a9167b9571f3baa9d448faa2139d1089 -https://conda.anaconda.org/conda-forge/noarch/click-8.3.2-pyhc90fa1f_0.conda#4d18bc3af7cfcea97bd817164672a08c +https://conda.anaconda.org/conda-forge/noarch/click-8.3.3-pyhc90fa1f_0.conda#2266262ce8a425ecb6523d765f79b303 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda#61b8078a0905b12529abc622406cb62c https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/colorlog-6.10.1-pyh707e725_0.conda#33e96df3785bf61676ffee387e5a19e5 @@ -113,7 +103,8 @@ https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#0 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc https://conda.anaconda.org/conda-forge/noarch/filelock-3.29.0-pyhd8ed1ab_0.conda#8fa8358d022a3a9bd101384a808044c6 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 -https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.3.0-pyhd8ed1ab_0.conda#c18d2ba7577cdc618a20d45f1e31d14b +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_0.conda#8462b5322567212beeb025f3519fb3e2 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda#2c11aa96ea85ced419de710c1c3a78ff https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda#daddf757c3ecd6067b9af1df1f25d89e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac @@ -122,18 +113,19 @@ https://conda.anaconda.org/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda#9614359868482abba1bd15ce465e3c42 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py314h97ea11e_0.conda#7397e418cab519b8d789936cf2dde6f6 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-6_h0358290_openblas.conda#36ae340a916635b97ac8a0655ace2a35 -https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h47877c9_openblas.conda#881d801569b201c2e753f03c84b85e15 +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_0.conda#f92f984b558e6e6204014b16d212b271 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h4a7cf45_openblas.conda#6d6d225559bfa6e2f3c90ee9c03d4e2e +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.20.0-hcf29cc6_0.conda#c3cc2864f82a944bc90a7beb4d3b0e88 +https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda#995d8c8bad2a3cc8db14675a153dec2b https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda#9a17c4307d23318476d7fbf0fedc0cde https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 -https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda#b8ae38639d323d808da535fb71e31be8 -https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py314h8ec4b1a_0.conda#76c4757c0ec9d11f969e8eb44899307b -https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh145f28c_0.conda#09a970fbf75e8ed1aa633827ded6aa4f +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd +https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda#4c06a92e74452cfa53623a81592e8934 +https://conda.anaconda.org/conda-forge/noarch/pip-26.1.1-pyh145f28c_0.conda#2e7e59a063366f1fc4f45ac86bd9485f https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda#89c0b6d1793601a2a3a3f7d2d3d8b937 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda#d7585b6550ad04c8c5e21097ada2888e -https://conda.anaconda.org/conda-forge/linux-64/proj-9.8.1-he0df7b0_0.conda#b23619e5e9009eaa070ead0342034027 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda#16c18772b340887160c79a6acc022db0 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda#3687cc0b82a8b4c17e1f0eb7e47163d5 @@ -152,67 +144,75 @@ https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda#3 https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda#c07a6153f8306e45794774cf9b13bd32 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py314h5bd0f2a_0.conda#494fdf358c152f9fdd0673c128c2f3dd -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.7-hb03c661_0.conda#665d152b9c6e78da404086088077c844 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda#34e54f03dfea3e7a2dcf1453a85f1085 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda#e1c36c6121a7c9c76f2f148f1e83b983 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.11.5-h6d69fc9_5.conda#4c5c16bf1133dcfe100f33dd4470998e +https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-ha62d5e7_3.conda#55eaf7066da1299d217ab32baedc7fa8 https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda#cf45f4278afd6f4e6d03eda0f435d527 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.5-py314h67df5f8_0.conda#78f547b78ace7541c4f54c4268ac9d2e https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda#8e662bd460bda79b1ea39194e3c4c9ab https://conda.anaconda.org/conda-forge/noarch/fonttools-4.62.1-pyh7db6752_0.conda#14cf1ac7a1e29553c6918f7860aab6d8 -https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-h215f996_4.conda#b39dccf5af984bcb68ee2aa0f3213ea6 https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda#b8993c19b0c32a2f7b66cbb58ca27069 https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda#080594bf4493e6bae2607e65390c520a https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda#0ba6225c279baf7ea9473a62ea0ec9ae https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda#04558c96691bed63104678757beb4f8d +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-6_h0358290_openblas.conda#36ae340a916635b97ac8a0655ace2a35 +https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h47877c9_openblas.conda#881d801569b201c2e753f03c84b85e15 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda#eb52d14a901e23c39e9e7b4a1a5c015f -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda#36f5b7eb328bdc204954a2225cf908e2 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py314h7ce3bca_4.conda#d5d862492bbd0f4be1f6d57289459066 +https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py314h8ec4b1a_0.conda#76c4757c0ec9d11f969e8eb44899307b +https://conda.anaconda.org/conda-forge/linux-64/proj-9.8.1-he0df7b0_0.conda#b23619e5e9009eaa070ead0342034027 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 -https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.2-pyhcf101f3_0.conda#feb2e11368da12d6ce473b6573efab41 +https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.3.0-pyhcf101f3_0.conda#696db6f25e56c0fafdccb0a7426fffb6 https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.4-h4df99d1_100.conda#e4e60721757979d01d3964122f674959 https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda#28687768633154993d521aecfa4a56ac https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.7-hb03c661_0.conda#665d152b9c6e78da404086088077c844 https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f https://conda.anaconda.org/conda-forge/noarch/anyio-4.13.0-pyhcf101f3_0.conda#af2df4b9108808da3dc76710fe50eae2 -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py314hc02f841_1.conda#552b5d9d8a2a4be882e1c638953e7281 -https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py314h97ea11e_4.conda#95bede9cdb7a30a4b611223d52a01aa4 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.2-he6ee468_1.conda#50ae8372984b8b98e056ac8f6b70ab29 https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda#809f4cde7c853f437becc43415a2ecdf -https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_hd4fcb43_104.conda#1d92558abd05cea0577f83a5eca38733 -https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.9-h1588d4d_1.conda#115ecf05370670f93bc81a8c4f7fd57f -https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py314hc02f841_2.conda#55ac6d85f5dd8ec5e9919e7762fcb31a +https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-h215f996_4.conda#b39dccf5af984bcb68ee2aa0f3213ea6 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda#36f5b7eb328bdc204954a2225cf908e2 +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py314h7ce3bca_4.conda#d5d862492bbd0f4be1f6d57289459066 https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda#6a991452eadf2771952f39d43615bb3e -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py314hf07bd8e_0.conda#d0510124f87c75403090e220db1e9d41 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0.conda#e2e4d7094d0580ccd62e2a41947444f3 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py314hbe3edd8_2.conda#5963e6ee81772d450a35e6bc95522761 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py314h9891dd4_0.conda#5d3c008e54c7f49592fca9c32896a76f -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda#9272daa869e03efe68833e3dc7a02130 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.2.4-pyhcf101f3_0.conda#15be1b64e7a4501abb4f740c28ceadaf +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda#cbb88288f74dbe6ada1c6c7d0a97223e +https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.3.1-pyhcf101f3_0.conda#dd6a1f3ce9d1cfa8b5b1b32953a80a55 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py314h0f05182_1.conda#2930a6e1c7b3bc5f66172e324a8f5fc3 -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.1-py314hc02f841_0.conda#de50a60eab348de04809a33e180b4b01 +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py314hc02f841_1.conda#552b5d9d8a2a4be882e1c638953e7281 +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py314h97ea11e_4.conda#95bede9cdb7a30a4b611223d52a01aa4 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_h87a9417_105.conda#0d0595612fa229dddb5fc565c260a11f https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb https://conda.anaconda.org/conda-forge/noarch/identify-2.6.19-pyhd8ed1ab_0.conda#84a3233b709a289a4ddd7a2fd27dd988 -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.10.0-nompi_h3c9b436_104.conda#6d38346d49e4638ec98649121d295d54 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.9-py314h1194b4b_0.conda#11a821746ad11e642fcc615c3d66aa44 +https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.9-h1588d4d_1.conda#115ecf05370670f93bc81a8c4f7fd57f +https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py314hc02f841_2.conda#55ac6d85f5dd8ec5e9919e7762fcb31a https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda#67d1790eefa81ed305b89d8e314c7923 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_1.conda#9659f587a8ceacc21864260acd02fc67 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py314hf07bd8e_0.conda#d0510124f87c75403090e220db1e9d41 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 -https://conda.anaconda.org/conda-forge/noarch/tox-4.52.1-pyhcf101f3_0.conda#4e613772846d96b2fe8793ffdacadbad -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py314ha0b5721_1.conda#fe89c5fa422f215b0d75046ecd4667de +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py314hbe3edd8_2.conda#5963e6ee81772d450a35e6bc95522761 +https://conda.anaconda.org/conda-forge/noarch/tox-4.53.1-pyhcf101f3_0.conda#e01a2e7633841c0cd15e93e1a8c2dfcc +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.1-py314hc02f841_0.conda#de50a60eab348de04809a33e180b4b01 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.46.0-ha1d8304_2.conda#a6f0fd37646b5dedc6f52daa609f1aec https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py311h498b1eb_107.conda#7f5488cf61943e6221325b454c2c2e9c +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.10.0-nompi_h3c9b436_104.conda#6d38346d49e4638ec98649121d295d54 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.9-py314h1194b4b_0.conda#11a821746ad11e642fcc615c3d66aa44 https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.6.0-pyha770c72_0.conda#7859736b4f8ebe6c8481bf48d91c9a1e +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py314ha0b5721_1.conda#fe89c5fa422f215b0d75046ecd4667de +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.47.0-ha1d8304_0.conda#3ef42f61d9a66a0749cbe598b5acdeea +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py311h498b1eb_107.conda#7f5488cf61943e6221325b454c2c2e9c +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.5.4-pyhd8ed1ab_0.conda#e61c46481c176f01af41186667401131 https://conda.anaconda.org/conda-forge/noarch/iris-3.15.0-pyha770c72_0.conda#bfe6588cbbd6e2e97e9439f95de02af8 -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.4.7-pyhd8ed1ab_0.conda#c93d5115d0c2782415a054db063a9d1d -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.46.0-np2py314h56abb78_0.conda#8da2d87e5f1c73ec72c5e827d3df2033 https://conda.anaconda.org/conda-forge/noarch/nox-2026.4.10-pyhc364b38_0.conda#10df85d0d06301e961c8b27805f66a56 +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.47.0-np2py314h56abb78_0.conda#a1d80eb92819fdbdc748451545ec95aa https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda#16e3f039c0aa6446513e94ab18a8784b https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda#910f28a05c178feba832f842155cbfff https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda#e9fb3fe8a5b758b4aff187d434f94f03 From 537eaba547cb99033dff5b5928925169de8f95b2 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Mon, 18 May 2026 11:49:11 +0100 Subject: [PATCH 567/583] Updated environment lockfiles (#792) Co-authored-by: Lockfile bot --- requirements/locks/py312-linux-64.lock | 26 +++++++++++++------------- requirements/locks/py313-linux-64.lock | 26 +++++++++++++------------- requirements/locks/py314-linux-64.lock | 26 +++++++++++++------------- 3 files changed, 39 insertions(+), 39 deletions(-) diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 2ac4300a..08b4ddb5 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -74,7 +74,7 @@ https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda#fb5 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda#e289f3d17880e44b633ba911d57a321b https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda#2a45e7f8af083626f009645a6481f12d -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda#89d61bc91d3f39fda0ca10fcd3c68594 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.33-pthreads_h94d23a6_0.conda#2d3278b721e40468295ca755c3b84070 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#cd5a90476766d53e901500df9215e927 https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda#e79d2c2f24b027aa8d5ab1b1ba3061e7 https://conda.anaconda.org/conda-forge/linux-64/python-3.12.13-hd63d673_0_cpython.conda#7eccb41177e15cc672e1babe9056018e @@ -87,7 +87,7 @@ https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda#c6b0543676ecb1fb2d7643941fe375f2 https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.13-h4bacb7b_0.conda#77f70a9ab785a146dbf66fba00131403 https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda#f1976ce927373500cc19d3c0b2c85177 -https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.4.0-py312h90b7ffd_0.conda#542da724e75cdeef19e29cca23935c25 +https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.5.0-py312h90b7ffd_0.conda#b31dba71fe091e7201826e57e0f7b261 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda#8ccf913aaba749a5496c17629d859ed1 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py312hdb49522_1.conda#64088dffd7413a2dd557ce837b4cbbdb https://conda.anaconda.org/conda-forge/noarch/cachetools-7.1.1-pyhd8ed1ab_0.conda#bf63d5c36d9cfee27b7929aff260140b @@ -115,7 +115,7 @@ https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py312h0a2e395_0.conda#cd74a9525dc74bbbf93cf8aa2fa9eb5b https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_0.conda#f92f984b558e6e6204014b16d212b271 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h4a7cf45_openblas.conda#6d6d225559bfa6e2f3c90ee9c03d4e2e +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-7_h4a7cf45_openblas.conda#955b44e8b00b7f7ef4ce0130cef12394 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.20.0-hcf29cc6_0.conda#c3cc2864f82a944bc90a7beb4d3b0e88 https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda#995d8c8bad2a3cc8db14675a153dec2b @@ -149,25 +149,25 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0. https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda#e1c36c6121a7c9c76f2f148f1e83b983 https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-ha62d5e7_3.conda#55eaf7066da1299d217ab32baedc7fa8 https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py312h460c074_1.conda#648ee28dcd4e07a1940a17da62eccd40 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.5-py312h8a5da7c_0.conda#c4d858e15305e70b255e756a4dc96e58 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.14.0-py312h8a5da7c_0.conda#c78de13127e71cb1e581f473ac76f360 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda#8e662bd460bda79b1ea39194e3c4c9ab -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.62.1-py312h8a5da7c_0.conda#2396fee22e84f69dffc6e23135905ce8 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py312h8a5da7c_0.conda#294fb524171e2a2748cb7fe708aba826 https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda#b8993c19b0c32a2f7b66cbb58ca27069 https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda#080594bf4493e6bae2607e65390c520a https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda#0ba6225c279baf7ea9473a62ea0ec9ae https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda#04558c96691bed63104678757beb4f8d -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-6_h0358290_openblas.conda#36ae340a916635b97ac8a0655ace2a35 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-7_h0358290_openblas.conda#0675639dc24cb0032f199e7ff68e4633 https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h47877c9_openblas.conda#881d801569b201c2e753f03c84b85e15 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-7_h47877c9_openblas.conda#6569b4f273740e25dc0dc7e3232c2a6c https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda#eb52d14a901e23c39e9e7b4a1a5c015f https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py312h50c33e8_0.conda#9e5609720e31213d4f39afe377f6217e https://conda.anaconda.org/conda-forge/linux-64/proj-9.8.1-he0df7b0_0.conda#b23619e5e9009eaa070ead0342034027 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 -https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.3.0-pyhcf101f3_0.conda#696db6f25e56c0fafdccb0a7426fffb6 +https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.3.1-pyhcf101f3_0.conda#45ea5eceb1c2e35a08a834869837a090 https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.13-hd8ed1ab_0.conda#32780d6794b8056b78602103a04e90ef https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda#28687768633154993d521aecfa4a56ac https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 @@ -179,14 +179,14 @@ https://conda.anaconda.org/conda-forge/noarch/anyio-4.13.0-pyhcf101f3_0.conda#af https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.2-he6ee468_1.conda#50ae8372984b8b98e056ac8f6b70ab29 https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda#809f4cde7c853f437becc43415a2ecdf https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-h215f996_4.conda#b39dccf5af984bcb68ee2aa0f3213ea6 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py312h33ff503_0.conda#5930ee8a175a242b4f001b1e9e72024f +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.4-py312h33ff503_0.conda#98f04b59a222970c45c78208aeac8df8 https://conda.anaconda.org/conda-forge/noarch/pip-26.1.1-pyh8b19718_0.conda#35870d32aed92041d31cbb15e822dca3 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py312hbc8341d_4.conda#9d5ea11aefbdf548a2d8c965c1b2ebad https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda#6a991452eadf2771952f39d43615bb3e https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0.conda#e2e4d7094d0580ccd62e2a41947444f3 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py312hd9148b4_0.conda#55fd03988b1b1bc6faabbfb5b481ecd7 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda#cbb88288f74dbe6ada1c6c7d0a97223e -https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.3.1-pyhcf101f3_0.conda#dd6a1f3ce9d1cfa8b5b1b32953a80a55 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.3.3-pyhcf101f3_0.conda#a678237f7d0db44f8a20a21f03844613 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py312h5253ce2_1.conda#02738ff9855946075cbd1b5274399a41 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py312h4f23490_1.conda#84bf349fad55056ed326fc550671b65c https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda#43c2bc96af3ae5ed9e8a10ded942aa50 @@ -197,11 +197,11 @@ https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.9-h1588d4d_1.conda#11 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h4f23490_2.conda#cec5bc5f7d374f8f8095f8e28e31f6cb https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda#67d1790eefa81ed305b89d8e314c7923 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 -https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_1.conda#9659f587a8ceacc21864260acd02fc67 +https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda#4a85203c1d80c1059086ae860836ffb9 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py312h54fa4ab_0.conda#3e38daeb1fb05a95656ff5af089d2e4c https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py312h383787d_2.conda#69e400d3deca12ee7afd4b73a5596905 -https://conda.anaconda.org/conda-forge/noarch/tox-4.53.1-pyhcf101f3_0.conda#e01a2e7633841c0cd15e93e1a8c2dfcc +https://conda.anaconda.org/conda-forge/noarch/tox-4.54.0-pyhcf101f3_0.conda#bbeeaedbb3f7a83859af44c8ce461bbe https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.1-py312h4f23490_0.conda#6aef45ba3c0123547eb7b0f15852cac9 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 @@ -211,7 +211,7 @@ https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.6.0-pyha770c72_0.cond https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py312hf79963d_1.conda#6c913a686cb4060cbd7639a36fa144f0 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.47.0-ha1d8304_0.conda#3ef42f61d9a66a0749cbe598b5acdeea https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py311h498b1eb_107.conda#7f5488cf61943e6221325b454c2c2e9c -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.5.4-pyhd8ed1ab_0.conda#e61c46481c176f01af41186667401131 +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.5.10-pyhd8ed1ab_0.conda#cee830ab52204b8d999bd54e84ccf328 https://conda.anaconda.org/conda-forge/noarch/iris-3.15.0-pyha770c72_0.conda#bfe6588cbbd6e2e97e9439f95de02af8 https://conda.anaconda.org/conda-forge/noarch/nox-2026.4.10-pyhc364b38_0.conda#10df85d0d06301e961c8b27805f66a56 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.47.0-np2py312hfb8c2c5_0.conda#614309c6287d4edebffa95dc983241d3 diff --git a/requirements/locks/py313-linux-64.lock b/requirements/locks/py313-linux-64.lock index b62f88ca..22be009e 100644 --- a/requirements/locks/py313-linux-64.lock +++ b/requirements/locks/py313-linux-64.lock @@ -73,7 +73,7 @@ https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda#fb5 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda#e289f3d17880e44b633ba911d57a321b https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda#2a45e7f8af083626f009645a6481f12d -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda#89d61bc91d3f39fda0ca10fcd3c68594 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.33-pthreads_h94d23a6_0.conda#2d3278b721e40468295ca755c3b84070 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#cd5a90476766d53e901500df9215e927 https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda#e79d2c2f24b027aa8d5ab1b1ba3061e7 https://conda.anaconda.org/conda-forge/linux-64/python-3.13.13-h6add32d_100_cp313.conda#05051be49267378d2fcd12931e319ac3 @@ -86,7 +86,7 @@ https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda#c6b0543676ecb1fb2d7643941fe375f2 https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.13-h4bacb7b_0.conda#77f70a9ab785a146dbf66fba00131403 https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda#f1976ce927373500cc19d3c0b2c85177 -https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.4.0-py313h18e8e13_0.conda#cfe95f3eab50bc3dbd4c3a03f2674bd8 +https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.5.0-py313h18e8e13_0.conda#0de0c2c1f2677ea074bdda91de5a4c01 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda#8ccf913aaba749a5496c17629d859ed1 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py313hf159716_1.conda#6c4d3597cf43f3439a51b2b13e29a4ba https://conda.anaconda.org/conda-forge/noarch/cachetools-7.1.1-pyhd8ed1ab_0.conda#bf63d5c36d9cfee27b7929aff260140b @@ -114,7 +114,7 @@ https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py313hc8edb43_0.conda#b81883b9dbf5069821c2fb09a8ba1407 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_0.conda#f92f984b558e6e6204014b16d212b271 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h4a7cf45_openblas.conda#6d6d225559bfa6e2f3c90ee9c03d4e2e +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-7_h4a7cf45_openblas.conda#955b44e8b00b7f7ef4ce0130cef12394 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.20.0-hcf29cc6_0.conda#c3cc2864f82a944bc90a7beb4d3b0e88 https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda#995d8c8bad2a3cc8db14675a153dec2b @@ -148,25 +148,25 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0. https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda#e1c36c6121a7c9c76f2f148f1e83b983 https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-ha62d5e7_3.conda#55eaf7066da1299d217ab32baedc7fa8 https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py313hf46b229_1.conda#d0616e7935acab407d1543b28c446f6f -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.5-py313h3dea7bd_0.conda#acbda45380f5097ade59014704eb0ba0 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.14.0-py313h3dea7bd_0.conda#49352192f1cf61e88e320a319b86b649 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda#8e662bd460bda79b1ea39194e3c4c9ab -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.62.1-py313h3dea7bd_0.conda#98082dfa338d9f0dca885e4865c69a20 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py313h3dea7bd_0.conda#ae83c999b4cfc4c171ce88b99c8b43cc https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda#b8993c19b0c32a2f7b66cbb58ca27069 https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda#080594bf4493e6bae2607e65390c520a https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda#0ba6225c279baf7ea9473a62ea0ec9ae https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda#04558c96691bed63104678757beb4f8d -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-6_h0358290_openblas.conda#36ae340a916635b97ac8a0655ace2a35 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-7_h0358290_openblas.conda#0675639dc24cb0032f199e7ff68e4633 https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h47877c9_openblas.conda#881d801569b201c2e753f03c84b85e15 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-7_h47877c9_openblas.conda#6569b4f273740e25dc0dc7e3232c2a6c https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda#eb52d14a901e23c39e9e7b4a1a5c015f https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py313h80991f8_0.conda#7245f1bbf52ed5e3818d742f51b44a7d https://conda.anaconda.org/conda-forge/linux-64/proj-9.8.1-he0df7b0_0.conda#b23619e5e9009eaa070ead0342034027 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 -https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.3.0-pyhcf101f3_0.conda#696db6f25e56c0fafdccb0a7426fffb6 +https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.3.1-pyhcf101f3_0.conda#45ea5eceb1c2e35a08a834869837a090 https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.13-h4df99d1_100.conda#fd00e4b24ea88093c93f5c9bad27b52f https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda#28687768633154993d521aecfa4a56ac https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 @@ -177,13 +177,13 @@ https://conda.anaconda.org/conda-forge/noarch/anyio-4.13.0-pyhcf101f3_0.conda#af https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.2-he6ee468_1.conda#50ae8372984b8b98e056ac8f6b70ab29 https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda#809f4cde7c853f437becc43415a2ecdf https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-h215f996_4.conda#b39dccf5af984bcb68ee2aa0f3213ea6 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py313hf6604e3_0.conda#c4a9d2e77eb9fee983a70cf5f047c202 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.4-py313hf6604e3_0.conda#d66c057bf1ecaff2183d1c269268aead https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py313he648cc1_4.conda#fe69af9ea9bb222c067bca5888e5aabe https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda#6a991452eadf2771952f39d43615bb3e https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0.conda#e2e4d7094d0580ccd62e2a41947444f3 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py313h7037e92_0.conda#cb423e0853b3dde2b3738db4dedf5ba2 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda#cbb88288f74dbe6ada1c6c7d0a97223e -https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.3.1-pyhcf101f3_0.conda#dd6a1f3ce9d1cfa8b5b1b32953a80a55 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.3.3-pyhcf101f3_0.conda#a678237f7d0db44f8a20a21f03844613 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py313h54dd161_1.conda#710d4663806d0f72b2fb414e936223b5 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py313h29aa505_1.conda#c63d5f9d63fe2f48b0ad75005fcae7ba https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py313hc8edb43_4.conda#33639459bc29437315d4bff9ed5bc7a7 @@ -194,11 +194,11 @@ https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.9-h1588d4d_1.conda#11 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py313h29aa505_2.conda#ad53894d278895bf15c8fc324727d224 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda#67d1790eefa81ed305b89d8e314c7923 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 -https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_1.conda#9659f587a8ceacc21864260acd02fc67 +https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda#4a85203c1d80c1059086ae860836ffb9 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py313h4b8bb8b_0.conda#ec81bc03787968decae6765c7f61b7cf https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py313had47c43_2.conda#6e550dd748e9ac9b2925411684e076a1 -https://conda.anaconda.org/conda-forge/noarch/tox-4.53.1-pyhcf101f3_0.conda#e01a2e7633841c0cd15e93e1a8c2dfcc +https://conda.anaconda.org/conda-forge/noarch/tox-4.54.0-pyhcf101f3_0.conda#bbeeaedbb3f7a83859af44c8ce461bbe https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.1-py313h29aa505_0.conda#3942b6a86fe92d0888b3373f2c1e1676 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 @@ -208,7 +208,7 @@ https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.6.0-pyha770c72_0.cond https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py313h08cd8bf_1.conda#a0d8dc5c90850d9f1a79f69c98aef0ff https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.47.0-ha1d8304_0.conda#3ef42f61d9a66a0749cbe598b5acdeea https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py311h498b1eb_107.conda#7f5488cf61943e6221325b454c2c2e9c -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.5.4-pyhd8ed1ab_0.conda#e61c46481c176f01af41186667401131 +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.5.10-pyhd8ed1ab_0.conda#cee830ab52204b8d999bd54e84ccf328 https://conda.anaconda.org/conda-forge/noarch/iris-3.15.0-pyha770c72_0.conda#bfe6588cbbd6e2e97e9439f95de02af8 https://conda.anaconda.org/conda-forge/noarch/nox-2026.4.10-pyhc364b38_0.conda#10df85d0d06301e961c8b27805f66a56 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.47.0-np2py313hc18bace_0.conda#5ac58ad77ebc56ba99f965562315a69c diff --git a/requirements/locks/py314-linux-64.lock b/requirements/locks/py314-linux-64.lock index d445b9fb..67f0bda7 100644 --- a/requirements/locks/py314-linux-64.lock +++ b/requirements/locks/py314-linux-64.lock @@ -73,7 +73,7 @@ https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda#fb5 https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda#e289f3d17880e44b633ba911d57a321b https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda#2a45e7f8af083626f009645a6481f12d -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda#89d61bc91d3f39fda0ca10fcd3c68594 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.33-pthreads_h94d23a6_0.conda#2d3278b721e40468295ca755c3b84070 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#cd5a90476766d53e901500df9215e927 https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda#e79d2c2f24b027aa8d5ab1b1ba3061e7 https://conda.anaconda.org/conda-forge/linux-64/python-3.14.4-habeac84_100_cp314.conda#a443f87920815d41bfe611296e507995 @@ -86,7 +86,7 @@ https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda#c6b0543676ecb1fb2d7643941fe375f2 https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.13-h4bacb7b_0.conda#77f70a9ab785a146dbf66fba00131403 https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda#f1976ce927373500cc19d3c0b2c85177 -https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.4.0-py314h680f03e_0.conda#b712198b257f378e9bd8cde277218296 +https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda#1133126d840e75287d83947be3fc3e71 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda#8ccf913aaba749a5496c17629d859ed1 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda#8910d2c46f7e7b519129f486e0fe927a https://conda.anaconda.org/conda-forge/noarch/cachetools-7.1.1-pyhd8ed1ab_0.conda#bf63d5c36d9cfee27b7929aff260140b @@ -114,7 +114,7 @@ https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py314h97ea11e_0.conda#7397e418cab519b8d789936cf2dde6f6 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_0.conda#f92f984b558e6e6204014b16d212b271 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h4a7cf45_openblas.conda#6d6d225559bfa6e2f3c90ee9c03d4e2e +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-7_h4a7cf45_openblas.conda#955b44e8b00b7f7ef4ce0130cef12394 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.20.0-hcf29cc6_0.conda#c3cc2864f82a944bc90a7beb4d3b0e88 https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda#995d8c8bad2a3cc8db14675a153dec2b @@ -149,25 +149,25 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0. https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda#e1c36c6121a7c9c76f2f148f1e83b983 https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-ha62d5e7_3.conda#55eaf7066da1299d217ab32baedc7fa8 https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda#cf45f4278afd6f4e6d03eda0f435d527 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.5-py314h67df5f8_0.conda#78f547b78ace7541c4f54c4268ac9d2e +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.14.0-py314h67df5f8_0.conda#7f8715a1928f6f126323320a4c5ada3a https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda#8e662bd460bda79b1ea39194e3c4c9ab -https://conda.anaconda.org/conda-forge/noarch/fonttools-4.62.1-pyh7db6752_0.conda#14cf1ac7a1e29553c6918f7860aab6d8 +https://conda.anaconda.org/conda-forge/noarch/fonttools-4.63.0-pyh7db6752_0.conda#0509ee74d95e5b98eb6fe2a47760e399 https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda#b8993c19b0c32a2f7b66cbb58ca27069 https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda#080594bf4493e6bae2607e65390c520a https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda#0ba6225c279baf7ea9473a62ea0ec9ae https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda#04558c96691bed63104678757beb4f8d -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-6_h0358290_openblas.conda#36ae340a916635b97ac8a0655ace2a35 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-7_h0358290_openblas.conda#0675639dc24cb0032f199e7ff68e4633 https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h47877c9_openblas.conda#881d801569b201c2e753f03c84b85e15 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-7_h47877c9_openblas.conda#6569b4f273740e25dc0dc7e3232c2a6c https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda#eb52d14a901e23c39e9e7b4a1a5c015f https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py314h8ec4b1a_0.conda#76c4757c0ec9d11f969e8eb44899307b https://conda.anaconda.org/conda-forge/linux-64/proj-9.8.1-he0df7b0_0.conda#b23619e5e9009eaa070ead0342034027 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 -https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.3.0-pyhcf101f3_0.conda#696db6f25e56c0fafdccb0a7426fffb6 +https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.3.1-pyhcf101f3_0.conda#45ea5eceb1c2e35a08a834869837a090 https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.4-h4df99d1_100.conda#e4e60721757979d01d3964122f674959 https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda#28687768633154993d521aecfa4a56ac https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 @@ -178,13 +178,13 @@ https://conda.anaconda.org/conda-forge/noarch/anyio-4.13.0-pyhcf101f3_0.conda#af https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.2-he6ee468_1.conda#50ae8372984b8b98e056ac8f6b70ab29 https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda#809f4cde7c853f437becc43415a2ecdf https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-h215f996_4.conda#b39dccf5af984bcb68ee2aa0f3213ea6 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda#36f5b7eb328bdc204954a2225cf908e2 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.4-py314h2b28147_0.conda#c8f3b508487aeb903fd6b75e3573a0cb https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py314h7ce3bca_4.conda#d5d862492bbd0f4be1f6d57289459066 https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda#6a991452eadf2771952f39d43615bb3e https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0.conda#e2e4d7094d0580ccd62e2a41947444f3 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py314h9891dd4_0.conda#5d3c008e54c7f49592fca9c32896a76f https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda#cbb88288f74dbe6ada1c6c7d0a97223e -https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.3.1-pyhcf101f3_0.conda#dd6a1f3ce9d1cfa8b5b1b32953a80a55 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.3.3-pyhcf101f3_0.conda#a678237f7d0db44f8a20a21f03844613 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py314h0f05182_1.conda#2930a6e1c7b3bc5f66172e324a8f5fc3 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py314hc02f841_1.conda#552b5d9d8a2a4be882e1c638953e7281 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py314h97ea11e_4.conda#95bede9cdb7a30a4b611223d52a01aa4 @@ -195,11 +195,11 @@ https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.9-h1588d4d_1.conda#11 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py314hc02f841_2.conda#55ac6d85f5dd8ec5e9919e7762fcb31a https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda#67d1790eefa81ed305b89d8e314c7923 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 -https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_1.conda#9659f587a8ceacc21864260acd02fc67 +https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda#4a85203c1d80c1059086ae860836ffb9 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py314hf07bd8e_0.conda#d0510124f87c75403090e220db1e9d41 https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py314hbe3edd8_2.conda#5963e6ee81772d450a35e6bc95522761 -https://conda.anaconda.org/conda-forge/noarch/tox-4.53.1-pyhcf101f3_0.conda#e01a2e7633841c0cd15e93e1a8c2dfcc +https://conda.anaconda.org/conda-forge/noarch/tox-4.54.0-pyhcf101f3_0.conda#bbeeaedbb3f7a83859af44c8ce461bbe https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.1-py314hc02f841_0.conda#de50a60eab348de04809a33e180b4b01 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 @@ -209,7 +209,7 @@ https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.6.0-pyha770c72_0.cond https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py314ha0b5721_1.conda#fe89c5fa422f215b0d75046ecd4667de https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.47.0-ha1d8304_0.conda#3ef42f61d9a66a0749cbe598b5acdeea https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py311h498b1eb_107.conda#7f5488cf61943e6221325b454c2c2e9c -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.5.4-pyhd8ed1ab_0.conda#e61c46481c176f01af41186667401131 +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.5.10-pyhd8ed1ab_0.conda#cee830ab52204b8d999bd54e84ccf328 https://conda.anaconda.org/conda-forge/noarch/iris-3.15.0-pyha770c72_0.conda#bfe6588cbbd6e2e97e9439f95de02af8 https://conda.anaconda.org/conda-forge/noarch/nox-2026.4.10-pyhc364b38_0.conda#10df85d0d06301e961c8b27805f66a56 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.47.0-np2py314h56abb78_0.conda#a1d80eb92819fdbdc748451545ec95aa From bff586d1749b8c7d1119fb3a82c7d89098d44abf Mon Sep 17 00:00:00 2001 From: Martin Yeo <40734014+trexfeathers@users.noreply.github.com> Date: Thu, 4 Jun 2026 13:57:07 +0100 Subject: [PATCH 568/583] Switch to the standard Lychee link check (#795) * Switch to the standard lychee link check. * Remove legacy linkcheck config. * README badge. * Remove linkcheck from Makefiles. --- .github/workflows/ci-linkchecks.yml | 50 +++++++++++++++++++++++++++++ .github/workflows/ci-tests.yml | 2 +- .lycheeignore | 10 ++++++ README.md | 2 +- docs/Makefile | 8 ----- docs/conf.py | 9 ------ docs/make.bat | 10 ------ docs/reference/release_notes.rst | 12 +++++++ noxfile.py | 26 --------------- 9 files changed, 74 insertions(+), 55 deletions(-) create mode 100644 .github/workflows/ci-linkchecks.yml create mode 100644 .lycheeignore diff --git a/.github/workflows/ci-linkchecks.yml b/.github/workflows/ci-linkchecks.yml new file mode 100644 index 00000000..1771ec59 --- /dev/null +++ b/.github/workflows/ci-linkchecks.yml @@ -0,0 +1,50 @@ +name: Linkcheck + +on: + workflow_dispatch: + schedule: + - cron: "00 06 * * *" + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + linkChecker: + runs-on: ubuntu-latest + permissions: + issues: write # required for peter-evans/create-issue-from-file + + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + persist-credentials: false + + - name: Link Checker + id: lychee + uses: lycheeverse/lychee-action@8646ba30535128ac92d33dfc9133794bfdd9b411 + with: + token: ${{secrets.GITHUB_TOKEN}} + fail: false + args: | + --verbose + --max-concurrency 1 + './docs/**/*.rst' + './lib/**/*.py' + + - name: Create Issue From File + if: ${{ fromJSON(steps.lychee.outputs.exit_code) != 0 }} + uses: peter-evans/create-issue-from-file@fca9117c27cdc29c6c4db3b86c48e4115a786710 + with: + title: Link Checker Report + content-filepath: ./lychee/out.md + labels: | + Bot + Type: Documentation + Type: Bug + + - name: Fail Workflow On Link Errors + if: ${{ fromJSON(steps.lychee.outputs.exit_code) != 0 }} + run: + exit ${{ fromJSON(steps.lychee.outputs.exit_code) }} diff --git a/.github/workflows/ci-tests.yml b/.github/workflows/ci-tests.yml index 0d5c205f..cc6f09e8 100644 --- a/.github/workflows/ci-tests.yml +++ b/.github/workflows/ci-tests.yml @@ -36,7 +36,7 @@ jobs: matrix: os: ["ubuntu-latest"] python-version: ["3.14"] - session: ["doctest", "linkcheck"] + session: ["doctest"] iris-source : ["conda-forge"] include: - os: "ubuntu-latest" diff --git a/.lycheeignore b/.lycheeignore new file mode 100644 index 00000000..eb3c2bb1 --- /dev/null +++ b/.lycheeignore @@ -0,0 +1,10 @@ +# Change-log entries reference GitHub user accounts, which are common enough +# to trigger GitHub rate limiting. +https://github.com/[^/]*$ + +# GitHub seems especially keen to rate-limit "blob" URLs. +# (maybe because these are especially associated with abuse?) +https://github.com/[^/]*/[^/]*/blob/.* + +# Returns 403 when accessed from GitHub Actions +https://stackoverflow.com \ No newline at end of file diff --git a/README.md b/README.md index 14412ad0..baddfa6d 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ |------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | ⚙️ CI | [![ci-manifest](https://github.com/SciTools/iris-grib/actions/workflows/ci-manifest.yml/badge.svg)](https://github.com/SciTools/iris-grib/actions/workflows/ci-manifest.yml) [![ci-tests](https://github.com/SciTools/iris-grib/actions/workflows/ci-tests.yml/badge.svg)](https://github.com/SciTools/iris-grib/actions/workflows/ci-tests.yml) [![pre-commit](https://results.pre-commit.ci/badge/github/SciTools/iris-grib/main.svg)](https://results.pre-commit.ci/latest/github/SciTools/iris-grib/main) | | 💬 Community | [![Contributor Covenant](https://img.shields.io/badge/contributor%20covenant-2.1-4baaaa.svg)](https://www.contributor-covenant.org/version/2/1/code_of_conduct/) [![GH Discussions](https://img.shields.io/badge/github-discussions%20%F0%9F%92%AC-yellow?logo=github&logoColor=lightgrey)](https://github.com/SciTools/iris-grib/discussions) | -| 📖 Documentation | [![rtd](https://readthedocs.org/projects/iris-grib/badge/?version=latest)](https://iris-grib.readthedocs.io/en/latest/?badge=latest) | +| 📖 Documentation | [![rtd](https://readthedocs.org/projects/iris-grib/badge/?version=latest)](https://iris-grib.readthedocs.io/en/latest/?badge=latest) [![Check Links](https://github.com/SciTools/iris-grib/actions/workflows/ci-linkchecks.yml/badge.svg)](https://github.com/SciTools/iris-grib/actions/workflows/ci-linkchecks.yml) | | 📈 Health | [![codecov](https://codecov.io/gh/SciTools/iris-grib/graph/badge.svg?token=5VtBaElXFW)](https://codecov.io/gh/SciTools/iris-grib) | | ✨ Meta | [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff) [![NEP29](https://raster.shields.io/badge/follows-NEP29-orange.png)](https://numpy.org/neps/nep-0029-deprecation_policy.html) [![license - bds-3-clause](https://img.shields.io/github/license/SciTools/iris-grib)](https://github.com/SciTools/iris-grib/blob/main/LICENSE) [![conda platform](https://img.shields.io/conda/pn/conda-forge/iris-grib.svg)](https://anaconda.org/conda-forge/iris-grib) | | 📦 Package | [![conda-forge](https://img.shields.io/conda/vn/conda-forge/iris-grib?color=orange&label=conda-forge&logo=conda-forge&logoColor=white)](https://anaconda.org/conda-forge/iris-grib) [![pypi](https://img.shields.io/pypi/v/iris-grib?color=orange&label=pypi&logo=python&logoColor=white)](https://pypi.org/project/iris-grib/) [![pypi - python version](https://img.shields.io/pypi/pyversions/iris-grib.svg?color=orange&logo=python&label=python&logoColor=white)](https://pypi.org/project/iris-grib/) | diff --git a/docs/Makefile b/docs/Makefile index 3dfa5d6c..3f197d11 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -47,7 +47,6 @@ help: @echo " changes to make an overview of all changed/added/deprecated items" @echo " xml to make Docutils-native XML files" @echo " pseudoxml to make pseudoxml-XML files for display purposes" - @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" @echo " coverage to run coverage check of the documentation (if enabled)" @echo " dummy to check syntax errors of document sources" @@ -196,13 +195,6 @@ changes: @echo @echo "The overview file is in $(BUILDDIR)/changes." -.PHONY: linkcheck -linkcheck: - $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck - @echo - @echo "Link check complete; look for any errors in the above output " \ - "or in $(BUILDDIR)/linkcheck/output.txt." - .PHONY: doctest doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest diff --git a/docs/conf.py b/docs/conf.py index 861e0ff6..e6f26ae8 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -101,15 +101,6 @@ # If true, `todo` and `todoList` produce output, else they produce nothing. todo_include_todos = False -# url link checker. Some links registering as faulty, despite being functional. -# See https://www.sphinx-doc.org/en/1.2/config.html[...] -# [...]#options-for-the-linkcheck-builder - -linkcheck_ignore = [ - "https://github.com/Scitools/iris-grib/compare" - "/c4243ae..5c314e3#diff-cf46b46880cae59e82a91c7ab6bb81ba" -] - # -- Autodoc ------------------------------------------------------------------ autodoc_member_order = "groupwise" diff --git a/docs/make.bat b/docs/make.bat index d485d3bc..b567efac 100644 --- a/docs/make.bat +++ b/docs/make.bat @@ -36,7 +36,6 @@ if "%1" == "help" ( echo. changes to make an overview over all changed/added/deprecated items echo. xml to make Docutils-native XML files echo. pseudoxml to make pseudoxml-XML files for display purposes - echo. linkcheck to check all external links for integrity echo. doctest to run all doctests embedded in the documentation if enabled echo. coverage to run coverage check of the documentation if enabled echo. dummy to check syntax errors of document sources @@ -227,15 +226,6 @@ if "%1" == "changes" ( goto end ) -if "%1" == "linkcheck" ( - %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck - if errorlevel 1 exit /b 1 - echo. - echo.Link check complete; look for any errors in the above output ^ -or in %BUILDDIR%/linkcheck/output.txt. - goto end -) - if "%1" == "doctest" ( %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest if errorlevel 1 exit /b 1 diff --git a/docs/reference/release_notes.rst b/docs/reference/release_notes.rst index 946c5c74..381a87f6 100644 --- a/docs/reference/release_notes.rst +++ b/docs/reference/release_notes.rst @@ -3,6 +3,18 @@ Release Notes ============= +What's new in iris-grib v0.23.0 +------------------------------- + +:Release: 0.23.0 +:Date: TBC + +Internal +^^^^^^^^ +* `@trexfeathers `_ switched the link check CI + to be the standard SciTools overnight job using Lychee. + `(PR#795) `_ + What's new in iris-grib v0.22.0 ------------------------------- diff --git a/noxfile.py b/noxfile.py index 6e489e1d..fc347727 100755 --- a/noxfile.py +++ b/noxfile.py @@ -319,31 +319,5 @@ def doctest(session: nox.sessions.Session): ) -@nox.session(python=PY_VER, venv_backend="conda") -def linkcheck(session: nox.sessions.Session): - """ - Perform iris-grib doc link check. - - Parameters - ---------- - session: object - A `nox.sessions.Session` object. - - """ - prepare_venv(session) - session.cd("docs") - session.run( - "make", - "clean", - "html", - external=True, - ) - session.run( - "make", - "linkcheck", - external=True, - ) - - if __name__ == "__main__": nox.main() From 5533e10d1321558c70cdfeccb4588e495cb1f939 Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Thu, 4 Jun 2026 17:07:02 +0100 Subject: [PATCH 569/583] Updated environment lockfiles (#794) Co-authored-by: Lockfile bot Co-authored-by: Patrick Peglar --- requirements/locks/py312-linux-64.lock | 66 +++++++++++------------ requirements/locks/py313-linux-64.lock | 66 +++++++++++------------ requirements/locks/py314-linux-64.lock | 72 +++++++++++++------------- 3 files changed, 102 insertions(+), 102 deletions(-) diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 08b4ddb5..2cb80d02 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -4,12 +4,12 @@ @EXPLICIT https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda#c3efd25ac4d74b1584d2f7a57195ddf1 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda#ad659d0a2b3e47e38d829aa8cad2d610 -https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda#e18ad67cf881dcadee8b8d9e2f8e5f73 -https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda#489b8e97e666c93f68fdb35c3c9b957f +https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_3.conda#eb83f3f8cecc3e9bff9e250817fc69b6 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda#faac990cb7aedc7f3a2224f2c9b0c26c https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda#d87ff7921124eccd67248aa483c23fec https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda#a9f577daf3de00bca7c3c76c0ecbd1de -https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 +https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_3.conda#c2bd8055a2e2dce7a7f32cfd02101fb6 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda#4a13eeac0b5c8e5b8ab496e6c4ddd829 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda#18335a698559cdbcd86150a48bf54ba6 https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda#57736f29cc2b0ec0b6c2952d3f101b6a @@ -19,7 +19,7 @@ https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda#9 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda#72c8fd1af66bd67bf580645b426513ed https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda#6c77a605a7a689d17d4819c0f8ac9a00 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda#a3b390520c563d78cc58974de95a03e5 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_0.conda#93764a5ca80616e9c10106cdaec92f74 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda#a360c33a5abe61c07959e449fa1453eb https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda#331ee9b72b9dff570d56b1302c5ab37d https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.conda#85072b0ad177c966294f129b7c04a2d5 @@ -30,7 +30,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d8 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda#eba48a68a1a2b9d3c0d9511548db85db https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda#7dc38adcbf71e6b38748e919e16e0dce https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda#5794b3bdc38177caf969dabd3af08549 -https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda#38ffe67b78c9d4de527be8315e5ada2c +https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.1-h5347b49_0.conda#7d0a66598195ef00b6efc55aefc7453b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda#fc21868a1a5aacc937e7a18747acb8a5 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda#da1b85b6a87e141f5140bb9924cecab0 @@ -63,10 +63,10 @@ https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.cond https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda#d7d95fc8287ea7bf33e0e7116d2b95ec -https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.2-hc5a330e_1.conda#3f578c7d2b0bb52469340e4060d48d94 +https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.3-hc5a330e_0.conda#f2bd09e21c5844a12e2f5eefcd075555 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda#98b6c9dc80eb87b2519b97bcf7e578dd https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda#2aadb0d17215603a82a2a6b0afd9a4cb -https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-h692f434_1.conda#14260392d0b491c537b5e26e9a506fff +https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-hb18f61d_2.conda#d1337309873c443bcc9f118b67eed84e https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda#af39b9a8711d4a8d437b52c1d78eb6a1 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 @@ -90,11 +90,11 @@ https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda#f1 https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.5.0-py312h90b7ffd_0.conda#b31dba71fe091e7201826e57e0f7b261 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda#8ccf913aaba749a5496c17629d859ed1 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py312hdb49522_1.conda#64088dffd7413a2dd557ce837b4cbbdb -https://conda.anaconda.org/conda-forge/noarch/cachetools-7.1.1-pyhd8ed1ab_0.conda#bf63d5c36d9cfee27b7929aff260140b -https://conda.anaconda.org/conda-forge/noarch/certifi-2026.4.22-pyhd8ed1ab_0.conda#929471569c93acefb30282a22060dcd5 +https://conda.anaconda.org/conda-forge/noarch/cachetools-7.1.4-pyhd8ed1ab_0.conda#fbaa0445bcf8ba9e808c90cbc1235090 +https://conda.anaconda.org/conda-forge/noarch/certifi-2026.5.20-pyhd8ed1ab_0.conda#9fefff2f745ea1cc2ef15211a20c054a https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda#a9167b9571f3baa9d448faa2139d1089 -https://conda.anaconda.org/conda-forge/noarch/click-8.3.3-pyhc90fa1f_0.conda#2266262ce8a425ecb6523d765f79b303 +https://conda.anaconda.org/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda#554304a07e581a85891b15e39ea9f268 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda#61b8078a0905b12529abc622406cb62c https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/colorlog-6.10.1-pyh707e725_0.conda#33e96df3785bf61676ffee387e5a19e5 @@ -109,35 +109,35 @@ https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda#daddf757c3ecd6067b9af1df1f25d89e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac -https://conda.anaconda.org/conda-forge/noarch/idna-3.13-pyhcf101f3_0.conda#fb7130c190f9b4ec91219840a05ba3ac +https://conda.anaconda.org/conda-forge/noarch/idna-3.17-pyhcf101f3_0.conda#c75e517ebd7a5c5272fe111e8b162228 https://conda.anaconda.org/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda#92617c2ba2847cca7a6ed813b6f4ab79 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda#9614359868482abba1bd15ce465e3c42 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py312h0a2e395_0.conda#cd74a9525dc74bbbf93cf8aa2fa9eb5b https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_0.conda#f92f984b558e6e6204014b16d212b271 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-7_h4a7cf45_openblas.conda#955b44e8b00b7f7ef4ce0130cef12394 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-8_h4a7cf45_openblas.conda#00fc660ab1b2f5ca07e92b4900d10c79 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.20.0-hcf29cc6_0.conda#c3cc2864f82a944bc90a7beb4d3b0e88 -https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c +https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_3.conda#ec3c4350aa0261bf7f87b8ca15c8e80e https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda#995d8c8bad2a3cc8db14675a153dec2b https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda#93a4752d42b12943a355b682ee43285b https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda#4c06a92e74452cfa53623a81592e8934 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda#89c0b6d1793601a2a3a3f7d2d3d8b937 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.10.0-pyhcf101f3_0.conda#2c5ef45db85d34799771629bd5860fd7 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda#d7585b6550ad04c8c5e21097ada2888e -https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef +https://conda.anaconda.org/conda-forge/noarch/pycparser-3.0-pyhcf101f3_0.conda#9c5491066224083c41b6d5635ed7107b https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda#16c18772b340887160c79a6acc022db0 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda#3687cc0b82a8b4c17e1f0eb7e47163d5 -https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.3-pyhd8ed1ab_0.conda#c138c7aaa6a10b5762dcd92247864aff +https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.9-pyhd8ed1ab_0.conda#d260a4aec1cb8c91e0803afc6224494c https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac -https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.6.0-py312h0d868a3_1.conda#1cfb9b04c827219597def32c22fb9ca2 +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.7.0-py312h0d868a3_0.conda#5a2d6c150e20e46919f3810dfeb45e4b https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda#15878599a87992e44c059731771591cb https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda#0dc48b4b570931adc8641e55c6c17fe4 https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda#8e194e7b992f99a5015edbd4ebd38efd https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda#03fe290994c5e4ec17293cfb6bdce520 -https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda#755cf22df8693aa0d1aec1c123fa5863 +https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.1.0-pyhd8ed1ab_0.conda#1590bceae37377cecba443c83a44c404 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda#b5325cf06a000c5b14970462ff5e4d58 https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda#32e37e8fe9ef45c637ee38ad51377769 @@ -146,47 +146,47 @@ https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975b_0.conda#0b6c506ec1f272b685240e70a29261b8 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda#34e54f03dfea3e7a2dcf1453a85f1085 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda#e1c36c6121a7c9c76f2f148f1e83b983 +https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda#ba3dcdc8584155c97c648ae9c044b7a3 https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-ha62d5e7_3.conda#55eaf7066da1299d217ab32baedc7fa8 https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py312h460c074_1.conda#648ee28dcd4e07a1940a17da62eccd40 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.14.0-py312h8a5da7c_0.conda#c78de13127e71cb1e581f473ac76f360 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.14.1-py312h8a5da7c_0.conda#6668e2af2de730400bdce9cf2ea132f9 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda#8e662bd460bda79b1ea39194e3c4c9ab https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py312h8a5da7c_0.conda#294fb524171e2a2748cb7fe708aba826 https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda#b8993c19b0c32a2f7b66cbb58ca27069 https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda#080594bf4493e6bae2607e65390c520a +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda#ffc17e785d64e12fc311af9184221839 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda#0ba6225c279baf7ea9473a62ea0ec9ae https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda#04558c96691bed63104678757beb4f8d -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-7_h0358290_openblas.conda#0675639dc24cb0032f199e7ff68e4633 -https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-7_h47877c9_openblas.conda#6569b4f273740e25dc0dc7e3232c2a6c +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-8_h0358290_openblas.conda#33a413f1095f8325e5c30fde3b0d2445 +https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_3.conda#f25206d7322c0e9648e8b83694d143ab +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-8_h47877c9_openblas.conda#809be8ba8712c77bc7d44c2d99390dc4 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda#eb52d14a901e23c39e9e7b4a1a5c015f https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py312h50c33e8_0.conda#9e5609720e31213d4f39afe377f6217e https://conda.anaconda.org/conda-forge/linux-64/proj-9.8.1-he0df7b0_0.conda#b23619e5e9009eaa070ead0342034027 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 -https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.3.1-pyhcf101f3_0.conda#45ea5eceb1c2e35a08a834869837a090 +https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.4.0-pyhcf101f3_0.conda#fb1e5c138e2d933e59b3fa0462acc5e6 https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.13-hd8ed1ab_0.conda#32780d6794b8056b78602103a04e90ef https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda#28687768633154993d521aecfa4a56ac -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 +https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-1.1.1-pyhd8ed1ab_0.conda#d3874a78e238013db5106c8e31f1ae58 https://conda.anaconda.org/conda-forge/noarch/wheel-0.47.0-pyhd8ed1ab_0.conda#d0e3b2f0030cf4fca58bde71d246e94c -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.3-hb03c661_0.conda#adba2e334082bb218db806d4c12277c9 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.7-hb03c661_0.conda#665d152b9c6e78da404086088077c844 https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f https://conda.anaconda.org/conda-forge/noarch/anyio-4.13.0-pyhcf101f3_0.conda#af2df4b9108808da3dc76710fe50eae2 https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.2-he6ee468_1.conda#50ae8372984b8b98e056ac8f6b70ab29 https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda#809f4cde7c853f437becc43415a2ecdf https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-h215f996_4.conda#b39dccf5af984bcb68ee2aa0f3213ea6 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.4-py312h33ff503_0.conda#98f04b59a222970c45c78208aeac8df8 +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py312h33ff503_0.conda#6e31d55ee1110fda83b4f4045f4d73ff https://conda.anaconda.org/conda-forge/noarch/pip-26.1.1-pyh8b19718_0.conda#35870d32aed92041d31cbb15e822dca3 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py312hbc8341d_4.conda#9d5ea11aefbdf548a2d8c965c1b2ebad https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda#6a991452eadf2771952f39d43615bb3e -https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0.conda#e2e4d7094d0580ccd62e2a41947444f3 +https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.0.5-pyhcf101f3_0.conda#730021037e2ce4c65f8eca077e35a821 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py312hd9148b4_0.conda#55fd03988b1b1bc6faabbfb5b481ecd7 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda#cbb88288f74dbe6ada1c6c7d0a97223e -https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.3.3-pyhcf101f3_0.conda#a678237f7d0db44f8a20a21f03844613 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.4.1-pyhcf101f3_0.conda#ddc725661513322f9acf3443ce94ce61 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py312h5253ce2_1.conda#02738ff9855946075cbd1b5274399a41 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py312h4f23490_1.conda#84bf349fad55056ed326fc550671b65c https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda#43c2bc96af3ae5ed9e8a10ded942aa50 @@ -198,10 +198,10 @@ https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py312h4f23490_2.co https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda#67d1790eefa81ed305b89d8e314c7923 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda#4a85203c1d80c1059086ae860836ffb9 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py312h54fa4ab_0.conda#3e38daeb1fb05a95656ff5af089d2e4c -https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py312h54fa4ab_1.conda#15995ecb2ef890778ba9a3750190f09d +https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-10.0.5-h8c3c6de_0.conda#3c8ff4c1bc8528d16d151582cba9e3a9 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py312h383787d_2.conda#69e400d3deca12ee7afd4b73a5596905 -https://conda.anaconda.org/conda-forge/noarch/tox-4.54.0-pyhcf101f3_0.conda#bbeeaedbb3f7a83859af44c8ce461bbe +https://conda.anaconda.org/conda-forge/noarch/tox-4.55.0-pyhcf101f3_0.conda#7760c17af7fcb6ef96e840a5d2533c94 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.1-py312h4f23490_0.conda#6aef45ba3c0123547eb7b0f15852cac9 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 diff --git a/requirements/locks/py313-linux-64.lock b/requirements/locks/py313-linux-64.lock index 22be009e..29dccad8 100644 --- a/requirements/locks/py313-linux-64.lock +++ b/requirements/locks/py313-linux-64.lock @@ -4,12 +4,12 @@ @EXPLICIT https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda#94305520c52a4aa3f6c2b1ff6008d9f8 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda#ad659d0a2b3e47e38d829aa8cad2d610 -https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda#e18ad67cf881dcadee8b8d9e2f8e5f73 -https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda#489b8e97e666c93f68fdb35c3c9b957f +https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_3.conda#eb83f3f8cecc3e9bff9e250817fc69b6 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda#faac990cb7aedc7f3a2224f2c9b0c26c https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda#d87ff7921124eccd67248aa483c23fec https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda#a9f577daf3de00bca7c3c76c0ecbd1de -https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 +https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_3.conda#c2bd8055a2e2dce7a7f32cfd02101fb6 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda#4a13eeac0b5c8e5b8ab496e6c4ddd829 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda#18335a698559cdbcd86150a48bf54ba6 https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda#57736f29cc2b0ec0b6c2952d3f101b6a @@ -19,7 +19,7 @@ https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda#9 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda#72c8fd1af66bd67bf580645b426513ed https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda#6c77a605a7a689d17d4819c0f8ac9a00 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda#a3b390520c563d78cc58974de95a03e5 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_0.conda#93764a5ca80616e9c10106cdaec92f74 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda#a360c33a5abe61c07959e449fa1453eb https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda#331ee9b72b9dff570d56b1302c5ab37d https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.conda#85072b0ad177c966294f129b7c04a2d5 @@ -30,7 +30,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda# https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda#eba48a68a1a2b9d3c0d9511548db85db https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda#7dc38adcbf71e6b38748e919e16e0dce https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda#5794b3bdc38177caf969dabd3af08549 -https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda#38ffe67b78c9d4de527be8315e5ada2c +https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.1-h5347b49_0.conda#7d0a66598195ef00b6efc55aefc7453b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda#fc21868a1a5aacc937e7a18747acb8a5 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda#da1b85b6a87e141f5140bb9924cecab0 @@ -62,10 +62,10 @@ https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#9 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda#d7d95fc8287ea7bf33e0e7116d2b95ec -https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.2-hc5a330e_1.conda#3f578c7d2b0bb52469340e4060d48d94 +https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.3-hc5a330e_0.conda#f2bd09e21c5844a12e2f5eefcd075555 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda#98b6c9dc80eb87b2519b97bcf7e578dd https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda#2aadb0d17215603a82a2a6b0afd9a4cb -https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-h692f434_1.conda#14260392d0b491c537b5e26e9a506fff +https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-hb18f61d_2.conda#d1337309873c443bcc9f118b67eed84e https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda#af39b9a8711d4a8d437b52c1d78eb6a1 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 @@ -89,11 +89,11 @@ https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda#f1 https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.5.0-py313h18e8e13_0.conda#0de0c2c1f2677ea074bdda91de5a4c01 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda#8ccf913aaba749a5496c17629d859ed1 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py313hf159716_1.conda#6c4d3597cf43f3439a51b2b13e29a4ba -https://conda.anaconda.org/conda-forge/noarch/cachetools-7.1.1-pyhd8ed1ab_0.conda#bf63d5c36d9cfee27b7929aff260140b -https://conda.anaconda.org/conda-forge/noarch/certifi-2026.4.22-pyhd8ed1ab_0.conda#929471569c93acefb30282a22060dcd5 +https://conda.anaconda.org/conda-forge/noarch/cachetools-7.1.4-pyhd8ed1ab_0.conda#fbaa0445bcf8ba9e808c90cbc1235090 +https://conda.anaconda.org/conda-forge/noarch/certifi-2026.5.20-pyhd8ed1ab_0.conda#9fefff2f745ea1cc2ef15211a20c054a https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda#a9167b9571f3baa9d448faa2139d1089 -https://conda.anaconda.org/conda-forge/noarch/click-8.3.3-pyhc90fa1f_0.conda#2266262ce8a425ecb6523d765f79b303 +https://conda.anaconda.org/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda#554304a07e581a85891b15e39ea9f268 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda#61b8078a0905b12529abc622406cb62c https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/colorlog-6.10.1-pyh707e725_0.conda#33e96df3785bf61676ffee387e5a19e5 @@ -108,15 +108,15 @@ https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda#daddf757c3ecd6067b9af1df1f25d89e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac -https://conda.anaconda.org/conda-forge/noarch/idna-3.13-pyhcf101f3_0.conda#fb7130c190f9b4ec91219840a05ba3ac +https://conda.anaconda.org/conda-forge/noarch/idna-3.17-pyhcf101f3_0.conda#c75e517ebd7a5c5272fe111e8b162228 https://conda.anaconda.org/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda#92617c2ba2847cca7a6ed813b6f4ab79 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda#9614359868482abba1bd15ce465e3c42 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py313hc8edb43_0.conda#b81883b9dbf5069821c2fb09a8ba1407 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_0.conda#f92f984b558e6e6204014b16d212b271 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-7_h4a7cf45_openblas.conda#955b44e8b00b7f7ef4ce0130cef12394 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-8_h4a7cf45_openblas.conda#00fc660ab1b2f5ca07e92b4900d10c79 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.20.0-hcf29cc6_0.conda#c3cc2864f82a944bc90a7beb4d3b0e88 -https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c +https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_3.conda#ec3c4350aa0261bf7f87b8ca15c8e80e https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda#995d8c8bad2a3cc8db14675a153dec2b https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py313h3dea7bd_1.conda#aeb9b9da79fd0258b3db091d1fefcd71 @@ -124,20 +124,20 @@ https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#3 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda#4c06a92e74452cfa53623a81592e8934 https://conda.anaconda.org/conda-forge/noarch/pip-26.1.1-pyh145f28c_0.conda#2e7e59a063366f1fc4f45ac86bd9485f -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda#89c0b6d1793601a2a3a3f7d2d3d8b937 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.10.0-pyhcf101f3_0.conda#2c5ef45db85d34799771629bd5860fd7 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda#d7585b6550ad04c8c5e21097ada2888e -https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef +https://conda.anaconda.org/conda-forge/noarch/pycparser-3.0-pyhcf101f3_0.conda#9c5491066224083c41b6d5635ed7107b https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda#16c18772b340887160c79a6acc022db0 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda#3687cc0b82a8b4c17e1f0eb7e47163d5 -https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.3-pyhd8ed1ab_0.conda#c138c7aaa6a10b5762dcd92247864aff +https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.9-pyhd8ed1ab_0.conda#d260a4aec1cb8c91e0803afc6224494c https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac -https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.6.0-py313heab5758_1.conda#82df5d372f2796c389fcbe5104664f5a +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.7.0-py313heab5758_0.conda#3e14deae910b2de18153b78a372a4a0e https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py313h3dea7bd_1.conda#f256753e840c3cd3766488c9437a8f8b https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda#0dc48b4b570931adc8641e55c6c17fe4 https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda#8e194e7b992f99a5015edbd4ebd38efd https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda#03fe290994c5e4ec17293cfb6bdce520 -https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda#755cf22df8693aa0d1aec1c123fa5863 +https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.1.0-pyhd8ed1ab_0.conda#1590bceae37377cecba443c83a44c404 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda#b5325cf06a000c5b14970462ff5e4d58 https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda#32e37e8fe9ef45c637ee38ad51377769 @@ -145,45 +145,45 @@ https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda#c07 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda#34e54f03dfea3e7a2dcf1453a85f1085 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda#e1c36c6121a7c9c76f2f148f1e83b983 +https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda#ba3dcdc8584155c97c648ae9c044b7a3 https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-ha62d5e7_3.conda#55eaf7066da1299d217ab32baedc7fa8 https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py313hf46b229_1.conda#d0616e7935acab407d1543b28c446f6f -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.14.0-py313h3dea7bd_0.conda#49352192f1cf61e88e320a319b86b649 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.14.1-py313h3dea7bd_0.conda#86bbb569988f077e5cb30acac5799599 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda#8e662bd460bda79b1ea39194e3c4c9ab https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py313h3dea7bd_0.conda#ae83c999b4cfc4c171ce88b99c8b43cc https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda#b8993c19b0c32a2f7b66cbb58ca27069 https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda#080594bf4493e6bae2607e65390c520a +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda#ffc17e785d64e12fc311af9184221839 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda#0ba6225c279baf7ea9473a62ea0ec9ae https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda#04558c96691bed63104678757beb4f8d -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-7_h0358290_openblas.conda#0675639dc24cb0032f199e7ff68e4633 -https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-7_h47877c9_openblas.conda#6569b4f273740e25dc0dc7e3232c2a6c +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-8_h0358290_openblas.conda#33a413f1095f8325e5c30fde3b0d2445 +https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_3.conda#f25206d7322c0e9648e8b83694d143ab +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-8_h47877c9_openblas.conda#809be8ba8712c77bc7d44c2d99390dc4 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda#eb52d14a901e23c39e9e7b4a1a5c015f https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py313h80991f8_0.conda#7245f1bbf52ed5e3818d742f51b44a7d https://conda.anaconda.org/conda-forge/linux-64/proj-9.8.1-he0df7b0_0.conda#b23619e5e9009eaa070ead0342034027 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 -https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.3.1-pyhcf101f3_0.conda#45ea5eceb1c2e35a08a834869837a090 +https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.4.0-pyhcf101f3_0.conda#fb1e5c138e2d933e59b3fa0462acc5e6 https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.13-h4df99d1_100.conda#fd00e4b24ea88093c93f5c9bad27b52f https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda#28687768633154993d521aecfa4a56ac -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 +https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-1.1.1-pyhd8ed1ab_0.conda#d3874a78e238013db5106c8e31f1ae58 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.3-hb03c661_0.conda#adba2e334082bb218db806d4c12277c9 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.7-hb03c661_0.conda#665d152b9c6e78da404086088077c844 https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f https://conda.anaconda.org/conda-forge/noarch/anyio-4.13.0-pyhcf101f3_0.conda#af2df4b9108808da3dc76710fe50eae2 https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.2-he6ee468_1.conda#50ae8372984b8b98e056ac8f6b70ab29 https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda#809f4cde7c853f437becc43415a2ecdf https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-h215f996_4.conda#b39dccf5af984bcb68ee2aa0f3213ea6 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.4-py313hf6604e3_0.conda#d66c057bf1ecaff2183d1c269268aead +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py313hf6604e3_0.conda#a5fdb80595ec7912e6b1634b2abd4b50 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py313he648cc1_4.conda#fe69af9ea9bb222c067bca5888e5aabe https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda#6a991452eadf2771952f39d43615bb3e -https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0.conda#e2e4d7094d0580ccd62e2a41947444f3 +https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.0.5-pyhcf101f3_0.conda#730021037e2ce4c65f8eca077e35a821 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py313h7037e92_0.conda#cb423e0853b3dde2b3738db4dedf5ba2 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda#cbb88288f74dbe6ada1c6c7d0a97223e -https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.3.3-pyhcf101f3_0.conda#a678237f7d0db44f8a20a21f03844613 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.4.1-pyhcf101f3_0.conda#ddc725661513322f9acf3443ce94ce61 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py313h54dd161_1.conda#710d4663806d0f72b2fb414e936223b5 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py313h29aa505_1.conda#c63d5f9d63fe2f48b0ad75005fcae7ba https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py313hc8edb43_4.conda#33639459bc29437315d4bff9ed5bc7a7 @@ -195,10 +195,10 @@ https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py313h29aa505_2.co https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda#67d1790eefa81ed305b89d8e314c7923 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda#4a85203c1d80c1059086ae860836ffb9 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py313h4b8bb8b_0.conda#ec81bc03787968decae6765c7f61b7cf -https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py313h4b8bb8b_1.conda#4b098461b0b5edff1a9359c25e675cfd +https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-10.0.5-h8c3c6de_0.conda#3c8ff4c1bc8528d16d151582cba9e3a9 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py313had47c43_2.conda#6e550dd748e9ac9b2925411684e076a1 -https://conda.anaconda.org/conda-forge/noarch/tox-4.54.0-pyhcf101f3_0.conda#bbeeaedbb3f7a83859af44c8ce461bbe +https://conda.anaconda.org/conda-forge/noarch/tox-4.55.0-pyhcf101f3_0.conda#7760c17af7fcb6ef96e840a5d2533c94 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.1-py313h29aa505_0.conda#3942b6a86fe92d0888b3373f2c1e1676 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 diff --git a/requirements/locks/py314-linux-64.lock b/requirements/locks/py314-linux-64.lock index 67f0bda7..2cf5e986 100644 --- a/requirements/locks/py314-linux-64.lock +++ b/requirements/locks/py314-linux-64.lock @@ -4,12 +4,12 @@ @EXPLICIT https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda#0539938c55b6b1a59b560e843ad864a4 https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda#ad659d0a2b3e47e38d829aa8cad2d610 -https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda#e18ad67cf881dcadee8b8d9e2f8e5f73 -https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda#434ca7e50e40f4918ab701e3facd59a0 +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda#489b8e97e666c93f68fdb35c3c9b957f +https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_3.conda#eb83f3f8cecc3e9bff9e250817fc69b6 https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda#faac990cb7aedc7f3a2224f2c9b0c26c https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda#d87ff7921124eccd67248aa483c23fec https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda#a9f577daf3de00bca7c3c76c0ecbd1de -https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda#7df50d44d4a14d6c31a2c54f2cd92157 +https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_3.conda#c2bd8055a2e2dce7a7f32cfd02101fb6 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda#4a13eeac0b5c8e5b8ab496e6c4ddd829 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda#18335a698559cdbcd86150a48bf54ba6 https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda#57736f29cc2b0ec0b6c2952d3f101b6a @@ -19,7 +19,7 @@ https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda#9 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda#72c8fd1af66bd67bf580645b426513ed https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda#6c77a605a7a689d17d4819c0f8ac9a00 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda#a3b390520c563d78cc58974de95a03e5 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_0.conda#93764a5ca80616e9c10106cdaec92f74 https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda#a360c33a5abe61c07959e449fa1453eb https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda#331ee9b72b9dff570d56b1302c5ab37d https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.conda#85072b0ad177c966294f129b7c04a2d5 @@ -30,7 +30,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda# https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda#eba48a68a1a2b9d3c0d9511548db85db https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda#7dc38adcbf71e6b38748e919e16e0dce https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda#5794b3bdc38177caf969dabd3af08549 -https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda#38ffe67b78c9d4de527be8315e5ada2c +https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.1-h5347b49_0.conda#7d0a66598195ef00b6efc55aefc7453b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda#fc21868a1a5aacc937e7a18747acb8a5 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda#da1b85b6a87e141f5140bb9924cecab0 @@ -62,10 +62,10 @@ https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#9 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda#a7b27c075c9b7f459f1c022090697cba https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda#d7d95fc8287ea7bf33e0e7116d2b95ec -https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.2-hc5a330e_1.conda#3f578c7d2b0bb52469340e4060d48d94 +https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.3-hc5a330e_0.conda#f2bd09e21c5844a12e2f5eefcd075555 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda#98b6c9dc80eb87b2519b97bcf7e578dd https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda#2aadb0d17215603a82a2a6b0afd9a4cb -https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-h692f434_1.conda#14260392d0b491c537b5e26e9a506fff +https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-hb18f61d_2.conda#d1337309873c443bcc9f118b67eed84e https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda#af39b9a8711d4a8d437b52c1d78eb6a1 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 @@ -76,7 +76,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.con https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.33-pthreads_h94d23a6_0.conda#2d3278b721e40468295ca755c3b84070 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#cd5a90476766d53e901500df9215e927 https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda#e79d2c2f24b027aa8d5ab1b1ba3061e7 -https://conda.anaconda.org/conda-forge/linux-64/python-3.14.4-habeac84_100_cp314.conda#a443f87920815d41bfe611296e507995 +https://conda.anaconda.org/conda-forge/linux-64/python-3.14.5-habeac84_100_cp314.conda#da92e59ff92f2d5ede4f612af20f583f https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.1-hbc0de68_0.conda#8e0b8654ead18e50af552e54b5a08a61 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 @@ -89,15 +89,15 @@ https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda#f1 https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda#1133126d840e75287d83947be3fc3e71 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda#8ccf913aaba749a5496c17629d859ed1 https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda#8910d2c46f7e7b519129f486e0fe927a -https://conda.anaconda.org/conda-forge/noarch/cachetools-7.1.1-pyhd8ed1ab_0.conda#bf63d5c36d9cfee27b7929aff260140b -https://conda.anaconda.org/conda-forge/noarch/certifi-2026.4.22-pyhd8ed1ab_0.conda#929471569c93acefb30282a22060dcd5 +https://conda.anaconda.org/conda-forge/noarch/cachetools-7.1.4-pyhd8ed1ab_0.conda#fbaa0445bcf8ba9e808c90cbc1235090 +https://conda.anaconda.org/conda-forge/noarch/certifi-2026.5.20-pyhd8ed1ab_0.conda#9fefff2f745ea1cc2ef15211a20c054a https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda#381bd45fb7aa032691f3063aff47e3a1 https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda#a9167b9571f3baa9d448faa2139d1089 -https://conda.anaconda.org/conda-forge/noarch/click-8.3.3-pyhc90fa1f_0.conda#2266262ce8a425ecb6523d765f79b303 +https://conda.anaconda.org/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda#554304a07e581a85891b15e39ea9f268 https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda#61b8078a0905b12529abc622406cb62c https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 https://conda.anaconda.org/conda-forge/noarch/colorlog-6.10.1-pyh707e725_0.conda#33e96df3785bf61676ffee387e5a19e5 -https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.4-py314hd8ed1ab_100.conda#f111d4cfaf1fe9496f386bc98ae94452 +https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.5-py314hd8ed1ab_100.conda#a749029ce5d0632a913db19d17f944ab https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda#4c2a8fef270f6c69591889b93f9f55c1 https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc @@ -108,15 +108,15 @@ https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda#daddf757c3ecd6067b9af1df1f25d89e https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac -https://conda.anaconda.org/conda-forge/noarch/idna-3.13-pyhcf101f3_0.conda#fb7130c190f9b4ec91219840a05ba3ac +https://conda.anaconda.org/conda-forge/noarch/idna-3.17-pyhcf101f3_0.conda#c75e517ebd7a5c5272fe111e8b162228 https://conda.anaconda.org/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda#92617c2ba2847cca7a6ed813b6f4ab79 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda#9614359868482abba1bd15ce465e3c42 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py314h97ea11e_0.conda#7397e418cab519b8d789936cf2dde6f6 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_0.conda#f92f984b558e6e6204014b16d212b271 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-7_h4a7cf45_openblas.conda#955b44e8b00b7f7ef4ce0130cef12394 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-8_h4a7cf45_openblas.conda#00fc660ab1b2f5ca07e92b4900d10c79 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.20.0-hcf29cc6_0.conda#c3cc2864f82a944bc90a7beb4d3b0e88 -https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda#c8013e438185f33b13814c5c488acd5c +https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_3.conda#ec3c4350aa0261bf7f87b8ca15c8e80e https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda#995d8c8bad2a3cc8db14675a153dec2b https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda#9a17c4307d23318476d7fbf0fedc0cde @@ -124,20 +124,20 @@ https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#3 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda#4c06a92e74452cfa53623a81592e8934 https://conda.anaconda.org/conda-forge/noarch/pip-26.1.1-pyh145f28c_0.conda#2e7e59a063366f1fc4f45ac86bd9485f -https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda#89c0b6d1793601a2a3a3f7d2d3d8b937 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.10.0-pyhcf101f3_0.conda#2c5ef45db85d34799771629bd5860fd7 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda#d7585b6550ad04c8c5e21097ada2888e -https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef +https://conda.anaconda.org/conda-forge/noarch/pycparser-3.0-pyhcf101f3_0.conda#9c5491066224083c41b6d5635ed7107b https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda#16c18772b340887160c79a6acc022db0 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda#3687cc0b82a8b4c17e1f0eb7e47163d5 -https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.3-pyhd8ed1ab_0.conda#c138c7aaa6a10b5762dcd92247864aff +https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.9-pyhd8ed1ab_0.conda#d260a4aec1cb8c91e0803afc6224494c https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac -https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.6.0-py314he82b845_1.conda#21dce7c80bbdb9785633011ad348e530 +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.7.0-py314he82b845_0.conda#b7b8156134373dd419399dfbf255daae https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda#2035f68f96be30dc60a5dfd7452c7941 https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda#0dc48b4b570931adc8641e55c6c17fe4 https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda#8e194e7b992f99a5015edbd4ebd38efd https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda#03fe290994c5e4ec17293cfb6bdce520 -https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda#755cf22df8693aa0d1aec1c123fa5863 +https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.1.0-pyhd8ed1ab_0.conda#1590bceae37377cecba443c83a44c404 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda#b5325cf06a000c5b14970462ff5e4d58 https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda#32e37e8fe9ef45c637ee38ad51377769 @@ -146,45 +146,45 @@ https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py314h5bd0f2a_0.conda#494fdf358c152f9fdd0673c128c2f3dd https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda#34e54f03dfea3e7a2dcf1453a85f1085 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda#e1c36c6121a7c9c76f2f148f1e83b983 +https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda#ba3dcdc8584155c97c648ae9c044b7a3 https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-ha62d5e7_3.conda#55eaf7066da1299d217ab32baedc7fa8 https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda#cf45f4278afd6f4e6d03eda0f435d527 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.14.0-py314h67df5f8_0.conda#7f8715a1928f6f126323320a4c5ada3a +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.14.1-py314h67df5f8_0.conda#2af0e1fec00680b1b6ef3859585ca8fa https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda#8e662bd460bda79b1ea39194e3c4c9ab https://conda.anaconda.org/conda-forge/noarch/fonttools-4.63.0-pyh7db6752_0.conda#0509ee74d95e5b98eb6fe2a47760e399 https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda#b8993c19b0c32a2f7b66cbb58ca27069 https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda#080594bf4493e6bae2607e65390c520a +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda#ffc17e785d64e12fc311af9184221839 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda#0ba6225c279baf7ea9473a62ea0ec9ae https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda#04558c96691bed63104678757beb4f8d -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-7_h0358290_openblas.conda#0675639dc24cb0032f199e7ff68e4633 -https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda#928b8be80851f5d8ffb016f9c81dae7a -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-7_h47877c9_openblas.conda#6569b4f273740e25dc0dc7e3232c2a6c +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-8_h0358290_openblas.conda#33a413f1095f8325e5c30fde3b0d2445 +https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_3.conda#f25206d7322c0e9648e8b83694d143ab +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-8_h47877c9_openblas.conda#809be8ba8712c77bc7d44c2d99390dc4 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda#eb52d14a901e23c39e9e7b4a1a5c015f https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py314h8ec4b1a_0.conda#76c4757c0ec9d11f969e8eb44899307b https://conda.anaconda.org/conda-forge/linux-64/proj-9.8.1-he0df7b0_0.conda#b23619e5e9009eaa070ead0342034027 https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 -https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.3.1-pyhcf101f3_0.conda#45ea5eceb1c2e35a08a834869837a090 -https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.4-h4df99d1_100.conda#e4e60721757979d01d3964122f674959 +https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.4.0-pyhcf101f3_0.conda#fb1e5c138e2d933e59b3fa0462acc5e6 +https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.5-h4df99d1_100.conda#41954747ba952ec4b01e16c2c9e8d8ff https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda#28687768633154993d521aecfa4a56ac -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda#17dcc85db3c7886650b8908b183d6876 +https://conda.anaconda.org/conda-forge/noarch/vcs_versioning-1.1.1-pyhd8ed1ab_0.conda#d3874a78e238013db5106c8e31f1ae58 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.3-hb03c661_0.conda#adba2e334082bb218db806d4c12277c9 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.7-hb03c661_0.conda#665d152b9c6e78da404086088077c844 https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f https://conda.anaconda.org/conda-forge/noarch/anyio-4.13.0-pyhcf101f3_0.conda#af2df4b9108808da3dc76710fe50eae2 https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.2-he6ee468_1.conda#50ae8372984b8b98e056ac8f6b70ab29 https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda#809f4cde7c853f437becc43415a2ecdf https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-h215f996_4.conda#b39dccf5af984bcb68ee2aa0f3213ea6 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.4-py314h2b28147_0.conda#c8f3b508487aeb903fd6b75e3573a0cb +https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py314h2b28147_0.conda#f49b5f950379e0b97c35ca97682f7c6a https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py314h7ce3bca_4.conda#d5d862492bbd0f4be1f6d57289459066 https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda#6a991452eadf2771952f39d43615bb3e -https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-9.2.2-pyhd8ed1ab_0.conda#e2e4d7094d0580ccd62e2a41947444f3 +https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.0.5-pyhcf101f3_0.conda#730021037e2ce4c65f8eca077e35a821 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py314h9891dd4_0.conda#5d3c008e54c7f49592fca9c32896a76f https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda#cbb88288f74dbe6ada1c6c7d0a97223e -https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.3.3-pyhcf101f3_0.conda#a678237f7d0db44f8a20a21f03844613 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.4.1-pyhcf101f3_0.conda#ddc725661513322f9acf3443ce94ce61 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py314h0f05182_1.conda#2930a6e1c7b3bc5f66172e324a8f5fc3 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py314hc02f841_1.conda#552b5d9d8a2a4be882e1c638953e7281 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py314h97ea11e_4.conda#95bede9cdb7a30a4b611223d52a01aa4 @@ -196,10 +196,10 @@ https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.1-py314hc02f841_2.co https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda#67d1790eefa81ed305b89d8e314c7923 https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda#0511afbe860b1a653125d77c719ece53 https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda#4a85203c1d80c1059086ae860836ffb9 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py314hf07bd8e_0.conda#d0510124f87c75403090e220db1e9d41 -https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-9.2.2-hd8ed1ab_0.conda#7537abc2590073ffde5545c648ad6974 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py314hf07bd8e_1.conda#718437171257e579e7d1f3b51c62536f +https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-10.0.5-h8c3c6de_0.conda#3c8ff4c1bc8528d16d151582cba9e3a9 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py314hbe3edd8_2.conda#5963e6ee81772d450a35e6bc95522761 -https://conda.anaconda.org/conda-forge/noarch/tox-4.54.0-pyhcf101f3_0.conda#bbeeaedbb3f7a83859af44c8ce461bbe +https://conda.anaconda.org/conda-forge/noarch/tox-4.55.0-pyhcf101f3_0.conda#7760c17af7fcb6ef96e840a5d2533c94 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.1-py314hc02f841_0.conda#de50a60eab348de04809a33e180b4b01 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 From 07dc2e401abe123db96621a8083fcd8f25326103 Mon Sep 17 00:00:00 2001 From: Martin Yeo <40734014+trexfeathers@users.noreply.github.com> Date: Fri, 5 Jun 2026 16:37:40 +0100 Subject: [PATCH 570/583] Update GHA for workflows `2026.06.0` (#798) * Update GHA for workflows 2026.06.0. * Remove over-zealous permissions. --- .github/workflows/ci-manifest.yml | 4 +++- .github/workflows/ci-template-check.yml | 8 ++++++-- .github/workflows/refresh-lockfiles.yml | 8 ++++++-- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index 7c84fbd4..2454ece8 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -17,7 +17,9 @@ concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true +permissions: {} + jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2026.05.0 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@1f2141422a63321a32575ddd186e53acff12550c diff --git a/.github/workflows/ci-template-check.yml b/.github/workflows/ci-template-check.yml index 3475c14d..f5a4e306 100644 --- a/.github/workflows/ci-template-check.yml +++ b/.github/workflows/ci-template-check.yml @@ -8,9 +8,13 @@ on: branches: - main +permissions: {} + jobs: prompt-share: - uses: scitools/workflows/.github/workflows/ci-template-check.yml@2026.05.0 - secrets: inherit + uses: scitools/workflows/.github/workflows/ci-template-check.yml@1f2141422a63321a32575ddd186e53acff12550c + secrets: + AUTH_APP_ID: ${{ secrets.AUTH_APP_ID }} + AUTH_APP_PRIVATE_KEY: ${{ secrets.AUTH_APP_PRIVATE_KEY }} with: pr_number: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 728df96b..86674901 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -8,7 +8,11 @@ on: schedule: - cron: "2 0 * * 6" +permissions: {} + jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2026.05.0 - secrets: inherit + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@1f2141422a63321a32575ddd186e53acff12550c + secrets: + AUTH_APP_ID: ${{ secrets.AUTH_APP_ID }} + AUTH_APP_PRIVATE_KEY: ${{ secrets.AUTH_APP_PRIVATE_KEY }} From 6cef0a0b36013889249be27bcc966547064261b2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 12:05:22 +0100 Subject: [PATCH 571/583] Bump codecov/codecov-action from 6 to 7 in the dependencies group (#802) Bumps the dependencies group with 1 update: [codecov/codecov-action](https://github.com/codecov/codecov-action). Updates `codecov/codecov-action` from 6 to 7 - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/v6...v7) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-version: '7' dependency-type: direct:production update-type: version-update:semver-major dependency-group: dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-tests.yml b/.github/workflows/ci-tests.yml index cc6f09e8..eab3158e 100644 --- a/.github/workflows/ci-tests.yml +++ b/.github/workflows/ci-tests.yml @@ -133,6 +133,6 @@ jobs: - name: "upload coverage report" if: ${{ matrix.coverage }} - uses: codecov/codecov-action@v6 + uses: codecov/codecov-action@v7 with: token: ${{ secrets.CODECOV_TOKEN }} From 56bf25788eba825b884f922b27519f65e05cd63d Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 14:01:28 +0100 Subject: [PATCH 572/583] Updated environment lockfiles (#800) Co-authored-by: Lockfile bot --- requirements/locks/py312-linux-64.lock | 42 +++++++++++++------------- requirements/locks/py313-linux-64.lock | 42 +++++++++++++------------- requirements/locks/py314-linux-64.lock | 42 +++++++++++++------------- 3 files changed, 63 insertions(+), 63 deletions(-) diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 2cb80d02..5ca04ef4 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -13,7 +13,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_3.conda https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda#4a13eeac0b5c8e5b8ab496e6c4ddd829 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda#18335a698559cdbcd86150a48bf54ba6 https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda#57736f29cc2b0ec0b6c2952d3f101b6a -https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.6-hb03c661_0.conda#e36ad70a7e0b48f091ed6902f04c23b8 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.13.1-hb03c661_0.conda#f5f0be3aac62d771c3b0cad1d316d8e9 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda#d2ffd7602c02f2b316fd921d39876885 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda#920bb03579f15389b9e512095ad995b7 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 @@ -28,7 +28,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda#b88d90cad08e6bc8ad540cb310a761fb https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda#d864d34357c3b65a4b731f78c0801dc4 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda#eba48a68a1a2b9d3c0d9511548db85db -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda#7dc38adcbf71e6b38748e919e16e0dce +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.2-h0c1763c_0.conda#062b0ac602fb0adf250e3dfa86f221c4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda#5794b3bdc38177caf969dabd3af08549 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.1-h5347b49_0.conda#7d0a66598195ef00b6efc55aefc7453b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 @@ -40,10 +40,10 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda#1dafce8548e38671bea82e3f5c6ce22f https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb47aa4a_0.conda#607e13a8caac17f9a664bcab5302ce06 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a -https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.13-h2c9d079_1.conda#3c3d02681058c3d206b562b2e3bc337f -https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h8b1a151_0.conda#f16f498641c9e05b645fe65902df661a -https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-h8b1a151_4.conda#c7e3e08b7b1b285524ab9d74162ce40b -https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h8b1a151_0.conda#f8e1bcc5c7d839c5882e94498791be08 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.14-h8e43964_1.conda#eb6e8fb306b4025bf9c68b6c16db4e19 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h16e98cb_1.conda#673828462eb87b76c178b582b6e19824 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-h16e98cb_5.conda#a81045d3ce07a74751541de2bad6fa49 +https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h16e98cb_1.conda#8d963dc4805936cc294348743201d68e https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.1-h480dda7_0.conda#4d4efd0645cd556fab54617c4ad477ef https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda#c80d8a3b84358cb967fa81e7075fbc8a https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda#a752488c68f2e7c456bcbd8f16eec275 @@ -66,7 +66,7 @@ https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda#d7 https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.3-hc5a330e_0.conda#f2bd09e21c5844a12e2f5eefcd075555 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda#98b6c9dc80eb87b2519b97bcf7e578dd https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda#2aadb0d17215603a82a2a6b0afd9a4cb -https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-hb18f61d_2.conda#d1337309873c443bcc9f118b67eed84e +https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-h955231c_3.conda#a3581835895ca9b7782beb5a49746db7 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda#af39b9a8711d4a8d437b52c1d78eb6a1 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 @@ -79,13 +79,13 @@ https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#c https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda#e79d2c2f24b027aa8d5ab1b1ba3061e7 https://conda.anaconda.org/conda-forge/linux-64/python-3.12.13-hd63d673_0_cpython.conda#7eccb41177e15cc672e1babe9056018e https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.1-hbc0de68_0.conda#8e0b8654ead18e50af552e54b5a08a61 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.2-hbc0de68_0.conda#38d9bf35a4cc83094a327811e548b660 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda#861fb6ccbc677bb9a9fb2468430b9c6a https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda#8f37c8fb7116a18da04e52fa9e2c8df9 https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda#c6b0543676ecb1fb2d7643941fe375f2 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.13-h4bacb7b_0.conda#77f70a9ab785a146dbf66fba00131403 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-hcbcd92d_1.conda#333fa38d6dfe23cd68c67e20cb1726c9 https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda#f1976ce927373500cc19d3c0b2c85177 https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.5.0-py312h90b7ffd_0.conda#b31dba71fe091e7201826e57e0f7b261 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda#8ccf913aaba749a5496c17629d859ed1 @@ -100,9 +100,9 @@ https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda# https://conda.anaconda.org/conda-forge/noarch/colorlog-6.10.1-pyh707e725_0.conda#33e96df3785bf61676ffee387e5a19e5 https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_0.conda#f54c1ffb8ecedb85a8b7fcde3a187212 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda#4c2a8fef270f6c69591889b93f9f55c1 -https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 +https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.1-pyhcf101f3_1.conda#f8638ae693ee89e9069ed4f3b77a6be9 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc -https://conda.anaconda.org/conda-forge/noarch/filelock-3.29.0-pyhd8ed1ab_0.conda#8fa8358d022a3a9bd101384a808044c6 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.29.1-pyhd8ed1ab_0.conda#917880ebad7632e8a52eada085b98ce9 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_0.conda#8462b5322567212beeb025f3519fb3e2 https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda#2c11aa96ea85ced419de710c1c3a78ff @@ -114,7 +114,7 @@ https://conda.anaconda.org/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda#9614359868482abba1bd15ce465e3c42 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py312h0a2e395_0.conda#cd74a9525dc74bbbf93cf8aa2fa9eb5b -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_0.conda#f92f984b558e6e6204014b16d212b271 +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_1.conda#8b3ce45e929cd8e8e5f4d18586b56d8b https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-8_h4a7cf45_openblas.conda#00fc660ab1b2f5ca07e92b4900d10c79 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.20.0-hcf29cc6_0.conda#c3cc2864f82a944bc90a7beb4d3b0e88 https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_3.conda#ec3c4350aa0261bf7f87b8ca15c8e80e @@ -137,7 +137,7 @@ https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0. https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda#8e194e7b992f99a5015edbd4ebd38efd https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda#03fe290994c5e4ec17293cfb6bdce520 -https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.1.0-pyhd8ed1ab_0.conda#1590bceae37377cecba443c83a44c404 +https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.1.1-pyhd8ed1ab_0.conda#46b6abe31482f6bca064b965696ae807 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda#b5325cf06a000c5b14970462ff5e4d58 https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda#32e37e8fe9ef45c637ee38ad51377769 @@ -147,7 +147,7 @@ https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda#34e54f03dfea3e7a2dcf1453a85f1085 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda#ba3dcdc8584155c97c648ae9c044b7a3 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-ha62d5e7_3.conda#55eaf7066da1299d217ab32baedc7fa8 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.3-h3aafcba_1.conda#54f62a10a7dcc7e46b149e2d078299b5 https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py312h460c074_1.conda#648ee28dcd4e07a1940a17da62eccd40 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.14.1-py312h8a5da7c_0.conda#6668e2af2de730400bdce9cf2ea132f9 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 @@ -165,7 +165,7 @@ https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda# https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py312h50c33e8_0.conda#9e5609720e31213d4f39afe377f6217e https://conda.anaconda.org/conda-forge/linux-64/proj-9.8.1-he0df7b0_0.conda#b23619e5e9009eaa070ead0342034027 -https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 +https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.1-pyhcf101f3_0.conda#8685d811ee857a0435d88f75c083646d https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.4.0-pyhcf101f3_0.conda#fb1e5c138e2d933e59b3fa0462acc5e6 https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.13-hd8ed1ab_0.conda#32780d6794b8056b78602103a04e90ef @@ -176,21 +176,21 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.3-hb03c661_0.cond https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.7-hb03c661_0.conda#665d152b9c6e78da404086088077c844 https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f https://conda.anaconda.org/conda-forge/noarch/anyio-4.13.0-pyhcf101f3_0.conda#af2df4b9108808da3dc76710fe50eae2 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.2-he6ee468_1.conda#50ae8372984b8b98e056ac8f6b70ab29 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.4-h00bea6e_0.conda#3a36b9efa77c11214308630ddb91496a https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda#809f4cde7c853f437becc43415a2ecdf https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-h215f996_4.conda#b39dccf5af984bcb68ee2aa0f3213ea6 https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py312h33ff503_0.conda#6e31d55ee1110fda83b4f4045f4d73ff -https://conda.anaconda.org/conda-forge/noarch/pip-26.1.1-pyh8b19718_0.conda#35870d32aed92041d31cbb15e822dca3 +https://conda.anaconda.org/conda-forge/noarch/pip-26.1.2-pyh8b19718_0.conda#511fbc2c63d2c73650ad1755e4d357ba https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py312hbc8341d_4.conda#9d5ea11aefbdf548a2d8c965c1b2ebad https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda#6a991452eadf2771952f39d43615bb3e https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.0.5-pyhcf101f3_0.conda#730021037e2ce4c65f8eca077e35a821 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py312hd9148b4_0.conda#55fd03988b1b1bc6faabbfb5b481ecd7 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda#cbb88288f74dbe6ada1c6c7d0a97223e -https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.4.1-pyhcf101f3_0.conda#ddc725661513322f9acf3443ce94ce61 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.4.2-pyhcf101f3_0.conda#52434c636a05a06806d0978128d98c19 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py312h5253ce2_1.conda#02738ff9855946075cbd1b5274399a41 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py312h4f23490_1.conda#84bf349fad55056ed326fc550671b65c https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda#43c2bc96af3ae5ed9e8a10ded942aa50 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_h87a9417_105.conda#0d0595612fa229dddb5fc565c260a11f +https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_hee75f7e_106.conda#16f05278317ac89d2dbd2898c4f8e3d6 https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb https://conda.anaconda.org/conda-forge/noarch/identify-2.6.19-pyhd8ed1ab_0.conda#84a3233b709a289a4ddd7a2fd27dd988 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.9-h1588d4d_1.conda#115ecf05370670f93bc81a8c4f7fd57f @@ -201,7 +201,7 @@ https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py312h54fa4ab_1.conda#15995ecb2ef890778ba9a3750190f09d https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-10.0.5-h8c3c6de_0.conda#3c8ff4c1bc8528d16d151582cba9e3a9 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py312h383787d_2.conda#69e400d3deca12ee7afd4b73a5596905 -https://conda.anaconda.org/conda-forge/noarch/tox-4.55.0-pyhcf101f3_0.conda#7760c17af7fcb6ef96e840a5d2533c94 +https://conda.anaconda.org/conda-forge/noarch/tox-4.55.1-pyhcf101f3_0.conda#b36d5dae98d2d22f1f8b7273f5813849 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.1-py312h4f23490_0.conda#6aef45ba3c0123547eb7b0f15852cac9 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 @@ -211,7 +211,7 @@ https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.6.0-pyha770c72_0.cond https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py312hf79963d_1.conda#6c913a686cb4060cbd7639a36fa144f0 https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.47.0-ha1d8304_0.conda#3ef42f61d9a66a0749cbe598b5acdeea https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py311h498b1eb_107.conda#7f5488cf61943e6221325b454c2c2e9c -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.5.10-pyhd8ed1ab_0.conda#cee830ab52204b8d999bd54e84ccf328 +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.6.2-pyhd8ed1ab_0.conda#ecdafb6a10df41e1249d707532ccefd9 https://conda.anaconda.org/conda-forge/noarch/iris-3.15.0-pyha770c72_0.conda#bfe6588cbbd6e2e97e9439f95de02af8 https://conda.anaconda.org/conda-forge/noarch/nox-2026.4.10-pyhc364b38_0.conda#10df85d0d06301e961c8b27805f66a56 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.47.0-np2py312hfb8c2c5_0.conda#614309c6287d4edebffa95dc983241d3 diff --git a/requirements/locks/py313-linux-64.lock b/requirements/locks/py313-linux-64.lock index 29dccad8..4ba5f04c 100644 --- a/requirements/locks/py313-linux-64.lock +++ b/requirements/locks/py313-linux-64.lock @@ -13,7 +13,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_3.conda https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda#4a13eeac0b5c8e5b8ab496e6c4ddd829 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda#18335a698559cdbcd86150a48bf54ba6 https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda#57736f29cc2b0ec0b6c2952d3f101b6a -https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.6-hb03c661_0.conda#e36ad70a7e0b48f091ed6902f04c23b8 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.13.1-hb03c661_0.conda#f5f0be3aac62d771c3b0cad1d316d8e9 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda#d2ffd7602c02f2b316fd921d39876885 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda#920bb03579f15389b9e512095ad995b7 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 @@ -28,7 +28,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda#b88d90cad08e6bc8ad540cb310a761fb https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda#2c21e66f50753a083cbe6b80f38268fa https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda#eba48a68a1a2b9d3c0d9511548db85db -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda#7dc38adcbf71e6b38748e919e16e0dce +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.2-h0c1763c_0.conda#062b0ac602fb0adf250e3dfa86f221c4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda#5794b3bdc38177caf969dabd3af08549 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.1-h5347b49_0.conda#7d0a66598195ef00b6efc55aefc7453b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 @@ -40,10 +40,10 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda#1dafce8548e38671bea82e3f5c6ce22f https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb47aa4a_0.conda#607e13a8caac17f9a664bcab5302ce06 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a -https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.13-h2c9d079_1.conda#3c3d02681058c3d206b562b2e3bc337f -https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h8b1a151_0.conda#f16f498641c9e05b645fe65902df661a -https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-h8b1a151_4.conda#c7e3e08b7b1b285524ab9d74162ce40b -https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h8b1a151_0.conda#f8e1bcc5c7d839c5882e94498791be08 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.14-h8e43964_1.conda#eb6e8fb306b4025bf9c68b6c16db4e19 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h16e98cb_1.conda#673828462eb87b76c178b582b6e19824 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-h16e98cb_5.conda#a81045d3ce07a74751541de2bad6fa49 +https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h16e98cb_1.conda#8d963dc4805936cc294348743201d68e https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.1-h480dda7_0.conda#4d4efd0645cd556fab54617c4ad477ef https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda#c80d8a3b84358cb967fa81e7075fbc8a https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda#a752488c68f2e7c456bcbd8f16eec275 @@ -65,7 +65,7 @@ https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda#d7 https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.3-hc5a330e_0.conda#f2bd09e21c5844a12e2f5eefcd075555 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda#98b6c9dc80eb87b2519b97bcf7e578dd https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda#2aadb0d17215603a82a2a6b0afd9a4cb -https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-hb18f61d_2.conda#d1337309873c443bcc9f118b67eed84e +https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-h955231c_3.conda#a3581835895ca9b7782beb5a49746db7 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda#af39b9a8711d4a8d437b52c1d78eb6a1 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 @@ -78,13 +78,13 @@ https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#c https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda#e79d2c2f24b027aa8d5ab1b1ba3061e7 https://conda.anaconda.org/conda-forge/linux-64/python-3.13.13-h6add32d_100_cp313.conda#05051be49267378d2fcd12931e319ac3 https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.1-hbc0de68_0.conda#8e0b8654ead18e50af552e54b5a08a61 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.2-hbc0de68_0.conda#38d9bf35a4cc83094a327811e548b660 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda#861fb6ccbc677bb9a9fb2468430b9c6a https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda#8f37c8fb7116a18da04e52fa9e2c8df9 https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda#c6b0543676ecb1fb2d7643941fe375f2 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.13-h4bacb7b_0.conda#77f70a9ab785a146dbf66fba00131403 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-hcbcd92d_1.conda#333fa38d6dfe23cd68c67e20cb1726c9 https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda#f1976ce927373500cc19d3c0b2c85177 https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.5.0-py313h18e8e13_0.conda#0de0c2c1f2677ea074bdda91de5a4c01 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda#8ccf913aaba749a5496c17629d859ed1 @@ -99,9 +99,9 @@ https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda# https://conda.anaconda.org/conda-forge/noarch/colorlog-6.10.1-pyh707e725_0.conda#33e96df3785bf61676ffee387e5a19e5 https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.13-py313hd8ed1ab_100.conda#3a8a8b87e72f95b54689fb588e154ec9 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda#4c2a8fef270f6c69591889b93f9f55c1 -https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 +https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.1-pyhcf101f3_1.conda#f8638ae693ee89e9069ed4f3b77a6be9 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc -https://conda.anaconda.org/conda-forge/noarch/filelock-3.29.0-pyhd8ed1ab_0.conda#8fa8358d022a3a9bd101384a808044c6 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.29.1-pyhd8ed1ab_0.conda#917880ebad7632e8a52eada085b98ce9 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_0.conda#8462b5322567212beeb025f3519fb3e2 https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda#2c11aa96ea85ced419de710c1c3a78ff @@ -113,7 +113,7 @@ https://conda.anaconda.org/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda#9614359868482abba1bd15ce465e3c42 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py313hc8edb43_0.conda#b81883b9dbf5069821c2fb09a8ba1407 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_0.conda#f92f984b558e6e6204014b16d212b271 +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_1.conda#8b3ce45e929cd8e8e5f4d18586b56d8b https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-8_h4a7cf45_openblas.conda#00fc660ab1b2f5ca07e92b4900d10c79 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.20.0-hcf29cc6_0.conda#c3cc2864f82a944bc90a7beb4d3b0e88 https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_3.conda#ec3c4350aa0261bf7f87b8ca15c8e80e @@ -123,7 +123,7 @@ https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py313h3dea7bd_1 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda#4c06a92e74452cfa53623a81592e8934 -https://conda.anaconda.org/conda-forge/noarch/pip-26.1.1-pyh145f28c_0.conda#2e7e59a063366f1fc4f45ac86bd9485f +https://conda.anaconda.org/conda-forge/noarch/pip-26.1.2-pyh145f28c_0.conda#733cc07ed34162ac50b936464b163366 https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.10.0-pyhcf101f3_0.conda#2c5ef45db85d34799771629bd5860fd7 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda#d7585b6550ad04c8c5e21097ada2888e https://conda.anaconda.org/conda-forge/noarch/pycparser-3.0-pyhcf101f3_0.conda#9c5491066224083c41b6d5635ed7107b @@ -137,7 +137,7 @@ https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0. https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda#8e194e7b992f99a5015edbd4ebd38efd https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda#03fe290994c5e4ec17293cfb6bdce520 -https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.1.0-pyhd8ed1ab_0.conda#1590bceae37377cecba443c83a44c404 +https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.1.1-pyhd8ed1ab_0.conda#46b6abe31482f6bca064b965696ae807 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda#b5325cf06a000c5b14970462ff5e4d58 https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda#32e37e8fe9ef45c637ee38ad51377769 @@ -146,7 +146,7 @@ https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda#34e54f03dfea3e7a2dcf1453a85f1085 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda#ba3dcdc8584155c97c648ae9c044b7a3 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-ha62d5e7_3.conda#55eaf7066da1299d217ab32baedc7fa8 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.3-h3aafcba_1.conda#54f62a10a7dcc7e46b149e2d078299b5 https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py313hf46b229_1.conda#d0616e7935acab407d1543b28c446f6f https://conda.anaconda.org/conda-forge/linux-64/coverage-7.14.1-py313h3dea7bd_0.conda#86bbb569988f077e5cb30acac5799599 https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 @@ -164,7 +164,7 @@ https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda# https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py313h80991f8_0.conda#7245f1bbf52ed5e3818d742f51b44a7d https://conda.anaconda.org/conda-forge/linux-64/proj-9.8.1-he0df7b0_0.conda#b23619e5e9009eaa070ead0342034027 -https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 +https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.1-pyhcf101f3_0.conda#8685d811ee857a0435d88f75c083646d https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.4.0-pyhcf101f3_0.conda#fb1e5c138e2d933e59b3fa0462acc5e6 https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.13-h4df99d1_100.conda#fd00e4b24ea88093c93f5c9bad27b52f @@ -174,7 +174,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.3-hb03c661_0.cond https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.7-hb03c661_0.conda#665d152b9c6e78da404086088077c844 https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f https://conda.anaconda.org/conda-forge/noarch/anyio-4.13.0-pyhcf101f3_0.conda#af2df4b9108808da3dc76710fe50eae2 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.2-he6ee468_1.conda#50ae8372984b8b98e056ac8f6b70ab29 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.4-h00bea6e_0.conda#3a36b9efa77c11214308630ddb91496a https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda#809f4cde7c853f437becc43415a2ecdf https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-h215f996_4.conda#b39dccf5af984bcb68ee2aa0f3213ea6 https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py313hf6604e3_0.conda#a5fdb80595ec7912e6b1634b2abd4b50 @@ -183,11 +183,11 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda#6a https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.0.5-pyhcf101f3_0.conda#730021037e2ce4c65f8eca077e35a821 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py313h7037e92_0.conda#cb423e0853b3dde2b3738db4dedf5ba2 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda#cbb88288f74dbe6ada1c6c7d0a97223e -https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.4.1-pyhcf101f3_0.conda#ddc725661513322f9acf3443ce94ce61 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.4.2-pyhcf101f3_0.conda#52434c636a05a06806d0978128d98c19 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py313h54dd161_1.conda#710d4663806d0f72b2fb414e936223b5 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py313h29aa505_1.conda#c63d5f9d63fe2f48b0ad75005fcae7ba https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py313hc8edb43_4.conda#33639459bc29437315d4bff9ed5bc7a7 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_h87a9417_105.conda#0d0595612fa229dddb5fc565c260a11f +https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_hee75f7e_106.conda#16f05278317ac89d2dbd2898c4f8e3d6 https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb https://conda.anaconda.org/conda-forge/noarch/identify-2.6.19-pyhd8ed1ab_0.conda#84a3233b709a289a4ddd7a2fd27dd988 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.9-h1588d4d_1.conda#115ecf05370670f93bc81a8c4f7fd57f @@ -198,7 +198,7 @@ https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py313h4b8bb8b_1.conda#4b098461b0b5edff1a9359c25e675cfd https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-10.0.5-h8c3c6de_0.conda#3c8ff4c1bc8528d16d151582cba9e3a9 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py313had47c43_2.conda#6e550dd748e9ac9b2925411684e076a1 -https://conda.anaconda.org/conda-forge/noarch/tox-4.55.0-pyhcf101f3_0.conda#7760c17af7fcb6ef96e840a5d2533c94 +https://conda.anaconda.org/conda-forge/noarch/tox-4.55.1-pyhcf101f3_0.conda#b36d5dae98d2d22f1f8b7273f5813849 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.1-py313h29aa505_0.conda#3942b6a86fe92d0888b3373f2c1e1676 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 @@ -208,7 +208,7 @@ https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.6.0-pyha770c72_0.cond https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py313h08cd8bf_1.conda#a0d8dc5c90850d9f1a79f69c98aef0ff https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.47.0-ha1d8304_0.conda#3ef42f61d9a66a0749cbe598b5acdeea https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py311h498b1eb_107.conda#7f5488cf61943e6221325b454c2c2e9c -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.5.10-pyhd8ed1ab_0.conda#cee830ab52204b8d999bd54e84ccf328 +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.6.2-pyhd8ed1ab_0.conda#ecdafb6a10df41e1249d707532ccefd9 https://conda.anaconda.org/conda-forge/noarch/iris-3.15.0-pyha770c72_0.conda#bfe6588cbbd6e2e97e9439f95de02af8 https://conda.anaconda.org/conda-forge/noarch/nox-2026.4.10-pyhc364b38_0.conda#10df85d0d06301e961c8b27805f66a56 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.47.0-np2py313hc18bace_0.conda#5ac58ad77ebc56ba99f965562315a69c diff --git a/requirements/locks/py314-linux-64.lock b/requirements/locks/py314-linux-64.lock index 2cf5e986..bba295d3 100644 --- a/requirements/locks/py314-linux-64.lock +++ b/requirements/locks/py314-linux-64.lock @@ -13,7 +13,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_3.conda https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda#4a13eeac0b5c8e5b8ab496e6c4ddd829 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda#18335a698559cdbcd86150a48bf54ba6 https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda#57736f29cc2b0ec0b6c2952d3f101b6a -https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.6-hb03c661_0.conda#e36ad70a7e0b48f091ed6902f04c23b8 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.13.1-hb03c661_0.conda#f5f0be3aac62d771c3b0cad1d316d8e9 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda#d2ffd7602c02f2b316fd921d39876885 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda#920bb03579f15389b9e512095ad995b7 https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 @@ -28,7 +28,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0 https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda#b88d90cad08e6bc8ad540cb310a761fb https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda#2c21e66f50753a083cbe6b80f38268fa https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda#eba48a68a1a2b9d3c0d9511548db85db -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda#7dc38adcbf71e6b38748e919e16e0dce +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.2-h0c1763c_0.conda#062b0ac602fb0adf250e3dfa86f221c4 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda#5794b3bdc38177caf969dabd3af08549 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.1-h5347b49_0.conda#7d0a66598195ef00b6efc55aefc7453b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 @@ -40,10 +40,10 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda#1dafce8548e38671bea82e3f5c6ce22f https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.3-hb47aa4a_0.conda#607e13a8caac17f9a664bcab5302ce06 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a -https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.13-h2c9d079_1.conda#3c3d02681058c3d206b562b2e3bc337f -https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h8b1a151_0.conda#f16f498641c9e05b645fe65902df661a -https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-h8b1a151_4.conda#c7e3e08b7b1b285524ab9d74162ce40b -https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h8b1a151_0.conda#f8e1bcc5c7d839c5882e94498791be08 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.14-h8e43964_1.conda#eb6e8fb306b4025bf9c68b6c16db4e19 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h16e98cb_1.conda#673828462eb87b76c178b582b6e19824 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-h16e98cb_5.conda#a81045d3ce07a74751541de2bad6fa49 +https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h16e98cb_1.conda#8d963dc4805936cc294348743201d68e https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.1-h480dda7_0.conda#4d4efd0645cd556fab54617c4ad477ef https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda#c80d8a3b84358cb967fa81e7075fbc8a https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda#a752488c68f2e7c456bcbd8f16eec275 @@ -65,7 +65,7 @@ https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda#d7 https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.3-hc5a330e_0.conda#f2bd09e21c5844a12e2f5eefcd075555 https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda#98b6c9dc80eb87b2519b97bcf7e578dd https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda#2aadb0d17215603a82a2a6b0afd9a4cb -https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-hb18f61d_2.conda#d1337309873c443bcc9f118b67eed84e +https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-h955231c_3.conda#a3581835895ca9b7782beb5a49746db7 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda#2c2fae981fd2afd00812c92ac47d023d https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda#af39b9a8711d4a8d437b52c1d78eb6a1 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 @@ -78,13 +78,13 @@ https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#c https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda#e79d2c2f24b027aa8d5ab1b1ba3061e7 https://conda.anaconda.org/conda-forge/linux-64/python-3.14.5-habeac84_100_cp314.conda#da92e59ff92f2d5ede4f612af20f583f https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.1-hbc0de68_0.conda#8e0b8654ead18e50af552e54b5a08a61 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.2-hbc0de68_0.conda#38d9bf35a4cc83094a327811e548b660 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda#861fb6ccbc677bb9a9fb2468430b9c6a https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda#1fd9696649f65fd6611fcdb4ffec738a https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.6.3-pyhd8ed1ab_0.conda#8f37c8fb7116a18da04e52fa9e2c8df9 https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda#c6b0543676ecb1fb2d7643941fe375f2 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.13-h4bacb7b_0.conda#77f70a9ab785a146dbf66fba00131403 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-hcbcd92d_1.conda#333fa38d6dfe23cd68c67e20cb1726c9 https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda#f1976ce927373500cc19d3c0b2c85177 https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda#1133126d840e75287d83947be3fc3e71 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda#8ccf913aaba749a5496c17629d859ed1 @@ -99,9 +99,9 @@ https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda# https://conda.anaconda.org/conda-forge/noarch/colorlog-6.10.1-pyh707e725_0.conda#33e96df3785bf61676ffee387e5a19e5 https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.5-py314hd8ed1ab_100.conda#a749029ce5d0632a913db19d17f944ab https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda#4c2a8fef270f6c69591889b93f9f55c1 -https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 +https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.1-pyhcf101f3_1.conda#f8638ae693ee89e9069ed4f3b77a6be9 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda#24c1ca34138ee57de72a943237cde4cc -https://conda.anaconda.org/conda-forge/noarch/filelock-3.29.0-pyhd8ed1ab_0.conda#8fa8358d022a3a9bd101384a808044c6 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.29.1-pyhd8ed1ab_0.conda#917880ebad7632e8a52eada085b98ce9 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda#fa9e9ec7bf26619a8edd3e11155f15d6 https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_0.conda#8462b5322567212beeb025f3519fb3e2 https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.4.0-pyhd8ed1ab_0.conda#2c11aa96ea85ced419de710c1c3a78ff @@ -113,7 +113,7 @@ https://conda.anaconda.org/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda#9614359868482abba1bd15ce465e3c42 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.5.2-pyhd8ed1ab_0.conda#895f6625dd8a246fece9279fcc12c1de https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py314h97ea11e_0.conda#7397e418cab519b8d789936cf2dde6f6 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_0.conda#f92f984b558e6e6204014b16d212b271 +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_1.conda#8b3ce45e929cd8e8e5f4d18586b56d8b https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-8_h4a7cf45_openblas.conda#00fc660ab1b2f5ca07e92b4900d10c79 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.20.0-hcf29cc6_0.conda#c3cc2864f82a944bc90a7beb4d3b0e88 https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_3.conda#ec3c4350aa0261bf7f87b8ca15c8e80e @@ -123,7 +123,7 @@ https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda#37293a85a0f4f77bbd9cf7aaefc62609 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda#4c06a92e74452cfa53623a81592e8934 -https://conda.anaconda.org/conda-forge/noarch/pip-26.1.1-pyh145f28c_0.conda#2e7e59a063366f1fc4f45ac86bd9485f +https://conda.anaconda.org/conda-forge/noarch/pip-26.1.2-pyh145f28c_0.conda#733cc07ed34162ac50b936464b163366 https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.10.0-pyhcf101f3_0.conda#2c5ef45db85d34799771629bd5860fd7 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda#d7585b6550ad04c8c5e21097ada2888e https://conda.anaconda.org/conda-forge/noarch/pycparser-3.0-pyhcf101f3_0.conda#9c5491066224083c41b6d5635ed7107b @@ -137,7 +137,7 @@ https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0. https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda#8e194e7b992f99a5015edbd4ebd38efd https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda#03fe290994c5e4ec17293cfb6bdce520 -https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.1.0-pyhd8ed1ab_0.conda#1590bceae37377cecba443c83a44c404 +https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.1.1-pyhd8ed1ab_0.conda#46b6abe31482f6bca064b965696ae807 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda#fa839b5ff59e192f411ccc7dae6588bb https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda#b5325cf06a000c5b14970462ff5e4d58 https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda#32e37e8fe9ef45c637ee38ad51377769 @@ -147,7 +147,7 @@ https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py314h5bd0f2 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda#34e54f03dfea3e7a2dcf1453a85f1085 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda#ba231da7fccf9ea1e768caf5c7099b84 https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda#ba3dcdc8584155c97c648ae9c044b7a3 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-ha62d5e7_3.conda#55eaf7066da1299d217ab32baedc7fa8 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.3-h3aafcba_1.conda#54f62a10a7dcc7e46b149e2d078299b5 https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda#cf45f4278afd6f4e6d03eda0f435d527 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.14.1-py314h67df5f8_0.conda#2af0e1fec00680b1b6ef3859585ca8fa https://conda.anaconda.org/conda-forge/noarch/dependency-groups-1.3.1-pyhe01879c_0.conda#b36dcdb7288182d4ddadb60c489f3d62 @@ -165,7 +165,7 @@ https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda# https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py314h8ec4b1a_0.conda#76c4757c0ec9d11f969e8eb44899307b https://conda.anaconda.org/conda-forge/linux-64/proj-9.8.1-he0df7b0_0.conda#b23619e5e9009eaa070ead0342034027 -https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda#b706680f6701b9eea01702442c9bebc0 +https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.1-pyhcf101f3_0.conda#8685d811ee857a0435d88f75c083646d https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.4.0-pyhcf101f3_0.conda#fb1e5c138e2d933e59b3fa0462acc5e6 https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.5-h4df99d1_100.conda#41954747ba952ec4b01e16c2c9e8d8ff @@ -175,7 +175,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.3-hb03c661_0.cond https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.7-hb03c661_0.conda#665d152b9c6e78da404086088077c844 https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f https://conda.anaconda.org/conda-forge/noarch/anyio-4.13.0-pyhcf101f3_0.conda#af2df4b9108808da3dc76710fe50eae2 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.2-he6ee468_1.conda#50ae8372984b8b98e056ac8f6b70ab29 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.4-h00bea6e_0.conda#3a36b9efa77c11214308630ddb91496a https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda#809f4cde7c853f437becc43415a2ecdf https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-h215f996_4.conda#b39dccf5af984bcb68ee2aa0f3213ea6 https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py314h2b28147_0.conda#f49b5f950379e0b97c35ca97682f7c6a @@ -184,11 +184,11 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda#6a https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-10.0.5-pyhcf101f3_0.conda#730021037e2ce4c65f8eca077e35a821 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py314h9891dd4_0.conda#5d3c008e54c7f49592fca9c32896a76f https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda#cbb88288f74dbe6ada1c6c7d0a97223e -https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.4.1-pyhcf101f3_0.conda#ddc725661513322f9acf3443ce94ce61 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.4.2-pyhcf101f3_0.conda#52434c636a05a06806d0978128d98c19 https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py314h0f05182_1.conda#2930a6e1c7b3bc5f66172e324a8f5fc3 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py314hc02f841_1.conda#552b5d9d8a2a4be882e1c638953e7281 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py314h97ea11e_4.conda#95bede9cdb7a30a4b611223d52a01aa4 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_h87a9417_105.conda#0d0595612fa229dddb5fc565c260a11f +https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_hee75f7e_106.conda#16f05278317ac89d2dbd2898c4f8e3d6 https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda#4f14640d58e2cc0aa0819d9d8ba125bb https://conda.anaconda.org/conda-forge/noarch/identify-2.6.19-pyhd8ed1ab_0.conda#84a3233b709a289a4ddd7a2fd27dd988 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.9-h1588d4d_1.conda#115ecf05370670f93bc81a8c4f7fd57f @@ -199,7 +199,7 @@ https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py314hf07bd8e_1.conda#718437171257e579e7d1f3b51c62536f https://conda.anaconda.org/conda-forge/noarch/setuptools_scm-10.0.5-h8c3c6de_0.conda#3c8ff4c1bc8528d16d151582cba9e3a9 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py314hbe3edd8_2.conda#5963e6ee81772d450a35e6bc95522761 -https://conda.anaconda.org/conda-forge/noarch/tox-4.55.0-pyhcf101f3_0.conda#7760c17af7fcb6ef96e840a5d2533c94 +https://conda.anaconda.org/conda-forge/noarch/tox-4.55.1-pyhcf101f3_0.conda#b36d5dae98d2d22f1f8b7273f5813849 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.3.1-py314hc02f841_0.conda#de50a60eab348de04809a33e180b4b01 https://conda.anaconda.org/conda-forge/noarch/codecov-2.1.13-pyhd8ed1ab_1.conda#d924fe46139596ebc3d4d424ec39ed51 https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda#d6989ead454181f4f9bc987d3dc4e285 @@ -209,7 +209,7 @@ https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.6.0-pyha770c72_0.cond https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py314ha0b5721_1.conda#fe89c5fa422f215b0d75046ecd4667de https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.47.0-ha1d8304_0.conda#3ef42f61d9a66a0749cbe598b5acdeea https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py311h498b1eb_107.conda#7f5488cf61943e6221325b454c2c2e9c -https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.5.10-pyhd8ed1ab_0.conda#cee830ab52204b8d999bd54e84ccf328 +https://conda.anaconda.org/conda-forge/noarch/pbs-installer-2026.6.2-pyhd8ed1ab_0.conda#ecdafb6a10df41e1249d707532ccefd9 https://conda.anaconda.org/conda-forge/noarch/iris-3.15.0-pyha770c72_0.conda#bfe6588cbbd6e2e97e9439f95de02af8 https://conda.anaconda.org/conda-forge/noarch/nox-2026.4.10-pyhc364b38_0.conda#10df85d0d06301e961c8b27805f66a56 https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-2.47.0-np2py314h56abb78_0.conda#a1d80eb92819fdbdc748451545ec95aa From b84fb6ae227c02b1a9ae24cdc2bac7961d5f499b Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Thu, 18 Jun 2026 12:45:20 +0100 Subject: [PATCH 573/583] WIP: beginnings of gdt40 save. --- .../test_grid_definition_section.py | 346 +++++++----------- .../round_trip/test_latscan_check.py | 26 ++ 2 files changed, 167 insertions(+), 205 deletions(-) create mode 100644 src/iris_grib/tests/integration/round_trip/test_latscan_check.py diff --git a/src/iris_grib/tests/integration/round_trip/test_grid_definition_section.py b/src/iris_grib/tests/integration/round_trip/test_grid_definition_section.py index 124accd4..9f050b9e 100644 --- a/src/iris_grib/tests/integration/round_trip/test_grid_definition_section.py +++ b/src/iris_grib/tests/integration/round_trip/test_grid_definition_section.py @@ -14,6 +14,7 @@ from typing import Literal import numpy as np +import pytest from iris import load_cube, save from iris.coord_systems import GeogCS, PolarStereographic, RotatedGeogCS, Stereographic @@ -22,209 +23,144 @@ from iris.util import is_regular from iris_grib.grib_phenom_translation import GRIBCode - - -class TestGDT5(tests.TestGribMessage): - def test_save_load(self): - # Load sample UKV data (variable-resolution rotated grid). - path = tests.get_data_path(("PP", "ukV1", "ukVpmslont.pp")) - cube = load_cube(path) - - # Extract a single 2D field, for simplicity. - self.assertEqual(cube.ndim, 3) - self.assertEqual(cube.coord_dims("time"), (0,)) - cube = cube[0] - - # Check that it has a rotated-pole variable-spaced grid, as expected. - x_coord = cube.coord(axis="x") - self.assertIsInstance(x_coord.coord_system, RotatedGeogCS) - self.assertFalse(is_regular(x_coord)) - - # Write to temporary file, check that key contents are in the file, - # then load back in. - with self.temp_filename("ukv_sample.grib2") as temp_file_path: - save(cube, temp_file_path) - - # Check that various aspects of the saved file are as expected. - expect_values = ( - (0, "editionNumber", 2), - (3, "gridDefinitionTemplateNumber", 5), - (3, "Ni", cube.shape[-1]), - (3, "Nj", cube.shape[-2]), - (3, "shapeOfTheEarth", 6), - (3, "scaledValueOfRadiusOfSphericalEarth", 0), - (3, "resolutionAndComponentFlags", 0), - (3, "latitudeOfSouthernPole", -37500000), - (3, "longitudeOfSouthernPole", 357500000), - (3, "angleOfRotation", 0), - ) - self.assertGribMessageContents(temp_file_path, expect_values) - - # Load the Grib file back into a new cube. - cube_loaded_from_saved = load_cube(temp_file_path) - # Also load data, before the temporary file gets deleted. - cube_loaded_from_saved.data - - # The re-loaded result will not match the original in every respect: - # * cube attributes are discarded - # * horizontal coordinates are rounded to an integer representation - # * bounds on horizontal coords are lost - # Thus the following "equivalence tests" are rather piecemeal.. - - # Check those re-loaded properties which should match the original. - for test_cube in (cube, cube_loaded_from_saved): - self.assertEqual(test_cube.standard_name, "air_pressure_at_sea_level") - self.assertEqual(test_cube.units, "Pa") - self.assertEqual(test_cube.shape, (928, 744)) - self.assertEqual(test_cube.cell_methods, ()) - - # Check only the GRIB_PARAM attribute exists on the re-loaded cube. - # Note: this does *not* match the original, but is as expected. - self.assertEqual( - cube_loaded_from_saved.attributes, - {"GRIB_PARAM": GRIBCode("GRIB2:d000c003n001")}, +from iris_grib.message import GribMessage + + +def assert_grib_message_contents(filename, contents): + for message in GribMessage.messages_from_filename(filename): + for section, key, expected in contents: + assert message.sections[section][key] == expected + + +def test_gdt5_save_load(tmp_path): + # Load sample UKV data (variable-resolution rotated grid). + path = tests.get_data_path(("PP", "ukV1", "ukVpmslont.pp")) + cube = load_cube(path) + + # Extract a single 2D field, for simplicity. + assert cube.ndim == 3 + assert cube.coord_dims("time") == (0,) + cube = cube[0] + + # Check that it has a rotated-pole variable-spaced grid, as expected. + x_coord = cube.coord(axis="x") + assert isinstance(x_coord.coord_system, RotatedGeogCS) + assert not is_regular(x_coord) + + temp_file_path = tmp_path / "ukv_sample.grib2" + save(cube, temp_file_path) + + expect_values = ( + (0, "editionNumber", 2), + (3, "gridDefinitionTemplateNumber", 5), + (3, "Ni", cube.shape[-1]), + (3, "Nj", cube.shape[-2]), + (3, "shapeOfTheEarth", 6), + (3, "scaledValueOfRadiusOfSphericalEarth", 0), + (3, "resolutionAndComponentFlags", 0), + (3, "latitudeOfSouthernPole", -37500000), + (3, "longitudeOfSouthernPole", 357500000), + (3, "angleOfRotation", 0), + ) + assert_grib_message_contents(temp_file_path, expect_values) + + cube_loaded_from_saved = load_cube(temp_file_path) + _ = cube_loaded_from_saved.data + + # The re-loaded result will not match the original in every respect: + # * cube attributes are discarded + # * horizontal coordinates are rounded to an integer representation + # * bounds on horizontal coords are lost + # Thus the following "equivalence tests" are rather piecemeal. + for test_cube in (cube, cube_loaded_from_saved): + assert test_cube.standard_name == "air_pressure_at_sea_level" + assert test_cube.units == "Pa" + assert test_cube.shape == (928, 744) + assert test_cube.cell_methods == () + + assert cube_loaded_from_saved.attributes == { + "GRIB_PARAM": GRIBCode("GRIB2:d000c003n001") + } + + co_names = [coord.name() for coord in cube.coords()] + co_names_reload = [coord.name() for coord in cube_loaded_from_saved.coords()] + assert sorted(co_names_reload) == sorted(co_names) + + for coord_name in co_names: + co_orig = cube.coord(coord_name) + co_load = cube_loaded_from_saved.coord(coord_name) + assert co_load.shape == co_orig.shape, ( + f'Shape of re-loaded "{coord_name}" coord is {co_load.shape} ' + f"instead of {co_orig.shape}" ) - - # Now remaining to check: coordinates + data... - - # Check they have all the same coordinates. - co_names = [coord.name() for coord in cube.coords()] - co_names_reload = [coord.name() for coord in cube_loaded_from_saved.coords()] - self.assertEqual(sorted(co_names_reload), sorted(co_names)) - - # Check all the coordinates. - for coord_name in co_names: - try: - co_orig = cube.coord(coord_name) - co_load = cube_loaded_from_saved.coord(coord_name) - - # Check shape. - self.assertEqual( - co_load.shape, - co_orig.shape, - 'Shape of re-loaded "{}" coord is {} instead of {}'.format( - coord_name, co_load.shape, co_orig.shape - ), - ) - - # Check coordinate points equal, within a tolerance. - self.assertArrayAllClose(co_load.points, co_orig.points, rtol=1.0e-6) - - # Check all coords are unbounded. - # (NOTE: this is not so for the original X and Y coordinates, - # but Grib does not store those bounds). - self.assertIsNone(co_load.bounds) - - except AssertionError as err: - self.assertTrue( - False, - 'Failed on coordinate "{}" : {}'.format(coord_name, str(err)), - ) - - # Check that main data array also matches. - self.assertArrayAllClose(cube.data, cube_loaded_from_saved.data) - - -class GDT20Common: - """'Wrapper' to avoid class being detected during test runs.""" - - class GDT20Common(tests.TestGribMessage): - """Roundtrip testing that attributes save+load correctly.""" - - # Enable subclassing to test different permutations. - coord_system_class: type[Stereographic] - pole: Literal["north", "south"] - - def setUp(self): - # Create a Cube to save, inspired by - # iris-sample-data toa_brightness_stereographic.nc - if self.pole == "north": - central_lat = 90 - elif self.pole == "south": - central_lat = -90 - else: - raise NotImplementedError(f"Invalid pole: {self.pole}") - - self.coord_system_kwargs = dict( - central_lat=central_lat, - central_lon=325, - true_scale_lat=central_lat, - ellipsoid=GeogCS(6378169.0), - ) - coord_system = self.coord_system_class(**self.coord_system_kwargs) - - coord_kwargs = dict( - units="m", - coord_system=coord_system, - ) - coord_x = DimCoord( - np.linspace(-2250000, 6750192, 256, endpoint=False), - standard_name="projection_x_coordinate", - **coord_kwargs, - ) - coord_y = DimCoord( - np.linspace(-980000, -6600000, 160, endpoint=False), - standard_name="projection_y_coordinate", - **coord_kwargs, - ) - coord_t = DimCoord( - 0, standard_name="time", units="hours since 1970-01-01 00:00:00" - ) - coord_fp = DimCoord(0, standard_name="forecast_period", units="hours") - coord_frt = DimCoord( - 0, standard_name="forecast_reference_time", units=coord_t.units - ) - shape = (coord_y.shape[0], coord_x.shape[0]) - self.cube = Cube( - np.arange(np.prod(shape), dtype=float).reshape(shape), - dim_coords_and_dims=[(coord_y, 0), (coord_x, 1)], - aux_coords_and_dims=[ - (coord_t, None), - (coord_fp, None), - (coord_frt, None), - ], - ) - - def test_save_load(self): - with self.temp_filename("polar_stereo.grib2") as temp_file_path: - save(self.cube, temp_file_path) - cube_reloaded = load_cube(temp_file_path) - # Touch the data before destroying the file. - _ = cube_reloaded.data - - cube_expected = self.cube.copy() - for coord in cube_expected.dim_coords: - # GRIB only describes PolarStereographic, so we always expect - # that system even when we started with Stereographic. - coord.coord_system = PolarStereographic(**self.coord_system_kwargs) - - # Modifications to remove irrelevant inequalities. - del cube_reloaded.attributes["GRIB_PARAM"] - for coord in cube_reloaded.dim_coords: - coord.points = np.round(coord.points) - - self.assertEqual(cube_expected, cube_reloaded) - - -class TestGDT20StereoNorth(GDT20Common.GDT20Common): - coord_system_class = Stereographic - pole = "north" - - -class TestGDT20StereoSouth(GDT20Common.GDT20Common): - coord_system_class = Stereographic - pole = "south" - - -class TestGDT20PolarNorth(GDT20Common.GDT20Common): - coord_system_class = PolarStereographic - pole = "north" - - -class TestGDT20PolarSouth(GDT20Common.GDT20Common): - coord_system_class = PolarStereographic - pole = "south" - - -if __name__ == "__main__": - tests.main() + np.testing.assert_allclose(co_load.points, co_orig.points, rtol=1.0e-6) + + # Grib does not store x/y bounds, so all re-loaded coords are unbounded. + assert co_load.bounds is None + + np.testing.assert_allclose(cube.data, cube_loaded_from_saved.data) + + +@pytest.mark.parametrize( + ("coord_system_class", "pole"), + [ + (Stereographic, "north"), + (Stereographic, "south"), + (PolarStereographic, "north"), + (PolarStereographic, "south"), + ], +) +def test_gdt20_save_load( + coord_system_class: type[Stereographic], + pole: Literal["north", "south"], + tmp_path, +): + central_lat = 90 if pole == "north" else -90 + coord_system_kwargs = dict( + central_lat=central_lat, + central_lon=325, + true_scale_lat=central_lat, + ellipsoid=GeogCS(6378169.0), + ) + coord_system = coord_system_class(**coord_system_kwargs) + + coord_kwargs = dict(units="m", coord_system=coord_system) + coord_x = DimCoord( + np.linspace(-2250000, 6750192, 256, endpoint=False), + standard_name="projection_x_coordinate", + **coord_kwargs, + ) + coord_y = DimCoord( + np.linspace(-980000, -6600000, 160, endpoint=False), + standard_name="projection_y_coordinate", + **coord_kwargs, + ) + coord_t = DimCoord(0, standard_name="time", units="hours since 1970-01-01 00:00:00") + coord_fp = DimCoord(0, standard_name="forecast_period", units="hours") + coord_frt = DimCoord( + 0, standard_name="forecast_reference_time", units=coord_t.units + ) + + shape = (coord_y.shape[0], coord_x.shape[0]) + cube = Cube( + np.arange(np.prod(shape), dtype=float).reshape(shape), + dim_coords_and_dims=[(coord_y, 0), (coord_x, 1)], + aux_coords_and_dims=[(coord_t, None), (coord_fp, None), (coord_frt, None)], + ) + + temp_file_path = tmp_path / "polar_stereo.grib2" + save(cube, temp_file_path) + cube_reloaded = load_cube(temp_file_path) + _ = cube_reloaded.data + + cube_expected = cube.copy() + for coord in cube_expected.dim_coords: + # GRIB only describes PolarStereographic, so we always expect that + # system even when we started with Stereographic. + coord.coord_system = PolarStereographic(**coord_system_kwargs) + + del cube_reloaded.attributes["GRIB_PARAM"] + for coord in cube_reloaded.dim_coords: + coord.points = np.round(coord.points) + + assert cube_expected == cube_reloaded diff --git a/src/iris_grib/tests/integration/round_trip/test_latscan_check.py b/src/iris_grib/tests/integration/round_trip/test_latscan_check.py new file mode 100644 index 00000000..9cab36cb --- /dev/null +++ b/src/iris_grib/tests/integration/round_trip/test_latscan_check.py @@ -0,0 +1,26 @@ +import numpy as np + +lats = [20, 20, 20, 30, 30, 30, 30, 50, 50, 70] +lons = [0, 15, 30, 0, 10, 20, 30, 0, 30, 15] + + +def test_lats(): + global lats, lons + mylats = np.array(lats) + mylons = np.array(lons) + (n_lats,) = mylats.shape + diffs = np.diff(mylats) + assert np.all(diffs >= 0) or np.all(diffs <= 0) + levs = np.array(sorted(set(mylats))) + (n_levs,) = levs.shape + hits = mylats.reshape(n_lats, 1) == levs.reshape(1, n_levs) + lev_counts = hits.sum(axis=0) + print("lev_counts =", lev_counts) + for lev in levs: + lons_at_lev = mylons[lats == lev] + # check lons within each lev are distinct and monotonic + n_lons_at_lev = len(lons_at_lev) + if n_lons_at_lev > 1: + assert len(set(lons_at_lev)) == n_lons_at_lev + diffs = np.diff(lons_at_lev) + assert np.all(diffs >= 0) or np.all(diffs <= 0) From 5e3c113e826b40e448a5e533ad4fbb681d368c31 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Wed, 24 Jun 2026 16:57:06 +0100 Subject: [PATCH 574/583] WIP: just barely working to save reduced gaussian grids to gdt40. --- pyproject.toml | 1 + src/iris_grib/__init__.py | 20 ++- src/iris_grib/_save_rules.py | 162 ++++++++++++++++-- .../test_grid_definition_section.py | 20 +++ 4 files changed, 184 insertions(+), 19 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 479cba55..379d31b3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -123,6 +123,7 @@ disallow_untyped_defs = false # 964 errors disallow_incomplete_defs = false # 3 errors check_untyped_defs = false # 100 errors no_implicit_reexport = false # 134 errors +disallow_untyped_decorators = false # 1 error? exclude = [ 'noxfile\.py', diff --git a/src/iris_grib/__init__.py b/src/iris_grib/__init__.py index b6dfd177..6e03d945 100644 --- a/src/iris_grib/__init__.py +++ b/src/iris_grib/__init__.py @@ -349,15 +349,31 @@ def save_pairs_from_cube(cube): slice of the input and each``field`` is an eccodes message "id". N.B. the message "id"s are integer handles. """ + dim_coords = True x_coords = cube.coords(axis="x", dim_coords=True) y_coords = cube.coords(axis="y", dim_coords=True) + if not x_coords and not y_coords: + # Try aux-coords if there are no dim-coords : needed for gaussian data + # NB in this case we won't rely on axis logic, but simply assume that the + # required coordinates are always "latitude" and "longitude". + # This excludes rotated gaussian grids, but we don't support those (yet). + dim_coords = False + x_coords = cube.coords("longitude") + y_coords = cube.coords("latitude") + if len(x_coords) != 1 or len(y_coords) != 1: raise TranslationError("Did not find one (and only one) x or y coord") + (x_coord,) = x_coords + (y_coord,) = y_coords + # Save each latlon slice2D in the cube - for slice2D in cube.slices([y_coords[0], x_coords[0]]): + slice_param = [y_coord, x_coord] if dim_coords else [x_coord] + for slice2D in cube.slices(slice_param): grib_message = eccodes.codes_grib_new_from_samples("GRIB2") - _save_rules.run(slice2D, grib_message, cube) + result = _save_rules.run(slice2D, grib_message, cube, x_coord, y_coord) + if result is not None: + grib_message = result yield (slice2D, grib_message) diff --git a/src/iris_grib/_save_rules.py b/src/iris_grib/_save_rules.py index 5bb3f959..dc2f6e65 100644 --- a/src/iris_grib/_save_rules.py +++ b/src/iris_grib/_save_rules.py @@ -31,7 +31,6 @@ ) from iris.exceptions import TranslationError - from . import grib_phenom_translation as gptx from ._grib2_convert import ( _STATISTIC_TYPE_NAMES, @@ -127,9 +126,10 @@ def identification(cube, grib): ############################################################################### -def shape_of_the_earth(cube, grib): +def shape_of_the_earth(cube, grib, cs=None): # assume latlon - cs = cube.coord(dimensions=[0]).coord_system + if cs is None: + cs = cube.coord(dimensions=[0]).coord_system def _set_octets( earth_shape: int | None = None, @@ -276,7 +276,7 @@ def horizontal_grid_common(cube, grib, xy=False): y_coord = cube.coord(dimensions=[0]) x_coord = cube.coord(dimensions=[1]) shape_of_the_earth(cube, grib) - grid_dims(x_coord, y_coord, grib, nx_str, ny_str) + grid_dims(x_coord, y_coord, grib, nx_str, ny_str) # ni,nj / nx,ny scanning_mode_flags(x_coord, y_coord, grib) @@ -826,7 +826,117 @@ def grid_definition_template_140(cube, grib): raise TranslationError(msg) -def grid_definition_section(cube, grib): +def is_grid_definition_template_40(cube, grib, x_coord, y_coord): + # N.B. unlike the other template definitions, this one returns a success response. + # This is simply because it is complicated to determine whether the given lats and + # lons belong to a gaussian grid, and it is necessary to attempt to create a + # grib message to find out. + # + # In use, this is only called when we already know that we have lats + lons, and the + # lats are not regular. + # If this routine returns "False", the caller should fallback to GDT3.4 + # = "irregular lat-lon". + result = None + lons, lats = x_coord.points, y_coord.points + ydiffs = np.diff(lats) + # Must have some repeated values. + if not np.any(ydiffs == 0): + return result + # Otherwise must be monotonic + yd_min = ydiffs.min() + yd_max = ydiffs.max() + lats_increasing = yd_max > 0 + if (lats_increasing and yd_min < 0) or (not lats_increasing and yd_min > 0): + return result + + # Check the expected structure of the data: + # each lat-val occupies a contiguous block, + # within which the lon vals are (strictly) monotonic. + lat_vals = np.array(sorted(set(lats))) + n_lat_vals = len(lat_vals) + if n_lat_vals % 2 != 0: + # ought to always divide by 2, since N parallels either side of equator + return result + if not lats_increasing: + # Put the set of latitude values into the expected order + lat_vals = lat_vals[::-1] + lons = x_coord.points + lons_increasing = np.diff(lons[lats == lat_vals[0]]).min() >= 0 + + ok = True + lon_repeats = [] + prev_maxind = -1 + for one_lat in lat_vals: + onelat_inds = np.where(lats == one_lat)[0] + n_onelats = len(onelat_inds) + i_min, i_max = onelat_inds[[0, -1]] + # Check that we are dealing with latitude values consistently in one direction + # - since the way we assemble 'lon_repeats' assumes that. + if i_min != prev_maxind + 1: + ok = False + break + prev_maxind = i_max + if (i_max - i_min + 1) != n_onelats: + ok = False + break + + lon_repeats.append(n_onelats) + onelat_lons = lons[i_min : i_max + 1] + if (lons_increasing and np.diff(onelat_lons).min() <= 0) or ( + not lons_increasing and np.diff(onelat_lons).max() >= 0 + ): + ok = False + break + + if ok is False: + return result + + # That's as much pre-check as we can handle ... + + # It seems that to get a functioning gaussian-grid message, we need to replace the + # passed-in 'grib' message with a new one, based on a different template. + grib = eccodes.codes_grib_new_from_samples("reduced_gg_sfc_grib2") + eccodes.codes_set(grib, "gridDefinitionTemplateNumber", 40) + + # .. unfortunately, we must re-run the 'identification' step + identification(cube, grib) + + # We want to do the equivalent of 'horizontal_common', but we can't call that as it + # calls "grid_dims" to set Ni/Nj, which we need to control differently. + # So we here call its other workers : "shape_of_the_earth" + "scanning_mode_flags" + shape_of_the_earth(cube, grib, cs=x_coord.coord_system) + scanning_mode_flags(x_coord, y_coord, grib) + + eccodes.codes_set( + grib, "latitudeOfFirstGridPoint", int(1.0e6 * lats[0]) + ) # in micro degrees + eccodes.codes_set(grib, "latitudeOfLastGridPoint", int(1.0e6 * lats[-1])) + eccodes.codes_set(grib, "longitudeOfFirstGridPoint", int(1.0e6 * lons[0])) + eccodes.codes_set(grib, "longitudeOfLastGridPoint", int(1.0e6 * lons[-1])) + + eccodes.codes_set(grib, "N", n_lat_vals / 2) + eccodes.codes_set(grib, "Nj", n_lat_vals) + eccodes.codes_set_missing(grib, "Ni") + + eccodes.codes_set_long(grib, "basicAngleOfTheInitialProductionDomain", 0) + eccodes.codes_set_long(grib, "resolutionAndComponentFlags", 0) + eccodes.codes_set_missing(grib, "iDirectionIncrement") + + eccodes.codes_set(grib, "numberOfOctectsForNumberOfPoints", 2) + eccodes.codes_set(grib, "interpretationOfNumberOfPoints", 1) + eccodes.codes_set_array(grib, "pl", list(lon_repeats)) + + # # Check the latitude values calculation + # # ??? but apparently, this can't be called in this way ??? + # y_points = eccodes.codes_get_array(grib, "distinctLatitudes") + # tolerance = (lats.max() - lats.min()) * 0.05 / n_lat_vals + # if not np.all(np.abs(y_points - lats) < tolerance): + # return result + + return grib + + +def grid_definition_section(cube, grib, x_coord, y_coord): """ Write the grid definition template. @@ -834,16 +944,18 @@ def grid_definition_section(cube, grib): based on the properties of the cube. """ - x_coord = cube.coord(dimensions=[1]) - y_coord = cube.coord(dimensions=[0]) - cs = x_coord.coord_system # N.B. already checked same cs for x and y. + result = None + cs = x_coord.coord_system # N.B. already CS exists and is the same for x and y. regular_x_and_y = is_regular(x_coord) and is_regular(y_coord) if isinstance(cs, GeogCS): if regular_x_and_y: grid_definition_template_0(cube, grib) else: - grid_definition_template_4(cube, grib) + # Check for gaussian lats+lons, and if not fallback on GDT3.4 + result = is_grid_definition_template_40(cube, grib, x_coord, y_coord) + if result is None: + grid_definition_template_4(cube, grib) elif isinstance(cs, RotatedGeogCS): # Rotated coordinate system cases. @@ -851,6 +963,8 @@ def grid_definition_section(cube, grib): if regular_x_and_y: grid_definition_template_1(cube, grib) else: + # N.B. we could here be dealing with data on a "rotated gaussion" grid, + # (GDT 3.41 or 3.43), but we don't yet support those. grid_definition_template_5(cube, grib) elif isinstance(cs, Mercator): @@ -879,6 +993,8 @@ def grid_definition_section(cube, grib): emsg = "Grib saving is not supported for coordinate system {!r}" raise ValueError(emsg.format(name)) + return result + ############################################################################### # @@ -1800,23 +1916,23 @@ def data_section(cube, grib): ############################################################################### -def gribbability_check(cube): +def gribbability_check(cube, x_coord, y_coord): "We always need the following things for grib saving." # GeogCS exists? - cs0 = cube.coord(dimensions=[0]).coord_system - cs1 = cube.coord(dimensions=[1]).coord_system + cs0 = x_coord.coord_system + cs1 = y_coord.coord_system if cs0 is None or cs1 is None: - raise TranslationError("CoordSystem not present") + raise TranslationError("CoordSystem not present on both X and Y coord") if cs0 != cs1: - raise TranslationError("Inconsistent CoordSystems") + raise TranslationError("Inconsistent CoordSystems between X and Y coords") # Time period exists? if not cube.coords("time"): raise TranslationError("time coord not found") -def run(slice2d_cube, grib, full3d_cube): +def run(slice2d_cube, grib, full3d_cube, x_coord, y_coord): """ Set the keys of the grib message based on the contents of the slice2d_cube. @@ -1835,17 +1951,29 @@ def run(slice2d_cube, grib, full3d_cube): the GRIB2 spec records hybrid coefficients for *all* the levels in every message. + * x_coord: + The selected x-coordinate + + * y_coord: + The selected y-coordinate + """ - gribbability_check(slice2d_cube) + gribbability_check(slice2d_cube, x_coord, y_coord) # Section 1 - Identification Section. identification(slice2d_cube, grib) # Section 3 - Grid Definition Section (Grid Definition Template) - grid_definition_section(slice2d_cube, grib) + result = grid_definition_section(slice2d_cube, grib, x_coord, y_coord) + if result is not None: + # message was replaced : must also re-run ID phase + grib = result + identification(slice2d_cube, grib) # Section 4 - Product Definition Section (Product Definition Template) product_definition_section(slice2d_cube, grib, full3d_cube) # Section 5 - Data Representation Section (Data Representation Template) data_section(slice2d_cube, grib) + + return result diff --git a/src/iris_grib/tests/integration/round_trip/test_grid_definition_section.py b/src/iris_grib/tests/integration/round_trip/test_grid_definition_section.py index 9f050b9e..e39b6abb 100644 --- a/src/iris_grib/tests/integration/round_trip/test_grid_definition_section.py +++ b/src/iris_grib/tests/integration/round_trip/test_grid_definition_section.py @@ -164,3 +164,23 @@ def test_gdt20_save_load( coord.points = np.round(coord.points) assert cube_expected == cube_reloaded + + +def test_gdt40_loadsave(tmp_path): + loadpath = tests.get_data_path(("GRIB", "reduced", "reduced_gg.grib2")) + cube = load_cube(loadpath) + # This kludge is needed for now to make it saveable + # - ASIS: fails to add pressure factory on load, so has no vertical coord + cube.coord("level_pressure").rename("pressure") + savepath = tmp_path / "tmp.grib2" + save(cube, savepath) + cube_reloaded = load_cube(savepath) + + def coord_dims_names(cube): + return [ + [co.name() for co in cube.coords(dimension=i_dim)] + for i_dim in range(cube.ndim) + ] + + assert coord_dims_names(cube_reloaded) == coord_dims_names(cube) + assert np.all(cube_reloaded.data == cube.data) From e5ea874060d0513c04edff8cb09a974502879068 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Wed, 24 Jun 2026 17:09:20 +0100 Subject: [PATCH 575/583] Added the TEMPLATE_RECORD facility. --- src/iris_grib/__init__.py | 8 +- src/iris_grib/_grib2_convert.py | 48 ++++++ src/iris_grib/_save_rules.py | 147 +++++++++--------- .../test_grid_definition_section.py | 56 +++++-- 4 files changed, 176 insertions(+), 83 deletions(-) diff --git a/src/iris_grib/__init__.py b/src/iris_grib/__init__.py index 6e03d945..927918f4 100644 --- a/src/iris_grib/__init__.py +++ b/src/iris_grib/__init__.py @@ -19,6 +19,7 @@ from iris.exceptions import TranslationError from . import _save_rules +from ._grib2_convert import TEMPLATE_RECORD from ._load_convert import convert as load_convert from .message import GribMessage @@ -32,6 +33,7 @@ # TODO: publish grib1 loading controls, when ready to announce # "GRIB1_LOADING_MODE", # "Grib1LoadingMode", + "TEMPLATE_RECORD", "load_cubes", "load_pairs_from_fields", "save_grib2", @@ -370,7 +372,11 @@ def save_pairs_from_cube(cube): # Save each latlon slice2D in the cube slice_param = [y_coord, x_coord] if dim_coords else [x_coord] for slice2D in cube.slices(slice_param): - grib_message = eccodes.codes_grib_new_from_samples("GRIB2") + if _save_rules.is_grid_definition_template_40(cube, x_coord, y_coord): + template_name = "reduced_gg_sfc_grib2" + else: + template_name = "GRIB2" + grib_message = eccodes.codes_grib_new_from_samples(template_name) result = _save_rules.run(slice2D, grib_message, cube, x_coord, y_coord) if result is not None: grib_message = result diff --git a/src/iris_grib/_grib2_convert.py b/src/iris_grib/_grib2_convert.py index 79c0b717..dc711553 100644 --- a/src/iris_grib/_grib2_convert.py +++ b/src/iris_grib/_grib2_convert.py @@ -11,8 +11,10 @@ from collections import namedtuple from collections.abc import Iterable +from contextlib import contextmanager from datetime import datetime, timedelta import math +import threading import warnings import cartopy.crs as ccrs @@ -1379,6 +1381,47 @@ def grid_definition_template_140(section, metadata): metadata["dim_coords_and_dims"].append((x_coord, x_dim)) +class TemplateRecorder(threading.local): + """ + Object to control the recording of grid template number on loading. + + This provides a setting, controlled by `set` and `context` methods, which causes all + loaded cubes to record the grid template definition number as a cube attribute. + + When present, the 'GRIB_GRID_TEMPLATE' attribute is used to control how certain + types of data are saved -- notably, for gaussian grids. + + e.g. ``TEMPLATE_RECORD.set(True)`` or ``with TEMPLATE_RECORD.context(True): ...``. + """ + + def __init__(self): + self._record = False # default to 'off' : not recording template numbers + + def __repr__(self): + content = ", ".join(f"{key}={value}" for key, value in self.__dict__.items()) + msg = f"TemplateRecorder({content})" + return msg + + def set(self, record: bool = False): + self._record = record + + @contextmanager + def context(self, record: bool = False): + old_value = self._record + try: + self._record = record + yield + finally: + self._record = old_value + + def __bool__(self): + return bool(self._record) + + +#: The unique object which controls recording of grid template numbers. +TEMPLATE_RECORD = TemplateRecorder() + + def grid_definition_section(section, metadata): """ Translate section 3 from the GRIB2 message. @@ -1442,6 +1485,11 @@ def grid_definition_section(section, metadata): msg = "Grid definition template [{}] is not supported".format(template) raise TranslationError(msg) + # If enabled, always record the 'original' grib template number, as an attribute. + if TEMPLATE_RECORD: + # This can also potentially control saving, in some cases. + metadata["attributes"]["GRIB2_GRID_TEMPLATE"] = template + ############################################################################### # diff --git a/src/iris_grib/_save_rules.py b/src/iris_grib/_save_rules.py index dc2f6e65..0f0e4b8f 100644 --- a/src/iris_grib/_save_rules.py +++ b/src/iris_grib/_save_rules.py @@ -826,80 +826,83 @@ def grid_definition_template_140(cube, grib): raise TranslationError(msg) -def is_grid_definition_template_40(cube, grib, x_coord, y_coord): - # N.B. unlike the other template definitions, this one returns a success response. - # This is simply because it is complicated to determine whether the given lats and - # lons belong to a gaussian grid, and it is necessary to attempt to create a - # grib message to find out. - # - # In use, this is only called when we already know that we have lats + lons, and the - # lats are not regular. - # If this routine returns "False", the caller should fallback to GDT3.4 - # = "irregular lat-lon". - result = None - lons, lats = x_coord.points, y_coord.points - ydiffs = np.diff(lats) - # Must have some repeated values. - if not np.any(ydiffs == 0): - return result - # Otherwise must be monotonic - yd_min = ydiffs.min() - yd_max = ydiffs.max() - lats_increasing = yd_max > 0 - if (lats_increasing and yd_min < 0) or (not lats_increasing and yd_min > 0): - return result - - # Check the expected structure of the data: - # each lat-val occupies a contiguous block, - # within which the lon vals are (strictly) monotonic. - lat_vals = np.array(sorted(set(lats))) - n_lat_vals = len(lat_vals) - if n_lat_vals % 2 != 0: - # ought to always divide by 2, since N parallels either side of equator - return result - if not lats_increasing: - # Put the set of latitude values into the expected order - lat_vals = lat_vals[::-1] - lons = x_coord.points - lons_increasing = np.diff(lons[lats == lat_vals[0]]).min() >= 0 - - ok = True - lon_repeats = [] - prev_maxind = -1 - for one_lat in lat_vals: - onelat_inds = np.where(lats == one_lat)[0] - n_onelats = len(onelat_inds) - i_min, i_max = onelat_inds[[0, -1]] - # Check that we are dealing with latitude values consistently in one direction - # - since the way we assemble 'lon_repeats' assumes that. - if i_min != prev_maxind + 1: +def is_grid_definition_template_40(cube, x_coord, y_coord): + """Work out whether this cube will save with GDT 3.40 (gaussian grid).""" + # Only allow saving to GDT3.40 when the enabling attribute is present. + template = cube.attributes.get("GRIB2_GRID_TEMPLATE", "") + ok = isinstance(template, int) and template == 40 # nothing else will do ! + + if ok: + lons, lats = x_coord.points, y_coord.points + ydiffs = np.diff(lats) + # Must have some repeated values. + if not np.any(ydiffs == 0): ok = False - break - prev_maxind = i_max - if (i_max - i_min + 1) != n_onelats: - ok = False - break - lon_repeats.append(n_onelats) - onelat_lons = lons[i_min : i_max + 1] - if (lons_increasing and np.diff(onelat_lons).min() <= 0) or ( - not lons_increasing and np.diff(onelat_lons).max() >= 0 - ): - ok = False - break - - if ok is False: - return result - - # That's as much pre-check as we can handle ... + if ok: + # Otherwise must be monotonic + yd_min = ydiffs.min() + yd_max = ydiffs.max() + lats_increasing = yd_max > 0 + ok = (lats_increasing and yd_min >= 0) or (not lats_increasing and yd_max <= 0) + + if ok: + # Check the expected structure of the data: + # each lat-val occupies a contiguous block, + # within which the lon vals are (strictly) monotonic. + lat_vals = np.array(sorted(set(lats))) + n_lat_vals = len(lat_vals) + # ought to always divide by 2, since N parallels either side of equator + ok = n_lat_vals % 2 == 0 + + if ok: + if not lats_increasing: + # Put the set of latitude values into the expected order + lat_vals = lat_vals[::-1] + lons = x_coord.points + lons_increasing = np.diff(lons[lats == lat_vals[0]]).min() >= 0 + + prev_maxind = -1 + for one_lat in lat_vals: + onelat_inds = np.where(lats == one_lat)[0] + n_onelats = len(onelat_inds) + i_min, i_max = onelat_inds[[0, -1]] + # Check that latitudes are contiguous in one direction + # (effectively, monotonic and "lat_vals" is in order of occurrence) + if i_min != prev_maxind + 1: + ok = False + break + prev_maxind = i_max + if (i_max - i_min + 1) != n_onelats: + ok = False + break + + onelat_lons = lons[i_min : i_max + 1] + if (lons_increasing and np.diff(onelat_lons).min() <= 0) or ( + not lons_increasing and np.diff(onelat_lons).max() >= 0 + ): + ok = False + break + + return ok + + +def grid_definition_template_40(cube, grib, x_coord, y_coord): + # # It seems that to get a functioning gaussian-grid message, we need to replace the + # # passed-in 'grib' message with a new one, based on a different template. + # grib = eccodes.codes_grib_new_from_samples("reduced_gg_sfc_grib2") - # It seems that to get a functioning gaussian-grid message, we need to replace the - # passed-in 'grib' message with a new one, based on a different template. - grib = eccodes.codes_grib_new_from_samples("reduced_gg_sfc_grib2") eccodes.codes_set(grib, "gridDefinitionTemplateNumber", 40) - # .. unfortunately, we must re-run the 'identification' step - identification(cube, grib) + # # .. unfortunately, we must re-run the 'identification' step + # identification(cube, grib) + + lons, lats = x_coord.points, y_coord.points + lats_increasing = np.diff(lats).min() >= 0 + lat_vals = sorted(set(lats)) + n_lat_vals = len(lat_vals) + if not lats_increasing: + lat_vals = lat_vals[::-1] # We want to do the equivalent of 'horizontal_common', but we can't call that as it # calls "grid_dims" to set Ni/Nj, which we need to control differently. @@ -922,6 +925,7 @@ def is_grid_definition_template_40(cube, grib, x_coord, y_coord): eccodes.codes_set_long(grib, "resolutionAndComponentFlags", 0) eccodes.codes_set_missing(grib, "iDirectionIncrement") + lon_repeats = [np.sum(lats == onelat) for onelat in lat_vals] eccodes.codes_set(grib, "numberOfOctectsForNumberOfPoints", 2) eccodes.codes_set(grib, "interpretationOfNumberOfPoints", 1) eccodes.codes_set_array(grib, "pl", list(lon_repeats)) @@ -953,8 +957,9 @@ def grid_definition_section(cube, grib, x_coord, y_coord): grid_definition_template_0(cube, grib) else: # Check for gaussian lats+lons, and if not fallback on GDT3.4 - result = is_grid_definition_template_40(cube, grib, x_coord, y_coord) - if result is None: + if is_grid_definition_template_40(cube, x_coord, y_coord): + grid_definition_template_40(cube, grib, x_coord, y_coord) + else: grid_definition_template_4(cube, grib) elif isinstance(cs, RotatedGeogCS): diff --git a/src/iris_grib/tests/integration/round_trip/test_grid_definition_section.py b/src/iris_grib/tests/integration/round_trip/test_grid_definition_section.py index e39b6abb..43cf4158 100644 --- a/src/iris_grib/tests/integration/round_trip/test_grid_definition_section.py +++ b/src/iris_grib/tests/integration/round_trip/test_grid_definition_section.py @@ -20,8 +20,10 @@ from iris.coord_systems import GeogCS, PolarStereographic, RotatedGeogCS, Stereographic from iris.coords import DimCoord from iris.cube import Cube +from iris.exceptions import CoordinateNotFoundError from iris.util import is_regular +from iris_grib import TEMPLATE_RECORD from iris_grib.grib_phenom_translation import GRIBCode from iris_grib.message import GribMessage @@ -166,21 +168,53 @@ def test_gdt20_save_load( assert cube_expected == cube_reloaded -def test_gdt40_loadsave(tmp_path): +@pytest.fixture(params=[True, False], ids=["recordGDT", "norecordGDT"]) +def record(request): + record = bool(request.param) + with TEMPLATE_RECORD.context(record=record): + yield record + + +def test_gdt40_loadsave(tmp_path, record): loadpath = tests.get_data_path(("GRIB", "reduced", "reduced_gg.grib2")) cube = load_cube(loadpath) + print(cube) + # This kludge is needed for now to make it saveable # - ASIS: fails to add pressure factory on load, so has no vertical coord cube.coord("level_pressure").rename("pressure") - savepath = tmp_path / "tmp.grib2" - save(cube, savepath) - cube_reloaded = load_cube(savepath) + # Removing these *also* allows the "coord_dims_names" check to match. + cube.remove_coord("model_level_number") + cube.remove_coord("sigma") - def coord_dims_names(cube): - return [ - [co.name() for co in cube.coords(dimension=i_dim)] - for i_dim in range(cube.ndim) - ] + if record: + assert cube.attributes["GRIB2_GRID_TEMPLATE"] == 40 + else: + assert "GRIB2_GRID_TEMPLATE" not in cube.attributes - assert coord_dims_names(cube_reloaded) == coord_dims_names(cube) - assert np.all(cube_reloaded.data == cube.data) + savepath = tmp_path / "tmp.grib2" + if not record: + msg = ( + "Expected to find exactly 1 coordinate, but found 2. " + "They were: latitude, longitude." + ) + with pytest.raises(CoordinateNotFoundError, match=msg): + save(cube, savepath) + else: + save(cube, savepath) + cube_reloaded = load_cube(savepath) + + def coord_dims_names(cube): + return [ + [co.name() for co in cube.coords(dimensions=i_dim)] + for i_dim in list(range(cube.ndim)) + [()] + ] + + print("\nORIGINAL:") + print(cube) + print(coord_dims_names(cube)) + print("\n\nRELOADED:") + print(cube_reloaded) + print(coord_dims_names(cube_reloaded)) + assert coord_dims_names(cube_reloaded) == coord_dims_names(cube) + assert np.all(cube_reloaded.data == cube.data) From 94a3d38b7e2936e65cb106e9fdafaf817211facc Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Wed, 24 Jun 2026 18:22:21 +0100 Subject: [PATCH 576/583] Accommodate existing mock tests. --- src/iris_grib/_save_rules.py | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/src/iris_grib/_save_rules.py b/src/iris_grib/_save_rules.py index 0f0e4b8f..b093b232 100644 --- a/src/iris_grib/_save_rules.py +++ b/src/iris_grib/_save_rules.py @@ -940,7 +940,7 @@ def grid_definition_template_40(cube, grib, x_coord, y_coord): return grib -def grid_definition_section(cube, grib, x_coord, y_coord): +def grid_definition_section(cube, grib, x_coord=None, y_coord=None): """ Write the grid definition template. @@ -948,7 +948,11 @@ def grid_definition_section(cube, grib, x_coord, y_coord): based on the properties of the cube. """ - result = None + # NB x_coord and y_coord are only optional because of legacy testing code + if x_coord is None and y_coord is None: + x_coord = cube.coord(dimensions=[1]) + y_coord = cube.coord(dimensions=[0]) + cs = x_coord.coord_system # N.B. already CS exists and is the same for x and y. regular_x_and_y = is_regular(x_coord) and is_regular(y_coord) @@ -998,8 +1002,6 @@ def grid_definition_section(cube, grib, x_coord, y_coord): emsg = "Grib saving is not supported for coordinate system {!r}" raise ValueError(emsg.format(name)) - return result - ############################################################################### # @@ -1969,16 +1971,10 @@ def run(slice2d_cube, grib, full3d_cube, x_coord, y_coord): identification(slice2d_cube, grib) # Section 3 - Grid Definition Section (Grid Definition Template) - result = grid_definition_section(slice2d_cube, grib, x_coord, y_coord) - if result is not None: - # message was replaced : must also re-run ID phase - grib = result - identification(slice2d_cube, grib) + grid_definition_section(slice2d_cube, grib, x_coord, y_coord) # Section 4 - Product Definition Section (Product Definition Template) product_definition_section(slice2d_cube, grib, full3d_cube) # Section 5 - Data Representation Section (Data Representation Template) data_section(slice2d_cube, grib) - - return result From d4bbbd6882b581e3bfb29af553b6f8fd373222be Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Tue, 30 Jun 2026 11:36:31 +0100 Subject: [PATCH 577/583] WIP fixes to load surface-pressure refs: catch in grib 1; unstructured dim needs a dimcoord. --- .../_grib1_legacy/grib1_load_rules.py | 22 ++++++++++++++++++- src/iris_grib/_grib2_convert.py | 9 +++++++- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/iris_grib/_grib1_legacy/grib1_load_rules.py b/src/iris_grib/_grib1_legacy/grib1_load_rules.py index 67353a92..2d57da5f 100644 --- a/src/iris_grib/_grib1_legacy/grib1_load_rules.py +++ b/src/iris_grib/_grib1_legacy/grib1_load_rules.py @@ -8,12 +8,21 @@ Used exclusively by the 'legacy' GRIB loader in `_grib1_legacy.grib_wrapper`. """ +import numpy as np + +from iris_grib._grib2_convert import ensure_surface_air_pressure_name + from cf_units import CALENDAR_GREGORIAN, Unit from iris.aux_factory import HybridPressureFactory from iris.coords import AuxCoord, CellMethod, DimCoord from iris.exceptions import TranslationError -from iris.fileformats.rules import ConversionMetadata, Factory, Reference +from iris.fileformats.rules import ( + ConversionMetadata, + Factory, + Reference, + ReferenceTarget, +) def grib1_convert(grib): @@ -168,6 +177,17 @@ def grib1_convert(grib): ) units = "???" + # Special!! + if grib.table2Version == 128 and grib.indicatorOfParameter == 134: + standard_name = "air_pressure" + units = "Pa" + references.append( + ReferenceTarget("ref_surface_pressure", ensure_surface_air_pressure_name) + ) + dim_coords_and_dims.append( + (DimCoord(np.arange(grib._x_points.shape[0]), long_name="gaussian_grid"), 0) + ) + ################################################## ##### decode TIME -> aux_coords (=always scalar) diff --git a/src/iris_grib/_grib2_convert.py b/src/iris_grib/_grib2_convert.py index dc711553..63d6adda 100644 --- a/src/iris_grib/_grib2_convert.py +++ b/src/iris_grib/_grib2_convert.py @@ -1225,6 +1225,13 @@ def grid_definition_template_40_reduced(section, metadata, cs): metadata["aux_coords_and_dims"].append((y_coord, 0)) metadata["aux_coords_and_dims"].append((x_coord, 0)) + # In order to enable a reference surface to be attached to a resulting cube + # with a factory, it is necessary for the cubes to have *also* have a DimCoord on + # the unstructured dimension, so they can match their dimensions. + metadata["dim_coords_and_dims"].append( + (DimCoord(np.arange(x_points.shape[0]), long_name="gaussian_grid"), 0) + ) + def grid_definition_template_90(section, metadata): """ @@ -1575,7 +1582,7 @@ def translate_phenomenon( # Look for fields at surface level first. if ( typeOfFirstFixedSurface == 1 - and scaledValueOfFirstFixedSurface == 0 + and scaledValueOfFirstFixedSurface in [0, None] and typeOfSecondFixedSurface == _TYPE_OF_FIXED_SURFACE_MISSING ): # Land surface products for model terrain height: From 4c51b681e9141ba2dd3931da5b9252e5efac8723 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Wed, 15 Jul 2026 17:19:04 +0100 Subject: [PATCH 578/583] Fix for test. --- .../integration/round_trip/test_grid_definition_section.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/iris_grib/tests/integration/round_trip/test_grid_definition_section.py b/src/iris_grib/tests/integration/round_trip/test_grid_definition_section.py index 43cf4158..6b9eb52e 100644 --- a/src/iris_grib/tests/integration/round_trip/test_grid_definition_section.py +++ b/src/iris_grib/tests/integration/round_trip/test_grid_definition_section.py @@ -195,8 +195,8 @@ def test_gdt40_loadsave(tmp_path, record): savepath = tmp_path / "tmp.grib2" if not record: msg = ( - "Expected to find exactly 1 coordinate, but found 2. " - "They were: latitude, longitude." + "Expected to find exactly 1 coordinate, but found 3. " + "They were: gaussian_grid, latitude, longitude." ) with pytest.raises(CoordinateNotFoundError, match=msg): save(cube, savepath) From 65c13cd39dce7ead7e318b8620caa11304439a21 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Wed, 15 Jul 2026 17:43:02 +0100 Subject: [PATCH 579/583] Small code tidies. --- src/iris_grib/_save_rules.py | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/src/iris_grib/_save_rules.py b/src/iris_grib/_save_rules.py index b093b232..1f17402d 100644 --- a/src/iris_grib/_save_rules.py +++ b/src/iris_grib/_save_rules.py @@ -31,6 +31,7 @@ ) from iris.exceptions import TranslationError + from . import grib_phenom_translation as gptx from ._grib2_convert import ( _STATISTIC_TYPE_NAMES, @@ -835,12 +836,11 @@ def is_grid_definition_template_40(cube, x_coord, y_coord): if ok: lons, lats = x_coord.points, y_coord.points ydiffs = np.diff(lats) - # Must have some repeated values. - if not np.any(ydiffs == 0): - ok = False + # Latitudes should have some repeated values. + ok = np.any(ydiffs == 0) if ok: - # Otherwise must be monotonic + # Latitudes should be monotonic yd_min = ydiffs.min() yd_max = ydiffs.max() lats_increasing = yd_max > 0 @@ -863,23 +863,23 @@ def is_grid_definition_template_40(cube, x_coord, y_coord): lons_increasing = np.diff(lons[lats == lat_vals[0]]).min() >= 0 prev_maxind = -1 - for one_lat in lat_vals: - onelat_inds = np.where(lats == one_lat)[0] - n_onelats = len(onelat_inds) - i_min, i_max = onelat_inds[[0, -1]] + for this_lat in lat_vals: + thislat_inds = np.where(lats == this_lat)[0] + n_thislat = len(thislat_inds) + i_min, i_max = thislat_inds[[0, -1]] # Check that latitudes are contiguous in one direction # (effectively, monotonic and "lat_vals" is in order of occurrence) if i_min != prev_maxind + 1: ok = False break prev_maxind = i_max - if (i_max - i_min + 1) != n_onelats: + if (i_max - i_min + 1) != n_thislat: ok = False break - onelat_lons = lons[i_min : i_max + 1] - if (lons_increasing and np.diff(onelat_lons).min() <= 0) or ( - not lons_increasing and np.diff(onelat_lons).max() >= 0 + thislat_lons = lons[i_min : i_max + 1] + if (lons_increasing and np.diff(thislat_lons).min() <= 0) or ( + not lons_increasing and np.diff(thislat_lons).max() >= 0 ): ok = False break @@ -953,7 +953,9 @@ def grid_definition_section(cube, grib, x_coord=None, y_coord=None): x_coord = cube.coord(dimensions=[1]) y_coord = cube.coord(dimensions=[0]) - cs = x_coord.coord_system # N.B. already CS exists and is the same for x and y. + # Get coord system + # N.B. caller already checked that it exists and is same for x and y. + cs = x_coord.coord_system regular_x_and_y = is_regular(x_coord) and is_regular(y_coord) if isinstance(cs, GeogCS): From 0bd00e0688da154e5daa52dc16f66324ccc56a0d Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Mon, 20 Jul 2026 13:08:09 +0100 Subject: [PATCH 580/583] Check that proposed GDT40 save has 1D coords: fix longitude limits encoding --- src/iris_grib/_save_rules.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/iris_grib/_save_rules.py b/src/iris_grib/_save_rules.py index 1f17402d..fe4bc3d9 100644 --- a/src/iris_grib/_save_rules.py +++ b/src/iris_grib/_save_rules.py @@ -833,6 +833,12 @@ def is_grid_definition_template_40(cube, x_coord, y_coord): template = cube.attributes.get("GRIB2_GRID_TEMPLATE", "") ok = isinstance(template, int) and template == 40 # nothing else will do ! + if ok: + # Initial basic check that we have 1-D coords. + xco_dims = cube.coord_dims(x_coord) + yco_dims = cube.coord_dims(y_coord) + ok = yco_dims == xco_dims and len(xco_dims) == 1 + if ok: lons, lats = x_coord.points, y_coord.points ydiffs = np.diff(lats) @@ -914,8 +920,16 @@ def grid_definition_template_40(cube, grib, x_coord, y_coord): grib, "latitudeOfFirstGridPoint", int(1.0e6 * lats[0]) ) # in micro degrees eccodes.codes_set(grib, "latitudeOfLastGridPoint", int(1.0e6 * lats[-1])) - eccodes.codes_set(grib, "longitudeOfFirstGridPoint", int(1.0e6 * lons[0])) - eccodes.codes_set(grib, "longitudeOfLastGridPoint", int(1.0e6 * lons[-1])) + + # Copied from the 'is..' routine : TODO improve DRY?? + lons_increasing = np.diff(lons[lats == lat_vals[0]]).min() >= 0 + if lons_increasing: + lon0, lon1 = lons.min(), lons.max() + else: + lon0, lon1 = lons.max(), lons.min() + + eccodes.codes_set(grib, "longitudeOfFirstGridPoint", int(1.0e6 * lon0)) + eccodes.codes_set(grib, "longitudeOfLastGridPoint", int(1.0e6 * lon1)) eccodes.codes_set(grib, "N", n_lat_vals / 2) eccodes.codes_set(grib, "Nj", n_lat_vals) From 2dbc9a3a090fb311570ded0233d60442533b6f67 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Mon, 20 Jul 2026 13:11:14 +0100 Subject: [PATCH 581/583] Remove temporary test routine. --- .../round_trip/test_latscan_check.py | 26 ------------------- 1 file changed, 26 deletions(-) delete mode 100644 src/iris_grib/tests/integration/round_trip/test_latscan_check.py diff --git a/src/iris_grib/tests/integration/round_trip/test_latscan_check.py b/src/iris_grib/tests/integration/round_trip/test_latscan_check.py deleted file mode 100644 index 9cab36cb..00000000 --- a/src/iris_grib/tests/integration/round_trip/test_latscan_check.py +++ /dev/null @@ -1,26 +0,0 @@ -import numpy as np - -lats = [20, 20, 20, 30, 30, 30, 30, 50, 50, 70] -lons = [0, 15, 30, 0, 10, 20, 30, 0, 30, 15] - - -def test_lats(): - global lats, lons - mylats = np.array(lats) - mylons = np.array(lons) - (n_lats,) = mylats.shape - diffs = np.diff(mylats) - assert np.all(diffs >= 0) or np.all(diffs <= 0) - levs = np.array(sorted(set(mylats))) - (n_levs,) = levs.shape - hits = mylats.reshape(n_lats, 1) == levs.reshape(1, n_levs) - lev_counts = hits.sum(axis=0) - print("lev_counts =", lev_counts) - for lev in levs: - lons_at_lev = mylons[lats == lev] - # check lons within each lev are distinct and monotonic - n_lons_at_lev = len(lons_at_lev) - if n_lons_at_lev > 1: - assert len(set(lons_at_lev)) == n_lons_at_lev - diffs = np.diff(lons_at_lev) - assert np.all(diffs >= 0) or np.all(diffs <= 0) From d6f6a8fab34f68bd5032239a90703858e60d06c7 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Mon, 20 Jul 2026 13:19:32 +0100 Subject: [PATCH 582/583] Tidy comments + remove obsolete bits. --- src/iris_grib/_save_rules.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/iris_grib/_save_rules.py b/src/iris_grib/_save_rules.py index fe4bc3d9..830fb55b 100644 --- a/src/iris_grib/_save_rules.py +++ b/src/iris_grib/_save_rules.py @@ -894,14 +894,17 @@ def is_grid_definition_template_40(cube, x_coord, y_coord): def grid_definition_template_40(cube, grib, x_coord, y_coord): - # # It seems that to get a functioning gaussian-grid message, we need to replace the - # # passed-in 'grib' message with a new one, based on a different template. + # For the gaussian grids, for now it appears that to function the message must be + # based on a different template. # grib = eccodes.codes_grib_new_from_samples("reduced_gg_sfc_grib2") + # --OR-- possibly also, can set the "computed key" 'gridType = gg' ?? + # + # **FOR NOW:** this is handled as a special case by the caller: + # 'grid_definition_section' --> 'is_grid_definition_template_40' - eccodes.codes_set(grib, "gridDefinitionTemplateNumber", 40) + # NB some code here is also duplicated from the 'is..' routine : TODO improve DRY?? - # # .. unfortunately, we must re-run the 'identification' step - # identification(cube, grib) + eccodes.codes_set(grib, "gridDefinitionTemplateNumber", 40) lons, lats = x_coord.points, y_coord.points lats_increasing = np.diff(lats).min() >= 0 @@ -921,7 +924,6 @@ def grid_definition_template_40(cube, grib, x_coord, y_coord): ) # in micro degrees eccodes.codes_set(grib, "latitudeOfLastGridPoint", int(1.0e6 * lats[-1])) - # Copied from the 'is..' routine : TODO improve DRY?? lons_increasing = np.diff(lons[lats == lat_vals[0]]).min() >= 0 if lons_increasing: lon0, lon1 = lons.min(), lons.max() From 3b89c6cd16c2378e4442c8ea2ca559200d4a43b3 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Mon, 20 Jul 2026 16:45:11 +0100 Subject: [PATCH 583/583] Make dummy grid-coord units='1': Fix various test breakages. --- src/iris_grib/_grib2_convert.py | 7 ++++++- .../load_convert/data_section/TestGDT40/reduced.cml | 3 +++ .../load_convert/sample_file_loads/reduced_gg_grib2.cml | 3 +++ .../results/unit/load_cubes/load_cubes/reduced_raw.cml | 3 +++ .../unit/grib2_convert/test_grid_definition_template_40.py | 4 ++++ 5 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/iris_grib/_grib2_convert.py b/src/iris_grib/_grib2_convert.py index 63d6adda..ef1553c0 100644 --- a/src/iris_grib/_grib2_convert.py +++ b/src/iris_grib/_grib2_convert.py @@ -1229,7 +1229,12 @@ def grid_definition_template_40_reduced(section, metadata, cs): # with a factory, it is necessary for the cubes to have *also* have a DimCoord on # the unstructured dimension, so they can match their dimensions. metadata["dim_coords_and_dims"].append( - (DimCoord(np.arange(x_points.shape[0]), long_name="gaussian_grid"), 0) + ( + DimCoord( + np.arange(x_points.shape[0]), long_name="gaussian_grid", units="1" + ), + 0, + ) ) diff --git a/src/iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/reduced.cml b/src/iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/reduced.cml index f497934b..661d6f31 100644 --- a/src/iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/reduced.cml +++ b/src/iris_grib/tests/results/integration/load_convert/data_section/TestGDT40/reduced.cml @@ -12,6 +12,9 @@ + + + diff --git a/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_gg_grib2.cml b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_gg_grib2.cml index cecb3c6a..b435f659 100644 --- a/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_gg_grib2.cml +++ b/src/iris_grib/tests/results/integration/load_convert/sample_file_loads/reduced_gg_grib2.cml @@ -12,6 +12,9 @@ + + + diff --git a/src/iris_grib/tests/results/unit/load_cubes/load_cubes/reduced_raw.cml b/src/iris_grib/tests/results/unit/load_cubes/load_cubes/reduced_raw.cml index d2315613..4825995c 100644 --- a/src/iris_grib/tests/results/unit/load_cubes/load_cubes/reduced_raw.cml +++ b/src/iris_grib/tests/results/unit/load_cubes/load_cubes/reduced_raw.cml @@ -12,6 +12,9 @@ + + + diff --git a/src/iris_grib/tests/unit/grib2_convert/test_grid_definition_template_40.py b/src/iris_grib/tests/unit/grib2_convert/test_grid_definition_template_40.py index 96e6c900..76e18416 100644 --- a/src/iris_grib/tests/unit/grib2_convert/test_grid_definition_template_40.py +++ b/src/iris_grib/tests/unit/grib2_convert/test_grid_definition_template_40.py @@ -176,6 +176,10 @@ def expected(self): 59.44440829, ] ) + grid = iris.coords.DimCoord( + np.arange(10, dtype=int), long_name="gaussian_grid", units="1" + ) + expected["dim_coords_and_dims"].append((grid, 0)) x = iris.coords.AuxCoord( x_points, standard_name="longitude", units="degrees_east", coord_system=cs )

        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≷2W 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 Date: Fri, 8 Jun 2018 15:32:44 +0100 Subject: [PATCH 060/583] Add changenote. --- docs/ref/release_notes.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/ref/release_notes.rst b/docs/ref/release_notes.rst index 379ab2ee..bb3da6dc 100644 --- a/docs/ref/release_notes.rst +++ b/docs/ref/release_notes.rst @@ -7,6 +7,9 @@ What's new in iris-grib v0.13 Features -------- +* Added saving of data on Hybrid Pressure levels (surface type 119 in + code table 4.5). + * Added loading and saving of data on Hybrid Height levels (surface type 118 in code table 4.5). From 8eb5723f32ca4c7fd0b15e0ecf87dd1ed35b1550 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Fri, 8 Jun 2018 15:44:46 +0100 Subject: [PATCH 061/583] Fix comment in copied test code. --- .../tests/integration/save_rules/test_save_hybrid_coords.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py b/iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py index 3638fbfb..902c3cf9 100644 --- a/iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py +++ b/iris_grib/tests/integration/save_rules/test_save_hybrid_coords.py @@ -132,9 +132,9 @@ def test_save(self): self.assertArrayAllClose( msgs[0].sections[4]['pv'], pv_expected, atol=0.001) - # Check message #2-of-3 has the correctly encoded hybrid height. + # Check message #2-of-3 has the correctly encoded hybrid pressure. msg = msgs[1] - # first surface type = 118 (i.e. hybrid height). + # first surface type = 119 (i.e. hybrid pressure). self.assertEqual( msg.sections[4]['typeOfFirstFixedSurface'], 119) From 4f08f958efc638a5df3936a3a58badb76a69ef27 Mon Sep 17 00:00:00 2001 From: Kevin Donkers Date: Fri, 8 Jun 2018 16:08:50 +0100 Subject: [PATCH 062/583] Support for loading grid_definition_template_10 (Mercator projection) (#104) * grid_definition_template_10 added to _load_convert.py * Support for loading grid_definition_template_10 (Mercator projection) Adds support for loading grib2 files that use the Mercator projection by adding grid_definition_template_10 to _load_convert.py. Changes made to how _load_convert.py calculates projection coordinates for grid definition templates 10, 20 & 30. Tests and entry to the release notes also added. * lowercase local var and clarify test kwargs --- docs/ref/release_notes.rst | 3 + iris_grib/_load_convert.py | 80 ++++++++++++-- iris_grib/message.py | 6 +- .../test_grid_definition_template_10.py | 100 ++++++++++++++++++ .../test_grid_definition_template_20.py | 18 ++-- .../test_grid_definition_template_30.py | 3 +- 6 files changed, 190 insertions(+), 20 deletions(-) create mode 100644 iris_grib/tests/unit/load_convert/test_grid_definition_template_10.py diff --git a/docs/ref/release_notes.rst b/docs/ref/release_notes.rst index 379ab2ee..0431691f 100644 --- a/docs/ref/release_notes.rst +++ b/docs/ref/release_notes.rst @@ -10,6 +10,9 @@ Features * Added loading and saving of data on Hybrid Height levels (surface type 118 in code table 4.5). +* Added loading for data using Mercator projection (grid definition + template 10 in template table 3.1) + Bug Fixes --------- diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index f1da7d41..fefb5487 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -131,6 +131,11 @@ Probability = namedtuple('Probability', ('probability_type_name', 'threshold')) +# List of grid definition template numbers which use either (i,j) or (x,y) +# for (lat,lon) +_IJGRIDLENGTH_GDT_NUMBERS = (10,) +_XYGRIDLENGTH_GDT_NUMBERS = (20, 30, 31, 110, 140) + # Regulation 92.1.12 def unscale(value, factor): @@ -719,6 +724,45 @@ def grid_definition_template_5(section, metadata): 'grid_latitude', 'grid_longitude', cs) +def grid_definition_template_10(section, metadata): + """ + Translate template representing a Mercator grid. + + Updates the metadata in-place with the translations. + + Args: + + * section: + Dictionary of coded key/value pairs from section 3 of the message. + + * metadata: + :class:`collections.OrderedDict` of metadata. + + """ + major, minor, radius = ellipsoid_geometry(section) + geog_cs = ellipsoid(section['shapeOfTheEarth'], major, minor, radius) + + # standard_parallel is the latitude at which the Mercator projection + # intersects the Earth + standard_parallel = section['LaD'] * _GRID_ACCURACY_IN_DEGREES + + cs = icoord_systems.Mercator(standard_parallel=standard_parallel, + ellipsoid=geog_cs) + + # Create the X and Y coordinates. + x_coord, y_coord, scan = _calculate_proj_coords_from_grid_lengths(section, + cs) + + # Determine the lat/lon dimensions. + y_dim, x_dim = 0, 1 + if scan.j_consecutive: + y_dim, x_dim = 1, 0 + + # Add the X and Y coordinates to the metadata dim coords. + metadata['dim_coords_and_dims'].append((y_coord, y_dim)) + metadata['dim_coords_and_dims'].append((x_coord, x_dim)) + + def grid_definition_template_12(section, metadata): """ Translate template representing transverse Mercator. @@ -790,7 +834,6 @@ def check_range(v1, v2, n, d): # Determine the lat/lon dimensions. y_dim, x_dim = 0, 1 - scan = scanning_mode(section['scanningMode']) if scan.j_consecutive: y_dim, x_dim = 1, 0 @@ -832,7 +875,8 @@ def grid_definition_template_20(section, metadata): central_lon=central_lon, true_scale_lat=true_scale_lat, ellipsoid=geog_cs) - x_coord, y_coord, scan = _calculate_proj_coords_from_lon_lat(section, cs) + x_coord, y_coord, scan = _calculate_proj_coords_from_grid_lengths(section, + cs) # Determine the order of the dimensions. y_dim, x_dim = 0, 1 @@ -844,22 +888,38 @@ def grid_definition_template_20(section, metadata): metadata['dim_coords_and_dims'].append((x_coord, x_dim)) -def _calculate_proj_coords_from_lon_lat(section, cs): +def _calculate_proj_coords_from_grid_lengths(section, cs): # Construct the coordinate points, the start point is given in millidegrees # but the distance measurement is in 10-3 m, so a conversion is necessary # to find the origin in m. + # Conversion factor millimetres to metres + mm_to_m = 1e-3 + + if section['gridDefinitionTemplateNumber'] in _XYGRIDLENGTH_GDT_NUMBERS: + dx = section['Dx'] + dy = section['Dy'] + nx = section['Nx'] + ny = section['Ny'] + elif section['gridDefinitionTemplateNumber'] in _IJGRIDLENGTH_GDT_NUMBERS: + dx = section['Di'] + dy = section['Dj'] + nx = section['Ni'] + ny = section['Nj'] + else: + raise TranslationError('Unsupported lat-lon point parameters') + scan = scanning_mode(section['scanningMode']) lon_0 = section['longitudeOfFirstGridPoint'] * _GRID_ACCURACY_IN_DEGREES lat_0 = section['latitudeOfFirstGridPoint'] * _GRID_ACCURACY_IN_DEGREES x0_m, y0_m = cs.as_cartopy_crs().transform_point( lon_0, lat_0, ccrs.Geodetic()) - dx_m = section['Dx'] * 1e-3 - dy_m = section['Dy'] * 1e-3 + dx_m = dx * mm_to_m + dy_m = dy * mm_to_m x_dir = -1 if scan.i_negative else 1 y_dir = 1 if scan.j_positive else -1 - x_points = x0_m + dx_m * x_dir * np.arange(section['Nx'], dtype=np.float64) - y_points = y0_m + dy_m * y_dir * np.arange(section['Ny'], dtype=np.float64) + x_points = x0_m + dx_m * x_dir * np.arange(nx, dtype=np.float64) + y_points = y0_m + dy_m * y_dir * np.arange(ny, dtype=np.float64) # Create the dimension coordinates. x_coord = DimCoord(x_points, standard_name='projection_x_coordinate', @@ -919,7 +979,8 @@ def grid_definition_template_30(section, metadata): msg = 'Unable to translate resolution and component flags.' warnings.warn(msg) - x_coord, y_coord, scan = _calculate_proj_coords_from_lon_lat(section, cs) + x_coord, y_coord, scan = _calculate_proj_coords_from_grid_lengths(section, + cs) # Determine the order of the dimensions. y_dim, x_dim = 0, 1 @@ -1196,6 +1257,9 @@ def grid_definition_section(section, metadata): elif template == 5: # Process variable resolution rotated latitude/longitude. grid_definition_template_5(section, metadata) + elif template == 10: + # Process Mercator. + grid_definition_template_10(section, metadata) elif template == 12: # Process transverse Mercator. grid_definition_template_12(section, metadata) diff --git a/iris_grib/message.py b/iris_grib/message.py index 85230259..c751f4e9 100644 --- a/iris_grib/message.py +++ b/iris_grib/message.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2014 - 2017, Met Office +# (C) British Crown Copyright 2014 - 2018, Met Office # # This file is part of iris-grib. # @@ -33,6 +33,8 @@ from iris._lazy_data import as_lazy_data from iris.exceptions import TranslationError +_SUPPORTED_GRID_DEFINITIONS = (0, 1, 5, 10, 12, 20, 30, 40, 90) + class _OpenFileRef(object): """ @@ -147,7 +149,7 @@ def data(self): raise TranslationError('Grid definition Section 3 contains ' 'unsupported quasi-regular grid.') - if template in (0, 1, 5, 12, 20, 30, 40, 90): + if template in _SUPPORTED_GRID_DEFINITIONS: # We can ignore the first two bits (i-neg, j-pos) because # that is already captured in the coordinate values. if grid_section['scanningMode'] & 0x3f: diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_10.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_10.py new file mode 100644 index 00000000..873c6324 --- /dev/null +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_10.py @@ -0,0 +1,100 @@ +# (C) British Crown Copyright 2018, Met Office +# +# This file is part of iris-grib. +# +# iris-grib is free software: you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the +# Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# iris-grib is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with iris-grib. If not, see . +""" +Unit tests for +:func:`iris_grib._load_convert.grid_definition_template_10`. + +""" + +from __future__ import (absolute_import, division, print_function) +from six.moves import (filter, input, map, range, zip) # noqa + +# import iris_grib.tests first so that some things can be initialised +# before importing anything else. +import iris_grib.tests as tests + +import numpy as np + +import iris.coord_systems +import iris.coords +import iris.exceptions + +from iris_grib.tests.unit.load_convert import empty_metadata +from iris_grib._load_convert import _MDI as MDI + +from iris_grib._load_convert import grid_definition_template_10 + + +class Test(tests.IrisGribTest): + def section_3(self): + section = { + 'gridDefinitionTemplateNumber': 10, + 'shapeOfTheEarth': 1, + 'scaleFactorOfRadiusOfSphericalEarth': 0, + 'scaledValueOfRadiusOfSphericalEarth': 6371200, + 'scaleFactorOfEarthMajorAxis': 0, + 'scaledValueOfEarthMajorAxis': 0, + 'scaleFactorOfEarthMinorAxis': 0, + 'scaledValueOfEarthMinorAxis': 0, + 'Ni': 181, + 'Nj': 213, + 'latitudeOfFirstGridPoint': 2351555, + 'latitudeOfLastGridPoint': 25088204, + 'LaD': 14000000, + 'longitudeOfFirstGridPoint': 114990304, + 'longitudeOfLastGridPoint': 135009712, + 'resolutionAndComponentFlags': 56, + 'scanningMode': 64, + 'Di': 12000000, + 'Dj': 12000000 + } + return section + + def expected(self, y_dim, x_dim): + # Prepare the expectation. + expected = empty_metadata() + ellipsoid = iris.coord_systems.GeogCS(6371200.0) + cs = iris.coord_systems.Mercator(standard_parallel=14., + ellipsoid=ellipsoid) + nx = 181 + x_origin = 12406918.990644248 + dx = 12000 + x = iris.coords.DimCoord(np.arange(nx) * dx + x_origin, + 'projection_x_coordinate', + units='m', + coord_system=cs) + ny = 213 + y_origin = 253793.10903714446 + dy = 12000 + y = iris.coords.DimCoord(np.arange(ny) * dy + y_origin, + 'projection_y_coordinate', + units='m', + coord_system=cs) + expected['dim_coords_and_dims'].append((y, y_dim)) + expected['dim_coords_and_dims'].append((x, x_dim)) + return expected + + def test(self): + section = self.section_3() + metadata = empty_metadata() + grid_definition_template_10(section, metadata) + expected = self.expected(y_dim=0, x_dim=1) + self.assertEqual(metadata, expected) + + +if __name__ == '__main__': + tests.main() diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_20.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_20.py index cf112e0d..8339c875 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_20.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_20.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2016 - 2017, Met Office +# (C) British Crown Copyright 2016 - 2018, Met Office # # This file is part of iris-grib. # @@ -42,6 +42,7 @@ class Test(tests.IrisGribTest): def section_3(self): section = { + 'gridDefinitionTemplateNumber': 20, 'shapeOfTheEarth': 0, 'scaleFactorOfRadiusOfSphericalEarth': 0, 'scaledValueOfRadiusOfSphericalEarth': 6367470, @@ -66,14 +67,13 @@ def section_3(self): def expected(self, y_dim, x_dim): # Prepare the expectation. expected = empty_metadata() - cs = iris.coord_systems.GeogCS(6367470) - cs = iris.coord_systems.Stereographic( - central_lat=90., - central_lon=262., - false_easting=0, - false_northing=0, - true_scale_lat=60., - ellipsoid=iris.coord_systems.GeogCS(6367470)) + ellipsoid = iris.coord_systems.GeogCS(6367470) + cs = iris.coord_systems.Stereographic(central_lat=90., + central_lon=262., + false_easting=0, + false_northing=0, + true_scale_lat=60., + ellipsoid=ellipsoid) lon0 = 225385728 * 1e-6 lat0 = 32549114 * 1e-6 x0m, y0m = cs.as_cartopy_crs().transform_point( diff --git a/iris_grib/tests/unit/load_convert/test_grid_definition_template_30.py b/iris_grib/tests/unit/load_convert/test_grid_definition_template_30.py index b18fff9a..89ceab75 100644 --- a/iris_grib/tests/unit/load_convert/test_grid_definition_template_30.py +++ b/iris_grib/tests/unit/load_convert/test_grid_definition_template_30.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2016 - 2017, Met Office +# (C) British Crown Copyright 2016 - 2018, Met Office # # This file is part of iris-grib. # @@ -42,6 +42,7 @@ class Test(tests.IrisGribTest): def section_3(self): section = { + 'gridDefinitionTemplateNumber': 30, 'shapeOfTheEarth': 0, 'scaleFactorOfRadiusOfSphericalEarth': 0, 'scaledValueOfRadiusOfSphericalEarth': 6367470, From 31db4ce071adc9104543e831a1343f57734589e8 Mon Sep 17 00:00:00 2001 From: Kevin Donkers Date: Thu, 7 Jun 2018 12:40:43 +0100 Subject: [PATCH 063/583] add support for Mercator to _save_rules.py --- iris_grib/_save_rules.py | 74 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-) diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index 63b592fa..517f5bd5 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -36,7 +36,7 @@ import iris from iris.aux_factory import HybridHeightFactory, HybridPressureFactory from iris.coord_systems import (GeogCS, RotatedGeogCS, TransverseMercator, - LambertConformal) + LambertConformal, Mercator) import iris.exceptions from . import grib_phenom_translation as gptx @@ -426,6 +426,74 @@ def grid_definition_template_5(cube, grib): latlon_points_irregular(cube, grib) +def grid_definition_template_10(cube, grib): + """ + Set keys within the provided grib message based on + Grid Definition Template 3.10. + + Template 3.10 is used to represent a Mercator grid. + + """ + gribapi.grib_set(grib, "gridDefinitionTemplateNumber", 10) + + # Retrieve some information from the cube. + y_coord = cube.coord(dimensions=[0]) + x_coord = cube.coord(dimensions=[1]) + cs = y_coord.coord_system + + # Normalise the coordinate values to millimetres - the resolution + # used in the GRIB message. + y_mm = points_in_unit(y_coord, 'mm') + x_mm = points_in_unit(x_coord, 'mm') + + # Encode the horizontal points. + + # NB. Since we're already in millimetres, our tolerance for + # discrepancy in the differences is 1. + try: + x_step = step(x_mm, atol=1) + y_step = step(y_mm, atol=1) + except ValueError: + msg = 'Irregular coordinates not supported for Mercator.' + raise iris.exceptions.TranslationError(msg) + + gribapi.grib_set(grib, 'Di', abs(x_step)) + gribapi.grib_set(grib, 'Dj', abs(y_step)) + + horizontal_grid_common(cube, grib) + + # Transform first and last points into geographic CS + geog = cs.ellipsoid if cs.ellipsoid is not None else GeogCS(1) + first_x, first_y, = geog.as_cartopy_crs().transform_point( + x_coord.points[0], + y_coord.points[0], + cs.as_cartopy_crs()) + last_x, last_y = geog.as_cartopy_crs().transform_point( + x_coord.points[-1], + y_coord.points[-1], + cs.as_cartopy_crs()) + first_x = first_x % 360 + last_x = last_x % 360 + + gribapi.grib_set(grib, "latitudeOfFirstGridPoint", + int(np.round(first_y / _DEFAULT_DEGREES_UNITS))) + gribapi.grib_set(grib, "longitudeOfFirstGridPoint", + int(np.round(first_x / _DEFAULT_DEGREES_UNITS))) + gribapi.grib_set(grib, "latitudeOfLastGridPoint", + int(np.round(last_y / _DEFAULT_DEGREES_UNITS))) + gribapi.grib_set(grib, "longitudeOfLastGridPoint", + int(np.round(last_x / _DEFAULT_DEGREES_UNITS))) + + # Encode the latitude at which the projection intersects the Earth + # should this be cs.central_lat or cs.standard parallel? + gribapi.grib_set(grib, 'LaD', + cs.standard_parallel / _DEFAULT_DEGREES_UNITS) + + # Encode resolution and component flags + gribapi.grib_set(grib, 'resolutionAndComponentFlags', + 0x1 << _RESOLUTION_AND_COMPONENTS_GRID_WINDS_BIT) + + def grid_definition_template_12(cube, grib): """ Set keys within the provided grib message based on @@ -590,6 +658,10 @@ def grid_definition_section(cube, grib): else: grid_definition_template_5(cube, grib) + elif isinstance(cs, Mercator): + # Mercator coordinate system (template 3.10) + grid_definition_template_10(cube, grib) + elif isinstance(cs, TransverseMercator): # Transverse Mercator coordinate system (template 3.12). grid_definition_template_12(cube, grib) From ccc031a5f116225078a21376f3afd7efdd8d113c Mon Sep 17 00:00:00 2001 From: Kevin Donkers Date: Thu, 7 Jun 2018 12:41:54 +0100 Subject: [PATCH 064/583] refactor grid_definition_templates 12 & 30 for typo and magic numbers --- iris_grib/_save_rules.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index 517f5bd5..28f7ecd0 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -523,7 +523,7 @@ def grid_definition_template_12(cube, grib): x_step = step(x_cm, atol=1) y_step = step(y_cm, atol=1) except ValueError: - msg = ('Irregular coordinates not supported for transverse ' + msg = ('Irregular coordinates not supported for Transverse ' 'Mercator.') raise iris.exceptions.TranslationError(msg) gribapi.grib_set(grib, 'Di', abs(x_step)) @@ -611,14 +611,14 @@ def grid_definition_template_30(cube, grib): central_lon = cs.central_lon % 360 gribapi.grib_set(grib, "latitudeOfFirstGridPoint", - int(np.round(first_y * 1e6))) + int(np.round(first_y / _DEFAULT_DEGREES_UNITS))) gribapi.grib_set(grib, "longitudeOfFirstGridPoint", - int(np.round(first_x * 1e6))) - gribapi.grib_set(grib, "LaD", cs.central_lat * 1e6) - gribapi.grib_set(grib, "LoV", central_lon * 1e6) + int(np.round(first_x / _DEFAULT_DEGREES_UNITS))) + gribapi.grib_set(grib, "LaD", cs.central_lat / _DEFAULT_DEGREES_UNITS) + gribapi.grib_set(grib, "LoV", central_lon / _DEFAULT_DEGREES_UNITS) latin1, latin2 = cs.secant_latitudes - gribapi.grib_set(grib, "Latin1", latin1 * 1e6) - gribapi.grib_set(grib, "Latin2", latin2 * 1e6) + gribapi.grib_set(grib, "Latin1", latin1 / _DEFAULT_DEGREES_UNITS) + gribapi.grib_set(grib, "Latin2", latin2 / _DEFAULT_DEGREES_UNITS) gribapi.grib_set(grib, 'resolutionAndComponentFlags', 0x1 << _RESOLUTION_AND_COMPONENTS_GRID_WINDS_BIT) From 84520154351e304301ece5ab714af9e5dc617585 Mon Sep 17 00:00:00 2001 From: Kevin Donkers Date: Tue, 12 Jun 2018 10:48:09 +0100 Subject: [PATCH 065/583] unfinished unit test --- .../test_grid_definition_template_10.py | 122 ++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py new file mode 100644 index 00000000..d44dc95a --- /dev/null +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py @@ -0,0 +1,122 @@ +# (C) British Crown Copyright 2018, Met Office +# +# This file is part of iris-grib. +# +# iris-grib is free software: you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the +# Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# iris-grib is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with iris-grib. If not, see . +""" +Unit tests for :meth:`iris_grib._save_rules.grid_definition_template_10`. + +""" + +from __future__ import (absolute_import, division, print_function) +from six.moves import (filter, input, map, range, zip) # noqa + +# Import iris_grib.tests first so that some things can be initialised before +# importing anything else. +import iris_grib.tests as tests + +import numpy as np + +import iris.coords +from iris.coord_systems import GeogCS, Mercator +from iris.exceptions import TranslationError + +from iris_grib._save_rules import grid_definition_template_10 +from iris_grib.tests.unit.save_rules import GdtTestMixin + + +class FakeGribError(Exception): + pass + + +class Test(tests.IrisGribTest, GdtTestMixin): + def setUp(self): + self.default_ellipsoid = GeogCS(semi_major_axis=6371200.0) + self.test_cube = self._make_test_cube() + + GdtTestMixin.setUp(self) + + def _make_test_cube(self, cs=None, x_points=None, y_points=None): + # Create a cube with given properties, or minimal defaults. + if cs is None: + cs = self._default_coord_system() + if x_points is None: + x_points = self._default_x_points() + if y_points is None: + y_points = self._default_y_points() + + x_coord = iris.coords.DimCoord(x_points, 'projection_x_coordinate', + units='m', coord_system=cs) + y_coord = iris.coords.DimCoord(y_points, 'projection_y_coordinate', + units='m', coord_system=cs) + test_cube = iris.cube.Cube(np.zeros((len(y_points), len(x_points)))) + test_cube.add_dim_coord(y_coord, 0) + test_cube.add_dim_coord(x_coord, 1) + return test_cube + + def _default_coord_system(self): + return Mercator(standard_parallel=14., + ellipsoid=self.default_ellipsoid) + + def test__template_number(self): + grid_definition_template_10(self.test_cube, self.mock_grib) + self._check_key('gridDefinitionTemplateNumber', 10) + + def test__shape_of_earth(self): + grid_definition_template_10(self.test_cube, self.mock_grib) + self._check_key('shapeOfTheEarth', 1) + self._check_key('scaleFactorOfRadiusOfSphericalEarth', 0) + self._check_key('scaleFactorOfEarthMajorAxis', 0) + self._check_key('scaledValueOfEarthMajorAxis', 0) + self._check_key('scaleFactorOfEarthMinorAxis', 0) + self._check_key('scaledValueOfEarthMinorAxis', 0) + + def test__grid_shape(self): + test_cube = self._make_test_cube(x_points=np.arange(13), + y_points=np.arange(6)) + grid_definition_template_10(test_cube, self.mock_grib) + self._check_key('Nx', 13) + self._check_key('Ny', 6) + + def test__grid_points(self): + test_cube = self._make_test_cube(x_points=[1e6, 3e6, 5e6, 7e6], + y_points=[4e6, 9e6]) + grid_definition_template_10(test_cube, self.mock_grib) + self._check_key("latitudeOfFirstGridPoint", 71676530) + self._check_key("longitudeOfFirstGridPoint", 287218188) + self._check_key("Dx", 2e9) + self._check_key("Dy", 5e9) + + def test__template_specifics(self): + grid_definition_template_10(self.test_cube, self.mock_grib) + self._check_key("LaD", 39e6) + + def test__scanmode(self): + grid_definition_template_10(self.test_cube, self.mock_grib) + self._check_key('iScansPositively', 1) + self._check_key('jScansPositively', 1) + + def test__scanmode_reverse(self): + test_cube = self._make_test_cube(x_points=np.arange(7e6, 0, -1e6)) + grid_definition_template_10(test_cube, self.mock_grib) + self._check_key('iScansPositively', 0) + self._check_key('jScansPositively', 1) + + def test_projection_centre(self): + grid_definition_template_10(self.test_cube, self.mock_grib) + self._check_key('resolutionAndComponentFlags', 56) + + +if __name__ == "__main__": + tests.main() From c4de733f331b12207d493ace0946202ff3dc050c Mon Sep 17 00:00:00 2001 From: Peter Killick Date: Tue, 12 Jun 2018 14:15:50 +0100 Subject: [PATCH 066/583] Checks and passing tests --- iris_grib/_save_rules.py | 13 +++++--- .../test_grid_definition_template_10.py | 31 ++++++++----------- 2 files changed, 21 insertions(+), 23 deletions(-) diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index 28f7ecd0..33d47705 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -35,8 +35,8 @@ import iris from iris.aux_factory import HybridHeightFactory, HybridPressureFactory -from iris.coord_systems import (GeogCS, RotatedGeogCS, TransverseMercator, - LambertConformal, Mercator) +from iris.coord_systems import (GeogCS, RotatedGeogCS, Mercator, + TransverseMercator, LambertConformal) import iris.exceptions from . import grib_phenom_translation as gptx @@ -214,6 +214,10 @@ def shape_of_the_earth(cube, grib): gribapi.grib_set_long(grib, "scaleFactorOfRadiusOfSphericalEarth", 0) gribapi.grib_set_long(grib, "scaledValueOfRadiusOfSphericalEarth", ellipsoid.semi_major_axis) + gribapi.grib_set_long(grib, "scaleFactorOfEarthMajorAxis", 0) + gribapi.grib_set_long(grib, "scaledValueOfEarthMajorAxis", 0) + gribapi.grib_set_long(grib, "scaleFactorOfEarthMinorAxis", 0) + gribapi.grib_set_long(grib, "scaledValueOfEarthMinorAxis", 0) # Oblate spheroid earth. else: gribapi.grib_set_long(grib, "shapeOfTheEarth", 7) @@ -462,7 +466,7 @@ def grid_definition_template_10(cube, grib): horizontal_grid_common(cube, grib) - # Transform first and last points into geographic CS + # Transform first and last points into geographic CS. geog = cs.ellipsoid if cs.ellipsoid is not None else GeogCS(1) first_x, first_y, = geog.as_cartopy_crs().transform_point( x_coord.points[0], @@ -484,8 +488,7 @@ def grid_definition_template_10(cube, grib): gribapi.grib_set(grib, "longitudeOfLastGridPoint", int(np.round(last_x / _DEFAULT_DEGREES_UNITS))) - # Encode the latitude at which the projection intersects the Earth - # should this be cs.central_lat or cs.standard parallel? + # Encode the latitude at which the projection intersects the Earth. gribapi.grib_set(grib, 'LaD', cs.standard_parallel / _DEFAULT_DEGREES_UNITS) diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py index d44dc95a..3b0cbb46 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py @@ -30,16 +30,11 @@ import iris.coords from iris.coord_systems import GeogCS, Mercator -from iris.exceptions import TranslationError from iris_grib._save_rules import grid_definition_template_10 from iris_grib.tests.unit.save_rules import GdtTestMixin -class FakeGribError(Exception): - pass - - class Test(tests.IrisGribTest, GdtTestMixin): def setUp(self): self.default_ellipsoid = GeogCS(semi_major_axis=6371200.0) @@ -83,24 +78,28 @@ def test__shape_of_earth(self): self._check_key('scaledValueOfEarthMinorAxis', 0) def test__grid_shape(self): - test_cube = self._make_test_cube(x_points=np.arange(13), - y_points=np.arange(6)) + n_x_points = 13 + n_y_points = 6 + test_cube = self._make_test_cube(x_points=np.arange(n_x_points), + y_points=np.arange(n_y_points)) grid_definition_template_10(test_cube, self.mock_grib) - self._check_key('Nx', 13) - self._check_key('Ny', 6) + self._check_key('Ni', n_x_points) + self._check_key('Nj', n_y_points) def test__grid_points(self): test_cube = self._make_test_cube(x_points=[1e6, 3e6, 5e6, 7e6], y_points=[4e6, 9e6]) grid_definition_template_10(test_cube, self.mock_grib) - self._check_key("latitudeOfFirstGridPoint", 71676530) - self._check_key("longitudeOfFirstGridPoint", 287218188) - self._check_key("Dx", 2e9) - self._check_key("Dy", 5e9) + self._check_key("latitudeOfFirstGridPoint", 34727738) + self._check_key("longitudeOfFirstGridPoint", 9268240) + self._check_key("latitudeOfLastGridPoint", 63746266) + self._check_key("longitudeOfLastGridPoint", 64877681) + self._check_key("Di", 2e9) + self._check_key("Dj", 5e9) def test__template_specifics(self): grid_definition_template_10(self.test_cube, self.mock_grib) - self._check_key("LaD", 39e6) + self._check_key("LaD", 14e6) def test__scanmode(self): grid_definition_template_10(self.test_cube, self.mock_grib) @@ -113,10 +112,6 @@ def test__scanmode_reverse(self): self._check_key('iScansPositively', 0) self._check_key('jScansPositively', 1) - def test_projection_centre(self): - grid_definition_template_10(self.test_cube, self.mock_grib) - self._check_key('resolutionAndComponentFlags', 56) - if __name__ == "__main__": tests.main() From bd477d28a004e913fc8dbd6587ab861604e27c63 Mon Sep 17 00:00:00 2001 From: Corinne Bosley Date: Tue, 12 Jun 2018 14:52:27 +0100 Subject: [PATCH 067/583] Hybrid coords round trip (#114) --- iris_grib/_save_rules.py | 2 +- .../tests/integration/round_trip/__init__.py | 21 ++++++ .../test_hybrid_coords_round_trip.py | 74 +++++++++++++++++++ 3 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 iris_grib/tests/integration/round_trip/__init__.py create mode 100644 iris_grib/tests/integration/round_trip/test_hybrid_coords_round_trip.py diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index 63b592fa..9b9b467d 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -1059,7 +1059,7 @@ def product_definition_template_1(cube, grib, full3d_cube=None): """ gribapi.grib_set(grib, "productDefinitionTemplateNumber", 1) - product_definition_template_common(cube, grib) + product_definition_template_common(cube, grib, full3d_cube) set_ensemble(cube, grib) diff --git a/iris_grib/tests/integration/round_trip/__init__.py b/iris_grib/tests/integration/round_trip/__init__.py new file mode 100644 index 00000000..bcf17a3d --- /dev/null +++ b/iris_grib/tests/integration/round_trip/__init__.py @@ -0,0 +1,21 @@ +# (C) British Crown Copyright 2018, Met Office +# +# This file is part of iris-grib. +# +# iris-grib is free software: you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the +# Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# iris-grib is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with iris-grib. If not, see . +"""Integration tests for the :mod:`iris_grib._load_convert` and +:mod:`iris_grib._save_rules` packages.""" + +from __future__ import (absolute_import, division, print_function) +from six.moves import (filter, input, map, range, zip) # noqa diff --git a/iris_grib/tests/integration/round_trip/test_hybrid_coords_round_trip.py b/iris_grib/tests/integration/round_trip/test_hybrid_coords_round_trip.py new file mode 100644 index 00000000..e64df0bd --- /dev/null +++ b/iris_grib/tests/integration/round_trip/test_hybrid_coords_round_trip.py @@ -0,0 +1,74 @@ +# (C) British Crown Copyright 2018, Met Office +# +# This file is part of iris-grib. +# +# iris-grib is free software: you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the +# Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# iris-grib is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with iris-grib. If not, see . +""" +Integration test for round-trip loading and saving of hybrid height and +hybrid pressure cubes. + +""" + +from __future__ import (absolute_import, division, print_function) +from six.moves import (filter, input, map, range, zip) # noqa + +# import iris_grib.tests first so that some things can be initialised +# before importing anything else. +import iris_grib.tests as tests + +import os + +from iris import load_cube, load_cubes, save +from iris.experimental.equalise_cubes import equalise_attributes + + +class TestHybridHeightRoundTrip(tests.IrisGribTest): + def test_hh_round_trip(self): + filepath = self.get_testdata_path( + 'faked_sample_hh_grib_data.grib2') + # Load and save temperature cube and reference (orography) cube + # separately because this is the only way to save the hybrid height + # coordinate. + cube, ref_cube = load_cubes(filepath, + ('air_temperature', 'surface_altitude')) + + with self.temp_filename() as tmp_save_path: + save([cube, ref_cube], tmp_save_path, saver='grib2') + # Only need to reload temperature cube to compare with unsaved + # temperature cube. + saved_cube = load_cube(tmp_save_path, 'air_temperature') + self.assertTrue(saved_cube == cube) + + +class TestHybridPressureRoundTrip(tests.IrisGribTest): + def test_hybrid_pressure(self): + filepath = self.get_testdata_path( + 'faked_sample_hp_grib_data.grib2') + # Load and save temperature cube and reference (air_pressure at + # surface) cube separately because this is the only way to save the + # hybrid pressure coordinate. + cube, ref_cube = load_cubes(filepath, + ('air_temperature', 'air_pressure')) + + with self.temp_filename() as tmp_save_path: + save([cube, ref_cube], tmp_save_path, saver='grib2') + # Only need to reload temperature cube to compare with unsaved + # temperature cube. + saved_cube = load_cube(tmp_save_path, 'air_temperature') + + # Currently all attributes are lost when saving to grib, so we must + # equalise them in order to successfully compare all other aspects. + equalise_attributes([saved_cube, cube]) + + self.assertTrue(saved_cube == cube) From 672534c5bf1be88d231c3328a83d0748a2bbbbe4 Mon Sep 17 00:00:00 2001 From: Peter Killick Date: Wed, 13 Jun 2018 09:24:57 +0100 Subject: [PATCH 068/583] Tidy the tests --- iris_grib/tests/unit/save_rules/__init__.py | 23 ++++++------ .../test_grid_definition_template_10.py | 37 ++++++------------- 2 files changed, 23 insertions(+), 37 deletions(-) diff --git a/iris_grib/tests/unit/save_rules/__init__.py b/iris_grib/tests/unit/save_rules/__init__.py index 0903e82e..988f1ba9 100644 --- a/iris_grib/tests/unit/save_rules/__init__.py +++ b/iris_grib/tests/unit/save_rules/__init__.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2013 - 2016, Met Office +# (C) British Crown Copyright 2013 - 2018, Met Office # # This file is part of iris-grib. # @@ -26,7 +26,9 @@ import mock import numpy as np -import iris +from iris.coords import DimCoord +from iris.coord_systems import GeogCS +from iris.cube import Cube from iris.fileformats.pp import EARTH_RADIUS as PP_DEFAULT_EARTH_RADIUS @@ -57,7 +59,7 @@ def grib_set_trap(grib, name, value): self.test_cube = self._make_test_cube() def _default_coord_system(self): - return iris.coord_systems.GeogCS(PP_DEFAULT_EARTH_RADIUS) + return GeogCS(PP_DEFAULT_EARTH_RADIUS) def _default_x_points(self): # Define simple, regular coordinate points. @@ -66,7 +68,8 @@ def _default_x_points(self): def _default_y_points(self): return [7.0, 8.0] # N.B. is_regular will *fail* on length-1 coords. - def _make_test_cube(self, cs=None, x_points=None, y_points=None): + def _make_test_cube(self, cs=None, x_points=None, y_points=None, + coord_units='degrees'): # Create a cube with given properties, or minimal defaults. if cs is None: cs = self._default_coord_system() @@ -75,13 +78,11 @@ def _make_test_cube(self, cs=None, x_points=None, y_points=None): if y_points is None: y_points = self._default_y_points() - x_coord = iris.coords.DimCoord(x_points, standard_name='longitude', - units='degrees', - coord_system=cs) - y_coord = iris.coords.DimCoord(y_points, standard_name='latitude', - units='degrees', - coord_system=cs) - test_cube = iris.cube.Cube(np.zeros((len(y_points), len(x_points)))) + x_coord = DimCoord(x_points, long_name='longitude', + units=coord_units, coord_system=cs) + y_coord = DimCoord(y_points, long_name='latitude', + units=coord_units, coord_system=cs) + test_cube = Cube(np.zeros((len(y_points), len(x_points)))) test_cube.add_dim_coord(y_coord, 0) test_cube.add_dim_coord(x_coord, 1) return test_cube diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py index 3b0cbb46..ee639a1f 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_10.py @@ -38,38 +38,20 @@ class Test(tests.IrisGribTest, GdtTestMixin): def setUp(self): self.default_ellipsoid = GeogCS(semi_major_axis=6371200.0) - self.test_cube = self._make_test_cube() + self.mercator_test_cube = self._make_test_cube(coord_units='m') GdtTestMixin.setUp(self) - def _make_test_cube(self, cs=None, x_points=None, y_points=None): - # Create a cube with given properties, or minimal defaults. - if cs is None: - cs = self._default_coord_system() - if x_points is None: - x_points = self._default_x_points() - if y_points is None: - y_points = self._default_y_points() - - x_coord = iris.coords.DimCoord(x_points, 'projection_x_coordinate', - units='m', coord_system=cs) - y_coord = iris.coords.DimCoord(y_points, 'projection_y_coordinate', - units='m', coord_system=cs) - test_cube = iris.cube.Cube(np.zeros((len(y_points), len(x_points)))) - test_cube.add_dim_coord(y_coord, 0) - test_cube.add_dim_coord(x_coord, 1) - return test_cube - def _default_coord_system(self): return Mercator(standard_parallel=14., ellipsoid=self.default_ellipsoid) def test__template_number(self): - grid_definition_template_10(self.test_cube, self.mock_grib) + grid_definition_template_10(self.mercator_test_cube, self.mock_grib) self._check_key('gridDefinitionTemplateNumber', 10) def test__shape_of_earth(self): - grid_definition_template_10(self.test_cube, self.mock_grib) + grid_definition_template_10(self.mercator_test_cube, self.mock_grib) self._check_key('shapeOfTheEarth', 1) self._check_key('scaleFactorOfRadiusOfSphericalEarth', 0) self._check_key('scaleFactorOfEarthMajorAxis', 0) @@ -81,14 +63,16 @@ def test__grid_shape(self): n_x_points = 13 n_y_points = 6 test_cube = self._make_test_cube(x_points=np.arange(n_x_points), - y_points=np.arange(n_y_points)) + y_points=np.arange(n_y_points), + coord_units='m') grid_definition_template_10(test_cube, self.mock_grib) self._check_key('Ni', n_x_points) self._check_key('Nj', n_y_points) def test__grid_points(self): test_cube = self._make_test_cube(x_points=[1e6, 3e6, 5e6, 7e6], - y_points=[4e6, 9e6]) + y_points=[4e6, 9e6], + coord_units='m') grid_definition_template_10(test_cube, self.mock_grib) self._check_key("latitudeOfFirstGridPoint", 34727738) self._check_key("longitudeOfFirstGridPoint", 9268240) @@ -98,16 +82,17 @@ def test__grid_points(self): self._check_key("Dj", 5e9) def test__template_specifics(self): - grid_definition_template_10(self.test_cube, self.mock_grib) + grid_definition_template_10(self.mercator_test_cube, self.mock_grib) self._check_key("LaD", 14e6) def test__scanmode(self): - grid_definition_template_10(self.test_cube, self.mock_grib) + grid_definition_template_10(self.mercator_test_cube, self.mock_grib) self._check_key('iScansPositively', 1) self._check_key('jScansPositively', 1) def test__scanmode_reverse(self): - test_cube = self._make_test_cube(x_points=np.arange(7e6, 0, -1e6)) + test_cube = self._make_test_cube(x_points=np.arange(7e6, 0, -1e6), + coord_units='m') grid_definition_template_10(test_cube, self.mock_grib) self._check_key('iScansPositively', 0) self._check_key('jScansPositively', 1) From 68b414b37d3e8fff17c5ebd6d0d3c004638ea0e0 Mon Sep 17 00:00:00 2001 From: Peter Killick Date: Mon, 11 Jun 2018 16:47:31 +0100 Subject: [PATCH 069/583] Add saver function for GDT3.4 --- iris_grib/_save_rules.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index 2bfcd25d..d249ce4a 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -402,6 +402,21 @@ def grid_definition_template_1(cube, grib): latlon_points_regular(cube, grib) +def grid_definition_template_4(cube, grib): + """ + Set keys within the provided grib message based on + Grid Definition Template 3.4. + + Template 3.4 is used to represent "variable resolution latitude/longitude". + The coordinates are irregularly spaced latitudes and longitudes. + + """ + # XXX: will we need to set `Ni` and `Nj`? + gribapi.grib_set(grib, "gridDefinitionTemplateNumber", 4) + horizontal_grid_common(cube, grib) + latlon_points_irregular(cube, grib) + + def grid_definition_template_5(cube, grib): """ Set keys within the provided grib message based on @@ -647,9 +662,7 @@ def grid_definition_section(cube, grib): if isinstance(cs, GeogCS): if not regular_x_and_y: - raise iris.exceptions.TranslationError( - 'Saving an irregular latlon grid to GRIB (PDT3.4) is not ' - 'yet supported.') + grid_definition_template_4(cube, grib) grid_definition_template_0(cube, grib) From 5feac966ff1e43479da27a2dc26b7403dc698ee2 Mon Sep 17 00:00:00 2001 From: Peter Killick Date: Tue, 12 Jun 2018 09:42:14 +0100 Subject: [PATCH 070/583] Add unit tests --- .../test_grid_definition_template_4.py | 99 +++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 iris_grib/tests/unit/save_rules/test_grid_definition_template_4.py diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_4.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_4.py new file mode 100644 index 00000000..4f8c8e67 --- /dev/null +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_4.py @@ -0,0 +1,99 @@ +# (C) British Crown Copyright 2018, Met Office +# +# This file is part of iris-grib. +# +# iris-grib is free software: you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the +# Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# iris-grib is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with iris-grib. If not, see . +""" +Unit tests for :func:`iris_grib._save_rules.grid_definition_template_4`. + +""" + +from __future__ import (absolute_import, division, print_function) +from six.moves import (filter, input, map, range, zip) # noqa + +# Import iris_grib.tests first so that some things can be initialised before +# importing anything else. +import iris_grib.tests as tests + +import numpy as np + +from iris.coord_systems import GeogCS + +from iris_grib._save_rules import grid_definition_template_4 +from iris_grib.tests.unit.save_rules import GdtTestMixin + + +class Test(tests.IrisGribTest, GdtTestMixin): + def setUp(self): + GdtTestMixin.setUp(self) + + def _default_x_points(self): + # Define an irregular x-coord, to force template 3.5 instead of 3.1. + return [1.0, 2.0, 5.0] + + def test__template_number(self): + grid_definition_template_4(self.test_cube, self.mock_grib) + self._check_key('gridDefinitionTemplateNumber', 4) + + def test__shape_of_earth_spherical(self): + cs = GeogCS(semi_major_axis=1.23) + test_cube = self._make_test_cube(cs=cs) + grid_definition_template_4(test_cube, self.mock_grib) + self._check_key('shapeOfTheEarth', 1) + self._check_key('scaleFactorOfRadiusOfSphericalEarth', 0) + self._check_key('scaledValueOfRadiusOfSphericalEarth', 1.23) + + def test__shape_of_earth_flattened(self): + cs = GeogCS(semi_major_axis=1.456, + semi_minor_axis=1.123) + test_cube = self._make_test_cube(cs=cs) + grid_definition_template_4(test_cube, self.mock_grib) + self._check_key('shapeOfTheEarth', 7) + self._check_key('scaleFactorOfEarthMajorAxis', 0) + self._check_key('scaledValueOfEarthMajorAxis', 1.456) + self._check_key('scaleFactorOfEarthMinorAxis', 0) + self._check_key('scaledValueOfEarthMinorAxis', 1.123) + + def test__grid_shape(self): + test_cube = self._make_test_cube(x_points=np.arange(13), + y_points=np.arange(6)) + grid_definition_template_4(test_cube, self.mock_grib) + self._check_key('Ni', 13) + self._check_key('Nj', 6) + + def test__grid_points(self): + x_floats = np.array([11.0, 12.0, 167.0]) + # TODO: reduce Y to 2 points, when gribapi nx=ny limitation is gone. + y_floats = np.array([20.0, 21.0, 22.0]) + test_cube = self._make_test_cube(x_points=x_floats, y_points=y_floats) + grid_definition_template_4(test_cube, self.mock_grib) + x_longs = np.array(np.round(1e6 * x_floats), dtype=int) + y_longs = np.array(np.round(1e6 * y_floats), dtype=int) + self._check_key("longitudes", x_longs) + self._check_key("latitudes", y_longs) + + def test__scanmode(self): + grid_definition_template_4(self.test_cube, self.mock_grib) + self._check_key('iScansPositively', 1) + self._check_key('jScansPositively', 1) + + def test__scanmode_reverse(self): + test_cube = self._make_test_cube(x_points=np.arange(7, 0, -1)) + grid_definition_template_4(test_cube, self.mock_grib) + self._check_key('iScansPositively', 0) + self._check_key('jScansPositively', 1) + + +if __name__ == "__main__": + tests.main() From ff98b715b2a4371e45e1efe290a5c617ab5597d0 Mon Sep 17 00:00:00 2001 From: Peter Killick Date: Tue, 12 Jun 2018 14:31:52 +0100 Subject: [PATCH 071/583] Correct definition selection logic --- iris_grib/_save_rules.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index d249ce4a..9d9d4494 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -661,11 +661,11 @@ def grid_definition_section(cube, grib): regular_x_and_y = is_regular(x_coord) and is_regular(y_coord) if isinstance(cs, GeogCS): - if not regular_x_and_y: + if regular_x_and_y: + grid_definition_template_0(cube, grib) + else: grid_definition_template_4(cube, grib) - grid_definition_template_0(cube, grib) - elif isinstance(cs, RotatedGeogCS): # Rotated coordinate system cases. # Choose between GDT 3.1 and 3.5 according to coordinate regularity. From 3874aad1329e8514658f88ac7c2bc59ffb1cccf1 Mon Sep 17 00:00:00 2001 From: Peter Killick Date: Tue, 12 Jun 2018 15:26:56 +0100 Subject: [PATCH 072/583] Add gdt selection integration test --- iris_grib/_save_rules.py | 5 +- .../test_grid_definition_section.py | 129 ++++++++++++++++++ 2 files changed, 132 insertions(+), 2 deletions(-) create mode 100644 iris_grib/tests/integration/save_rules/test_grid_definition_section.py diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index 9d9d4494..60b938ee 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -686,8 +686,9 @@ def grid_definition_section(cube, grib): # Lambert Conformal coordinate system (template 3.30). grid_definition_template_30(cube, grib) else: - raise ValueError('Grib saving is not supported for coordinate system: ' - '{}'.format(cs)) + name = cs.grid_mapping_name.replace('_', ' ').title() + emsg = 'Grib saving is not supported for coordinate system {!r}' + raise ValueError(emsg.format(name)) ############################################################################### diff --git a/iris_grib/tests/integration/save_rules/test_grid_definition_section.py b/iris_grib/tests/integration/save_rules/test_grid_definition_section.py new file mode 100644 index 00000000..89a88ed4 --- /dev/null +++ b/iris_grib/tests/integration/save_rules/test_grid_definition_section.py @@ -0,0 +1,129 @@ +# (C) British Crown Copyright 2018, Met Office +# +# This file is part of iris-grib. +# +# iris-grib is free software: you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the +# Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# iris-grib is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with iris-grib. If not, see . +""" +Integration tests for :func:`iris_grib._save_rules.grid_definition_section` +to confirm that the correct grid_definition_template is being selected. + +""" + +from __future__ import (absolute_import, division, print_function) +from six.moves import (filter, input, map, range, zip) # noqa + +# Import iris_grib.tests first so that some things can be initialised before +# importing anything else. +import iris_grib.tests as tests + +from iris.coords import DimCoord +from iris.coord_systems import (GeogCS, + RotatedGeogCS, + TransverseMercator, + LambertConformal, + AlbersEqualArea) +from iris.cube import Cube +import numpy as np + +from iris_grib._save_rules import grid_definition_section +from iris_grib.tests.unit.save_rules import GdtTestMixin + + +class Test(tests.IrisGribTest, GdtTestMixin): + def setUp(self): + GdtTestMixin.setUp(self) + self.ellipsoid = GeogCS(6371200) + + def _make_cube(self, x_points, y_points, cs, coord_units='1'): + x_coord = DimCoord(x_points, long_name='x', units=coord_units, + coord_system=cs) + y_coord = DimCoord(y_points, long_name='y', units=coord_units, + coord_system=cs) + dcad = [(y_coord, 0), (x_coord, 1)] + return Cube(np.zeros((len(x_points), len(y_points))), + dim_coords_and_dims=dcad) + + def test_grid_definition_template_0(self): + # Regular lat/lon (Plate Carree). + x_points = np.arange(3) + y_points = np.arange(3) + coord_units = 'degrees' + cs = self.ellipsoid + test_cube = self._make_cube(x_points, y_points, cs, coord_units) + grid_definition_section(test_cube, self.mock_grib) + self._check_key('gridDefinitionTemplateNumber', 0) + + def test_grid_definition_template_1(self): + # Rotated lat/lon (Plate Carree). + x_points = np.arange(3) + y_points = np.arange(3) + coord_units = 'degrees' + cs = RotatedGeogCS(34.0, 117.0, ellipsoid=self.ellipsoid) + test_cube = self._make_cube(x_points, y_points, cs, coord_units) + grid_definition_section(test_cube, self.mock_grib) + self._check_key('gridDefinitionTemplateNumber', 1) + + def test_grid_definition_template_4(self): + # Irregular (variable resolution) lat/lon grid. + x_points = np.array([0, 2, 7]) + y_points = np.array([1, 3, 6]) + cs = self.ellipsoid + test_cube = self._make_cube(x_points, y_points, cs) + grid_definition_section(test_cube, self.mock_grib) + self._check_key('gridDefinitionTemplateNumber', 4) + + def test_grid_definition_template_5(self): + # Irregular (variable resolution) rotated lat/lon grid. + x_points = np.array([0, 2, 7]) + y_points = np.array([1, 3, 6]) + cs = RotatedGeogCS(34.0, 117.0, ellipsoid=self.ellipsoid) + test_cube = self._make_cube(x_points, y_points, cs) + grid_definition_section(test_cube, self.mock_grib) + self._check_key('gridDefinitionTemplateNumber', 5) + + def test_grid_definition_template_12(self): + # Transverse Mercator grid. + x_points = np.arange(3) + y_points = np.arange(3) + coord_units = 'm' + cs = TransverseMercator(0, 0, 0, 0, 1, ellipsoid=self.ellipsoid) + test_cube = self._make_cube(x_points, y_points, cs, coord_units) + grid_definition_section(test_cube, self.mock_grib) + self._check_key('gridDefinitionTemplateNumber', 12) + + def test_grid_definition_template_30(self): + # Lambert Conformal grid. + x_points = np.arange(3) + y_points = np.arange(3) + coord_units = 'm' + cs = LambertConformal(ellipsoid=self.ellipsoid) + test_cube = self._make_cube(x_points, y_points, cs, coord_units) + grid_definition_section(test_cube, self.mock_grib) + self._check_key('gridDefinitionTemplateNumber', 30) + + def test_coord_system_not_supported(self): + # Test an unsupported grid - let's choose Albers Equal Area. + x_points = np.arange(3) + y_points = np.arange(3) + cs = AlbersEqualArea(ellipsoid=self.ellipsoid) + test_cube = self._make_cube(x_points, y_points, cs) + + exp_name = cs.grid_mapping_name.replace('_', ' ').title() + exp_emsg = 'not supported for coordinate system {!r}'.format(exp_name) + with self.assertRaisesRegexp(ValueError, exp_emsg): + grid_definition_section(test_cube, self.mock_grib) + + +if __name__ == "__main__": + tests.main() From c506c357e49fd53accf36645fc1640f16a7407ee Mon Sep 17 00:00:00 2001 From: Peter Killick Date: Wed, 13 Jun 2018 10:44:58 +0100 Subject: [PATCH 073/583] Updates following rebase --- .../test_grid_definition_section.py | 37 +++++++++++-------- .../test_grid_definition_template_4.py | 4 -- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/iris_grib/tests/integration/save_rules/test_grid_definition_section.py b/iris_grib/tests/integration/save_rules/test_grid_definition_section.py index 89a88ed4..bcfb6246 100644 --- a/iris_grib/tests/integration/save_rules/test_grid_definition_section.py +++ b/iris_grib/tests/integration/save_rules/test_grid_definition_section.py @@ -30,6 +30,7 @@ from iris.coords import DimCoord from iris.coord_systems import (GeogCS, RotatedGeogCS, + Mercator, TransverseMercator, LambertConformal, AlbersEqualArea) @@ -45,22 +46,13 @@ def setUp(self): GdtTestMixin.setUp(self) self.ellipsoid = GeogCS(6371200) - def _make_cube(self, x_points, y_points, cs, coord_units='1'): - x_coord = DimCoord(x_points, long_name='x', units=coord_units, - coord_system=cs) - y_coord = DimCoord(y_points, long_name='y', units=coord_units, - coord_system=cs) - dcad = [(y_coord, 0), (x_coord, 1)] - return Cube(np.zeros((len(x_points), len(y_points))), - dim_coords_and_dims=dcad) - def test_grid_definition_template_0(self): # Regular lat/lon (Plate Carree). x_points = np.arange(3) y_points = np.arange(3) coord_units = 'degrees' cs = self.ellipsoid - test_cube = self._make_cube(x_points, y_points, cs, coord_units) + test_cube = self._make_test_cube(cs, x_points, y_points, coord_units) grid_definition_section(test_cube, self.mock_grib) self._check_key('gridDefinitionTemplateNumber', 0) @@ -70,7 +62,7 @@ def test_grid_definition_template_1(self): y_points = np.arange(3) coord_units = 'degrees' cs = RotatedGeogCS(34.0, 117.0, ellipsoid=self.ellipsoid) - test_cube = self._make_cube(x_points, y_points, cs, coord_units) + test_cube = self._make_test_cube(cs, x_points, y_points, coord_units) grid_definition_section(test_cube, self.mock_grib) self._check_key('gridDefinitionTemplateNumber', 1) @@ -78,8 +70,9 @@ def test_grid_definition_template_4(self): # Irregular (variable resolution) lat/lon grid. x_points = np.array([0, 2, 7]) y_points = np.array([1, 3, 6]) + coord_units = '1' cs = self.ellipsoid - test_cube = self._make_cube(x_points, y_points, cs) + test_cube = self._make_test_cube(cs, x_points, y_points, coord_units) grid_definition_section(test_cube, self.mock_grib) self._check_key('gridDefinitionTemplateNumber', 4) @@ -87,18 +80,29 @@ def test_grid_definition_template_5(self): # Irregular (variable resolution) rotated lat/lon grid. x_points = np.array([0, 2, 7]) y_points = np.array([1, 3, 6]) + coord_units = '1' cs = RotatedGeogCS(34.0, 117.0, ellipsoid=self.ellipsoid) - test_cube = self._make_cube(x_points, y_points, cs) + test_cube = self._make_test_cube(cs, x_points, y_points, coord_units) grid_definition_section(test_cube, self.mock_grib) self._check_key('gridDefinitionTemplateNumber', 5) + def test_grid_definition_template_10(self): + # Mercator grid. + x_points = np.arange(3) + y_points = np.arange(3) + coord_units = 'm' + cs = Mercator(ellipsoid=self.ellipsoid) + test_cube = self._make_test_cube(cs, x_points, y_points, coord_units) + grid_definition_section(test_cube, self.mock_grib) + self._check_key('gridDefinitionTemplateNumber', 10) + def test_grid_definition_template_12(self): # Transverse Mercator grid. x_points = np.arange(3) y_points = np.arange(3) coord_units = 'm' cs = TransverseMercator(0, 0, 0, 0, 1, ellipsoid=self.ellipsoid) - test_cube = self._make_cube(x_points, y_points, cs, coord_units) + test_cube = self._make_test_cube(cs, x_points, y_points, coord_units) grid_definition_section(test_cube, self.mock_grib) self._check_key('gridDefinitionTemplateNumber', 12) @@ -108,7 +112,7 @@ def test_grid_definition_template_30(self): y_points = np.arange(3) coord_units = 'm' cs = LambertConformal(ellipsoid=self.ellipsoid) - test_cube = self._make_cube(x_points, y_points, cs, coord_units) + test_cube = self._make_test_cube(cs, x_points, y_points, coord_units) grid_definition_section(test_cube, self.mock_grib) self._check_key('gridDefinitionTemplateNumber', 30) @@ -116,8 +120,9 @@ def test_coord_system_not_supported(self): # Test an unsupported grid - let's choose Albers Equal Area. x_points = np.arange(3) y_points = np.arange(3) + coord_units = '1' cs = AlbersEqualArea(ellipsoid=self.ellipsoid) - test_cube = self._make_cube(x_points, y_points, cs) + test_cube = self._make_test_cube(cs, x_points, y_points, coord_units) exp_name = cs.grid_mapping_name.replace('_', ' ').title() exp_emsg = 'not supported for coordinate system {!r}'.format(exp_name) diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_template_4.py b/iris_grib/tests/unit/save_rules/test_grid_definition_template_4.py index 4f8c8e67..0d2a32b1 100644 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_template_4.py +++ b/iris_grib/tests/unit/save_rules/test_grid_definition_template_4.py @@ -38,10 +38,6 @@ class Test(tests.IrisGribTest, GdtTestMixin): def setUp(self): GdtTestMixin.setUp(self) - def _default_x_points(self): - # Define an irregular x-coord, to force template 3.5 instead of 3.1. - return [1.0, 2.0, 5.0] - def test__template_number(self): grid_definition_template_4(self.test_cube, self.mock_grib) self._check_key('gridDefinitionTemplateNumber', 4) From 433379e412d2a4748c81b1cc1dd91bd7f16c61e8 Mon Sep 17 00:00:00 2001 From: Peter Killick Date: Wed, 13 Jun 2018 10:59:34 +0100 Subject: [PATCH 074/583] Remove extraneous test module --- .../test_grid_definition_section.py | 58 ------------------- 1 file changed, 58 deletions(-) delete mode 100644 iris_grib/tests/unit/save_rules/test_grid_definition_section.py diff --git a/iris_grib/tests/unit/save_rules/test_grid_definition_section.py b/iris_grib/tests/unit/save_rules/test_grid_definition_section.py deleted file mode 100644 index 959e7ae4..00000000 --- a/iris_grib/tests/unit/save_rules/test_grid_definition_section.py +++ /dev/null @@ -1,58 +0,0 @@ -# (C) British Crown Copyright 2014 - 2017, Met Office -# -# This file is part of iris-grib. -# -# iris-grib is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the -# Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# iris-grib is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with iris-grib. If not, see . -""" -Unit tests for :meth:`iris_grib._save_rules.grid_definition_section`. - -""" - -from __future__ import (absolute_import, division, print_function) -from six.moves import (filter, input, map, range, zip) # noqa - -# Import iris_grib.tests first so that some things can be initialised before -# importing anything else. -import iris_grib.tests as tests - -from iris.coord_systems import Orthographic -from iris.exceptions import TranslationError - -from iris_grib._save_rules import grid_definition_section -from iris_grib.tests.unit.save_rules import GdtTestMixin - - -class Test(tests.IrisGribTest, GdtTestMixin): - def setUp(self): - GdtTestMixin.setUp(self) - - def test__fail_irregular_latlon(self): - test_cube = self._make_test_cube(x_points=(1, 2, 11, 12), - y_points=(4, 5, 6)) - with self.assertRaisesRegexp( - TranslationError, - 'irregular latlon grid .* not yet supported'): - grid_definition_section(test_cube, self.mock_grib) - - def test__fail_unsupported_coord_system(self): - cs = Orthographic(0, 0) - test_cube = self._make_test_cube(cs=cs) - with self.assertRaisesRegexp( - ValueError, - 'Grib saving is not supported for coordinate system:'): - grid_definition_section(test_cube, self.mock_grib) - - -if __name__ == "__main__": - tests.main() From 6accc8225f9812c1385e2cb85303cddbfa077829 Mon Sep 17 00:00:00 2001 From: Corinne Bosley Date: Fri, 15 Jun 2018 10:42:59 +0100 Subject: [PATCH 075/583] added entry about irregular lambert conformal grids (#124) * added release note about irregular lat-lon grids * added release note about mercator and iris>2.1.0 --- docs/ref/release_notes.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/ref/release_notes.rst b/docs/ref/release_notes.rst index db1088b5..c7d73348 100644 --- a/docs/ref/release_notes.rst +++ b/docs/ref/release_notes.rst @@ -16,6 +16,15 @@ Features * Added loading for data using Mercator projection (grid definition template 10 in template table 3.1) +* Added saving for data on irregular, non-rotated grids (grid definition + template 4 in template table 3.1) + + .. note:: + + Loading and saving for the Mercator projection is only available using + iris versions greater than 2.1.0. + + Bug Fixes --------- From 7c7c451e2afe3fcc5e1d402e0889d15c25aeb3a6 Mon Sep 17 00:00:00 2001 From: Corinne Bosley Date: Fri, 15 Jun 2018 11:47:30 +0100 Subject: [PATCH 076/583] bump version number to 0.13 (#125) --- iris_grib/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iris_grib/__init__.py b/iris_grib/__init__.py index bb47b014..c1c50460 100644 --- a/iris_grib/__init__.py +++ b/iris_grib/__init__.py @@ -47,7 +47,7 @@ from .message import GribMessage -__version__ = '0.12.0' +__version__ = '0.13.0' __all__ = ['load_cubes', 'save_grib2', 'load_pairs_from_fields', 'save_pairs_from_cube', 'save_messages'] From e0dd384ec2b68bc989e52f258cc5bd3f29c15915 Mon Sep 17 00:00:00 2001 From: Corinne Bosley Date: Fri, 15 Jun 2018 11:48:10 +0100 Subject: [PATCH 077/583] Soft deps in setup (#123) * Require Iris>=2.0, but runtime check >=2.1 for Mercator support. --- .coveragerc | 1 + iris_grib/_iris_mercator_support.py | 40 +++++++++++++++++++++++++++++ iris_grib/_load_convert.py | 4 +++ iris_grib/_save_rules.py | 4 +++ setup.py | 10 +++++--- 5 files changed, 55 insertions(+), 4 deletions(-) create mode 100644 iris_grib/_iris_mercator_support.py diff --git a/.coveragerc b/.coveragerc index 81a40161..4548c2e2 100644 --- a/.coveragerc +++ b/.coveragerc @@ -7,6 +7,7 @@ branch = True omit = setup.py iris_grib/tests/* + .eggs/* [report] diff --git a/iris_grib/_iris_mercator_support.py b/iris_grib/_iris_mercator_support.py new file mode 100644 index 00000000..d60fdeff --- /dev/null +++ b/iris_grib/_iris_mercator_support.py @@ -0,0 +1,40 @@ +# (C) British Crown Copyright 2018, Met Office +# +# This file is part of iris-grib. +# +# iris-grib is free software: you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the +# Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# iris-grib is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with iris-grib. If not, see . +""" +Temporary module to check for the extended Mercator class in Iris, +which iris-grib requires for its Mercator support. + +""" +from __future__ import (absolute_import, division, print_function) +from six.moves import (filter, input, map, range, zip) # noqa +import six + +import distutils.version + +import iris + + +def confirm_extended_mercator_supported(): + # Check that Iris version is at least 2.1, required for 'standard_parallel' + # support in the Mercator coord-system. + # This is a temporary fix allowing us to state Iris>=2.0 as a dependency, + # required for this release because Iris 2.1 is not yet available. + iris_version = distutils.version.LooseVersion(iris.__version__) + min_mercator_version = '2.1.0' + if iris_version < min_mercator_version: + msg = 'Support for Mercator projections requires Iris version >= {}' + raise ValueError(msg.format(min_mercator_version)) diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index fefb5487..d40414f4 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -43,6 +43,7 @@ ReferenceTarget from iris.util import _is_circular +from ._iris_mercator_support import confirm_extended_mercator_supported from ._grib1_load_rules import grib1_convert from .message import GribMessage @@ -746,6 +747,9 @@ def grid_definition_template_10(section, metadata): # intersects the Earth standard_parallel = section['LaD'] * _GRID_ACCURACY_IN_DEGREES + # Check and raise a more intelligible error, if the Iris version is too old + # to support the Mercator 'standard_parallel' keyword. + confirm_extended_mercator_supported() cs = icoord_systems.Mercator(standard_parallel=standard_parallel, ellipsoid=geog_cs) diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index 60b938ee..f418cefb 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -39,6 +39,7 @@ TransverseMercator, LambertConformal) import iris.exceptions +from ._iris_mercator_support import confirm_extended_mercator_supported from . import grib_phenom_translation as gptx from ._load_convert import (_STATISTIC_TYPE_NAMES, _TIME_RANGE_UNITS) from iris.util import is_regular, regular_step @@ -503,6 +504,9 @@ def grid_definition_template_10(cube, grib): gribapi.grib_set(grib, "longitudeOfLastGridPoint", int(np.round(last_x / _DEFAULT_DEGREES_UNITS))) + # Check and raise a more intelligible error, if the Iris version is too old + # to support the Mercator 'standard_parallel' property. + confirm_extended_mercator_supported() # Encode the latitude at which the projection intersects the Earth. gribapi.grib_set(grib, 'LaD', cs.standard_parallel / _DEFAULT_DEGREES_UNITS) diff --git a/setup.py b/setup.py index 2b77be7d..d0f30250 100644 --- a/setup.py +++ b/setup.py @@ -79,10 +79,12 @@ def file_walk_relative(top, remove=''): 'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.5', ], - install_requires = [ - # 'iris>=1.9,<2', - # Also: the ECMWF GRIB API - ], + # NOTE: This Iris version requirement is a purely temporary measure : + # Iris>=2.1 is needed for Mercator support, but this is not yet available, + # so 'iris_grib._confirm_iris_mercator_support' performs a runtime version + # check instead + raises an error if required. + # TODO: update Iris version and remove runtime checking, in future release. + install_requires = ['scitools-iris>=2.0.*', 'eccodes'], extras_require = { 'test:python_version=="2.7"': ['mock'], }, From 6e11f4f8d9df8ffda58e0260268dd3335fb6d9b2 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Fri, 15 Jun 2018 11:18:41 +0100 Subject: [PATCH 078/583] Add visible release versioning to docs. --- docs/index.rst | 4 ++-- docs/ref/release_notes.rst | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index ae558482..9894bc21 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -3,8 +3,8 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -The documentation for iris-grib -=============================== +Iris-grib v0.13 +=============== The library ``iris-grib`` provides functionality for converting between weather and climate datasets that are stored as GRIB files and :class:`Iris cubes `. diff --git a/docs/ref/release_notes.rst b/docs/ref/release_notes.rst index c7d73348..28010596 100644 --- a/docs/ref/release_notes.rst +++ b/docs/ref/release_notes.rst @@ -2,7 +2,7 @@ What's new in iris-grib v0.13 ============================= :Release: 0.13.0 -:Date: T.B.D. +:Date: 15 Jun 2018 Features -------- @@ -24,6 +24,8 @@ Features Loading and saving for the Mercator projection is only available using iris versions greater than 2.1.0. +* Added release notes for versions since 0.9. + Bug Fixes --------- From f565744c8222cd85374fa94dda114af8a4d2fb2b Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Fri, 15 Jun 2018 11:37:12 +0100 Subject: [PATCH 079/583] Adjust some doc pages. --- docs/index.rst | 4 +--- docs/ref/release_notes.rst | 23 +++++++++++++---------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index 9894bc21..c9bdeac4 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -108,9 +108,7 @@ with the command Development sources are hosted at ``_ . Releases --------- - -The latest release is v0.12.x . +======== For recent changes, see `Release Notes `_ . diff --git a/docs/ref/release_notes.rst b/docs/ref/release_notes.rst index 28010596..df0ea8af 100644 --- a/docs/ref/release_notes.rst +++ b/docs/ref/release_notes.rst @@ -1,11 +1,14 @@ +Release Notes +============= + What's new in iris-grib v0.13 -============================= +----------------------------- :Release: 0.13.0 :Date: 15 Jun 2018 Features --------- +^^^^^^^^ * Added saving of data on Hybrid Pressure levels (surface type 119 in code table 4.5). @@ -13,22 +16,22 @@ Features * Added loading and saving of data on Hybrid Height levels (surface type 118 in code table 4.5). -* Added loading for data using Mercator projection (grid definition +* Added loading and saving of data using Mercator projection (grid definition template 10 in template table 3.1) -* Added saving for data on irregular, non-rotated grids (grid definition - template 4 in template table 3.1) - .. note:: Loading and saving for the Mercator projection is only available using iris versions greater than 2.1.0. +* Added saving for data on irregular, non-rotated grids (grid definition + template 4 in template table 3.1) + * Added release notes for versions since 0.9. Bug Fixes ---------- +^^^^^^^^^ * Fixed a bug with loading data on Hybrid Pressure levels (surface types 105 and 119 in code table 4.5). @@ -44,7 +47,7 @@ Bug Fixes What's new in iris-grib v0.12 -============================= +----------------------------- :Release: 0.12 :Date: 25 Oct 2017 @@ -56,7 +59,7 @@ This is ECMWF's replacement for the older GRIB-API, which is now deprecated. What's new in iris-grib v0.11 -============================= +----------------------------- :Release: 0.11 :Date: 25 Oct 2017 @@ -66,7 +69,7 @@ Update for Iris v2.0+, using `dask `_ in place of What's new in iris-grib v0.9 -============================= +----------------------------- :Release: 0.9.0 :Date: 25 Jul 2016 From 6901365c2b6d6d0311531f309ed74580c7d40b06 Mon Sep 17 00:00:00 2001 From: tv3141 Date: Thu, 12 Jul 2018 13:51:56 +0100 Subject: [PATCH 080/583] Use ecCodes for Travis CI (#127) Use eccodes for Travis CI --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 6f1f103e..3f83affc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,7 +16,7 @@ install: # Install iris-grib's dependencies # -------------------------------- - - conda install --quiet --yes python=${python} iris ecmwf_grib numpy cartopy mock filelock pep8; + - conda install --quiet --yes python=${python} iris python-eccodes numpy cartopy mock filelock pep8; - conda list # Download iris-test-data From 4526340e7c0dc53c28ba4f4e05b09dcd814d5445 Mon Sep 17 00:00:00 2001 From: Corinne Bosley Date: Tue, 23 Oct 2018 13:56:29 +0100 Subject: [PATCH 081/583] added explicit flag to conda env list (#135) * added explicit flag to conda env list * put the explicit flag in a different place * put explicit flag back where it was to begin with --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 3f83affc..3c2c60ec 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,7 +17,7 @@ install: # Install iris-grib's dependencies # -------------------------------- - conda install --quiet --yes python=${python} iris python-eccodes numpy cartopy mock filelock pep8; - - conda list + - conda list --explicit # Download iris-test-data # -------------------------------- From 862f1026bb99696ce785163a68ee62cc4f9abffc Mon Sep 17 00:00:00 2001 From: Corinne Bosley Date: Thu, 25 Oct 2018 10:51:09 +0100 Subject: [PATCH 082/583] added spatial processing codes from 4.15 to save rules --- iris_grib/_load_convert.py | 18 ++++++++++++++++ iris_grib/_save_rules.py | 42 +++++++++++++++++++++++++++++++++++++- 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index d40414f4..9aeb2055 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -128,6 +128,24 @@ # NOTE: Our test data contains the value 2, which is all we currently support. # The exact interpretation of this is still unclear. +# Reference Code Table 4.15 +_SPATIAL_PROCESSING_TYPES = { + 0: 'Data is calculated directly from the source grid with no ' + 'interpolation', + 1: 'Bilinear interpolation using the 4 source grid grid-point values ' + 'surrounding the nominal grid-point', + 2: 'Bicubic interpolation using the 4 source grid grid-point values ' + 'surrounding the nominal grid-point', + 3: 'Using the value from the source grid grid-point which is nearest to ' + 'the nominal grid-point', + 4: 'Budget interpolation using the 4 source grid grid-point values ' + 'surrounding the nominal grid-point', + 5: 'Spectral interpolation using the 4 source grid grid-point values ' + 'surrounding the nominal grid-point', + 6: 'Neighbour-budget interpolation using the 4 source grid grid-point ' + 'values surrounding the nominal gridpoint' +} + # Class containing details of a probability analysis. Probability = namedtuple('Probability', ('probability_type_name', 'threshold')) diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index f418cefb..4fb5fae2 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -41,7 +41,8 @@ from ._iris_mercator_support import confirm_extended_mercator_supported from . import grib_phenom_translation as gptx -from ._load_convert import (_STATISTIC_TYPE_NAMES, _TIME_RANGE_UNITS) +from ._load_convert import (_STATISTIC_TYPE_NAMES, _TIME_RANGE_UNITS, + _SPATIAL_PROCESSING_TYPES) from iris.util import is_regular, regular_step @@ -49,6 +50,8 @@ _STATISTIC_TYPE_NAMES = {val: key for key, val in _STATISTIC_TYPE_NAMES.items()} _TIME_RANGE_UNITS = {val: key for key, val in _TIME_RANGE_UNITS.items()} +_SPATIAL_PROCESSING_TYPES = {val: key for key, val in + _SPATIAL_PROCESSING_TYPES.items()} def fixup_float32_as_int32(value): @@ -1273,6 +1276,43 @@ def _product_definition_template_8_10_and_11(cube, grib, full3d_cube=None): set_time_increment(cell_method, grib) +def product_definition_template_15(cube, grib, full3d_cube=None): + """ + Set keys within the provided grib message based on Product + Definition Template 4.15. + + Template 4.15 represents the type of spatial processing used to + arrive at the given data value from the source data. + + """ + gribapi.grib_set(grib, "productDefinitionTemplateNumber", 15) + product_definition_template_common(cube, grib, full3d_cube) + + # Check that there is one and only one cell method related to the + # spatial processing. + if cube.cell_methods: + spatial_cell_methods = [ + cell_method for cell_method in cube.cell_methods if 'area' in + cell_method.coord_names] + if not spatial_cell_methods: + raise ValueError("Expected a cell method with a coordinate name " + "of 'area'") + if len(spatial_cell_methods) > 1: + raise ValueError("Cannot handle multiple 'area' cell methods") + cell_method, = spatial_cell_methods + + if len(cell_method.coord_names) > 1: + raise ValueError("Cannot handle multiple coordinate names in " + "the spatial processing related cell method. " + "Expected ('area',), got {!r}".format( + cell_method.coord_names)) + + # Type of spatial processing (see code table 4.15) + spatial_processing = _SPATIAL_PROCESSING_TYPES.get(cell_method.method, + 255) + gribapi.grib_set(grib, "typeOfSpatialProcessing", spatial_processing) + + def product_definition_template_40(cube, grib, full3d_cube=None): """ Set keys within the provided grib message based on Product From 1fcea1afc0d89a1f78098d857744293aea6b4919 Mon Sep 17 00:00:00 2001 From: Corinne Bosley Date: Thu, 25 Oct 2018 11:51:54 +0100 Subject: [PATCH 083/583] corrected gribapi words --- iris_grib/_save_rules.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index 4fb5fae2..0876400d 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -1310,7 +1310,7 @@ def product_definition_template_15(cube, grib, full3d_cube=None): # Type of spatial processing (see code table 4.15) spatial_processing = _SPATIAL_PROCESSING_TYPES.get(cell_method.method, 255) - gribapi.grib_set(grib, "typeOfSpatialProcessing", spatial_processing) + gribapi.grib_set(grib, "spatialProcessing", spatial_processing_code) def product_definition_template_40(cube, grib, full3d_cube=None): From 81d96b400a16db4b388a3db5435567f97a1e9bf0 Mon Sep 17 00:00:00 2001 From: Corinne Bosley Date: Thu, 25 Oct 2018 12:47:43 +0100 Subject: [PATCH 084/583] added skeleton test file for save rules --- iris_grib/_save_rules.py | 2 +- .../test_product_definition_template_15.py | 36 +++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 iris_grib/tests/unit/save_rules/test_product_definition_template_15.py diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index 0876400d..b2477508 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -1310,7 +1310,7 @@ def product_definition_template_15(cube, grib, full3d_cube=None): # Type of spatial processing (see code table 4.15) spatial_processing = _SPATIAL_PROCESSING_TYPES.get(cell_method.method, 255) - gribapi.grib_set(grib, "spatialProcessing", spatial_processing_code) + gribapi.grib_set(grib, "spatialProcessing", spatial_processing) def product_definition_template_40(cube, grib, full3d_cube=None): diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py new file mode 100644 index 00000000..7c78213a --- /dev/null +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py @@ -0,0 +1,36 @@ +# (C) British Crown Copyright 2018, Met Office +# +# This file is part of iris-grib. +# +# iris-grib is free software: you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the +# Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# iris-grib is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with iris-grib. If not, see . +""" +Unit tests for :func:`iris_grib._save_rules.product_definition_template_11` + +""" + +from __future__ import (absolute_import, division, print_function) +from six.moves import (filter, input, map, range, zip) # noqa + +# Import iris_grib.tests first so that some things can be initialised before +# importing anything else. +import iris_grib.tests as tests + +from cf_units import Unit +import gribapi +import mock + +from iris.coords import CellMethod, DimCoord +import iris.tests.stock as stock + +from iris_grib._save_rules import product_definition_template_15 From 12c3b0f363d19a615a5209f496e47902bbc64bd3 Mon Sep 17 00:00:00 2001 From: Kevin Donkers Date: Thu, 25 Oct 2018 16:55:43 +0100 Subject: [PATCH 085/583] Load support for spatial processing types 0-6 --- iris_grib/_load_convert.py | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index 9aeb2055..3b5e1c99 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -143,7 +143,7 @@ 5: 'Spectral interpolation using the 4 source grid grid-point values ' 'surrounding the nominal grid-point', 6: 'Neighbour-budget interpolation using the 4 source grid grid-point ' - 'values surrounding the nominal gridpoint' + 'values surrounding the nominal grid-point' } # Class containing details of a probability analysis. @@ -2178,25 +2178,31 @@ def product_definition_template_15(section, metadata, frt_coord): # Check unique keys for this template. spatial_processing_code = section['spatialProcessing'] - if spatial_processing_code != 0: - # For now, we only support the simplest case, representing a statistic - # over the whole notional area of a cell. + # Only a limited number of spatial processing codes are supported + if spatial_processing_code not in _SPATIAL_PROCESSING_TYPES.keys(): msg = ('Product definition section 4 contains an unsupported ' 'spatial processing type [{}]'.format(spatial_processing_code)) raise TranslationError(msg) - # NOTE: PDT 4.15 alse defines a 'numberOfPointsUsed' key, but we think this - # is irrelevant to the currently supported spatial-processing types. + # NOTE: PDT 4.15 also defines a 'numberOfPointsUsed' key, but we have + # not developed a way to interpret this in a CF-compliant way and code + # table 4.15 includes this information in each description of types 0-6. - # Process parts in common with pdt 4.0. + # Process parts in common with PDT 4.0. product_definition_template_0(section, metadata, frt_coord) - # Decode the statistic method name. - cell_method_name = statistical_method_name(section) + # Add spatial processing type as an attribute. + metadata['attributes']['spatial_processing_type'] = spatial_processing_code - # Record an 'area' cell-method using this statistic. - metadata['cell_methods'] = [CellMethod(coords=('area',), - method=cell_method_name)] + # Only statistics on non-interpolated data can currently be represented + # with cell-methods. + if spatial_processing_code == 0: + # Decode the statistical method name. + cell_method_name = statistical_method_name(section) + + # Record an 'area' cell-method using this statistic. + metadata['cell_methods'] = [CellMethod(coords=('area',), + method=cell_method_name)] def satellite_common(section, metadata): @@ -2317,7 +2323,7 @@ def product_definition_template_40(section, metadata, frt_coord): # Reference GRIB2 Code Table 4.230. constituent_type = section['constituentType'] - # Add the constituent type as an attribute. + # Add the constituent type as an attribute. metadata['attributes']['WMO_constituent_type'] = constituent_type From 6c99adf8504838ae4c30d61e3b84825b3da172f1 Mon Sep 17 00:00:00 2001 From: Kevin Donkers Date: Thu, 25 Oct 2018 16:57:53 +0100 Subject: [PATCH 086/583] Save support for spatial processing type 0 only --- iris_grib/_save_rules.py | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index b2477508..ba402b1c 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -41,8 +41,7 @@ from ._iris_mercator_support import confirm_extended_mercator_supported from . import grib_phenom_translation as gptx -from ._load_convert import (_STATISTIC_TYPE_NAMES, _TIME_RANGE_UNITS, - _SPATIAL_PROCESSING_TYPES) +from ._load_convert import (_STATISTIC_TYPE_NAMES, _TIME_RANGE_UNITS) from iris.util import is_regular, regular_step @@ -50,8 +49,6 @@ _STATISTIC_TYPE_NAMES = {val: key for key, val in _STATISTIC_TYPE_NAMES.items()} _TIME_RANGE_UNITS = {val: key for key, val in _TIME_RANGE_UNITS.items()} -_SPATIAL_PROCESSING_TYPES = {val: key for key, val in - _SPATIAL_PROCESSING_TYPES.items()} def fixup_float32_as_int32(value): @@ -1210,7 +1207,7 @@ def _product_definition_template_8_10_and_11(cube, grib, full3d_cube=None): Set keys within the provided grib message based on common aspects of Product Definition Templates 4.8 and 4.11. - Templates 4.8 and 4.11 are used to represent aggregations over a time + Templates 4.8 and 4.11 are used to represent aggregations over a time interval. """ @@ -1285,11 +1282,20 @@ def product_definition_template_15(cube, grib, full3d_cube=None): arrive at the given data value from the source data. """ + # Type of spatial processing (see code table 4.15) + spatial_processing_code = cube.attributes['spatial_processing_type'] + + # Only spatial processing with no interpolation is supported at save time. + if spatial_processing_code != 0: + msg = ('Cannot save Product Definition Type 4.15 with spatial ' + 'processing type {}'.format(spatial_processing_code)) + raise ValueError(msg) + gribapi.grib_set(grib, "productDefinitionTemplateNumber", 15) product_definition_template_common(cube, grib, full3d_cube) - # Check that there is one and only one cell method related to the - # spatial processing. + # Check that there is one and only one cell method (statistical + # process) related to the spatial processing. if cube.cell_methods: spatial_cell_methods = [ cell_method for cell_method in cube.cell_methods if 'area' in @@ -1306,11 +1312,17 @@ def product_definition_template_15(cube, grib, full3d_cube=None): "the spatial processing related cell method. " "Expected ('area',), got {!r}".format( cell_method.coord_names)) + else: + raise ValueError('Cannot save Product Definition Template 4.15 ' + 'without cell method information.') + + # For spatial processing code 0 there are zero points used in the + # interpolation. + number_of_points = 0 - # Type of spatial processing (see code table 4.15) - spatial_processing = _SPATIAL_PROCESSING_TYPES.get(cell_method.method, - 255) - gribapi.grib_set(grib, "spatialProcessing", spatial_processing) + gribapi.grib_set(grib, "statisticalProcess", cell_method) + gribapi.grib_set(grib, "spatialProcessing", spatial_processing_code) + gribapi.grib_set(grib, "numberOfPointsUsed", number_of_points) def product_definition_template_40(cube, grib, full3d_cube=None): From f45a5046c87b6305727f2baeb1e21b5dedac672e Mon Sep 17 00:00:00 2001 From: Corinne Bosley Date: Fri, 26 Oct 2018 08:43:55 +0100 Subject: [PATCH 087/583] bits of progress with save rules and testing --- iris_grib/_save_rules.py | 4 +++ .../test_product_definition_template_15.py | 26 +++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index b2477508..e247755d 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -1308,6 +1308,7 @@ def product_definition_template_15(cube, grib, full3d_cube=None): cell_method.coord_names)) # Type of spatial processing (see code table 4.15) + # TODO Figure out where I get the spatial processing code from spatial_processing = _SPATIAL_PROCESSING_TYPES.get(cell_method.method, 255) gribapi.grib_set(grib, "spatialProcessing", spatial_processing) @@ -1342,6 +1343,9 @@ def product_definition_section(cube, grib, full3d_cube=None): elif 'WMO_constituent_type' in cube.attributes: # forecast for atmospheric chemical constiuent (template 4.40) product_definition_template_40(cube, grib, full3d_cube) + elif 'area' in cube.cell_methods.coord_names: + # spatially processed (template 4.15) + product_definition_template_15(cube, grib, full3d_cube) else: # forecast (template 4.0) product_definition_template_0(cube, grib, full3d_cube) diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py index 7c78213a..59e3f32b 100644 --- a/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py @@ -34,3 +34,29 @@ import iris.tests.stock as stock from iris_grib._save_rules import product_definition_template_15 + + +class TestSpatialProcessingIdentifier(tests.IrisGribTest): + def setUp(self): + self.cube = stock.lat_lon_cube() + # Rename cube to avoid warning about unknown discipline/parameter. + self.cube.rename('WAFC_CAT_potential') + coord = DimCoord(7, standard_name='pressure', bounds=[0, 10]) + self.cube.add_dim_coord(coord) + + + @mock.patch.object(gribapi, 'grib_set') + def test_spatial_processing(self, mock_set): + cube = self.cube + cell_method = CellMethod(method='mean', coords=['area']) + cube.add_cell_method(cell_method) + + product_definition_template_15(cube, mock.sentinel.grib) + mock_set.assert_any_call(mock.sentinel.grib, + "productDefinitionTemplateNumber", 15) + mock_set.assert_any_call(mock.sentinel.grib, + "spatialProcessing", # TODO: Get this.) + + +if __name__ == "__main__": + tests.main() From d635731af0dacdf2882d8078322c0f8f0f2ecb8a Mon Sep 17 00:00:00 2001 From: Corinne Bosley Date: Fri, 26 Oct 2018 12:07:18 +0100 Subject: [PATCH 088/583] added flesh to save_rules testing --- .../test_product_definition_template_15.py | 103 ++++++++++++++++-- 1 file changed, 93 insertions(+), 10 deletions(-) diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py index 59e3f32b..67aac9cf 100644 --- a/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py @@ -15,7 +15,7 @@ # You should have received a copy of the GNU Lesser General Public License # along with iris-grib. If not, see . """ -Unit tests for :func:`iris_grib._save_rules.product_definition_template_11` +Unit tests for :func:`iris_grib._save_rules.product_definition_template_15` """ @@ -36,27 +36,110 @@ from iris_grib._save_rules import product_definition_template_15 -class TestSpatialProcessingIdentifier(tests.IrisGribTest): +class TestSpatialProcessingIdentifiers(tests.IrisGribTest): def setUp(self): self.cube = stock.lat_lon_cube() + # Add scalar time coord so that product_definition_template_common + # doesn't get upset. + t_coord = DimCoord([424854.], standard_name='time', + units=Unit('hours since 1970-01-01 00:00:00', + calendar='gregorian')) + self.cube.add_aux_coord(t_coord) # Rename cube to avoid warning about unknown discipline/parameter. self.cube.rename('WAFC_CAT_potential') - coord = DimCoord(7, standard_name='pressure', bounds=[0, 10]) - self.cube.add_dim_coord(coord) - @mock.patch.object(gribapi, 'grib_set') - def test_spatial_processing(self, mock_set): - cube = self.cube + def test_cell_method(self, mock_set): + cube_0 = self.cube + cube_0.attributes = dict(spatial_processing_type=0) cell_method = CellMethod(method='mean', coords=['area']) - cube.add_cell_method(cell_method) + cube_0.add_cell_method(cell_method) - product_definition_template_15(cube, mock.sentinel.grib) + # If the cube has a cell method attached then it should not have any + # interpolation on the data, so spatial processing code should be 0 and + # number of points used should be 1. + product_definition_template_15(cube_0, mock.sentinel.grib) mock_set.assert_any_call(mock.sentinel.grib, "productDefinitionTemplateNumber", 15) mock_set.assert_any_call(mock.sentinel.grib, - "spatialProcessing", # TODO: Get this.) + "spatialProcessing", 0) + mock_set.assert_any_call(mock.sentinel.grib, + "numberOfPointsUsed", 1) + + @mock.patch.object(gribapi, 'grib_set') + def test_bilinear_interpolation(self, mock_set): + cube_1 = self.cube + cube_1.attributes = dict(spatial_processing_type=1) + + # Currently no implemented recognition of spatial processing code 1, + # so check that an error is raised if we try and save it. + msg = ('Cannot save Product Definition Type 4.15 with spatial ' + 'processing type {}'.format(1)) + with self.assertRaisesRegexp(ValueError, msg): + product_definition_template_15(cube_1, mock.sentinel.grib) + + @mock.patch.object(gribapi, 'grib_set') + def test_bicubic_interpolation(self, mock_set): + cube_2 = self.cube + cube_2.attributes = dict(spatial_processing_type=2) + + # Currently no implemented recognition of spatial processing code 2, + # so check that an error is raised if we try and save it. + msg = ('Cannot save Product Definition Type 4.15 with spatial ' + 'processing type {}'.format(2)) + with self.assertRaisesRegexp(ValueError, msg): + product_definition_template_15(cube_2, mock.sentinel.grib) + + @mock.patch.object(gribapi, 'grib_set') + def test_nearest_neighbour_interpolation(self, mock_set): + cube_3 = self.cube + cube_3.attributes = dict(spatial_processing_type=3) + + # If the cube has a nearest neighbour interpolation attribute, spatial + # processing code should be 3 and number of points used should be 1. + product_definition_template_15(cube_3, mock.sentinel.grib) + mock_set.assert_any_call(mock.sentinel.grib, + "productDefinitionTemplateNumber", 15) + mock_set.assert_any_call(mock.sentinel.grib, + "spatialProcessing", 3) + mock_set.assert_any_call(mock.sentinel.grib, + "numberOfPointsUsed", 1) + + @mock.patch.object(gribapi, 'grib_set') + def test_budget_interpolation(self, mock_set): + cube_4 = self.cube + cube_4.attributes = dict(spatial_processing_type=4) + + # Currently no implemented recognition of spatial processing code 4, + # so check that an error is raised if we try and save it. + msg = ('Cannot save Product Definition Type 4.15 with spatial ' + 'processing type {}'.format(4)) + with self.assertRaisesRegexp(ValueError, msg): + product_definition_template_15(cube_4, mock.sentinel.grib) + + @mock.patch.object(gribapi, 'grib_set') + def test_spectral_interpolation(self, mock_set): + cube_5 = self.cube + cube_5.attributes = dict(spatial_processing_type=5) + + # Currently no implemented recognition of spatial processing code 5, + # so check that an error is raised if we try and save it. + msg = ('Cannot save Product Definition Type 4.15 with spatial ' + 'processing type {}'.format(5)) + with self.assertRaisesRegexp(ValueError, msg): + product_definition_template_15(cube_5, mock.sentinel.grib) + + @mock.patch.object(gribapi, 'grib_set') + def test_neighbour_budget__interpolation(self, mock_set): + cube_6 = self.cube + cube_6.attributes = dict(spatial_processing_type=6) + # Currently no implemented recognition of spatial processing code 6, + # so check that an error is raised if we try and save it. + msg = ('Cannot save Product Definition Type 4.15 with spatial ' + 'processing type {}'.format(6)) + with self.assertRaisesRegexp(ValueError, msg): + product_definition_template_15(cube_6, mock.sentinel.grib) if __name__ == "__main__": tests.main() From da493af2e74114ccb3c4b9bef62bf02c22157004 Mon Sep 17 00:00:00 2001 From: Corinne Bosley Date: Fri, 26 Oct 2018 12:14:28 +0100 Subject: [PATCH 089/583] corrected number of points used with no interpolation --- .../unit/save_rules/test_product_definition_template_15.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py index 67aac9cf..7f1b66ac 100644 --- a/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py @@ -57,14 +57,15 @@ def test_cell_method(self, mock_set): # If the cube has a cell method attached then it should not have any # interpolation on the data, so spatial processing code should be 0 and - # number of points used should be 1. + # number of points used should be 0 (because this specifically refers + # to the number of points used in the interpolation). product_definition_template_15(cube_0, mock.sentinel.grib) mock_set.assert_any_call(mock.sentinel.grib, "productDefinitionTemplateNumber", 15) mock_set.assert_any_call(mock.sentinel.grib, "spatialProcessing", 0) mock_set.assert_any_call(mock.sentinel.grib, - "numberOfPointsUsed", 1) + "numberOfPointsUsed", 0) @mock.patch.object(gribapi, 'grib_set') def test_bilinear_interpolation(self, mock_set): From 99f0186c1b2d06a8de6debd74519b46b90668b82 Mon Sep 17 00:00:00 2001 From: Corinne Bosley Date: Fri, 26 Oct 2018 13:48:46 +0100 Subject: [PATCH 090/583] quick tidy-up of pdt15 load_convert tests prior to expansion --- .../test_product_definition_template_15.py | 51 +++++++++++-------- 1 file changed, 30 insertions(+), 21 deletions(-) diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py index 11878c23..55940348 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py @@ -34,7 +34,7 @@ import iris.coords from iris.exceptions import TranslationError -from iris.coords import CellMethod +from iris.coords import CellMethod, DimCoord import iris_grib from iris_grib.tests.unit.load_convert import empty_metadata @@ -44,7 +44,8 @@ from iris_grib._load_convert import product_definition_template_15 -def section_4(): +def section_4_sample(): + # Create a dictionary representing a sample section 4 from a grib file. return {'productDefinitionTemplateNumber': 15, 'hoursAfterDataCutoff': MDI, 'minutesAfterDataCutoff': MDI, @@ -63,46 +64,54 @@ def section_4(): class Test(LoadConvertTest): def setUp(self): - self.ref_time_coord = iris.coords.DimCoord(24, 'time', - units='hours since epoch') - - def _check_translate(self, section): + self.time_coord = DimCoord(24, 'time', units='hours since epoch') + self.forecast_period_coord = DimCoord(6, 'forecast_period', + units='hours') + self.forecast_ref_time_coord = DimCoord(18, 'forecast_reference_time', + units='hours since epoch') + self.height_coord = iris.coords.DimCoord(9999, long_name='height', + units='m') + + def _translate(self, section): + # Use pdt 15 to populate a metadata dict from the section 4 keys metadata = empty_metadata() product_definition_template_15(section, metadata, - self.ref_time_coord) + self.time_coord) return metadata - def test_t(self): - metadata = self._check_translate(section_4()) + def test_time_coord(self): + # Generate metadata from running our sample section through pdt 15. + metadata = self._translate(section_4_sample()) + # Generate a fresh metadata dict and manually populate it with metadata + # that we expect will be generated from our sample section. expected = empty_metadata() aux = expected['aux_coords_and_dims'] - aux.append((iris.coords.DimCoord(6, 'forecast_period', units='hours'), - None)) - aux.append(( - iris.coords.DimCoord(18, 'forecast_reference_time', - units='hours since epoch'), None)) - aux.append((self.ref_time_coord, None)) - aux.append((iris.coords.DimCoord(9999, long_name='height', units='m'), - None)) + aux.append((self.forecast_period_coord, None)) + aux.append((self.forecast_ref_time_coord, None)) + aux.append((self.time_coord, None)) + aux.append((self.height_coord, None)) + expected['cell_methods'] = [CellMethod(coords=('area',), method='maximum')] + # Now check that the section conversion produces the metadata we + # expect. self.assertMetadataEqual(metadata, expected) def test_bad_statistic_method(self): - section = section_4() + section = section_4_sample() section['statisticalProcess'] = 999 msg = ('unsupported statistical process type \[999\]') with self.assertRaisesRegexp(TranslationError, msg): - self._check_translate(section) + self._translate(section) def test_bad_spatial_processing_code(self): - section = section_4() + section = section_4_sample() section['spatialProcessing'] = 999 msg = ('unsupported spatial processing type \[999\]') with self.assertRaisesRegexp(TranslationError, msg): - self._check_translate(section) + self._translate(section) if __name__ == '__main__': From 8b4477e9500436cc74aa1a8414f34b762eda60ba Mon Sep 17 00:00:00 2001 From: Corinne Bosley Date: Fri, 26 Oct 2018 13:52:30 +0100 Subject: [PATCH 091/583] tiny tweaks --- .../load_convert/test_product_definition_template_15.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py index 55940348..3c2721ce 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py @@ -58,7 +58,7 @@ def section_4_sample(): 'typeOfSecondFixedSurface': 255, 'statisticalProcess': 2, # method = maximum 'spatialProcessing': 0, # from source grid, no interpolation - 'numberOfPointsUsed': 0 # unused? + 'numberOfPointsUsed': 0 # no points used because no interpolation } @@ -73,14 +73,14 @@ def setUp(self): units='m') def _translate(self, section): - # Use pdt 15 to populate a metadata dict from the section 4 keys + # Use pdt 4.15 to populate a metadata dict from the section 4 keys metadata = empty_metadata() product_definition_template_15(section, metadata, self.time_coord) return metadata def test_time_coord(self): - # Generate metadata from running our sample section through pdt 15. + # Generate metadata from running our sample section through pdt 4.15. metadata = self._translate(section_4_sample()) # Generate a fresh metadata dict and manually populate it with metadata From 908f9e1d2e8efa1d1cbd6a787d8918a177f7cdc3 Mon Sep 17 00:00:00 2001 From: Corinne Bosley Date: Fri, 26 Oct 2018 14:51:44 +0100 Subject: [PATCH 092/583] some more tiny tweaks to make snese of it all --- .../load_convert/test_product_definition_template_15.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py index 3c2721ce..daeb744b 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py @@ -79,7 +79,7 @@ def _translate(self, section): self.time_coord) return metadata - def test_time_coord(self): + def test_translation(self): # Generate metadata from running our sample section through pdt 4.15. metadata = self._translate(section_4_sample()) @@ -102,14 +102,14 @@ def test_time_coord(self): def test_bad_statistic_method(self): section = section_4_sample() section['statisticalProcess'] = 999 - msg = ('unsupported statistical process type \[999\]') + msg = 'unsupported statistical process type \[999\]' with self.assertRaisesRegexp(TranslationError, msg): self._translate(section) def test_bad_spatial_processing_code(self): section = section_4_sample() section['spatialProcessing'] = 999 - msg = ('unsupported spatial processing type \[999\]') + msg = 'unsupported spatial processing type \[999\]' with self.assertRaisesRegexp(TranslationError, msg): self._translate(section) From f12406cb75aabf88b7b393ba35cbd8fb4a7665d1 Mon Sep 17 00:00:00 2001 From: Kevin Donkers Date: Fri, 26 Oct 2018 16:02:29 +0100 Subject: [PATCH 093/583] Add lookup dictionary for spatial processing types --- iris_grib/_load_convert.py | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index 3b5e1c99..240152fd 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -73,6 +73,9 @@ 'long_name', 'units']) +InterpolationParameters = namedtuple('InterpolationParameters', + ['statistical_process', + 'number_of_points_used']) # Regulations 92.1.6. _GRID_ACCURACY_IN_DEGREES = 1e-6 # 1/1,000,000 of a degree @@ -130,20 +133,13 @@ # Reference Code Table 4.15 _SPATIAL_PROCESSING_TYPES = { - 0: 'Data is calculated directly from the source grid with no ' - 'interpolation', - 1: 'Bilinear interpolation using the 4 source grid grid-point values ' - 'surrounding the nominal grid-point', - 2: 'Bicubic interpolation using the 4 source grid grid-point values ' - 'surrounding the nominal grid-point', - 3: 'Using the value from the source grid grid-point which is nearest to ' - 'the nominal grid-point', - 4: 'Budget interpolation using the 4 source grid grid-point values ' - 'surrounding the nominal grid-point', - 5: 'Spectral interpolation using the 4 source grid grid-point values ' - 'surrounding the nominal grid-point', - 6: 'Neighbour-budget interpolation using the 4 source grid grid-point ' - 'values surrounding the nominal grid-point' + 0: InterpolationParameters('cell_method', 0), + 1: InterpolationParameters(None, None), + 2: InterpolationParameters(None, None), + 3: InterpolationParameters(0, 1), + 4: InterpolationParameters(None, None), + 5: InterpolationParameters(None, None), + 6: InterpolationParameters(None, None) } # Class containing details of a probability analysis. From 7950e4a82733396e6a447da477f0abc079f8870f Mon Sep 17 00:00:00 2001 From: Kevin Donkers Date: Fri, 26 Oct 2018 17:44:41 +0100 Subject: [PATCH 094/583] WIP generalise save rules for pdt15 --- iris_grib/_save_rules.py | 112 ++++++++++++++++++++++++++++----------- 1 file changed, 80 insertions(+), 32 deletions(-) diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index ed620be8..fb7b8f8c 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -41,7 +41,8 @@ from ._iris_mercator_support import confirm_extended_mercator_supported from . import grib_phenom_translation as gptx -from ._load_convert import (_STATISTIC_TYPE_NAMES, _TIME_RANGE_UNITS) +from ._load_convert import (_STATISTIC_TYPE_NAMES, _TIME_RANGE_UNITS, + _SPATIAL_PROCESSING_TYPES) from iris.util import is_regular, regular_step @@ -1091,6 +1092,65 @@ def _cube_is_time_statistic(cube): return result +def _cube_is_spatial_statistic(cube): + """ + Test whether we can identify this cube as a statistic over space. + + We need to know whether our cube represents a spatial statistic. This is + almost always captured in the cell methods. + + """ + result = False + spatial_cell_methods = [] + has_cell_methods = cube.cell_methods + + if has_cell_methods: + spatial_cell_methods = [ + cell_method for cell_method in cube.cell_methods if 'area' in + cell_method.coord_names] + else: + raise ValueError("") + + if not spatial_cell_methods: + result = False + raise ValueError("Expected a cell method with a coordinate name " + "of 'area'") + + elif len(spatial_cell_methods) > 1: + result = False + raise ValueError("Cannot handle multiple 'area' cell methods") + + elif len(spatial_cell_methods[0].coord_names) > 1: + result = False + raise ValueError("Cannot handle multiple coordinate names in " + "the spatial processing related cell method. " + "Expected ('area',), got {!r}".format( + spatial_cell_methods[0].coord_names)) + + else: + result = True + + return result + + +def get_cell_method_name(cube, type): + + pass + + +def statistical_method_code(cell_method_name): + """ + Decode cell_method 'method' string as statistic code integer. + """ + + statistic_code = _STATISTIC_TYPE_NAMES.get(cell_method_name) + if statistic_code is None: + msg = ('Product definition section 4 contains an unsupported ' + 'statistical process type [{}] ') + raise TranslationError(msg.format(statistic_code)) + + return statistic_code + def set_ensemble(cube, grib): """ Set keys in the provided grib based message relating to ensemble @@ -1285,44 +1345,32 @@ def product_definition_template_15(cube, grib, full3d_cube=None): # Type of spatial processing (see code table 4.15) spatial_processing_code = cube.attributes['spatial_processing_type'] - # Only spatial processing with no interpolation is supported at save time. - if spatial_processing_code != 0: + # Statistical process and number of points (see template definition 4.15) + statistical_process = _SPATIAL_PROCESSING_TYPES[spatial_processing_code][0] + number_of_points = _SPATIAL_PROCESSING_TYPES[spatial_processing_code][1] + + # Only a limited number of spatial processing types are supported. + if spatial_processing_code not in _SPATIAL_PROCESSING_TYPES.keys(): msg = ('Cannot save Product Definition Type 4.15 with spatial ' 'processing type {}'.format(spatial_processing_code)) raise ValueError(msg) + if statistical_process == "cell_method": + if _cube_is_spatial_statistic(cube): + cell_method_name = get_cell_method_name(cube, 'area') + statistical_process = spatial_processing_code(cell_method_name) + else: + raise ValueError("Could not find a suitable cell_method to save " + "as a spatial statistical process.") + + # Set GRIB messages gribapi.grib_set(grib, "productDefinitionTemplateNumber", 15) product_definition_template_common(cube, grib, full3d_cube) - - # Check that there is one and only one cell method (statistical - # process) related to the spatial processing. - if cube.cell_methods: - spatial_cell_methods = [ - cell_method for cell_method in cube.cell_methods if 'area' in - cell_method.coord_names] - if not spatial_cell_methods: - raise ValueError("Expected a cell method with a coordinate name " - "of 'area'") - if len(spatial_cell_methods) > 1: - raise ValueError("Cannot handle multiple 'area' cell methods") - cell_method, = spatial_cell_methods - - if len(cell_method.coord_names) > 1: - raise ValueError("Cannot handle multiple coordinate names in " - "the spatial processing related cell method. " - "Expected ('area',), got {!r}".format( - cell_method.coord_names)) - else: - raise ValueError('Cannot save Product Definition Template 4.15 ' - 'without cell method information.') - - # For spatial processing code 0 there are zero points used in the - # interpolation. - number_of_points = 0 - - gribapi.grib_set(grib, "statisticalProcess", cell_method) gribapi.grib_set(grib, "spatialProcessing", spatial_processing_code) - gribapi.grib_set(grib, "numberOfPointsUsed", number_of_points) + if statistical_process: + gribapi.grib_set(grib, "statisticalProcess", statistical_process) + if number_of_points: + gribapi.grib_set(grib, "numberOfPointsUsed", number_of_points) def product_definition_template_40(cube, grib, full3d_cube=None): From 7ab686ee289daf382ca2a77a0051f49cdf3fa8df Mon Sep 17 00:00:00 2001 From: Kevin Donkers Date: Mon, 29 Oct 2018 17:44:06 +0000 Subject: [PATCH 095/583] _load_convert: Commenting & more general process type checking --- iris_grib/_load_convert.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index 240152fd..c46e0d1d 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -133,10 +133,10 @@ # Reference Code Table 4.15 _SPATIAL_PROCESSING_TYPES = { - 0: InterpolationParameters('cell_method', 0), + 0: InterpolationParameters('cell_method', 0), # Statistic -> cell method 1: InterpolationParameters(None, None), 2: InterpolationParameters(None, None), - 3: InterpolationParameters(0, 1), + 3: InterpolationParameters(0, 1), # Only reliable default values 4: InterpolationParameters(None, None), 5: InterpolationParameters(None, None), 6: InterpolationParameters(None, None) @@ -2190,9 +2190,9 @@ def product_definition_template_15(section, metadata, frt_coord): # Add spatial processing type as an attribute. metadata['attributes']['spatial_processing_type'] = spatial_processing_code - # Only statistics on non-interpolated data can currently be represented - # with cell-methods. - if spatial_processing_code == 0: + # Add a cell method if the spatial processing type supports a + # statistical process. + if _SPATIAL_PROCESSING_TYPES[spatial_processing_code][0] == "cell_method": # Decode the statistical method name. cell_method_name = statistical_method_name(section) From 90d076fb0d79f91009205f153459d6743d8673a5 Mon Sep 17 00:00:00 2001 From: Kevin Donkers Date: Mon, 29 Oct 2018 17:45:02 +0000 Subject: [PATCH 096/583] save_rules: Commenting & more general stat method checking --- iris_grib/_save_rules.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index fb7b8f8c..60f27e3f 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -1099,6 +1099,7 @@ def _cube_is_spatial_statistic(cube): We need to know whether our cube represents a spatial statistic. This is almost always captured in the cell methods. + WIP: UNFINISHED? """ result = False spatial_cell_methods = [] @@ -1134,16 +1135,17 @@ def _cube_is_spatial_statistic(cube): def get_cell_method_name(cube, type): - + """ + Returns name of cell method in cube where cell_method.coord_names == type + """ pass def statistical_method_code(cell_method_name): """ - Decode cell_method 'method' string as statistic code integer. + Decode cell_method string as statistic code integer. """ - - statistic_code = _STATISTIC_TYPE_NAMES.get(cell_method_name) + statistic_code = _STATISTIC_TYPE_NAMES.get(cell_method_name, None) if statistic_code is None: msg = ('Product definition section 4 contains an unsupported ' 'statistical process type [{}] ') @@ -1358,7 +1360,7 @@ def product_definition_template_15(cube, grib, full3d_cube=None): if statistical_process == "cell_method": if _cube_is_spatial_statistic(cube): cell_method_name = get_cell_method_name(cube, 'area') - statistical_process = spatial_processing_code(cell_method_name) + statistical_process = statistical_method_code(cell_method_name) else: raise ValueError("Could not find a suitable cell_method to save " "as a spatial statistical process.") From 9c6051c3e5668c26cbfe7e8d50de5c66872f626b Mon Sep 17 00:00:00 2001 From: Corinne Bosley Date: Thu, 1 Nov 2018 15:31:26 +0000 Subject: [PATCH 097/583] bulked out identification of statistical processes --- iris_grib/_load_convert.py | 25 ++++++++-------- iris_grib/_save_rules.py | 60 +++++++++++--------------------------- 2 files changed, 30 insertions(+), 55 deletions(-) diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index c46e0d1d..cae51216 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -131,15 +131,19 @@ # NOTE: Our test data contains the value 2, which is all we currently support. # The exact interpretation of this is still unclear. -# Reference Code Table 4.15 +# See Code Table 4.15 for full spatial processing type descriptors: +# http://apps.ecmwf.int/codes/grib/format/grib2/ctables/4/15 + +# InterpolationParameters(statistical process (octet 35), number of points +# used in interpolation (octet 37)) _SPATIAL_PROCESSING_TYPES = { - 0: InterpolationParameters('cell_method', 0), # Statistic -> cell method - 1: InterpolationParameters(None, None), - 2: InterpolationParameters(None, None), - 3: InterpolationParameters(0, 1), # Only reliable default values - 4: InterpolationParameters(None, None), - 5: InterpolationParameters(None, None), - 6: InterpolationParameters(None, None) + 0: InterpolationParameters('cell_method', 0), # No interpolation + 1: InterpolationParameters(None, 4), # Bilinear interpolation + 2: InterpolationParameters(None, 4), # Bicubic interpolation + 3: InterpolationParameters(0, 1), # Nearest neighbour interpolation + 4: InterpolationParameters(None, 4), # Budget interpolation + 5: InterpolationParameters(None, 4), # Spectral interpolation + 6: InterpolationParameters(None, 4) # Neighbour-budget interpolation } # Class containing details of a probability analysis. @@ -2180,14 +2184,11 @@ def product_definition_template_15(section, metadata, frt_coord): 'spatial processing type [{}]'.format(spatial_processing_code)) raise TranslationError(msg) - # NOTE: PDT 4.15 also defines a 'numberOfPointsUsed' key, but we have - # not developed a way to interpret this in a CF-compliant way and code - # table 4.15 includes this information in each description of types 0-6. - # Process parts in common with PDT 4.0. product_definition_template_0(section, metadata, frt_coord) # Add spatial processing type as an attribute. + # TODO: Decide whether to set the value of this attribute as a code or something else metadata['attributes']['spatial_processing_type'] = spatial_processing_code # Add a cell method if the spatial processing type supports a diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index 60f27e3f..af2987da 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -1092,53 +1092,24 @@ def _cube_is_time_statistic(cube): return result -def _cube_is_spatial_statistic(cube): +def _spatial_statistic(cube): """ - Test whether we can identify this cube as a statistic over space. + Gather and return the spatial statistic of the cube if it is present. - We need to know whether our cube represents a spatial statistic. This is - almost always captured in the cell methods. - - WIP: UNFINISHED? """ - result = False - spatial_cell_methods = [] - has_cell_methods = cube.cell_methods - - if has_cell_methods: - spatial_cell_methods = [ - cell_method for cell_method in cube.cell_methods if 'area' in - cell_method.coord_names] - else: - raise ValueError("") - - if not spatial_cell_methods: - result = False - raise ValueError("Expected a cell method with a coordinate name " - "of 'area'") + spatial_cell_methods = [ + cell_method for cell_method in cube.cell_methods if 'area' in + cell_method.coord_names] - elif len(spatial_cell_methods) > 1: - result = False + if len(spatial_cell_methods) > 1: raise ValueError("Cannot handle multiple 'area' cell methods") - elif len(spatial_cell_methods[0].coord_names) > 1: - result = False raise ValueError("Cannot handle multiple coordinate names in " "the spatial processing related cell method. " - "Expected ('area',), got {!r}".format( - spatial_cell_methods[0].coord_names)) + "Expected ('area',), got {!r}".format + (spatial_cell_methods[0].coord_names)) - else: - result = True - - return result - - -def get_cell_method_name(cube, type): - """ - Returns name of cell method in cube where cell_method.coord_names == type - """ - pass + return spatial_cell_methods def statistical_method_code(cell_method_name): @@ -1344,7 +1315,7 @@ def product_definition_template_15(cube, grib, full3d_cube=None): arrive at the given data value from the source data. """ - # Type of spatial processing (see code table 4.15) + # Encode type of spatial processing (see code table 4.15) spatial_processing_code = cube.attributes['spatial_processing_type'] # Statistical process and number of points (see template definition 4.15) @@ -1358,8 +1329,11 @@ def product_definition_template_15(cube, grib, full3d_cube=None): raise ValueError(msg) if statistical_process == "cell_method": - if _cube_is_spatial_statistic(cube): - cell_method_name = get_cell_method_name(cube, 'area') + # Check the cube for statistical cell methods over area + spatial_stats = _spatial_statistic(cube) + # Identify the statistical method (i.e. 'mean') and encode it. + if len(spatial_stats) > 0: + cell_method_name = spatial_stats[0].method statistical_process = statistical_method_code(cell_method_name) else: raise ValueError("Could not find a suitable cell_method to save " @@ -1404,8 +1378,8 @@ def product_definition_section(cube, grib, full3d_cube=None): elif 'WMO_constituent_type' in cube.attributes: # forecast for atmospheric chemical constiuent (template 4.40) product_definition_template_40(cube, grib, full3d_cube) - elif 'area' in cube.cell_methods.coord_names: - # spatially processed (template 4.15) + elif cube.has_attribute('spatial_processing_type'): + # spatial process (template 4.15) product_definition_template_15(cube, grib, full3d_cube) else: # forecast (template 4.0) From 3ceff6771228393daa9d9ab38fd4058c51af2d19 Mon Sep 17 00:00:00 2001 From: Corinne Bosley Date: Thu, 1 Nov 2018 15:44:34 +0000 Subject: [PATCH 098/583] small changes regarding statistical process svaing --- iris_grib/_load_convert.py | 2 +- iris_grib/_save_rules.py | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index cae51216..68f5d6ac 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -140,7 +140,7 @@ 0: InterpolationParameters('cell_method', 0), # No interpolation 1: InterpolationParameters(None, 4), # Bilinear interpolation 2: InterpolationParameters(None, 4), # Bicubic interpolation - 3: InterpolationParameters(0, 1), # Nearest neighbour interpolation + 3: InterpolationParameters(None, 1), # Nearest neighbour interpolation 4: InterpolationParameters(None, 4), # Budget interpolation 5: InterpolationParameters(None, 4), # Spectral interpolation 6: InterpolationParameters(None, 4) # Neighbour-budget interpolation diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index af2987da..e84fb6db 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -1328,7 +1328,7 @@ def product_definition_template_15(cube, grib, full3d_cube=None): 'processing type {}'.format(spatial_processing_code)) raise ValueError(msg) - if statistical_process == "cell_method": + if statistical_process: # Check the cube for statistical cell methods over area spatial_stats = _spatial_statistic(cube) # Identify the statistical method (i.e. 'mean') and encode it. @@ -1343,10 +1343,9 @@ def product_definition_template_15(cube, grib, full3d_cube=None): gribapi.grib_set(grib, "productDefinitionTemplateNumber", 15) product_definition_template_common(cube, grib, full3d_cube) gribapi.grib_set(grib, "spatialProcessing", spatial_processing_code) + gribapi.grib_set(grib, "numberOfPointsUsed", number_of_points) if statistical_process: gribapi.grib_set(grib, "statisticalProcess", statistical_process) - if number_of_points: - gribapi.grib_set(grib, "numberOfPointsUsed", number_of_points) def product_definition_template_40(cube, grib, full3d_cube=None): From d57ec3216e7439f09f59a2951b144422da755dcd Mon Sep 17 00:00:00 2001 From: Corinne Bosley Date: Thu, 1 Nov 2018 16:09:58 +0000 Subject: [PATCH 099/583] updated load_convert test to include spatial processing attribute --- .../unit/load_convert/test_product_definition_template_15.py | 1 + 1 file changed, 1 insertion(+) diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py index daeb744b..61dfa798 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py @@ -94,6 +94,7 @@ def test_translation(self): expected['cell_methods'] = [CellMethod(coords=('area',), method='maximum')] + expected['attributes']['spatial_processing_type'] = 0 # Now check that the section conversion produces the metadata we # expect. From 815d2f6cca5ff8478c817fdeb2a67e06250c5f07 Mon Sep 17 00:00:00 2001 From: Corinne Bosley Date: Thu, 1 Nov 2018 16:23:30 +0000 Subject: [PATCH 100/583] filled out remaining mock tests for saving --- .../test_product_definition_template_15.py | 82 +++++++++++-------- 1 file changed, 49 insertions(+), 33 deletions(-) diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py index 7f1b66ac..75096c9f 100644 --- a/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py @@ -57,8 +57,7 @@ def test_cell_method(self, mock_set): # If the cube has a cell method attached then it should not have any # interpolation on the data, so spatial processing code should be 0 and - # number of points used should be 0 (because this specifically refers - # to the number of points used in the interpolation). + # number of points used should be 0. product_definition_template_15(cube_0, mock.sentinel.grib) mock_set.assert_any_call(mock.sentinel.grib, "productDefinitionTemplateNumber", 15) @@ -72,24 +71,31 @@ def test_bilinear_interpolation(self, mock_set): cube_1 = self.cube cube_1.attributes = dict(spatial_processing_type=1) - # Currently no implemented recognition of spatial processing code 1, - # so check that an error is raised if we try and save it. - msg = ('Cannot save Product Definition Type 4.15 with spatial ' - 'processing type {}'.format(1)) - with self.assertRaisesRegexp(ValueError, msg): - product_definition_template_15(cube_1, mock.sentinel.grib) + # If the cube has a bilinear interpolation attribute, spatial + # processing code should be 1 and number of points used should be 4. + product_definition_template_15(cube_1, mock.sentinel.grib) + mock_set.assert_any_call(mock.sentinel.grib, + "productDefinitionTemplateNumber", 15) + mock_set.assert_any_call(mock.sentinel.grib, + "spatialProcessing", 1) + mock_set.assert_any_call(mock.sentinel.grib, + "numberOfPointsUsed", 4) + @mock.patch.object(gribapi, 'grib_set') def test_bicubic_interpolation(self, mock_set): cube_2 = self.cube cube_2.attributes = dict(spatial_processing_type=2) - # Currently no implemented recognition of spatial processing code 2, - # so check that an error is raised if we try and save it. - msg = ('Cannot save Product Definition Type 4.15 with spatial ' - 'processing type {}'.format(2)) - with self.assertRaisesRegexp(ValueError, msg): - product_definition_template_15(cube_2, mock.sentinel.grib) + # If the cube has a bicubic interpolation attribute, spatial + # processing code should be 2 and number of points used should be 4. + product_definition_template_15(cube_2, mock.sentinel.grib) + mock_set.assert_any_call(mock.sentinel.grib, + "productDefinitionTemplateNumber", 15) + mock_set.assert_any_call(mock.sentinel.grib, + "spatialProcessing", 2) + mock_set.assert_any_call(mock.sentinel.grib, + "numberOfPointsUsed", 4) @mock.patch.object(gribapi, 'grib_set') def test_nearest_neighbour_interpolation(self, mock_set): @@ -111,36 +117,46 @@ def test_budget_interpolation(self, mock_set): cube_4 = self.cube cube_4.attributes = dict(spatial_processing_type=4) - # Currently no implemented recognition of spatial processing code 4, - # so check that an error is raised if we try and save it. - msg = ('Cannot save Product Definition Type 4.15 with spatial ' - 'processing type {}'.format(4)) - with self.assertRaisesRegexp(ValueError, msg): - product_definition_template_15(cube_4, mock.sentinel.grib) + # If the cube has a budget interpolation attribute, spatial + # processing code should be 4 and number of points used should be 4. + product_definition_template_15(cube_4, mock.sentinel.grib) + mock_set.assert_any_call(mock.sentinel.grib, + "productDefinitionTemplateNumber", 15) + mock_set.assert_any_call(mock.sentinel.grib, + "spatialProcessing", 4) + mock_set.assert_any_call(mock.sentinel.grib, + "numberOfPointsUsed", 4) @mock.patch.object(gribapi, 'grib_set') def test_spectral_interpolation(self, mock_set): cube_5 = self.cube cube_5.attributes = dict(spatial_processing_type=5) - # Currently no implemented recognition of spatial processing code 5, - # so check that an error is raised if we try and save it. - msg = ('Cannot save Product Definition Type 4.15 with spatial ' - 'processing type {}'.format(5)) - with self.assertRaisesRegexp(ValueError, msg): - product_definition_template_15(cube_5, mock.sentinel.grib) + # If the cube has a spectral interpolation attribute, spatial + # processing code should be 5 and number of points used should be 4. + product_definition_template_15(cube_5, mock.sentinel.grib) + mock_set.assert_any_call(mock.sentinel.grib, + "productDefinitionTemplateNumber", 15) + mock_set.assert_any_call(mock.sentinel.grib, + "spatialProcessing", 5) + mock_set.assert_any_call(mock.sentinel.grib, + "numberOfPointsUsed", 4) @mock.patch.object(gribapi, 'grib_set') - def test_neighbour_budget__interpolation(self, mock_set): + def test_neighbour_budget_interpolation(self, mock_set): cube_6 = self.cube cube_6.attributes = dict(spatial_processing_type=6) - # Currently no implemented recognition of spatial processing code 6, - # so check that an error is raised if we try and save it. - msg = ('Cannot save Product Definition Type 4.15 with spatial ' - 'processing type {}'.format(6)) - with self.assertRaisesRegexp(ValueError, msg): - product_definition_template_15(cube_6, mock.sentinel.grib) + # If the cube has a neighbour-budget interpolation attribute, spatial + # processing code should be 6 and number of points used should be 4. + product_definition_template_15(cube_6, mock.sentinel.grib) + mock_set.assert_any_call(mock.sentinel.grib, + "productDefinitionTemplateNumber", 15) + mock_set.assert_any_call(mock.sentinel.grib, + "spatialProcessing", 6) + mock_set.assert_any_call(mock.sentinel.grib, + "numberOfPointsUsed", 4) + if __name__ == "__main__": tests.main() From 01483646eb25400a16b1869e21d73a4d01dbf9f9 Mon Sep 17 00:00:00 2001 From: Corinne Bosley Date: Thu, 1 Nov 2018 16:40:20 +0000 Subject: [PATCH 101/583] fixes for syntax errors and licence headers --- iris_grib/_save_rules.py | 2 +- .../unit/load_convert/test_product_definition_template_15.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index e84fb6db..d2686324 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -1377,7 +1377,7 @@ def product_definition_section(cube, grib, full3d_cube=None): elif 'WMO_constituent_type' in cube.attributes: # forecast for atmospheric chemical constiuent (template 4.40) product_definition_template_40(cube, grib, full3d_cube) - elif cube.has_attribute('spatial_processing_type'): + elif hasattr(cube, 'spatial_processing_type'): # spatial process (template 4.15) product_definition_template_15(cube, grib, full3d_cube) else: diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py index 61dfa798..1d442c41 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py @@ -1,4 +1,4 @@ -# (C) British Crown Copyright 2014 - 2017, Met Office +# (C) British Crown Copyright 2014 - 2018, Met Office # # This file is part of iris-grib. # From 65118de4a6c2172c940ba48673a24de0a674f8c3 Mon Sep 17 00:00:00 2001 From: Corinne Bosley Date: Fri, 2 Nov 2018 09:26:03 +0000 Subject: [PATCH 102/583] pep8 fixes --- iris_grib/_load_convert.py | 2 +- iris_grib/_save_rules.py | 1 + .../unit/save_rules/test_product_definition_template_15.py | 1 - 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index 68f5d6ac..258dc8b6 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -2188,7 +2188,7 @@ def product_definition_template_15(section, metadata, frt_coord): product_definition_template_0(section, metadata, frt_coord) # Add spatial processing type as an attribute. - # TODO: Decide whether to set the value of this attribute as a code or something else + # TODO: Decide what form to set this attribute as (code int/string/?) metadata['attributes']['spatial_processing_type'] = spatial_processing_code # Add a cell method if the spatial processing type supports a diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index d2686324..c62a5d50 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -1124,6 +1124,7 @@ def statistical_method_code(cell_method_name): return statistic_code + def set_ensemble(cube, grib): """ Set keys in the provided grib based message relating to ensemble diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py index 75096c9f..320de79b 100644 --- a/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py @@ -81,7 +81,6 @@ def test_bilinear_interpolation(self, mock_set): mock_set.assert_any_call(mock.sentinel.grib, "numberOfPointsUsed", 4) - @mock.patch.object(gribapi, 'grib_set') def test_bicubic_interpolation(self, mock_set): cube_2 = self.cube From 662bcb3c9cb591e9588e5459717894d9466a9688 Mon Sep 17 00:00:00 2001 From: Corinne Bosley Date: Fri, 2 Nov 2018 14:55:26 +0000 Subject: [PATCH 103/583] Updates to spatial processing attributes --- iris_grib/_load_convert.py | 27 +++++++------- iris_grib/_save_rules.py | 36 +++++++++++++++---- .../test_product_definition_template_15.py | 3 +- .../test_product_definition_template_15.py | 23 +++++++----- 4 files changed, 60 insertions(+), 29 deletions(-) diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index 258dc8b6..31505e22 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -74,7 +74,8 @@ 'units']) InterpolationParameters = namedtuple('InterpolationParameters', - ['statistical_process', + ['interpolation_type', + 'statistical_process', 'number_of_points_used']) # Regulations 92.1.6. _GRID_ACCURACY_IN_DEGREES = 1e-6 # 1/1,000,000 of a degree @@ -134,16 +135,16 @@ # See Code Table 4.15 for full spatial processing type descriptors: # http://apps.ecmwf.int/codes/grib/format/grib2/ctables/4/15 -# InterpolationParameters(statistical process (octet 35), number of points -# used in interpolation (octet 37)) +# InterpolationParameters(spatial process descriptor, statistical process +# (octet 35), number of points used in interpolation (octet 37)) _SPATIAL_PROCESSING_TYPES = { - 0: InterpolationParameters('cell_method', 0), # No interpolation - 1: InterpolationParameters(None, 4), # Bilinear interpolation - 2: InterpolationParameters(None, 4), # Bicubic interpolation - 3: InterpolationParameters(None, 1), # Nearest neighbour interpolation - 4: InterpolationParameters(None, 4), # Budget interpolation - 5: InterpolationParameters(None, 4), # Spectral interpolation - 6: InterpolationParameters(None, 4) # Neighbour-budget interpolation + 0: InterpolationParameters('Statistical cell method', 'cell_method', 0), + 1: InterpolationParameters('Bilinear interpolation', None, 4), + 2: InterpolationParameters('Bicubic interpolation', None, 4), + 3: InterpolationParameters('Nearest neighbour interpolation', None, 1), + 4: InterpolationParameters('Budget interpolation', None, 4), + 5: InterpolationParameters('Spectral interpolation', None, 4), + 6: InterpolationParameters('Neighbour-budget interpolation', None, 4) } # Class containing details of a probability analysis. @@ -2188,12 +2189,12 @@ def product_definition_template_15(section, metadata, frt_coord): product_definition_template_0(section, metadata, frt_coord) # Add spatial processing type as an attribute. - # TODO: Decide what form to set this attribute as (code int/string/?) - metadata['attributes']['spatial_processing_type'] = spatial_processing_code + metadata['attributes']['spatial_processing_type'] = \ + _SPATIAL_PROCESSING_TYPES[spatial_processing_code][0] # Add a cell method if the spatial processing type supports a # statistical process. - if _SPATIAL_PROCESSING_TYPES[spatial_processing_code][0] == "cell_method": + if _SPATIAL_PROCESSING_TYPES[spatial_processing_code][1] == "cell_method": # Decode the statistical method name. cell_method_name = statistical_method_name(section) diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index c62a5d50..707c91f8 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -1120,11 +1120,30 @@ def statistical_method_code(cell_method_name): if statistic_code is None: msg = ('Product definition section 4 contains an unsupported ' 'statistical process type [{}] ') - raise TranslationError(msg.format(statistic_code)) + raise ValueError(msg.format(statistic_code)) return statistic_code +def spatial_process_code(sp_type): + """ + Decode cell_method string as statistic code integer. + """ + spatial_processing_code = None + + for code, interp_params in _SPATIAL_PROCESSING_TYPES.items(): + if interp_params.interpolation_type == sp_type: + spatial_processing_code = code + break + + if spatial_processing_code is None: + msg = ('Product definition section 4 contains an unsupported ' + 'spacial processing or interpolation type: {} ') + raise ValueError(msg.format(sp_type)) + + return spatial_processing_code + + def set_ensemble(cube, grib): """ Set keys in the provided grib based message relating to ensemble @@ -1317,11 +1336,13 @@ def product_definition_template_15(cube, grib, full3d_cube=None): """ # Encode type of spatial processing (see code table 4.15) - spatial_processing_code = cube.attributes['spatial_processing_type'] + sp_type = cube.attributes['spatial_processing_type'] + spatial_processing_code = spatial_process_code(sp_type) - # Statistical process and number of points (see template definition 4.15) - statistical_process = _SPATIAL_PROCESSING_TYPES[spatial_processing_code][0] - number_of_points = _SPATIAL_PROCESSING_TYPES[spatial_processing_code][1] + # Encode statistical process and number of points + # (see template definition 4.15) + statistical_process = _SPATIAL_PROCESSING_TYPES[spatial_processing_code][1] + number_of_points = _SPATIAL_PROCESSING_TYPES[spatial_processing_code][2] # Only a limited number of spatial processing types are supported. if spatial_processing_code not in _SPATIAL_PROCESSING_TYPES.keys(): @@ -1332,7 +1353,7 @@ def product_definition_template_15(cube, grib, full3d_cube=None): if statistical_process: # Check the cube for statistical cell methods over area spatial_stats = _spatial_statistic(cube) - # Identify the statistical method (i.e. 'mean') and encode it. + # Identify the statistical method (e.g. 'mean') and encode it. if len(spatial_stats) > 0: cell_method_name = spatial_stats[0].method statistical_process = statistical_method_code(cell_method_name) @@ -1344,7 +1365,8 @@ def product_definition_template_15(cube, grib, full3d_cube=None): gribapi.grib_set(grib, "productDefinitionTemplateNumber", 15) product_definition_template_common(cube, grib, full3d_cube) gribapi.grib_set(grib, "spatialProcessing", spatial_processing_code) - gribapi.grib_set(grib, "numberOfPointsUsed", number_of_points) + if number_of_points: + gribapi.grib_set(grib, "numberOfPointsUsed", number_of_points) if statistical_process: gribapi.grib_set(grib, "statisticalProcess", statistical_process) diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py index 1d442c41..2fffbaff 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py @@ -94,7 +94,8 @@ def test_translation(self): expected['cell_methods'] = [CellMethod(coords=('area',), method='maximum')] - expected['attributes']['spatial_processing_type'] = 0 + expected['attributes']['spatial_processing_type'] = \ + 'Statistical cell method' # Now check that the section conversion produces the metadata we # expect. diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py index 320de79b..58df221f 100644 --- a/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py @@ -46,12 +46,13 @@ def setUp(self): calendar='gregorian')) self.cube.add_aux_coord(t_coord) # Rename cube to avoid warning about unknown discipline/parameter. - self.cube.rename('WAFC_CAT_potential') + self.cube.rename('air_temperature') @mock.patch.object(gribapi, 'grib_set') def test_cell_method(self, mock_set): cube_0 = self.cube - cube_0.attributes = dict(spatial_processing_type=0) + cube_0.attributes = dict(spatial_processing_type= + 'Statistical cell method') cell_method = CellMethod(method='mean', coords=['area']) cube_0.add_cell_method(cell_method) @@ -69,7 +70,8 @@ def test_cell_method(self, mock_set): @mock.patch.object(gribapi, 'grib_set') def test_bilinear_interpolation(self, mock_set): cube_1 = self.cube - cube_1.attributes = dict(spatial_processing_type=1) + cube_1.attributes = dict(spatial_processing_type= + 'Bilinear interpolation') # If the cube has a bilinear interpolation attribute, spatial # processing code should be 1 and number of points used should be 4. @@ -84,7 +86,8 @@ def test_bilinear_interpolation(self, mock_set): @mock.patch.object(gribapi, 'grib_set') def test_bicubic_interpolation(self, mock_set): cube_2 = self.cube - cube_2.attributes = dict(spatial_processing_type=2) + cube_2.attributes = dict(spatial_processing_type= + 'Bicubic interpolation') # If the cube has a bicubic interpolation attribute, spatial # processing code should be 2 and number of points used should be 4. @@ -99,7 +102,8 @@ def test_bicubic_interpolation(self, mock_set): @mock.patch.object(gribapi, 'grib_set') def test_nearest_neighbour_interpolation(self, mock_set): cube_3 = self.cube - cube_3.attributes = dict(spatial_processing_type=3) + cube_3.attributes = dict(spatial_processing_type= + 'Nearest neighbour interpolation') # If the cube has a nearest neighbour interpolation attribute, spatial # processing code should be 3 and number of points used should be 1. @@ -114,7 +118,8 @@ def test_nearest_neighbour_interpolation(self, mock_set): @mock.patch.object(gribapi, 'grib_set') def test_budget_interpolation(self, mock_set): cube_4 = self.cube - cube_4.attributes = dict(spatial_processing_type=4) + cube_4.attributes = dict(spatial_processing_type= + 'Budget interpolation') # If the cube has a budget interpolation attribute, spatial # processing code should be 4 and number of points used should be 4. @@ -129,7 +134,8 @@ def test_budget_interpolation(self, mock_set): @mock.patch.object(gribapi, 'grib_set') def test_spectral_interpolation(self, mock_set): cube_5 = self.cube - cube_5.attributes = dict(spatial_processing_type=5) + cube_5.attributes = dict(spatial_processing_type= + 'Spectral interpolation') # If the cube has a spectral interpolation attribute, spatial # processing code should be 5 and number of points used should be 4. @@ -144,7 +150,8 @@ def test_spectral_interpolation(self, mock_set): @mock.patch.object(gribapi, 'grib_set') def test_neighbour_budget_interpolation(self, mock_set): cube_6 = self.cube - cube_6.attributes = dict(spatial_processing_type=6) + cube_6.attributes = dict(spatial_processing_type= + 'Neighbour-budget interpolation') # If the cube has a neighbour-budget interpolation attribute, spatial # processing code should be 6 and number of points used should be 4. From bd3b8691ab916df6877d76c692a0306467c7124a Mon Sep 17 00:00:00 2001 From: Corinne Bosley Date: Fri, 2 Nov 2018 15:25:52 +0000 Subject: [PATCH 104/583] final tweaks to this and that --- iris_grib/_save_rules.py | 53 ++++++++++--------- .../test_product_definition_template_15.py | 2 +- 2 files changed, 28 insertions(+), 27 deletions(-) diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index 707c91f8..49239029 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -37,7 +37,8 @@ from iris.aux_factory import HybridHeightFactory, HybridPressureFactory from iris.coord_systems import (GeogCS, RotatedGeogCS, Mercator, TransverseMercator, LambertConformal) -import iris.exceptions +from iris.exceptions import TranslationError + from ._iris_mercator_support import confirm_extended_mercator_supported from . import grib_phenom_translation as gptx @@ -208,7 +209,7 @@ def shape_of_the_earth(cube, grib): if ellipsoid is None: msg = "Could not determine shape of the earth from coord system "\ "of horizontal grid." - raise iris.exceptions.TranslationError(msg) + raise TranslationError(msg) # Spherical earth. if ellipsoid.inverse_flattening == 0.0: @@ -335,7 +336,7 @@ def rotated_pole(cube, grib): cs = cube.coord(dimensions=[0]).coord_system if cs.north_pole_grid_longitude != 0.0: - raise iris.exceptions.TranslationError( + raise TranslationError( 'Grib save does not yet support Rotated-pole coordinates with ' 'a rotated prime meridian.') # XXX Pending #1125 @@ -476,7 +477,7 @@ def grid_definition_template_10(cube, grib): y_step = step(y_mm, atol=1) except ValueError: msg = 'Irregular coordinates not supported for Mercator.' - raise iris.exceptions.TranslationError(msg) + raise TranslationError(msg) gribapi.grib_set(grib, 'Di', abs(x_step)) gribapi.grib_set(grib, 'Dj', abs(y_step)) @@ -548,7 +549,7 @@ def grid_definition_template_12(cube, grib): except ValueError: msg = ('Irregular coordinates not supported for Transverse ' 'Mercator.') - raise iris.exceptions.TranslationError(msg) + raise TranslationError(msg) gribapi.grib_set(grib, 'Di', abs(x_step)) gribapi.grib_set(grib, 'Dj', abs(y_step)) horizontal_grid_common(cube, grib) @@ -618,7 +619,7 @@ def grid_definition_template_30(cube, grib): except ValueError: msg = ('Irregular coordinates not supported for Lambert ' 'Conformal.') - raise iris.exceptions.TranslationError(msg) + raise TranslationError(msg) gribapi.grib_set(grib, 'Dx', abs(x_step)) gribapi.grib_set(grib, 'Dy', abs(y_step)) @@ -743,14 +744,14 @@ def _non_missing_forecast_period(cube): elif fp_coord.units == cf_units.Unit("seconds"): grib_time_code = 13 else: - raise iris.exceptions.TranslationError( + raise TranslationError( "Unexpected units for 'forecast_period' : %s" % fp_coord.units) if not t_coord.has_bounds(): fp = fp_coord.points[0] else: if not fp_coord.has_bounds(): - raise iris.exceptions.TranslationError( + raise TranslationError( "bounds on 'time' coordinate requires bounds on" " 'forecast_period'.") fp = fp_coord.bounds[0][0] @@ -893,7 +894,7 @@ def set_fixed_surfaces(cube, grib, full3d_cube=None): # There are vertical coordinate(s), but we don't understand them... v_coords_str = ' ,'.join(["'{}'".format(c.name()) for c in v_coords]) - raise iris.exceptions.TranslationError( + raise TranslationError( 'The vertical-axis coordinate(s) ({}) ' 'are not recognised or handled.'.format(v_coords_str)) @@ -1120,26 +1121,26 @@ def statistical_method_code(cell_method_name): if statistic_code is None: msg = ('Product definition section 4 contains an unsupported ' 'statistical process type [{}] ') - raise ValueError(msg.format(statistic_code)) + raise TranslationError(msg.format(statistic_code)) return statistic_code -def spatial_process_code(sp_type): +def get_spatial_process_code(spacial_processing_type): """ Decode cell_method string as statistic code integer. """ spatial_processing_code = None for code, interp_params in _SPATIAL_PROCESSING_TYPES.items(): - if interp_params.interpolation_type == sp_type: + if interp_params.interpolation_type == spacial_processing_type: spatial_processing_code = code break if spatial_processing_code is None: msg = ('Product definition section 4 contains an unsupported ' 'spacial processing or interpolation type: {} ') - raise ValueError(msg.format(sp_type)) + raise TranslationError(msg.format(spacial_processing_type)) return spatial_processing_code @@ -1336,18 +1337,18 @@ def product_definition_template_15(cube, grib, full3d_cube=None): """ # Encode type of spatial processing (see code table 4.15) - sp_type = cube.attributes['spatial_processing_type'] - spatial_processing_code = spatial_process_code(sp_type) + spacial_processing_type = cube.attributes['spatial_processing_type'] + spatial_processing = get_spatial_process_code(spacial_processing_type) # Encode statistical process and number of points # (see template definition 4.15) - statistical_process = _SPATIAL_PROCESSING_TYPES[spatial_processing_code][1] - number_of_points = _SPATIAL_PROCESSING_TYPES[spatial_processing_code][2] + statistical_process = _SPATIAL_PROCESSING_TYPES[spatial_processing][1] + number_of_points = _SPATIAL_PROCESSING_TYPES[spatial_processing][2] # Only a limited number of spatial processing types are supported. - if spatial_processing_code not in _SPATIAL_PROCESSING_TYPES.keys(): + if spatial_processing not in _SPATIAL_PROCESSING_TYPES.keys(): msg = ('Cannot save Product Definition Type 4.15 with spatial ' - 'processing type {}'.format(spatial_processing_code)) + 'processing type {}'.format(spatial_processing)) raise ValueError(msg) if statistical_process: @@ -1364,10 +1365,10 @@ def product_definition_template_15(cube, grib, full3d_cube=None): # Set GRIB messages gribapi.grib_set(grib, "productDefinitionTemplateNumber", 15) product_definition_template_common(cube, grib, full3d_cube) - gribapi.grib_set(grib, "spatialProcessing", spatial_processing_code) - if number_of_points: + gribapi.grib_set(grib, "spatialProcessing", spatial_processing) + if number_of_points is not None: gribapi.grib_set(grib, "numberOfPointsUsed", number_of_points) - if statistical_process: + if statistical_process is not None: gribapi.grib_set(grib, "statisticalProcess", statistical_process) @@ -1425,7 +1426,7 @@ def product_definition_section(cube, grib, full3d_cube=None): else: # Don't know how to handle this kind of data msg = 'A suitable product template could not be deduced' - raise iris.exceptions.TranslationError(msg) + raise TranslationError(msg) ############################################################################### @@ -1487,13 +1488,13 @@ def gribbability_check(cube): cs0 = cube.coord(dimensions=[0]).coord_system cs1 = cube.coord(dimensions=[1]).coord_system if cs0 is None or cs1 is None: - raise iris.exceptions.TranslationError("CoordSystem not present") + raise TranslationError("CoordSystem not present") if cs0 != cs1: - raise iris.exceptions.TranslationError("Inconsistent CoordSystems") + raise TranslationError("Inconsistent CoordSystems") # Time period exists? if not cube.coords("time"): - raise iris.exceptions.TranslationError("time coord not found") + raise TranslationError("time coord not found") def run(slice2d_cube, grib, full3d_cube): diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py index 58df221f..acb1093b 100644 --- a/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py @@ -65,7 +65,7 @@ def test_cell_method(self, mock_set): mock_set.assert_any_call(mock.sentinel.grib, "spatialProcessing", 0) mock_set.assert_any_call(mock.sentinel.grib, - "numberOfPointsUsed", 0) + "statisticalProcess", 0) @mock.patch.object(gribapi, 'grib_set') def test_bilinear_interpolation(self, mock_set): From a58144c4d14a747fed36932317ba9b6f0a54b3a6 Mon Sep 17 00:00:00 2001 From: Corinne Bosley Date: Fri, 2 Nov 2018 15:38:48 +0000 Subject: [PATCH 105/583] pep8, or pycodestyle or whatever it is now. fixed. --- .../test_product_definition_template_15.py | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py index acb1093b..8b4f48c5 100644 --- a/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py @@ -51,8 +51,8 @@ def setUp(self): @mock.patch.object(gribapi, 'grib_set') def test_cell_method(self, mock_set): cube_0 = self.cube - cube_0.attributes = dict(spatial_processing_type= - 'Statistical cell method') + cube_0.attributes = dict(spatial_processing_type='Statistical ' + 'cell method') cell_method = CellMethod(method='mean', coords=['area']) cube_0.add_cell_method(cell_method) @@ -70,8 +70,8 @@ def test_cell_method(self, mock_set): @mock.patch.object(gribapi, 'grib_set') def test_bilinear_interpolation(self, mock_set): cube_1 = self.cube - cube_1.attributes = dict(spatial_processing_type= - 'Bilinear interpolation') + cube_1.attributes = dict(spatial_processing_type='Bilinear ' + 'interpolation') # If the cube has a bilinear interpolation attribute, spatial # processing code should be 1 and number of points used should be 4. @@ -86,8 +86,8 @@ def test_bilinear_interpolation(self, mock_set): @mock.patch.object(gribapi, 'grib_set') def test_bicubic_interpolation(self, mock_set): cube_2 = self.cube - cube_2.attributes = dict(spatial_processing_type= - 'Bicubic interpolation') + cube_2.attributes = dict(spatial_processing_type='Bicubic ' + 'interpolation') # If the cube has a bicubic interpolation attribute, spatial # processing code should be 2 and number of points used should be 4. @@ -102,8 +102,8 @@ def test_bicubic_interpolation(self, mock_set): @mock.patch.object(gribapi, 'grib_set') def test_nearest_neighbour_interpolation(self, mock_set): cube_3 = self.cube - cube_3.attributes = dict(spatial_processing_type= - 'Nearest neighbour interpolation') + cube_3.attributes = dict(spatial_processing_type='Nearest neighbour ' + 'interpolation') # If the cube has a nearest neighbour interpolation attribute, spatial # processing code should be 3 and number of points used should be 1. @@ -118,8 +118,8 @@ def test_nearest_neighbour_interpolation(self, mock_set): @mock.patch.object(gribapi, 'grib_set') def test_budget_interpolation(self, mock_set): cube_4 = self.cube - cube_4.attributes = dict(spatial_processing_type= - 'Budget interpolation') + cube_4.attributes = dict(spatial_processing_type='Budget ' + 'interpolation') # If the cube has a budget interpolation attribute, spatial # processing code should be 4 and number of points used should be 4. @@ -134,8 +134,8 @@ def test_budget_interpolation(self, mock_set): @mock.patch.object(gribapi, 'grib_set') def test_spectral_interpolation(self, mock_set): cube_5 = self.cube - cube_5.attributes = dict(spatial_processing_type= - 'Spectral interpolation') + cube_5.attributes = dict(spatial_processing_type='Spectral ' + 'interpolation') # If the cube has a spectral interpolation attribute, spatial # processing code should be 5 and number of points used should be 4. @@ -150,8 +150,8 @@ def test_spectral_interpolation(self, mock_set): @mock.patch.object(gribapi, 'grib_set') def test_neighbour_budget_interpolation(self, mock_set): cube_6 = self.cube - cube_6.attributes = dict(spatial_processing_type= - 'Neighbour-budget interpolation') + cube_6.attributes = dict(spatial_processing_type='Neighbour-budget ' + 'interpolation') # If the cube has a neighbour-budget interpolation attribute, spatial # processing code should be 6 and number of points used should be 4. From 1e879300cb545718d89ad5d9d720dbc8e8bd8fb6 Mon Sep 17 00:00:00 2001 From: Corinne Bosley Date: Fri, 2 Nov 2018 15:50:51 +0000 Subject: [PATCH 106/583] fix for product_definition_section not picked up by mock tests --- iris_grib/_save_rules.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index 49239029..d95ce975 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -1401,7 +1401,7 @@ def product_definition_section(cube, grib, full3d_cube=None): elif 'WMO_constituent_type' in cube.attributes: # forecast for atmospheric chemical constiuent (template 4.40) product_definition_template_40(cube, grib, full3d_cube) - elif hasattr(cube, 'spatial_processing_type'): + elif 'spatial_processing_type' in cube.attributes: # spatial process (template 4.15) product_definition_template_15(cube, grib, full3d_cube) else: From 627781976012bd51fc0828ceade526567ce68b5b Mon Sep 17 00:00:00 2001 From: Kevin Donkers Date: Mon, 5 Nov 2018 10:43:26 +0000 Subject: [PATCH 107/583] Update iris_grib/_save_rules.py Co-Authored-By: corinnebosley --- iris_grib/_save_rules.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index d95ce975..43fb0c9e 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -1126,7 +1126,7 @@ def statistical_method_code(cell_method_name): return statistic_code -def get_spatial_process_code(spacial_processing_type): +def get_spatial_process_code(spatial_processing_type): """ Decode cell_method string as statistic code integer. """ From 578c8352d5c3db64de440d8a0bde4b07d77380fa Mon Sep 17 00:00:00 2001 From: Kevin Donkers Date: Mon, 5 Nov 2018 10:43:39 +0000 Subject: [PATCH 108/583] Update iris_grib/_save_rules.py Co-Authored-By: corinnebosley --- iris_grib/_save_rules.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index 43fb0c9e..adc827f0 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -1128,7 +1128,7 @@ def statistical_method_code(cell_method_name): def get_spatial_process_code(spatial_processing_type): """ - Decode cell_method string as statistic code integer. + Decode spatial_processing_type string as spatial process code integer. """ spatial_processing_code = None From cd98b7cddefbaa1c715ab20ee7fadf735c6a66d7 Mon Sep 17 00:00:00 2001 From: Kevin Donkers Date: Mon, 5 Nov 2018 10:43:44 +0000 Subject: [PATCH 109/583] Update iris_grib/_save_rules.py Co-Authored-By: corinnebosley --- iris_grib/_save_rules.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index adc827f0..187f902d 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -1133,7 +1133,7 @@ def get_spatial_process_code(spatial_processing_type): spatial_processing_code = None for code, interp_params in _SPATIAL_PROCESSING_TYPES.items(): - if interp_params.interpolation_type == spacial_processing_type: + if interp_params.interpolation_type == spatial_processing_type: spatial_processing_code = code break From 17df2dd927dd86ecf825baef48513a58c70cc527 Mon Sep 17 00:00:00 2001 From: Kevin Donkers Date: Mon, 5 Nov 2018 10:43:51 +0000 Subject: [PATCH 110/583] Update iris_grib/_save_rules.py Co-Authored-By: corinnebosley --- iris_grib/_save_rules.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index 187f902d..54970f86 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -1140,7 +1140,7 @@ def get_spatial_process_code(spatial_processing_type): if spatial_processing_code is None: msg = ('Product definition section 4 contains an unsupported ' 'spacial processing or interpolation type: {} ') - raise TranslationError(msg.format(spacial_processing_type)) + raise TranslationError(msg.format(spatial_processing_type)) return spatial_processing_code From a731b2c6d6c5ad161abc0a00bb4f0761488a49ef Mon Sep 17 00:00:00 2001 From: Kevin Donkers Date: Mon, 5 Nov 2018 10:44:09 +0000 Subject: [PATCH 111/583] Update iris_grib/_save_rules.py Co-Authored-By: corinnebosley --- iris_grib/_save_rules.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iris_grib/_save_rules.py b/iris_grib/_save_rules.py index 54970f86..25d007b3 100644 --- a/iris_grib/_save_rules.py +++ b/iris_grib/_save_rules.py @@ -1351,7 +1351,7 @@ def product_definition_template_15(cube, grib, full3d_cube=None): 'processing type {}'.format(spatial_processing)) raise ValueError(msg) - if statistical_process: + if statistical_process is not None: # Check the cube for statistical cell methods over area spatial_stats = _spatial_statistic(cube) # Identify the statistical method (e.g. 'mean') and encode it. From 239732f9fb6edb0f1ae48e473f7a7d0b82ec752d Mon Sep 17 00:00:00 2001 From: Kevin Donkers Date: Mon, 5 Nov 2018 10:58:03 +0000 Subject: [PATCH 112/583] Update iris_grib/_load_convert.py Co-Authored-By: corinnebosley --- iris_grib/_load_convert.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iris_grib/_load_convert.py b/iris_grib/_load_convert.py index 31505e22..f164529d 100644 --- a/iris_grib/_load_convert.py +++ b/iris_grib/_load_convert.py @@ -138,7 +138,7 @@ # InterpolationParameters(spatial process descriptor, statistical process # (octet 35), number of points used in interpolation (octet 37)) _SPATIAL_PROCESSING_TYPES = { - 0: InterpolationParameters('Statistical cell method', 'cell_method', 0), + 0: InterpolationParameters('No interpolation', 'cell_method', 0), 1: InterpolationParameters('Bilinear interpolation', None, 4), 2: InterpolationParameters('Bicubic interpolation', None, 4), 3: InterpolationParameters('Nearest neighbour interpolation', None, 1), From f85596f8ab493db18fbf0812442e5673ab13aaf8 Mon Sep 17 00:00:00 2001 From: Kevin Donkers Date: Mon, 5 Nov 2018 10:58:13 +0000 Subject: [PATCH 113/583] Update iris_grib/tests/unit/save_rules/test_product_definition_template_15.py Co-Authored-By: corinnebosley --- .../unit/save_rules/test_product_definition_template_15.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py index 8b4f48c5..aca69f45 100644 --- a/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py @@ -51,7 +51,7 @@ def setUp(self): @mock.patch.object(gribapi, 'grib_set') def test_cell_method(self, mock_set): cube_0 = self.cube - cube_0.attributes = dict(spatial_processing_type='Statistical ' + cube_0.attributes = dict(spatial_processing_type='No interpolation') 'cell method') cell_method = CellMethod(method='mean', coords=['area']) cube_0.add_cell_method(cell_method) From 1a7a0e77801767818572ba1bd8f7420fdcde1cee Mon Sep 17 00:00:00 2001 From: Kevin Donkers Date: Mon, 5 Nov 2018 10:59:03 +0000 Subject: [PATCH 114/583] Update iris_grib/tests/unit/save_rules/test_product_definition_template_15.py Co-Authored-By: corinnebosley --- .../tests/unit/save_rules/test_product_definition_template_15.py | 1 - 1 file changed, 1 deletion(-) diff --git a/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py b/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py index aca69f45..db902116 100644 --- a/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py +++ b/iris_grib/tests/unit/save_rules/test_product_definition_template_15.py @@ -52,7 +52,6 @@ def setUp(self): def test_cell_method(self, mock_set): cube_0 = self.cube cube_0.attributes = dict(spatial_processing_type='No interpolation') - 'cell method') cell_method = CellMethod(method='mean', coords=['area']) cube_0.add_cell_method(cell_method) From f5f07ba70c505bb168568b4b27620ed1b3a82627 Mon Sep 17 00:00:00 2001 From: Corinne Bosley Date: Mon, 5 Nov 2018 11:10:51 +0000 Subject: [PATCH 115/583] Fix to tests following rename of cell method --- .../unit/load_convert/test_product_definition_template_15.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py b/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py index 2fffbaff..951e8f41 100644 --- a/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py +++ b/iris_grib/tests/unit/load_convert/test_product_definition_template_15.py @@ -95,7 +95,7 @@ def test_translation(self): expected['cell_methods'] = [CellMethod(coords=('area',), method='maximum')] expected['attributes']['spatial_processing_type'] = \ - 'Statistical cell method' + 'No interpolation' # Now check that the section conversion produces the metadata we # expect. From 4a321378693da32ef688cf0f259d5d4e41e09456 Mon Sep 17 00:00:00 2001 From: Corinne Bosley Date: Wed, 20 Jun 2018 09:33:44 +0100 Subject: [PATCH 116/583] grib2 to cf mapping --- iris_grib/_grib_cf_map.py | 12 +++ .../tests/integration/round_trip/__init__.py | 3 +- .../test_WAFC_mapping_round_trip.py | 83 ++++++++++++++++++ .../test_hybrid_coords_round_trip.py | 6 +- iris_grib/tests/testdata/CAT_T+24_0600.grib2 | Bin 0 -> 292930 bytes iris_grib/tests/testdata/CB_T+24_0600.grib2 | Bin 0 -> 46829 bytes .../tests/testdata/ICING_T+24_0600.grib2 | Bin 0 -> 158603 bytes .../tests/testdata/INCLDTURB_T+24_0600.grib2 | Bin 0 -> 97393 bytes setup.py | 2 +- 9 files changed, 101 insertions(+), 5 deletions(-) create mode 100644 iris_grib/tests/integration/round_trip/test_WAFC_mapping_round_trip.py create mode 100644 iris_grib/tests/testdata/CAT_T+24_0600.grib2 create mode 100644 iris_grib/tests/testdata/CB_T+24_0600.grib2 create mode 100644 iris_grib/tests/testdata/ICING_T+24_0600.grib2 create mode 100644 iris_grib/tests/testdata/INCLDTURB_T+24_0600.grib2 diff --git a/iris_grib/_grib_cf_map.py b/iris_grib/_grib_cf_map.py index 90c537ca..b128a22f 100644 --- a/iris_grib/_grib_cf_map.py +++ b/iris_grib/_grib_cf_map.py @@ -115,11 +115,17 @@ G2Param(2, 0, 6, 5): CFName('high_type_cloud_area_fraction', None, '%'), G2Param(2, 0, 6, 6): CFName('atmosphere_mass_content_of_cloud_liquid_water', None, 'kg m-2'), G2Param(2, 0, 6, 7): CFName('cloud_area_fraction_in_atmosphere_layer', None, '%'), + G2Param(2, 0, 6, 25): CFName(None, 'WAFC_CB_horizontal_extent', '1'), + G2Param(2, 0, 6, 26): CFName(None, 'WAFC_ICAO_height_at_CB_base', 'm'), + G2Param(2, 0, 6, 27): CFName(None, 'WAFC_ICAO_height_at_CB_top', 'm'), G2Param(2, 0, 7, 6): CFName('atmosphere_specific_convective_available_potential_energy', None, 'J kg-1'), G2Param(2, 0, 7, 7): CFName(None, 'convective_inhibition', 'J kg-1'), G2Param(2, 0, 7, 8): CFName(None, 'storm_relative_helicity', 'J kg-1'), G2Param(2, 0, 14, 0): CFName('atmosphere_mole_content_of_ozone', None, 'Dobson'), G2Param(2, 0, 19, 1): CFName(None, 'grib_physical_atmosphere_albedo', '%'), + G2Param(2, 0, 19, 20): CFName(None, 'WAFC_icing_potential', '1'), + G2Param(2, 0, 19, 21): CFName(None, 'WAFC_in-cloud_turb_potential', '1'), + G2Param(2, 0, 19, 22): CFName(None, 'WAFC_CAT_potential', '1'), G2Param(2, 2, 0, 0): CFName('land_binary_mask', None, '1'), G2Param(2, 2, 0, 0): CFName('land_area_fraction', None, '1'), G2Param(2, 2, 0, 1): CFName('surface_roughness_length', None, 'm'), @@ -220,6 +226,12 @@ CFName('surface_upward_latent_heat_flux', None, 'W m-2'): G2Param(2, 0, 0, 10), CFName('surface_upward_sensible_heat_flux', None, 'W m-2'): G2Param(2, 0, 0, 11), CFName('thickness_of_snowfall_amount', None, 'm'): G2Param(2, 0, 1, 11), + CFName(None, 'WAFC_CAT_potential', '1'): G2Param(2, 0, 19, 22), + CFName(None, 'WAFC_CB_horizontal_extent', '1'): G2Param(2, 0, 6, 25), + CFName(None, 'WAFC_ICAO_height_at_cloud_base', 'm'): G2Param(2, 0, 6, 26), + CFName(None, 'WAFC_ICAO_height_at_cloud_top', 'm'): G2Param(2, 0, 6, 27), + CFName(None, 'WAFC_icing_potential', '1'): G2Param(2, 0, 19, 20), + CFName(None, 'WAFC_in-cloud_turb_potential', '1'): G2Param(2, 0, 19, 21), CFName('wind_from_direction', None, 'degrees'): G2Param(2, 0, 2, 0), CFName('wind_speed', None, 'm s-1'): G2Param(2, 0, 2, 1), CFName('wind_speed_of_gust', None, 'm s-1'): G2Param(2, 0, 2, 22), diff --git a/iris_grib/tests/integration/round_trip/__init__.py b/iris_grib/tests/integration/round_trip/__init__.py index bcf17a3d..feb16d2a 100644 --- a/iris_grib/tests/integration/round_trip/__init__.py +++ b/iris_grib/tests/integration/round_trip/__init__.py @@ -14,8 +14,7 @@ # # You should have received a copy of the GNU Lesser General Public License # along with iris-grib. If not, see . -"""Integration tests for the :mod:`iris_grib._load_convert` and -:mod:`iris_grib._save_rules` packages.""" +"""Round-trip integration tests for the :mod:`iris-grib` package.""" from __future__ import (absolute_import, division, print_function) from six.moves import (filter, input, map, range, zip) # noqa diff --git a/iris_grib/tests/integration/round_trip/test_WAFC_mapping_round_trip.py b/iris_grib/tests/integration/round_trip/test_WAFC_mapping_round_trip.py new file mode 100644 index 00000000..dad4580c --- /dev/null +++ b/iris_grib/tests/integration/round_trip/test_WAFC_mapping_round_trip.py @@ -0,0 +1,83 @@ +# (C) British Crown Copyright 2018, Met Office +# +# This file is part of iris-grib. +# +# iris-grib is free software: you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the +# Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# iris-grib is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with iris-grib. If not, see . +""" +Integration test for round-trip loading and saving of hybrid height and +hybrid pressure cubes. + +""" + +from __future__ import (absolute_import, division, print_function) +from six.moves import (filter, input, map, range, zip) # noqa + +# import iris_grib.tests first so that some things can be initialised +# before importing anything else. +import iris_grib.tests as tests + +from iris import load_cube, load, save +from iris.cube import Cube + + +class TestWAFCCodes(tests.IrisGribTest): + def setUp(self): + self.cat = self.get_testdata_path('CAT_T+24_0600.grib2') + self.cb = self.get_testdata_path('CB_T+24_0600.grib2') + self.icing = self.get_testdata_path('ICING_T+24_0600.grib2') + self.turb = self.get_testdata_path('INCLDTURB_T+24_0600.grib2') + + def test_WAFC_CAT_round_trip(self): + cubelist = load(self.cat, 'WAFC_CAT_potential') + cube = cubelist[0] + self.assertIsInstance(cube, Cube) + + with self.temp_filename() as tmp_save_path: + save(cube, tmp_save_path, saver='grib2') + saved_cube = load_cube(tmp_save_path) + self.assertTrue(saved_cube == cube) + + def test_WAFC_CB_round_trip(self): + cubelist = load(self.cb) + cube = cubelist[0] + self.assertIsInstance(cube, Cube) + + with self.temp_filename() as tmp_save_path: + save(cube, tmp_save_path, saver='grib2') + saved_cube = load_cube(tmp_save_path) + self.assertTrue(saved_cube == cube) + + def test_WAFC_icing_round_trip(self): + cubelist = load(self.icing) + cube = cubelist[0] + self.assertIsInstance(cube, Cube) + + with self.temp_filename() as tmp_save_path: + save(cube, tmp_save_path, saver='grib2') + saved_cube = load_cube(tmp_save_path) + self.assertTrue(saved_cube == cube) + + def test_WAFC_turb_round_trip(self): + cubelist = load(self.turb) + cube = cubelist[0] + self.assertIsInstance(cube, Cube) + + with self.temp_filename() as tmp_save_path: + save(cube, tmp_save_path, saver='grib2') + saved_cube = load_cube(tmp_save_path) + self.assertTrue(saved_cube == cube) + + +if __name__ == '__main__': + tests.main() diff --git a/iris_grib/tests/integration/round_trip/test_hybrid_coords_round_trip.py b/iris_grib/tests/integration/round_trip/test_hybrid_coords_round_trip.py index e64df0bd..817304b7 100644 --- a/iris_grib/tests/integration/round_trip/test_hybrid_coords_round_trip.py +++ b/iris_grib/tests/integration/round_trip/test_hybrid_coords_round_trip.py @@ -27,8 +27,6 @@ # before importing anything else. import iris_grib.tests as tests -import os - from iris import load_cube, load_cubes, save from iris.experimental.equalise_cubes import equalise_attributes @@ -72,3 +70,7 @@ def test_hybrid_pressure(self): equalise_attributes([saved_cube, cube]) self.assertTrue(saved_cube == cube) + + +if __name__ == '__main__': + tests.main() diff --git a/iris_grib/tests/testdata/CAT_T+24_0600.grib2 b/iris_grib/tests/testdata/CAT_T+24_0600.grib2 new file mode 100644 index 0000000000000000000000000000000000000000..2a1f5b77565c70f4df7c9f4b6487ab5fd97c54ff GIT binary patch literal 292930 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